Adafruit_GFX Library Fixes for mbed os 6.3

Committer:
amouroug
Date:
Tue Oct 06 21:17:51 2020 +0000
Revision:
0:1cac1d87cd89
Adafruit GFX for mbed-os

Who changed what in which revision?

UserRevisionLine numberNew contents of line
amouroug 0:1cac1d87cd89 1 /*
amouroug 0:1cac1d87cd89 2 This is the core graphics library for all our displays, providing a common
amouroug 0:1cac1d87cd89 3 set of graphics primitives (points, lines, circles, etc.). It needs to be
amouroug 0:1cac1d87cd89 4 paired with a hardware-specific library for each display device we carry
amouroug 0:1cac1d87cd89 5 (to handle the lower-level functions).
amouroug 0:1cac1d87cd89 6
amouroug 0:1cac1d87cd89 7 Adafruit invests time and resources providing this open source code, please
amouroug 0:1cac1d87cd89 8 support Adafruit & open-source hardware by purchasing products from Adafruit!
amouroug 0:1cac1d87cd89 9
amouroug 0:1cac1d87cd89 10 Copyright (c) 2013 Adafruit Industries. All rights reserved.
amouroug 0:1cac1d87cd89 11
amouroug 0:1cac1d87cd89 12 Redistribution and use in source and binary forms, with or without
amouroug 0:1cac1d87cd89 13 modification, are permitted provided that the following conditions are met:
amouroug 0:1cac1d87cd89 14
amouroug 0:1cac1d87cd89 15 - Redistributions of source code must retain the above copyright notice,
amouroug 0:1cac1d87cd89 16 this list of conditions and the following disclaimer.
amouroug 0:1cac1d87cd89 17 - Redistributions in binary form must reproduce the above copyright notice,
amouroug 0:1cac1d87cd89 18 this list of conditions and the following disclaimer in the documentation
amouroug 0:1cac1d87cd89 19 and/or other materials provided with the distribution.
amouroug 0:1cac1d87cd89 20
amouroug 0:1cac1d87cd89 21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
amouroug 0:1cac1d87cd89 22 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
amouroug 0:1cac1d87cd89 23 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
amouroug 0:1cac1d87cd89 24 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
amouroug 0:1cac1d87cd89 25 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
amouroug 0:1cac1d87cd89 26 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
amouroug 0:1cac1d87cd89 27 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
amouroug 0:1cac1d87cd89 28 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
amouroug 0:1cac1d87cd89 29 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
amouroug 0:1cac1d87cd89 30 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
amouroug 0:1cac1d87cd89 31 POSSIBILITY OF SUCH DAMAGE.
amouroug 0:1cac1d87cd89 32 */
amouroug 0:1cac1d87cd89 33
amouroug 0:1cac1d87cd89 34 #include "mbed.h"
amouroug 0:1cac1d87cd89 35 #include "Adafruit_GFX.h"
amouroug 0:1cac1d87cd89 36 #include "glcdfont.h"
amouroug 0:1cac1d87cd89 37
amouroug 0:1cac1d87cd89 38 Adafruit_GFX::Adafruit_GFX(int16_t w, int16_t h): WIDTH(w), HEIGHT(h) {
amouroug 0:1cac1d87cd89 39
amouroug 0:1cac1d87cd89 40 _width = WIDTH;
amouroug 0:1cac1d87cd89 41 _height = HEIGHT;
amouroug 0:1cac1d87cd89 42
amouroug 0:1cac1d87cd89 43 rotation = 0;
amouroug 0:1cac1d87cd89 44 cursor_y = cursor_x = 0;
amouroug 0:1cac1d87cd89 45 textsize = 1;
amouroug 0:1cac1d87cd89 46 textcolor = textbgcolor = 0xFFFF;
amouroug 0:1cac1d87cd89 47 wrap = true;
amouroug 0:1cac1d87cd89 48 }
amouroug 0:1cac1d87cd89 49
amouroug 0:1cac1d87cd89 50
amouroug 0:1cac1d87cd89 51 // draw a circle outline
amouroug 0:1cac1d87cd89 52 void Adafruit_GFX::drawCircle(int16_t x0, int16_t y0, int16_t r,
amouroug 0:1cac1d87cd89 53 uint16_t color) {
amouroug 0:1cac1d87cd89 54 int16_t f = 1 - r;
amouroug 0:1cac1d87cd89 55 int16_t ddF_x = 1;
amouroug 0:1cac1d87cd89 56 int16_t ddF_y = -2 * r;
amouroug 0:1cac1d87cd89 57 int16_t x = 0;
amouroug 0:1cac1d87cd89 58 int16_t y = r;
amouroug 0:1cac1d87cd89 59
amouroug 0:1cac1d87cd89 60 drawPixel(x0, y0+r, color);
amouroug 0:1cac1d87cd89 61 drawPixel(x0, y0-r, color);
amouroug 0:1cac1d87cd89 62 drawPixel(x0+r, y0, color);
amouroug 0:1cac1d87cd89 63 drawPixel(x0-r, y0, color);
amouroug 0:1cac1d87cd89 64
amouroug 0:1cac1d87cd89 65 while (x<y) {
amouroug 0:1cac1d87cd89 66 if (f >= 0) {
amouroug 0:1cac1d87cd89 67 y--;
amouroug 0:1cac1d87cd89 68 ddF_y += 2;
amouroug 0:1cac1d87cd89 69 f += ddF_y;
amouroug 0:1cac1d87cd89 70 }
amouroug 0:1cac1d87cd89 71 x++;
amouroug 0:1cac1d87cd89 72 ddF_x += 2;
amouroug 0:1cac1d87cd89 73 f += ddF_x;
amouroug 0:1cac1d87cd89 74
amouroug 0:1cac1d87cd89 75 drawPixel(x0 + x, y0 + y, color);
amouroug 0:1cac1d87cd89 76 drawPixel(x0 - x, y0 + y, color);
amouroug 0:1cac1d87cd89 77 drawPixel(x0 + x, y0 - y, color);
amouroug 0:1cac1d87cd89 78 drawPixel(x0 - x, y0 - y, color);
amouroug 0:1cac1d87cd89 79 drawPixel(x0 + y, y0 + x, color);
amouroug 0:1cac1d87cd89 80 drawPixel(x0 - y, y0 + x, color);
amouroug 0:1cac1d87cd89 81 drawPixel(x0 + y, y0 - x, color);
amouroug 0:1cac1d87cd89 82 drawPixel(x0 - y, y0 - x, color);
amouroug 0:1cac1d87cd89 83
amouroug 0:1cac1d87cd89 84 }
amouroug 0:1cac1d87cd89 85 }
amouroug 0:1cac1d87cd89 86
amouroug 0:1cac1d87cd89 87 void Adafruit_GFX::drawCircleHelper( int16_t x0, int16_t y0,
amouroug 0:1cac1d87cd89 88 int16_t r, uint8_t cornername, uint16_t color) {
amouroug 0:1cac1d87cd89 89 int16_t f = 1 - r;
amouroug 0:1cac1d87cd89 90 int16_t ddF_x = 1;
amouroug 0:1cac1d87cd89 91 int16_t ddF_y = -2 * r;
amouroug 0:1cac1d87cd89 92 int16_t x = 0;
amouroug 0:1cac1d87cd89 93 int16_t y = r;
amouroug 0:1cac1d87cd89 94
amouroug 0:1cac1d87cd89 95 while (x<y) {
amouroug 0:1cac1d87cd89 96 if (f >= 0) {
amouroug 0:1cac1d87cd89 97 y--;
amouroug 0:1cac1d87cd89 98 ddF_y += 2;
amouroug 0:1cac1d87cd89 99 f += ddF_y;
amouroug 0:1cac1d87cd89 100 }
amouroug 0:1cac1d87cd89 101 x++;
amouroug 0:1cac1d87cd89 102 ddF_x += 2;
amouroug 0:1cac1d87cd89 103 f += ddF_x;
amouroug 0:1cac1d87cd89 104 if (cornername & 0x4) {
amouroug 0:1cac1d87cd89 105 drawPixel(x0 + x, y0 + y, color);
amouroug 0:1cac1d87cd89 106 drawPixel(x0 + y, y0 + x, color);
amouroug 0:1cac1d87cd89 107 }
amouroug 0:1cac1d87cd89 108 if (cornername & 0x2) {
amouroug 0:1cac1d87cd89 109 drawPixel(x0 + x, y0 - y, color);
amouroug 0:1cac1d87cd89 110 drawPixel(x0 + y, y0 - x, color);
amouroug 0:1cac1d87cd89 111 }
amouroug 0:1cac1d87cd89 112 if (cornername & 0x8) {
amouroug 0:1cac1d87cd89 113 drawPixel(x0 - y, y0 + x, color);
amouroug 0:1cac1d87cd89 114 drawPixel(x0 - x, y0 + y, color);
amouroug 0:1cac1d87cd89 115 }
amouroug 0:1cac1d87cd89 116 if (cornername & 0x1) {
amouroug 0:1cac1d87cd89 117 drawPixel(x0 - y, y0 - x, color);
amouroug 0:1cac1d87cd89 118 drawPixel(x0 - x, y0 - y, color);
amouroug 0:1cac1d87cd89 119 }
amouroug 0:1cac1d87cd89 120 }
amouroug 0:1cac1d87cd89 121 }
amouroug 0:1cac1d87cd89 122
amouroug 0:1cac1d87cd89 123 void Adafruit_GFX::fillCircle(int16_t x0, int16_t y0, int16_t r,
amouroug 0:1cac1d87cd89 124 uint16_t color) {
amouroug 0:1cac1d87cd89 125 drawFastVLine(x0, y0-r, 2*r+1, color);
amouroug 0:1cac1d87cd89 126 fillCircleHelper(x0, y0, r, 3, 0, color);
amouroug 0:1cac1d87cd89 127 }
amouroug 0:1cac1d87cd89 128
amouroug 0:1cac1d87cd89 129 // used to do circles and roundrects!
amouroug 0:1cac1d87cd89 130 void Adafruit_GFX::fillCircleHelper(int16_t x0, int16_t y0, int16_t r,
amouroug 0:1cac1d87cd89 131 uint8_t cornername, int16_t delta, uint16_t color) {
amouroug 0:1cac1d87cd89 132
amouroug 0:1cac1d87cd89 133 int16_t f = 1 - r;
amouroug 0:1cac1d87cd89 134 int16_t ddF_x = 1;
amouroug 0:1cac1d87cd89 135 int16_t ddF_y = -2 * r;
amouroug 0:1cac1d87cd89 136 int16_t x = 0;
amouroug 0:1cac1d87cd89 137 int16_t y = r;
amouroug 0:1cac1d87cd89 138
amouroug 0:1cac1d87cd89 139 while (x<y) {
amouroug 0:1cac1d87cd89 140 if (f >= 0) {
amouroug 0:1cac1d87cd89 141 y--;
amouroug 0:1cac1d87cd89 142 ddF_y += 2;
amouroug 0:1cac1d87cd89 143 f += ddF_y;
amouroug 0:1cac1d87cd89 144 }
amouroug 0:1cac1d87cd89 145 x++;
amouroug 0:1cac1d87cd89 146 ddF_x += 2;
amouroug 0:1cac1d87cd89 147 f += ddF_x;
amouroug 0:1cac1d87cd89 148
amouroug 0:1cac1d87cd89 149 if (cornername & 0x1) {
amouroug 0:1cac1d87cd89 150 drawFastVLine(x0+x, y0-y, 2*y+1+delta, color);
amouroug 0:1cac1d87cd89 151 drawFastVLine(x0+y, y0-x, 2*x+1+delta, color);
amouroug 0:1cac1d87cd89 152 }
amouroug 0:1cac1d87cd89 153 if (cornername & 0x2) {
amouroug 0:1cac1d87cd89 154 drawFastVLine(x0-x, y0-y, 2*y+1+delta, color);
amouroug 0:1cac1d87cd89 155 drawFastVLine(x0-y, y0-x, 2*x+1+delta, color);
amouroug 0:1cac1d87cd89 156 }
amouroug 0:1cac1d87cd89 157 }
amouroug 0:1cac1d87cd89 158 }
amouroug 0:1cac1d87cd89 159
amouroug 0:1cac1d87cd89 160 // bresenham's algorithm - thx wikpedia
amouroug 0:1cac1d87cd89 161 void Adafruit_GFX::drawLine(int16_t x0, int16_t y0,
amouroug 0:1cac1d87cd89 162 int16_t x1, int16_t y1,
amouroug 0:1cac1d87cd89 163 uint16_t color) {
amouroug 0:1cac1d87cd89 164 int16_t steep = abs(y1 - y0) > abs(x1 - x0);
amouroug 0:1cac1d87cd89 165 if (steep) {
amouroug 0:1cac1d87cd89 166 swap(x0, y0);
amouroug 0:1cac1d87cd89 167 swap(x1, y1);
amouroug 0:1cac1d87cd89 168 }
amouroug 0:1cac1d87cd89 169
amouroug 0:1cac1d87cd89 170 if (x0 > x1) {
amouroug 0:1cac1d87cd89 171 swap(x0, x1);
amouroug 0:1cac1d87cd89 172 swap(y0, y1);
amouroug 0:1cac1d87cd89 173 }
amouroug 0:1cac1d87cd89 174
amouroug 0:1cac1d87cd89 175 int16_t dx, dy;
amouroug 0:1cac1d87cd89 176 dx = x1 - x0;
amouroug 0:1cac1d87cd89 177 dy = abs(y1 - y0);
amouroug 0:1cac1d87cd89 178
amouroug 0:1cac1d87cd89 179 int16_t err = dx / 2;
amouroug 0:1cac1d87cd89 180 int16_t ystep;
amouroug 0:1cac1d87cd89 181
amouroug 0:1cac1d87cd89 182 if (y0 < y1) {
amouroug 0:1cac1d87cd89 183 ystep = 1;
amouroug 0:1cac1d87cd89 184 } else {
amouroug 0:1cac1d87cd89 185 ystep = -1;
amouroug 0:1cac1d87cd89 186 }
amouroug 0:1cac1d87cd89 187
amouroug 0:1cac1d87cd89 188 for (; x0<=x1; x0++) {
amouroug 0:1cac1d87cd89 189 if (steep) {
amouroug 0:1cac1d87cd89 190 drawPixel(y0, x0, color);
amouroug 0:1cac1d87cd89 191 } else {
amouroug 0:1cac1d87cd89 192 drawPixel(x0, y0, color);
amouroug 0:1cac1d87cd89 193 }
amouroug 0:1cac1d87cd89 194 err -= dy;
amouroug 0:1cac1d87cd89 195 if (err < 0) {
amouroug 0:1cac1d87cd89 196 y0 += ystep;
amouroug 0:1cac1d87cd89 197 err += dx;
amouroug 0:1cac1d87cd89 198 }
amouroug 0:1cac1d87cd89 199 }
amouroug 0:1cac1d87cd89 200 }
amouroug 0:1cac1d87cd89 201
amouroug 0:1cac1d87cd89 202
amouroug 0:1cac1d87cd89 203 // draw a rectangle
amouroug 0:1cac1d87cd89 204 void Adafruit_GFX::drawRect(int16_t x, int16_t y,
amouroug 0:1cac1d87cd89 205 int16_t w, int16_t h,
amouroug 0:1cac1d87cd89 206 uint16_t color) {
amouroug 0:1cac1d87cd89 207 drawFastHLine(x, y, w, color);
amouroug 0:1cac1d87cd89 208 drawFastHLine(x, y+h-1, w, color);
amouroug 0:1cac1d87cd89 209 drawFastVLine(x, y, h, color);
amouroug 0:1cac1d87cd89 210 drawFastVLine(x+w-1, y, h, color);
amouroug 0:1cac1d87cd89 211 }
amouroug 0:1cac1d87cd89 212
amouroug 0:1cac1d87cd89 213 void Adafruit_GFX::drawFastVLine(int16_t x, int16_t y,
amouroug 0:1cac1d87cd89 214 int16_t h, uint16_t color) {
amouroug 0:1cac1d87cd89 215 // stupidest version - update in subclasses if desired!
amouroug 0:1cac1d87cd89 216 drawLine(x, y, x, y+h-1, color);
amouroug 0:1cac1d87cd89 217 }
amouroug 0:1cac1d87cd89 218
amouroug 0:1cac1d87cd89 219
amouroug 0:1cac1d87cd89 220 void Adafruit_GFX::drawFastHLine(int16_t x, int16_t y,
amouroug 0:1cac1d87cd89 221 int16_t w, uint16_t color) {
amouroug 0:1cac1d87cd89 222 // stupidest version - update in subclasses if desired!
amouroug 0:1cac1d87cd89 223 drawLine(x, y, x+w-1, y, color);
amouroug 0:1cac1d87cd89 224 }
amouroug 0:1cac1d87cd89 225
amouroug 0:1cac1d87cd89 226 void Adafruit_GFX::fillRect(int16_t x, int16_t y, int16_t w, int16_t h,
amouroug 0:1cac1d87cd89 227 uint16_t color) {
amouroug 0:1cac1d87cd89 228 // stupidest version - update in subclasses if desired!
amouroug 0:1cac1d87cd89 229 for (int16_t i=x; i<x+w; i++) {
amouroug 0:1cac1d87cd89 230 drawFastVLine(i, y, h, color);
amouroug 0:1cac1d87cd89 231 }
amouroug 0:1cac1d87cd89 232 }
amouroug 0:1cac1d87cd89 233
amouroug 0:1cac1d87cd89 234
amouroug 0:1cac1d87cd89 235 void Adafruit_GFX::fillScreen(uint16_t color) {
amouroug 0:1cac1d87cd89 236 fillRect(0, 0, _width, _height, color);
amouroug 0:1cac1d87cd89 237 }
amouroug 0:1cac1d87cd89 238
amouroug 0:1cac1d87cd89 239 // draw a rounded rectangle!
amouroug 0:1cac1d87cd89 240 void Adafruit_GFX::drawRoundRect(int16_t x, int16_t y, int16_t w,
amouroug 0:1cac1d87cd89 241 int16_t h, int16_t r, uint16_t color) {
amouroug 0:1cac1d87cd89 242 // smarter version
amouroug 0:1cac1d87cd89 243 drawFastHLine(x+r , y , w-2*r, color); // Top
amouroug 0:1cac1d87cd89 244 drawFastHLine(x+r , y+h-1, w-2*r, color); // Bottom
amouroug 0:1cac1d87cd89 245 drawFastVLine( x , y+r , h-2*r, color); // Left
amouroug 0:1cac1d87cd89 246 drawFastVLine( x+w-1, y+r , h-2*r, color); // Right
amouroug 0:1cac1d87cd89 247 // draw four corners
amouroug 0:1cac1d87cd89 248 drawCircleHelper(x+r , y+r , r, 1, color);
amouroug 0:1cac1d87cd89 249 drawCircleHelper(x+w-r-1, y+r , r, 2, color);
amouroug 0:1cac1d87cd89 250 drawCircleHelper(x+w-r-1, y+h-r-1, r, 4, color);
amouroug 0:1cac1d87cd89 251 drawCircleHelper(x+r , y+h-r-1, r, 8, color);
amouroug 0:1cac1d87cd89 252 }
amouroug 0:1cac1d87cd89 253
amouroug 0:1cac1d87cd89 254 // fill a rounded rectangle!
amouroug 0:1cac1d87cd89 255 void Adafruit_GFX::fillRoundRect(int16_t x, int16_t y, int16_t w,
amouroug 0:1cac1d87cd89 256 int16_t h, int16_t r, uint16_t color) {
amouroug 0:1cac1d87cd89 257 // smarter version
amouroug 0:1cac1d87cd89 258 fillRect(x+r, y, w-2*r, h, color);
amouroug 0:1cac1d87cd89 259
amouroug 0:1cac1d87cd89 260 // draw four corners
amouroug 0:1cac1d87cd89 261 fillCircleHelper(x+w-r-1, y+r, r, 1, h-2*r-1, color);
amouroug 0:1cac1d87cd89 262 fillCircleHelper(x+r , y+r, r, 2, h-2*r-1, color);
amouroug 0:1cac1d87cd89 263 }
amouroug 0:1cac1d87cd89 264
amouroug 0:1cac1d87cd89 265 // draw a triangle!
amouroug 0:1cac1d87cd89 266 void Adafruit_GFX::drawTriangle(int16_t x0, int16_t y0,
amouroug 0:1cac1d87cd89 267 int16_t x1, int16_t y1,
amouroug 0:1cac1d87cd89 268 int16_t x2, int16_t y2, uint16_t color) {
amouroug 0:1cac1d87cd89 269 drawLine(x0, y0, x1, y1, color);
amouroug 0:1cac1d87cd89 270 drawLine(x1, y1, x2, y2, color);
amouroug 0:1cac1d87cd89 271 drawLine(x2, y2, x0, y0, color);
amouroug 0:1cac1d87cd89 272 }
amouroug 0:1cac1d87cd89 273
amouroug 0:1cac1d87cd89 274 // fill a triangle!
amouroug 0:1cac1d87cd89 275 void Adafruit_GFX::fillTriangle ( int16_t x0, int16_t y0,
amouroug 0:1cac1d87cd89 276 int16_t x1, int16_t y1,
amouroug 0:1cac1d87cd89 277 int16_t x2, int16_t y2, uint16_t color) {
amouroug 0:1cac1d87cd89 278
amouroug 0:1cac1d87cd89 279 int16_t a, b, y, last;
amouroug 0:1cac1d87cd89 280
amouroug 0:1cac1d87cd89 281 // Sort coordinates by Y order (y2 >= y1 >= y0)
amouroug 0:1cac1d87cd89 282 if (y0 > y1) {
amouroug 0:1cac1d87cd89 283 swap(y0, y1); swap(x0, x1);
amouroug 0:1cac1d87cd89 284 }
amouroug 0:1cac1d87cd89 285 if (y1 > y2) {
amouroug 0:1cac1d87cd89 286 swap(y2, y1); swap(x2, x1);
amouroug 0:1cac1d87cd89 287 }
amouroug 0:1cac1d87cd89 288 if (y0 > y1) {
amouroug 0:1cac1d87cd89 289 swap(y0, y1); swap(x0, x1);
amouroug 0:1cac1d87cd89 290 }
amouroug 0:1cac1d87cd89 291
amouroug 0:1cac1d87cd89 292 if(y0 == y2) { // Handle awkward all-on-same-line case as its own thing
amouroug 0:1cac1d87cd89 293 a = b = x0;
amouroug 0:1cac1d87cd89 294 if(x1 < a) a = x1;
amouroug 0:1cac1d87cd89 295 else if(x1 > b) b = x1;
amouroug 0:1cac1d87cd89 296 if(x2 < a) a = x2;
amouroug 0:1cac1d87cd89 297 else if(x2 > b) b = x2;
amouroug 0:1cac1d87cd89 298 drawFastHLine(a, y0, b-a+1, color);
amouroug 0:1cac1d87cd89 299 return;
amouroug 0:1cac1d87cd89 300 }
amouroug 0:1cac1d87cd89 301
amouroug 0:1cac1d87cd89 302 int16_t
amouroug 0:1cac1d87cd89 303 dx01 = x1 - x0,
amouroug 0:1cac1d87cd89 304 dy01 = y1 - y0,
amouroug 0:1cac1d87cd89 305 dx02 = x2 - x0,
amouroug 0:1cac1d87cd89 306 dy02 = y2 - y0,
amouroug 0:1cac1d87cd89 307 dx12 = x2 - x1,
amouroug 0:1cac1d87cd89 308 dy12 = y2 - y1,
amouroug 0:1cac1d87cd89 309 sa = 0,
amouroug 0:1cac1d87cd89 310 sb = 0;
amouroug 0:1cac1d87cd89 311
amouroug 0:1cac1d87cd89 312 // For upper part of triangle, find scanline crossings for segments
amouroug 0:1cac1d87cd89 313 // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1
amouroug 0:1cac1d87cd89 314 // is included here (and second loop will be skipped, avoiding a /0
amouroug 0:1cac1d87cd89 315 // error there), otherwise scanline y1 is skipped here and handled
amouroug 0:1cac1d87cd89 316 // in the second loop...which also avoids a /0 error here if y0=y1
amouroug 0:1cac1d87cd89 317 // (flat-topped triangle).
amouroug 0:1cac1d87cd89 318 if(y1 == y2) last = y1; // Include y1 scanline
amouroug 0:1cac1d87cd89 319 else last = y1-1; // Skip it
amouroug 0:1cac1d87cd89 320
amouroug 0:1cac1d87cd89 321 for(y=y0; y<=last; y++) {
amouroug 0:1cac1d87cd89 322 a = x0 + sa / dy01;
amouroug 0:1cac1d87cd89 323 b = x0 + sb / dy02;
amouroug 0:1cac1d87cd89 324 sa += dx01;
amouroug 0:1cac1d87cd89 325 sb += dx02;
amouroug 0:1cac1d87cd89 326 /* longhand:
amouroug 0:1cac1d87cd89 327 a = x0 + (x1 - x0) * (y - y0) / (y1 - y0);
amouroug 0:1cac1d87cd89 328 b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
amouroug 0:1cac1d87cd89 329 */
amouroug 0:1cac1d87cd89 330 if(a > b) swap(a,b);
amouroug 0:1cac1d87cd89 331 drawFastHLine(a, y, b-a+1, color);
amouroug 0:1cac1d87cd89 332 }
amouroug 0:1cac1d87cd89 333
amouroug 0:1cac1d87cd89 334 // For lower part of triangle, find scanline crossings for segments
amouroug 0:1cac1d87cd89 335 // 0-2 and 1-2. This loop is skipped if y1=y2.
amouroug 0:1cac1d87cd89 336 sa = dx12 * (y - y1);
amouroug 0:1cac1d87cd89 337 sb = dx02 * (y - y0);
amouroug 0:1cac1d87cd89 338 for(; y<=y2; y++) {
amouroug 0:1cac1d87cd89 339 a = x1 + sa / dy12;
amouroug 0:1cac1d87cd89 340 b = x0 + sb / dy02;
amouroug 0:1cac1d87cd89 341 sa += dx12;
amouroug 0:1cac1d87cd89 342 sb += dx02;
amouroug 0:1cac1d87cd89 343 /* longhand:
amouroug 0:1cac1d87cd89 344 a = x1 + (x2 - x1) * (y - y1) / (y2 - y1);
amouroug 0:1cac1d87cd89 345 b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
amouroug 0:1cac1d87cd89 346 */
amouroug 0:1cac1d87cd89 347 if(a > b) swap(a,b);
amouroug 0:1cac1d87cd89 348 drawFastHLine(a, y, b-a+1, color);
amouroug 0:1cac1d87cd89 349 }
amouroug 0:1cac1d87cd89 350 }
amouroug 0:1cac1d87cd89 351
amouroug 0:1cac1d87cd89 352 void Adafruit_GFX::drawBitmap(int16_t x, int16_t y,
amouroug 0:1cac1d87cd89 353 const uint8_t *bitmap, int16_t w, int16_t h,
amouroug 0:1cac1d87cd89 354 uint16_t color) {
amouroug 0:1cac1d87cd89 355
amouroug 0:1cac1d87cd89 356 int16_t i, j, byteWidth = (w + 7) / 8;
amouroug 0:1cac1d87cd89 357
amouroug 0:1cac1d87cd89 358 for(j=0; j<h; j++) {
amouroug 0:1cac1d87cd89 359 for(i=0; i<w; i++ ) {
amouroug 0:1cac1d87cd89 360 // if(pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) {
amouroug 0:1cac1d87cd89 361 if(bitmap[ j * byteWidth + i / 8] & (128 >> (i & 7))) {
amouroug 0:1cac1d87cd89 362 drawPixel(x+i, y+j, color);
amouroug 0:1cac1d87cd89 363 }
amouroug 0:1cac1d87cd89 364 }
amouroug 0:1cac1d87cd89 365 }
amouroug 0:1cac1d87cd89 366 }
amouroug 0:1cac1d87cd89 367
amouroug 0:1cac1d87cd89 368 int Adafruit_GFX::_putc(int c) {
amouroug 0:1cac1d87cd89 369 if (c == '\n') {
amouroug 0:1cac1d87cd89 370 cursor_y += textsize*8;
amouroug 0:1cac1d87cd89 371 cursor_x = 0;
amouroug 0:1cac1d87cd89 372 } else if (c == '\r') {
amouroug 0:1cac1d87cd89 373 // skip em
amouroug 0:1cac1d87cd89 374 } else {
amouroug 0:1cac1d87cd89 375 drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);
amouroug 0:1cac1d87cd89 376 cursor_x += textsize*6;
amouroug 0:1cac1d87cd89 377 if (wrap && (cursor_x > (_width - textsize*6))) {
amouroug 0:1cac1d87cd89 378 cursor_y += textsize*8;
amouroug 0:1cac1d87cd89 379 cursor_x = 0;
amouroug 0:1cac1d87cd89 380 }
amouroug 0:1cac1d87cd89 381 }
amouroug 0:1cac1d87cd89 382
amouroug 0:1cac1d87cd89 383 return c;
amouroug 0:1cac1d87cd89 384 }
amouroug 0:1cac1d87cd89 385 int Adafruit_GFX::_getc() {
amouroug 0:1cac1d87cd89 386 return -1;
amouroug 0:1cac1d87cd89 387 }
amouroug 0:1cac1d87cd89 388
amouroug 0:1cac1d87cd89 389 // draw a character
amouroug 0:1cac1d87cd89 390 void Adafruit_GFX::drawChar(int16_t x, int16_t y, unsigned char c,
amouroug 0:1cac1d87cd89 391 uint16_t color, uint16_t bg, uint8_t size) {
amouroug 0:1cac1d87cd89 392
amouroug 0:1cac1d87cd89 393 if((x >= _width) || // Clip right
amouroug 0:1cac1d87cd89 394 (y >= _height) || // Clip bottom
amouroug 0:1cac1d87cd89 395 ((x + 6 * size - 1) < 0) || // Clip left
amouroug 0:1cac1d87cd89 396 ((y + 8 * size - 1) < 0)) // Clip top
amouroug 0:1cac1d87cd89 397 return;
amouroug 0:1cac1d87cd89 398
amouroug 0:1cac1d87cd89 399 for (int8_t i=0; i<6; i++ ) {
amouroug 0:1cac1d87cd89 400 uint8_t line;
amouroug 0:1cac1d87cd89 401 if (i == 5)
amouroug 0:1cac1d87cd89 402 line = 0x0;
amouroug 0:1cac1d87cd89 403 else
amouroug 0:1cac1d87cd89 404 line = font[(c*5)+i];
amouroug 0:1cac1d87cd89 405 for (int8_t j = 0; j<8; j++) {
amouroug 0:1cac1d87cd89 406 if (line & 0x1) {
amouroug 0:1cac1d87cd89 407 if (size == 1) // default size
amouroug 0:1cac1d87cd89 408 drawPixel(x+i, y+j, color);
amouroug 0:1cac1d87cd89 409 else { // big size
amouroug 0:1cac1d87cd89 410 fillRect(x+(i*size), y+(j*size), size, size, color);
amouroug 0:1cac1d87cd89 411 }
amouroug 0:1cac1d87cd89 412 } else if (bg != color) {
amouroug 0:1cac1d87cd89 413 if (size == 1) // default size
amouroug 0:1cac1d87cd89 414 drawPixel(x+i, y+j, bg);
amouroug 0:1cac1d87cd89 415 else { // big size
amouroug 0:1cac1d87cd89 416 fillRect(x+i*size, y+j*size, size, size, bg);
amouroug 0:1cac1d87cd89 417 }
amouroug 0:1cac1d87cd89 418 }
amouroug 0:1cac1d87cd89 419 line >>= 1;
amouroug 0:1cac1d87cd89 420 }
amouroug 0:1cac1d87cd89 421 }
amouroug 0:1cac1d87cd89 422 }
amouroug 0:1cac1d87cd89 423
amouroug 0:1cac1d87cd89 424 void Adafruit_GFX::setCursor(int16_t x, int16_t y) {
amouroug 0:1cac1d87cd89 425 cursor_x = x;
amouroug 0:1cac1d87cd89 426 cursor_y = y;
amouroug 0:1cac1d87cd89 427 }
amouroug 0:1cac1d87cd89 428
amouroug 0:1cac1d87cd89 429
amouroug 0:1cac1d87cd89 430 void Adafruit_GFX::setTextSize(uint8_t s) {
amouroug 0:1cac1d87cd89 431 textsize = (s > 0) ? s : 1;
amouroug 0:1cac1d87cd89 432 }
amouroug 0:1cac1d87cd89 433
amouroug 0:1cac1d87cd89 434
amouroug 0:1cac1d87cd89 435 void Adafruit_GFX::setTextColor(uint16_t c) {
amouroug 0:1cac1d87cd89 436 textcolor = c;
amouroug 0:1cac1d87cd89 437 textbgcolor = c;
amouroug 0:1cac1d87cd89 438 // for 'transparent' background, we'll set the bg
amouroug 0:1cac1d87cd89 439 // to the same as fg instead of using a flag
amouroug 0:1cac1d87cd89 440 }
amouroug 0:1cac1d87cd89 441
amouroug 0:1cac1d87cd89 442 void Adafruit_GFX::setTextColor(uint16_t c, uint16_t b) {
amouroug 0:1cac1d87cd89 443 textcolor = c;
amouroug 0:1cac1d87cd89 444 textbgcolor = b;
amouroug 0:1cac1d87cd89 445 }
amouroug 0:1cac1d87cd89 446
amouroug 0:1cac1d87cd89 447 void Adafruit_GFX::setTextWrap(boolean w) {
amouroug 0:1cac1d87cd89 448 wrap = w;
amouroug 0:1cac1d87cd89 449 }
amouroug 0:1cac1d87cd89 450
amouroug 0:1cac1d87cd89 451 uint8_t Adafruit_GFX::getRotation(void) {
amouroug 0:1cac1d87cd89 452 rotation %= 4;
amouroug 0:1cac1d87cd89 453 return rotation;
amouroug 0:1cac1d87cd89 454 }
amouroug 0:1cac1d87cd89 455
amouroug 0:1cac1d87cd89 456 void Adafruit_GFX::setRotation(uint8_t x) {
amouroug 0:1cac1d87cd89 457 x %= 4; // cant be higher than 3
amouroug 0:1cac1d87cd89 458 rotation = x;
amouroug 0:1cac1d87cd89 459 switch (x) {
amouroug 0:1cac1d87cd89 460 case 0:
amouroug 0:1cac1d87cd89 461 case 2:
amouroug 0:1cac1d87cd89 462 _width = WIDTH;
amouroug 0:1cac1d87cd89 463 _height = HEIGHT;
amouroug 0:1cac1d87cd89 464 break;
amouroug 0:1cac1d87cd89 465 case 1:
amouroug 0:1cac1d87cd89 466 case 3:
amouroug 0:1cac1d87cd89 467 _width = HEIGHT;
amouroug 0:1cac1d87cd89 468 _height = WIDTH;
amouroug 0:1cac1d87cd89 469 break;
amouroug 0:1cac1d87cd89 470 }
amouroug 0:1cac1d87cd89 471 }
amouroug 0:1cac1d87cd89 472
amouroug 0:1cac1d87cd89 473
amouroug 0:1cac1d87cd89 474 void Adafruit_GFX::invertDisplay(boolean i) {
amouroug 0:1cac1d87cd89 475 // do nothing, can be subclassed
amouroug 0:1cac1d87cd89 476 }
amouroug 0:1cac1d87cd89 477
amouroug 0:1cac1d87cd89 478
amouroug 0:1cac1d87cd89 479 // return the size of the display which depends on the rotation!
amouroug 0:1cac1d87cd89 480 int16_t Adafruit_GFX::width(void) {
amouroug 0:1cac1d87cd89 481 return _width;
amouroug 0:1cac1d87cd89 482 }
amouroug 0:1cac1d87cd89 483
amouroug 0:1cac1d87cd89 484 int16_t Adafruit_GFX::height(void) {
amouroug 0:1cac1d87cd89 485 return _height;
amouroug 0:1cac1d87cd89 486 }
amouroug 0:1cac1d87cd89 487