diff options
Diffstat (limited to 'src/modules/loaders/loader_pnm.c')
-rw-r--r-- | src/modules/loaders/loader_pnm.c | 1122 |
1 files changed, 564 insertions, 558 deletions
diff --git a/src/modules/loaders/loader_pnm.c b/src/modules/loaders/loader_pnm.c index 04ea4e4..afbee22 100644 --- a/src/modules/loaders/loader_pnm.c +++ b/src/modules/loaders/loader_pnm.c @@ -79,18 +79,18 @@ load(ImlibImage * im, ImlibProgressFunction progress, count++; switch (count) { - /* width */ - case 1: - w = atoi(buf); - break; - /* height */ - case 2: - h = atoi(buf); - break; - /* max value, only for color and greyscale */ - case 3: - v = atoi(buf); - break; + /* width */ + case 1: + w = atoi(buf); + break; + /* height */ + case 2: + h = atoi(buf); + break; + /* max value, only for color and greyscale */ + case 3: + v = atoi(buf); + break; } } } @@ -105,8 +105,8 @@ load(ImlibImage * im, ImlibProgressFunction progress, im->h = h; if (!IMAGE_DIMENSIONS_OK(w, h)) { - fclose(f); - return 0; + fclose(f); + return 0; } if (!im->format) { @@ -138,551 +138,557 @@ load(ImlibImage * im, ImlibProgressFunction progress, /* start reading the data */ switch (p) { - case '1': /* ASCII monochrome */ - buf[0] = 0; - i = 0; - for (y = 0; y < h; y++) - { - x = 0; - while (x < w) - { - if (!buf[i]) /* fill buffer */ - { - if (!fgets(buf, 255, f)) - { - fclose(f); - return 0; - } - i = 0; - } - while (buf[i] && isspace(buf[i])) - i++; - if (buf[i]) - { - if (buf[i] == '1') - *ptr2 = 0xff000000; - else if (buf[i] == '0') - *ptr2 = 0xffffffff; - else - { - fclose(f); - return 0; - } - ptr2++; - i++; - } - } - if (progress) - { - char per; - int l; - - per = (char)((100 * y) / im->h); - if (((per - pper) >= progress_granularity) - || (y == (im->h - 1))) - { - l = y - pl; - - /* fix off by one in case of the last line */ - if (y == (im->h - 1)) - l++; - - if (!progress(im, per, 0, pl, im->w, l)) - { - fclose(f); - return 2; - } - pper = per; - pl = y; - } - } - } - break; - case '2': /* ASCII greyscale */ - idata = malloc(sizeof(int) * w); - - if (!idata) - { - fclose(f); - return 0; - } - buf[0] = 0; - i = 0; - j = 0; - for (y = 0; y < h; y++) - { - iptr = idata; - x = 0; - while (x < w) - { - int k; - /* check 4 chars ahead to see if we need to - fill the buffer */ - for (k = 0; k < 4; k++) - { - if (!buf[i+k]) /* fill buffer */ - { - if (fseek(f, -k, SEEK_CUR) == -1 || !fgets(buf, 255, f)) - { - free(idata); - fclose(f); - return 0; - } - i = 0; - break; - } - } - while (buf[i] && isspace(buf[i])) - i++; - while (buf[i] && !isspace(buf[i])) - buf2[j++] = buf[i++]; - if (j) - { - buf2[j] = 0; - *(iptr++) = atoi(buf2); - j = 0; - x++; - } - } - iptr = idata; - if (v == 255) - { - for (x = 0; x < w; x++) - { - *ptr2 = - 0xff000000 | (iptr[0] << 16) | (iptr[0] << 8) - | iptr[0]; - ptr2++; - iptr++; - } - } - else - { - for (x = 0; x < w; x++) - { - *ptr2 = - 0xff000000 | (((iptr[0] * 255) / v) << 16) | - (((iptr[0] * 255) / v) << 8) | ((iptr[0] * - 255) / v); - ptr2++; - iptr++; - } - } - if (progress) - { - char per; - int l; - - per = (char)((100 * y) / im->h); - if (((per - pper) >= progress_granularity) - || (y == (im->h - 1))) - { - - l = y - pl; - - /* fix off by one in case of the last line */ - if (y == (im->h - 1)) - l++; - - if (!progress(im, per, 0, pl, im->w, l)) - { - free(idata); - fclose(f); - return 2; - } - pper = per; - pl = y; - } - } - } - break; - case '3': /* ASCII RGB */ - idata = malloc(3 * sizeof(int) * w); - - if (!idata) - { - fclose(f); - return 0; - } - buf[0] = 0; - i = 0; - j = 0; - for (y = 0; y < h; y++) - { - int w3 = 3 * w; - - iptr = idata; - x = 0; - while (x < w3) - { - int k; - /* check 4 chars ahead to see if we need to - fill the buffer */ - for (k = 0; k < 4; k++) - { - if (!buf[i+k]) /* fill buffer */ - { - if (fseek(f, -k, SEEK_CUR) == -1 || !fgets(buf, 255, f)) - { - free(idata); - fclose(f); - return 0; - } - i = 0; - break; - } - } - while (buf[i] && isspace(buf[i])) + case '1': /* ASCII monochrome */ + buf[0] = 0; + i = 0; + for (y = 0; y < h; y++) + { + x = 0; + while (x < w) + { + if (!buf[i]) /* fill buffer */ + { + if (!fgets(buf, 255, f)) + { + fclose(f); + return 0; + } + i = 0; + } + while (buf[i] && isspace(buf[i])) + i++; + if (buf[i]) + { + if (buf[i] == '1') + *ptr2 = 0xff000000; + else if (buf[i] == '0') + *ptr2 = 0xffffffff; + else + { + fclose(f); + return 0; + } + ptr2++; i++; - while (buf[i] && !isspace(buf[i])) - buf2[j++] = buf[i++]; - if (j) - { - buf2[j] = 0; - *(iptr++) = atoi(buf2); - j = 0; - x++; - } - } - iptr = idata; - if (v == 255) - { - for (x = 0; x < w; x++) - { - *ptr2 = - 0xff000000 | (iptr[0] << 16) | (iptr[1] << 8) - | iptr[2]; - ptr2++; - iptr += 3; - } - } - else - { - for (x = 0; x < w; x++) - { - *ptr2 = - 0xff000000 | (((iptr[0] * 255) / v) << 16) | - (((iptr[1] * 255) / v) << 8) | ((iptr[2] * - 255) / v); - ptr2++; - iptr += 3; - } - } - if (progress) - { - char per; - int l; - - per = (char)((100 * y) / im->h); - if (((per - pper) >= progress_granularity) - || (y == (im->h - 1))) - { - l = y - pl; - - /* fix off by one in case of the last line */ - if (y == (im->h - 1)) - l++; - - if (!progress(im, per, 0, pl, im->w, l)) - { - free(idata); - fclose(f); - return 2; - } - pper = per; - pl = y; - } - } - } - break; - case '4': /* binary 1bit monochrome */ - data = malloc(1 * sizeof(DATA8)); - if (!data) - { - fclose(f); - return 0; - } - ptr2 = im->data; - j = 0; - while ((fread(data, 1, 1, f)) && (j < (w * h))) - { - for (i = 7; i >= 0; i--) - { - if (j < (w * h)) - { - if (data[0] & (1 << i)) - *ptr2 = 0xff000000; - else - *ptr2 = 0xffffffff; - ptr2++; - } - j++; - } - } - break; - case '5': /* binary 8bit grayscale GGGGGGGG */ - data = malloc(1 * sizeof(DATA8) * w); - if (!data) - { - fclose(f); - return 0; - } - ptr2 = im->data; - for (y = 0; y < h; y++) - { - if (!fread(data, w * 1, 1, f)) - { - free(data); - fclose(f); - return 1; - } - ptr = data; - if (v == 255) - { - for (x = 0; x < w; x++) - { - *ptr2 = - 0xff000000 | (ptr[0] << 16) | (ptr[0] << 8) | - ptr[0]; - ptr2++; - ptr++; - } - } - else - { - for (x = 0; x < w; x++) - { - *ptr2 = - 0xff000000 | (((ptr[0] * 255) / v) << 16) | - (((ptr[0] * 255) / v) << 8) | ((ptr[0] * - 255) / v); - ptr2++; - ptr++; - } - } - if (progress) - { - char per; - int l; - - per = (char)((100 * y) / im->h); - if (((per - pper) >= progress_granularity) - || (y == (im->h - 1))) - { - l = y - pl; - - /* fix off by one in case of the last line */ - if (y == (im->h - 1)) - l++; - - if (!progress(im, per, 0, pl, im->w, l)) - { - free(data); - fclose(f); - return 2; - } - pper = per; - pl = y; - } - } - } - break; - case '6': /* 24bit binary RGBRGBRGB */ - data = malloc(3 * sizeof(DATA8) * w); - if (!data) - { - fclose(f); - return 0; - } - ptr2 = im->data; - for (y = 0; y < h; y++) - { - if (!fread(data, w * 3, 1, f)) - { - free(data); - fclose(f); - return 1; - } - ptr = data; - if (v == 255) - { - for (x = 0; x < w; x++) - { - *ptr2 = - 0xff000000 | (ptr[0] << 16) | (ptr[1] << 8) | - ptr[2]; - ptr2++; - ptr += 3; - } - } - else - { - for (x = 0; x < w; x++) - { - *ptr2 = - 0xff000000 | (((ptr[0] * 255) / v) << 16) | - (((ptr[1] * 255) / v) << 8) | ((ptr[2] * - 255) / v); - ptr2++; - ptr += 3; - } - } - if (progress) - { - char per; - int l; - - per = (char)((100 * y) / im->h); - if (((per - pper) >= progress_granularity) - || (y == (im->h - 1))) - { - l = y - pl; - - /* fix off by one in case of the last line */ - if (y == (im->h - 1)) - l++; - - if (!progress(im, per, 0, pl, im->w, l)) - { - free(data); - fclose(f); - return 2; - } - pper = per; - pl = y; - } - } - } - break; - case '7': /* XV's 8bit 332 format */ - data = malloc(1 * sizeof(DATA8) * w); - if (!data) - { - fclose(f); - return 0; - } - ptr2 = im->data; - for (y = 0; y < h; y++) - { - if (!fread(data, w * 1, 1, f)) - { - free(data); - fclose(f); - return 1; - } - ptr = data; - for (x = 0; x < w; x++) - { - int r, g, b; - - r = (*ptr >> 5) & 0x7; - g = (*ptr >> 2) & 0x7; - b = (*ptr) & 0x3; - *ptr2 = - 0xff000000 | (((r << 21) | (r << 18) | (r << 15)) & - 0xff0000) | (((g << 13) | (g << 10) | - (g << 7)) & 0xff00) | - ((b << 6) | (b << 4) | (b << 2) | (b << 0)); - ptr2++; - ptr++; - } - if (progress) - { - char per; - int l = 0; - - per = (char)((100 * y) / im->h); - if (((per - pper) >= progress_granularity) - || (y == (im->h - 1))) - { - /* fix off by one in case of the last line */ - if (y == (im->h - 1)) - l++; - - if (!progress(im, per, 0, pl, im->w, l)) - { - free(data); - fclose(f); - return 2; - } - pper = per; - pl = y; - } - } - } - break; - case '8': /* 24bit binary RGBARGBARGBA */ - data = malloc(4 * sizeof(DATA8) * w); - if (!data) - { - fclose(f); - return 0; - } - ptr2 = im->data; - for (y = 0; y < h; y++) - { - if (!fread(data, w * 4, 1, f)) - { - free(data); - fclose(f); - return 1; - } - ptr = data; - if (v == 255) - { - for (x = 0; x < w; x++) - { - *ptr2 = - (ptr[3] << 24) | (ptr[0] << 16) | (ptr[1] << - 8) | - ptr[2]; - ptr2++; - ptr += 4; - } - } - else - { - for (x = 0; x < w; x++) - { - *ptr2 = - (((ptr[3] * 255) / - v) << 24) | (((ptr[0] * 255) / - v) << 16) | (((ptr[1] * 255) / - v) << 8) | - ((ptr[2] * 255) / v); - ptr2++; - ptr += 4; - } - } - if (progress) - { - char per; - int l = 0; - - per = (char)((100 * y) / im->h); - if (((per - pper) >= progress_granularity) - || (y == (im->h - 1))) - { - /* fix off by one in case of the last line */ - if (y == (im->h - 1)) - l++; - - if (!progress(im, per, 0, pl, im->w, l)) - { - free(data); - fclose(f); - return 2; - } - pper = per; - pl = y; - } - } - } - break; - default: - fclose(f); - return 0; - break; + } + } + if (progress) + { + char per; + int l; + + per = (char)((100 * y) / im->h); + if (((per - pper) >= progress_granularity) + || (y == (im->h - 1))) + { + l = y - pl; + + /* fix off by one in case of the last line */ + if (y == (im->h - 1)) + l++; + + if (!progress(im, per, 0, pl, im->w, l)) + { + fclose(f); + return 2; + } + pper = per; + pl = y; + } + } + } + break; + case '2': /* ASCII greyscale */ + idata = malloc(sizeof(int) * w); + + if (!idata) + { + fclose(f); + return 0; + } + buf[0] = 0; + i = 0; + j = 0; + for (y = 0; y < h; y++) + { + iptr = idata; + x = 0; + while (x < w) + { + int k; + + /* check 4 chars ahead to see if we need to + * fill the buffer */ + for (k = 0; k < 4; k++) + { + if (!buf[i + k]) /* fill buffer */ + { + if (fseek(f, -k, SEEK_CUR) == -1 || + !fgets(buf, 255, f)) + { + free(idata); + fclose(f); + return 0; + } + i = 0; + break; + } + } + while (buf[i] && isspace(buf[i])) + i++; + while (buf[i] && !isspace(buf[i])) + buf2[j++] = buf[i++]; + if (j) + { + buf2[j] = 0; + *(iptr++) = atoi(buf2); + j = 0; + x++; + } + } + iptr = idata; + if (v == 255) + { + for (x = 0; x < w; x++) + { + *ptr2 = + 0xff000000 | (iptr[0] << 16) | (iptr[0] << 8) + | iptr[0]; + ptr2++; + iptr++; + } + } + else + { + for (x = 0; x < w; x++) + { + *ptr2 = + 0xff000000 | + (((iptr[0] * 255) / v) << 16) | + (((iptr[0] * 255) / v) << 8) | + ((iptr[0] * 255) / v); + ptr2++; + iptr++; + } + } + if (progress) + { + char per; + int l; + + per = (char)((100 * y) / im->h); + if (((per - pper) >= progress_granularity) + || (y == (im->h - 1))) + { + + l = y - pl; + + /* fix off by one in case of the last line */ + if (y == (im->h - 1)) + l++; + + if (!progress(im, per, 0, pl, im->w, l)) + { + free(idata); + fclose(f); + return 2; + } + pper = per; + pl = y; + } + } + } + break; + case '3': /* ASCII RGB */ + idata = malloc(3 * sizeof(int) * w); + + if (!idata) + { + fclose(f); + return 0; + } + buf[0] = 0; + i = 0; + j = 0; + for (y = 0; y < h; y++) + { + int w3 = 3 * w; + + iptr = idata; + x = 0; + while (x < w3) + { + int k; + + /* check 4 chars ahead to see if we need to + * fill the buffer */ + for (k = 0; k < 4; k++) + { + if (!buf[i + k]) /* fill buffer */ + { + if (fseek(f, -k, SEEK_CUR) == -1 || + !fgets(buf, 255, f)) + { + free(idata); + fclose(f); + return 0; + } + i = 0; + break; + } + } + while (buf[i] && isspace(buf[i])) + i++; + while (buf[i] && !isspace(buf[i])) + buf2[j++] = buf[i++]; + if (j) + { + buf2[j] = 0; + *(iptr++) = atoi(buf2); + j = 0; + x++; + } + } + iptr = idata; + if (v == 255) + { + for (x = 0; x < w; x++) + { + *ptr2 = + 0xff000000 | (iptr[0] << 16) | (iptr[1] << 8) + | iptr[2]; + ptr2++; + iptr += 3; + } + } + else + { + for (x = 0; x < w; x++) + { + *ptr2 = + 0xff000000 | + (((iptr[0] * 255) / v) << 16) | + (((iptr[1] * 255) / v) << 8) | + ((iptr[2] * 255) / v); + ptr2++; + iptr += 3; + } + } + if (progress) + { + char per; + int l; + + per = (char)((100 * y) / im->h); + if (((per - pper) >= progress_granularity) + || (y == (im->h - 1))) + { + l = y - pl; + + /* fix off by one in case of the last line */ + if (y == (im->h - 1)) + l++; + + if (!progress(im, per, 0, pl, im->w, l)) + { + free(idata); + fclose(f); + return 2; + } + pper = per; + pl = y; + } + } + } + break; + case '4': /* binary 1bit monochrome */ + data = malloc(1 * sizeof(DATA8)); + if (!data) + { + fclose(f); + return 0; + } + ptr2 = im->data; + j = 0; + while ((fread(data, 1, 1, f)) && (j < (w * h))) + { + for (i = 7; i >= 0; i--) + { + if (j < (w * h)) + { + if (data[0] & (1 << i)) + *ptr2 = 0xff000000; + else + *ptr2 = 0xffffffff; + ptr2++; + } + j++; + } + } + break; + case '5': /* binary 8bit grayscale GGGGGGGG */ + data = malloc(1 * sizeof(DATA8) * w); + if (!data) + { + fclose(f); + return 0; + } + ptr2 = im->data; + for (y = 0; y < h; y++) + { + if (!fread(data, w * 1, 1, f)) + { + free(data); + fclose(f); + return 1; + } + ptr = data; + if (v == 255) + { + for (x = 0; x < w; x++) + { + *ptr2 = + 0xff000000 | (ptr[0] << 16) | (ptr[0] << 8) | + ptr[0]; + ptr2++; + ptr++; + } + } + else + { + for (x = 0; x < w; x++) + { + *ptr2 = + 0xff000000 | + (((ptr[0] * 255) / v) << 16) | + (((ptr[0] * 255) / v) << 8) | + ((ptr[0] * 255) / v); + ptr2++; + ptr++; + } + } + if (progress) + { + char per; + int l; + + per = (char)((100 * y) / im->h); + if (((per - pper) >= progress_granularity) + || (y == (im->h - 1))) + { + l = y - pl; + + /* fix off by one in case of the last line */ + if (y == (im->h - 1)) + l++; + + if (!progress(im, per, 0, pl, im->w, l)) + { + free(data); + fclose(f); + return 2; + } + pper = per; + pl = y; + } + } + } + break; + case '6': /* 24bit binary RGBRGBRGB */ + data = malloc(3 * sizeof(DATA8) * w); + if (!data) + { + fclose(f); + return 0; + } + ptr2 = im->data; + for (y = 0; y < h; y++) + { + if (!fread(data, w * 3, 1, f)) + { + free(data); + fclose(f); + return 1; + } + ptr = data; + if (v == 255) + { + for (x = 0; x < w; x++) + { + *ptr2 = + 0xff000000 | (ptr[0] << 16) | (ptr[1] << 8) | + ptr[2]; + ptr2++; + ptr += 3; + } + } + else + { + for (x = 0; x < w; x++) + { + *ptr2 = + 0xff000000 | + (((ptr[0] * 255) / v) << 16) | + (((ptr[1] * 255) / v) << 8) | + ((ptr[2] * 255) / v); + ptr2++; + ptr += 3; + } + } + if (progress) + { + char per; + int l; + + per = (char)((100 * y) / im->h); + if (((per - pper) >= progress_granularity) + || (y == (im->h - 1))) + { + l = y - pl; + + /* fix off by one in case of the last line */ + if (y == (im->h - 1)) + l++; + + if (!progress(im, per, 0, pl, im->w, l)) + { + free(data); + fclose(f); + return 2; + } + pper = per; + pl = y; + } + } + } + break; + case '7': /* XV's 8bit 332 format */ + data = malloc(1 * sizeof(DATA8) * w); + if (!data) + { + fclose(f); + return 0; + } + ptr2 = im->data; + for (y = 0; y < h; y++) + { + if (!fread(data, w * 1, 1, f)) + { + free(data); + fclose(f); + return 1; + } + ptr = data; + for (x = 0; x < w; x++) + { + int r, g, b; + + r = (*ptr >> 5) & 0x7; + g = (*ptr >> 2) & 0x7; + b = (*ptr) & 0x3; + *ptr2 = + 0xff000000 | + (((r << 21) | (r << 18) | (r << 15)) & 0xff0000) | + (((g << 13) | (g << 10) | (g << 7)) & 0xff00) | + ((b << 6) | (b << 4) | (b << 2) | (b << 0)); + ptr2++; + ptr++; + } + if (progress) + { + char per; + int l = 0; + + per = (char)((100 * y) / im->h); + if (((per - pper) >= progress_granularity) + || (y == (im->h - 1))) + { + /* fix off by one in case of the last line */ + if (y == (im->h - 1)) + l++; + + if (!progress(im, per, 0, pl, im->w, l)) + { + free(data); + fclose(f); + return 2; + } + pper = per; + pl = y; + } + } + } + break; + case '8': /* 24bit binary RGBARGBARGBA */ + data = malloc(4 * sizeof(DATA8) * w); + if (!data) + { + fclose(f); + return 0; + } + ptr2 = im->data; + for (y = 0; y < h; y++) + { + if (!fread(data, w * 4, 1, f)) + { + free(data); + fclose(f); + return 1; + } + ptr = data; + if (v == 255) + { + for (x = 0; x < w; x++) + { + *ptr2 = + (ptr[3] << 24) | (ptr[0] << 16) | + (ptr[1] << 8) | ptr[2]; + ptr2++; + ptr += 4; + } + } + else + { + for (x = 0; x < w; x++) + { + *ptr2 = + (((ptr[3] * 255) / v) << 24) | + (((ptr[0] * 255) / v) << 16) | + (((ptr[1] * 255) / v) << 8) | + ((ptr[2] * 255) / v); + ptr2++; + ptr += 4; + } + } + if (progress) + { + char per; + int l = 0; + + per = (char)((100 * y) / im->h); + if (((per - pper) >= progress_granularity) + || (y == (im->h - 1))) + { + /* fix off by one in case of the last line */ + if (y == (im->h - 1)) + l++; + + if (!progress(im, per, 0, pl, im->w, l)) + { + free(data); + fclose(f); + return 2; + } + pper = per; + pl = y; + } + } + } + break; + default: + fclose(f); + return 0; + break; } if (idata) free(idata); |