Programme complet de bâton de marche sauf capteur cardiaque

Dependencies:   mbed SimpleBLE X_NUCLEO_IDB0XA1 SDFileSystem MBed_Adafruit-GPS-Library Arduino USBDevice

Committer:
zmoutaou
Date:
Mon Jan 27 12:04:30 2020 +0000
Revision:
0:6e330c197193
BMC

Who changed what in which revision?

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