This is the David Smart RA8875 Library with mods for working with FRDM-K64F

Revision:
190:3132b7dfad82
Parent:
182:8832d03a2a29
--- a/GraphicsDisplay.cpp	Thu Sep 19 21:45:18 2019 +0000
+++ b/GraphicsDisplay.cpp	Sat Sep 21 17:30:00 2019 +0000
@@ -22,14 +22,14 @@
 // INFO("Stuff to show %d", var); // new-line is automatically appended
 //
 #if (defined(DEBUG) && !defined(TARGET_LPC11U24))
-#define INFO(x, ...) std::printf("[INF %s %4d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
-#define WARN(x, ...) std::printf("[WRN %s %4d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
-#define ERR(x, ...)  std::printf("[ERR %s %4d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
+#define INFO(x, ...) std::printf("[INF %s %4d] " x "\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
+#define WARN(x, ...) std::printf("[WRN %s %4d] " x "\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
+#define ERR(x, ...)  std::printf("[ERR %s %4d] " x "\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
 static void HexDump(const char * title, const uint8_t * p, int count)
 {
     int i;
     char buf[100] = "0000: ";
-    
+
     if (*title)
         INFO("%s", title);
     for (i=0; i<count; ) {
@@ -87,7 +87,7 @@
 }
 
 
-GraphicsDisplay::GraphicsDisplay(const char *name) 
+GraphicsDisplay::GraphicsDisplay(const char *name)
     : TextDisplay(name)
 {
     font = NULL;
@@ -220,11 +220,11 @@
     uint16_t lastChar  = font[5] * 256 + font[4];
     dim_t charHeight = font[6];
     const unsigned char * charRecord;   // width, data, data, data, ...
-    
+
     INFO("first:%d, last:%d, c:%d", firstChar, lastChar, c);
     if (c < firstChar || c > lastChar)
         return NULL;       // advance zero pixels since it was unprintable...
-    
+
     // 8 bytes of preamble to the first level lookup table
     offsetToCharLookup = 8 + 4 * (c - firstChar);    // 4-bytes: width(pixels), 16-bit offset from table start, 0
     dim_t charWidth = font[offsetToCharLookup];
@@ -261,7 +261,7 @@
 color_t GraphicsDisplay::RGBQuadToRGB16(RGBQUAD * colorPalette, uint16_t i)
 {
     color_t c;
- 
+
     c  = ((colorPalette[i].rgbBlue  >> 3) <<  0);
     c |= ((colorPalette[i].rgbGreen >> 2) <<  5);
     c |= ((colorPalette[i].rgbRed   >> 3) << 11);
@@ -278,7 +278,7 @@
 RGBQUAD GraphicsDisplay::RGB16ToRGBQuad(color_t c)
 {
     RGBQUAD q;
-    
+
     memset(&q, 0, sizeof(q));
     //c = (c << 8) | (c >> 8);    // swap
     q.rgbBlue  = ((c & 0x001F) << 3) | (c & 0x07);          /* Blue value */
@@ -288,7 +288,7 @@
     return q;
 }
 
-RetCode_t GraphicsDisplay::_RenderBitmap(loc_t x, loc_t y, uint32_t fileOffset, FILE * Image)
+RetCode_t GraphicsDisplay::_RenderBitmap(loc_t x, loc_t y, uint32_t fileOffset, FILE * Image, rect_t * infoOnly)
 {
     BITMAPINFOHEADER BMP_Info;
     RGBQUAD * colorPalette = NULL;
@@ -319,8 +319,18 @@
     PixelHeight = BMP_Info.biHeight;
     PixelWidth = BMP_Info.biWidth;
     INFO("(%d,%d) (%d,%d) (%d,%d)", x,y, PixelWidth,PixelHeight, width(), height());
+    if (infoOnly) {
+        infoOnly->p1.x = x;
+        infoOnly->p1.y = y;
+        infoOnly->p2.x = x+PixelWidth;
+        infoOnly->p2.y = y+PixelHeight;
+        return (noerror);
+    }
+
     if (PixelHeight > height() + y || PixelWidth > width() + x) {
         fclose(Image);
+        ERR("too big: img: (%d,%d), xy: (%d,%d), screen: (%d,%d)\r\n",
+            PixelWidth, PixelHeight, x, y, width(), height());
         return(image_too_big);
     }
     if (BMP_Info.biBitCount <= 8) {
@@ -406,22 +416,61 @@
     return (noerror);
 }
 
-
-RetCode_t GraphicsDisplay::RenderImageFile(loc_t x, loc_t y, const char *FileName)
+rect_t GraphicsDisplay::GetImageRect(loc_t x, loc_t y, const char *Filename)
 {
+    rect_t r = { 0, 0, 0, 0};
+
+    RenderImageFile(x,y,Filename, &r);
+    return r;
+}
+
+RetCode_t GraphicsDisplay::RenderImageFile(loc_t x, loc_t y, const char * FileName, rect_t * getDim) {
     if (mystrnicmp(FileName + strlen(FileName) - 4, ".bmp", 4) == 0) {
-        return RenderBitmapFile(x,y,FileName);
+        return RenderBitmapFile(x, y, FileName, getDim);
     } else if (mystrnicmp(FileName + strlen(FileName) - 4, ".jpg", 4) == 0) {
-        return RenderJpegFile(x,y,FileName);
+        if (getDim)
+            return not_supported_format;
+        return RenderJpegFile(x, y, FileName);
     } else if (mystrnicmp(FileName + strlen(FileName) - 4, ".ico", 4) == 0) {
-        return RenderIconFile(x,y,FileName);
+        if (getDim)
+            return not_supported_format;
+        return RenderIconFile(x, y, FileName);
     } else if (mystrnicmp(FileName + strlen(FileName) - 4, ".gif", 4) == 0) {
-        return RenderGIFFile(x,y,FileName);
+        if (getDim)
+            return not_supported_format;
+        return RenderGIFFile(x, y, FileName);
     } else {
         return not_supported_format;
     }
 }
 
+RetCode_t GraphicsDisplay::RenderBitmapFile(loc_t x, loc_t y, const char *Name_BMP, rect_t * getDim)
+{
+    BITMAPFILEHEADER BMP_Header;
+
+    INFO("Opening {%s}", Name_BMP);
+    FILE *Image = fopen(Name_BMP, "rb");
+    if (!Image) {
+        return(file_not_found);
+    }
+
+    fread(&BMP_Header, 1, sizeof(BMP_Header), Image);      // get the BMP Header
+    INFO("bfType %04X, Header size: %d", BMP_Header.bfType, sizeof(BITMAPFILEHEADER));
+    HexDump("BMP_Header", (uint8_t *)&BMP_Header, sizeof(BMP_Header));
+    if (BMP_Header.bfType != BF_TYPE) {
+        fclose(Image);
+        return(not_bmp_format);
+    }
+    INFO("bfOffits %04X", BMP_Header.bfOffBits);
+    RetCode_t rt = _RenderBitmap(x, y, BMP_Header.bfOffBits, Image, getDim);
+    if (rt != noerror) {
+        return rt;
+    } else {
+        fclose(Image);
+        return (noerror);
+    }
+}
+
 RetCode_t GraphicsDisplay::RenderJpegFile(loc_t x, loc_t y, const char *Name_JPG)
 {
     #define JPEG_WORK_SPACE_SIZE 3100   // Worst case requirements for the decompression
@@ -429,7 +478,7 @@
     uint16_t * work;
     RetCode_t r = noerror;  // start optimistic
     FILE * fh = fopen(Name_JPG, "rb");
-    
+
     if (!fh)
         return(file_not_found);
     //INFO("RenderJpegFile(%d,%d,%s)", x,y, Name_JPG);
@@ -444,7 +493,7 @@
             memset(jdec, 0, sizeof(JDEC));
             r = (RetCode_t)jd_prepare(jdec, NULL, work, JPEG_WORK_SPACE_SIZE, fh);
             INFO("jd_prepare returned %d", r);
-            
+
             if (r == noerror) {
                 img_x = x;  // save the origin for the privOutput function
                 img_y = y;
@@ -466,33 +515,6 @@
     return r;   // error("jd_decomp error:%d", r);
 }
 
-RetCode_t GraphicsDisplay::RenderBitmapFile(loc_t x, loc_t y, const char *Name_BMP)
-{
-    BITMAPFILEHEADER BMP_Header;
-
-    INFO("Opening {%s}", Name_BMP);
-    FILE *Image = fopen(Name_BMP, "rb");
-    if (!Image) {
-        return(file_not_found);
-    }
-
-    fread(&BMP_Header, 1, sizeof(BMP_Header), Image);      // get the BMP Header
-    INFO("bfType %04X", BMP_Header.bfType);
-    HexDump("BMP_Header", (uint8_t *)&BMP_Header, sizeof(BMP_Header));
-    if (BMP_Header.bfType != BF_TYPE) {
-        fclose(Image);
-        return(not_bmp_format);
-    }
-    INFO("bfOffits %04X", BMP_Header.bfOffBits);
-    RetCode_t rt = _RenderBitmap(x, y, BMP_Header.bfOffBits, Image);
-    if (rt != noerror) {
-        return rt;
-    } else {
-        fclose(Image);
-        return (noerror);
-    }
-}
-
 RetCode_t GraphicsDisplay::RenderIconFile(loc_t x, loc_t y, const char *Name_ICO)
 {
     ICOFILEHEADER ICO_Header;