KSM edits to RA8875

Dependents:   Liz_Test_Code

Revision:
162:a2d7f1988711
Parent:
157:1565f38ca44b
Child:
163:17526689a3ed
--- a/RA8875.cpp	Sun Jan 13 19:02:36 2019 +0000
+++ b/RA8875.cpp	Mon Feb 11 03:44:42 2019 +0000
@@ -2061,6 +2061,13 @@
     return noerror;
 }
 
+int RA8875::RoundUp(int value, int roundTo)
+{
+    if (roundTo == 0) 
+        return 0;
+    return ((value + roundTo - 1) / roundTo) * roundTo;
+}
+
 RetCode_t RA8875::PrintScreen(loc_t x, loc_t y, dim_t w, dim_t h)
 {
     BITMAPFILEHEADER BMP_Header;
@@ -2076,10 +2083,14 @@
             && h > 0 && y + h <= screenheight) {
 
         BMP_Header.bfType = BF_TYPE;
-        BMP_Header.bfSize = (w * h * sizeof(RGBQUAD)) + sizeof(BMP_Header) + sizeof(BMP_Header);
+        BMP_Header.bfSize = (w * h * sizeof(RGBQUAD)) + sizeof(BMP_Header) + sizeof(BMP_Info);
         BMP_Header.bfReserved1 = 0;
         BMP_Header.bfReserved2 = 0;
-        BMP_Header.bfOffBits = sizeof(BMP_Header) + sizeof(BMP_Header);
+        BMP_Header.bfOffBits = sizeof(BMP_Header) + sizeof(BMP_Info);
+
+        // Bytes in the line buffer
+        int lineBufSize = RoundUp(3 * w, 4);    // ((24 * w + 7)/8);
+        INFO("LineBufSize: %d", lineBufSize);
 
         BMP_Info.biSize = sizeof(BMP_Info);
         BMP_Info.biWidth = w;
@@ -2087,19 +2098,19 @@
         BMP_Info.biPlanes = 1;
         BMP_Info.biBitCount = 24;
         BMP_Info.biCompression = BI_RGB;
-        BMP_Info.biSizeImage = 0;
+        BMP_Info.biSizeImage = lineBufSize * h;
         BMP_Info.biXPelsPerMeter = 0;
         BMP_Info.biYPelsPerMeter = 0;
         BMP_Info.biClrUsed = 0;
         BMP_Info.biClrImportant = 0;
 
         // Allocate the memory we need to proceed
-        int lineBufSize = ((24 * w + 7)/8);
         lineBuffer = (uint8_t *)swMalloc(lineBufSize);
         if (lineBuffer == NULL) {
             ERR("Not enough RAM for PrintScreen lineBuffer");
             return(not_enough_ram);
         }
+        memset(lineBuffer, 0, lineBufSize); // zero-Fill
 
         #define DOUBLEBUF /* one larger buffer instead of two */
         
@@ -2130,7 +2141,7 @@
         privateCallback(OPEN, (uint8_t *)&BMP_Header.bfSize, 4);
 
         // Be optimistic - don't check for errors.
-        HexDump("BMP_Header", (uint8_t *)&BMP_Header, sizeof(BMP_Header));        
+        HexDump("BMP_Header", (uint8_t *)&BMP_Header, sizeof(BMP_Header));
         //fwrite(&BMP_Header, sizeof(char), sizeof(BMP_Header), Image);
         privateCallback(WRITE, (uint8_t *)&BMP_Header, sizeof(BMP_Header));
 
@@ -2174,12 +2185,16 @@
                 }
             }
             INFO("1st Color: %04X", pixelBuffer[0]);
-            HexDump("Raster", (uint8_t *)pixelBuffer, w);
+            HexDump("Raster", (uint8_t *)pixelBuffer, w * 3);
             // Convert the local buffer to RGBQUAD format
             int lb = 0;
             for (int i=0; i<w; i++) {
-                RGBQUAD q0 = RGB16ToRGBQuad(pixelBuffer[x+i]);      // Scale to 24-bits
-                RGBQUAD q1 = RGB16ToRGBQuad(pixelBuffer2[x+i]);     // Scale to 24-bits
+                color_t tColor = pixelBuffer[x+i];
+                tColor = (tColor >> 8) | (tColor << 8);     // Byte Swap
+                RGBQUAD q0 = RGB16ToRGBQuad(tColor);        // Scale to 24-bits
+                tColor = pixelBuffer2[x+i];
+                tColor = (tColor >> 8) | (tColor << 8);     // Byte Swap
+                RGBQUAD q1 = RGB16ToRGBQuad(tColor);        // Scale to 24-bits
                 switch (ltpr0) {
                     case 0:
                     case 1:
@@ -2204,14 +2219,12 @@
                 }
             }
             if (j == h - 1) {
-                HexDump("Line", lineBuffer, lineBufSize);
+                HexDump("LineBuffer", lineBuffer, lineBufSize);
             }
             // Write to disk
-            //fwrite(lineBuffer, sizeof(char), lb, Image);
-            privateCallback(WRITE, (uint8_t *)lineBuffer, lb);
+            privateCallback(WRITE, (uint8_t *)lineBuffer, lineBufSize);
         }
         SelectDrawingLayer(prevLayer);
-        //fclose(Image);
         privateCallback(CLOSE, NULL, 0);
         
         #ifndef DOUBLEBUF
@@ -2243,10 +2256,14 @@
             && h > 0 && y + h <= screenheight) {
 
         BMP_Header.bfType = BF_TYPE;
-        BMP_Header.bfSize = (w * h * sizeof(RGBQUAD)) + sizeof(BMP_Header) + sizeof(BMP_Header);
+        BMP_Header.bfSize = (w * h * sizeof(RGBQUAD)) + sizeof(BMP_Header) + sizeof(BMP_Info);
         BMP_Header.bfReserved1 = 0;
         BMP_Header.bfReserved2 = 0;
-        BMP_Header.bfOffBits = sizeof(BMP_Header) + sizeof(BMP_Header);
+        BMP_Header.bfOffBits = sizeof(BMP_Header) + sizeof(BMP_Info);
+
+        // Bytes in the line buffer
+        int lineBufSize = RoundUp(3 * w, 4);    // ((24 * w + 7)/8);
+        INFO("LineBufSize: %d", lineBufSize);
 
         BMP_Info.biSize = sizeof(BMP_Info);
         BMP_Info.biWidth = w;
@@ -2254,19 +2271,19 @@
         BMP_Info.biPlanes = 1;
         BMP_Info.biBitCount = 24;
         BMP_Info.biCompression = BI_RGB;
-        BMP_Info.biSizeImage = 0;
+        BMP_Info.biSizeImage = lineBufSize * h;
         BMP_Info.biXPelsPerMeter = 0;
         BMP_Info.biYPelsPerMeter = 0;
         BMP_Info.biClrUsed = 0;
         BMP_Info.biClrImportant = 0;
 
         // Allocate the memory we need to proceed
-        int lineBufSize = ((24 * w + 7)/8);
         lineBuffer = (uint8_t *)swMalloc(lineBufSize);
         if (lineBuffer == NULL) {
             ERR("Not enough RAM for PrintScreen lineBuffer");
             return(not_enough_ram);
         }
+        memset(lineBuffer, 0, lineBufSize); // zero-Fill
 
         #define DOUBLEBUF /* one larger buffer instead of two */
         
@@ -2348,13 +2365,17 @@
                     ERR("getPixelStream error, and no recovery handler...");
                 }
             }
-            INFO("1st Color: %04X", pixelBuffer[0]);
-            HexDump("Raster", (uint8_t *)pixelBuffer, w);
+            INFO("Line: %3d", j);
+            HexDump("Raster", (uint8_t *)pixelBuffer, w * sizeof(color_t));
             // Convert the local buffer to RGBQUAD format
             int lb = 0;
             for (int i=0; i<w; i++) {
-                RGBQUAD q0 = RGB16ToRGBQuad(pixelBuffer[x+i]);      // Scale to 24-bits
-                RGBQUAD q1 = RGB16ToRGBQuad(pixelBuffer2[x+i]);     // Scale to 24-bits
+                color_t tColor = pixelBuffer[x+i];
+                tColor = (tColor >> 8) | (tColor << 8);     // Byte Swap
+                RGBQUAD q0 = RGB16ToRGBQuad(tColor);        // Scale to 24-bits
+                tColor = pixelBuffer2[x+i];
+                tColor = (tColor >> 8) | (tColor << 8);     // Byte Swap
+                RGBQUAD q1 = RGB16ToRGBQuad(tColor);        // Scale to 24-bits
                 switch (ltpr0) {
                     case 0:
                     case 1:
@@ -2378,11 +2399,11 @@
                         break;
                 }
             }
-            if (j == h - 1) {
+            //if (j == h - 1) {
                 HexDump("Line", lineBuffer, lineBufSize);
-            }
+            //}
             // Write to disk
-            fwrite(lineBuffer, sizeof(char), lb, Image);
+            fwrite(lineBuffer, sizeof(char), lineBufSize, Image);
         }
         SelectDrawingLayer(prevLayer);
         fclose(Image);