Uses the same fonts as the SPI_TFT_ILI9341 Library (I have many, and a html/php font editor for that)
Diff: SPI_TFT_ILI9225.cpp
- Revision:
- 5:dad648238df3
- Parent:
- 4:44a66bd8c16c
- Child:
- 7:2616ae4dd315
--- a/SPI_TFT_ILI9225.cpp Wed Nov 23 09:41:36 2016 +0000 +++ b/SPI_TFT_ILI9225.cpp Wed Nov 23 10:08:24 2016 +0000 @@ -183,7 +183,7 @@ cls(); linespacing(0); setBacklight(1.0f); - setOrientation(ILI9225_PORTRAIT_L); + setOrientation(ILI9225_LANDSCAPE_B); foreground(COLOR_WHITE); background(COLOR_BLACK); } @@ -204,7 +204,7 @@ void TFT_22_ILI9225::fill(uint16_t color) { - fillRectangle(0, 0, maxX(), maxY(), color); + fillrect(0, 0, maxX(), maxY(), color); } void TFT_22_ILI9225::invert(bool flag) { @@ -288,84 +288,22 @@ return _orientation; } -void TFT_22_ILI9225::drawRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) { - drawLine(x1, y1, x1, y2, color); - drawLine(x1, y1, x2, y1, color); - drawLine(x1, y2, x2, y2, color); - drawLine(x2, y1, x2, y2, color); -} +// Graphics functions + +void TFT_22_ILI9225::pixel(uint16_t x1, uint16_t y1, uint16_t color) { + + if ((x1 >= _maxX) || (y1 >= _maxY)) return; -void TFT_22_ILI9225::fillRectangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) { - - _setWindow(x1, y1, x2, y2); - _startData(); - for (uint16_t t = (y2 - y1 + 1) * (x2 - x1 + 1); t > 0; t--) { - _writeData(color); - } - _endData(); + _setWindow(x1, y1, x1 + 1, y1 + 1); + _orientCoordinates(x1, y1); + _rs = 1; + _cs = 0; + spi.write(color >> 8); + spi.write(color & 0xff); + _cs = 1; } -void TFT_22_ILI9225::drawCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color) { - - int16_t f = 1 - r; - int16_t ddF_x = 1; - int16_t ddF_y = -2 * r; - int16_t x = 0; - int16_t y = r; - - drawPixel(x0, y0 + r, color); - drawPixel(x0, y0 - r, color); - drawPixel(x0 + r, y0, color); - drawPixel(x0 - r, y0, color); - - while (x < y) { - if (f >= 0) { - y--; - ddF_y += 2; - f += ddF_y; - } - x++; - ddF_x += 2; - f += ddF_x; - - drawPixel(x0 + x, y0 + y, color); - drawPixel(x0 - x, y0 + y, color); - drawPixel(x0 + x, y0 - y, color); - drawPixel(x0 - x, y0 - y, color); - drawPixel(x0 + y, y0 + x, color); - drawPixel(x0 - y, y0 + x, color); - drawPixel(x0 + y, y0 - x, color); - drawPixel(x0 - y, y0 - x, color); - } -} - -void TFT_22_ILI9225::fillCircle(uint8_t x0, uint8_t y0, uint8_t radius, uint16_t color) { - - int16_t f = 1 - radius; - int16_t ddF_x = 1; - int16_t ddF_y = -2 * radius; - int16_t x = 0; - int16_t y = radius; - - while (x < y) { - if (f >= 0) { - y--; - ddF_y += 2; - f += ddF_y; - } - x++; - ddF_x += 2; - f += ddF_x; - - drawLine(x0 + x, y0 + y, x0 - x, y0 + y, color); // bottom - drawLine(x0 + x, y0 - y, x0 - x, y0 - y, color); // top - drawLine(x0 + y, y0 - x, x0 + y, y0 + x, color); // right - drawLine(x0 - y, y0 - x, x0 - y, y0 + x, color); // left - } - fillRectangle(x0 - x, y0 - y, x0 + x, y0 + y, color); -} - -void TFT_22_ILI9225::drawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) { +void TFT_22_ILI9225::line(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) { // Classic Bresenham algorithm int16_t steep = abs(y2 - y1) > abs(x2 - x1); @@ -392,8 +330,8 @@ for (; x1 <= x2; x1++) { - if (steep) drawPixel(y1, x1, color); - else drawPixel(x1, y1, color); + if (steep) pixel(y1, x1, color); + else pixel(x1, y1, color); err -= dy; if (err < 0) { @@ -403,17 +341,161 @@ } } -void TFT_22_ILI9225::drawPixel(uint16_t x1, uint16_t y1, uint16_t color) { +void TFT_22_ILI9225::rect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) { + line(x1, y1, x1, y2, color); + line(x1, y1, x2, y1, color); + line(x1, y2, x2, y2, color); + line(x2, y1, x2, y2, color); +} + +void TFT_22_ILI9225::fillrect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) { + + _setWindow(x1, y1, x2, y2); + _startData(); + for (uint16_t t = (y2 - y1 + 1) * (x2 - x1 + 1); t > 0; t--) { + _writeData(color); + } + _endData(); +} + +void TFT_22_ILI9225::circle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color) { + + int16_t f = 1 - r; + int16_t ddF_x = 1; + int16_t ddF_y = -2 * r; + int16_t x = 0; + int16_t y = r; + + pixel(x0, y0 + r, color); + pixel(x0, y0 - r, color); + pixel(x0 + r, y0, color); + pixel(x0 - r, y0, color); - if ((x1 >= _maxX) || (y1 >= _maxY)) return; + while (x < y) { + if (f >= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + + pixel(x0 + x, y0 + y, color); + pixel(x0 - x, y0 + y, color); + pixel(x0 + x, y0 - y, color); + pixel(x0 - x, y0 - y, color); + pixel(x0 + y, y0 + x, color); + pixel(x0 - y, y0 + x, color); + pixel(x0 + y, y0 - x, color); + pixel(x0 - y, y0 - x, color); + } +} + +void TFT_22_ILI9225::fillcircle(uint8_t x0, uint8_t y0, uint8_t radius, uint16_t color) { + + int16_t f = 1 - radius; + int16_t ddF_x = 1; + int16_t ddF_y = -2 * radius; + int16_t x = 0; + int16_t y = radius; + + while (x < y) { + if (f >= 0) { + y--; + ddF_y += 2; + f += ddF_y; + } + x++; + ddF_x += 2; + f += ddF_x; + + line(x0 + x, y0 + y, x0 - x, y0 + y, color); // bottom + line(x0 + x, y0 - y, x0 - x, y0 - y, color); // top + line(x0 + y, y0 - x, x0 + y, y0 + x, color); // right + line(x0 - y, y0 - x, x0 - y, y0 + x, color); // left + } + fillrect(x0 - x, y0 - y, x0 + x, y0 + y, color); +} - _setWindow(x1, y1, x1 + 1, y1 + 1); - _orientCoordinates(x1, y1); - _rs = 1; - _cs = 0; - spi.write(color >> 8); - spi.write(color & 0xff); - _cs = 1; +void TFT_22_ILI9225::triangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, uint16_t color) { + line(x1, y1, x2, y2, color); + line(x2, y2, x3, y3, color); + line(x3, y3, x1, y1, color); +} + +void TFT_22_ILI9225::filltriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, uint16_t color) { + + uint16_t a, b, y, last; + + // Sort coordinates by Y order (y3 >= y2 >= y1) + if (y1 > y2) { + _swap(y1, y2); _swap(x1, x2); + } + if (y2 > y3) { + _swap(y3, y2); _swap(x3, x2); + } + if (y1 > y2) { + _swap(y1, y2); _swap(x1, x2); + } + + if (y1 == y3) { // Handle awkward all-on-same-line case as its own thing + a = b = x1; + if (x2 < a) a = x2; + else if (x2 > b) b = x2; + if (x3 < a) a = x3; + else if (x3 > b) b = x3; + line(a, y1, b, y1, color); + return; + } + + uint16_t dx11 = x2 - x1, + dy11 = y2 - y1, + dx12 = x3 - x1, + dy12 = y3 - y1, + dx22 = x3 - x2, + dy22 = y3 - y2, + sa = 0, + sb = 0; + + // For upper part of triangle, find scanline crossings for segments + // 0-1 and 0-2. If y2=y3 (flat-bottomed triangle), the scanline y2 + // is included here (and second loop will be skipped, avoiding a /0 + // error there), otherwise scanline y2 is skipped here and handled + // in the second loop...which also avoids a /0 error here if y1=y2 + // (flat-topped triangle). + if (y2 == y3) last = y2; // Include y2 scanline + else last = y2 - 1; // Skip it + + for (y = y1; y <= last; y++) { + a = x1 + sa / dy11; + b = x1 + sb / dy12; + sa += dx11; + sb += dx12; + /* longhand: + a = x1 + (x2 - x1) * (y - y1) / (y2 - y1); + b = x1 + (x3 - x1) * (y - y1) / (y3 - y1); + */ + if (a > b) _swap(a, b); + line(a, y, b, y, color); + } + + // For lower part of triangle, find scanline crossings for segments + // 0-2 and 1-2. This loop is skipped if y2=y3. + sa = dx22 * (y - y2); + sb = dx12 * (y - y1); + for (; y <= y3; y++) { + a = x2 + sa / dy22; + b = x1 + sb / dy12; + sa += dx22; + sb += dx12; + /* longhand: + a = x2 + (x3 - x2) * (y - y2) / (y3 - y2); + b = x1 + (x3 - x1) * (y - y1) / (y3 - y1); + */ + if (a > b) _swap(a, b); + line(a, y, b, y, color); + } } uint16_t TFT_22_ILI9225::maxX(void) { @@ -483,86 +565,6 @@ _endData(); } -void TFT_22_ILI9225::drawTriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, uint16_t color) { - drawLine(x1, y1, x2, y2, color); - drawLine(x2, y2, x3, y3, color); - drawLine(x3, y3, x1, y1, color); -} - -void TFT_22_ILI9225::fillTriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, uint16_t color) { - - uint16_t a, b, y, last; - - // Sort coordinates by Y order (y3 >= y2 >= y1) - if (y1 > y2) { - _swap(y1, y2); _swap(x1, x2); - } - if (y2 > y3) { - _swap(y3, y2); _swap(x3, x2); - } - if (y1 > y2) { - _swap(y1, y2); _swap(x1, x2); - } - - if (y1 == y3) { // Handle awkward all-on-same-line case as its own thing - a = b = x1; - if (x2 < a) a = x2; - else if (x2 > b) b = x2; - if (x3 < a) a = x3; - else if (x3 > b) b = x3; - drawLine(a, y1, b, y1, color); - return; - } - - uint16_t dx11 = x2 - x1, - dy11 = y2 - y1, - dx12 = x3 - x1, - dy12 = y3 - y1, - dx22 = x3 - x2, - dy22 = y3 - y2, - sa = 0, - sb = 0; - - // For upper part of triangle, find scanline crossings for segments - // 0-1 and 0-2. If y2=y3 (flat-bottomed triangle), the scanline y2 - // is included here (and second loop will be skipped, avoiding a /0 - // error there), otherwise scanline y2 is skipped here and handled - // in the second loop...which also avoids a /0 error here if y1=y2 - // (flat-topped triangle). - if (y2 == y3) last = y2; // Include y2 scanline - else last = y2 - 1; // Skip it - - for (y = y1; y <= last; y++) { - a = x1 + sa / dy11; - b = x1 + sb / dy12; - sa += dx11; - sb += dx12; - /* longhand: - a = x1 + (x2 - x1) * (y - y1) / (y2 - y1); - b = x1 + (x3 - x1) * (y - y1) / (y3 - y1); - */ - if (a > b) _swap(a, b); - drawLine(a, y, b, y, color); - } - - // For lower part of triangle, find scanline crossings for segments - // 0-2 and 1-2. This loop is skipped if y2=y3. - sa = dx22 * (y - y2); - sb = dx12 * (y - y1); - for (; y <= y3; y++) { - a = x2 + sa / dy22; - b = x1 + sb / dy12; - sa += dx22; - sb += dx12; - /* longhand: - a = x2 + (x3 - x2) * (y - y2) / (y3 - y2); - b = x1 + (x3 - x1) * (y - y1) / (y3 - y1); - */ - if (a > b) _swap(a, b); - drawLine(a, y, b, y, color); - } -} - void TFT_22_ILI9225::setFont(unsigned char* f) { font = f; } @@ -693,14 +695,14 @@ if (fill) { - fillRectangle(x0, y0 + rad, x1, y1 - rad, color); + fillrect(x0, y0 + rad, x1, y1 - rad, color); do { - fillRectangle(x0 - a + rad, y0 - b + rad, a + x1 - rad, y0 - b + rad, color); // 8 --> 1 - fillRectangle(x0 - b + rad, y0 - a + rad, b + x1 - rad, y0 - a + rad, color); // 7 --> 2 - fillRectangle(x0 - b + rad, a + y1 - rad, b + x1 - rad, a + y1 - rad, color); // 6 --> 3 - fillRectangle(x0 - a + rad, b + y1 - rad, a + x1 - rad, b + y1 - rad, color); // 5 --> 4 + fillrect(x0 - a + rad, y0 - b + rad, a + x1 - rad, y0 - b + rad, color); // 8 --> 1 + fillrect(x0 - b + rad, y0 - a + rad, b + x1 - rad, y0 - a + rad, color); // 7 --> 2 + fillrect(x0 - b + rad, a + y1 - rad, b + x1 - rad, a + y1 - rad, color); // 6 --> 3 + fillrect(x0 - a + rad, b + y1 - rad, a + x1 - rad, b + y1 - rad, color); // 5 --> 4 if (P < 0) P += 3 + 2 * a++; @@ -711,24 +713,24 @@ } //fill else { - fillRectangle(x0 + rad, y0, x1 - rad, y0, color); // top - fillRectangle(x0 + rad, y1, x1 - rad, y1, color); // bottom - fillRectangle(x0, y0 + rad, x0, y1 - rad, color); // left - fillRectangle(x1, y0 + rad, x1, y1 - rad, color); // right + fillrect(x0 + rad, y0, x1 - rad, y0, color); // top + fillrect(x0 + rad, y1, x1 - rad, y1, color); // bottom + fillrect(x0, y0 + rad, x0, y1 - rad, color); // left + fillrect(x1, y0 + rad, x1, y1 - rad, color); // right do { - drawPixel(a + x1 - rad, y0 - b + rad, color); // `````` Segment 1 - drawPixel(b + x1 - rad, y0 - a + rad, color); // `````` Segment 2 + pixel(a + x1 - rad, y0 - b + rad, color); // `````` Segment 1 + pixel(b + x1 - rad, y0 - a + rad, color); // `````` Segment 2 - drawPixel(b + x1 - rad, a + y1 - rad, color); // `````` Segment 3 - drawPixel(a + x1 - rad, b + y1 - rad, color); // `````` Segment 4 + pixel(b + x1 - rad, a + y1 - rad, color); // `````` Segment 3 + pixel(a + x1 - rad, b + y1 - rad, color); // `````` Segment 4 - drawPixel(x0 - a + rad, b + y1 - rad, color); // `````` Segment 5 - drawPixel(x0 - b + rad, a + y1 - rad, color); // `````` Segment 6 + pixel(x0 - a + rad, b + y1 - rad, color); // `````` Segment 5 + pixel(x0 - b + rad, a + y1 - rad, color); // `````` Segment 6 - drawPixel(x0 - b + rad, y0 - a + rad, color); // `````` Segment 7 - drawPixel(x0 - a + rad, y0 - b + rad, color); // `````` Segment 8 + pixel(x0 - b + rad, y0 - a + rad, color); // `````` Segment 7 + pixel(x0 - a + rad, y0 - b + rad, color); // `````` Segment 8 if (P < 0) P += 3 + 2 * a++;