Example for the LPC4088 QSB Base Board

Dependencies:   EALib mbed

Committer:
embeddedartists
Date:
Wed Apr 09 10:26:13 2014 +0000
Revision:
3:33a36d79ab7d
Parent:
0:83b8ee8e8d4b
Updated to latest version of EALib

Who changed what in which revision?

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