rsys

Basic data structures and low-level features
git clone git://git.meso-star.fr/rsys.git
Log | Files | Refs | README | LICENSE

commit d561824f1b4f60e9a765c2bba396de74e446d4c0
parent 698959233eb56ca2f15f880ea9e5bcd52aeed9c4
Author: vaplv <vincent.forest@meso-star.com>
Date:   Fri, 31 Mar 2017 14:42:57 +0200

Add binary serialization of PPM images

Diffstat:
Msrc/image.c | 80++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------
Msrc/image.h | 4+++-
Msrc/test_image.c | 267+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
3 files changed, 216 insertions(+), 135 deletions(-)

diff --git a/src/image.c b/src/image.c @@ -64,7 +64,8 @@ parser_next_token(struct parser* parser) static INLINE res_T parse_ppm_id(const char* str, enum ppm_id* id) { - ASSERT(str && id); + ASSERT(id); + if(!str) return RES_BAD_ARG; if(!strcmp(str, "P3")) { *id = P3; } else if(!strcmp(str, "P6")) { @@ -128,6 +129,46 @@ parse_bin_pixels return (n == fread(buffer, size, n, parser->stream)) ? RES_OK : RES_BAD_ARG; } +static res_T +write_bin_ppm(const struct image* img, FILE* stream) +{ + size_t y; + ASSERT(img && stream); + + FOR_EACH(y, 0, img->height) { + const char* row = img->pixels + y * img->pitch; + size_t n; + n = fwrite(row, sizeof_image_format(img->format), img->width, stream); + if(n < img->width) return RES_IO_ERR; + } + return RES_OK; +} + +static res_T +write_raw_ppm(const struct image* img, FILE* stream) +{ + size_t x, y; + ASSERT(img && stream); + + FOR_EACH(y, 0, img->height) { + const char* row = img->pixels + y * img->pitch; + FOR_EACH(x, 0, img->width) { + const char* pixel = row + x * sizeof_image_format(img->format); + switch(img->format) { + case IMAGE_RGB8: + fprintf(stream, "%u %u %u\n", SPLIT3((uint8_t*)pixel)); + break; + case IMAGE_RGB16: + fprintf(stream, "%u %u %u\n", SPLIT3(((uint16_t*)pixel))); + break; + default: FATAL("Unreachable code.\n"); break; + } + } + } + return RES_OK; +} + + /******************************************************************************* * Exported functions ******************************************************************************/ @@ -157,7 +198,7 @@ image_setup const size_t height, const size_t pitch, const enum image_format format, - char* pixels) + const char* pixels) { size_t size; char* buffer = NULL; @@ -274,7 +315,10 @@ error: } res_T -image_write_ppm(const struct image* img, const char* filename) +image_write_ppm + (const struct image* img, + const int binary, + const char* filename) { FILE* stream = NULL; res_T res = RES_OK; @@ -290,7 +334,7 @@ image_write_ppm(const struct image* img, const char* filename) goto error; } - res = image_write_ppm_stream(img, stream); + res = image_write_ppm_stream(img, binary, stream); if(res != RES_OK) goto error; exit: @@ -301,9 +345,11 @@ error: } res_T -image_write_ppm_stream(const struct image* img, FILE* stream) +image_write_ppm_stream + (const struct image* img, + const int bin, + FILE* stream) { - size_t x, y; res_T res = RES_OK; if(!img || !stream) { @@ -311,28 +357,20 @@ image_write_ppm_stream(const struct image* img, FILE* stream) goto error; } - fprintf(stream, "P3 %lu %lu\n", img->width, img->height); + fprintf(stream, "%s %lu %lu\n", bin ? "P6" : "P3", img->width, img->height); switch(img->format) { /* Write Max val */ case IMAGE_RGB8: fprintf(stream, "255\n"); break; case IMAGE_RGB16: fprintf(stream, "65535\n"); break; default: FATAL("Unreachable code.\n"); break; } - FOR_EACH(y, 0, img->height) { - const char* row = img->pixels + y * img->pitch; - FOR_EACH(x, 0, img->width) { - const char* pixel = row + x * sizeof_image_format(img->format); - switch(img->format) { - case IMAGE_RGB8: - fprintf(stream, "%u %u %u\n", SPLIT3((uint8_t*)pixel)); - break; - case IMAGE_RGB16: - fprintf(stream, "%u %u %u\n", SPLIT3(((uint16_t*)pixel))); - break; - default: FATAL("Unreachable code.\n"); break; - } - } + if(bin) { + res = write_bin_ppm(img, stream); + } else { + res = write_raw_ppm(img, stream); } + if(res != RES_OK) goto error; + exit: return res; diff --git a/src/image.h b/src/image.h @@ -64,7 +64,7 @@ image_setup const size_t height, const size_t pitch, const enum image_format format, - char* pixels); /* May be NULL */ + const char* pixels); /* May be NULL */ RSYS_API res_T image_read_ppm @@ -79,11 +79,13 @@ image_read_ppm_stream RSYS_API res_T image_write_ppm (const struct image* image, + const int binary, const char* filename); RSYS_API res_T image_write_ppm_stream (const struct image* image, + const int binary, FILE* stream); RSYS_API res_T diff --git a/src/test_image.c b/src/test_image.c @@ -20,6 +20,7 @@ #define WIDTH 64 #define HEIGHT 32 + static void check_image (const struct image* img, @@ -58,29 +59,117 @@ check_image } } +static void +check + (const char* pixels, + const size_t width, + const size_t height, + const enum image_format fmt, + struct mem_allocator* allocator) +{ + struct image img; + size_t pitch; + FILE* fp; + + CHECK(image_init(NULL, NULL), RES_BAD_ARG); + CHECK(image_init(allocator, NULL), RES_BAD_ARG); + CHECK(image_init(NULL, &img), RES_OK); + CHECK(image_release(NULL), RES_BAD_ARG); + CHECK(image_release(&img), RES_OK); + CHECK(image_init(allocator, &img), RES_OK); + + pitch = width * sizeof_image_format(fmt); + + CHECK(image_setup(NULL, 0, 0, 0, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(&img, 0, 0, 0, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(NULL, width, 0, 0, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(&img, width, 0, 0, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(NULL, 0, height, 0, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(&img, 0, height, 0, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(NULL, width, height, 0, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(&img, width, height, 0, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(NULL, 0, 0, pitch, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(&img, 0, 0, pitch, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(NULL, width, 0, pitch, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(&img, width, 0, pitch, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(NULL, 0, height, pitch, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(&img, 0, height, pitch, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(NULL, width, height, pitch, fmt, NULL), RES_BAD_ARG); + CHECK(image_setup(&img, width, height, pitch, fmt, NULL), RES_OK); + CHECK(image_setup(NULL, 0, 0, 0, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(&img, 0, 0, 0, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(NULL, width, 0, 0, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(&img, width, 0, 0, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(NULL, 0, height, 0, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(&img, 0, height, 0, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(NULL, width, height, 0, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(&img, width, height, 0, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(NULL, 0, 0, pitch, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(&img, 0, 0, pitch, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(NULL, width, 0, pitch, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(&img, width, 0, pitch, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(NULL, 0, height, pitch, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(&img, 0, height, pitch, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(NULL, width, height, pitch, fmt, pixels), RES_BAD_ARG); + CHECK(image_setup(&img, width, height, pitch, fmt, pixels), RES_OK); + + fp = tmpfile(); + NCHECK(fp, NULL); + + CHECK(image_write_ppm_stream(NULL, 0, NULL), RES_BAD_ARG); + CHECK(image_write_ppm_stream(&img, 0, NULL), RES_BAD_ARG); + CHECK(image_write_ppm_stream(NULL, 0, fp), RES_BAD_ARG); + CHECK(image_write_ppm_stream(&img, 0, fp), RES_OK); + + CHECK(image_read_ppm_stream(NULL, NULL), RES_BAD_ARG); + CHECK(image_read_ppm_stream(&img, NULL), RES_BAD_ARG); + CHECK(image_read_ppm_stream(NULL, fp), RES_BAD_ARG); + CHECK(image_read_ppm_stream(&img, fp), RES_BAD_ARG); + rewind(fp); + CHECK(image_read_ppm_stream(&img, fp), RES_OK); + check_image(&img, pixels, width, height, fmt); + + rewind(fp); + CHECK(image_write_ppm_stream(&img, 1, fp), RES_OK); + rewind(fp); + CHECK(image_read_ppm_stream(&img, fp), RES_OK); + check_image(&img, pixels, width, height, fmt); + + CHECK(image_write_ppm_stream(&img, 1, stdout), RES_OK); + + CHECK(image_release(&img), RES_OK); + + fclose(fp); +} + int main(int argc, char** argv) { - unsigned char lut[4][4][3] = { - {{0xFF,0xFF,0x00}, {0xFF,0x00,0x00 }, {0xFF,0x00,0x00}, { 0xFF,0xFF,0x00}}, - {{0xFF,0xFF,0xFF}, {0x00,0x00,0x00 }, {0x00,0x00,0x00}, { 0xFF,0xFF,0xFF}}, - {{0x00,0xFF,0x00}, {0x00,0xFF,0xFF }, {0x00,0xFF,0xFF}, { 0x00,0xFF,0x00}}, - {{0x00,0x00,0xFF}, {0xFF,0x00,0xFF }, {0xFF,0x00,0xFF}, { 0x00,0x00,0xFF}} + uint8_t lut8[4][4][3] = { + {{0xFF,0xFF,0x00}, {0xFF,0x00,0x00}, {0xFF,0x00,0x00}, {0xFF,0xFF,0x00}}, + {{0xFF,0xFF,0xFF}, {0x00,0x00,0x00}, {0x00,0x00,0x00}, {0xFF,0xFF,0xFF}}, + {{0x00,0xFF,0x00}, {0x00,0xFF,0xFF}, {0x00,0xFF,0xFF}, {0x00,0xFF,0x00}}, + {{0x00,0x00,0xFF}, {0xFF,0x00,0xFF}, {0xFF,0x00,0xFF}, {0x00,0x00,0xFF}} + }; + uint16_t lut16[4][4][3] = { + { {0x0000,0x0000,0xFFFF}, {0xFFFF,0x0000,0xFFFF}, + {0xFFFF,0x0000,0xFFFF}, {0x0000,0x0000,0xFFFF} }, + { {0x0000,0xFFFF,0x0000}, {0x0000,0xFFFF,0xFFFF}, + {0x0000,0xFFFF,0xFFFF}, {0x0000,0xFFFF,0x0000} }, + { {0xFFFF,0xFFFF,0xFFFF}, {0x0000,0x0000,0x0000}, + {0x0000,0x0000,0x0000}, {0xFFFF,0xFFFF,0xFFFF} }, + { {0xFFFF,0xFFFF,0x0000}, {0xFFFF,0x0000,0x0000}, + {0xFFFF,0x0000,0x0000}, {0xFFFF,0xFFFF,0x0000} } }; struct mem_allocator allocator; - struct image img; - unsigned char* pixels; - size_t pitch; + char* pixels; FILE* fp; int x, y, i = 0; (void)argc, (void)argv; CHECK(mem_init_proxy_allocator(&allocator, &mem_default_allocator), RES_OK); - fp = tmpfile(); - NCHECK(fp, NULL); - - pixels = MEM_ALLOC(&allocator, WIDTH*HEIGHT*3); + pixels = MEM_ALLOC(&allocator, WIDTH*sizeof_image_format(IMAGE_RGB8)*HEIGHT); NCHECK(pixels, NULL); i = 0; @@ -89,113 +178,65 @@ main(int argc, char** argv) int j = ((x/32) & 1) + ((y/16)&1) * 2; int k = ((x/8) & 1) + ((y/8)&1) * 2; - pixels[i++] = lut[j][k][0]; - pixels[i++] = lut[j][k][1]; - pixels[i++] = lut[j][k][2]; + ((uint8_t*)pixels)[i++] = lut8[j][k][0]; + ((uint8_t*)pixels)[i++] = lut8[j][k][1]; + ((uint8_t*)pixels)[i++] = lut8[j][k][2]; }} - CHECK(image_ppm_write_stream(NULL, 0, 0, 0, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, 0, 0, 0, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, WIDTH, 0, 0, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, WIDTH, 0, 0, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, 0, HEIGHT, 0, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, 0, HEIGHT, 0, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, WIDTH, HEIGHT, 0, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, WIDTH, HEIGHT, 0, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, 0, 0, 3, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, 0, 0, 3, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, WIDTH, 0, 3, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, WIDTH, 0, 3, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, 0, HEIGHT, 3, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, 0, HEIGHT, 3, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, WIDTH, HEIGHT, 3, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, WIDTH, HEIGHT, 3, NULL), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, 0, 0, 0, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, 0, 0, 0, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, WIDTH, 0, 0, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, WIDTH, 0, 0, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, 0, HEIGHT, 0, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, 0, HEIGHT, 0, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, WIDTH, HEIGHT, 0, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, WIDTH, HEIGHT, 0, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, 0, 0, 3, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, 0, 0, 3, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, WIDTH, 0, 3, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, WIDTH, 0, 3, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, 0, HEIGHT, 3, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, 0, HEIGHT, 3, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(NULL, WIDTH, HEIGHT, 3, pixels), RES_BAD_ARG); - CHECK(image_ppm_write_stream(fp, WIDTH, HEIGHT, 3, pixels), RES_OK); - rewind(fp); - - CHECK(image_init(NULL, NULL), RES_BAD_ARG); - CHECK(image_init(&allocator, NULL), RES_BAD_ARG); - CHECK(image_init(NULL, &img), RES_OK); - CHECK(image_release(NULL), RES_BAD_ARG); - CHECK(image_release(&img), RES_OK); - CHECK(image_init(&allocator, &img), RES_OK); - - pitch = WIDTH * sizeof_image_format(IMAGE_RGB8); - #define SETUP image_setup - CHECK(SETUP(NULL, 0, 0, 0, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(&img, 0, 0, 0, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(NULL, WIDTH, 0, 0, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(&img, WIDTH, 0, 0, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(NULL, 0, HEIGHT, 0, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(&img, 0, HEIGHT, 0, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(NULL, WIDTH, HEIGHT, 0, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(&img, WIDTH, HEIGHT, 0, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(NULL, 0, 0, pitch, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(&img, 0, 0, pitch, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(NULL, WIDTH, 0, pitch, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(&img, WIDTH, 0, pitch, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(NULL, 0, HEIGHT, pitch, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(&img, 0, HEIGHT, pitch, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(NULL, WIDTH, HEIGHT, pitch, IMAGE_RGB8, NULL), RES_BAD_ARG); - CHECK(SETUP(&img, WIDTH, HEIGHT, pitch, IMAGE_RGB8, NULL), RES_OK); - CHECK(SETUP(NULL, 0, 0, 0, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(&img, 0, 0, 0, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(NULL, WIDTH, 0, 0, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(&img, WIDTH, 0, 0, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(NULL, 0, HEIGHT, 0, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(&img, 0, HEIGHT, 0, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(NULL, WIDTH, HEIGHT, 0, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(&img, WIDTH, HEIGHT, 0, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(NULL, 0, 0, pitch, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(&img, 0, 0, pitch, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(NULL, WIDTH, 0, pitch, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(&img, WIDTH, 0, pitch, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(NULL, 0, HEIGHT, pitch, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(&img, 0, HEIGHT, pitch, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(NULL, WIDTH, HEIGHT, pitch, IMAGE_RGB8, (char*)pixels), RES_BAD_ARG); - CHECK(SETUP(&img, WIDTH, HEIGHT, pitch, IMAGE_RGB8, (char*)pixels), RES_OK); - #undef SETUP - - CHECK(image_release(&img), RES_OK); - CHECK(image_init(&allocator, &img), RES_OK); - - CHECK(image_read_ppm_stream(NULL, NULL), RES_BAD_ARG); - CHECK(image_read_ppm_stream(&img, NULL), RES_BAD_ARG); - CHECK(image_read_ppm_stream(NULL, fp), RES_BAD_ARG); - CHECK(image_read_ppm_stream(&img, fp), RES_OK); - - check_image(&img, (char*)pixels, WIDTH, HEIGHT, IMAGE_RGB8); - - rewind(fp); - CHECK(image_write_ppm_stream(NULL, NULL), RES_BAD_ARG); - CHECK(image_write_ppm_stream(&img, NULL), RES_BAD_ARG); - CHECK(image_write_ppm_stream(NULL, fp), RES_BAD_ARG); - CHECK(image_write_ppm_stream(&img, fp), RES_OK); - CHECK(image_read_ppm_stream(&img, fp), RES_BAD_ARG); + fp = tmpfile(); + NCHECK(fp, NULL); + #define WRITE image_ppm_write_stream + CHECK(WRITE(NULL, 0, 0, 0, NULL), RES_BAD_ARG); + CHECK(WRITE(fp, 0, 0, 0, NULL), RES_BAD_ARG); + CHECK(WRITE(NULL, WIDTH, 0, 0, NULL), RES_BAD_ARG); + CHECK(WRITE(fp, WIDTH, 0, 0, NULL), RES_BAD_ARG); + CHECK(WRITE(NULL, 0, HEIGHT, 0, NULL), RES_BAD_ARG); + CHECK(WRITE(fp, 0, HEIGHT, 0, NULL), RES_BAD_ARG); + CHECK(WRITE(NULL, WIDTH, HEIGHT, 0, NULL), RES_BAD_ARG); + CHECK(WRITE(fp, WIDTH, HEIGHT, 0, NULL), RES_BAD_ARG); + CHECK(WRITE(NULL, 0, 0, 3, NULL), RES_BAD_ARG); + CHECK(WRITE(fp, 0, 0, 3, NULL), RES_BAD_ARG); + CHECK(WRITE(NULL, WIDTH, 0, 3, NULL), RES_BAD_ARG); + CHECK(WRITE(fp, WIDTH, 0, 3, NULL), RES_BAD_ARG); + CHECK(WRITE(NULL, 0, HEIGHT, 3, NULL), RES_BAD_ARG); + CHECK(WRITE(fp, 0, HEIGHT, 3, NULL), RES_BAD_ARG); + CHECK(WRITE(NULL, WIDTH, HEIGHT, 3, NULL), RES_BAD_ARG); + CHECK(WRITE(fp, WIDTH, HEIGHT, 3, NULL), RES_BAD_ARG); + CHECK(WRITE(NULL, 0, 0, 0, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(fp, 0, 0, 0, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(NULL, WIDTH, 0, 0, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(fp, WIDTH, 0, 0, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(NULL, 0, HEIGHT, 0, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(fp, 0, HEIGHT, 0, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(NULL, WIDTH, HEIGHT, 0, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(fp, WIDTH, HEIGHT, 0, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(NULL, 0, 0, 3, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(fp, 0, 0, 3, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(NULL, WIDTH, 0, 3, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(fp, WIDTH, 0, 3, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(NULL, 0, HEIGHT, 3, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(fp, 0, HEIGHT, 3, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(NULL, WIDTH, HEIGHT, 3, (unsigned char*)pixels), RES_BAD_ARG); + CHECK(WRITE(fp, WIDTH, HEIGHT, 3, (unsigned char*)pixels), RES_OK); + #undef WRITE rewind(fp); - CHECK(image_write_ppm_stream(&img, fp), RES_OK); - check_image(&img, (char*)pixels, WIDTH, HEIGHT, IMAGE_RGB8); - CHECK(image_write_ppm_stream(&img, stdout), RES_OK); + check(pixels, WIDTH, HEIGHT, IMAGE_RGB8, &allocator); + MEM_RM(&allocator, pixels); - CHECK(image_release(&img), RES_OK); + pixels = MEM_ALLOC(&allocator, WIDTH*sizeof_image_format(IMAGE_RGB16)*HEIGHT); + NCHECK(pixels, NULL); - fclose(fp); + i = 0; + FOR_EACH(y, 0, HEIGHT) { + FOR_EACH(x, 0, WIDTH) { + int j = ((x/32) & 1) + ((y/16)&1) * 2; + int k = ((x/8) & 1) + ((y/8)&1) * 2; + ((uint16_t*)pixels)[i++] = lut16[j][k][0]; + ((uint16_t*)pixels)[i++] = lut16[j][k][1]; + ((uint16_t*)pixels)[i++] = lut16[j][k][2]; + }} + check(pixels, WIDTH, HEIGHT, IMAGE_RGB16, &allocator); MEM_RM(&allocator, pixels); check_memory_allocator(&allocator);