Foundation classes for a basic GUI implementing simple widgets and events
Dependents: TouchScreenGUIDemo
Font/UGFont/UGFontRenderer.cpp@8:a460cabc85ac, 2016-04-11 (annotated)
- 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?
User | Revision | Line number | New 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 | {} |