Library to control a Graphics TFT connected to 4-wire SPI - revised for the Raio RA8875 Display Controller.
Dependents: FRDM_RA8875_mPaint RA8875_Demo RA8875_KeyPadDemo SignalGenerator ... more
Fork of SPI_TFT by
See Components - RA8875 Based Display
Enhanced touch-screen support - where it previous supported both the Resistive Touch and Capacitive Touch based on the FT5206 Touch Controller, now it also has support for the GSL1680 Touch Controller.
Offline Help Manual (Windows chm)
/media/uploads/WiredHome/ra8875.zip.bin (download, rename to .zip and unzip)
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; }