// NOT FOR PUBLIC USE //#include // Core graphics library #include // Hardware-specific library #if !defined(AVR) #include #endif #include #include #include #include #include const GFXfont *Fonts[] = { NULL, NULL, &FreeSans9pt7b, //FONT2 NULL, &FreeSans12pt7b, //FONT4 NULL, &FreeSans18pt7b, //FONT6 &FreeSevenSegNumFontPlusPlus, //FONT7 &FreeSevenSegNumFontPlusPlus, //FONT8 // &FreeMonoBold24pt7b, //FONT8 }; //These enumerate the text plotting alignment (reference datum point) #define TL_DATUM 0 // Top left (default) #define TC_DATUM 1 // Top centre #define TR_DATUM 2 // Top right #define ML_DATUM 3 // Middle left #define CL_DATUM 3 // Centre left, same as above #define MC_DATUM 4 // Middle centre #define CC_DATUM 4 // Centre centre, same as above #define MR_DATUM 5 // Middle right #define CR_DATUM 5 // Centre right, same as above #define BL_DATUM 6 // Bottom left #define BC_DATUM 7 // Bottom centre #define BR_DATUM 8 // Bottom right #define L_BASELINE 9 // Left character baseline (Line the 'A' character would sit on) #define C_BASELINE 10 // Centre character baseline #define R_BASELINE 11 // Right character baseline class TFT_PRINTGLUE : public MCUFRIEND_kbv { public: TFT_PRINTGLUE() {} void begin(void) { init(); } void init(void) { MCUFRIEND_kbv::reset(); _ID = MCUFRIEND_kbv::readID(); if (_ID == 0xD3D3) _ID = 0x9486; MCUFRIEND_kbv::begin(_ID); MCUFRIEND_kbv::setRotation(1); _first = true; _datum = TL_DATUM; } void setWindow(int16_t x0, int16_t y0, int16_t x1, int16_t y1) { MCUFRIEND_kbv::setAddrWindow(x0, y0, x1, y1); _first = true; } void pushColors(uint8_t *data, uint16_t len) { MCUFRIEND_kbv::pushColors((uint8_t*)data, len, _first); _first = false; } void pushColors(uint16_t *data, uint8_t len) { MCUFRIEND_kbv::pushColors((uint16_t*)data, len, _first); _first = false; } void pushColors(uint16_t *data, uint16_t len, int first) { MCUFRIEND_kbv::pushColors((uint16_t*)data, len, first); } void pushColor(uint16_t color) { uint16_t c = color; MCUFRIEND_kbv::pushColors(&c, 1, _first); _first = false; } void setCursor(int16_t x, int16_t y, uint8_t idx = 255) { if (idx == 255) idx = _font; //use current font setTextFont(idx); MCUFRIEND_kbv::setCursor(x, y + _ydatum); } void setFreeFont(const GFXfont *pfont) { _font = 1; _ascent = 7; _descent = 1; MCUFRIEND_kbv::setFont(_pfont = pfont); if (pfont != NULL) { int16_t x = 0, y = 0, x1, y1 = 0, x2, y2 = 0; MCUFRIEND_kbv::setTextSize(1); charBounds('0', &x, &y, &x1, &y1, &x2, &y2); _ascent = y2 - y1; //yAdvance GFXfont f; memcpy_P(&f, _pfont, sizeof(f)); if (f.last >= '{' && '{' >= f.first) { charBounds('{', &x, &y, &x1, &y1, &x2, &y2); _descent = y2 - y1 + 1 - _ascent; // } } setTextDatum(_datum); } int16_t drawNumber(long long_num, int16_t poX, int16_t poY, uint8_t idx) { char buf[12]; ltoa(long_num, buf, 10); return drawString(buf, poX, poY, idx); } int16_t drawChar(char c, int16_t poX, int16_t poY, uint8_t idx) { char buf[2]; buf[0] = c; buf[1] = 0; return drawString(buf, poX, poY, idx); } int16_t drawString(const char *string, int16_t poX, int16_t poY, uint8_t idx) { int16_t x1, y1; uint16_t w, h; setTextFont(idx); getTextBounds(string, 0, 50, &x1, &y1, &w, &h); //assume no newlines w += x1; x1 = poX; uint16_t xpad = (_padding > w) ? _padding : w; switch (_datum) { case TC_DATUM: case MC_DATUM: case BC_DATUM: case C_BASELINE: poX -= w / 2; x1 -= xpad / 2; break; case TR_DATUM: case MR_DATUM: case BR_DATUM: case R_BASELINE: poX -= w; x1 -= xpad; break; } if (textcolor != textbgcolor) fillRect(x1, poY + _ydatum - _ascent, xpad, _ascent + _descent, textbgcolor); MCUFRIEND_kbv::setCursor(poX, poY + _ydatum); print(string); return w; } int16_t drawCentreString(const char *string, int16_t poX, int16_t poY, uint8_t idx) { uint8_t datum = _datum; setTextDatum(TC_DATUM); uint16_t len = drawString(string, poX, poY, idx); setTextDatum(datum); return len; } int16_t drawRightString(const char *string, int16_t poX, int16_t poY, uint8_t idx) { uint8_t datum = _datum; setTextDatum(TR_DATUM); uint16_t len = drawString(string, poX, poY, idx); setTextDatum(datum); return len; } int16_t drawFloat(float fp_num, uint8_t dec, int16_t poX, int16_t poY, int16_t idx) { char buf[12]; dtostrf(fp_num, 0, dec, buf); return drawString(buf, poX, poY, idx); } void setTextDatum(uint8_t datum) { _padding = 0; switch (_datum = datum) { case TL_DATUM: case TR_DATUM: case TC_DATUM: _ydatum = _ascent; break; case ML_DATUM: case MR_DATUM: case MC_DATUM: _ydatum = _ascent / 2; break; case BL_DATUM: case BR_DATUM: case BC_DATUM: _ydatum = -_descent; break; case L_BASELINE: case R_BASELINE: case C_BASELINE: _ydatum = 0; break; } } void setTextPadding(uint16_t x_width) { _padding = x_width; } uint8_t fontHeight(uint8_t idx) { GFXfont f; memcpy_P(&f, _pfont, sizeof(f)); return f.yAdvance; } void setTextFont(uint8_t idx) { if (_font == idx) return; _font = idx; setFreeFont(Fonts[_font]); } private: uint16_t _ID, _padding; uint8_t _font, _first, _datum, _ascent, _descent; int8_t _ydatum; const GFXfont *_pfont; };