21 #ifdef SIMAGE_PIC_SUPPORT
28 #define ERROR_NO_ERROR 0
29 #define ERROR_READING_HEADER 1
30 #define ERROR_READING_PALETTE 2
31 #define ERROR_MEMORY 3
32 #define ERROR_READ_ERROR 4
34 static int picerror = ERROR_NO_ERROR;
41 case ERROR_READING_HEADER:
42 strncpy(buffer,
"PIC loader: Error reading header", bufferlen);
44 case ERROR_READING_PALETTE:
45 strncpy(buffer,
"PIC loader: Error reading palette", bufferlen);
48 strncpy(buffer,
"PIC loader: Out of memory error", bufferlen);
50 case ERROR_READ_ERROR:
51 strncpy(buffer,
"PIC loader: Read error", bufferlen);
60 readint16(FILE *fp,
int * res)
62 unsigned char tmp = 0;
64 if (fread(&tmp, 1, 1, fp) != 1)
return 0;
66 if (fread(&tmp, 1, 1, fp) != 1)
return 0;
76 const unsigned char *header,
79 static unsigned char piccmp[] = {0x19, 0x91};
80 if (headerlen < 2)
return 0;
81 if (memcmp((
const void*)header,
82 (
const void*)piccmp, 2) == 0)
return 1;
90 int *numComponents_ret)
92 int w, h, width, height, i, j, format;
93 unsigned char palette[256][3];
94 unsigned char * tmpbuf, * buffer, * ptr;
96 FILE *fp = fopen(filename,
"rb");
99 picerror = ERROR_NO_ERROR;
101 fseek(fp, 2, SEEK_SET);
102 if (!readint16(fp, &w)) {
103 picerror = ERROR_READING_HEADER;
108 fseek(fp, 4, SEEK_SET);
109 if (!readint16(fp, &h)) {
110 picerror = ERROR_READING_HEADER;
118 if (width <= 0 || height <= 0) {
122 fseek(fp, 32, SEEK_SET);
124 if (fread(&palette, 3, 256, fp) != 256) {
125 picerror = ERROR_READING_PALETTE;
128 tmpbuf = (
unsigned char *)malloc(width);
129 buffer = (
unsigned char*) malloc((
size_t)width*height*3);
130 if (tmpbuf == NULL || buffer == NULL) {
131 picerror = ERROR_MEMORY;
132 if (tmpbuf) free(tmpbuf);
133 if (buffer) free(buffer);
138 for (i = 0; i < height; i++) {
139 if (fread(tmpbuf, 1, width, fp) != (
size_t) width) {
140 picerror = ERROR_READ_ERROR;
142 if (tmpbuf) free(tmpbuf);
143 if (buffer) free(buffer);
148 for (j = 0; j < width; j++) {
150 *ptr++ = palette[idx][0];
151 *ptr++ = palette[idx][1];
152 *ptr++ = palette[idx][2];
159 *height_ret = height;
160 *numComponents_ret = format;
unsigned char * simage_pic_load(const char *filename, int *width, int *height, int *numComponents)
int simage_pic_identify(const char *filename, const unsigned char *header, int headerlen)
int simage_pic_error(char *buffer, int bufferlen)