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 Jan 20 19:19:48 2014 +0000
Revision:
31:c72e12cd5c67
Parent:
29:422616aa04bd
Child:
32:0e4f2ae512e2
Support for Bitmap graphics (tested 4-bit and 8-bit formats, have not tested 1-bit or 24-bit).

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
dreschpe 0:de9d1462a835 4 */
WiredHome 19:3f82c1161fd2 5
dreschpe 0:de9d1462a835 6 #include "GraphicsDisplay.h"
WiredHome 31:c72e12cd5c67 7 #include "Bitmap.h"
dreschpe 0:de9d1462a835 8
WiredHome 29:422616aa04bd 9 #define DEBUG "GD"
WiredHome 29:422616aa04bd 10 // ...
WiredHome 29:422616aa04bd 11 // INFO("Stuff to show %d", var); // new-line is automatically appended
WiredHome 29:422616aa04bd 12 //
WiredHome 29:422616aa04bd 13 #if (defined(DEBUG) && !defined(TARGET_LPC11U24))
WiredHome 29:422616aa04bd 14 #define INFO(x, ...) std::printf("[INF %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 29:422616aa04bd 15 #define WARN(x, ...) std::printf("[WRN %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 29:422616aa04bd 16 #define ERR(x, ...) std::printf("[ERR %s %3d] "x"\r\n", DEBUG, __LINE__, ##__VA_ARGS__);
WiredHome 31:c72e12cd5c67 17 void HexDump(char * title, uint8_t * p, int count)
WiredHome 31:c72e12cd5c67 18 {
WiredHome 31:c72e12cd5c67 19 int i;
WiredHome 31:c72e12cd5c67 20 char buf[100] = "0000: ";
WiredHome 31:c72e12cd5c67 21
WiredHome 31:c72e12cd5c67 22 if (*title)
WiredHome 31:c72e12cd5c67 23 INFO("%s", title);
WiredHome 31:c72e12cd5c67 24 for (i=0; i<count; ) {
WiredHome 31:c72e12cd5c67 25 sprintf(buf + strlen(buf), "%02X ", *(p+i));
WiredHome 31:c72e12cd5c67 26 if ((++i & 0x0F) == 0x00) {
WiredHome 31:c72e12cd5c67 27 INFO("%s", buf);
WiredHome 31:c72e12cd5c67 28 if (i < count)
WiredHome 31:c72e12cd5c67 29 sprintf(buf, "%04X: ", i);
WiredHome 31:c72e12cd5c67 30 else
WiredHome 31:c72e12cd5c67 31 buf[0] = '\0';
WiredHome 31:c72e12cd5c67 32 }
WiredHome 31:c72e12cd5c67 33 }
WiredHome 31:c72e12cd5c67 34 if (strlen(buf))
WiredHome 31:c72e12cd5c67 35 INFO("%s", buf);
WiredHome 31:c72e12cd5c67 36 }
WiredHome 29:422616aa04bd 37 #else
WiredHome 29:422616aa04bd 38 #define INFO(x, ...)
WiredHome 29:422616aa04bd 39 #define WARN(x, ...)
WiredHome 29:422616aa04bd 40 #define ERR(x, ...)
WiredHome 31:c72e12cd5c67 41 #define HexDump(a, b)
WiredHome 29:422616aa04bd 42 #endif
WiredHome 29:422616aa04bd 43
WiredHome 29:422616aa04bd 44 // #define LOCALFONT
WiredHome 29:422616aa04bd 45
WiredHome 29:422616aa04bd 46 #ifdef LOCALFONT
dreschpe 0:de9d1462a835 47 const unsigned char FONT8x8[97][8] = {
WiredHome 29:422616aa04bd 48 0x08, 0x08, 0x08, 0X00, 0X00, 0X00, 0X00, 0X00, // columns, rows, num_bytes_per_char
WiredHome 29:422616aa04bd 49 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, // space 0x20
WiredHome 29:422616aa04bd 50 0x30, 0x78, 0x78, 0x30, 0x30, 0X00, 0x30, 0X00, // !
WiredHome 29:422616aa04bd 51 0x6C, 0x6C, 0x6C, 0X00, 0X00, 0X00, 0X00, 0X00, // "
WiredHome 29:422616aa04bd 52 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0X00, // #
WiredHome 29:422616aa04bd 53 0x18, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x18, 0X00, // $
WiredHome 29:422616aa04bd 54 0X00, 0x63, 0x66, 0x0C, 0x18, 0x33, 0x63, 0X00, // %
WiredHome 29:422616aa04bd 55 0x1C, 0x36, 0x1C, 0x3B, 0x6E, 0x66, 0x3B, 0X00, // &
WiredHome 29:422616aa04bd 56 0x30, 0x30, 0x60, 0X00, 0X00, 0X00, 0X00, 0X00, // '
WiredHome 29:422616aa04bd 57 0x0C, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0C, 0X00, // (
WiredHome 29:422616aa04bd 58 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0X00, // )
WiredHome 29:422616aa04bd 59 0X00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0X00, 0X00, // *
WiredHome 29:422616aa04bd 60 0X00, 0x30, 0x30, 0xFC, 0x30, 0x30, 0X00, 0X00, // +
WiredHome 29:422616aa04bd 61 0X00, 0X00, 0X00, 0X00, 0X00, 0x18, 0x18, 0x30, // ,
WiredHome 29:422616aa04bd 62 0X00, 0X00, 0X00, 0x7E, 0X00, 0X00, 0X00, 0X00, // -
WiredHome 29:422616aa04bd 63 0X00, 0X00, 0X00, 0X00, 0X00, 0x18, 0x18, 0X00, // .
WiredHome 29:422616aa04bd 64 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0X00, // / (forward slash)
WiredHome 29:422616aa04bd 65 0x3E, 0x63, 0x63, 0x6B, 0x63, 0x63, 0x3E, 0X00, // 0 0x30
WiredHome 29:422616aa04bd 66 0x18, 0x38, 0x58, 0x18, 0x18, 0x18, 0x7E, 0X00, // 1
WiredHome 29:422616aa04bd 67 0x3C, 0x66, 0x06, 0x1C, 0x30, 0x66, 0x7E, 0X00, // 2
WiredHome 29:422616aa04bd 68 0x3C, 0x66, 0x06, 0x1C, 0x06, 0x66, 0x3C, 0X00, // 3
WiredHome 29:422616aa04bd 69 0x0E, 0x1E, 0x36, 0x66, 0x7F, 0x06, 0x0F, 0X00, // 4
WiredHome 29:422616aa04bd 70 0x7E, 0x60, 0x7C, 0x06, 0x06, 0x66, 0x3C, 0X00, // 5
WiredHome 29:422616aa04bd 71 0x1C, 0x30, 0x60, 0x7C, 0x66, 0x66, 0x3C, 0X00, // 6
WiredHome 29:422616aa04bd 72 0x7E, 0x66, 0x06, 0x0C, 0x18, 0x18, 0x18, 0X00, // 7
WiredHome 29:422616aa04bd 73 0x3C, 0x66, 0x66, 0x3C, 0x66, 0x66, 0x3C, 0X00, // 8
WiredHome 29:422616aa04bd 74 0x3C, 0x66, 0x66, 0x3E, 0x06, 0x0C, 0x38, 0X00, // 9
WiredHome 29:422616aa04bd 75 0X00, 0x18, 0x18, 0X00, 0X00, 0x18, 0x18, 0X00, // :
WiredHome 29:422616aa04bd 76 0X00, 0x18, 0x18, 0X00, 0X00, 0x18, 0x18, 0x30, // ;
WiredHome 29:422616aa04bd 77 0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0X00, // <
WiredHome 29:422616aa04bd 78 0X00, 0X00, 0x7E, 0X00, 0X00, 0x7E, 0X00, 0X00, // =
WiredHome 29:422616aa04bd 79 0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0X00, // >
WiredHome 29:422616aa04bd 80 0x3C, 0x66, 0x06, 0x0C, 0x18, 0X00, 0x18, 0X00, // ?
WiredHome 29:422616aa04bd 81 0x3E, 0x63, 0x6F, 0x69, 0x6F, 0x60, 0x3E, 0X00, // @ 0x40
WiredHome 29:422616aa04bd 82 0x18, 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0X00, // A
WiredHome 29:422616aa04bd 83 0x7E, 0x33, 0x33, 0x3E, 0x33, 0x33, 0x7E, 0X00, // B
WiredHome 29:422616aa04bd 84 0x1E, 0x33, 0x60, 0x60, 0x60, 0x33, 0x1E, 0X00, // C
WiredHome 29:422616aa04bd 85 0x7C, 0x36, 0x33, 0x33, 0x33, 0x36, 0x7C, 0X00, // D
WiredHome 29:422616aa04bd 86 0x7F, 0x31, 0x34, 0x3C, 0x34, 0x31, 0x7F, 0X00, // E
WiredHome 29:422616aa04bd 87 0x7F, 0x31, 0x34, 0x3C, 0x34, 0x30, 0x78, 0X00, // F
WiredHome 29:422616aa04bd 88 0x1E, 0x33, 0x60, 0x60, 0x67, 0x33, 0x1F, 0X00, // G
WiredHome 29:422616aa04bd 89 0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0X00, // H
WiredHome 29:422616aa04bd 90 0x3C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0X00, // I
WiredHome 29:422616aa04bd 91 0x0F, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, 0X00, // J
WiredHome 29:422616aa04bd 92 0x73, 0x33, 0x36, 0x3C, 0x36, 0x33, 0x73, 0X00, // K
WiredHome 29:422616aa04bd 93 0x78, 0x30, 0x30, 0x30, 0x31, 0x33, 0x7F, 0X00, // L
WiredHome 29:422616aa04bd 94 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0X00, // M
WiredHome 29:422616aa04bd 95 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x63, 0x63, 0X00, // N
WiredHome 29:422616aa04bd 96 0x3E, 0x63, 0x63, 0x63, 0x63, 0x63, 0x3E, 0X00, // O
WiredHome 29:422616aa04bd 97 0x7E, 0x33, 0x33, 0x3E, 0x30, 0x30, 0x78, 0X00, // P 0x50
WiredHome 29:422616aa04bd 98 0x3C, 0x66, 0x66, 0x66, 0x6E, 0x3C, 0x0E, 0X00, // Q
WiredHome 29:422616aa04bd 99 0x7E, 0x33, 0x33, 0x3E, 0x36, 0x33, 0x73, 0X00, // R
WiredHome 29:422616aa04bd 100 0x3C, 0x66, 0x30, 0x18, 0x0C, 0x66, 0x3C, 0X00, // S
WiredHome 29:422616aa04bd 101 0x7E, 0x5A, 0x18, 0x18, 0x18, 0x18, 0x3C, 0X00, // T
WiredHome 29:422616aa04bd 102 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7E, 0X00, // U
WiredHome 29:422616aa04bd 103 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0X00, // V
WiredHome 29:422616aa04bd 104 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0X00, // W
WiredHome 29:422616aa04bd 105 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0X00, // X
WiredHome 29:422616aa04bd 106 0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x3C, 0X00, // Y
WiredHome 29:422616aa04bd 107 0x7F, 0x63, 0x46, 0x0C, 0x19, 0x33, 0x7F, 0X00, // Z
WiredHome 29:422616aa04bd 108 0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0X00, // [
WiredHome 29:422616aa04bd 109 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0X00, // \ (back slash)
WiredHome 29:422616aa04bd 110 0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0X00, // ]
WiredHome 29:422616aa04bd 111 0x08, 0x1C, 0x36, 0x63, 0X00, 0X00, 0X00, 0X00, // ^
WiredHome 29:422616aa04bd 112 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0xFF, // _
WiredHome 29:422616aa04bd 113 0x18, 0x18, 0x0C, 0X00, 0X00, 0X00, 0X00, 0X00, // ` 0x60
WiredHome 29:422616aa04bd 114 0X00, 0X00, 0x3C, 0x06, 0x3E, 0x66, 0x3B, 0X00, // a
WiredHome 29:422616aa04bd 115 0x70, 0x30, 0x3E, 0x33, 0x33, 0x33, 0x6E, 0X00, // b
WiredHome 29:422616aa04bd 116 0X00, 0X00, 0x3C, 0x66, 0x60, 0x66, 0x3C, 0X00, // c
WiredHome 29:422616aa04bd 117 0x0E, 0x06, 0x3E, 0x66, 0x66, 0x66, 0x3B, 0X00, // d
WiredHome 29:422616aa04bd 118 0X00, 0X00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0X00, // e
WiredHome 29:422616aa04bd 119 0x1C, 0x36, 0x30, 0x78, 0x30, 0x30, 0x78, 0X00, // f
WiredHome 29:422616aa04bd 120 0X00, 0X00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x7C, // g
WiredHome 29:422616aa04bd 121 0x70, 0x30, 0x36, 0x3B, 0x33, 0x33, 0x73, 0X00, // h
WiredHome 29:422616aa04bd 122 0x18, 0X00, 0x38, 0x18, 0x18, 0x18, 0x3C, 0X00, // i
WiredHome 29:422616aa04bd 123 0x06, 0X00, 0x06, 0x06, 0x06, 0x66, 0x66, 0x3C, // j
WiredHome 29:422616aa04bd 124 0x70, 0x30, 0x33, 0x36, 0x3C, 0x36, 0x73, 0X00, // k
WiredHome 29:422616aa04bd 125 0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0X00, // l
WiredHome 29:422616aa04bd 126 0X00, 0X00, 0x66, 0x7F, 0x7F, 0x6B, 0x63, 0X00, // m
WiredHome 29:422616aa04bd 127 0X00, 0X00, 0x7C, 0x66, 0x66, 0x66, 0x66, 0X00, // n
WiredHome 29:422616aa04bd 128 0X00, 0X00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0X00, // o
WiredHome 29:422616aa04bd 129 0X00, 0X00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78, // p
WiredHome 29:422616aa04bd 130 0X00, 0X00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F, // q
WiredHome 29:422616aa04bd 131 0X00, 0X00, 0x6E, 0x3B, 0x33, 0x30, 0x78, 0X00, // r
WiredHome 29:422616aa04bd 132 0X00, 0X00, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0X00, // s
WiredHome 29:422616aa04bd 133 0x08, 0x18, 0x3E, 0x18, 0x18, 0x1A, 0x0C, 0X00, // t
WiredHome 29:422616aa04bd 134 0X00, 0X00, 0x66, 0x66, 0x66, 0x66, 0x3B, 0X00, // u
WiredHome 29:422616aa04bd 135 0X00, 0X00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0X00, // v
WiredHome 29:422616aa04bd 136 0X00, 0X00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0X00, // w
WiredHome 29:422616aa04bd 137 0X00, 0X00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0X00, // x
WiredHome 29:422616aa04bd 138 0X00, 0X00, 0x66, 0x66, 0x66, 0x3E, 0x06, 0x7C, // y
WiredHome 29:422616aa04bd 139 0X00, 0X00, 0x7E, 0x4C, 0x18, 0x32, 0x7E, 0X00, // z
WiredHome 29:422616aa04bd 140 0x0E, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0E, 0X00, // {
WiredHome 29:422616aa04bd 141 0x0C, 0x0C, 0x0C, 0X00, 0x0C, 0x0C, 0x0C, 0X00, // |
WiredHome 29:422616aa04bd 142 0x70, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x70, 0X00, // }
WiredHome 29:422616aa04bd 143 0x3B, 0x6E, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, // ~
WiredHome 29:422616aa04bd 144 0x1C, 0x36, 0x36, 0x1C, 0X00, 0X00, 0X00, 0X00 // DEL
WiredHome 23:a50ded45dbaf 145 };
WiredHome 29:422616aa04bd 146 #endif // LOCALFONT
WiredHome 19:3f82c1161fd2 147
WiredHome 29:422616aa04bd 148 GraphicsDisplay::GraphicsDisplay(const char *name)
WiredHome 29:422616aa04bd 149 : TextDisplay(name)
WiredHome 19:3f82c1161fd2 150 {
WiredHome 29:422616aa04bd 151 font = NULL;
WiredHome 19:3f82c1161fd2 152 //foreground(0xFFFF);
WiredHome 19:3f82c1161fd2 153 //background(0x0000);
dreschpe 0:de9d1462a835 154 }
WiredHome 19:3f82c1161fd2 155
WiredHome 29:422616aa04bd 156 RetCode_t GraphicsDisplay::set_font(const unsigned char * _font)
WiredHome 19:3f82c1161fd2 157 {
WiredHome 29:422616aa04bd 158 font = _font;
WiredHome 29:422616aa04bd 159 INFO("set_font(%lu) %lu", _font, font);
WiredHome 29:422616aa04bd 160 return noerror; // trusting them, but it might be good to put some checks in here...
dreschpe 0:de9d1462a835 161 }
dreschpe 0:de9d1462a835 162
WiredHome 29:422616aa04bd 163 #ifdef LOCALFONT
WiredHome 29:422616aa04bd 164 int GraphicsDisplay::character(int x, int y, int value)
WiredHome 29:422616aa04bd 165 {
WiredHome 29:422616aa04bd 166 INFO("character(%d,%d,%c)", x, t, value);
WiredHome 29:422616aa04bd 167 if (value <= 0x1F && value >= 7F)
WiredHome 29:422616aa04bd 168 return 0;
WiredHome 29:422616aa04bd 169
WiredHome 29:422616aa04bd 170 return blitbit(x, y, FONT8X8[0][0], FONT8X8[0][1],
WiredHome 29:422616aa04bd 171 (char *)&(FONT8x8[value - 0x1F][0]));
WiredHome 29:422616aa04bd 172 }
WiredHome 29:422616aa04bd 173 #else
WiredHome 29:422616aa04bd 174 int GraphicsDisplay::character(int x, int y, int c)
WiredHome 29:422616aa04bd 175 {
WiredHome 29:422616aa04bd 176 unsigned int offset;
WiredHome 29:422616aa04bd 177 const unsigned char * charRecord;
WiredHome 29:422616aa04bd 178
WiredHome 29:422616aa04bd 179 if (c <= 0x1F || c >= 0x7F)
WiredHome 29:422616aa04bd 180 return 0;
WiredHome 29:422616aa04bd 181 offset = font[0]; // bytes / char
WiredHome 29:422616aa04bd 182 charRecord = &font[((c - ' ') * offset) + 4]; // start of char bitmap
WiredHome 29:422616aa04bd 183 return fontblit(x, y, font, charRecord);
WiredHome 29:422616aa04bd 184 }
WiredHome 29:422616aa04bd 185 #endif
WiredHome 19:3f82c1161fd2 186
WiredHome 29:422616aa04bd 187 void GraphicsDisplay::window(unsigned int x, unsigned int y, unsigned int w, unsigned int h)
WiredHome 19:3f82c1161fd2 188 {
dreschpe 0:de9d1462a835 189 // current pixel location
dreschpe 0:de9d1462a835 190 _x = x;
dreschpe 0:de9d1462a835 191 _y = y;
dreschpe 0:de9d1462a835 192 // window settings
dreschpe 0:de9d1462a835 193 _x1 = x;
dreschpe 0:de9d1462a835 194 _x2 = x + w - 1;
dreschpe 0:de9d1462a835 195 _y1 = y;
dreschpe 0:de9d1462a835 196 _y2 = y + h - 1;
dreschpe 0:de9d1462a835 197 }
WiredHome 19:3f82c1161fd2 198
WiredHome 31:c72e12cd5c67 199 void GraphicsDisplay::WindowMax(void)
WiredHome 31:c72e12cd5c67 200 {
WiredHome 31:c72e12cd5c67 201 window(0,0, width(),height());
WiredHome 31:c72e12cd5c67 202 }
WiredHome 31:c72e12cd5c67 203
WiredHome 31:c72e12cd5c67 204 void GraphicsDisplay::putp(color_t colour)
WiredHome 19:3f82c1161fd2 205 {
dreschpe 0:de9d1462a835 206 // put pixel at current pixel location
dreschpe 0:de9d1462a835 207 pixel(_x, _y, colour);
dreschpe 0:de9d1462a835 208 // update pixel location based on window settings
dreschpe 0:de9d1462a835 209 _x++;
dreschpe 0:de9d1462a835 210 if(_x > _x2) {
dreschpe 0:de9d1462a835 211 _x = _x1;
dreschpe 0:de9d1462a835 212 _y++;
dreschpe 0:de9d1462a835 213 if(_y > _y2) {
dreschpe 0:de9d1462a835 214 _y = _y1;
dreschpe 0:de9d1462a835 215 }
dreschpe 0:de9d1462a835 216 }
dreschpe 0:de9d1462a835 217 }
dreschpe 0:de9d1462a835 218
WiredHome 31:c72e12cd5c67 219 void GraphicsDisplay::fill(int x, int y, int w, int h, color_t colour)
WiredHome 19:3f82c1161fd2 220 {
dreschpe 0:de9d1462a835 221 window(x, y, w, h);
dreschpe 0:de9d1462a835 222 for(int i=0; i<w*h; i++) {
dreschpe 0:de9d1462a835 223 putp(colour);
dreschpe 0:de9d1462a835 224 }
dreschpe 0:de9d1462a835 225 }
WiredHome 19:3f82c1161fd2 226
WiredHome 19:3f82c1161fd2 227 RetCode_t GraphicsDisplay::cls()
WiredHome 19:3f82c1161fd2 228 {
dreschpe 0:de9d1462a835 229 fill(0, 0, width(), height(), _background);
WiredHome 19:3f82c1161fd2 230 return noerror;
dreschpe 0:de9d1462a835 231 }
WiredHome 19:3f82c1161fd2 232
WiredHome 29:422616aa04bd 233 void GraphicsDisplay::blit(int x, int y, int w, int h, const int * colour)
WiredHome 19:3f82c1161fd2 234 {
dreschpe 0:de9d1462a835 235 window(x, y, w, h);
WiredHome 31:c72e12cd5c67 236 for (int i=0; i<w*h; i++) {
dreschpe 0:de9d1462a835 237 putp(colour[i]);
dreschpe 0:de9d1462a835 238 }
dreschpe 0:de9d1462a835 239 }
WiredHome 19:3f82c1161fd2 240
WiredHome 29:422616aa04bd 241 int GraphicsDisplay::blitbit(int x, int y, int w, int h, const char * colour)
WiredHome 19:3f82c1161fd2 242 {
WiredHome 29:422616aa04bd 243 _foreground = 0xFFFF;
WiredHome 29:422616aa04bd 244 INFO("blitbit(%d,%d, %d,%d, %02X) [%04X,%04X]", x,y, w,h, *colour, _foreground, _background);
WiredHome 29:422616aa04bd 245 INFO("%lu %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X",
WiredHome 29:422616aa04bd 246 colour,
WiredHome 29:422616aa04bd 247 colour[0], colour[1], colour[2], colour[3], colour[4], colour[5], colour[6], colour[7],
WiredHome 29:422616aa04bd 248 colour[8], colour[9], colour[10], colour[11], colour[12], colour[13], colour[14], colour[15]);
dreschpe 0:de9d1462a835 249 window(x, y, w, h);
WiredHome 29:422616aa04bd 250 for (int i = 0; i < w*h; i++) {
dreschpe 0:de9d1462a835 251 char byte = colour[i >> 3];
dreschpe 0:de9d1462a835 252 int offset = i & 0x7;
WiredHome 29:422616aa04bd 253 if (offset == 0)
WiredHome 29:422616aa04bd 254 INFO(" %2d = %02X", i>>3, byte);
dreschpe 0:de9d1462a835 255 int c = ((byte << offset) & 0x80) ? _foreground : _background;
dreschpe 0:de9d1462a835 256 putp(c);
dreschpe 0:de9d1462a835 257 }
WiredHome 29:422616aa04bd 258 return w;
WiredHome 29:422616aa04bd 259 }
WiredHome 29:422616aa04bd 260
WiredHome 29:422616aa04bd 261
WiredHome 29:422616aa04bd 262 int GraphicsDisplay::fontblit(int x, int y, const unsigned char * fontTable, const unsigned char * fontChar)
WiredHome 29:422616aa04bd 263 {
WiredHome 19:3f82c1161fd2 264 _foreground = 0xFFFF;
WiredHome 29:422616aa04bd 265 //int fontWidth = font[1]; // get hor size of font
WiredHome 29:422616aa04bd 266 int fontHeight = font[2]; // get vert size of font
WiredHome 29:422616aa04bd 267 int bytesPerLine = font[3]; // bytes per line
WiredHome 29:422616aa04bd 268 int charWidth = fontChar[0]; // width of this character
WiredHome 29:422616aa04bd 269 int px, py;
WiredHome 29:422616aa04bd 270 window(x, y, charWidth, fontHeight);
WiredHome 29:422616aa04bd 271
WiredHome 29:422616aa04bd 272 for (py = 0; py < fontHeight; py++) {
WiredHome 29:422616aa04bd 273 int bitmask = 1 << (py & 7);
WiredHome 29:422616aa04bd 274
WiredHome 29:422616aa04bd 275 for (px = 0; px < charWidth; px++) {
WiredHome 29:422616aa04bd 276 int offset = (py / 8) + px * bytesPerLine;
WiredHome 29:422616aa04bd 277 unsigned char byte = fontChar[offset + 1]; // skip the char's # bits wide value
WiredHome 29:422616aa04bd 278 int c = (byte & bitmask) ? _foreground : _background;
WiredHome 29:422616aa04bd 279 putp(c);
WiredHome 29:422616aa04bd 280 }
WiredHome 29:422616aa04bd 281 }
WiredHome 29:422616aa04bd 282 return charWidth;
dreschpe 0:de9d1462a835 283 }
dreschpe 0:de9d1462a835 284
WiredHome 31:c72e12cd5c67 285 // BMP Color Palette is BGRx
WiredHome 31:c72e12cd5c67 286 // BBBB BBBB GGGG GGGG RRRR RRRR 0000 0000
WiredHome 31:c72e12cd5c67 287 // RGB16 is
WiredHome 31:c72e12cd5c67 288 // RRRR RGGG GGGB BBBB
WiredHome 31:c72e12cd5c67 289 // swap to little endian
WiredHome 31:c72e12cd5c67 290 // GGGB BBBB RRRR RGGG
WiredHome 31:c72e12cd5c67 291 color_t RGBQuadToRGB16(RGBQUAD * colorPalette, uint16_t i)
WiredHome 31:c72e12cd5c67 292 {
WiredHome 31:c72e12cd5c67 293 color_t c;
WiredHome 31:c72e12cd5c67 294
WiredHome 31:c72e12cd5c67 295 c = ((colorPalette[i].rgbBlue >> 3) << 0);
WiredHome 31:c72e12cd5c67 296 c |= ((colorPalette[i].rgbGreen >> 2) << 5);
WiredHome 31:c72e12cd5c67 297 c |= ((colorPalette[i].rgbRed >> 3) << 11);
WiredHome 31:c72e12cd5c67 298 c = (c >> 8) | (c << 8);
WiredHome 31:c72e12cd5c67 299 //INFO("B %02X G %02X R %02X c %04X", colorPalette[i].rgbBlue, colorPalette[i].rgbGreen,
WiredHome 31:c72e12cd5c67 300 // colorPalette[i].rgbRed, c);
WiredHome 31:c72e12cd5c67 301 return c;
WiredHome 31:c72e12cd5c67 302 }
WiredHome 29:422616aa04bd 303
WiredHome 29:422616aa04bd 304
WiredHome 31:c72e12cd5c67 305 RetCode_t GraphicsDisplay::BMP_16(unsigned int x, unsigned int y, const char *Name_BMP)
WiredHome 31:c72e12cd5c67 306 {
WiredHome 31:c72e12cd5c67 307 #define OffsetPixelWidth 18
WiredHome 31:c72e12cd5c67 308 #define OffsetPixelHeight 22
WiredHome 31:c72e12cd5c67 309 #define OffsetFileSize 34
WiredHome 31:c72e12cd5c67 310 #define OffsetPixData 10
WiredHome 31:c72e12cd5c67 311 #define OffsetBPP 28
WiredHome 31:c72e12cd5c67 312
WiredHome 31:c72e12cd5c67 313 char filename[50];
WiredHome 31:c72e12cd5c67 314 BITMAPFILEHEADER BMP_Header;
WiredHome 31:c72e12cd5c67 315 BITMAPINFOHEADER BMP_Info;
WiredHome 31:c72e12cd5c67 316 RGBQUAD * colorPalette = NULL;
WiredHome 31:c72e12cd5c67 317 int colorCount;
WiredHome 31:c72e12cd5c67 318 char * lineBuffer = NULL;
WiredHome 31:c72e12cd5c67 319
WiredHome 31:c72e12cd5c67 320 uint16_t BPP_t;
WiredHome 31:c72e12cd5c67 321 uint32_t PixelWidth, PixelHeight;
WiredHome 31:c72e12cd5c67 322 uint32_t start_data;
WiredHome 31:c72e12cd5c67 323 unsigned int i, offset;
WiredHome 31:c72e12cd5c67 324 int padd,j;
WiredHome 31:c72e12cd5c67 325
WiredHome 31:c72e12cd5c67 326 // get the filename
WiredHome 31:c72e12cd5c67 327 LocalFileSystem local("local");
WiredHome 31:c72e12cd5c67 328 sprintf(filename,"/local/%s", Name_BMP);
WiredHome 31:c72e12cd5c67 329 INFO("Opening {%s}", filename);
WiredHome 31:c72e12cd5c67 330 FILE *Image = fopen(filename, "rb"); // open the bmp file
WiredHome 31:c72e12cd5c67 331 if (!Image) {
WiredHome 31:c72e12cd5c67 332 return(file_not_found);
WiredHome 31:c72e12cd5c67 333 }
WiredHome 31:c72e12cd5c67 334
WiredHome 31:c72e12cd5c67 335 fread(&BMP_Header, 1, sizeof(BMP_Header), Image); // get the BMP Header
WiredHome 31:c72e12cd5c67 336 INFO("bfType %04X", BMP_Header.bfType);
WiredHome 31:c72e12cd5c67 337 //HexDump("BMP_Header", (uint8_t *)&BMP_Header, sizeof(BMP_Header));
WiredHome 31:c72e12cd5c67 338 if (BMP_Header.bfType != BF_TYPE) { // BMP_Header[0] != 0x42 || BMP_Header[1] != 0x4D) { // check magic byte
WiredHome 31:c72e12cd5c67 339 fclose(Image);
WiredHome 31:c72e12cd5c67 340 return(not_bmp_format); // error no BMP file
WiredHome 31:c72e12cd5c67 341 }
WiredHome 31:c72e12cd5c67 342
WiredHome 31:c72e12cd5c67 343 fread(&BMP_Info, 1, sizeof(BMP_Info), Image);
WiredHome 31:c72e12cd5c67 344 //HexDump("BMP_Info", (uint8_t *)&BMP_Info, sizeof(BMP_Info));
WiredHome 31:c72e12cd5c67 345 BPP_t = BMP_Info.biBitCount;
WiredHome 31:c72e12cd5c67 346 INFO("biBitCount %04X", BPP_t);
WiredHome 31:c72e12cd5c67 347 if (BPP_t != 4 && BPP_t != 8 && BPP_t != 16) { // Support 4, 8, 16-bits per pixel
WiredHome 31:c72e12cd5c67 348 fclose(Image);
WiredHome 31:c72e12cd5c67 349 return(not_supported_format);
WiredHome 31:c72e12cd5c67 350 }
WiredHome 31:c72e12cd5c67 351
WiredHome 31:c72e12cd5c67 352 //PixelHeight = BMP_Header[OffsetPixelHeight] + (BMP_Header[OffsetPixelHeight + 1] << 8) + (BMP_Header[OffsetPixelHeight + 2] << 16) + (BMP_Header[OffsetPixelHeight + 3] << 24);
WiredHome 31:c72e12cd5c67 353 //PixelWidth = BMP_Header[OffsetPixelWidth] + (BMP_Header[OffsetPixelWidth + 1] << 8) + (BMP_Header[OffsetPixelWidth + 2] << 16) + (BMP_Header[OffsetPixelWidth + 3] << 24);
WiredHome 31:c72e12cd5c67 354 PixelHeight = BMP_Info.biHeight;
WiredHome 31:c72e12cd5c67 355 PixelWidth = BMP_Info.biWidth;
WiredHome 31:c72e12cd5c67 356 if (PixelHeight > height() + y || PixelWidth > width() + x) {
WiredHome 31:c72e12cd5c67 357 fclose(Image);
WiredHome 31:c72e12cd5c67 358 return(image_too_big);
WiredHome 31:c72e12cd5c67 359 }
WiredHome 31:c72e12cd5c67 360 INFO("(%d,%d) (%d,%d)", x,y, PixelWidth,PixelHeight);
WiredHome 31:c72e12cd5c67 361
WiredHome 31:c72e12cd5c67 362 if (BMP_Info.biBitCount <= 8) {
WiredHome 31:c72e12cd5c67 363 int paletteSize;
WiredHome 31:c72e12cd5c67 364 // Read the color palette
WiredHome 31:c72e12cd5c67 365 colorCount = 1 << BMP_Info.biBitCount;
WiredHome 31:c72e12cd5c67 366 paletteSize = sizeof(RGBQUAD) * colorCount;
WiredHome 31:c72e12cd5c67 367 //INFO("colors: %d, paletteSize: %d", colorCount, paletteSize);
WiredHome 31:c72e12cd5c67 368 colorPalette = (RGBQUAD *)malloc(paletteSize);
WiredHome 31:c72e12cd5c67 369 if (colorPalette == NULL) {
WiredHome 31:c72e12cd5c67 370 fclose(Image);
WiredHome 31:c72e12cd5c67 371 return(not_enough_ram);
WiredHome 31:c72e12cd5c67 372 }
WiredHome 31:c72e12cd5c67 373 fread(colorPalette, 1, paletteSize, Image);
WiredHome 31:c72e12cd5c67 374 HexDump("Color Palette", (uint8_t *)colorPalette, paletteSize);
WiredHome 31:c72e12cd5c67 375 } else {
WiredHome 31:c72e12cd5c67 376 ERR("Bits per pixel > 8 [%d]", BMP_Info.biBitCount);
WiredHome 31:c72e12cd5c67 377 }
WiredHome 31:c72e12cd5c67 378
WiredHome 31:c72e12cd5c67 379 //start_data = BMP_Header[OffsetPixData] + (BMP_Header[OffsetPixData + 1] << 8) + (BMP_Header[OffsetPixData + 2] << 16) + (BMP_Header[OffsetPixData + 3] << 24);
WiredHome 31:c72e12cd5c67 380 start_data = BMP_Header.bfOffBits;
WiredHome 31:c72e12cd5c67 381
WiredHome 31:c72e12cd5c67 382 //HexDump("Raw Data", (uint8_t *)&start_data, 32);
WiredHome 31:c72e12cd5c67 383 int lineBufSize = ((BPP_t * PixelWidth + 31)/32)*4;
WiredHome 31:c72e12cd5c67 384 //INFO("lineBufSize = %d", lineBufSize);
WiredHome 31:c72e12cd5c67 385 lineBuffer = (char *)malloc(lineBufSize);
WiredHome 31:c72e12cd5c67 386 if (lineBuffer == NULL) {
WiredHome 31:c72e12cd5c67 387 free(colorPalette);
WiredHome 31:c72e12cd5c67 388 fclose(Image);
WiredHome 31:c72e12cd5c67 389 return(not_enough_ram);
WiredHome 31:c72e12cd5c67 390 }
WiredHome 31:c72e12cd5c67 391
WiredHome 31:c72e12cd5c67 392 // the bmp lines are padded to multiple of 4 bytes
WiredHome 31:c72e12cd5c67 393 padd = -1;
WiredHome 31:c72e12cd5c67 394 do {
WiredHome 31:c72e12cd5c67 395 padd++;
WiredHome 31:c72e12cd5c67 396 } while ((PixelWidth * sizeof(color_t) + padd) % 4 != 0);
WiredHome 31:c72e12cd5c67 397
WiredHome 31:c72e12cd5c67 398 // Define window for top to bottom and left to right
WiredHome 31:c72e12cd5c67 399 window(x,y, PixelWidth,PixelHeight);
WiredHome 31:c72e12cd5c67 400 //INFO("(%d,%d) (%d,%d)", x,y, PixelWidth,PixelHeight);
WiredHome 31:c72e12cd5c67 401 for (j = PixelHeight - 1; j >= 0; j--) { //Lines bottom up
WiredHome 31:c72e12cd5c67 402 //INFO("line %d", j);
WiredHome 31:c72e12cd5c67 403 offset = start_data + j * (lineBufSize + padd); // start of line
WiredHome 31:c72e12cd5c67 404 fseek(Image, offset, SEEK_SET);
WiredHome 31:c72e12cd5c67 405 fread(lineBuffer, 1, lineBufSize, Image); // read a line - slow !
WiredHome 31:c72e12cd5c67 406 //HexDump("Line", (uint8_t *)lineBuffer, lineBufSize);
WiredHome 31:c72e12cd5c67 407 for (i = 0; i < PixelWidth; i++) { // copy pixel data to TFT
WiredHome 31:c72e12cd5c67 408 if (BPP_t == 4) {
WiredHome 31:c72e12cd5c67 409 uint8_t dPix = lineBuffer[i/2];
WiredHome 31:c72e12cd5c67 410 if ((i & 1) == 0)
WiredHome 31:c72e12cd5c67 411 dPix >>= 4;
WiredHome 31:c72e12cd5c67 412 dPix &= 0x0F;
WiredHome 31:c72e12cd5c67 413 color_t color;
WiredHome 31:c72e12cd5c67 414 color = RGBQuadToRGB16(colorPalette, dPix);
WiredHome 31:c72e12cd5c67 415 putp(color);
WiredHome 31:c72e12cd5c67 416 } else if (BPP_t == 8) {
WiredHome 31:c72e12cd5c67 417 color_t color;
WiredHome 31:c72e12cd5c67 418 color = RGBQuadToRGB16(colorPalette, lineBuffer[i]);
WiredHome 31:c72e12cd5c67 419 putp(color);
WiredHome 31:c72e12cd5c67 420 } else if (BPP_t == 16) {
WiredHome 31:c72e12cd5c67 421 putp(lineBuffer[i] & 0xFF);
WiredHome 31:c72e12cd5c67 422 putp(lineBuffer[i] >> 8);
WiredHome 31:c72e12cd5c67 423 }
WiredHome 31:c72e12cd5c67 424 }
WiredHome 31:c72e12cd5c67 425 }
WiredHome 31:c72e12cd5c67 426 free(lineBuffer);
WiredHome 31:c72e12cd5c67 427 free(colorPalette);
WiredHome 31:c72e12cd5c67 428 fclose(Image);
WiredHome 31:c72e12cd5c67 429 //INFO("Freed and closed");
WiredHome 31:c72e12cd5c67 430 WindowMax();
WiredHome 31:c72e12cd5c67 431 return(noerror);
WiredHome 31:c72e12cd5c67 432 }
WiredHome 31:c72e12cd5c67 433
WiredHome 19:3f82c1161fd2 434 int GraphicsDisplay::columns()
WiredHome 19:3f82c1161fd2 435 {
WiredHome 19:3f82c1161fd2 436 return width() / 8;
dreschpe 0:de9d1462a835 437 }
dreschpe 0:de9d1462a835 438
WiredHome 19:3f82c1161fd2 439 int GraphicsDisplay::rows()
WiredHome 19:3f82c1161fd2 440 {
WiredHome 19:3f82c1161fd2 441 return height() / 8;
WiredHome 19:3f82c1161fd2 442 }
WiredHome 19:3f82c1161fd2 443