Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of RA8875 by
Diff: GraphicsDisplay.cpp
- Revision:
- 32:0e4f2ae512e2
- Parent:
- 31:c72e12cd5c67
- Child:
- 33:b6b710758ab3
--- a/GraphicsDisplay.cpp Mon Jan 20 19:19:48 2014 +0000
+++ b/GraphicsDisplay.cpp Tue Jan 21 03:28:36 2014 +0000
@@ -1,12 +1,21 @@
/* mbed GraphicsDisplay Display Library Base Class
* Copyright (c) 2007-2009 sford
* Released under the MIT License: http://mbed.org/license/mit
+ *
+ * Software Rendering of a Bitmap from the localfilesystem
+ * 34 sec: 352x272 pixels, 8-bit color, 94.5kbytes
+ * Hardware Rendering
+ * 9 sec: same file.
*/
#include "GraphicsDisplay.h"
#include "Bitmap.h"
-#define DEBUG "GD"
+// Defining USE_HW causes compilation of code that uses hardware drawing
+// provided by the super-class.
+#define USE_HW
+
+//#define DEBUG "GD"
// ...
// INFO("Stuff to show %d", var); // new-line is automatically appended
//
@@ -38,7 +47,7 @@
#define INFO(x, ...)
#define WARN(x, ...)
#define ERR(x, ...)
-#define HexDump(a, b)
+#define HexDump(a, b, c)
#endif
// #define LOCALFONT
@@ -184,7 +193,7 @@
}
#endif
-void GraphicsDisplay::window(unsigned int x, unsigned int y, unsigned int w, unsigned int h)
+RetCode_t GraphicsDisplay::window(unsigned int x, unsigned int y, unsigned int w, unsigned int h)
{
// current pixel location
_x = x;
@@ -194,6 +203,7 @@
_x2 = x + w - 1;
_y1 = y;
_y2 = y + h - 1;
+ return noerror;
}
void GraphicsDisplay::WindowMax(void)
@@ -201,7 +211,7 @@
window(0,0, width(),height());
}
-void GraphicsDisplay::putp(color_t colour)
+RetCode_t GraphicsDisplay::putp(color_t colour)
{
// put pixel at current pixel location
pixel(_x, _y, colour);
@@ -214,14 +224,19 @@
_y = _y1;
}
}
+ return noerror;
}
void GraphicsDisplay::fill(int x, int y, int w, int h, color_t colour)
{
+ #ifdef USE_HW
+ fillrect(x,y, x+w, y+h, colour);
+ #else
window(x, y, w, h);
for(int i=0; i<w*h; i++) {
putp(colour);
}
+ #endif
}
RetCode_t GraphicsDisplay::cls()
@@ -288,7 +303,7 @@
// RRRR RGGG GGGB BBBB
// swap to little endian
// GGGB BBBB RRRR RGGG
-color_t RGBQuadToRGB16(RGBQUAD * colorPalette, uint16_t i)
+color_t GraphicsDisplay::RGBQuadToRGB16(RGBQUAD * colorPalette, uint16_t i)
{
color_t c;
@@ -302,7 +317,7 @@
}
-RetCode_t GraphicsDisplay::BMP_16(unsigned int x, unsigned int y, const char *Name_BMP)
+RetCode_t GraphicsDisplay::RenderBitmapFile(unsigned int x, unsigned int y, const char *Name_BMP)
{
#define OffsetPixelWidth 18
#define OffsetPixelHeight 22
@@ -310,12 +325,11 @@
#define OffsetPixData 10
#define OffsetBPP 28
- char filename[50];
BITMAPFILEHEADER BMP_Header;
BITMAPINFOHEADER BMP_Info;
RGBQUAD * colorPalette = NULL;
int colorCount;
- char * lineBuffer = NULL;
+ uint8_t * lineBuffer = NULL;
uint16_t BPP_t;
uint32_t PixelWidth, PixelHeight;
@@ -323,11 +337,8 @@
unsigned int i, offset;
int padd,j;
- // get the filename
- LocalFileSystem local("local");
- sprintf(filename,"/local/%s", Name_BMP);
- INFO("Opening {%s}", filename);
- FILE *Image = fopen(filename, "rb"); // open the bmp file
+ INFO("Opening {%s}", Name_BMP);
+ FILE *Image = fopen(Name_BMP, "rb");
if (!Image) {
return(file_not_found);
}
@@ -335,22 +346,20 @@
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) { // BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte
+ if (BMP_Header.bfType != BF_TYPE) {
fclose(Image);
- return(not_bmp_format); // error no BMP file
+ return(not_bmp_format);
}
fread(&BMP_Info, 1, sizeof(BMP_Info), Image);
//HexDump("BMP_Info", (uint8_t *)&BMP_Info, sizeof(BMP_Info));
BPP_t = BMP_Info.biBitCount;
INFO("biBitCount %04X", BPP_t);
- if (BPP_t != 4 && BPP_t != 8 && BPP_t != 16) { // Support 4, 8, 16-bits per pixel
+ if (BPP_t != 4 && BPP_t != 8 && BPP_t != 16 && BPP_t != 24) { // Support 4, 8, 16, 24-bits per pixel
fclose(Image);
return(not_supported_format);
}
- //PixelHeight = BMP_Header[OffsetPixelHeight] + (BMP_Header[OffsetPixelHeight + 1] << 8) + (BMP_Header[OffsetPixelHeight + 2] << 16) + (BMP_Header[OffsetPixelHeight + 3] << 24);
- //PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24);
PixelHeight = BMP_Info.biHeight;
PixelWidth = BMP_Info.biWidth;
if (PixelHeight > height() + y || PixelWidth > width() + x) {
@@ -358,77 +367,90 @@
return(image_too_big);
}
INFO("(%d,%d) (%d,%d)", x,y, PixelWidth,PixelHeight);
-
if (BMP_Info.biBitCount <= 8) {
int paletteSize;
// Read the color palette
colorCount = 1 << BMP_Info.biBitCount;
paletteSize = sizeof(RGBQUAD) * colorCount;
- //INFO("colors: %d, paletteSize: %d", colorCount, paletteSize);
colorPalette = (RGBQUAD *)malloc(paletteSize);
if (colorPalette == NULL) {
fclose(Image);
return(not_enough_ram);
}
fread(colorPalette, 1, paletteSize, Image);
- HexDump("Color Palette", (uint8_t *)colorPalette, paletteSize);
- } else {
- ERR("Bits per pixel > 8 [%d]", BMP_Info.biBitCount);
+ //HexDump("Color Palette", (uint8_t *)colorPalette, paletteSize);
}
- //start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24);
- start_data = BMP_Header.bfOffBits;
-
- //HexDump("Raw Data", (uint8_t *)&start_data, 32);
- int lineBufSize = ((BPP_t * PixelWidth + 31)/32)*4;
- //INFO("lineBufSize = %d", lineBufSize);
- lineBuffer = (char *)malloc(lineBufSize);
+ int lineBufSize = ((BPP_t * PixelWidth + 7)/8);
+ //INFO("BPP_t %d, PixelWidth %d, lineBufSize %d", BPP_t, PixelWidth, lineBufSize);
+ lineBuffer = (uint8_t *)malloc(lineBufSize);
if (lineBuffer == NULL) {
free(colorPalette);
fclose(Image);
return(not_enough_ram);
}
- // the bmp lines are padded to multiple of 4 bytes
+ // the Raw Data records are padded to a multiple of 4 bytes
+ int recordSize = 2;
+ if (BPP_t == 4) {
+ recordSize = 1;
+ } else if (BPP_t == 8) {
+ recordSize = 1;
+ } else if (BPP_t == 16) {
+ recordSize = 2;
+ } else if (BPP_t == 24) {
+ recordSize = 3;
+ }
padd = -1;
do {
padd++;
- } while ((PixelWidth * sizeof(color_t) + padd) % 4 != 0);
+ } while ((PixelWidth * recordSize + padd) % 4 != 0);
- // Define window for top to bottom and left to right
+ // Define window for top to bottom and left to right so writing auto-wraps
window(x,y, PixelWidth,PixelHeight);
- //INFO("(%d,%d) (%d,%d)", x,y, PixelWidth,PixelHeight);
- for (j = PixelHeight - 1; j >= 0; j--) { //Lines bottom up
- //INFO("line %d", j);
- offset = start_data + j * (lineBufSize + padd); // start of line
+ SetGraphicsCursor(x, y);
+ _StartGraphicsStream();
+
+ start_data = BMP_Header.bfOffBits;
+ HexDump("Raw Data", (uint8_t *)&start_data, 32);
+ //bool tag = true;
+ //INFO("(%d,%d) (%d,%d), [%d,%d]", x,y, PixelWidth,PixelHeight, lineBufSize, padd);
+ for (j = PixelHeight - 1; j >= 0; j--) { //Lines bottom up
+ offset = start_data + j * (lineBufSize + padd); // start of line
fseek(Image, offset, SEEK_SET);
- fread(lineBuffer, 1, lineBufSize, Image); // read a line - slow !
- //HexDump("Line", (uint8_t *)lineBuffer, lineBufSize);
- for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT
+ fread(lineBuffer, 1, lineBufSize, Image); // read a line - slow !
+ //INFO("offset: %6X", offset);
+ //if (tag)
+ // HexDump("Line", (uint8_t *)lineBuffer, lineBufSize);
+ for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT
if (BPP_t == 4) {
uint8_t dPix = lineBuffer[i/2];
if ((i & 1) == 0)
dPix >>= 4;
dPix &= 0x0F;
- color_t color;
- color = RGBQuadToRGB16(colorPalette, dPix);
- putp(color);
+ putp(RGBQuadToRGB16(colorPalette, dPix));
} else if (BPP_t == 8) {
- color_t color;
- color = RGBQuadToRGB16(colorPalette, lineBuffer[i]);
+ putp(RGBQuadToRGB16(colorPalette, lineBuffer[i]));
+ } else if (BPP_t == 16) {
+ putp(lineBuffer[i]);
+ } else if (BPP_t == 24) {
+ color_t color; // BGR
+ color = RGB(lineBuffer[i*3+2], lineBuffer[i*3+1], lineBuffer[i*3+0]);
+ //if (tag)
+ // INFO("color[%2d]: RGB(%02X,%02X,%02X) => %04X",
+ // i, lineBuffer[i*2], lineBuffer[i*3+1], lineBuffer[i*3+0], color);
+ color = (color >> 8) | (color << 8);
putp(color);
- } else if (BPP_t == 16) {
- putp(lineBuffer[i] & 0xFF);
- putp(lineBuffer[i] >> 8);
}
}
+ //tag = false;
}
free(lineBuffer);
free(colorPalette);
fclose(Image);
- //INFO("Freed and closed");
+ _EndGraphicsStream();
WindowMax();
- return(noerror);
+ return (noerror);
}
int GraphicsDisplay::columns()
@@ -441,3 +463,4 @@
return height() / 8;
}
+
