This is the David Smart RA8875 Library with mods for working with FRDM-K64F
Diff: GraphicsDisplayGIF.cpp
- Revision:
- 177:d8e65c0e268a
- Parent:
- 152:a013ac0133e4
- Child:
- 196:56820026701b
--- a/GraphicsDisplayGIF.cpp Sun Mar 24 14:49:49 2019 +0000 +++ b/GraphicsDisplayGIF.cpp Wed Jul 17 03:02:31 2019 +0000 @@ -14,7 +14,7 @@ #include "GraphicsDisplay.h" -#define DEBUG "GIF_" +//#define DEBUG "GIF_" // // INFO("Stuff to show %d", var); // new-line is automatically appended // @@ -131,9 +131,12 @@ // Create a dictionary large enough to hold "code_length" entries. // Once the dictionary overflows, code_length increases - dictionary = (dictionary_entry_t *) malloc(sizeof(dictionary_entry_t) * (1 << (code_length + 1))); - if (dictionary == NULL) + size_t bytes = sizeof(dictionary_entry_t) * (1 << (code_length + 1)); + INFO("uncompress_gif malloc(%d)", bytes); + dictionary = (dictionary_entry_t *) malloc(bytes); + if (dictionary == NULL) { return not_enough_ram; + } // Initialize the first 2^code_len entries of the dictionary with their // indices. The rest of the entries will be built up dynamically. @@ -228,7 +231,7 @@ while (code != -1) { int pos = dictionary[code].len - 1; out[pos] = dictionary[code].byte; - //INFO("%p out[%d] = %02X\r\n", out, pos, out[pos]); + //INFO("%p out[%d] = %02X", out, pos, out[pos]); if (dictionary[code].prev == code) { free(dictionary); return not_supported_format; @@ -299,17 +302,17 @@ RetCode_t GraphicsDisplay::readGIFImageDescriptor(FILE * fh, gif_image_descriptor_t * imageDescriptor) { if (read_filesystem_bytes(imageDescriptor, gif_image_descriptor_size, fh) < gif_image_descriptor_size) return not_supported_format; - INFO("gif_image_descriptor\r\n"); - INFO(" left: %d\r\n", imageDescriptor->image_left_position); - INFO(" top: %d\r\n", imageDescriptor->image_top_position); - INFO(" width: %d\r\n", imageDescriptor->image_width); - INFO(" height: %d\r\n", imageDescriptor->image_height); - INFO(" fields: %02Xx\r\n", imageDescriptor->fields); - INFO(" lct: %2d\r\n", (imageDescriptor->fields & 0x80) ? 1 : 0); - INFO(" res: %2d\r\n", (imageDescriptor->fields & 0x40) ? 1 : 0); - INFO(" sort: %2d\r\n", (imageDescriptor->fields & 0x20) ? 1 : 0); - INFO(" res: %2d\r\n", ((imageDescriptor->fields & 0x18) >> 3)); - INFO(" lct siz: %2d\r\n", 1 << ((imageDescriptor->fields & 0x07) + 1)); + INFO("gif_image_descriptor"); + INFO(" left: %d", imageDescriptor->image_left_position); + INFO(" top: %d", imageDescriptor->image_top_position); + INFO(" width: %d", imageDescriptor->image_width); + INFO(" height: %d", imageDescriptor->image_height); + INFO(" fields: %02Xx", imageDescriptor->fields); + INFO(" lct: %2d", (imageDescriptor->fields & 0x80) ? 1 : 0); + INFO(" res: %2d", (imageDescriptor->fields & 0x40) ? 1 : 0); + INFO(" sort: %2d", (imageDescriptor->fields & 0x20) ? 1 : 0); + INFO(" res: %2d", ((imageDescriptor->fields & 0x18) >> 3)); + INFO("locclrtbl siz: %2d", 1 << ((imageDescriptor->fields & 0x07) + 1)); if (imageDescriptor->fields & 0x80) { local_color_table_size = 1 << ((imageDescriptor->fields & 0x07) + 1); local_color_table = (color_t *) malloc(sizeof(color_t) * local_color_table_size); @@ -321,6 +324,7 @@ return not_supported_format; } } + INFO("gif_image_descriptor end."); return noerror; } @@ -340,19 +344,20 @@ if (read_filesystem_bytes(&lzw_code_size, 1, fh) < 1) goto done; - INFO("lzw_code_size\r\n"); - INFO(" lzw code: %d\r\n", lzw_code_size); + INFO("lzw_code_size %d", lzw_code_size); compressed_data_length = read_gif_sub_blocks(fh, &compressed_data); if (compressed_data_length > 0) { uncompress_gifed_data_length = width * height; - *uncompress_gifed_data = (unsigned char *) malloc(uncompress_gifed_data_length); - if (*uncompress_gifed_data == NULL) + *uncompress_gifed_data = (unsigned char *)malloc(uncompress_gifed_data_length); + if (*uncompress_gifed_data == NULL) { return not_enough_ram; + } res = uncompress_gif(lzw_code_size, compressed_data, compressed_data_length, *uncompress_gifed_data); } done: if (compressed_data) free(compressed_data); + INFO("lzw_code_size end %d", res); return res; } @@ -368,18 +373,18 @@ if (read_filesystem_bytes(&extension, extension_size, fh) < extension_size) { return 0; } - INFO("extension\r\n"); - INFO(" code: %d\r\n", extension.extension_code); - INFO(" block size: %d\r\n", extension.block_size); + INFO("extension"); + INFO(" code: %d", extension.extension_code); + INFO(" block size: %d", extension.block_size); switch (extension.extension_code) { case GRAPHIC_CONTROL: if (read_filesystem_bytes(&gce, graphic_control_extension_size, fh) < graphic_control_extension_size) { return 0; } - INFO("graphic_control_extension\r\n"); - INFO(" fields: %d\r\n", gce.fields); - INFO(" delay time: %d\r\n", gce.delay_time); - INFO(" transparent: %d\r\n", gce.transparent_color_index); + INFO("graphic_control_extension"); + INFO(" fields: %d", gce.fields); + INFO(" delay time: %d", gce.delay_time); + INFO(" transparent: %d", gce.transparent_color_index); break; case APPLICATION_EXTENSION: if (read_filesystem_bytes(&application, application_extension_size, fh) < application_extension_size) { @@ -437,27 +442,36 @@ return not_supported_format; INFO("block type: %02X", block_type); + RetCode_t r_pgid = noerror; switch (block_type) { case IMAGE_DESCRIPTOR: - if (readGIFImageDescriptor(fh, &gif_image_descriptor) != noerror) + if (readGIFImageDescriptor(fh, &gif_image_descriptor) != noerror) { + INFO("not supported format"); return not_supported_format; - if (process_gif_image_descriptor(fh, &uncompress_gifed_data, gif_image_descriptor.image_width, gif_image_descriptor.image_height) == noerror) { + } + r_pgid = process_gif_image_descriptor(fh, &uncompress_gifed_data, gif_image_descriptor.image_width, gif_image_descriptor.image_height); + if (r_pgid != noerror) { + INFO("error %d", r_pgid); + return r_pgid; + } else { if (uncompress_gifed_data) { // Ready to render to the screen - INFO("Render to (%d,%d)\r\n", ScreenX, ScreenY); + INFO("Render to (%d,%d)", ScreenX, ScreenY); color_t * active_color_table = (local_color_table) ? local_color_table : global_color_table; // create a local image buffer for this fragment color_t * cbmp = (color_t *) malloc(sizeof(color_t) * gif_image_descriptor.image_width * gif_image_descriptor.image_height); - if (cbmp == NULL) + if (cbmp == NULL) { + INFO("not enough ram"); return not_enough_ram; + } for (int i = 0; i < gif_image_descriptor.image_width * gif_image_descriptor.image_height; i++) { int cIndex = uncompress_gifed_data[i]; cbmp[i] = active_color_table[cIndex]; } // Write Fragment to Screen #if 0 - INFO("Render fragment: (%d,%d), offset: (%d,%d), w x h (%d,%d)\r\n", + INFO("Render fragment: (%d,%d), offset: (%d,%d), w x h (%d,%d)", ScreenX, ScreenY, gif_image_descriptor.image_left_position, gif_image_descriptor.image_top_position, @@ -467,7 +481,7 @@ for (uint16_t x = 0; x < gif_image_descriptor.image_width; x++) { INFO("%04X ", cbmp[y * gif_image_descriptor.image_height + x]); } - INFO("\r\n"); + INFO(""); } #else rect_t restore = windowrect; @@ -487,20 +501,22 @@ free(local_color_table); local_color_table = NULL; } - } else { - return not_supported_format; } break; case EXTENSION_INTRODUCER: - if (!process_gif_extension(fh)) + if (!process_gif_extension(fh)) { + INFO("not supported format"); return not_supported_format; + } break; case TRAILER: break; default: + INFO("not supported format"); return not_supported_format; } } + INFO("no error"); return noerror; } @@ -528,16 +544,16 @@ return not_supported_format; } screen_descriptor_isvalid = true; - INFO("screen_descriptor\r\n"); - INFO(" width: %d\r\n", screen_descriptor.width); - INFO(" height: %d\r\n", screen_descriptor.height); - INFO(" fields: %02Xx\r\n", screen_descriptor.fields); - INFO(" gct: %2d\r\n", (screen_descriptor.fields & 0x80) ? 1 : 0); - INFO(" res: %2d\r\n", ((screen_descriptor.fields & 0x70) >> 4) + 1); - INFO(" sort: %2d\r\n", (screen_descriptor.fields & 0x08) ? 1 : 0); - INFO(" gct siz: %2d\r\n", 1 << ((screen_descriptor.fields & 0x07) + 1)); - INFO(" back clr: %d\r\n", screen_descriptor.background_color_index); - INFO(" pix rat: %d\r\n", screen_descriptor.pixel_aspect_ratio); + INFO("screen_descriptor"); + INFO(" width: %d", screen_descriptor.width); + INFO(" height: %d", screen_descriptor.height); + INFO(" fields: %02Xx", screen_descriptor.fields); + INFO(" gct: %2d", (screen_descriptor.fields & 0x80) ? 1 : 0); + INFO(" res: %2d", ((screen_descriptor.fields & 0x70) >> 4) + 1); + INFO(" sort: %2d", (screen_descriptor.fields & 0x08) ? 1 : 0); + INFO(" gct siz: %2d", 1 << ((screen_descriptor.fields & 0x07) + 1)); + INFO(" back clr: %d", screen_descriptor.background_color_index); + INFO(" pix rat: %d", screen_descriptor.pixel_aspect_ratio); return noerror; }