OLED Display

Dependents:   UltraschallSensor_LowLevelV2

Committer:
marcel1691
Date:
Fri May 27 16:40:07 2016 +0000
Revision:
0:1dee22d82bd2
OLED Display for IoTKit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
marcel1691 0:1dee22d82bd2 1 /***********************************
marcel1691 0:1dee22d82bd2 2 This is a our graphics core library, for all our displays.
marcel1691 0:1dee22d82bd2 3 We'll be adapting all the
marcel1691 0:1dee22d82bd2 4 existing libaries to use this core to make updating, support
marcel1691 0:1dee22d82bd2 5 and upgrading easier!
marcel1691 0:1dee22d82bd2 6
marcel1691 0:1dee22d82bd2 7 Adafruit invests time and resources providing this open source code,
marcel1691 0:1dee22d82bd2 8 please support Adafruit and open-source hardware by purchasing
marcel1691 0:1dee22d82bd2 9 products from Adafruit!
marcel1691 0:1dee22d82bd2 10
marcel1691 0:1dee22d82bd2 11 Written by Limor Fried/Ladyada for Adafruit Industries.
marcel1691 0:1dee22d82bd2 12 BSD license, check license.txt for more information
marcel1691 0:1dee22d82bd2 13 All text above must be included in any redistribution
marcel1691 0:1dee22d82bd2 14 ****************************************/
marcel1691 0:1dee22d82bd2 15
marcel1691 0:1dee22d82bd2 16 /*
marcel1691 0:1dee22d82bd2 17 * Modified by Neal Horman 7/14/2012 for use in mbed
marcel1691 0:1dee22d82bd2 18 */
marcel1691 0:1dee22d82bd2 19
marcel1691 0:1dee22d82bd2 20 #include "mbed.h"
marcel1691 0:1dee22d82bd2 21
marcel1691 0:1dee22d82bd2 22 #include "Adafruit_GFX.h"
marcel1691 0:1dee22d82bd2 23 #include "glcdfont.h"
marcel1691 0:1dee22d82bd2 24
marcel1691 0:1dee22d82bd2 25 #if defined(GFX_WANT_ABSTRACTS)
marcel1691 0:1dee22d82bd2 26 // draw a circle outline
marcel1691 0:1dee22d82bd2 27 void Adafruit_GFX::drawCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color)
marcel1691 0:1dee22d82bd2 28 {
marcel1691 0:1dee22d82bd2 29 int16_t f = 1 - r;
marcel1691 0:1dee22d82bd2 30 int16_t ddF_x = 1;
marcel1691 0:1dee22d82bd2 31 int16_t ddF_y = -2 * r;
marcel1691 0:1dee22d82bd2 32 int16_t x = 0;
marcel1691 0:1dee22d82bd2 33 int16_t y = r;
marcel1691 0:1dee22d82bd2 34
marcel1691 0:1dee22d82bd2 35 drawPixel(x0, y0+r, color);
marcel1691 0:1dee22d82bd2 36 drawPixel(x0, y0-r, color);
marcel1691 0:1dee22d82bd2 37 drawPixel(x0+r, y0, color);
marcel1691 0:1dee22d82bd2 38 drawPixel(x0-r, y0, color);
marcel1691 0:1dee22d82bd2 39
marcel1691 0:1dee22d82bd2 40 while (x<y)
marcel1691 0:1dee22d82bd2 41 {
marcel1691 0:1dee22d82bd2 42 if (f >= 0)
marcel1691 0:1dee22d82bd2 43 {
marcel1691 0:1dee22d82bd2 44 y--;
marcel1691 0:1dee22d82bd2 45 ddF_y += 2;
marcel1691 0:1dee22d82bd2 46 f += ddF_y;
marcel1691 0:1dee22d82bd2 47 }
marcel1691 0:1dee22d82bd2 48 x++;
marcel1691 0:1dee22d82bd2 49 ddF_x += 2;
marcel1691 0:1dee22d82bd2 50 f += ddF_x;
marcel1691 0:1dee22d82bd2 51
marcel1691 0:1dee22d82bd2 52 drawPixel(x0 + x, y0 + y, color);
marcel1691 0:1dee22d82bd2 53 drawPixel(x0 - x, y0 + y, color);
marcel1691 0:1dee22d82bd2 54 drawPixel(x0 + x, y0 - y, color);
marcel1691 0:1dee22d82bd2 55 drawPixel(x0 - x, y0 - y, color);
marcel1691 0:1dee22d82bd2 56 drawPixel(x0 + y, y0 + x, color);
marcel1691 0:1dee22d82bd2 57 drawPixel(x0 - y, y0 + x, color);
marcel1691 0:1dee22d82bd2 58 drawPixel(x0 + y, y0 - x, color);
marcel1691 0:1dee22d82bd2 59 drawPixel(x0 - y, y0 - x, color);
marcel1691 0:1dee22d82bd2 60 }
marcel1691 0:1dee22d82bd2 61 }
marcel1691 0:1dee22d82bd2 62
marcel1691 0:1dee22d82bd2 63 void Adafruit_GFX::drawCircleHelper( int16_t x0, int16_t y0, int16_t r, uint8_t cornername, uint16_t color)
marcel1691 0:1dee22d82bd2 64 {
marcel1691 0:1dee22d82bd2 65 int16_t f = 1 - r;
marcel1691 0:1dee22d82bd2 66 int16_t ddF_x = 1;
marcel1691 0:1dee22d82bd2 67 int16_t ddF_y = -2 * r;
marcel1691 0:1dee22d82bd2 68 int16_t x = 0;
marcel1691 0:1dee22d82bd2 69 int16_t y = r;
marcel1691 0:1dee22d82bd2 70
marcel1691 0:1dee22d82bd2 71 while (x<y)
marcel1691 0:1dee22d82bd2 72 {
marcel1691 0:1dee22d82bd2 73 if (f >= 0)
marcel1691 0:1dee22d82bd2 74 {
marcel1691 0:1dee22d82bd2 75 y--;
marcel1691 0:1dee22d82bd2 76 ddF_y += 2;
marcel1691 0:1dee22d82bd2 77 f += ddF_y;
marcel1691 0:1dee22d82bd2 78 }
marcel1691 0:1dee22d82bd2 79 x++;
marcel1691 0:1dee22d82bd2 80 ddF_x += 2;
marcel1691 0:1dee22d82bd2 81 f += ddF_x;
marcel1691 0:1dee22d82bd2 82
marcel1691 0:1dee22d82bd2 83 if (cornername & 0x4)
marcel1691 0:1dee22d82bd2 84 {
marcel1691 0:1dee22d82bd2 85 drawPixel(x0 + x, y0 + y, color);
marcel1691 0:1dee22d82bd2 86 drawPixel(x0 + y, y0 + x, color);
marcel1691 0:1dee22d82bd2 87 }
marcel1691 0:1dee22d82bd2 88
marcel1691 0:1dee22d82bd2 89 if (cornername & 0x2)
marcel1691 0:1dee22d82bd2 90 {
marcel1691 0:1dee22d82bd2 91 drawPixel(x0 + x, y0 - y, color);
marcel1691 0:1dee22d82bd2 92 drawPixel(x0 + y, y0 - x, color);
marcel1691 0:1dee22d82bd2 93 }
marcel1691 0:1dee22d82bd2 94
marcel1691 0:1dee22d82bd2 95 if (cornername & 0x8)
marcel1691 0:1dee22d82bd2 96 {
marcel1691 0:1dee22d82bd2 97 drawPixel(x0 - y, y0 + x, color);
marcel1691 0:1dee22d82bd2 98 drawPixel(x0 - x, y0 + y, color);
marcel1691 0:1dee22d82bd2 99 }
marcel1691 0:1dee22d82bd2 100
marcel1691 0:1dee22d82bd2 101 if (cornername & 0x1)
marcel1691 0:1dee22d82bd2 102 {
marcel1691 0:1dee22d82bd2 103 drawPixel(x0 - y, y0 - x, color);
marcel1691 0:1dee22d82bd2 104 drawPixel(x0 - x, y0 - y, color);
marcel1691 0:1dee22d82bd2 105 }
marcel1691 0:1dee22d82bd2 106 }
marcel1691 0:1dee22d82bd2 107 }
marcel1691 0:1dee22d82bd2 108
marcel1691 0:1dee22d82bd2 109 void Adafruit_GFX::fillCircle(int16_t x0, int16_t y0, int16_t r, uint16_t color)
marcel1691 0:1dee22d82bd2 110 {
marcel1691 0:1dee22d82bd2 111 drawFastVLine(x0, y0-r, 2*r+1, color);
marcel1691 0:1dee22d82bd2 112 fillCircleHelper(x0, y0, r, 3, 0, color);
marcel1691 0:1dee22d82bd2 113 }
marcel1691 0:1dee22d82bd2 114
marcel1691 0:1dee22d82bd2 115 // used to do circles and roundrects!
marcel1691 0:1dee22d82bd2 116 void Adafruit_GFX::fillCircleHelper(int16_t x0, int16_t y0, int16_t r, uint8_t cornername, int16_t delta, uint16_t color)
marcel1691 0:1dee22d82bd2 117 {
marcel1691 0:1dee22d82bd2 118 int16_t f = 1 - r;
marcel1691 0:1dee22d82bd2 119 int16_t ddF_x = 1;
marcel1691 0:1dee22d82bd2 120 int16_t ddF_y = -2 * r;
marcel1691 0:1dee22d82bd2 121 int16_t x = 0;
marcel1691 0:1dee22d82bd2 122 int16_t y = r;
marcel1691 0:1dee22d82bd2 123
marcel1691 0:1dee22d82bd2 124 while (x<y)
marcel1691 0:1dee22d82bd2 125 {
marcel1691 0:1dee22d82bd2 126 if (f >= 0)
marcel1691 0:1dee22d82bd2 127 {
marcel1691 0:1dee22d82bd2 128 y--;
marcel1691 0:1dee22d82bd2 129 ddF_y += 2;
marcel1691 0:1dee22d82bd2 130 f += ddF_y;
marcel1691 0:1dee22d82bd2 131 }
marcel1691 0:1dee22d82bd2 132 x++;
marcel1691 0:1dee22d82bd2 133 ddF_x += 2;
marcel1691 0:1dee22d82bd2 134 f += ddF_x;
marcel1691 0:1dee22d82bd2 135
marcel1691 0:1dee22d82bd2 136 if (cornername & 0x1)
marcel1691 0:1dee22d82bd2 137 {
marcel1691 0:1dee22d82bd2 138 drawFastVLine(x0+x, y0-y, 2*y+1+delta, color);
marcel1691 0:1dee22d82bd2 139 drawFastVLine(x0+y, y0-x, 2*x+1+delta, color);
marcel1691 0:1dee22d82bd2 140 }
marcel1691 0:1dee22d82bd2 141
marcel1691 0:1dee22d82bd2 142 if (cornername & 0x2)
marcel1691 0:1dee22d82bd2 143 {
marcel1691 0:1dee22d82bd2 144 drawFastVLine(x0-x, y0-y, 2*y+1+delta, color);
marcel1691 0:1dee22d82bd2 145 drawFastVLine(x0-y, y0-x, 2*x+1+delta, color);
marcel1691 0:1dee22d82bd2 146 }
marcel1691 0:1dee22d82bd2 147 }
marcel1691 0:1dee22d82bd2 148 }
marcel1691 0:1dee22d82bd2 149 #endif
marcel1691 0:1dee22d82bd2 150
marcel1691 0:1dee22d82bd2 151 #if defined(GFX_WANT_ABSTRACTS) || defined(GFX_SIZEABLE_TEXT)
marcel1691 0:1dee22d82bd2 152 // bresenham's algorithm - thx wikpedia
marcel1691 0:1dee22d82bd2 153 void Adafruit_GFX::drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color)
marcel1691 0:1dee22d82bd2 154 {
marcel1691 0:1dee22d82bd2 155 int16_t steep = abs(y1 - y0) > abs(x1 - x0);
marcel1691 0:1dee22d82bd2 156
marcel1691 0:1dee22d82bd2 157 if (steep)
marcel1691 0:1dee22d82bd2 158 {
marcel1691 0:1dee22d82bd2 159 swap(x0, y0);
marcel1691 0:1dee22d82bd2 160 swap(x1, y1);
marcel1691 0:1dee22d82bd2 161 }
marcel1691 0:1dee22d82bd2 162
marcel1691 0:1dee22d82bd2 163 if (x0 > x1)
marcel1691 0:1dee22d82bd2 164 {
marcel1691 0:1dee22d82bd2 165 swap(x0, x1);
marcel1691 0:1dee22d82bd2 166 swap(y0, y1);
marcel1691 0:1dee22d82bd2 167 }
marcel1691 0:1dee22d82bd2 168
marcel1691 0:1dee22d82bd2 169 int16_t dx, dy;
marcel1691 0:1dee22d82bd2 170 dx = x1 - x0;
marcel1691 0:1dee22d82bd2 171 dy = abs(y1 - y0);
marcel1691 0:1dee22d82bd2 172
marcel1691 0:1dee22d82bd2 173 int16_t err = dx / 2;
marcel1691 0:1dee22d82bd2 174 int16_t ystep;
marcel1691 0:1dee22d82bd2 175
marcel1691 0:1dee22d82bd2 176 if (y0 < y1)
marcel1691 0:1dee22d82bd2 177 ystep = 1;
marcel1691 0:1dee22d82bd2 178 else
marcel1691 0:1dee22d82bd2 179 ystep = -1;
marcel1691 0:1dee22d82bd2 180
marcel1691 0:1dee22d82bd2 181 for (; x0<=x1; x0++)
marcel1691 0:1dee22d82bd2 182 {
marcel1691 0:1dee22d82bd2 183 if (steep)
marcel1691 0:1dee22d82bd2 184 drawPixel(y0, x0, color);
marcel1691 0:1dee22d82bd2 185 else
marcel1691 0:1dee22d82bd2 186 drawPixel(x0, y0, color);
marcel1691 0:1dee22d82bd2 187
marcel1691 0:1dee22d82bd2 188 err -= dy;
marcel1691 0:1dee22d82bd2 189 if (err < 0)
marcel1691 0:1dee22d82bd2 190 {
marcel1691 0:1dee22d82bd2 191 y0 += ystep;
marcel1691 0:1dee22d82bd2 192 err += dx;
marcel1691 0:1dee22d82bd2 193 }
marcel1691 0:1dee22d82bd2 194 }
marcel1691 0:1dee22d82bd2 195 }
marcel1691 0:1dee22d82bd2 196
marcel1691 0:1dee22d82bd2 197 void Adafruit_GFX::drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color)
marcel1691 0:1dee22d82bd2 198 {
marcel1691 0:1dee22d82bd2 199 // stupidest version - update in subclasses if desired!
marcel1691 0:1dee22d82bd2 200 drawLine(x, y, x, y+h-1, color);
marcel1691 0:1dee22d82bd2 201 }
marcel1691 0:1dee22d82bd2 202
marcel1691 0:1dee22d82bd2 203 void Adafruit_GFX::fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
marcel1691 0:1dee22d82bd2 204 {
marcel1691 0:1dee22d82bd2 205 // stupidest version - update in subclasses if desired!
marcel1691 0:1dee22d82bd2 206 for (int16_t i=x; i<x+w; i++)
marcel1691 0:1dee22d82bd2 207 drawFastVLine(i, y, h, color);
marcel1691 0:1dee22d82bd2 208 }
marcel1691 0:1dee22d82bd2 209 #endif
marcel1691 0:1dee22d82bd2 210
marcel1691 0:1dee22d82bd2 211 #if defined(GFX_WANT_ABSTRACTS)
marcel1691 0:1dee22d82bd2 212 // draw a rectangle
marcel1691 0:1dee22d82bd2 213 void Adafruit_GFX::drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
marcel1691 0:1dee22d82bd2 214 {
marcel1691 0:1dee22d82bd2 215 drawFastHLine(x, y, w, color);
marcel1691 0:1dee22d82bd2 216 drawFastHLine(x, y+h-1, w, color);
marcel1691 0:1dee22d82bd2 217 drawFastVLine(x, y, h, color);
marcel1691 0:1dee22d82bd2 218 drawFastVLine(x+w-1, y, h, color);
marcel1691 0:1dee22d82bd2 219 }
marcel1691 0:1dee22d82bd2 220
marcel1691 0:1dee22d82bd2 221 void Adafruit_GFX::drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color)
marcel1691 0:1dee22d82bd2 222 {
marcel1691 0:1dee22d82bd2 223 // stupidest version - update in subclasses if desired!
marcel1691 0:1dee22d82bd2 224 drawLine(x, y, x+w-1, y, color);
marcel1691 0:1dee22d82bd2 225 }
marcel1691 0:1dee22d82bd2 226
marcel1691 0:1dee22d82bd2 227 void Adafruit_GFX::fillScreen(uint16_t color)
marcel1691 0:1dee22d82bd2 228 {
marcel1691 0:1dee22d82bd2 229 fillRect(0, 0, _width, _height, color);
marcel1691 0:1dee22d82bd2 230 }
marcel1691 0:1dee22d82bd2 231
marcel1691 0:1dee22d82bd2 232 // draw a rounded rectangle!
marcel1691 0:1dee22d82bd2 233 void Adafruit_GFX::drawRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color)
marcel1691 0:1dee22d82bd2 234 {
marcel1691 0:1dee22d82bd2 235 // smarter version
marcel1691 0:1dee22d82bd2 236 drawFastHLine(x+r , y , w-2*r, color); // Top
marcel1691 0:1dee22d82bd2 237 drawFastHLine(x+r , y+h-1, w-2*r, color); // Bottom
marcel1691 0:1dee22d82bd2 238 drawFastVLine( x , y+r , h-2*r, color); // Left
marcel1691 0:1dee22d82bd2 239 drawFastVLine( x+w-1, y+r , h-2*r, color); // Right
marcel1691 0:1dee22d82bd2 240 // draw four corners
marcel1691 0:1dee22d82bd2 241 drawCircleHelper(x+r , y+r , r, 1, color);
marcel1691 0:1dee22d82bd2 242 drawCircleHelper(x+w-r-1, y+r , r, 2, color);
marcel1691 0:1dee22d82bd2 243 drawCircleHelper(x+w-r-1, y+h-r-1, r, 4, color);
marcel1691 0:1dee22d82bd2 244 drawCircleHelper(x+r , y+h-r-1, r, 8, color);
marcel1691 0:1dee22d82bd2 245 }
marcel1691 0:1dee22d82bd2 246
marcel1691 0:1dee22d82bd2 247 // fill a rounded rectangle!
marcel1691 0:1dee22d82bd2 248 void Adafruit_GFX::fillRoundRect(int16_t x, int16_t y, int16_t w, int16_t h, int16_t r, uint16_t color)
marcel1691 0:1dee22d82bd2 249 {
marcel1691 0:1dee22d82bd2 250 // smarter version
marcel1691 0:1dee22d82bd2 251 fillRect(x+r, y, w-2*r, h, color);
marcel1691 0:1dee22d82bd2 252
marcel1691 0:1dee22d82bd2 253 // draw four corners
marcel1691 0:1dee22d82bd2 254 fillCircleHelper(x+w-r-1, y+r, r, 1, h-2*r-1, color);
marcel1691 0:1dee22d82bd2 255 fillCircleHelper(x+r , y+r, r, 2, h-2*r-1, color);
marcel1691 0:1dee22d82bd2 256 }
marcel1691 0:1dee22d82bd2 257
marcel1691 0:1dee22d82bd2 258 // draw a triangle!
marcel1691 0:1dee22d82bd2 259 void Adafruit_GFX::drawTriangle(int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color)
marcel1691 0:1dee22d82bd2 260 {
marcel1691 0:1dee22d82bd2 261 drawLine(x0, y0, x1, y1, color);
marcel1691 0:1dee22d82bd2 262 drawLine(x1, y1, x2, y2, color);
marcel1691 0:1dee22d82bd2 263 drawLine(x2, y2, x0, y0, color);
marcel1691 0:1dee22d82bd2 264 }
marcel1691 0:1dee22d82bd2 265
marcel1691 0:1dee22d82bd2 266 // fill a triangle!
marcel1691 0:1dee22d82bd2 267 void Adafruit_GFX::fillTriangle ( int16_t x0, int16_t y0, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint16_t color)
marcel1691 0:1dee22d82bd2 268 {
marcel1691 0:1dee22d82bd2 269 int16_t a, b, y, last;
marcel1691 0:1dee22d82bd2 270
marcel1691 0:1dee22d82bd2 271 // Sort coordinates by Y order (y2 >= y1 >= y0)
marcel1691 0:1dee22d82bd2 272 if (y0 > y1)
marcel1691 0:1dee22d82bd2 273 swap(y0, y1); swap(x0, x1);
marcel1691 0:1dee22d82bd2 274
marcel1691 0:1dee22d82bd2 275 if (y1 > y2)
marcel1691 0:1dee22d82bd2 276 swap(y2, y1); swap(x2, x1);
marcel1691 0:1dee22d82bd2 277
marcel1691 0:1dee22d82bd2 278 if (y0 > y1)
marcel1691 0:1dee22d82bd2 279 swap(y0, y1); swap(x0, x1);
marcel1691 0:1dee22d82bd2 280
marcel1691 0:1dee22d82bd2 281
marcel1691 0:1dee22d82bd2 282 if(y0 == y2)
marcel1691 0:1dee22d82bd2 283 { // Handle awkward all-on-same-line case as its own thing
marcel1691 0:1dee22d82bd2 284 a = b = x0;
marcel1691 0:1dee22d82bd2 285 if(x1 < a)
marcel1691 0:1dee22d82bd2 286 a = x1;
marcel1691 0:1dee22d82bd2 287 else if(x1 > b)
marcel1691 0:1dee22d82bd2 288 b = x1;
marcel1691 0:1dee22d82bd2 289
marcel1691 0:1dee22d82bd2 290 if(x2 < a)
marcel1691 0:1dee22d82bd2 291 a = x2;
marcel1691 0:1dee22d82bd2 292 else if(x2 > b) b = x2;
marcel1691 0:1dee22d82bd2 293 drawFastHLine(a, y0, b-a+1, color);
marcel1691 0:1dee22d82bd2 294 return;
marcel1691 0:1dee22d82bd2 295 }
marcel1691 0:1dee22d82bd2 296
marcel1691 0:1dee22d82bd2 297 int16_t
marcel1691 0:1dee22d82bd2 298 dx01 = x1 - x0,
marcel1691 0:1dee22d82bd2 299 dy01 = y1 - y0,
marcel1691 0:1dee22d82bd2 300 dx02 = x2 - x0,
marcel1691 0:1dee22d82bd2 301 dy02 = y2 - y0,
marcel1691 0:1dee22d82bd2 302 dx12 = x2 - x1,
marcel1691 0:1dee22d82bd2 303 dy12 = y2 - y1,
marcel1691 0:1dee22d82bd2 304 sa = 0,
marcel1691 0:1dee22d82bd2 305 sb = 0;
marcel1691 0:1dee22d82bd2 306
marcel1691 0:1dee22d82bd2 307 // For upper part of triangle, find scanline crossings for segments
marcel1691 0:1dee22d82bd2 308 // 0-1 and 0-2. If y1=y2 (flat-bottomed triangle), the scanline y1
marcel1691 0:1dee22d82bd2 309 // is included here (and second loop will be skipped, avoiding a /0
marcel1691 0:1dee22d82bd2 310 // error there), otherwise scanline y1 is skipped here and handled
marcel1691 0:1dee22d82bd2 311 // in the second loop...which also avoids a /0 error here if y0=y1
marcel1691 0:1dee22d82bd2 312 // (flat-topped triangle).
marcel1691 0:1dee22d82bd2 313 if(y1 == y2)
marcel1691 0:1dee22d82bd2 314 last = y1; // Include y1 scanline
marcel1691 0:1dee22d82bd2 315 else
marcel1691 0:1dee22d82bd2 316 last = y1-1; // Skip it
marcel1691 0:1dee22d82bd2 317
marcel1691 0:1dee22d82bd2 318 for(y=y0; y<=last; y++)
marcel1691 0:1dee22d82bd2 319 {
marcel1691 0:1dee22d82bd2 320 a = x0 + sa / dy01;
marcel1691 0:1dee22d82bd2 321 b = x0 + sb / dy02;
marcel1691 0:1dee22d82bd2 322 sa += dx01;
marcel1691 0:1dee22d82bd2 323 sb += dx02;
marcel1691 0:1dee22d82bd2 324 /* longhand:
marcel1691 0:1dee22d82bd2 325 a = x0 + (x1 - x0) * (y - y0) / (y1 - y0);
marcel1691 0:1dee22d82bd2 326 b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
marcel1691 0:1dee22d82bd2 327 */
marcel1691 0:1dee22d82bd2 328 if(a > b)
marcel1691 0:1dee22d82bd2 329 swap(a,b);
marcel1691 0:1dee22d82bd2 330 drawFastHLine(a, y, b-a+1, color);
marcel1691 0:1dee22d82bd2 331 }
marcel1691 0:1dee22d82bd2 332
marcel1691 0:1dee22d82bd2 333 // For lower part of triangle, find scanline crossings for segments
marcel1691 0:1dee22d82bd2 334 // 0-2 and 1-2. This loop is skipped if y1=y2.
marcel1691 0:1dee22d82bd2 335 sa = dx12 * (y - y1);
marcel1691 0:1dee22d82bd2 336 sb = dx02 * (y - y0);
marcel1691 0:1dee22d82bd2 337 for(; y<=y2; y++)
marcel1691 0:1dee22d82bd2 338 {
marcel1691 0:1dee22d82bd2 339 a = x1 + sa / dy12;
marcel1691 0:1dee22d82bd2 340 b = x0 + sb / dy02;
marcel1691 0:1dee22d82bd2 341 sa += dx12;
marcel1691 0:1dee22d82bd2 342 sb += dx02;
marcel1691 0:1dee22d82bd2 343 /* longhand:
marcel1691 0:1dee22d82bd2 344 a = x1 + (x2 - x1) * (y - y1) / (y2 - y1);
marcel1691 0:1dee22d82bd2 345 b = x0 + (x2 - x0) * (y - y0) / (y2 - y0);
marcel1691 0:1dee22d82bd2 346 */
marcel1691 0:1dee22d82bd2 347 if(a > b)
marcel1691 0:1dee22d82bd2 348 swap(a,b);
marcel1691 0:1dee22d82bd2 349 drawFastHLine(a, y, b-a+1, color);
marcel1691 0:1dee22d82bd2 350 }
marcel1691 0:1dee22d82bd2 351 }
marcel1691 0:1dee22d82bd2 352
marcel1691 0:1dee22d82bd2 353 void Adafruit_GFX::drawBitmap(int16_t x, int16_t y, const uint8_t *bitmap, int16_t w, int16_t h, uint16_t color)
marcel1691 0:1dee22d82bd2 354 {
marcel1691 0:1dee22d82bd2 355 for (int16_t j=0; j<h; j++)
marcel1691 0:1dee22d82bd2 356 {
marcel1691 0:1dee22d82bd2 357 for (int16_t i=0; i<w; i++ )
marcel1691 0:1dee22d82bd2 358 {
marcel1691 0:1dee22d82bd2 359 if (bitmap[i + (j/8)*w] & _BV(j%8))
marcel1691 0:1dee22d82bd2 360 drawPixel(x+i, y+j, color);
marcel1691 0:1dee22d82bd2 361 }
marcel1691 0:1dee22d82bd2 362 }
marcel1691 0:1dee22d82bd2 363 }
marcel1691 0:1dee22d82bd2 364 #endif
marcel1691 0:1dee22d82bd2 365
marcel1691 0:1dee22d82bd2 366 size_t Adafruit_GFX::writeChar(uint8_t c)
marcel1691 0:1dee22d82bd2 367 {
marcel1691 0:1dee22d82bd2 368 if (c == '\n')
marcel1691 0:1dee22d82bd2 369 {
marcel1691 0:1dee22d82bd2 370 cursor_y += textsize*8;
marcel1691 0:1dee22d82bd2 371 cursor_x = 0;
marcel1691 0:1dee22d82bd2 372 }
marcel1691 0:1dee22d82bd2 373 else if (c == '\r')
marcel1691 0:1dee22d82bd2 374 cursor_x = 0;
marcel1691 0:1dee22d82bd2 375 else
marcel1691 0:1dee22d82bd2 376 {
marcel1691 0:1dee22d82bd2 377 drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize);
marcel1691 0:1dee22d82bd2 378 cursor_x += textsize*6;
marcel1691 0:1dee22d82bd2 379 if (wrap && (cursor_x > (_width - textsize*6)))
marcel1691 0:1dee22d82bd2 380 {
marcel1691 0:1dee22d82bd2 381 cursor_y += textsize*8;
marcel1691 0:1dee22d82bd2 382 cursor_x = 0;
marcel1691 0:1dee22d82bd2 383 }
marcel1691 0:1dee22d82bd2 384 }
marcel1691 0:1dee22d82bd2 385 return 1;
marcel1691 0:1dee22d82bd2 386 }
marcel1691 0:1dee22d82bd2 387
marcel1691 0:1dee22d82bd2 388 // draw a character
marcel1691 0:1dee22d82bd2 389 void Adafruit_GFX::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size)
marcel1691 0:1dee22d82bd2 390 {
marcel1691 0:1dee22d82bd2 391 if(
marcel1691 0:1dee22d82bd2 392 (x >= _width) || // Clip right
marcel1691 0:1dee22d82bd2 393 (y >= _height) || // Clip bottom
marcel1691 0:1dee22d82bd2 394 ((x + 5 * size - 1) < 0) || // Clip left
marcel1691 0:1dee22d82bd2 395 ((y + 8 * size - 1) < 0) // Clip top
marcel1691 0:1dee22d82bd2 396 )
marcel1691 0:1dee22d82bd2 397 return;
marcel1691 0:1dee22d82bd2 398
marcel1691 0:1dee22d82bd2 399 for (int8_t i=0; i<6; i++ )
marcel1691 0:1dee22d82bd2 400 {
marcel1691 0:1dee22d82bd2 401 uint8_t line = 0;
marcel1691 0:1dee22d82bd2 402
marcel1691 0:1dee22d82bd2 403 if (i == 5)
marcel1691 0:1dee22d82bd2 404 line = 0x0;
marcel1691 0:1dee22d82bd2 405 else
marcel1691 0:1dee22d82bd2 406 line = font[(c*5)+i];
marcel1691 0:1dee22d82bd2 407
marcel1691 0:1dee22d82bd2 408 for (int8_t j = 0; j<8; j++)
marcel1691 0:1dee22d82bd2 409 {
marcel1691 0:1dee22d82bd2 410 if (line & 0x1)
marcel1691 0:1dee22d82bd2 411 {
marcel1691 0:1dee22d82bd2 412 #if defined(GFX_WANT_ABSTRACTS) || defined(GFX_SIZEABLE_TEXT)
marcel1691 0:1dee22d82bd2 413 if (size == 1) // default size
marcel1691 0:1dee22d82bd2 414 drawPixel(x+i, y+j, color);
marcel1691 0:1dee22d82bd2 415 else // big size
marcel1691 0:1dee22d82bd2 416 fillRect(x+(i*size), y+(j*size), size, size, color);
marcel1691 0:1dee22d82bd2 417 #else
marcel1691 0:1dee22d82bd2 418 drawPixel(x+i, y+j, color);
marcel1691 0:1dee22d82bd2 419 #endif
marcel1691 0:1dee22d82bd2 420 }
marcel1691 0:1dee22d82bd2 421 else if (bg != color)
marcel1691 0:1dee22d82bd2 422 {
marcel1691 0:1dee22d82bd2 423 #if defined(GFX_WANT_ABSTRACTS) || defined(GFX_SIZEABLE_TEXT)
marcel1691 0:1dee22d82bd2 424 if (size == 1) // default size
marcel1691 0:1dee22d82bd2 425 drawPixel(x+i, y+j, bg);
marcel1691 0:1dee22d82bd2 426 else // big size
marcel1691 0:1dee22d82bd2 427 fillRect(x+i*size, y+j*size, size, size, bg);
marcel1691 0:1dee22d82bd2 428 #else
marcel1691 0:1dee22d82bd2 429 drawPixel(x+i, y+j, bg);
marcel1691 0:1dee22d82bd2 430 #endif
marcel1691 0:1dee22d82bd2 431 }
marcel1691 0:1dee22d82bd2 432 line >>= 1;
marcel1691 0:1dee22d82bd2 433 }
marcel1691 0:1dee22d82bd2 434 }
marcel1691 0:1dee22d82bd2 435 }
marcel1691 0:1dee22d82bd2 436
marcel1691 0:1dee22d82bd2 437 void Adafruit_GFX::setRotation(uint8_t x)
marcel1691 0:1dee22d82bd2 438 {
marcel1691 0:1dee22d82bd2 439 x %= 4; // cant be higher than 3
marcel1691 0:1dee22d82bd2 440 rotation = x;
marcel1691 0:1dee22d82bd2 441 switch (x)
marcel1691 0:1dee22d82bd2 442 {
marcel1691 0:1dee22d82bd2 443 case 0:
marcel1691 0:1dee22d82bd2 444 case 2:
marcel1691 0:1dee22d82bd2 445 _width = _rawWidth;
marcel1691 0:1dee22d82bd2 446 _height = _rawHeight;
marcel1691 0:1dee22d82bd2 447 break;
marcel1691 0:1dee22d82bd2 448 case 1:
marcel1691 0:1dee22d82bd2 449 case 3:
marcel1691 0:1dee22d82bd2 450 _width = _rawHeight;
marcel1691 0:1dee22d82bd2 451 _height = _rawWidth;
marcel1691 0:1dee22d82bd2 452 break;
marcel1691 0:1dee22d82bd2 453 }
marcel1691 0:1dee22d82bd2 454 }