A basic graphics package for the LPC4088 Display Module.

Dependents:   lpc4088_displaymodule_demo_sphere sampleGUI sampleEmptyGUI lpc4088_displaymodule_fs_aid ... more

Fork of DMBasicGUI by EmbeddedArtists AB

Committer:
embeddedartists
Date:
Thu Dec 11 11:03:57 2014 +0000
Revision:
0:4977187e90c7
Child:
1:46c8df4608c8
First version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
embeddedartists 0:4977187e90c7 1
embeddedartists 0:4977187e90c7 2 #include "mbed.h"
embeddedartists 0:4977187e90c7 3 #include "Image.h"
embeddedartists 0:4977187e90c7 4
embeddedartists 0:4977187e90c7 5 #include "bmp.h"
embeddedartists 0:4977187e90c7 6 #include "lodepng.h"
embeddedartists 0:4977187e90c7 7
embeddedartists 0:4977187e90c7 8 int Image::decode(const unsigned char* pDataIn, unsigned int sizeIn, Resolution resolution, ImageData_t* pDataOut)
embeddedartists 0:4977187e90c7 9 {
embeddedartists 0:4977187e90c7 10 Image::Type type = imageType(pDataIn, sizeIn);
embeddedartists 0:4977187e90c7 11 int result = -1;
embeddedartists 0:4977187e90c7 12 switch (type)
embeddedartists 0:4977187e90c7 13 {
embeddedartists 0:4977187e90c7 14 case BMP:
embeddedartists 0:4977187e90c7 15 {
embeddedartists 0:4977187e90c7 16 struct BMPHeader* hdr = (struct BMPHeader *) pDataIn;
embeddedartists 0:4977187e90c7 17 if (resolution == RES_16BIT) {
embeddedartists 0:4977187e90c7 18 pDataOut->pixels = (uint16_t*)malloc(hdr->width * hdr->height * 2);
embeddedartists 0:4977187e90c7 19 } else if (resolution == RES_24BIT) {
embeddedartists 0:4977187e90c7 20 pDataOut->pixels = (uint16_t*)malloc(hdr->width * hdr->height * 4);
embeddedartists 0:4977187e90c7 21 } else {
embeddedartists 0:4977187e90c7 22 return -1;
embeddedartists 0:4977187e90c7 23 }
embeddedartists 0:4977187e90c7 24 if (pDataOut->pixels != NULL)
embeddedartists 0:4977187e90c7 25 {
embeddedartists 0:4977187e90c7 26 unsigned char error = BMP_Decode((void*)pDataIn, (unsigned char*)pDataOut->pixels,
embeddedartists 0:4977187e90c7 27 hdr->width, hdr->height, 24, ((resolution == RES_16BIT) ? 16 : 24));
embeddedartists 0:4977187e90c7 28 if (error == 0)
embeddedartists 0:4977187e90c7 29 {
embeddedartists 0:4977187e90c7 30 pDataOut->width = hdr->width;
embeddedartists 0:4977187e90c7 31 pDataOut->height = hdr->height;
embeddedartists 0:4977187e90c7 32 pDataOut->res = resolution;
embeddedartists 0:4977187e90c7 33 return 0;
embeddedartists 0:4977187e90c7 34 }
embeddedartists 0:4977187e90c7 35 free(pDataOut->pixels);
embeddedartists 0:4977187e90c7 36 }
embeddedartists 0:4977187e90c7 37 }
embeddedartists 0:4977187e90c7 38 break;
embeddedartists 0:4977187e90c7 39
embeddedartists 0:4977187e90c7 40 case PNG:
embeddedartists 0:4977187e90c7 41 {
embeddedartists 0:4977187e90c7 42 unsigned char* pTmp;
embeddedartists 0:4977187e90c7 43 unsigned error = lodepng_decode24(&pTmp, &pDataOut->width, &pDataOut->height, pDataIn, sizeIn);
embeddedartists 0:4977187e90c7 44 pDataOut->res = resolution;
embeddedartists 0:4977187e90c7 45 if (error == 0)
embeddedartists 0:4977187e90c7 46 {
embeddedartists 0:4977187e90c7 47 int x, y;
embeddedartists 0:4977187e90c7 48 uint8_t r;
embeddedartists 0:4977187e90c7 49 uint8_t g;
embeddedartists 0:4977187e90c7 50 uint8_t b;
embeddedartists 0:4977187e90c7 51 int off = 0;
embeddedartists 0:4977187e90c7 52
embeddedartists 0:4977187e90c7 53 result = 0;
embeddedartists 0:4977187e90c7 54 if (resolution == RES_16BIT) {
embeddedartists 0:4977187e90c7 55 pDataOut->pixels = (uint16_t*)malloc(pDataOut->width * pDataOut->height * 2);
embeddedartists 0:4977187e90c7 56 if (pDataOut->pixels != NULL)
embeddedartists 0:4977187e90c7 57 {
embeddedartists 0:4977187e90c7 58 uint16_t* pConverted = pDataOut->pixels;
embeddedartists 0:4977187e90c7 59
embeddedartists 0:4977187e90c7 60 for (y = 0; y < pDataOut->height; y++) {
embeddedartists 0:4977187e90c7 61 for (x = 0; x < pDataOut->width; x++) {
embeddedartists 0:4977187e90c7 62 r = pTmp[off ];
embeddedartists 0:4977187e90c7 63 g = pTmp[off + 1];
embeddedartists 0:4977187e90c7 64 b = pTmp[off + 2];
embeddedartists 0:4977187e90c7 65 *pConverted = (((unsigned short)r & 0xF8) << 8) |
embeddedartists 0:4977187e90c7 66 (((unsigned short)g & 0xFC) << 3) |
embeddedartists 0:4977187e90c7 67 (((unsigned short)b & 0xF8) >> 3);
embeddedartists 0:4977187e90c7 68 pConverted++;
embeddedartists 0:4977187e90c7 69 off += 3;
embeddedartists 0:4977187e90c7 70 }
embeddedartists 0:4977187e90c7 71 }
embeddedartists 0:4977187e90c7 72 }
embeddedartists 0:4977187e90c7 73 } else if (resolution == RES_24BIT) {
embeddedartists 0:4977187e90c7 74 uint32_t* pConverted = (uint32_t*)malloc(pDataOut->width * pDataOut->height * 4);
embeddedartists 0:4977187e90c7 75 pDataOut->pixels = (uint16_t*)pConverted;
embeddedartists 0:4977187e90c7 76 if (pDataOut->pixels != NULL)
embeddedartists 0:4977187e90c7 77 {
embeddedartists 0:4977187e90c7 78 uint8_t* p = pTmp;
embeddedartists 0:4977187e90c7 79 int num = pDataOut->width * pDataOut->height;
embeddedartists 0:4977187e90c7 80 for (int i = 0; i < num; i++) {
embeddedartists 0:4977187e90c7 81 uint32_t a = 0;
embeddedartists 0:4977187e90c7 82 a |= (*p++) << 16; // red
embeddedartists 0:4977187e90c7 83 a |= (*p++) << 8; // green
embeddedartists 0:4977187e90c7 84 a |= (*p++) << 0; // blue
embeddedartists 0:4977187e90c7 85 *pConverted++ = a;
embeddedartists 0:4977187e90c7 86 // *pConverted++ = 0; // alpha
embeddedartists 0:4977187e90c7 87 // *pConverted++ = *p++; // red
embeddedartists 0:4977187e90c7 88 // *pConverted++ = *p++; // green
embeddedartists 0:4977187e90c7 89 // *pConverted++ = *p++; // blue
embeddedartists 0:4977187e90c7 90 }
embeddedartists 0:4977187e90c7 91 }
embeddedartists 0:4977187e90c7 92 } else {
embeddedartists 0:4977187e90c7 93 // unknown format
embeddedartists 0:4977187e90c7 94 result = -2;
embeddedartists 0:4977187e90c7 95 }
embeddedartists 0:4977187e90c7 96 free(pTmp);
embeddedartists 0:4977187e90c7 97 return result;
embeddedartists 0:4977187e90c7 98 }
embeddedartists 0:4977187e90c7 99 }
embeddedartists 0:4977187e90c7 100 break;
embeddedartists 0:4977187e90c7 101
embeddedartists 0:4977187e90c7 102 default:
embeddedartists 0:4977187e90c7 103 break;
embeddedartists 0:4977187e90c7 104 }
embeddedartists 0:4977187e90c7 105
embeddedartists 0:4977187e90c7 106 pDataOut->pixels = NULL;
embeddedartists 0:4977187e90c7 107 pDataOut->width = 0;
embeddedartists 0:4977187e90c7 108 pDataOut->height = 0;
embeddedartists 0:4977187e90c7 109 return result;
embeddedartists 0:4977187e90c7 110 }
embeddedartists 0:4977187e90c7 111
embeddedartists 0:4977187e90c7 112 int Image::decode(const char* filename, Resolution res, ImageData_t* pDataOut)
embeddedartists 0:4977187e90c7 113 {
embeddedartists 0:4977187e90c7 114 FILE* fh = NULL;
embeddedartists 0:4977187e90c7 115 uint8_t* buff = NULL;
embeddedartists 0:4977187e90c7 116 int result = 1;
embeddedartists 0:4977187e90c7 117
embeddedartists 0:4977187e90c7 118 do
embeddedartists 0:4977187e90c7 119 {
embeddedartists 0:4977187e90c7 120 fh = fopen(filename, "r");
embeddedartists 0:4977187e90c7 121 if (fh == NULL) {
embeddedartists 0:4977187e90c7 122 break;
embeddedartists 0:4977187e90c7 123 }
embeddedartists 0:4977187e90c7 124
embeddedartists 0:4977187e90c7 125 uint32_t size = fileSize(fh);
embeddedartists 0:4977187e90c7 126 buff = (uint8_t*)malloc(size);
embeddedartists 0:4977187e90c7 127 if (buff == NULL) {
embeddedartists 0:4977187e90c7 128 return 1;
embeddedartists 0:4977187e90c7 129 }
embeddedartists 0:4977187e90c7 130
embeddedartists 0:4977187e90c7 131 uint32_t num;
embeddedartists 0:4977187e90c7 132 uint32_t left = size;
embeddedartists 0:4977187e90c7 133 uint32_t off = 0;
embeddedartists 0:4977187e90c7 134 do
embeddedartists 0:4977187e90c7 135 {
embeddedartists 0:4977187e90c7 136 num = fread(buff+off, 1, left, fh);
embeddedartists 0:4977187e90c7 137 if (num > 0) {
embeddedartists 0:4977187e90c7 138 left -= num;
embeddedartists 0:4977187e90c7 139 off += num;
embeddedartists 0:4977187e90c7 140 }
embeddedartists 0:4977187e90c7 141 } while (left > 0 && num > 0);
embeddedartists 0:4977187e90c7 142 if (left > 0) {
embeddedartists 0:4977187e90c7 143 break;
embeddedartists 0:4977187e90c7 144 }
embeddedartists 0:4977187e90c7 145
embeddedartists 0:4977187e90c7 146 if (Image::decode(buff, size, res, pDataOut) == 1) {
embeddedartists 0:4977187e90c7 147 break;
embeddedartists 0:4977187e90c7 148 }
embeddedartists 0:4977187e90c7 149
embeddedartists 0:4977187e90c7 150 // success
embeddedartists 0:4977187e90c7 151 result = 0;
embeddedartists 0:4977187e90c7 152
embeddedartists 0:4977187e90c7 153 } while (false);
embeddedartists 0:4977187e90c7 154
embeddedartists 0:4977187e90c7 155 if (fh != NULL) {
embeddedartists 0:4977187e90c7 156 fclose(fh);
embeddedartists 0:4977187e90c7 157 }
embeddedartists 0:4977187e90c7 158 if (buff != NULL) {
embeddedartists 0:4977187e90c7 159 free(buff);
embeddedartists 0:4977187e90c7 160 }
embeddedartists 0:4977187e90c7 161 return result;
embeddedartists 0:4977187e90c7 162 }
embeddedartists 0:4977187e90c7 163
embeddedartists 0:4977187e90c7 164 Image::Type Image::imageType(const unsigned char* pDataIn, unsigned int sizeIn)
embeddedartists 0:4977187e90c7 165 {
embeddedartists 0:4977187e90c7 166 if (sizeIn > 4)
embeddedartists 0:4977187e90c7 167 {
embeddedartists 0:4977187e90c7 168 if (pDataIn[0] == 0x89 && pDataIn[1] == 'P' && pDataIn[2] == 'N' && pDataIn[3] == 'G')
embeddedartists 0:4977187e90c7 169 {
embeddedartists 0:4977187e90c7 170 return PNG;
embeddedartists 0:4977187e90c7 171 }
embeddedartists 0:4977187e90c7 172 }
embeddedartists 0:4977187e90c7 173 if (BMP_IsValid((void*)pDataIn))
embeddedartists 0:4977187e90c7 174 {
embeddedartists 0:4977187e90c7 175 return BMP;
embeddedartists 0:4977187e90c7 176 }
embeddedartists 0:4977187e90c7 177 return UNKNOWN;
embeddedartists 0:4977187e90c7 178 }
embeddedartists 0:4977187e90c7 179
embeddedartists 0:4977187e90c7 180 uint32_t Image::fileSize(FILE* f)
embeddedartists 0:4977187e90c7 181 {
embeddedartists 0:4977187e90c7 182 uint32_t pos = ftell(f);
embeddedartists 0:4977187e90c7 183 fseek(f, 0, SEEK_END);
embeddedartists 0:4977187e90c7 184 uint32_t size = ftell(f);
embeddedartists 0:4977187e90c7 185 fseek(f, pos, SEEK_SET);
embeddedartists 0:4977187e90c7 186 return size;
embeddedartists 0:4977187e90c7 187 }
embeddedartists 0:4977187e90c7 188