Example for the LPC4088 QSB Base Board

Dependencies:   EALib mbed

Committer:
embeddedartists
Date:
Wed Apr 09 09:44:58 2014 +0000
Revision:
3:15f457b3bdbd
Parent:
0:a771927a62fd
Updated to latest version of EALib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
embeddedartists 0:a771927a62fd 1
embeddedartists 0:a771927a62fd 2 #include "mbed.h"
embeddedartists 0:a771927a62fd 3 #include "Image.h"
embeddedartists 0:a771927a62fd 4
embeddedartists 0:a771927a62fd 5 #include "bmp.h"
embeddedartists 0:a771927a62fd 6 #include "lodepng.h"
embeddedartists 0:a771927a62fd 7
embeddedartists 0:a771927a62fd 8 int Image::decode(const unsigned char* pDataIn, unsigned int sizeIn, ImageData_t* pDataOut)
embeddedartists 0:a771927a62fd 9 {
embeddedartists 0:a771927a62fd 10 Image::Type type = imageType(pDataIn, sizeIn);
embeddedartists 0:a771927a62fd 11 int result = -1;
embeddedartists 0:a771927a62fd 12 switch (type)
embeddedartists 0:a771927a62fd 13 {
embeddedartists 0:a771927a62fd 14 case BMP:
embeddedartists 0:a771927a62fd 15 {
embeddedartists 0:a771927a62fd 16 struct BMPHeader* hdr = (struct BMPHeader *) pDataIn;
embeddedartists 0:a771927a62fd 17 pDataOut->pixels = (uint16_t*)malloc(hdr->width * hdr->height * 2);
embeddedartists 0:a771927a62fd 18 if (pDataOut->pixels != NULL)
embeddedartists 0:a771927a62fd 19 {
embeddedartists 0:a771927a62fd 20 unsigned char error = BMP_Decode((void*)pDataIn, (unsigned char*)pDataOut->pixels, hdr->width, hdr->height, 24);
embeddedartists 0:a771927a62fd 21 if (error == 0)
embeddedartists 0:a771927a62fd 22 {
embeddedartists 0:a771927a62fd 23 pDataOut->width = hdr->width;
embeddedartists 0:a771927a62fd 24 pDataOut->height = hdr->height;
embeddedartists 0:a771927a62fd 25 return 0;
embeddedartists 0:a771927a62fd 26 }
embeddedartists 0:a771927a62fd 27 free(pDataOut->pixels);
embeddedartists 0:a771927a62fd 28 }
embeddedartists 0:a771927a62fd 29 }
embeddedartists 0:a771927a62fd 30 break;
embeddedartists 0:a771927a62fd 31
embeddedartists 0:a771927a62fd 32 case PNG:
embeddedartists 0:a771927a62fd 33 {
embeddedartists 0:a771927a62fd 34 unsigned char* pTmp;
embeddedartists 0:a771927a62fd 35 unsigned error = lodepng_decode24(&pTmp, &pDataOut->width, &pDataOut->height, pDataIn, sizeIn);
embeddedartists 0:a771927a62fd 36 if (error == 0)
embeddedartists 0:a771927a62fd 37 {
embeddedartists 0:a771927a62fd 38 int x, y;
embeddedartists 0:a771927a62fd 39 uint16_t* pConverted;
embeddedartists 0:a771927a62fd 40 uint8_t r;
embeddedartists 0:a771927a62fd 41 uint8_t g;
embeddedartists 0:a771927a62fd 42 uint8_t b;
embeddedartists 0:a771927a62fd 43 int off = 0;
embeddedartists 0:a771927a62fd 44
embeddedartists 0:a771927a62fd 45 pDataOut->pixels = (uint16_t*)malloc(pDataOut->width * pDataOut->height * 2);
embeddedartists 0:a771927a62fd 46 if (pDataOut->pixels != NULL)
embeddedartists 0:a771927a62fd 47 {
embeddedartists 0:a771927a62fd 48 pConverted = pDataOut->pixels;
embeddedartists 0:a771927a62fd 49
embeddedartists 0:a771927a62fd 50 for (y = 0; y < pDataOut->height; y++) {
embeddedartists 0:a771927a62fd 51 for (x = 0; x < pDataOut->width; x++) {
embeddedartists 0:a771927a62fd 52 r = pTmp[off ];
embeddedartists 0:a771927a62fd 53 g = pTmp[off + 1];
embeddedartists 0:a771927a62fd 54 b = pTmp[off + 2];
embeddedartists 0:a771927a62fd 55 *pConverted = (((unsigned short)r & 0xF8) << 8) |
embeddedartists 0:a771927a62fd 56 (((unsigned short)g & 0xFC) << 3) |
embeddedartists 0:a771927a62fd 57 (((unsigned short)b & 0xF8) >> 3);
embeddedartists 0:a771927a62fd 58 pConverted++;
embeddedartists 0:a771927a62fd 59 off += 3;
embeddedartists 0:a771927a62fd 60 }
embeddedartists 0:a771927a62fd 61 }
embeddedartists 0:a771927a62fd 62 }
embeddedartists 0:a771927a62fd 63 free(pTmp);
embeddedartists 0:a771927a62fd 64 return 0;
embeddedartists 0:a771927a62fd 65 }
embeddedartists 0:a771927a62fd 66 }
embeddedartists 0:a771927a62fd 67 break;
embeddedartists 0:a771927a62fd 68
embeddedartists 0:a771927a62fd 69 default:
embeddedartists 0:a771927a62fd 70 break;
embeddedartists 0:a771927a62fd 71 }
embeddedartists 0:a771927a62fd 72
embeddedartists 0:a771927a62fd 73 pDataOut->pixels = NULL;
embeddedartists 0:a771927a62fd 74 pDataOut->width = 0;
embeddedartists 0:a771927a62fd 75 pDataOut->height = 0;
embeddedartists 0:a771927a62fd 76 return result;
embeddedartists 0:a771927a62fd 77 }
embeddedartists 0:a771927a62fd 78
embeddedartists 0:a771927a62fd 79 Image::Type Image::imageType(const unsigned char* pDataIn, unsigned int sizeIn)
embeddedartists 0:a771927a62fd 80 {
embeddedartists 0:a771927a62fd 81 if (sizeIn > 4)
embeddedartists 0:a771927a62fd 82 {
embeddedartists 0:a771927a62fd 83 if (pDataIn[0] == 0x89 && pDataIn[1] == 'P' && pDataIn[2] == 'N' && pDataIn[3] == 'G')
embeddedartists 0:a771927a62fd 84 {
embeddedartists 0:a771927a62fd 85 return PNG;
embeddedartists 0:a771927a62fd 86 }
embeddedartists 0:a771927a62fd 87 }
embeddedartists 0:a771927a62fd 88 if (BMP_IsValid((void*)pDataIn))
embeddedartists 0:a771927a62fd 89 {
embeddedartists 0:a771927a62fd 90 return BMP;
embeddedartists 0:a771927a62fd 91 }
embeddedartists 0:a771927a62fd 92 return UNKNOWN;
embeddedartists 0:a771927a62fd 93 }
embeddedartists 0:a771927a62fd 94
embeddedartists 0:a771927a62fd 95