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:
Tue Feb 04 02:58:06 2014 +0000
Revision:
40:04aa280dfa39
Parent:
37:f19b7e7449dc
Child:
41:2956a0a221e5
Revise SetTextFontSize( ) to require only 1 parameter, and change the type from unsigned to signed to permit easier default detection.

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