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:
Thu Jan 23 23:45:20 2014 +0000
Revision:
34:c99ec28fac66
Parent:
33:b6b710758ab3
Child:
37:f19b7e7449dc
Updated documentation for the RenderBitmapFile function.

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