Utility library for HSP SPo2 HR demo including user interface, board support adn accelerometer.
demoUI/screen/GraphicsDisplay.cpp@0:a12d6976d64c, 2018-12-17 (annotated)
- Committer:
- gmehmet
- Date:
- Mon Dec 17 13:58:56 2018 +0300
- Revision:
- 0:a12d6976d64c
create and put source to HSP demo utility repo
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gmehmet | 0:a12d6976d64c | 1 | /* mbed GraphicsDisplay Display Library Base Class |
gmehmet | 0:a12d6976d64c | 2 | * Copyright (c) 2007-2009 sford |
gmehmet | 0:a12d6976d64c | 3 | * Released under the MIT License: http://mbed.org/license/mit |
gmehmet | 0:a12d6976d64c | 4 | */ |
gmehmet | 0:a12d6976d64c | 5 | |
gmehmet | 0:a12d6976d64c | 6 | #include "../screen/GraphicsDisplay.h" |
gmehmet | 0:a12d6976d64c | 7 | |
gmehmet | 0:a12d6976d64c | 8 | #define incx() x++, dxt += d2xt, t += dxt |
gmehmet | 0:a12d6976d64c | 9 | #define incy() y--, dyt += d2yt, t += dyt |
gmehmet | 0:a12d6976d64c | 10 | |
gmehmet | 0:a12d6976d64c | 11 | const unsigned char FONT8x8[97][8] = { |
gmehmet | 0:a12d6976d64c | 12 | {0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00}, // columns, rows, num_bytes_per_char |
gmehmet | 0:a12d6976d64c | 13 | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // space 0x20 |
gmehmet | 0:a12d6976d64c | 14 | {0x30,0x78,0x78,0x30,0x30,0x00,0x30,0x00}, // ! |
gmehmet | 0:a12d6976d64c | 15 | {0x6C,0x6C,0x6C,0x00,0x00,0x00,0x00,0x00}, // " |
gmehmet | 0:a12d6976d64c | 16 | {0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00}, // # |
gmehmet | 0:a12d6976d64c | 17 | {0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00}, // $ |
gmehmet | 0:a12d6976d64c | 18 | {0x00,0x63,0x66,0x0C,0x18,0x33,0x63,0x00}, // % |
gmehmet | 0:a12d6976d64c | 19 | {0x1C,0x36,0x1C,0x3B,0x6E,0x66,0x3B,0x00}, // & |
gmehmet | 0:a12d6976d64c | 20 | {0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00}, // ' |
gmehmet | 0:a12d6976d64c | 21 | {0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00}, // ( |
gmehmet | 0:a12d6976d64c | 22 | {0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00}, // ) |
gmehmet | 0:a12d6976d64c | 23 | {0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00}, // * |
gmehmet | 0:a12d6976d64c | 24 | {0x00,0x30,0x30,0xFC,0x30,0x30,0x00,0x00}, // + |
gmehmet | 0:a12d6976d64c | 25 | {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30}, // , |
gmehmet | 0:a12d6976d64c | 26 | {0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00}, // - |
gmehmet | 0:a12d6976d64c | 27 | {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00}, // . |
gmehmet | 0:a12d6976d64c | 28 | {0x03,0x06,0x0C,0x18,0x30,0x60,0x40,0x00}, // / (forward slash) |
gmehmet | 0:a12d6976d64c | 29 | {0x3E,0x63,0x63,0x6B,0x63,0x63,0x3E,0x00}, // 0 0x30 |
gmehmet | 0:a12d6976d64c | 30 | {0x18,0x38,0x58,0x18,0x18,0x18,0x7E,0x00}, // 1 |
gmehmet | 0:a12d6976d64c | 31 | {0x3C,0x66,0x06,0x1C,0x30,0x66,0x7E,0x00}, // 2 |
gmehmet | 0:a12d6976d64c | 32 | {0x3C,0x66,0x06,0x1C,0x06,0x66,0x3C,0x00}, // 3 |
gmehmet | 0:a12d6976d64c | 33 | {0x0E,0x1E,0x36,0x66,0x7F,0x06,0x0F,0x00}, // 4 |
gmehmet | 0:a12d6976d64c | 34 | {0x7E,0x60,0x7C,0x06,0x06,0x66,0x3C,0x00}, // 5 |
gmehmet | 0:a12d6976d64c | 35 | {0x1C,0x30,0x60,0x7C,0x66,0x66,0x3C,0x00}, // 6 |
gmehmet | 0:a12d6976d64c | 36 | {0x7E,0x66,0x06,0x0C,0x18,0x18,0x18,0x00}, // 7 |
gmehmet | 0:a12d6976d64c | 37 | {0x3C,0x66,0x66,0x3C,0x66,0x66,0x3C,0x00}, // 8 |
gmehmet | 0:a12d6976d64c | 38 | {0x3C,0x66,0x66,0x3E,0x06,0x0C,0x38,0x00}, // 9 |
gmehmet | 0:a12d6976d64c | 39 | {0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00}, // : |
gmehmet | 0:a12d6976d64c | 40 | {0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30}, // ; |
gmehmet | 0:a12d6976d64c | 41 | {0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x00}, // < |
gmehmet | 0:a12d6976d64c | 42 | {0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00}, // = |
gmehmet | 0:a12d6976d64c | 43 | {0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x00}, // > |
gmehmet | 0:a12d6976d64c | 44 | {0x3C,0x66,0x06,0x0C,0x18,0x00,0x18,0x00}, // ? |
gmehmet | 0:a12d6976d64c | 45 | {0x3E,0x63,0x6F,0x69,0x6F,0x60,0x3E,0x00}, // @ 0x40 |
gmehmet | 0:a12d6976d64c | 46 | {0x18,0x3C,0x66,0x66,0x7E,0x66,0x66,0x00}, // A |
gmehmet | 0:a12d6976d64c | 47 | {0x7E,0x33,0x33,0x3E,0x33,0x33,0x7E,0x00}, // B |
gmehmet | 0:a12d6976d64c | 48 | {0x1E,0x33,0x60,0x60,0x60,0x33,0x1E,0x00}, // C |
gmehmet | 0:a12d6976d64c | 49 | {0x7C,0x36,0x33,0x33,0x33,0x36,0x7C,0x00}, // D |
gmehmet | 0:a12d6976d64c | 50 | {0x7F,0x31,0x34,0x3C,0x34,0x31,0x7F,0x00}, // E |
gmehmet | 0:a12d6976d64c | 51 | {0x7F,0x31,0x34,0x3C,0x34,0x30,0x78,0x00}, // F |
gmehmet | 0:a12d6976d64c | 52 | {0x1E,0x33,0x60,0x60,0x67,0x33,0x1F,0x00}, // G |
gmehmet | 0:a12d6976d64c | 53 | {0x66,0x66,0x66,0x7E,0x66,0x66,0x66,0x00}, // H |
gmehmet | 0:a12d6976d64c | 54 | {0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // I |
gmehmet | 0:a12d6976d64c | 55 | {0x0F,0x06,0x06,0x06,0x66,0x66,0x3C,0x00}, // J |
gmehmet | 0:a12d6976d64c | 56 | {0x73,0x33,0x36,0x3C,0x36,0x33,0x73,0x00}, // K |
gmehmet | 0:a12d6976d64c | 57 | {0x78,0x30,0x30,0x30,0x31,0x33,0x7F,0x00}, // L |
gmehmet | 0:a12d6976d64c | 58 | {0x63,0x77,0x7F,0x7F,0x6B,0x63,0x63,0x00}, // M |
gmehmet | 0:a12d6976d64c | 59 | {0x63,0x73,0x7B,0x6F,0x67,0x63,0x63,0x00}, // N |
gmehmet | 0:a12d6976d64c | 60 | {0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00}, // O |
gmehmet | 0:a12d6976d64c | 61 | {0x7E,0x33,0x33,0x3E,0x30,0x30,0x78,0x00}, // P 0x50 |
gmehmet | 0:a12d6976d64c | 62 | {0x3C,0x66,0x66,0x66,0x6E,0x3C,0x0E,0x00}, // Q |
gmehmet | 0:a12d6976d64c | 63 | {0x7E,0x33,0x33,0x3E,0x36,0x33,0x73,0x00}, // R |
gmehmet | 0:a12d6976d64c | 64 | {0x3C,0x66,0x30,0x18,0x0C,0x66,0x3C,0x00}, // S |
gmehmet | 0:a12d6976d64c | 65 | {0x7E,0x5A,0x18,0x18,0x18,0x18,0x3C,0x00}, // T |
gmehmet | 0:a12d6976d64c | 66 | {0x66,0x66,0x66,0x66,0x66,0x66,0x7E,0x00}, // U |
gmehmet | 0:a12d6976d64c | 67 | {0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00}, // V |
gmehmet | 0:a12d6976d64c | 68 | {0x63,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00}, // W |
gmehmet | 0:a12d6976d64c | 69 | {0x63,0x63,0x36,0x1C,0x1C,0x36,0x63,0x00}, // X |
gmehmet | 0:a12d6976d64c | 70 | {0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00}, // Y |
gmehmet | 0:a12d6976d64c | 71 | {0x7F,0x63,0x46,0x0C,0x19,0x33,0x7F,0x00}, // Z |
gmehmet | 0:a12d6976d64c | 72 | {0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00}, // [ |
gmehmet | 0:a12d6976d64c | 73 | {0x60,0x30,0x18,0x0C,0x06,0x03,0x01,0x00}, // \ (back slash) |
gmehmet | 0:a12d6976d64c | 74 | {0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00}, // ] |
gmehmet | 0:a12d6976d64c | 75 | {0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00}, // ^ |
gmehmet | 0:a12d6976d64c | 76 | {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF}, // _ |
gmehmet | 0:a12d6976d64c | 77 | {0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00}, // ` 0x60 |
gmehmet | 0:a12d6976d64c | 78 | {0x00,0x00,0x3C,0x06,0x3E,0x66,0x3B,0x00}, // a |
gmehmet | 0:a12d6976d64c | 79 | {0x70,0x30,0x3E,0x33,0x33,0x33,0x6E,0x00}, // b |
gmehmet | 0:a12d6976d64c | 80 | {0x00,0x00,0x3C,0x66,0x60,0x66,0x3C,0x00}, // c |
gmehmet | 0:a12d6976d64c | 81 | {0x0E,0x06,0x3E,0x66,0x66,0x66,0x3B,0x00}, // d |
gmehmet | 0:a12d6976d64c | 82 | {0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00}, // e |
gmehmet | 0:a12d6976d64c | 83 | {0x1C,0x36,0x30,0x78,0x30,0x30,0x78,0x00}, // f |
gmehmet | 0:a12d6976d64c | 84 | {0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x7C}, // g |
gmehmet | 0:a12d6976d64c | 85 | {0x70,0x30,0x36,0x3B,0x33,0x33,0x73,0x00}, // h |
gmehmet | 0:a12d6976d64c | 86 | {0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00}, // i |
gmehmet | 0:a12d6976d64c | 87 | {0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C}, // j |
gmehmet | 0:a12d6976d64c | 88 | {0x70,0x30,0x33,0x36,0x3C,0x36,0x73,0x00}, // k |
gmehmet | 0:a12d6976d64c | 89 | {0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00}, // l |
gmehmet | 0:a12d6976d64c | 90 | {0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00}, // m |
gmehmet | 0:a12d6976d64c | 91 | {0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00}, // n |
gmehmet | 0:a12d6976d64c | 92 | {0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00}, // o |
gmehmet | 0:a12d6976d64c | 93 | {0x00,0x00,0x6E,0x33,0x33,0x3E,0x30,0x78}, // p |
gmehmet | 0:a12d6976d64c | 94 | {0x00,0x00,0x3B,0x66,0x66,0x3E,0x06,0x0F}, // q |
gmehmet | 0:a12d6976d64c | 95 | {0x00,0x00,0x6E,0x3B,0x33,0x30,0x78,0x00}, // r |
gmehmet | 0:a12d6976d64c | 96 | {0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00}, // s |
gmehmet | 0:a12d6976d64c | 97 | {0x08,0x18,0x3E,0x18,0x18,0x1A,0x0C,0x00}, // t |
gmehmet | 0:a12d6976d64c | 98 | {0x00,0x00,0x66,0x66,0x66,0x66,0x3B,0x00}, // u |
gmehmet | 0:a12d6976d64c | 99 | {0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00}, // v |
gmehmet | 0:a12d6976d64c | 100 | {0x00,0x00,0x63,0x6B,0x7F,0x7F,0x36,0x00}, // w |
gmehmet | 0:a12d6976d64c | 101 | {0x00,0x00,0x63,0x36,0x1C,0x36,0x63,0x00}, // x |
gmehmet | 0:a12d6976d64c | 102 | {0x00,0x00,0x66,0x66,0x66,0x3E,0x06,0x7C}, // y |
gmehmet | 0:a12d6976d64c | 103 | {0x00,0x00,0x7E,0x4C,0x18,0x32,0x7E,0x00}, // z |
gmehmet | 0:a12d6976d64c | 104 | {0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00}, // { |
gmehmet | 0:a12d6976d64c | 105 | {0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x0C,0x00}, // | |
gmehmet | 0:a12d6976d64c | 106 | {0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00}, // } |
gmehmet | 0:a12d6976d64c | 107 | {0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00}, // ~ |
gmehmet | 0:a12d6976d64c | 108 | {0x1C,0x36,0x36,0x1C,0x00,0x00,0x00,0x00}}; // DEL |
gmehmet | 0:a12d6976d64c | 109 | |
gmehmet | 0:a12d6976d64c | 110 | GraphicsDisplay::GraphicsDisplay(const char *name):TextDisplay(name) { |
gmehmet | 0:a12d6976d64c | 111 | foreground((uint16_t)Black); |
gmehmet | 0:a12d6976d64c | 112 | background((uint16_t)White); |
gmehmet | 0:a12d6976d64c | 113 | // current pixel location |
gmehmet | 0:a12d6976d64c | 114 | _x = 0; |
gmehmet | 0:a12d6976d64c | 115 | _y = 0; |
gmehmet | 0:a12d6976d64c | 116 | // window settings |
gmehmet | 0:a12d6976d64c | 117 | _x1 = 0; |
gmehmet | 0:a12d6976d64c | 118 | _x2 = 0; |
gmehmet | 0:a12d6976d64c | 119 | _y1 = 0; |
gmehmet | 0:a12d6976d64c | 120 | _y2 = 0; |
gmehmet | 0:a12d6976d64c | 121 | } |
gmehmet | 0:a12d6976d64c | 122 | |
gmehmet | 0:a12d6976d64c | 123 | void GraphicsDisplay::character(int column, int row, int value) { |
gmehmet | 0:a12d6976d64c | 124 | if(externalfont){ // send external font |
gmehmet | 0:a12d6976d64c | 125 | unsigned int hor,vert,offset,bpl,j,i,b; |
gmehmet | 0:a12d6976d64c | 126 | const unsigned char* sign; |
gmehmet | 0:a12d6976d64c | 127 | unsigned char z,w; |
gmehmet | 0:a12d6976d64c | 128 | if ((value < 31) || (value > 127)) return; // test char range |
gmehmet | 0:a12d6976d64c | 129 | // read font parameter from start of array |
gmehmet | 0:a12d6976d64c | 130 | offset = font[0]; // bytes / char |
gmehmet | 0:a12d6976d64c | 131 | hor = font[1]; // get hor size of font |
gmehmet | 0:a12d6976d64c | 132 | vert = font[2]; // get vert size of font |
gmehmet | 0:a12d6976d64c | 133 | bpl = font[3]; // bytes per line |
gmehmet | 0:a12d6976d64c | 134 | if (char_x + hor > width()) { |
gmehmet | 0:a12d6976d64c | 135 | char_x = 0; |
gmehmet | 0:a12d6976d64c | 136 | char_y = char_y + vert; |
gmehmet | 0:a12d6976d64c | 137 | if (char_y >= height() - font[2]) { |
gmehmet | 0:a12d6976d64c | 138 | char_y = 0; |
gmehmet | 0:a12d6976d64c | 139 | } |
gmehmet | 0:a12d6976d64c | 140 | } |
gmehmet | 0:a12d6976d64c | 141 | window(char_x, char_y,hor,vert); // char box |
gmehmet | 0:a12d6976d64c | 142 | sign = &font[((value -32) * offset) + 4]; // start of char bitmap |
gmehmet | 0:a12d6976d64c | 143 | w = sign[0]; // width of actual char |
gmehmet | 0:a12d6976d64c | 144 | for (j=0; j<vert; j++) { // vert line |
gmehmet | 0:a12d6976d64c | 145 | for (i=0; i<hor; i++) { // horz line |
gmehmet | 0:a12d6976d64c | 146 | z = sign[bpl * i + ((j & 0xF8) >> 3)+1]; |
gmehmet | 0:a12d6976d64c | 147 | b = 1 << (j & 0x07); |
gmehmet | 0:a12d6976d64c | 148 | if (( z & b ) == 0x00) { |
gmehmet | 0:a12d6976d64c | 149 | putp(_foreground); |
gmehmet | 0:a12d6976d64c | 150 | } |
gmehmet | 0:a12d6976d64c | 151 | else { |
gmehmet | 0:a12d6976d64c | 152 | putp(_background); |
gmehmet | 0:a12d6976d64c | 153 | } |
gmehmet | 0:a12d6976d64c | 154 | } |
gmehmet | 0:a12d6976d64c | 155 | } |
gmehmet | 0:a12d6976d64c | 156 | if ((w + 2) < hor) { // x offset to next char |
gmehmet | 0:a12d6976d64c | 157 | char_x += w + 2; |
gmehmet | 0:a12d6976d64c | 158 | } |
gmehmet | 0:a12d6976d64c | 159 | else char_x += hor; |
gmehmet | 0:a12d6976d64c | 160 | } |
gmehmet | 0:a12d6976d64c | 161 | // send default font |
gmehmet | 0:a12d6976d64c | 162 | else { |
gmehmet | 0:a12d6976d64c | 163 | blitbit(column * 8, row * 8, 8, 8, (char*)&(FONT8x8[value - 0x1F][0])); |
gmehmet | 0:a12d6976d64c | 164 | } |
gmehmet | 0:a12d6976d64c | 165 | } |
gmehmet | 0:a12d6976d64c | 166 | |
gmehmet | 0:a12d6976d64c | 167 | void GraphicsDisplay::window(int x, int y, int w, int h) { |
gmehmet | 0:a12d6976d64c | 168 | // current pixel location |
gmehmet | 0:a12d6976d64c | 169 | _x = x; |
gmehmet | 0:a12d6976d64c | 170 | _y = y; |
gmehmet | 0:a12d6976d64c | 171 | // window settings |
gmehmet | 0:a12d6976d64c | 172 | _x1 = x; |
gmehmet | 0:a12d6976d64c | 173 | _x2 = x + w - 1; |
gmehmet | 0:a12d6976d64c | 174 | _y1 = y; |
gmehmet | 0:a12d6976d64c | 175 | _y2 = y + h - 1; |
gmehmet | 0:a12d6976d64c | 176 | } |
gmehmet | 0:a12d6976d64c | 177 | |
gmehmet | 0:a12d6976d64c | 178 | void GraphicsDisplay::putp(int colour) { |
gmehmet | 0:a12d6976d64c | 179 | // put pixel at current pixel location |
gmehmet | 0:a12d6976d64c | 180 | pixel(_x, _y, colour); |
gmehmet | 0:a12d6976d64c | 181 | // update pixel location based on window settings |
gmehmet | 0:a12d6976d64c | 182 | _x++; |
gmehmet | 0:a12d6976d64c | 183 | if(_x > _x2) { |
gmehmet | 0:a12d6976d64c | 184 | _x = _x1; |
gmehmet | 0:a12d6976d64c | 185 | _y++; |
gmehmet | 0:a12d6976d64c | 186 | if(_y > _y2) { |
gmehmet | 0:a12d6976d64c | 187 | _y = _y1; |
gmehmet | 0:a12d6976d64c | 188 | } |
gmehmet | 0:a12d6976d64c | 189 | } |
gmehmet | 0:a12d6976d64c | 190 | } |
gmehmet | 0:a12d6976d64c | 191 | |
gmehmet | 0:a12d6976d64c | 192 | void GraphicsDisplay::rect(int x0, int y0, int x1, int y1, int color) { |
gmehmet | 0:a12d6976d64c | 193 | if (x1 > x0) hline(x0,x1,y0,color); |
gmehmet | 0:a12d6976d64c | 194 | else hline(x1,x0,y0,color); |
gmehmet | 0:a12d6976d64c | 195 | if (y1 > y0) vline(x0,y0,y1,color); |
gmehmet | 0:a12d6976d64c | 196 | else vline(x0,y1,y0,color); |
gmehmet | 0:a12d6976d64c | 197 | if (x1 > x0) hline(x0,x1,y1,color); |
gmehmet | 0:a12d6976d64c | 198 | else hline(x1,x0,y1,color); |
gmehmet | 0:a12d6976d64c | 199 | if (y1 > y0) vline(x1,y0,y1,color); |
gmehmet | 0:a12d6976d64c | 200 | else vline(x1,y1,y0,color); |
gmehmet | 0:a12d6976d64c | 201 | return; |
gmehmet | 0:a12d6976d64c | 202 | } |
gmehmet | 0:a12d6976d64c | 203 | |
gmehmet | 0:a12d6976d64c | 204 | void GraphicsDisplay::fillrect(int x0, int y0, int w, int h, int colour) { |
gmehmet | 0:a12d6976d64c | 205 | unsigned long int index=0; |
gmehmet | 0:a12d6976d64c | 206 | if (w < 0) { |
gmehmet | 0:a12d6976d64c | 207 | x0 = x0 + w; |
gmehmet | 0:a12d6976d64c | 208 | w = -w; |
gmehmet | 0:a12d6976d64c | 209 | } |
gmehmet | 0:a12d6976d64c | 210 | if (h < 0) { |
gmehmet | 0:a12d6976d64c | 211 | y0 = y0 + h; |
gmehmet | 0:a12d6976d64c | 212 | h = -h; |
gmehmet | 0:a12d6976d64c | 213 | } |
gmehmet | 0:a12d6976d64c | 214 | window(x0,y0,w,h); |
gmehmet | 0:a12d6976d64c | 215 | int num = h*w; |
gmehmet | 0:a12d6976d64c | 216 | for( index = 0; index<num; index++ ) { |
gmehmet | 0:a12d6976d64c | 217 | putp(colour); |
gmehmet | 0:a12d6976d64c | 218 | } |
gmehmet | 0:a12d6976d64c | 219 | return; |
gmehmet | 0:a12d6976d64c | 220 | } |
gmehmet | 0:a12d6976d64c | 221 | |
gmehmet | 0:a12d6976d64c | 222 | void GraphicsDisplay::fill(int x, int y, int w, int h, int colour) { |
gmehmet | 0:a12d6976d64c | 223 | fillrect(x, y, w, h, colour); |
gmehmet | 0:a12d6976d64c | 224 | } |
gmehmet | 0:a12d6976d64c | 225 | |
gmehmet | 0:a12d6976d64c | 226 | void GraphicsDisplay::circle(int x, int y, int r,int colour){ |
gmehmet | 0:a12d6976d64c | 227 | int ce = -r; |
gmehmet | 0:a12d6976d64c | 228 | int cx = r; |
gmehmet | 0:a12d6976d64c | 229 | int cy = 0; |
gmehmet | 0:a12d6976d64c | 230 | while(cx >= cy){ |
gmehmet | 0:a12d6976d64c | 231 | pixel(x+cx,y+cy,colour); |
gmehmet | 0:a12d6976d64c | 232 | pixel(x-cx,y-cy,colour); |
gmehmet | 0:a12d6976d64c | 233 | pixel(x-cx,y+cy,colour); |
gmehmet | 0:a12d6976d64c | 234 | pixel(x+cx,y-cy,colour); |
gmehmet | 0:a12d6976d64c | 235 | pixel(x+cy,y+cx,colour); |
gmehmet | 0:a12d6976d64c | 236 | pixel(x-cy,y+cx,colour); |
gmehmet | 0:a12d6976d64c | 237 | pixel(x-cy,y-cx,colour); |
gmehmet | 0:a12d6976d64c | 238 | pixel(x+cy,y-cx,colour); |
gmehmet | 0:a12d6976d64c | 239 | ce += 2*cy++ + 1; |
gmehmet | 0:a12d6976d64c | 240 | if(ce >= 0){ |
gmehmet | 0:a12d6976d64c | 241 | ce -= 2*cx---1; |
gmehmet | 0:a12d6976d64c | 242 | } |
gmehmet | 0:a12d6976d64c | 243 | |
gmehmet | 0:a12d6976d64c | 244 | } |
gmehmet | 0:a12d6976d64c | 245 | |
gmehmet | 0:a12d6976d64c | 246 | } |
gmehmet | 0:a12d6976d64c | 247 | |
gmehmet | 0:a12d6976d64c | 248 | // To draw circle set a and b to the same values |
gmehmet | 0:a12d6976d64c | 249 | void GraphicsDisplay::ellipse(int xc, int yc, int a, int b, unsigned int colour) |
gmehmet | 0:a12d6976d64c | 250 | { |
gmehmet | 0:a12d6976d64c | 251 | /* e(x,y) = b^2*x^2 + a^2*y^2 - a^2*b^2 */ |
gmehmet | 0:a12d6976d64c | 252 | int x = 0, y = b; |
gmehmet | 0:a12d6976d64c | 253 | long a2 = (long)a*a, b2 = (long)b*b; |
gmehmet | 0:a12d6976d64c | 254 | long crit1 = -(a2/4 + a%2 + b2); |
gmehmet | 0:a12d6976d64c | 255 | long crit2 = -(b2/4 + b%2 + a2); |
gmehmet | 0:a12d6976d64c | 256 | long crit3 = -(b2/4 + b%2); |
gmehmet | 0:a12d6976d64c | 257 | long t = -a2*y; // e(x+1/2,y-1/2) - (a^2+b^2)/4 |
gmehmet | 0:a12d6976d64c | 258 | long dxt = 2*b2*x, dyt = -2*a2*y; |
gmehmet | 0:a12d6976d64c | 259 | long d2xt = 2*b2, d2yt = 2*a2; |
gmehmet | 0:a12d6976d64c | 260 | |
gmehmet | 0:a12d6976d64c | 261 | while (y>=0 && x<=a) { |
gmehmet | 0:a12d6976d64c | 262 | pixel(xc+x, yc+y, colour); |
gmehmet | 0:a12d6976d64c | 263 | if (x!=0 || y!=0) |
gmehmet | 0:a12d6976d64c | 264 | pixel(xc-x, yc-y, colour); |
gmehmet | 0:a12d6976d64c | 265 | if (x!=0 && y!=0) { |
gmehmet | 0:a12d6976d64c | 266 | pixel(xc+x, yc-y, colour); |
gmehmet | 0:a12d6976d64c | 267 | pixel(xc-x, yc+y, colour); |
gmehmet | 0:a12d6976d64c | 268 | } |
gmehmet | 0:a12d6976d64c | 269 | if (t + b2*x <= crit1 || // e(x+1,y-1/2) <= 0 |
gmehmet | 0:a12d6976d64c | 270 | t + a2*y <= crit3) // e(x+1/2,y) <= 0 |
gmehmet | 0:a12d6976d64c | 271 | incx(); |
gmehmet | 0:a12d6976d64c | 272 | else if (t - a2*y > crit2) // e(x+1/2,y-1) > 0 |
gmehmet | 0:a12d6976d64c | 273 | incy(); |
gmehmet | 0:a12d6976d64c | 274 | else { |
gmehmet | 0:a12d6976d64c | 275 | incx(); |
gmehmet | 0:a12d6976d64c | 276 | incy(); |
gmehmet | 0:a12d6976d64c | 277 | } |
gmehmet | 0:a12d6976d64c | 278 | } |
gmehmet | 0:a12d6976d64c | 279 | } |
gmehmet | 0:a12d6976d64c | 280 | // To draw circle set a and b to the same values |
gmehmet | 0:a12d6976d64c | 281 | void GraphicsDisplay::fillellipse(int xc, int yc, int a, int b, unsigned int colour) |
gmehmet | 0:a12d6976d64c | 282 | { |
gmehmet | 0:a12d6976d64c | 283 | /* e(x,y) = b^2*x^2 + a^2*y^2 - a^2*b^2 */ |
gmehmet | 0:a12d6976d64c | 284 | int x = 0, y = b; |
gmehmet | 0:a12d6976d64c | 285 | int rx = x, ry = y; |
gmehmet | 0:a12d6976d64c | 286 | unsigned int width = 1; |
gmehmet | 0:a12d6976d64c | 287 | unsigned int height = 1; |
gmehmet | 0:a12d6976d64c | 288 | long a2 = (long)a*a, b2 = (long)b*b; |
gmehmet | 0:a12d6976d64c | 289 | long crit1 = -(a2/4 + a%2 + b2); |
gmehmet | 0:a12d6976d64c | 290 | long crit2 = -(b2/4 + b%2 + a2); |
gmehmet | 0:a12d6976d64c | 291 | long crit3 = -(b2/4 + b%2); |
gmehmet | 0:a12d6976d64c | 292 | long t = -a2*y; // e(x+1/2,y-1/2) - (a^2+b^2)/4 |
gmehmet | 0:a12d6976d64c | 293 | long dxt = 2*b2*x, dyt = -2*a2*y; |
gmehmet | 0:a12d6976d64c | 294 | long d2xt = 2*b2, d2yt = 2*a2; |
gmehmet | 0:a12d6976d64c | 295 | if (b == 0) { |
gmehmet | 0:a12d6976d64c | 296 | fillrect(xc-a, yc, 2*a+1, 1, colour); |
gmehmet | 0:a12d6976d64c | 297 | return; |
gmehmet | 0:a12d6976d64c | 298 | } |
gmehmet | 0:a12d6976d64c | 299 | while (y>=0 && x<=a) { |
gmehmet | 0:a12d6976d64c | 300 | if (t + b2*x <= crit1 || // e(x+1,y-1/2) <= 0 |
gmehmet | 0:a12d6976d64c | 301 | t + a2*y <= crit3) { // e(x+1/2,y) <= 0 |
gmehmet | 0:a12d6976d64c | 302 | if (height == 1) |
gmehmet | 0:a12d6976d64c | 303 | ; // draw nothing |
gmehmet | 0:a12d6976d64c | 304 | else if (ry*2+1 > (height-1)*2) { |
gmehmet | 0:a12d6976d64c | 305 | fillrect(xc-rx, yc-ry, width, height-1, colour); |
gmehmet | 0:a12d6976d64c | 306 | fillrect(xc-rx, yc+ry+1, width, 1-height, colour); |
gmehmet | 0:a12d6976d64c | 307 | ry -= height-1; |
gmehmet | 0:a12d6976d64c | 308 | height = 1; |
gmehmet | 0:a12d6976d64c | 309 | } else { |
gmehmet | 0:a12d6976d64c | 310 | fillrect(xc-rx, yc-ry, width, ry*2+1, colour); |
gmehmet | 0:a12d6976d64c | 311 | ry -= ry; |
gmehmet | 0:a12d6976d64c | 312 | height = 1; |
gmehmet | 0:a12d6976d64c | 313 | } |
gmehmet | 0:a12d6976d64c | 314 | incx(); |
gmehmet | 0:a12d6976d64c | 315 | rx++; |
gmehmet | 0:a12d6976d64c | 316 | width += 2; |
gmehmet | 0:a12d6976d64c | 317 | } else if (t - a2*y > crit2) { // e(x+1/2,y-1) > 0 |
gmehmet | 0:a12d6976d64c | 318 | incy(); |
gmehmet | 0:a12d6976d64c | 319 | height++; |
gmehmet | 0:a12d6976d64c | 320 | } else { |
gmehmet | 0:a12d6976d64c | 321 | if (ry*2+1 > height*2) { |
gmehmet | 0:a12d6976d64c | 322 | fillrect(xc-rx, yc-ry, width, height, colour); |
gmehmet | 0:a12d6976d64c | 323 | fillrect(xc-rx, yc+ry+1, width, -height, colour); |
gmehmet | 0:a12d6976d64c | 324 | } else { |
gmehmet | 0:a12d6976d64c | 325 | fillrect(xc-rx, yc-ry, width, ry*2+1, colour); |
gmehmet | 0:a12d6976d64c | 326 | } |
gmehmet | 0:a12d6976d64c | 327 | incx(); |
gmehmet | 0:a12d6976d64c | 328 | incy(); |
gmehmet | 0:a12d6976d64c | 329 | rx++; |
gmehmet | 0:a12d6976d64c | 330 | width += 2; |
gmehmet | 0:a12d6976d64c | 331 | ry -= height; |
gmehmet | 0:a12d6976d64c | 332 | height = 1; |
gmehmet | 0:a12d6976d64c | 333 | } |
gmehmet | 0:a12d6976d64c | 334 | } |
gmehmet | 0:a12d6976d64c | 335 | if (ry > height) { |
gmehmet | 0:a12d6976d64c | 336 | fillrect(xc-rx, yc-ry, width, height, colour); |
gmehmet | 0:a12d6976d64c | 337 | fillrect(xc-rx, yc+ry+1, width, -height, colour); |
gmehmet | 0:a12d6976d64c | 338 | } else { |
gmehmet | 0:a12d6976d64c | 339 | fillrect(xc-rx, yc-ry, width, ry*2+1, colour); |
gmehmet | 0:a12d6976d64c | 340 | } |
gmehmet | 0:a12d6976d64c | 341 | } |
gmehmet | 0:a12d6976d64c | 342 | |
gmehmet | 0:a12d6976d64c | 343 | |
gmehmet | 0:a12d6976d64c | 344 | void GraphicsDisplay::line(int x0, int y0, int x1, int y1, int colour) { |
gmehmet | 0:a12d6976d64c | 345 | //window(x0, y, w, h); |
gmehmet | 0:a12d6976d64c | 346 | int dx = 0, dy = 0; |
gmehmet | 0:a12d6976d64c | 347 | int dx_sym = 0, dy_sym = 0; |
gmehmet | 0:a12d6976d64c | 348 | int dx_x2 = 0, dy_x2 = 0; |
gmehmet | 0:a12d6976d64c | 349 | int di = 0; |
gmehmet | 0:a12d6976d64c | 350 | dx = x1-x0; |
gmehmet | 0:a12d6976d64c | 351 | dy = y1-y0; |
gmehmet | 0:a12d6976d64c | 352 | |
gmehmet | 0:a12d6976d64c | 353 | if (dx == 0) { /* vertical line */ |
gmehmet | 0:a12d6976d64c | 354 | if (y1 > y0) vline(x0,y0,y1,colour); |
gmehmet | 0:a12d6976d64c | 355 | else vline(x0,y1,y0,colour); |
gmehmet | 0:a12d6976d64c | 356 | return; |
gmehmet | 0:a12d6976d64c | 357 | } |
gmehmet | 0:a12d6976d64c | 358 | if (dx > 0) { |
gmehmet | 0:a12d6976d64c | 359 | dx_sym = 1; |
gmehmet | 0:a12d6976d64c | 360 | } else { |
gmehmet | 0:a12d6976d64c | 361 | dx_sym = -1; |
gmehmet | 0:a12d6976d64c | 362 | } |
gmehmet | 0:a12d6976d64c | 363 | if (dy == 0) { /* horizontal line */ |
gmehmet | 0:a12d6976d64c | 364 | if (x1 > x0) hline(x0,x1,y0,colour); |
gmehmet | 0:a12d6976d64c | 365 | else hline(x1,x0,y0,colour); |
gmehmet | 0:a12d6976d64c | 366 | return; |
gmehmet | 0:a12d6976d64c | 367 | } |
gmehmet | 0:a12d6976d64c | 368 | if (dy > 0) { |
gmehmet | 0:a12d6976d64c | 369 | dy_sym = 1; |
gmehmet | 0:a12d6976d64c | 370 | } else { |
gmehmet | 0:a12d6976d64c | 371 | dy_sym = -1; |
gmehmet | 0:a12d6976d64c | 372 | } |
gmehmet | 0:a12d6976d64c | 373 | dx = dx_sym*dx; |
gmehmet | 0:a12d6976d64c | 374 | dy = dy_sym*dy; |
gmehmet | 0:a12d6976d64c | 375 | dx_x2 = dx*2; |
gmehmet | 0:a12d6976d64c | 376 | dy_x2 = dy*2; |
gmehmet | 0:a12d6976d64c | 377 | if (dx >= dy) { |
gmehmet | 0:a12d6976d64c | 378 | di = dy_x2 - dx; |
gmehmet | 0:a12d6976d64c | 379 | while (x0 != x1) { |
gmehmet | 0:a12d6976d64c | 380 | |
gmehmet | 0:a12d6976d64c | 381 | pixel(x0, y0, colour); |
gmehmet | 0:a12d6976d64c | 382 | x0 += dx_sym; |
gmehmet | 0:a12d6976d64c | 383 | if (di<0) { |
gmehmet | 0:a12d6976d64c | 384 | di += dy_x2; |
gmehmet | 0:a12d6976d64c | 385 | } else { |
gmehmet | 0:a12d6976d64c | 386 | di += dy_x2 - dx_x2; |
gmehmet | 0:a12d6976d64c | 387 | y0 += dy_sym; |
gmehmet | 0:a12d6976d64c | 388 | } |
gmehmet | 0:a12d6976d64c | 389 | } |
gmehmet | 0:a12d6976d64c | 390 | pixel(x0, y0, colour); |
gmehmet | 0:a12d6976d64c | 391 | } else { |
gmehmet | 0:a12d6976d64c | 392 | di = dx_x2 - dy; |
gmehmet | 0:a12d6976d64c | 393 | while (y0 != y1) { |
gmehmet | 0:a12d6976d64c | 394 | pixel(x0, y0, colour); |
gmehmet | 0:a12d6976d64c | 395 | y0 += dy_sym; |
gmehmet | 0:a12d6976d64c | 396 | if (di < 0) { |
gmehmet | 0:a12d6976d64c | 397 | di += dx_x2; |
gmehmet | 0:a12d6976d64c | 398 | } else { |
gmehmet | 0:a12d6976d64c | 399 | di += dx_x2 - dy_x2; |
gmehmet | 0:a12d6976d64c | 400 | x0 += dx_sym; |
gmehmet | 0:a12d6976d64c | 401 | } |
gmehmet | 0:a12d6976d64c | 402 | } |
gmehmet | 0:a12d6976d64c | 403 | pixel(x0, y0, colour); |
gmehmet | 0:a12d6976d64c | 404 | } |
gmehmet | 0:a12d6976d64c | 405 | return; |
gmehmet | 0:a12d6976d64c | 406 | } |
gmehmet | 0:a12d6976d64c | 407 | |
gmehmet | 0:a12d6976d64c | 408 | void GraphicsDisplay::hline(int x0, int x1, int y, int colour) { |
gmehmet | 0:a12d6976d64c | 409 | int w; |
gmehmet | 0:a12d6976d64c | 410 | w = x1 - x0 + 1; |
gmehmet | 0:a12d6976d64c | 411 | window(x0,y,w,1); |
gmehmet | 0:a12d6976d64c | 412 | for (int x=0; x<w; x++) { |
gmehmet | 0:a12d6976d64c | 413 | putp(colour); |
gmehmet | 0:a12d6976d64c | 414 | } |
gmehmet | 0:a12d6976d64c | 415 | return; |
gmehmet | 0:a12d6976d64c | 416 | } |
gmehmet | 0:a12d6976d64c | 417 | |
gmehmet | 0:a12d6976d64c | 418 | void GraphicsDisplay::vline(int x, int y0, int y1, int colour) { |
gmehmet | 0:a12d6976d64c | 419 | int h; |
gmehmet | 0:a12d6976d64c | 420 | h = y1 - y0 + 1; |
gmehmet | 0:a12d6976d64c | 421 | window(x,y0,1,h); |
gmehmet | 0:a12d6976d64c | 422 | for (int y=0; y<h; y++) { |
gmehmet | 0:a12d6976d64c | 423 | putp(colour); |
gmehmet | 0:a12d6976d64c | 424 | } |
gmehmet | 0:a12d6976d64c | 425 | return; |
gmehmet | 0:a12d6976d64c | 426 | } |
gmehmet | 0:a12d6976d64c | 427 | |
gmehmet | 0:a12d6976d64c | 428 | void GraphicsDisplay::cls() { |
gmehmet | 0:a12d6976d64c | 429 | fill(0, 0, width(), height(), _background); |
gmehmet | 0:a12d6976d64c | 430 | } |
gmehmet | 0:a12d6976d64c | 431 | |
gmehmet | 0:a12d6976d64c | 432 | void GraphicsDisplay::blit(int x, int y, int w, int h, const int *colour) { |
gmehmet | 0:a12d6976d64c | 433 | window(x, y, w, h); |
gmehmet | 0:a12d6976d64c | 434 | for(int i=0; i<w*h; i++) { |
gmehmet | 0:a12d6976d64c | 435 | putp(colour[i]); |
gmehmet | 0:a12d6976d64c | 436 | } |
gmehmet | 0:a12d6976d64c | 437 | } |
gmehmet | 0:a12d6976d64c | 438 | |
gmehmet | 0:a12d6976d64c | 439 | void GraphicsDisplay::blitbit(int x, int y, int w, int h, const char* colour) { |
gmehmet | 0:a12d6976d64c | 440 | window(x, y, w, h); |
gmehmet | 0:a12d6976d64c | 441 | for(int i = 0; i < w*h; i++) { |
gmehmet | 0:a12d6976d64c | 442 | char byte = colour[i >> 3]; |
gmehmet | 0:a12d6976d64c | 443 | int offset = i & 0x7; |
gmehmet | 0:a12d6976d64c | 444 | int c = ((byte << (offset)) & 0x80) ? _foreground : _background; |
gmehmet | 0:a12d6976d64c | 445 | putp(c); |
gmehmet | 0:a12d6976d64c | 446 | } |
gmehmet | 0:a12d6976d64c | 447 | } |
gmehmet | 0:a12d6976d64c | 448 | |
gmehmet | 0:a12d6976d64c | 449 | int GraphicsDisplay::columns() { |
gmehmet | 0:a12d6976d64c | 450 | return width() / 8; |
gmehmet | 0:a12d6976d64c | 451 | } |
gmehmet | 0:a12d6976d64c | 452 | |
gmehmet | 0:a12d6976d64c | 453 | int GraphicsDisplay::rows() { |
gmehmet | 0:a12d6976d64c | 454 | return height() / 8; |
gmehmet | 0:a12d6976d64c | 455 | } |
gmehmet | 0:a12d6976d64c | 456 |