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 18:15:52 2014 +0000
Revision:
1:46c8df4608c8
Parent:
0:4977187e90c7
Child:
5:f4de114c31c3
Updated documentation

Who changed what in which revision?

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