Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetInterface NTPClient mbed-rtos mbed
LedPanel/LedPanel_GFX.cpp@0:7d6abca457ee, 2015-12-23 (annotated)
- Committer:
- mbed_Cookbook_SE
- Date:
- Wed Dec 23 16:17:01 2015 +0000
- Revision:
- 0:7d6abca457ee
??
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| mbed_Cookbook_SE | 0:7d6abca457ee | 1 | /*********************************** |
| mbed_Cookbook_SE | 0:7d6abca457ee | 2 | This is a our graphics core library, for all our displays. |
| mbed_Cookbook_SE | 0:7d6abca457ee | 3 | We'll be adapting all the |
| mbed_Cookbook_SE | 0:7d6abca457ee | 4 | existing libaries to use this core to make updating, support |
| mbed_Cookbook_SE | 0:7d6abca457ee | 5 | and upgrading easier! |
| mbed_Cookbook_SE | 0:7d6abca457ee | 6 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 7 | Adafruit invests time and resources providing this open source code, |
| mbed_Cookbook_SE | 0:7d6abca457ee | 8 | please support Adafruit and open-source hardware by purchasing |
| mbed_Cookbook_SE | 0:7d6abca457ee | 9 | products from Adafruit! |
| mbed_Cookbook_SE | 0:7d6abca457ee | 10 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 11 | Written by Limor Fried/Ladyada for Adafruit Industries. |
| mbed_Cookbook_SE | 0:7d6abca457ee | 12 | BSD license, check license.txt for more information |
| mbed_Cookbook_SE | 0:7d6abca457ee | 13 | All text above must be included in any redistribution |
| mbed_Cookbook_SE | 0:7d6abca457ee | 14 | ****************************************/ |
| mbed_Cookbook_SE | 0:7d6abca457ee | 15 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 16 | /* |
| mbed_Cookbook_SE | 0:7d6abca457ee | 17 | * Modified by Neal Horman 7/14/2012 for use in LPC1768 |
| mbed_Cookbook_SE | 0:7d6abca457ee | 18 | */ |
| mbed_Cookbook_SE | 0:7d6abca457ee | 19 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 20 | /** |
| mbed_Cookbook_SE | 0:7d6abca457ee | 21 | * Matrix16x16 LEDPanel Grafix library |
| mbed_Cookbook_SE | 0:7d6abca457ee | 22 | * |
| mbed_Cookbook_SE | 0:7d6abca457ee | 23 | * @author Junichi Katsu |
| mbed_Cookbook_SE | 0:7d6abca457ee | 24 | * @version 1.0 |
| mbed_Cookbook_SE | 0:7d6abca457ee | 25 | * @date 15-April-2015 |
| mbed_Cookbook_SE | 0:7d6abca457ee | 26 | * |
| mbed_Cookbook_SE | 0:7d6abca457ee | 27 | */ |
| mbed_Cookbook_SE | 0:7d6abca457ee | 28 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 29 | #include "mbed.h" |
| mbed_Cookbook_SE | 0:7d6abca457ee | 30 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 31 | #include "LedPanel_GFX.h" |
| mbed_Cookbook_SE | 0:7d6abca457ee | 32 | #include "font.h" |
| mbed_Cookbook_SE | 0:7d6abca457ee | 33 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 34 | Serial pc(USBTX, USBRX); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 35 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 36 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 37 | LedPanel_GFX::LedPanel_GFX(int16_t w, int16_t h) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 38 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 39 | _rawWidth = w; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 40 | _rawHeight = h; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 41 | _width = w; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 42 | _height = h; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 43 | cursor_x = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 44 | cursor_y = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 45 | textcolor = WHITE; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 46 | textbgcolor = BLACK; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 47 | textsize = 1; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 48 | rotation = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 49 | wrap = true; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 50 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 51 | memcpy( &fnt_head , &font[0] , 18); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 52 | font_head_size = 18 + fnt_head.Tnum * 4; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 53 | for (uint32_t i=0;i<fnt_head.Tnum;i++) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 54 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 55 | fnt_head.Block[i].Start = font[19 + i*4]; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 56 | fnt_head.Block[i].Start <<= 8; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 57 | fnt_head.Block[i].Start |= font[18 + i*4]; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 58 | fnt_head.Block[i].End = font[21 + i*4]; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 59 | fnt_head.Block[i].End <<= 8; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 60 | fnt_head.Block[i].End |= font[20 + i*4]; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 61 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 62 | font_search_tbl[0] = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 63 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 64 | for (uint32_t i=1;i<fnt_head.Tnum;i++) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 65 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 66 | font_search_tbl[i] = (fnt_head.Block[i-1].End - fnt_head.Block[i-1].Start + 1) + font_search_tbl[i-1]; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 67 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 68 | }; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 69 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 70 | #ifdef WANT_ABSTRACTS |
| mbed_Cookbook_SE | 0:7d6abca457ee | 71 | // draw a circle outline |
| mbed_Cookbook_SE | 0:7d6abca457ee | 72 | void LedPanel_GFX::drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 73 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 74 | int16_t f = 1 - r; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 75 | int16_t ddF_x = 1; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 76 | int16_t ddF_y = -2 * r; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 77 | int16_t x = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 78 | int16_t y = r; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 79 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 80 | drawPixel(x0, y0+r, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 81 | drawPixel(x0, y0-r, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 82 | drawPixel(x0+r, y0, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 83 | drawPixel(x0-r, y0, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 84 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 85 | while (x<y) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 86 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 87 | if (f >= 0) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 88 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 89 | y--; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 90 | ddF_y += 2; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 91 | f += ddF_y; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 92 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 93 | x++; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 94 | ddF_x += 2; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 95 | f += ddF_x; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 96 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 97 | drawPixel(x0 + x, y0 + y, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 98 | drawPixel(x0 - x, y0 + y, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 99 | drawPixel(x0 + x, y0 - y, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 100 | drawPixel(x0 - x, y0 - y, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 101 | drawPixel(x0 + y, y0 + x, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 102 | drawPixel(x0 - y, y0 + x, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 103 | drawPixel(x0 + y, y0 - x, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 104 | drawPixel(x0 - y, y0 - x, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 105 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 106 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 107 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 108 | void LedPanel_GFX::drawCircleHelper( int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 109 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 110 | int16_t f = 1 - r; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 111 | int16_t ddF_x = 1; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 112 | int16_t ddF_y = -2 * r; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 113 | int16_t x = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 114 | int16_t y = r; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 115 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 116 | while (x<y) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 117 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 118 | if (f >= 0) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 119 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 120 | y--; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 121 | ddF_y += 2; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 122 | f += ddF_y; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 123 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 124 | x++; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 125 | ddF_x += 2; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 126 | f += ddF_x; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 127 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 128 | if (cornername & 0x4) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 129 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 130 | drawPixel(x0 + x, y0 + y, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 131 | drawPixel(x0 + y, y0 + x, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 132 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 133 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 134 | if (cornername & 0x2) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 135 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 136 | drawPixel(x0 + x, y0 - y, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 137 | drawPixel(x0 + y, y0 - x, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 138 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 139 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 140 | if (cornername & 0x8) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 141 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 142 | drawPixel(x0 - y, y0 + x, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 143 | drawPixel(x0 - x, y0 + y, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 144 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 145 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 146 | if (cornername & 0x1) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 147 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 148 | drawPixel(x0 - y, y0 - x, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 149 | drawPixel(x0 - x, y0 - y, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 150 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 151 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 152 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 153 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 154 | void LedPanel_GFX::fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 155 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 156 | drawFastVLine(x0, y0-r, 2*r+1, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 157 | fillCircleHelper(x0, y0, r, 3, 0, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 158 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 159 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 160 | // used to do circles and roundrects! |
| mbed_Cookbook_SE | 0:7d6abca457ee | 161 | void LedPanel_GFX::fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 162 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 163 | int16_t f = 1 - r; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 164 | int16_t ddF_x = 1; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 165 | int16_t ddF_y = -2 * r; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 166 | int16_t x = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 167 | int16_t y = r; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 168 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 169 | while (x<y) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 170 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 171 | if (f >= 0) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 172 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 173 | y--; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 174 | ddF_y += 2; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 175 | f += ddF_y; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 176 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 177 | x++; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 178 | ddF_x += 2; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 179 | f += ddF_x; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 180 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 181 | if (cornername & 0x1) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 182 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 183 | drawFastVLine(x0+x, y0-y, 2*y+1+delta, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 184 | drawFastVLine(x0+y, y0-x, 2*x+1+delta, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 185 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 186 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 187 | if (cornername & 0x2) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 188 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 189 | drawFastVLine(x0-x, y0-y, 2*y+1+delta, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 190 | drawFastVLine(x0-y, y0-x, 2*x+1+delta, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 191 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 192 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 193 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 194 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 195 | // bresenham's algorithm - thx wikpedia |
| mbed_Cookbook_SE | 0:7d6abca457ee | 196 | void LedPanel_GFX::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 197 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 198 | int16_t steep = abs(y1 - y0) > abs(x1 - x0); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 199 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 200 | if (steep) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 201 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 202 | swap(x0, y0); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 203 | swap(x1, y1); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 204 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 205 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 206 | if (x0 > x1) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 207 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 208 | swap(x0, x1); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 209 | swap(y0, y1); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 210 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 211 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 212 | int16_t dx, dy; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 213 | dx = x1 - x0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 214 | dy = abs(y1 - y0); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 215 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 216 | int16_t err = dx / 2; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 217 | int16_t ystep; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 218 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 219 | if (y0 < y1) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 220 | ystep = 1; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 221 | else |
| mbed_Cookbook_SE | 0:7d6abca457ee | 222 | ystep = -1; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 223 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 224 | for (; x0<=x1; x0++) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 225 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 226 | if (steep) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 227 | drawPixel(y0, x0, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 228 | else |
| mbed_Cookbook_SE | 0:7d6abca457ee | 229 | drawPixel(x0, y0, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 230 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 231 | err -= dy; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 232 | if (err < 0) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 233 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 234 | y0 += ystep; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 235 | err += dx; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 236 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 237 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 238 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 239 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 240 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 241 | // draw a rectangle |
| mbed_Cookbook_SE | 0:7d6abca457ee | 242 | void LedPanel_GFX::drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 243 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 244 | drawFastHLine(x, y, w, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 245 | drawFastHLine(x, y+h-1, w, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 246 | drawFastVLine(x, y, h, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 247 | drawFastVLine(x+w-1, y, h, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 248 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 249 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 250 | void LedPanel_GFX::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 251 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 252 | // stupidest version - update in subclasses if desired! |
| mbed_Cookbook_SE | 0:7d6abca457ee | 253 | drawLine(x, y, x, y+h-1, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 254 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 255 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 256 | void LedPanel_GFX::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 257 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 258 | // stupidest version - update in subclasses if desired! |
| mbed_Cookbook_SE | 0:7d6abca457ee | 259 | drawLine(x, y, x+w-1, y, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 260 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 261 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 262 | void LedPanel_GFX::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 263 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 264 | // stupidest version - update in subclasses if desired! |
| mbed_Cookbook_SE | 0:7d6abca457ee | 265 | for (int16_t i=x; i<x+w; i++) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 266 | drawFastVLine(i, y, h, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 267 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 268 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 269 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 270 | void LedPanel_GFX::fillScreen(uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 271 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 272 | fillRect(0, 0, _width, _height, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 273 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 274 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 275 | // draw a rounded rectangle! |
| mbed_Cookbook_SE | 0:7d6abca457ee | 276 | void LedPanel_GFX::drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 277 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 278 | // smarter version |
| mbed_Cookbook_SE | 0:7d6abca457ee | 279 | drawFastHLine(x+r , y , w-2*r, color); // Top |
| mbed_Cookbook_SE | 0:7d6abca457ee | 280 | drawFastHLine(x+r , y+h-1, w-2*r, color); // Bottom |
| mbed_Cookbook_SE | 0:7d6abca457ee | 281 | drawFastVLine( x , y+r , h-2*r, color); // Left |
| mbed_Cookbook_SE | 0:7d6abca457ee | 282 | drawFastVLine( x+w-1, y+r , h-2*r, color); // Right |
| mbed_Cookbook_SE | 0:7d6abca457ee | 283 | // draw four corners |
| mbed_Cookbook_SE | 0:7d6abca457ee | 284 | drawCircleHelper(x+r , y+r , r, 1, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 285 | drawCircleHelper(x+w-r-1, y+r , r, 2, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 286 | drawCircleHelper(x+w-r-1, y+h-r-1, r, 4, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 287 | drawCircleHelper(x+r , y+h-r-1, r, 8, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 288 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 289 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 290 | // fill a rounded rectangle! |
| mbed_Cookbook_SE | 0:7d6abca457ee | 291 | void LedPanel_GFX::fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 292 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 293 | // smarter version |
| mbed_Cookbook_SE | 0:7d6abca457ee | 294 | fillRect(x+r, y, w-2*r, h, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 295 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 296 | // draw four corners |
| mbed_Cookbook_SE | 0:7d6abca457ee | 297 | fillCircleHelper(x+w-r-1, y+r, r, 1, h-2*r-1, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 298 | fillCircleHelper(x+r , y+r, r, 2, h-2*r-1, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 299 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 300 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 301 | // draw a triangle! |
| mbed_Cookbook_SE | 0:7d6abca457ee | 302 | void LedPanel_GFX::drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 303 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 304 | drawLine(x0, y0, x1, y1, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 305 | drawLine(x1, y1, x2, y2, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 306 | drawLine(x2, y2, x0, y0, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 307 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 308 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 309 | // fill a triangle! |
| mbed_Cookbook_SE | 0:7d6abca457ee | 310 | void LedPanel_GFX::fillTriangle ( int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 311 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 312 | int16_t a, b, y, last; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 313 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 314 | // Sort coordinates by Y order (y2 >= y1 >= y0) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 315 | if (y0 > y1) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 316 | swap(y0, y1); swap(x0, x1); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 317 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 318 | if (y1 > y2) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 319 | swap(y2, y1); swap(x2, x1); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 320 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 321 | if (y0 > y1) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 322 | swap(y0, y1); swap(x0, x1); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 323 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 324 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 325 | if(y0 == y2) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 326 | { // Handle awkward all-on-same-line case as its own thing |
| mbed_Cookbook_SE | 0:7d6abca457ee | 327 | a = b = x0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 328 | if(x1 < a) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 329 | a = x1; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 330 | else if(x1 > b) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 331 | b = x1; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 332 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 333 | if(x2 < a) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 334 | a = x2; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 335 | else if(x2 > b) b = x2; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 336 | drawFastHLine(a, y0, b-a+1, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 337 | return; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 338 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 339 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 340 | int16_t |
| mbed_Cookbook_SE | 0:7d6abca457ee | 341 | dx01 = x1 - x0, |
| mbed_Cookbook_SE | 0:7d6abca457ee | 342 | dy01 = y1 - y0, |
| mbed_Cookbook_SE | 0:7d6abca457ee | 343 | dx02 = x2 - x0, |
| mbed_Cookbook_SE | 0:7d6abca457ee | 344 | dy02 = y2 - y0, |
| mbed_Cookbook_SE | 0:7d6abca457ee | 345 | dx12 = x2 - x1, |
| mbed_Cookbook_SE | 0:7d6abca457ee | 346 | dy12 = y2 - y1, |
| mbed_Cookbook_SE | 0:7d6abca457ee | 347 | sa = 0, |
| mbed_Cookbook_SE | 0:7d6abca457ee | 348 | sb = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 349 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 350 | // For upper part of triangle, find scanline crossings for segments |
| mbed_Cookbook_SE | 0:7d6abca457ee | 351 | // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1 |
| mbed_Cookbook_SE | 0:7d6abca457ee | 352 | // is included here (and second loop will be skipped, avoiding a /0 |
| mbed_Cookbook_SE | 0:7d6abca457ee | 353 | // error there), otherwise scanline y1 is skipped here and handled |
| mbed_Cookbook_SE | 0:7d6abca457ee | 354 | // in the second loop...which also avoids a /0 error here if y0=y1 |
| mbed_Cookbook_SE | 0:7d6abca457ee | 355 | // (flat-topped triangle). |
| mbed_Cookbook_SE | 0:7d6abca457ee | 356 | if(y1 == y2) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 357 | last = y1; // Include y1 scanline |
| mbed_Cookbook_SE | 0:7d6abca457ee | 358 | else |
| mbed_Cookbook_SE | 0:7d6abca457ee | 359 | last = y1-1; // Skip it |
| mbed_Cookbook_SE | 0:7d6abca457ee | 360 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 361 | for(y=y0; y<=last; y++) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 362 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 363 | a = x0 + sa / dy01; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 364 | b = x0 + sb / dy02; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 365 | sa += dx01; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 366 | sb += dx02; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 367 | /* longhand: |
| mbed_Cookbook_SE | 0:7d6abca457ee | 368 | a = x0 + (x1 - x0) * (y - y0) / (y1 - y0); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 369 | b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 370 | */ |
| mbed_Cookbook_SE | 0:7d6abca457ee | 371 | if(a > b) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 372 | swap(a,b); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 373 | drawFastHLine(a, y, b-a+1, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 374 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 375 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 376 | // For lower part of triangle, find scanline crossings for segments |
| mbed_Cookbook_SE | 0:7d6abca457ee | 377 | // 0-2 and 1-2. This loop is skipped if y1=y2. |
| mbed_Cookbook_SE | 0:7d6abca457ee | 378 | sa = dx12 * (y - y1); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 379 | sb = dx02 * (y - y0); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 380 | for(; y<=y2; y++) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 381 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 382 | a = x1 + sa / dy12; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 383 | b = x0 + sb / dy02; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 384 | sa += dx12; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 385 | sb += dx02; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 386 | /* longhand: |
| mbed_Cookbook_SE | 0:7d6abca457ee | 387 | a = x1 + (x2 - x1) * (y - y1) / (y2 - y1); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 388 | b = x0 + (x2 - x0) * (y - y0) / (y2 - y0); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 389 | */ |
| mbed_Cookbook_SE | 0:7d6abca457ee | 390 | if(a > b) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 391 | swap(a,b); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 392 | drawFastHLine(a, y, b-a+1, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 393 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 394 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 395 | #endif |
| mbed_Cookbook_SE | 0:7d6abca457ee | 396 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 397 | void LedPanel_GFX::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 398 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 399 | for (int16_t j=0; j<h; j++) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 400 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 401 | for (int16_t i=0; i<w; i++ ) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 402 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 403 | if (bitmap[i + (j/8)*w] & _BV(j%8)) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 404 | drawPixel(x+i, y+j, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 405 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 406 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 407 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 408 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 409 | size_t LedPanel_GFX::writeChar(uint8_t c) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 410 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 411 | static unsigned char tmp[2] = { 0 , 0 }; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 412 | static int flag = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 413 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 414 | if (c == '\n') |
| mbed_Cookbook_SE | 0:7d6abca457ee | 415 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 416 | cursor_y += textsize*8; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 417 | cursor_x = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 418 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 419 | else if (c == '\r') |
| mbed_Cookbook_SE | 0:7d6abca457ee | 420 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 421 | cursor_x = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 422 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 423 | else if(flag == 1) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 424 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 425 | flag = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 426 | tmp[1] = c; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 427 | draw2Char(cursor_x, cursor_y, tmp, textcolor, textbgcolor, textsize); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 428 | cursor_x += textsize*8; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 429 | if (wrap && (cursor_x > (_width - textsize*8))) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 430 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 431 | cursor_y += textsize*8; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 432 | cursor_x = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 433 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 434 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 435 | else if((c >= 0x81) && (c <= 0xea)) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 436 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 437 | tmp[0] = c; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 438 | flag = 1; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 439 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 440 | else |
| mbed_Cookbook_SE | 0:7d6abca457ee | 441 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 442 | drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 443 | cursor_x += textsize*6; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 444 | if (wrap && (cursor_x > (_width - textsize*6))) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 445 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 446 | cursor_y += textsize*8; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 447 | cursor_x = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 448 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 449 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 450 | return 1; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 451 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 452 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 453 | // draw a character |
| mbed_Cookbook_SE | 0:7d6abca457ee | 454 | void LedPanel_GFX::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 455 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 456 | if( |
| mbed_Cookbook_SE | 0:7d6abca457ee | 457 | (x >= _width) || // Clip right |
| mbed_Cookbook_SE | 0:7d6abca457ee | 458 | (y >= _height) || // Clip bottom |
| mbed_Cookbook_SE | 0:7d6abca457ee | 459 | ((x + 5 * size - 1) < 0) || // Clip left |
| mbed_Cookbook_SE | 0:7d6abca457ee | 460 | ((y + 8 * size - 1) < 0) // Clip top |
| mbed_Cookbook_SE | 0:7d6abca457ee | 461 | ) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 462 | return; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 463 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 464 | for (int8_t i=0; i<6; i++ ) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 465 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 466 | uint8_t line = 0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 467 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 468 | if (i == 5) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 469 | line = 0x0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 470 | else |
| mbed_Cookbook_SE | 0:7d6abca457ee | 471 | line = s_apxFont5x8[(c*5)+i]; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 472 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 473 | for (int8_t j = 0; j<8; j++) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 474 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 475 | if (line & 0x1) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 476 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 477 | if (size == 1) // default size |
| mbed_Cookbook_SE | 0:7d6abca457ee | 478 | drawPixel(x+i, y+j, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 479 | #ifdef WANT_ABSTRACTS |
| mbed_Cookbook_SE | 0:7d6abca457ee | 480 | else // big size |
| mbed_Cookbook_SE | 0:7d6abca457ee | 481 | fillRect(x+(i*size), y+(j*size), size, size, color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 482 | #endif |
| mbed_Cookbook_SE | 0:7d6abca457ee | 483 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 484 | else if (bg != color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 485 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 486 | if (size == 1) // default size |
| mbed_Cookbook_SE | 0:7d6abca457ee | 487 | drawPixel(x+i, y+j, bg); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 488 | #ifdef WANT_ABSTRACTS |
| mbed_Cookbook_SE | 0:7d6abca457ee | 489 | else // big size |
| mbed_Cookbook_SE | 0:7d6abca457ee | 490 | fillRect(x+i*size, y+j*size, size, size, bg); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 491 | #endif |
| mbed_Cookbook_SE | 0:7d6abca457ee | 492 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 493 | line >>= 1; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 494 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 495 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 496 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 497 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 498 | int32_t LedPanel_GFX::search_font_area( uint16_t code ) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 499 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 500 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 501 | for(uint16_t i=0;i<fnt_head.Tnum;i++) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 502 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 503 | if( (fnt_head.Block[i].Start<=code) && (fnt_head.Block[i].End>=code) ) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 504 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 505 | return(i); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 506 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 507 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 508 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 509 | return(-1); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 510 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 511 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 512 | int32_t LedPanel_GFX::get_font_pt( uint16_t code ,uint8_t *chr ) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 513 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 514 | int32_t font_area; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 515 | int32_t offset; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 516 | uint32_t addr; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 517 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 518 | font_area = search_font_area(code); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 519 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 520 | if(font_area == -1) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 521 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 522 | code = 0x81a0; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 523 | font_area = search_font_area(code); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 524 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 525 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 526 | offset = (uint32_t)code - (uint32_t)fnt_head.Block[font_area].Start; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 527 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 528 | addr = ((uint32_t)font_search_tbl[font_area] + offset) * ((fnt_head.XSize >> 3) * fnt_head.YSize); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 529 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 530 | addr += font_head_size; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 531 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 532 | memcpy( chr ,&font[addr] ,8 ); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 533 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 534 | return( 0 ); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 535 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 536 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 537 | // draw a character |
| mbed_Cookbook_SE | 0:7d6abca457ee | 538 | void LedPanel_GFX::draw2Char(int16_t x, int16_t y, unsigned char *c, uint16_t color, uint16_t bg, uint8_t size) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 539 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 540 | if( |
| mbed_Cookbook_SE | 0:7d6abca457ee | 541 | (x >= _width) || // Clip right |
| mbed_Cookbook_SE | 0:7d6abca457ee | 542 | (y >= _height) || // Clip bottom |
| mbed_Cookbook_SE | 0:7d6abca457ee | 543 | ((x + 5 * size - 1) < 0) || // Clip left |
| mbed_Cookbook_SE | 0:7d6abca457ee | 544 | ((y + 8 * size - 1) < 0) // Clip top |
| mbed_Cookbook_SE | 0:7d6abca457ee | 545 | ) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 546 | return; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 547 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 548 | unsigned short tmp; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 549 | unsigned char chr[8]; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 550 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 551 | tmp = c[0]; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 552 | tmp <<= 8; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 553 | tmp |= c[1]; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 554 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 555 | get_font_pt(tmp,&chr[0]); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 556 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 557 | for (int8_t i=0; i<8; i++ ) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 558 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 559 | uint8_t line = chr[i]; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 560 | |
| mbed_Cookbook_SE | 0:7d6abca457ee | 561 | for (int8_t j = 0; j<8; j++) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 562 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 563 | if (line & 0x1) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 564 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 565 | drawPixel(x+(7-i), y+(7-j), color); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 566 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 567 | else if (bg != color) |
| mbed_Cookbook_SE | 0:7d6abca457ee | 568 | { |
| mbed_Cookbook_SE | 0:7d6abca457ee | 569 | drawPixel(x+(7-i), y+(7-j), bg); |
| mbed_Cookbook_SE | 0:7d6abca457ee | 570 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 571 | line >>= 1; |
| mbed_Cookbook_SE | 0:7d6abca457ee | 572 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 573 | } |
| mbed_Cookbook_SE | 0:7d6abca457ee | 574 | } |