Library to control a Graphics TFT connected to 4-wire SPI - revised for the Raio RA8875 Display Controller.

Dependents:   FRDM_RA8875_mPaint RA8875_Demo RA8875_KeyPadDemo SignalGenerator ... more

Fork of SPI_TFT by Peter Drescher

See Components - RA8875 Based Display

Enhanced touch-screen support - where it previous supported both the Resistive Touch and Capacitive Touch based on the FT5206 Touch Controller, now it also has support for the GSL1680 Touch Controller.

Offline Help Manual (Windows chm)

/media/uploads/WiredHome/ra8875.zip.bin (download, rename to .zip and unzip)

Committer:
WiredHome
Date:
Mon Nov 30 11:58:32 2015 +0000
Revision:
97:03c509c3db18
Parent:
95:ef538bd687c0
Fixed comment - typo

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dreschpe 0:de9d1462a835 1 /* mbed GraphicsDisplay Display Library Base Class
dreschpe 0:de9d1462a835 2 * Copyright (c) 2007-2009 sford
dreschpe 0:de9d1462a835 3 * Released under the MIT License: http://mbed.org/license/mit
WiredHome 32:0e4f2ae512e2 4 *
WiredHome 34:c99ec28fac66 5 * Derivative work by D.Smart 2014
dreschpe 0:de9d1462a835 6 */
WiredHome 19:3f82c1161fd2 7
dreschpe 0:de9d1462a835 8 #include "GraphicsDisplay.h"
WiredHome 31:c72e12cd5c67 9 #include "Bitmap.h"
WiredHome 42:7cbdfd2bbfc5 10 #include "string.h"
dreschpe 0:de9d1462a835 11
WiredHome 97:03c509c3db18 12 #include "Utility.h" // private memory manager
WiredHome 97:03c509c3db18 13 #ifndef UTILITY_H
WiredHome 97:03c509c3db18 14 #define swMalloc malloc // use the standard
WiredHome 97:03c509c3db18 15 #define swFree free
WiredHome 97:03c509c3db18 16 #endif
WiredHome 97:03c509c3db18 17
WiredHome 42:7cbdfd2bbfc5 18 //#define DEBUG "GD"
WiredHome 29:422616aa04bd 19 // ...
WiredHome 29:422616aa04bd 20 // INFO("Stuff to show %d", var); // new-line is automatically appended
WiredHome 29:422616aa04bd 21 //
WiredHome 29:422616aa04bd 22 #if (defined(DEBUG) && !defined(TARGET_LPC11U24))
WiredHome 29:422616aa04bd 23 #define INFO(x, ...) std::printf("[INF %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 29:422616aa04bd 24 #define WARN(x, ...) std::printf("[WRN %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 29:422616aa04bd 25 #define ERR(x, ...) std::printf("[ERR %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 40:04aa280dfa39 26 static void HexDump(char * title, uint8_t * p, int count)
WiredHome 31:c72e12cd5c67 27 {
WiredHome 31:c72e12cd5c67 28 int i;
WiredHome 31:c72e12cd5c67 29 char buf[100] = "0000: ";
WiredHome 31:c72e12cd5c67 30
WiredHome 31:c72e12cd5c67 31 if (*title)
WiredHome 31:c72e12cd5c67 32 INFO("%s", title);
WiredHome 31:c72e12cd5c67 33 for (i=0; i<count; ) {
WiredHome 31:c72e12cd5c67 34 sprintf(buf + strlen(buf), "%02X ", *(p+i));
WiredHome 31:c72e12cd5c67 35 if ((++i & 0x0F) == 0x00) {
WiredHome 31:c72e12cd5c67 36 INFO("%s", buf);
WiredHome 31:c72e12cd5c67 37 if (i < count)
WiredHome 31:c72e12cd5c67 38 sprintf(buf, "%04X: ", i);
WiredHome 31:c72e12cd5c67 39 else
WiredHome 31:c72e12cd5c67 40 buf[0] = '\0';
WiredHome 31:c72e12cd5c67 41 }
WiredHome 31:c72e12cd5c67 42 }
WiredHome 31:c72e12cd5c67 43 if (strlen(buf))
WiredHome 31:c72e12cd5c67 44 INFO("%s", buf);
WiredHome 31:c72e12cd5c67 45 }
WiredHome 29:422616aa04bd 46 #else
WiredHome 29:422616aa04bd 47 #define INFO(x, ...)
WiredHome 29:422616aa04bd 48 #define WARN(x, ...)
WiredHome 29:422616aa04bd 49 #define ERR(x, ...)
WiredHome 32:0e4f2ae512e2 50 #define HexDump(a, b, c)
WiredHome 29:422616aa04bd 51 #endif
WiredHome 29:422616aa04bd 52
WiredHome 29:422616aa04bd 53 #ifdef LOCALFONT
dreschpe 0:de9d1462a835 54 const unsigned char FONT8x8[97][8] = {
WiredHome 29:422616aa04bd 55 0x08, 0x08, 0x08, 0X00, 0X00, 0X00, 0X00, 0X00, // columns, rows, num_bytes_per_char
WiredHome 29:422616aa04bd 56 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, // space 0x20
WiredHome 29:422616aa04bd 57 0x30, 0x78, 0x78, 0x30, 0x30, 0X00, 0x30, 0X00, // !
WiredHome 29:422616aa04bd 58 0x6C, 0x6C, 0x6C, 0X00, 0X00, 0X00, 0X00, 0X00, // "
WiredHome 29:422616aa04bd 59 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0X00, // #
WiredHome 29:422616aa04bd 60 0x18, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x18, 0X00, // $
WiredHome 29:422616aa04bd 61 0X00, 0x63, 0x66, 0x0C, 0x18, 0x33, 0x63, 0X00, // %
WiredHome 29:422616aa04bd 62 0x1C, 0x36, 0x1C, 0x3B, 0x6E, 0x66, 0x3B, 0X00, // &
WiredHome 29:422616aa04bd 63 0x30, 0x30, 0x60, 0X00, 0X00, 0X00, 0X00, 0X00, // '
WiredHome 29:422616aa04bd 64 0x0C, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0C, 0X00, // (
WiredHome 29:422616aa04bd 65 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0X00, // )
WiredHome 29:422616aa04bd 66 0X00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0X00, 0X00, // *
WiredHome 29:422616aa04bd 67 0X00, 0x30, 0x30, 0xFC, 0x30, 0x30, 0X00, 0X00, // +
WiredHome 29:422616aa04bd 68 0X00, 0X00, 0X00, 0X00, 0X00, 0x18, 0x18, 0x30, // ,
WiredHome 29:422616aa04bd 69 0X00, 0X00, 0X00, 0x7E, 0X00, 0X00, 0X00, 0X00, // -
WiredHome 29:422616aa04bd 70 0X00, 0X00, 0X00, 0X00, 0X00, 0x18, 0x18, 0X00, // .
WiredHome 29:422616aa04bd 71 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0X00, // / (forward slash)
WiredHome 29:422616aa04bd 72 0x3E, 0x63, 0x63, 0x6B, 0x63, 0x63, 0x3E, 0X00, // 0 0x30
WiredHome 29:422616aa04bd 73 0x18, 0x38, 0x58, 0x18, 0x18, 0x18, 0x7E, 0X00, // 1
WiredHome 29:422616aa04bd 74 0x3C, 0x66, 0x06, 0x1C, 0x30, 0x66, 0x7E, 0X00, // 2
WiredHome 29:422616aa04bd 75 0x3C, 0x66, 0x06, 0x1C, 0x06, 0x66, 0x3C, 0X00, // 3
WiredHome 29:422616aa04bd 76 0x0E, 0x1E, 0x36, 0x66, 0x7F, 0x06, 0x0F, 0X00, // 4
WiredHome 29:422616aa04bd 77 0x7E, 0x60, 0x7C, 0x06, 0x06, 0x66, 0x3C, 0X00, // 5
WiredHome 29:422616aa04bd 78 0x1C, 0x30, 0x60, 0x7C, 0x66, 0x66, 0x3C, 0X00, // 6
WiredHome 29:422616aa04bd 79 0x7E, 0x66, 0x06, 0x0C, 0x18, 0x18, 0x18, 0X00, // 7
WiredHome 29:422616aa04bd 80 0x3C, 0x66, 0x66, 0x3C, 0x66, 0x66, 0x3C, 0X00, // 8
WiredHome 29:422616aa04bd 81 0x3C, 0x66, 0x66, 0x3E, 0x06, 0x0C, 0x38, 0X00, // 9
WiredHome 29:422616aa04bd 82 0X00, 0x18, 0x18, 0X00, 0X00, 0x18, 0x18, 0X00, // :
WiredHome 29:422616aa04bd 83 0X00, 0x18, 0x18, 0X00, 0X00, 0x18, 0x18, 0x30, // ;
WiredHome 29:422616aa04bd 84 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0X00, // <
WiredHome 29:422616aa04bd 85 0X00, 0X00, 0x7E, 0X00, 0X00, 0x7E, 0X00, 0X00, // =
WiredHome 29:422616aa04bd 86 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0X00, // >
WiredHome 29:422616aa04bd 87 0x3C, 0x66, 0x06, 0x0C, 0x18, 0X00, 0x18, 0X00, // ?
WiredHome 29:422616aa04bd 88 0x3E, 0x63, 0x6F, 0x69, 0x6F, 0x60, 0x3E, 0X00, // @ 0x40
WiredHome 29:422616aa04bd 89 0x18, 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0X00, // A
WiredHome 29:422616aa04bd 90 0x7E, 0x33, 0x33, 0x3E, 0x33, 0x33, 0x7E, 0X00, // B
WiredHome 29:422616aa04bd 91 0x1E, 0x33, 0x60, 0x60, 0x60, 0x33, 0x1E, 0X00, // C
WiredHome 29:422616aa04bd 92 0x7C, 0x36, 0x33, 0x33, 0x33, 0x36, 0x7C, 0X00, // D
WiredHome 29:422616aa04bd 93 0x7F, 0x31, 0x34, 0x3C, 0x34, 0x31, 0x7F, 0X00, // E
WiredHome 29:422616aa04bd 94 0x7F, 0x31, 0x34, 0x3C, 0x34, 0x30, 0x78, 0X00, // F
WiredHome 29:422616aa04bd 95 0x1E, 0x33, 0x60, 0x60, 0x67, 0x33, 0x1F, 0X00, // G
WiredHome 29:422616aa04bd 96 0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0X00, // H
WiredHome 29:422616aa04bd 97 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0X00, // I
WiredHome 29:422616aa04bd 98 0x0F, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, 0X00, // J
WiredHome 29:422616aa04bd 99 0x73, 0x33, 0x36, 0x3C, 0x36, 0x33, 0x73, 0X00, // K
WiredHome 29:422616aa04bd 100 0x78, 0x30, 0x30, 0x30, 0x31, 0x33, 0x7F, 0X00, // L
WiredHome 29:422616aa04bd 101 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0X00, // M
WiredHome 29:422616aa04bd 102 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x63, 0x63, 0X00, // N
WiredHome 29:422616aa04bd 103 0x3E, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3E, 0X00, // O
WiredHome 29:422616aa04bd 104 0x7E, 0x33, 0x33, 0x3E, 0x30, 0x30, 0x78, 0X00, // P 0x50
WiredHome 29:422616aa04bd 105 0x3C, 0x66, 0x66, 0x66, 0x6E, 0x3C, 0x0E, 0X00, // Q
WiredHome 29:422616aa04bd 106 0x7E, 0x33, 0x33, 0x3E, 0x36, 0x33, 0x73, 0X00, // R
WiredHome 29:422616aa04bd 107 0x3C, 0x66, 0x30, 0x18, 0x0C, 0x66, 0x3C, 0X00, // S
WiredHome 29:422616aa04bd 108 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x3C, 0X00, // T
WiredHome 29:422616aa04bd 109 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7E, 0X00, // U
WiredHome 29:422616aa04bd 110 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0X00, // V
WiredHome 29:422616aa04bd 111 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0X00, // W
WiredHome 29:422616aa04bd 112 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0X00, // X
WiredHome 29:422616aa04bd 113 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x3C, 0X00, // Y
WiredHome 29:422616aa04bd 114 0x7F, 0x63, 0x46, 0x0C, 0x19, 0x33, 0x7F, 0X00, // Z
WiredHome 29:422616aa04bd 115 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0X00, // [
WiredHome 29:422616aa04bd 116 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0X00, // \ (back slash)
WiredHome 29:422616aa04bd 117 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0X00, // ]
WiredHome 29:422616aa04bd 118 0x08, 0x1C, 0x36, 0x63, 0X00, 0X00, 0X00, 0X00, // ^
WiredHome 29:422616aa04bd 119 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0xFF, // _
WiredHome 29:422616aa04bd 120 0x18, 0x18, 0x0C, 0X00, 0X00, 0X00, 0X00, 0X00, // ` 0x60
WiredHome 29:422616aa04bd 121 0X00, 0X00, 0x3C, 0x06, 0x3E, 0x66, 0x3B, 0X00, // a
WiredHome 29:422616aa04bd 122 0x70, 0x30, 0x3E, 0x33, 0x33, 0x33, 0x6E, 0X00, // b
WiredHome 29:422616aa04bd 123 0X00, 0X00, 0x3C, 0x66, 0x60, 0x66, 0x3C, 0X00, // c
WiredHome 29:422616aa04bd 124 0x0E, 0x06, 0x3E, 0x66, 0x66, 0x66, 0x3B, 0X00, // d
WiredHome 29:422616aa04bd 125 0X00, 0X00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0X00, // e
WiredHome 29:422616aa04bd 126 0x1C, 0x36, 0x30, 0x78, 0x30, 0x30, 0x78, 0X00, // f
WiredHome 29:422616aa04bd 127 0X00, 0X00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x7C, // g
WiredHome 29:422616aa04bd 128 0x70, 0x30, 0x36, 0x3B, 0x33, 0x33, 0x73, 0X00, // h
WiredHome 29:422616aa04bd 129 0x18, 0X00, 0x38, 0x18, 0x18, 0x18, 0x3C, 0X00, // i
WiredHome 29:422616aa04bd 130 0x06, 0X00, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, // j
WiredHome 29:422616aa04bd 131 0x70, 0x30, 0x33, 0x36, 0x3C, 0x36, 0x73, 0X00, // k
WiredHome 29:422616aa04bd 132 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0X00, // l
WiredHome 29:422616aa04bd 133 0X00, 0X00, 0x66, 0x7F, 0x7F, 0x6B, 0x63, 0X00, // m
WiredHome 29:422616aa04bd 134 0X00, 0X00, 0x7C, 0x66, 0x66, 0x66, 0x66, 0X00, // n
WiredHome 29:422616aa04bd 135 0X00, 0X00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0X00, // o
WiredHome 29:422616aa04bd 136 0X00, 0X00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78, // p
WiredHome 29:422616aa04bd 137 0X00, 0X00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F, // q
WiredHome 29:422616aa04bd 138 0X00, 0X00, 0x6E, 0x3B, 0x33, 0x30, 0x78, 0X00, // r
WiredHome 29:422616aa04bd 139 0X00, 0X00, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0X00, // s
WiredHome 29:422616aa04bd 140 0x08, 0x18, 0x3E, 0x18, 0x18, 0x1A, 0x0C, 0X00, // t
WiredHome 29:422616aa04bd 141 0X00, 0X00, 0x66, 0x66, 0x66, 0x66, 0x3B, 0X00, // u
WiredHome 29:422616aa04bd 142 0X00, 0X00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0X00, // v
WiredHome 29:422616aa04bd 143 0X00, 0X00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0X00, // w
WiredHome 29:422616aa04bd 144 0X00, 0X00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0X00, // x
WiredHome 29:422616aa04bd 145 0X00, 0X00, 0x66, 0x66, 0x66, 0x3E, 0x06, 0x7C, // y
WiredHome 29:422616aa04bd 146 0X00, 0X00, 0x7E, 0x4C, 0x18, 0x32, 0x7E, 0X00, // z
WiredHome 29:422616aa04bd 147 0x0E, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0E, 0X00, // {
WiredHome 29:422616aa04bd 148 0x0C, 0x0C, 0x0C, 0X00, 0x0C, 0x0C, 0x0C, 0X00, // |
WiredHome 29:422616aa04bd 149 0x70, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x70, 0X00, // }
WiredHome 29:422616aa04bd 150 0x3B, 0x6E, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, // ~
WiredHome 29:422616aa04bd 151 0x1C, 0x36, 0x36, 0x1C, 0X00, 0X00, 0X00, 0X00 // DEL
WiredHome 23:a50ded45dbaf 152 };
WiredHome 29:422616aa04bd 153 #endif // LOCALFONT
WiredHome 19:3f82c1161fd2 154
WiredHome 42:7cbdfd2bbfc5 155 char mytolower(char a) {
WiredHome 42:7cbdfd2bbfc5 156 if (a >= 'A' && a <= 'Z')
WiredHome 42:7cbdfd2bbfc5 157 return (a - 'A' + 'a');
WiredHome 42:7cbdfd2bbfc5 158 else
WiredHome 42:7cbdfd2bbfc5 159 return a;
WiredHome 42:7cbdfd2bbfc5 160 }
WiredHome 42:7cbdfd2bbfc5 161 /// mystrnicmp exists because not all compiler libraries have this function.
WiredHome 42:7cbdfd2bbfc5 162 ///
WiredHome 42:7cbdfd2bbfc5 163 /// Some have strnicmp, others _strnicmp, and others have C++ methods, which
WiredHome 42:7cbdfd2bbfc5 164 /// is outside the scope of this C-portable set of functions.
WiredHome 42:7cbdfd2bbfc5 165 ///
WiredHome 42:7cbdfd2bbfc5 166 /// @param l is a pointer to the string on the left
WiredHome 42:7cbdfd2bbfc5 167 /// @param r is a pointer to the string on the right
WiredHome 42:7cbdfd2bbfc5 168 /// @param n is the number of characters to compare
WiredHome 42:7cbdfd2bbfc5 169 /// @returns -1 if l < r
WiredHome 42:7cbdfd2bbfc5 170 /// @returns 0 if l == r
WiredHome 42:7cbdfd2bbfc5 171 /// @returns +1 if l > r
WiredHome 42:7cbdfd2bbfc5 172 ///
WiredHome 42:7cbdfd2bbfc5 173 int mystrnicmp(const char *l, const char *r, size_t n) {
WiredHome 42:7cbdfd2bbfc5 174 int result = 0;
WiredHome 42:7cbdfd2bbfc5 175
WiredHome 42:7cbdfd2bbfc5 176 if (n != 0) {
WiredHome 42:7cbdfd2bbfc5 177 do {
WiredHome 42:7cbdfd2bbfc5 178 result = mytolower(*l++) - mytolower(*r++);
WiredHome 42:7cbdfd2bbfc5 179 } while ((result == 0) && (*l != '\0') && (--n > 0));
WiredHome 42:7cbdfd2bbfc5 180 }
WiredHome 42:7cbdfd2bbfc5 181 if (result < -1)
WiredHome 42:7cbdfd2bbfc5 182 result = -1;
WiredHome 42:7cbdfd2bbfc5 183 else if (result > 1)
WiredHome 42:7cbdfd2bbfc5 184 result = 1;
WiredHome 42:7cbdfd2bbfc5 185 return result;
WiredHome 42:7cbdfd2bbfc5 186 }
WiredHome 42:7cbdfd2bbfc5 187
WiredHome 42:7cbdfd2bbfc5 188
WiredHome 29:422616aa04bd 189 GraphicsDisplay::GraphicsDisplay(const char *name)
WiredHome 29:422616aa04bd 190 : TextDisplay(name)
WiredHome 19:3f82c1161fd2 191 {
WiredHome 29:422616aa04bd 192 font = NULL;
dreschpe 0:de9d1462a835 193 }
WiredHome 19:3f82c1161fd2 194
WiredHome 29:422616aa04bd 195 RetCode_t GraphicsDisplay::set_font(const unsigned char * _font)
WiredHome 19:3f82c1161fd2 196 {
WiredHome 37:f19b7e7449dc 197 font = _font; // trusting them, but it might be good to put some checks in here...
WiredHome 37:f19b7e7449dc 198 return noerror;
dreschpe 0:de9d1462a835 199 }
dreschpe 0:de9d1462a835 200
WiredHome 29:422616aa04bd 201 #ifdef LOCALFONT
WiredHome 29:422616aa04bd 202 int GraphicsDisplay::character(int x, int y, int value)
WiredHome 29:422616aa04bd 203 {
WiredHome 29:422616aa04bd 204 if (value <= 0x1F && value >= 7F)
WiredHome 29:422616aa04bd 205 return 0;
WiredHome 29:422616aa04bd 206
WiredHome 29:422616aa04bd 207 return blitbit(x, y, FONT8X8[0][0], FONT8X8[0][1],
WiredHome 29:422616aa04bd 208 (char *)&(FONT8x8[value - 0x1F][0]));
WiredHome 29:422616aa04bd 209 }
WiredHome 29:422616aa04bd 210 #else
WiredHome 29:422616aa04bd 211 int GraphicsDisplay::character(int x, int y, int c)
WiredHome 29:422616aa04bd 212 {
WiredHome 29:422616aa04bd 213 unsigned int offset;
WiredHome 29:422616aa04bd 214 const unsigned char * charRecord;
WiredHome 29:422616aa04bd 215
WiredHome 29:422616aa04bd 216 if (c <= 0x1F || c >= 0x7F)
WiredHome 29:422616aa04bd 217 return 0;
WiredHome 29:422616aa04bd 218 offset = font[0]; // bytes / char
WiredHome 29:422616aa04bd 219 charRecord = &font[((c - ' ') * offset) + 4]; // start of char bitmap
WiredHome 29:422616aa04bd 220 return fontblit(x, y, font, charRecord);
WiredHome 29:422616aa04bd 221 }
WiredHome 29:422616aa04bd 222 #endif
WiredHome 19:3f82c1161fd2 223
WiredHome 37:f19b7e7449dc 224 RetCode_t GraphicsDisplay::window(loc_t x, loc_t y, dim_t w, dim_t h)
WiredHome 19:3f82c1161fd2 225 {
dreschpe 0:de9d1462a835 226 // current pixel location
dreschpe 0:de9d1462a835 227 _x = x;
dreschpe 0:de9d1462a835 228 _y = y;
dreschpe 0:de9d1462a835 229 // window settings
dreschpe 0:de9d1462a835 230 _x1 = x;
dreschpe 0:de9d1462a835 231 _x2 = x + w - 1;
dreschpe 0:de9d1462a835 232 _y1 = y;
dreschpe 0:de9d1462a835 233 _y2 = y + h - 1;
WiredHome 32:0e4f2ae512e2 234 return noerror;
dreschpe 0:de9d1462a835 235 }
WiredHome 19:3f82c1161fd2 236
WiredHome 79:544eb4964795 237 RetCode_t GraphicsDisplay::WindowMax(void)
WiredHome 31:c72e12cd5c67 238 {
WiredHome 79:544eb4964795 239 return window(0,0, width(),height());
WiredHome 31:c72e12cd5c67 240 }
WiredHome 31:c72e12cd5c67 241
WiredHome 55:dfbabef7003e 242 RetCode_t GraphicsDisplay::_putp(color_t color)
WiredHome 19:3f82c1161fd2 243 {
WiredHome 33:b6b710758ab3 244 pixel(_x, _y, color);
dreschpe 0:de9d1462a835 245 // update pixel location based on window settings
dreschpe 0:de9d1462a835 246 _x++;
dreschpe 0:de9d1462a835 247 if(_x > _x2) {
dreschpe 0:de9d1462a835 248 _x = _x1;
dreschpe 0:de9d1462a835 249 _y++;
dreschpe 0:de9d1462a835 250 if(_y > _y2) {
dreschpe 0:de9d1462a835 251 _y = _y1;
dreschpe 0:de9d1462a835 252 }
dreschpe 0:de9d1462a835 253 }
WiredHome 32:0e4f2ae512e2 254 return noerror;
dreschpe 0:de9d1462a835 255 }
dreschpe 0:de9d1462a835 256
WiredHome 79:544eb4964795 257 RetCode_t GraphicsDisplay::fill(int x, int y, int w, int h, color_t color)
WiredHome 19:3f82c1161fd2 258 {
WiredHome 79:544eb4964795 259 return fillrect(x,y, x+w, y+h, color);
dreschpe 0:de9d1462a835 260 }
WiredHome 19:3f82c1161fd2 261
WiredHome 61:8f3153bf0baa 262 RetCode_t GraphicsDisplay::cls(uint16_t layers)
WiredHome 19:3f82c1161fd2 263 {
WiredHome 79:544eb4964795 264 return fill(0, 0, width(), height(), _background);
dreschpe 0:de9d1462a835 265 }
WiredHome 19:3f82c1161fd2 266
WiredHome 79:544eb4964795 267 RetCode_t GraphicsDisplay::blit(int x, int y, int w, int h, const int * color)
WiredHome 19:3f82c1161fd2 268 {
dreschpe 0:de9d1462a835 269 window(x, y, w, h);
WiredHome 37:f19b7e7449dc 270 _StartGraphicsStream();
WiredHome 31:c72e12cd5c67 271 for (int i=0; i<w*h; i++) {
WiredHome 55:dfbabef7003e 272 _putp(color[i]);
dreschpe 0:de9d1462a835 273 }
WiredHome 37:f19b7e7449dc 274 _EndGraphicsStream();
WiredHome 79:544eb4964795 275 return WindowMax();
dreschpe 0:de9d1462a835 276 }
WiredHome 19:3f82c1161fd2 277
WiredHome 37:f19b7e7449dc 278 #ifdef LOCALFONT
WiredHome 33:b6b710758ab3 279 int GraphicsDisplay::blitbit(int x, int y, int w, int h, const char * color)
WiredHome 19:3f82c1161fd2 280 {
WiredHome 29:422616aa04bd 281 _foreground = 0xFFFF;
WiredHome 33:b6b710758ab3 282 INFO("blitbit(%d,%d, %d,%d, %02X) [%04X,%04X]", x,y, w,h, *color, _foreground, _background);
WiredHome 29:422616aa04bd 283 INFO("%lu %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",
WiredHome 33:b6b710758ab3 284 color,
WiredHome 33:b6b710758ab3 285 color[0], color[1], color[2], color[3], color[4], color[5], color[6], color[7],
WiredHome 33:b6b710758ab3 286 color[8], color[9], color[10], color[11], color[12], color[13], color[14], color[15]);
dreschpe 0:de9d1462a835 287 window(x, y, w, h);
WiredHome 37:f19b7e7449dc 288 _StartGraphicsStream();
WiredHome 29:422616aa04bd 289 for (int i = 0; i < w*h; i++) {
WiredHome 33:b6b710758ab3 290 char byte = color[i >> 3];
dreschpe 0:de9d1462a835 291 int offset = i & 0x7;
WiredHome 29:422616aa04bd 292 if (offset == 0)
WiredHome 29:422616aa04bd 293 INFO(" %2d = %02X", i>>3, byte);
dreschpe 0:de9d1462a835 294 int c = ((byte << offset) & 0x80) ? _foreground : _background;
WiredHome 55:dfbabef7003e 295 _putp(c);
dreschpe 0:de9d1462a835 296 }
WiredHome 37:f19b7e7449dc 297 _EndGraphicsStream();
WiredHome 37:f19b7e7449dc 298 WindowMax();
WiredHome 29:422616aa04bd 299 return w;
WiredHome 29:422616aa04bd 300 }
WiredHome 37:f19b7e7449dc 301 #endif
WiredHome 29:422616aa04bd 302
WiredHome 29:422616aa04bd 303
WiredHome 29:422616aa04bd 304 int GraphicsDisplay::fontblit(int x, int y, const unsigned char * fontTable, const unsigned char * fontChar)
WiredHome 29:422616aa04bd 305 {
WiredHome 29:422616aa04bd 306 //int fontWidth = font[1]; // get hor size of font
WiredHome 29:422616aa04bd 307 int fontHeight = font[2]; // get vert size of font
WiredHome 29:422616aa04bd 308 int bytesPerLine = font[3]; // bytes per line
WiredHome 29:422616aa04bd 309 int charWidth = fontChar[0]; // width of this character
WiredHome 29:422616aa04bd 310 int px, py;
WiredHome 37:f19b7e7449dc 311
WiredHome 37:f19b7e7449dc 312 //INFO("(%d,%d) %lu, %lu %X/%X", x,y, fontTable, fontChar, _foreground, _background);
WiredHome 37:f19b7e7449dc 313 //INFO("char size (%d,%d)", charWidth, fontHeight);
WiredHome 37:f19b7e7449dc 314 //HexDump("char", (uint8_t *)fontChar, 32);
WiredHome 37:f19b7e7449dc 315 //INFO("(f,b) = (%04X,%04X)", _foreground, _background)
WiredHome 29:422616aa04bd 316 window(x, y, charWidth, fontHeight);
WiredHome 37:f19b7e7449dc 317 _StartGraphicsStream();
WiredHome 37:f19b7e7449dc 318 //INFO("(f,b) = (%04X,%04X)", _foreground, _background)
WiredHome 29:422616aa04bd 319 for (py = 0; py < fontHeight; py++) {
WiredHome 29:422616aa04bd 320 int bitmask = 1 << (py & 7);
WiredHome 29:422616aa04bd 321
WiredHome 29:422616aa04bd 322 for (px = 0; px < charWidth; px++) {
WiredHome 29:422616aa04bd 323 int offset = (py / 8) + px * bytesPerLine;
WiredHome 29:422616aa04bd 324 unsigned char byte = fontChar[offset + 1]; // skip the char's # bits wide value
WiredHome 37:f19b7e7449dc 325 color_t c = (byte & bitmask) ? _foreground : _background;
WiredHome 37:f19b7e7449dc 326 //INFO("(%2d,%2d) %02X & %02X => %04X [%04X,%04X]", px, py, byte, bitmask, c, _foreground, _background);
WiredHome 37:f19b7e7449dc 327 //pixel(x+px, y+py, c);
WiredHome 55:dfbabef7003e 328 _putp(c);
WiredHome 29:422616aa04bd 329 }
WiredHome 29:422616aa04bd 330 }
WiredHome 37:f19b7e7449dc 331 _EndGraphicsStream();
WiredHome 37:f19b7e7449dc 332 WindowMax();
WiredHome 29:422616aa04bd 333 return charWidth;
dreschpe 0:de9d1462a835 334 }
dreschpe 0:de9d1462a835 335
WiredHome 31:c72e12cd5c67 336 // BMP Color Palette is BGRx
WiredHome 31:c72e12cd5c67 337 // BBBB BBBB GGGG GGGG RRRR RRRR 0000 0000
WiredHome 31:c72e12cd5c67 338 // RGB16 is
WiredHome 31:c72e12cd5c67 339 // RRRR RGGG GGGB BBBB
WiredHome 31:c72e12cd5c67 340 // swap to little endian
WiredHome 31:c72e12cd5c67 341 // GGGB BBBB RRRR RGGG
WiredHome 32:0e4f2ae512e2 342 color_t GraphicsDisplay::RGBQuadToRGB16(RGBQUAD * colorPalette, uint16_t i)
WiredHome 31:c72e12cd5c67 343 {
WiredHome 31:c72e12cd5c67 344 color_t c;
WiredHome 31:c72e12cd5c67 345
WiredHome 31:c72e12cd5c67 346 c = ((colorPalette[i].rgbBlue >> 3) << 0);
WiredHome 31:c72e12cd5c67 347 c |= ((colorPalette[i].rgbGreen >> 2) << 5);
WiredHome 31:c72e12cd5c67 348 c |= ((colorPalette[i].rgbRed >> 3) << 11);
WiredHome 31:c72e12cd5c67 349 return c;
WiredHome 31:c72e12cd5c67 350 }
WiredHome 29:422616aa04bd 351
WiredHome 93:6fbc516de05e 352 // RGB16 little endian
WiredHome 93:6fbc516de05e 353 // GGGB BBBB RRRR RGGG
WiredHome 93:6fbc516de05e 354 // swap
WiredHome 93:6fbc516de05e 355 // RRRR RGGG GGGB BBBB
WiredHome 93:6fbc516de05e 356 // RRRR R
WiredHome 93:6fbc516de05e 357 // extend to BMP Color Palette is BGRx
WiredHome 93:6fbc516de05e 358 // BBBB BBBB GGGG GGGG RRRR RRRR 0000 0000
WiredHome 41:2956a0a221e5 359 RGBQUAD GraphicsDisplay::RGB16ToRGBQuad(color_t c)
WiredHome 41:2956a0a221e5 360 {
WiredHome 41:2956a0a221e5 361 RGBQUAD q;
WiredHome 41:2956a0a221e5 362
WiredHome 41:2956a0a221e5 363 memset(&q, 0, sizeof(q));
WiredHome 93:6fbc516de05e 364 c = (c << 8) | (c >> 8); // swap
WiredHome 72:ecffe56af969 365 q.rgbBlue = ((c & 0x001F) << 3) | (c & 0x07); /* Blue value */
WiredHome 93:6fbc516de05e 366 q.rgbGreen = ((c & 0x07E0) >> 3) | ((c >> 9) & 0x03); /* Green value */
WiredHome 93:6fbc516de05e 367 q.rgbRed = ((c & 0xF800) >> 8) | ((c >> 13) & 0x07); /* Red value */
WiredHome 41:2956a0a221e5 368 q.rgbReserved = 0;
WiredHome 41:2956a0a221e5 369 return q;
WiredHome 41:2956a0a221e5 370 }
WiredHome 41:2956a0a221e5 371
WiredHome 42:7cbdfd2bbfc5 372 RetCode_t GraphicsDisplay::_RenderBitmap(loc_t x, loc_t y, uint32_t fileOffset, FILE * Image)
WiredHome 31:c72e12cd5c67 373 {
WiredHome 31:c72e12cd5c67 374 BITMAPINFOHEADER BMP_Info;
WiredHome 31:c72e12cd5c67 375 RGBQUAD * colorPalette = NULL;
WiredHome 31:c72e12cd5c67 376 int colorCount;
WiredHome 32:0e4f2ae512e2 377 uint8_t * lineBuffer = NULL;
WiredHome 69:636867df24a1 378 color_t * pixelBuffer = NULL;
WiredHome 31:c72e12cd5c67 379 uint16_t BPP_t;
WiredHome 95:ef538bd687c0 380 dim_t PixelWidth, PixelHeight;
WiredHome 31:c72e12cd5c67 381 unsigned int i, offset;
WiredHome 31:c72e12cd5c67 382 int padd,j;
WiredHome 59:fb40aad4efd4 383 #ifdef DEBUG
WiredHome 59:fb40aad4efd4 384 uint32_t start_data;
WiredHome 59:fb40aad4efd4 385 #endif
WiredHome 31:c72e12cd5c67 386
WiredHome 42:7cbdfd2bbfc5 387 // Now, Read the bitmap info header
WiredHome 31:c72e12cd5c67 388 fread(&BMP_Info, 1, sizeof(BMP_Info), Image);
WiredHome 59:fb40aad4efd4 389 HexDump("BMP_Info", (uint8_t *)&BMP_Info, sizeof(BMP_Info));
WiredHome 31:c72e12cd5c67 390 BPP_t = BMP_Info.biBitCount;
WiredHome 31:c72e12cd5c67 391 INFO("biBitCount %04X", BPP_t);
WiredHome 32:0e4f2ae512e2 392 if (BPP_t != 4 && BPP_t != 8 && BPP_t != 16 && BPP_t != 24) { // Support 4, 8, 16, 24-bits per pixel
WiredHome 31:c72e12cd5c67 393 fclose(Image);
WiredHome 31:c72e12cd5c67 394 return(not_supported_format);
WiredHome 31:c72e12cd5c67 395 }
WiredHome 31:c72e12cd5c67 396
WiredHome 31:c72e12cd5c67 397 PixelHeight = BMP_Info.biHeight;
WiredHome 31:c72e12cd5c67 398 PixelWidth = BMP_Info.biWidth;
WiredHome 79:544eb4964795 399 INFO("(%d,%d) (%d,%d) (%d,%d)", x,y, PixelWidth,PixelHeight, width(), height());
WiredHome 31:c72e12cd5c67 400 if (PixelHeight > height() + y || PixelWidth > width() + x) {
WiredHome 31:c72e12cd5c67 401 fclose(Image);
WiredHome 31:c72e12cd5c67 402 return(image_too_big);
WiredHome 31:c72e12cd5c67 403 }
WiredHome 31:c72e12cd5c67 404 if (BMP_Info.biBitCount <= 8) {
WiredHome 31:c72e12cd5c67 405 int paletteSize;
WiredHome 31:c72e12cd5c67 406 // Read the color palette
WiredHome 31:c72e12cd5c67 407 colorCount = 1 << BMP_Info.biBitCount;
WiredHome 31:c72e12cd5c67 408 paletteSize = sizeof(RGBQUAD) * colorCount;
WiredHome 97:03c509c3db18 409 colorPalette = (RGBQUAD *)swMalloc(paletteSize);
WiredHome 31:c72e12cd5c67 410 if (colorPalette == NULL) {
WiredHome 31:c72e12cd5c67 411 fclose(Image);
WiredHome 31:c72e12cd5c67 412 return(not_enough_ram);
WiredHome 31:c72e12cd5c67 413 }
WiredHome 31:c72e12cd5c67 414 fread(colorPalette, 1, paletteSize, Image);
WiredHome 59:fb40aad4efd4 415 HexDump("Color Palette", (uint8_t *)colorPalette, paletteSize);
WiredHome 31:c72e12cd5c67 416 }
WiredHome 31:c72e12cd5c67 417
WiredHome 32:0e4f2ae512e2 418 int lineBufSize = ((BPP_t * PixelWidth + 7)/8);
WiredHome 59:fb40aad4efd4 419 INFO("BPP_t %d, PixelWidth %d, lineBufSize %d", BPP_t, PixelWidth, lineBufSize);
WiredHome 97:03c509c3db18 420 lineBuffer = (uint8_t *)swMalloc(lineBufSize);
WiredHome 31:c72e12cd5c67 421 if (lineBuffer == NULL) {
WiredHome 97:03c509c3db18 422 swFree(colorPalette);
WiredHome 31:c72e12cd5c67 423 fclose(Image);
WiredHome 31:c72e12cd5c67 424 return(not_enough_ram);
WiredHome 31:c72e12cd5c67 425 }
WiredHome 97:03c509c3db18 426 pixelBuffer = (color_t *)swMalloc(PixelWidth * sizeof(color_t));
WiredHome 41:2956a0a221e5 427 if (pixelBuffer == NULL) {
WiredHome 97:03c509c3db18 428 swFree(lineBuffer);
WiredHome 69:636867df24a1 429 if (colorPalette)
WiredHome 97:03c509c3db18 430 swFree(colorPalette);
WiredHome 41:2956a0a221e5 431 fclose(Image);
WiredHome 41:2956a0a221e5 432 return(not_enough_ram);
WiredHome 41:2956a0a221e5 433 }
WiredHome 31:c72e12cd5c67 434
WiredHome 32:0e4f2ae512e2 435 // the Raw Data records are padded to a multiple of 4 bytes
WiredHome 32:0e4f2ae512e2 436 int recordSize = 2;
WiredHome 32:0e4f2ae512e2 437 if (BPP_t == 4) {
WiredHome 32:0e4f2ae512e2 438 recordSize = 1;
WiredHome 32:0e4f2ae512e2 439 } else if (BPP_t == 8) {
WiredHome 32:0e4f2ae512e2 440 recordSize = 1;
WiredHome 32:0e4f2ae512e2 441 } else if (BPP_t == 16) {
WiredHome 32:0e4f2ae512e2 442 recordSize = 2;
WiredHome 32:0e4f2ae512e2 443 } else if (BPP_t == 24) {
WiredHome 32:0e4f2ae512e2 444 recordSize = 3;
WiredHome 32:0e4f2ae512e2 445 }
WiredHome 31:c72e12cd5c67 446 padd = -1;
WiredHome 31:c72e12cd5c67 447 do {
WiredHome 31:c72e12cd5c67 448 padd++;
WiredHome 32:0e4f2ae512e2 449 } while ((PixelWidth * recordSize + padd) % 4 != 0);
WiredHome 31:c72e12cd5c67 450
WiredHome 32:0e4f2ae512e2 451 // Define window for top to bottom and left to right so writing auto-wraps
WiredHome 31:c72e12cd5c67 452 window(x,y, PixelWidth,PixelHeight);
WiredHome 32:0e4f2ae512e2 453 SetGraphicsCursor(x, y);
WiredHome 32:0e4f2ae512e2 454 _StartGraphicsStream();
WiredHome 32:0e4f2ae512e2 455
WiredHome 42:7cbdfd2bbfc5 456 //start_data = BMP_Header.bfOffBits;
WiredHome 59:fb40aad4efd4 457 HexDump("Raw Data", (uint8_t *)&start_data, 32);
WiredHome 59:fb40aad4efd4 458 INFO("(%d,%d) (%d,%d), [%d,%d]", x,y, PixelWidth,PixelHeight, lineBufSize, padd);
WiredHome 32:0e4f2ae512e2 459 for (j = PixelHeight - 1; j >= 0; j--) { //Lines bottom up
WiredHome 42:7cbdfd2bbfc5 460 offset = fileOffset + j * (lineBufSize + padd); // start of line
WiredHome 31:c72e12cd5c67 461 fseek(Image, offset, SEEK_SET);
WiredHome 32:0e4f2ae512e2 462 fread(lineBuffer, 1, lineBufSize, Image); // read a line - slow !
WiredHome 79:544eb4964795 463 //INFO("offset: %6X", offset);
WiredHome 32:0e4f2ae512e2 464 for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT
WiredHome 31:c72e12cd5c67 465 if (BPP_t == 4) {
WiredHome 31:c72e12cd5c67 466 uint8_t dPix = lineBuffer[i/2];
WiredHome 31:c72e12cd5c67 467 if ((i & 1) == 0)
WiredHome 31:c72e12cd5c67 468 dPix >>= 4;
WiredHome 31:c72e12cd5c67 469 dPix &= 0x0F;
WiredHome 41:2956a0a221e5 470 pixelBuffer[i] = RGBQuadToRGB16(colorPalette, dPix);
WiredHome 31:c72e12cd5c67 471 } else if (BPP_t == 8) {
WiredHome 41:2956a0a221e5 472 pixelBuffer[i] = RGBQuadToRGB16(colorPalette, lineBuffer[i]);
WiredHome 32:0e4f2ae512e2 473 } else if (BPP_t == 16) {
WiredHome 41:2956a0a221e5 474 pixelBuffer[i] = lineBuffer[i];
WiredHome 32:0e4f2ae512e2 475 } else if (BPP_t == 24) {
WiredHome 37:f19b7e7449dc 476 color_t color;
WiredHome 32:0e4f2ae512e2 477 color = RGB(lineBuffer[i*3+2], lineBuffer[i*3+1], lineBuffer[i*3+0]);
WiredHome 41:2956a0a221e5 478 pixelBuffer[i] = color;
WiredHome 31:c72e12cd5c67 479 }
WiredHome 31:c72e12cd5c67 480 }
WiredHome 41:2956a0a221e5 481 pixelStream(pixelBuffer, PixelWidth, x, y++);
WiredHome 31:c72e12cd5c67 482 }
WiredHome 42:7cbdfd2bbfc5 483 _EndGraphicsStream();
WiredHome 42:7cbdfd2bbfc5 484 WindowMax();
WiredHome 97:03c509c3db18 485 swFree(pixelBuffer); // don't leak memory
WiredHome 97:03c509c3db18 486 swFree(lineBuffer);
WiredHome 69:636867df24a1 487 if (colorPalette)
WiredHome 97:03c509c3db18 488 swFree(colorPalette);
WiredHome 32:0e4f2ae512e2 489 return (noerror);
WiredHome 31:c72e12cd5c67 490 }
WiredHome 31:c72e12cd5c67 491
WiredHome 42:7cbdfd2bbfc5 492
WiredHome 42:7cbdfd2bbfc5 493 RetCode_t GraphicsDisplay::RenderImageFile(loc_t x, loc_t y, const char *FileName)
WiredHome 42:7cbdfd2bbfc5 494 {
WiredHome 42:7cbdfd2bbfc5 495 if (mystrnicmp(FileName + strlen(FileName) - 4, ".bmp", 4) == 0) {
WiredHome 42:7cbdfd2bbfc5 496 return RenderBitmapFile(x,y,FileName);
WiredHome 42:7cbdfd2bbfc5 497 } else if (mystrnicmp(FileName + strlen(FileName) - 4, ".ico", 4) == 0) {
WiredHome 42:7cbdfd2bbfc5 498 return RenderIconFile(x,y,FileName);
WiredHome 42:7cbdfd2bbfc5 499 } else {
WiredHome 42:7cbdfd2bbfc5 500 return not_supported_format;
WiredHome 42:7cbdfd2bbfc5 501 }
WiredHome 42:7cbdfd2bbfc5 502 }
WiredHome 42:7cbdfd2bbfc5 503
WiredHome 42:7cbdfd2bbfc5 504 RetCode_t GraphicsDisplay::RenderBitmapFile(loc_t x, loc_t y, const char *Name_BMP)
WiredHome 42:7cbdfd2bbfc5 505 {
WiredHome 42:7cbdfd2bbfc5 506 BITMAPFILEHEADER BMP_Header;
WiredHome 42:7cbdfd2bbfc5 507
WiredHome 42:7cbdfd2bbfc5 508 INFO("Opening {%s}", Name_BMP);
WiredHome 42:7cbdfd2bbfc5 509 FILE *Image = fopen(Name_BMP, "rb");
WiredHome 42:7cbdfd2bbfc5 510 if (!Image) {
WiredHome 42:7cbdfd2bbfc5 511 return(file_not_found);
WiredHome 42:7cbdfd2bbfc5 512 }
WiredHome 42:7cbdfd2bbfc5 513
WiredHome 42:7cbdfd2bbfc5 514 fread(&BMP_Header, 1, sizeof(BMP_Header), Image); // get the BMP Header
WiredHome 42:7cbdfd2bbfc5 515 INFO("bfType %04X", BMP_Header.bfType);
WiredHome 59:fb40aad4efd4 516 HexDump("BMP_Header", (uint8_t *)&BMP_Header, sizeof(BMP_Header));
WiredHome 42:7cbdfd2bbfc5 517 if (BMP_Header.bfType != BF_TYPE) {
WiredHome 42:7cbdfd2bbfc5 518 fclose(Image);
WiredHome 42:7cbdfd2bbfc5 519 return(not_bmp_format);
WiredHome 42:7cbdfd2bbfc5 520 }
WiredHome 42:7cbdfd2bbfc5 521 RetCode_t rt = _RenderBitmap(x, y, BMP_Header.bfOffBits, Image);
WiredHome 42:7cbdfd2bbfc5 522 if (rt != noerror) {
WiredHome 42:7cbdfd2bbfc5 523 return rt;
WiredHome 42:7cbdfd2bbfc5 524 } else {
WiredHome 42:7cbdfd2bbfc5 525 fclose(Image);
WiredHome 42:7cbdfd2bbfc5 526 return (noerror);
WiredHome 42:7cbdfd2bbfc5 527 }
WiredHome 42:7cbdfd2bbfc5 528 }
WiredHome 42:7cbdfd2bbfc5 529
WiredHome 42:7cbdfd2bbfc5 530 RetCode_t GraphicsDisplay::RenderIconFile(loc_t x, loc_t y, const char *Name_ICO)
WiredHome 42:7cbdfd2bbfc5 531 {
WiredHome 42:7cbdfd2bbfc5 532 ICOFILEHEADER ICO_Header;
WiredHome 42:7cbdfd2bbfc5 533 ICODIRENTRY ICO_DirEntry;
WiredHome 42:7cbdfd2bbfc5 534
WiredHome 42:7cbdfd2bbfc5 535 INFO("Opening {%s}", Name_ICO);
WiredHome 42:7cbdfd2bbfc5 536 FILE *Image = fopen(Name_ICO, "rb");
WiredHome 42:7cbdfd2bbfc5 537 if (!Image) {
WiredHome 42:7cbdfd2bbfc5 538 return(file_not_found);
WiredHome 42:7cbdfd2bbfc5 539 }
WiredHome 42:7cbdfd2bbfc5 540
WiredHome 42:7cbdfd2bbfc5 541 fread(&ICO_Header, 1, sizeof(ICO_Header), Image); // get the BMP Header
WiredHome 42:7cbdfd2bbfc5 542 HexDump("ICO_Header", (uint8_t *)&ICO_Header, sizeof(ICO_Header));
WiredHome 42:7cbdfd2bbfc5 543 if (ICO_Header.Reserved_zero != 0
WiredHome 42:7cbdfd2bbfc5 544 || ICO_Header.icType != IC_TYPE
WiredHome 42:7cbdfd2bbfc5 545 || ICO_Header.icImageCount == 0) {
WiredHome 42:7cbdfd2bbfc5 546 fclose(Image);
WiredHome 42:7cbdfd2bbfc5 547 return(not_ico_format);
WiredHome 42:7cbdfd2bbfc5 548 }
WiredHome 42:7cbdfd2bbfc5 549
WiredHome 42:7cbdfd2bbfc5 550 // Read ONLY the first of n possible directory entries.
WiredHome 42:7cbdfd2bbfc5 551 fread(&ICO_DirEntry, 1, sizeof(ICO_DirEntry), Image);
WiredHome 42:7cbdfd2bbfc5 552 HexDump("ICO_DirEntry", (uint8_t *)&ICO_DirEntry, sizeof(ICO_DirEntry));
WiredHome 42:7cbdfd2bbfc5 553 INFO("biBitCount %04X", ICO_DirEntry.biBitCount);
WiredHome 42:7cbdfd2bbfc5 554 if (ICO_DirEntry.biBitCount != 0) { // Expecting this to be zero for ico
WiredHome 42:7cbdfd2bbfc5 555 fclose(Image);
WiredHome 42:7cbdfd2bbfc5 556 return(not_supported_format);
WiredHome 42:7cbdfd2bbfc5 557 }
WiredHome 42:7cbdfd2bbfc5 558
WiredHome 42:7cbdfd2bbfc5 559 RetCode_t rt = _RenderBitmap(x, y, ICO_DirEntry.bfOffBits, Image);
WiredHome 42:7cbdfd2bbfc5 560 if (rt == noerror) {
WiredHome 42:7cbdfd2bbfc5 561 fclose(Image);
WiredHome 42:7cbdfd2bbfc5 562 return (noerror);
WiredHome 42:7cbdfd2bbfc5 563 } else {
WiredHome 42:7cbdfd2bbfc5 564 return rt;
WiredHome 42:7cbdfd2bbfc5 565 }
WiredHome 42:7cbdfd2bbfc5 566 }
WiredHome 42:7cbdfd2bbfc5 567
WiredHome 19:3f82c1161fd2 568 int GraphicsDisplay::columns()
WiredHome 19:3f82c1161fd2 569 {
WiredHome 19:3f82c1161fd2 570 return width() / 8;
dreschpe 0:de9d1462a835 571 }
dreschpe 0:de9d1462a835 572
WiredHome 19:3f82c1161fd2 573 int GraphicsDisplay::rows()
WiredHome 19:3f82c1161fd2 574 {
WiredHome 19:3f82c1161fd2 575 return height() / 8;
WiredHome 19:3f82c1161fd2 576 }