Foundation classes for a basic GUI implementing simple widgets and events

Dependents:   TouchScreenGUIDemo

Committer:
duncanFrance
Date:
Mon Apr 11 16:54:02 2016 +0000
Revision:
8:a460cabc85ac
Added GUI for common defaults

Who changed what in which revision?

UserRevisionLine numberNew contents of line
duncanFrance 8:a460cabc85ac 1 #include "UGFontRenderer.h"
duncanFrance 8:a460cabc85ac 2 #include "Arial24x23.h"
duncanFrance 8:a460cabc85ac 3
duncanFrance 8:a460cabc85ac 4 UGFontRenderer::UGFontRenderer() : FontRenderer()
duncanFrance 8:a460cabc85ac 5 {
duncanFrance 8:a460cabc85ac 6 }
duncanFrance 8:a460cabc85ac 7
duncanFrance 8:a460cabc85ac 8 void UGFontRenderer::putc(const char c, GraphicsDisplay* display, Font* font)
duncanFrance 8:a460cabc85ac 9 {
duncanFrance 8:a460cabc85ac 10
duncanFrance 8:a460cabc85ac 11 UGFont* _font = (UGFont*) font;
duncanFrance 8:a460cabc85ac 12 if(!_font->contains(c)) {
duncanFrance 8:a460cabc85ac 13 return;
duncanFrance 8:a460cabc85ac 14 }
duncanFrance 8:a460cabc85ac 15
duncanFrance 8:a460cabc85ac 16 uint8_t cw = _font->zoomedWidthOf(c);
duncanFrance 8:a460cabc85ac 17 uint8_t ch = _font->zoomedHeight();
duncanFrance 8:a460cabc85ac 18
duncanFrance 8:a460cabc85ac 19 bool wrap = (_cx + cw) > _wx1 && !_clip;
duncanFrance 8:a460cabc85ac 20
duncanFrance 8:a460cabc85ac 21 if(c == '\n' || wrap) {
duncanFrance 8:a460cabc85ac 22 _cx = _wx0;
duncanFrance 8:a460cabc85ac 23 _cy += ch;
duncanFrance 8:a460cabc85ac 24 }
duncanFrance 8:a460cabc85ac 25
duncanFrance 8:a460cabc85ac 26 if(cw == 0) {
duncanFrance 8:a460cabc85ac 27 return;
duncanFrance 8:a460cabc85ac 28 }
duncanFrance 8:a460cabc85ac 29
duncanFrance 8:a460cabc85ac 30 // We have to do clipping/wrapping for now because the display doesn't do it for us
duncanFrance 8:a460cabc85ac 31 if((_cx + cw) > _wx1) {
duncanFrance 8:a460cabc85ac 32 // We've done any wrapping already, so if we get here the window must be smaller than the character
duncanFrance 8:a460cabc85ac 33 return;
duncanFrance 8:a460cabc85ac 34 }
duncanFrance 8:a460cabc85ac 35
duncanFrance 8:a460cabc85ac 36 if((_cy + ch) > _wy1) {
duncanFrance 8:a460cabc85ac 37 return;
duncanFrance 8:a460cabc85ac 38 }
duncanFrance 8:a460cabc85ac 39
duncanFrance 8:a460cabc85ac 40
duncanFrance 8:a460cabc85ac 41 uint8_t height = _font->height();
duncanFrance 8:a460cabc85ac 42 uint8_t width = _font->widthOf(c);
duncanFrance 8:a460cabc85ac 43 uint8_t zx = _font->zoomX();
duncanFrance 8:a460cabc85ac 44 uint8_t zy = _font->zoomY();
duncanFrance 8:a460cabc85ac 45 uint8_t bpc = _font->bytesPerCol();
duncanFrance 8:a460cabc85ac 46 uint8_t row, col, v;
duncanFrance 8:a460cabc85ac 47 uint8_t bits, mask;
duncanFrance 8:a460cabc85ac 48
duncanFrance 8:a460cabc85ac 49 // We don't do clipping logic for chars - that's the job of the display
duncanFrance 8:a460cabc85ac 50 // Just set a window into which to render the char and let the display ignore it if it doesn't fit
duncanFrance 8:a460cabc85ac 51 display->window(_cx, _cy, cw, ch);
duncanFrance 8:a460cabc85ac 52
duncanFrance 8:a460cabc85ac 53 uint8_t* glyphData = _font->getGlyphData(c);
duncanFrance 8:a460cabc85ac 54
duncanFrance 8:a460cabc85ac 55 // construct the char into the buffer
duncanFrance 8:a460cabc85ac 56 for (row=0; row < height; row++) { // vert line
duncanFrance 8:a460cabc85ac 57 for (v=0; v < zy; v++) { // repeat horiz line for vertical zooming
duncanFrance 8:a460cabc85ac 58 for (col=0; col < width; col++) { // horz line
duncanFrance 8:a460cabc85ac 59
duncanFrance 8:a460cabc85ac 60 bits = glyphData[(bpc * col) + (row >> 3)];
duncanFrance 8:a460cabc85ac 61
duncanFrance 8:a460cabc85ac 62 mask = 1 << (row & 0x07);
duncanFrance 8:a460cabc85ac 63
duncanFrance 8:a460cabc85ac 64 if (bits & mask) {
duncanFrance 8:a460cabc85ac 65 display->window_pushpixel(_foreground, zx);
duncanFrance 8:a460cabc85ac 66 } else {
duncanFrance 8:a460cabc85ac 67 display->window_pushpixel(_background, zx);
duncanFrance 8:a460cabc85ac 68 }
duncanFrance 8:a460cabc85ac 69 }
duncanFrance 8:a460cabc85ac 70 } //for each zoomed vert
duncanFrance 8:a460cabc85ac 71 }
duncanFrance 8:a460cabc85ac 72 _cx += cw;
duncanFrance 8:a460cabc85ac 73 }
duncanFrance 8:a460cabc85ac 74
duncanFrance 8:a460cabc85ac 75 void UGFontRenderer::puts(const char* c, GraphicsDisplay* display, Font* _font)
duncanFrance 8:a460cabc85ac 76 {}