Simple program for the RETRO to compare the performance of the DisplayN18 and LCD_ST7735 libraries.

Dependencies:   LCD_ST7735 mbed

This is a very simple program for the RETRO to compare the performance of some of the primitives of the DisplayN18 and LCD_ST7735 libraries

WARNING - WARNING - WARNING

If you're sensitive to ugly coding techniques, lack of best practice, ignorance of proper design patterns, abuse of object orientation or to total disregards of any coding guidelines, then don't - I repeat - DON'T look at this code...

P.S. Regardless the performance, I do think the N18 library has a much nicer font!

Committer:
maxint
Date:
Fri Jan 16 21:41:09 2015 +0000
Revision:
2:dcf8e6db342d
Parent:
0:59d6b70df5a4
Added bottomPrintf_xxx function to make the tests slightly more readable. Tiny bit of cleaning up the test functions.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
maxint 0:59d6b70df5a4 1 #include "DisplayN18.h"
maxint 0:59d6b70df5a4 2
maxint 0:59d6b70df5a4 3 DisplayN18::DisplayN18() : resetPin(P0_20), backlightPin(P0_19), rsPin(P0_7), csPin(P0_2), spi(P0_21, P0_22, P1_15) {
maxint 0:59d6b70df5a4 4 this->resetPin.write(false);
maxint 0:59d6b70df5a4 5 this->backlightPin.write(true);
maxint 0:59d6b70df5a4 6 this->rsPin.write(false);
maxint 0:59d6b70df5a4 7
maxint 0:59d6b70df5a4 8 this->spi.format(8, 3);
maxint 0:59d6b70df5a4 9 this->spi.frequency(15000000);
maxint 0:59d6b70df5a4 10
maxint 0:59d6b70df5a4 11 this->initialize();
maxint 0:59d6b70df5a4 12 }
maxint 0:59d6b70df5a4 13
maxint 0:59d6b70df5a4 14 void DisplayN18::writeCommand(unsigned char command) {
maxint 0:59d6b70df5a4 15 this->rsPin.write(false);
maxint 0:59d6b70df5a4 16
maxint 0:59d6b70df5a4 17 this->csPin.write(false);
maxint 0:59d6b70df5a4 18
maxint 0:59d6b70df5a4 19 this->spi.write(command);
maxint 0:59d6b70df5a4 20
maxint 0:59d6b70df5a4 21 this->csPin.write(true);
maxint 0:59d6b70df5a4 22 }
maxint 0:59d6b70df5a4 23
maxint 0:59d6b70df5a4 24 void DisplayN18::writeData(unsigned char data) {
maxint 0:59d6b70df5a4 25 this->writeData(&data, 1);
maxint 0:59d6b70df5a4 26 }
maxint 0:59d6b70df5a4 27
maxint 0:59d6b70df5a4 28 void DisplayN18::writeData(const unsigned char* data, unsigned int length) {
maxint 0:59d6b70df5a4 29 this->rsPin.write(true);
maxint 0:59d6b70df5a4 30
maxint 0:59d6b70df5a4 31 this->csPin.write(false);
maxint 0:59d6b70df5a4 32
maxint 0:59d6b70df5a4 33 for (unsigned int i = 0; i < length; i++)
maxint 0:59d6b70df5a4 34 this->spi.write(data[i]);
maxint 0:59d6b70df5a4 35
maxint 0:59d6b70df5a4 36 this->csPin.write(true);
maxint 0:59d6b70df5a4 37 }
maxint 0:59d6b70df5a4 38
maxint 0:59d6b70df5a4 39 void DisplayN18::reset() {
maxint 0:59d6b70df5a4 40 this->resetPin.write(false);
maxint 0:59d6b70df5a4 41 wait_ms(300);
maxint 0:59d6b70df5a4 42
maxint 0:59d6b70df5a4 43 this->resetPin.write(true);
maxint 0:59d6b70df5a4 44 wait_ms(500);
maxint 0:59d6b70df5a4 45 }
maxint 0:59d6b70df5a4 46
maxint 0:59d6b70df5a4 47 void DisplayN18::initialize() {
maxint 0:59d6b70df5a4 48 this->reset();
maxint 0:59d6b70df5a4 49
maxint 0:59d6b70df5a4 50 this->writeCommand(0x11);
maxint 0:59d6b70df5a4 51
maxint 0:59d6b70df5a4 52 wait_ms(120);
maxint 0:59d6b70df5a4 53
maxint 0:59d6b70df5a4 54 this->writeCommand(0xB1);
maxint 0:59d6b70df5a4 55 this->writeData(0x01); this->writeData(0x2C); this->writeData(0x2D);
maxint 0:59d6b70df5a4 56 this->writeCommand(0xB2);
maxint 0:59d6b70df5a4 57 this->writeData(0x01); this->writeData(0x2C); this->writeData(0x2D);
maxint 0:59d6b70df5a4 58 this->writeCommand(0xB3);
maxint 0:59d6b70df5a4 59 this->writeData(0x01); this->writeData(0x2C); this->writeData(0x2D);
maxint 0:59d6b70df5a4 60 this->writeData(0x01); this->writeData(0x2C); this->writeData(0x2D);
maxint 0:59d6b70df5a4 61
maxint 0:59d6b70df5a4 62 this->writeCommand(0xB4);
maxint 0:59d6b70df5a4 63 this->writeData(0x07);
maxint 0:59d6b70df5a4 64
maxint 0:59d6b70df5a4 65 this->writeCommand(0xC0);
maxint 0:59d6b70df5a4 66 this->writeData(0xA2); this->writeData(0x02); this->writeData(0x84);
maxint 0:59d6b70df5a4 67 this->writeCommand(0xC1); this->writeData(0xC5);
maxint 0:59d6b70df5a4 68 this->writeCommand(0xC2);
maxint 0:59d6b70df5a4 69 this->writeData(0x0A); this->writeData(0x00);
maxint 0:59d6b70df5a4 70 this->writeCommand(0xC3);
maxint 0:59d6b70df5a4 71 this->writeData(0x8A); this->writeData(0x2A);
maxint 0:59d6b70df5a4 72 this->writeCommand(0xC4);
maxint 0:59d6b70df5a4 73 this->writeData(0x8A); this->writeData(0xEE);
maxint 0:59d6b70df5a4 74
maxint 0:59d6b70df5a4 75 this->writeCommand(0xC5);
maxint 0:59d6b70df5a4 76 this->writeData(0x0E);
maxint 0:59d6b70df5a4 77
maxint 0:59d6b70df5a4 78 this->writeCommand(0x36);
maxint 0:59d6b70df5a4 79 this->writeData(0xA8);
maxint 0:59d6b70df5a4 80
maxint 0:59d6b70df5a4 81 this->writeCommand(0xe0);
maxint 0:59d6b70df5a4 82 this->writeData(0x0f); this->writeData(0x1a);
maxint 0:59d6b70df5a4 83 this->writeData(0x0f); this->writeData(0x18);
maxint 0:59d6b70df5a4 84 this->writeData(0x2f); this->writeData(0x28);
maxint 0:59d6b70df5a4 85 this->writeData(0x20); this->writeData(0x22);
maxint 0:59d6b70df5a4 86 this->writeData(0x1f); this->writeData(0x1b);
maxint 0:59d6b70df5a4 87 this->writeData(0x23); this->writeData(0x37); this->writeData(0x00);
maxint 0:59d6b70df5a4 88 this->writeData(0x07);
maxint 0:59d6b70df5a4 89 this->writeData(0x02); this->writeData(0x10);
maxint 0:59d6b70df5a4 90
maxint 0:59d6b70df5a4 91 this->writeCommand(0xe1);
maxint 0:59d6b70df5a4 92 this->writeData(0x0f); this->writeData(0x1b);
maxint 0:59d6b70df5a4 93 this->writeData(0x0f); this->writeData(0x17);
maxint 0:59d6b70df5a4 94 this->writeData(0x33); this->writeData(0x2c);
maxint 0:59d6b70df5a4 95 this->writeData(0x29); this->writeData(0x2e);
maxint 0:59d6b70df5a4 96 this->writeData(0x30); this->writeData(0x30);
maxint 0:59d6b70df5a4 97 this->writeData(0x39); this->writeData(0x3f);
maxint 0:59d6b70df5a4 98 this->writeData(0x00); this->writeData(0x07);
maxint 0:59d6b70df5a4 99 this->writeData(0x03); this->writeData(0x10);
maxint 0:59d6b70df5a4 100
maxint 0:59d6b70df5a4 101 this->writeCommand(0x2a);
maxint 0:59d6b70df5a4 102 this->writeData(0x00); this->writeData(0x00);
maxint 0:59d6b70df5a4 103 this->writeData(0x00); this->writeData(0x7f);
maxint 0:59d6b70df5a4 104 this->writeCommand(0x2b);
maxint 0:59d6b70df5a4 105 this->writeData(0x00); this->writeData(0x00);
maxint 0:59d6b70df5a4 106 this->writeData(0x00); this->writeData(0x9f);
maxint 0:59d6b70df5a4 107
maxint 0:59d6b70df5a4 108 this->writeCommand(0xF0);
maxint 0:59d6b70df5a4 109 this->writeData(0x01);
maxint 0:59d6b70df5a4 110 this->writeCommand(0xF6);
maxint 0:59d6b70df5a4 111 this->writeData(0x00);
maxint 0:59d6b70df5a4 112
maxint 0:59d6b70df5a4 113 this->writeCommand(0x3A);
maxint 0:59d6b70df5a4 114 this->writeData(0x05);
maxint 0:59d6b70df5a4 115
maxint 0:59d6b70df5a4 116 this->writeCommand(0x29);
maxint 0:59d6b70df5a4 117
maxint 0:59d6b70df5a4 118 this->clear();
maxint 0:59d6b70df5a4 119 }
maxint 0:59d6b70df5a4 120
maxint 0:59d6b70df5a4 121 void DisplayN18::setClippingArea(unsigned char x, unsigned char y, unsigned char width, unsigned char height) {
maxint 0:59d6b70df5a4 122 unsigned char data[4] = { 0x00, 0x00, 0x00, 0x00 };
maxint 0:59d6b70df5a4 123
maxint 0:59d6b70df5a4 124 data[1] = x;
maxint 0:59d6b70df5a4 125 data[3] = x + width;
maxint 0:59d6b70df5a4 126 this->writeCommand(0x2A);
maxint 0:59d6b70df5a4 127 this->writeData(data, 4);
maxint 0:59d6b70df5a4 128
maxint 0:59d6b70df5a4 129 data[1] = y;
maxint 0:59d6b70df5a4 130 data[3] = y + height;
maxint 0:59d6b70df5a4 131 this->writeCommand(0x2B);
maxint 0:59d6b70df5a4 132 this->writeData(data, 4);
maxint 0:59d6b70df5a4 133 }
maxint 0:59d6b70df5a4 134
maxint 0:59d6b70df5a4 135 unsigned short DisplayN18::rgbToShort(unsigned char r, unsigned char g, unsigned char b) {
maxint 0:59d6b70df5a4 136 unsigned short red = r;
maxint 0:59d6b70df5a4 137 unsigned short green = g;
maxint 0:59d6b70df5a4 138 unsigned short blue = b;
maxint 0:59d6b70df5a4 139
maxint 0:59d6b70df5a4 140 red /= 8;
maxint 0:59d6b70df5a4 141 green /= 4;
maxint 0:59d6b70df5a4 142 blue /= 8;
maxint 0:59d6b70df5a4 143
maxint 0:59d6b70df5a4 144 red &= 0x1F;
maxint 0:59d6b70df5a4 145 green &= 0x3F;
maxint 0:59d6b70df5a4 146 blue &= 0x1F;
maxint 0:59d6b70df5a4 147
maxint 0:59d6b70df5a4 148 red <<= 3;
maxint 0:59d6b70df5a4 149 blue <<= 8;
maxint 0:59d6b70df5a4 150 green = ((green & 0x7) << 13) + ((green & 0x38) >> 3);
maxint 0:59d6b70df5a4 151
maxint 0:59d6b70df5a4 152 return red | green | blue;
maxint 0:59d6b70df5a4 153 }
maxint 0:59d6b70df5a4 154
maxint 0:59d6b70df5a4 155 void DisplayN18::clear(unsigned short backColor) {
maxint 0:59d6b70df5a4 156 for (unsigned int i = 0; i < DisplayN18::WIDTH; i += 10)
maxint 0:59d6b70df5a4 157 for (unsigned int j = 0; j < DisplayN18::HEIGHT; j += 8)
maxint 0:59d6b70df5a4 158 this->fillRect(i, j, 10, 8, backColor);
maxint 0:59d6b70df5a4 159 }
maxint 0:59d6b70df5a4 160
maxint 0:59d6b70df5a4 161 void DisplayN18::draw(const unsigned short* data, int x, int y, int width, int height) {
maxint 0:59d6b70df5a4 162 this->setClippingArea(x, y, width - 1, height - 1);
maxint 0:59d6b70df5a4 163 this->writeCommand(0x2C);
maxint 0:59d6b70df5a4 164 this->writeData(reinterpret_cast<const unsigned char*>(data), width * height * 2);
maxint 0:59d6b70df5a4 165 }
maxint 0:59d6b70df5a4 166
maxint 0:59d6b70df5a4 167 void DisplayN18::setPixel(int x, int y, unsigned short foreColor) {
maxint 0:59d6b70df5a4 168 this->draw(&foreColor, x, y, 1, 1);
maxint 0:59d6b70df5a4 169 }
maxint 0:59d6b70df5a4 170
maxint 0:59d6b70df5a4 171 void DisplayN18::fillRect(int x, int y, int width, int height, unsigned short foreColor) {
maxint 0:59d6b70df5a4 172 this->setClippingArea(static_cast<unsigned char>(x), static_cast<unsigned char>(y), static_cast<unsigned char>(width - 1), static_cast<unsigned char>(height));
maxint 0:59d6b70df5a4 173
maxint 0:59d6b70df5a4 174 this->writeCommand(0x2C);
maxint 0:59d6b70df5a4 175
maxint 0:59d6b70df5a4 176 unsigned short buffer[50];
maxint 0:59d6b70df5a4 177 for (int j = 0; j < sizeof(buffer) / 2; j++)
maxint 0:59d6b70df5a4 178 buffer[j] = foreColor;
maxint 0:59d6b70df5a4 179
maxint 0:59d6b70df5a4 180 this->rsPin.write(true);
maxint 0:59d6b70df5a4 181
maxint 0:59d6b70df5a4 182 int i;
maxint 0:59d6b70df5a4 183 for (i = sizeof(buffer); i < height * width * 2; i += sizeof(buffer))
maxint 0:59d6b70df5a4 184 this->writeData(reinterpret_cast<unsigned char*>(buffer), sizeof(buffer));
maxint 0:59d6b70df5a4 185
maxint 0:59d6b70df5a4 186 i -= sizeof(buffer);
maxint 0:59d6b70df5a4 187 if (i != height * width * 2)
maxint 0:59d6b70df5a4 188 this->writeData(reinterpret_cast<unsigned char*>(buffer), height * width * 2 - i);
maxint 0:59d6b70df5a4 189 }
maxint 0:59d6b70df5a4 190
maxint 0:59d6b70df5a4 191 void DisplayN18::drawRect(int x, int y, int width, int height, unsigned short foreColor) {
maxint 0:59d6b70df5a4 192 this->drawLine(x, y, x + width, y, foreColor);
maxint 0:59d6b70df5a4 193 this->drawLine(x, y + height, x + width, y + height, foreColor);
maxint 0:59d6b70df5a4 194 this->drawLine(x, y, x, y + height, foreColor);
maxint 0:59d6b70df5a4 195 this->drawLine(x + width, y, x + width, y + height, foreColor);
maxint 0:59d6b70df5a4 196 }
maxint 0:59d6b70df5a4 197
maxint 0:59d6b70df5a4 198 void DisplayN18::fillCircle(int x, int y, int radius, unsigned short foreColor) {
maxint 0:59d6b70df5a4 199 int f = 1 - radius;
maxint 0:59d6b70df5a4 200 int dd_f_x = 1;
maxint 0:59d6b70df5a4 201 int dd_f_y = -2 * radius;
maxint 0:59d6b70df5a4 202 int x1 = 0;
maxint 0:59d6b70df5a4 203 int y1 = radius;
maxint 0:59d6b70df5a4 204
maxint 0:59d6b70df5a4 205 for (int i = y - radius; i <= y + radius; i++)
maxint 0:59d6b70df5a4 206 this->setPixel(x, i, foreColor);
maxint 0:59d6b70df5a4 207
maxint 0:59d6b70df5a4 208 while (x1 < y1) {
maxint 0:59d6b70df5a4 209 if (f >= 0) {
maxint 0:59d6b70df5a4 210 y1--;
maxint 0:59d6b70df5a4 211 dd_f_y += 2;
maxint 0:59d6b70df5a4 212 f += dd_f_y;
maxint 0:59d6b70df5a4 213 }
maxint 0:59d6b70df5a4 214
maxint 0:59d6b70df5a4 215 x1++;
maxint 0:59d6b70df5a4 216 dd_f_x += 2;
maxint 0:59d6b70df5a4 217 f += dd_f_x;
maxint 0:59d6b70df5a4 218
maxint 0:59d6b70df5a4 219 for (int i = y - y1; i <= y + y1; i++) {
maxint 0:59d6b70df5a4 220 this->setPixel(x + x1, i, foreColor);
maxint 0:59d6b70df5a4 221 this->setPixel(x - x1, i, foreColor);
maxint 0:59d6b70df5a4 222 }
maxint 0:59d6b70df5a4 223
maxint 0:59d6b70df5a4 224 for (int i = y - x1; i <= y + x1; i++) {
maxint 0:59d6b70df5a4 225 this->setPixel(x + y1, i, foreColor);
maxint 0:59d6b70df5a4 226 this->setPixel(x - y1, i, foreColor);
maxint 0:59d6b70df5a4 227 }
maxint 0:59d6b70df5a4 228 }
maxint 0:59d6b70df5a4 229 }
maxint 0:59d6b70df5a4 230
maxint 0:59d6b70df5a4 231 void DisplayN18::drawCircle(int x, int y, int radius, unsigned short foreColor) {
maxint 0:59d6b70df5a4 232 int f = 1 - radius;
maxint 0:59d6b70df5a4 233 int dd_f_x = 1;
maxint 0:59d6b70df5a4 234 int dd_f_y = -2 * radius;
maxint 0:59d6b70df5a4 235 int x1 = 0;
maxint 0:59d6b70df5a4 236 int y1 = radius;
maxint 0:59d6b70df5a4 237
maxint 0:59d6b70df5a4 238 this->setPixel(x, y + radius, foreColor);
maxint 0:59d6b70df5a4 239 this->setPixel(x, y - radius, foreColor);
maxint 0:59d6b70df5a4 240 this->setPixel(x + radius, y, foreColor);
maxint 0:59d6b70df5a4 241 this->setPixel(x - radius, y, foreColor);
maxint 0:59d6b70df5a4 242
maxint 0:59d6b70df5a4 243 while (x1 < y1) {
maxint 0:59d6b70df5a4 244 if (f >= 0) {
maxint 0:59d6b70df5a4 245 y1--;
maxint 0:59d6b70df5a4 246 dd_f_y += 2;
maxint 0:59d6b70df5a4 247 f += dd_f_y;
maxint 0:59d6b70df5a4 248 }
maxint 0:59d6b70df5a4 249
maxint 0:59d6b70df5a4 250 x1++;
maxint 0:59d6b70df5a4 251 dd_f_x += 2;
maxint 0:59d6b70df5a4 252 f += dd_f_x;
maxint 0:59d6b70df5a4 253
maxint 0:59d6b70df5a4 254 this->setPixel(x + x1, y + y1, foreColor);
maxint 0:59d6b70df5a4 255 this->setPixel(x - x1, y + y1, foreColor);
maxint 0:59d6b70df5a4 256 this->setPixel(x + x1, y - y1, foreColor);
maxint 0:59d6b70df5a4 257 this->setPixel(x - x1, y - y1, foreColor);
maxint 0:59d6b70df5a4 258
maxint 0:59d6b70df5a4 259 this->setPixel(x + y1, y + x1, foreColor);
maxint 0:59d6b70df5a4 260 this->setPixel(x - y1, y + x1, foreColor);
maxint 0:59d6b70df5a4 261 this->setPixel(x + y1, y - x1, foreColor);
maxint 0:59d6b70df5a4 262 this->setPixel(x - y1, y - x1, foreColor);
maxint 0:59d6b70df5a4 263 }
maxint 0:59d6b70df5a4 264 }
maxint 0:59d6b70df5a4 265
maxint 0:59d6b70df5a4 266 void DisplayN18::drawLine(int x0, int y0, int x1, int y1, unsigned short foreColor) {
maxint 0:59d6b70df5a4 267 if (x0 == x1) {
maxint 0:59d6b70df5a4 268 if (y1 < y0) {
maxint 0:59d6b70df5a4 269 int temp = y0;
maxint 0:59d6b70df5a4 270 y0 = y1;
maxint 0:59d6b70df5a4 271 y1 = temp;
maxint 0:59d6b70df5a4 272 }
maxint 0:59d6b70df5a4 273
maxint 0:59d6b70df5a4 274 this->setClippingArea(static_cast<unsigned char>(x0), static_cast<unsigned char>(y0), 0, static_cast<unsigned char>(y1 - y0 - 1));
maxint 0:59d6b70df5a4 275 this->writeCommand(0x2C);
maxint 0:59d6b70df5a4 276
maxint 0:59d6b70df5a4 277 unsigned short data[DisplayN18::STEP];
maxint 0:59d6b70df5a4 278 for (int i = 0; i < DisplayN18::STEP; i++)
maxint 0:59d6b70df5a4 279 data[i] = foreColor;
maxint 0:59d6b70df5a4 280
maxint 0:59d6b70df5a4 281 for (unsigned char thisY = y0; thisY < y1; thisY += DisplayN18::STEP)
maxint 0:59d6b70df5a4 282 this->writeData(reinterpret_cast<unsigned char*>(data), (thisY + DisplayN18::STEP <= y1 ? DisplayN18::STEP : y1 - thisY) * 2);
maxint 0:59d6b70df5a4 283
maxint 0:59d6b70df5a4 284 return;
maxint 0:59d6b70df5a4 285 }
maxint 0:59d6b70df5a4 286
maxint 0:59d6b70df5a4 287 if (y0 == y1) {
maxint 0:59d6b70df5a4 288 if (x1 < x0) {
maxint 0:59d6b70df5a4 289 int temp = x0;
maxint 0:59d6b70df5a4 290 x0 = x1;
maxint 0:59d6b70df5a4 291 x1 = temp;
maxint 0:59d6b70df5a4 292 }
maxint 0:59d6b70df5a4 293
maxint 0:59d6b70df5a4 294 this->setClippingArea(static_cast<unsigned char>(x0), static_cast<unsigned char>(y0), static_cast<unsigned char>(x1 - x0 - 1), 0);
maxint 0:59d6b70df5a4 295 this->writeCommand(0x2C);
maxint 0:59d6b70df5a4 296
maxint 0:59d6b70df5a4 297 unsigned short data[DisplayN18::STEP];
maxint 0:59d6b70df5a4 298 for (int i = 0; i < DisplayN18::STEP; i++)
maxint 0:59d6b70df5a4 299 data[i] = foreColor;
maxint 0:59d6b70df5a4 300
maxint 0:59d6b70df5a4 301 for (unsigned char thisX = x0; thisX < x1; thisX += DisplayN18::STEP)
maxint 0:59d6b70df5a4 302 this->writeData(reinterpret_cast<unsigned char*>(data), (thisX + DisplayN18::STEP <= x1 ? DisplayN18::STEP : x1 - thisX) * 2);
maxint 0:59d6b70df5a4 303
maxint 0:59d6b70df5a4 304 return;
maxint 0:59d6b70df5a4 305 }
maxint 0:59d6b70df5a4 306
maxint 0:59d6b70df5a4 307 int t;
maxint 0:59d6b70df5a4 308 bool steep = ((y1 - y0) < 0 ? -(y1 - y0) : (y1 - y0)) > ((x1 - x0) < 0 ? -(x1 - x0) : (x1 - x0));
maxint 0:59d6b70df5a4 309
maxint 0:59d6b70df5a4 310 if (steep) {
maxint 0:59d6b70df5a4 311 t = x0;
maxint 0:59d6b70df5a4 312 x0 = y0;
maxint 0:59d6b70df5a4 313 y0 = t;
maxint 0:59d6b70df5a4 314 t = x1;
maxint 0:59d6b70df5a4 315 x1 = y1;
maxint 0:59d6b70df5a4 316 y1 = t;
maxint 0:59d6b70df5a4 317 }
maxint 0:59d6b70df5a4 318
maxint 0:59d6b70df5a4 319 if (x0 > x1) {
maxint 0:59d6b70df5a4 320 t = x0;
maxint 0:59d6b70df5a4 321 x0 = x1;
maxint 0:59d6b70df5a4 322 x1 = t;
maxint 0:59d6b70df5a4 323
maxint 0:59d6b70df5a4 324 t = y0;
maxint 0:59d6b70df5a4 325 y0 = y1;
maxint 0:59d6b70df5a4 326 y1 = t;
maxint 0:59d6b70df5a4 327 }
maxint 0:59d6b70df5a4 328
maxint 0:59d6b70df5a4 329 int dx, dy;
maxint 0:59d6b70df5a4 330 dx = x1 - x0;
maxint 0:59d6b70df5a4 331 dy = (y1 - y0) < 0 ? -(y1 - y0) : (y1 - y0);
maxint 0:59d6b70df5a4 332
maxint 0:59d6b70df5a4 333 int err = (dx / 2);
maxint 0:59d6b70df5a4 334 int ystep;
maxint 0:59d6b70df5a4 335
maxint 0:59d6b70df5a4 336 ystep = y0 < y1 ? 1 : -1;
maxint 0:59d6b70df5a4 337
maxint 0:59d6b70df5a4 338 for (; x0 < x1; x0++) {
maxint 0:59d6b70df5a4 339 if (steep)
maxint 0:59d6b70df5a4 340 this->setPixel(y0, x0, foreColor);
maxint 0:59d6b70df5a4 341 else
maxint 0:59d6b70df5a4 342 this->setPixel(x0, y0, foreColor);
maxint 0:59d6b70df5a4 343
maxint 0:59d6b70df5a4 344 err -= dy;
maxint 0:59d6b70df5a4 345
maxint 0:59d6b70df5a4 346 if (err < 0) {
maxint 0:59d6b70df5a4 347 y0 += (char)ystep;
maxint 0:59d6b70df5a4 348 err += dx;
maxint 0:59d6b70df5a4 349 }
maxint 0:59d6b70df5a4 350 }
maxint 0:59d6b70df5a4 351 }
maxint 0:59d6b70df5a4 352
maxint 0:59d6b70df5a4 353 unsigned char characters[95 * 5] = {
maxint 0:59d6b70df5a4 354 0x00, 0x00, 0x00, 0x00, 0x00, /* Space 0x20 */
maxint 0:59d6b70df5a4 355 0x00, 0x00, 0x4f, 0x00, 0x00, /* ! */
maxint 0:59d6b70df5a4 356 0x00, 0x07, 0x00, 0x07, 0x00, /* " */
maxint 0:59d6b70df5a4 357 0x14, 0x7f, 0x14, 0x7f, 0x14, /* # */
maxint 0:59d6b70df5a4 358 0x24, 0x2a, 0x7f, 0x2a, 0x12, /* $ */
maxint 0:59d6b70df5a4 359 0x23, 0x13, 0x08, 0x64, 0x62, /* % */
maxint 0:59d6b70df5a4 360 0x36, 0x49, 0x55, 0x22, 0x20, /* & */
maxint 0:59d6b70df5a4 361 0x00, 0x05, 0x03, 0x00, 0x00, /* ' */
maxint 0:59d6b70df5a4 362 0x00, 0x1c, 0x22, 0x41, 0x00, /* ( */
maxint 0:59d6b70df5a4 363 0x00, 0x41, 0x22, 0x1c, 0x00, /* ) */
maxint 0:59d6b70df5a4 364 0x14, 0x08, 0x3e, 0x08, 0x14, /* // */
maxint 0:59d6b70df5a4 365 0x08, 0x08, 0x3e, 0x08, 0x08, /* + */
maxint 0:59d6b70df5a4 366 0x50, 0x30, 0x00, 0x00, 0x00, /* , */
maxint 0:59d6b70df5a4 367 0x08, 0x08, 0x08, 0x08, 0x08, /* - */
maxint 0:59d6b70df5a4 368 0x00, 0x60, 0x60, 0x00, 0x00, /* . */
maxint 0:59d6b70df5a4 369 0x20, 0x10, 0x08, 0x04, 0x02, /* / */
maxint 0:59d6b70df5a4 370 0x3e, 0x51, 0x49, 0x45, 0x3e, /* 0 0x30 */
maxint 0:59d6b70df5a4 371 0x00, 0x42, 0x7f, 0x40, 0x00, /* 1 */
maxint 0:59d6b70df5a4 372 0x42, 0x61, 0x51, 0x49, 0x46, /* 2 */
maxint 0:59d6b70df5a4 373 0x21, 0x41, 0x45, 0x4b, 0x31, /* 3 */
maxint 0:59d6b70df5a4 374 0x18, 0x14, 0x12, 0x7f, 0x10, /* 4 */
maxint 0:59d6b70df5a4 375 0x27, 0x45, 0x45, 0x45, 0x39, /* 5 */
maxint 0:59d6b70df5a4 376 0x3c, 0x4a, 0x49, 0x49, 0x30, /* 6 */
maxint 0:59d6b70df5a4 377 0x01, 0x71, 0x09, 0x05, 0x03, /* 7 */
maxint 0:59d6b70df5a4 378 0x36, 0x49, 0x49, 0x49, 0x36, /* 8 */
maxint 0:59d6b70df5a4 379 0x06, 0x49, 0x49, 0x29, 0x1e, /* 9 */
maxint 0:59d6b70df5a4 380 0x00, 0x36, 0x36, 0x00, 0x00, /* : */
maxint 0:59d6b70df5a4 381 0x00, 0x56, 0x36, 0x00, 0x00, /* ; */
maxint 0:59d6b70df5a4 382 0x08, 0x14, 0x22, 0x41, 0x00, /* < */
maxint 0:59d6b70df5a4 383 0x14, 0x14, 0x14, 0x14, 0x14, /* = */
maxint 0:59d6b70df5a4 384 0x00, 0x41, 0x22, 0x14, 0x08, /* > */
maxint 0:59d6b70df5a4 385 0x02, 0x01, 0x51, 0x09, 0x06, /* ? */
maxint 0:59d6b70df5a4 386 0x3e, 0x41, 0x5d, 0x55, 0x1e, /* @ 0x40 */
maxint 0:59d6b70df5a4 387 0x7e, 0x11, 0x11, 0x11, 0x7e, /* A */
maxint 0:59d6b70df5a4 388 0x7f, 0x49, 0x49, 0x49, 0x36, /* B */
maxint 0:59d6b70df5a4 389 0x3e, 0x41, 0x41, 0x41, 0x22, /* C */
maxint 0:59d6b70df5a4 390 0x7f, 0x41, 0x41, 0x22, 0x1c, /* D */
maxint 0:59d6b70df5a4 391 0x7f, 0x49, 0x49, 0x49, 0x41, /* E */
maxint 0:59d6b70df5a4 392 0x7f, 0x09, 0x09, 0x09, 0x01, /* F */
maxint 0:59d6b70df5a4 393 0x3e, 0x41, 0x49, 0x49, 0x7a, /* G */
maxint 0:59d6b70df5a4 394 0x7f, 0x08, 0x08, 0x08, 0x7f, /* H */
maxint 0:59d6b70df5a4 395 0x00, 0x41, 0x7f, 0x41, 0x00, /* I */
maxint 0:59d6b70df5a4 396 0x20, 0x40, 0x41, 0x3f, 0x01, /* J */
maxint 0:59d6b70df5a4 397 0x7f, 0x08, 0x14, 0x22, 0x41, /* K */
maxint 0:59d6b70df5a4 398 0x7f, 0x40, 0x40, 0x40, 0x40, /* L */
maxint 0:59d6b70df5a4 399 0x7f, 0x02, 0x0c, 0x02, 0x7f, /* M */
maxint 0:59d6b70df5a4 400 0x7f, 0x04, 0x08, 0x10, 0x7f, /* N */
maxint 0:59d6b70df5a4 401 0x3e, 0x41, 0x41, 0x41, 0x3e, /* O */
maxint 0:59d6b70df5a4 402 0x7f, 0x09, 0x09, 0x09, 0x06, /* P 0x50 */
maxint 0:59d6b70df5a4 403 0x3e, 0x41, 0x51, 0x21, 0x5e, /* Q */
maxint 0:59d6b70df5a4 404 0x7f, 0x09, 0x19, 0x29, 0x46, /* R */
maxint 0:59d6b70df5a4 405 0x26, 0x49, 0x49, 0x49, 0x32, /* S */
maxint 0:59d6b70df5a4 406 0x01, 0x01, 0x7f, 0x01, 0x01, /* T */
maxint 0:59d6b70df5a4 407 0x3f, 0x40, 0x40, 0x40, 0x3f, /* U */
maxint 0:59d6b70df5a4 408 0x1f, 0x20, 0x40, 0x20, 0x1f, /* V */
maxint 0:59d6b70df5a4 409 0x3f, 0x40, 0x38, 0x40, 0x3f, /* W */
maxint 0:59d6b70df5a4 410 0x63, 0x14, 0x08, 0x14, 0x63, /* X */
maxint 0:59d6b70df5a4 411 0x07, 0x08, 0x70, 0x08, 0x07, /* Y */
maxint 0:59d6b70df5a4 412 0x61, 0x51, 0x49, 0x45, 0x43, /* Z */
maxint 0:59d6b70df5a4 413 0x00, 0x7f, 0x41, 0x41, 0x00, /* [ */
maxint 0:59d6b70df5a4 414 0x02, 0x04, 0x08, 0x10, 0x20, /* \ */
maxint 0:59d6b70df5a4 415 0x00, 0x41, 0x41, 0x7f, 0x00, /* ] */
maxint 0:59d6b70df5a4 416 0x04, 0x02, 0x01, 0x02, 0x04, /* ^ */
maxint 0:59d6b70df5a4 417 0x40, 0x40, 0x40, 0x40, 0x40, /* _ */
maxint 0:59d6b70df5a4 418 0x00, 0x00, 0x03, 0x05, 0x00, /* ` 0x60 */
maxint 0:59d6b70df5a4 419 0x20, 0x54, 0x54, 0x54, 0x78, /* a */
maxint 0:59d6b70df5a4 420 0x7F, 0x44, 0x44, 0x44, 0x38, /* b */
maxint 0:59d6b70df5a4 421 0x38, 0x44, 0x44, 0x44, 0x44, /* c */
maxint 0:59d6b70df5a4 422 0x38, 0x44, 0x44, 0x44, 0x7f, /* d */
maxint 0:59d6b70df5a4 423 0x38, 0x54, 0x54, 0x54, 0x18, /* e */
maxint 0:59d6b70df5a4 424 0x04, 0x04, 0x7e, 0x05, 0x05, /* f */
maxint 0:59d6b70df5a4 425 0x08, 0x54, 0x54, 0x54, 0x3c, /* g */
maxint 0:59d6b70df5a4 426 0x7f, 0x08, 0x04, 0x04, 0x78, /* h */
maxint 0:59d6b70df5a4 427 0x00, 0x44, 0x7d, 0x40, 0x00, /* i */
maxint 0:59d6b70df5a4 428 0x20, 0x40, 0x44, 0x3d, 0x00, /* j */
maxint 0:59d6b70df5a4 429 0x7f, 0x10, 0x28, 0x44, 0x00, /* k */
maxint 0:59d6b70df5a4 430 0x00, 0x41, 0x7f, 0x40, 0x00, /* l */
maxint 0:59d6b70df5a4 431 0x7c, 0x04, 0x7c, 0x04, 0x78, /* m */
maxint 0:59d6b70df5a4 432 0x7c, 0x08, 0x04, 0x04, 0x78, /* n */
maxint 0:59d6b70df5a4 433 0x38, 0x44, 0x44, 0x44, 0x38, /* o */
maxint 0:59d6b70df5a4 434 0x7c, 0x14, 0x14, 0x14, 0x08, /* p 0x70 */
maxint 0:59d6b70df5a4 435 0x08, 0x14, 0x14, 0x14, 0x7c, /* q */
maxint 0:59d6b70df5a4 436 0x7c, 0x08, 0x04, 0x04, 0x00, /* r */
maxint 0:59d6b70df5a4 437 0x48, 0x54, 0x54, 0x54, 0x24, /* s */
maxint 0:59d6b70df5a4 438 0x04, 0x04, 0x3f, 0x44, 0x44, /* t */
maxint 0:59d6b70df5a4 439 0x3c, 0x40, 0x40, 0x20, 0x7c, /* u */
maxint 0:59d6b70df5a4 440 0x1c, 0x20, 0x40, 0x20, 0x1c, /* v */
maxint 0:59d6b70df5a4 441 0x3c, 0x40, 0x30, 0x40, 0x3c, /* w */
maxint 0:59d6b70df5a4 442 0x44, 0x28, 0x10, 0x28, 0x44, /* x */
maxint 0:59d6b70df5a4 443 0x0c, 0x50, 0x50, 0x50, 0x3c, /* y */
maxint 0:59d6b70df5a4 444 0x44, 0x64, 0x54, 0x4c, 0x44, /* z */
maxint 0:59d6b70df5a4 445 0x08, 0x36, 0x41, 0x41, 0x00, /* { */
maxint 0:59d6b70df5a4 446 0x00, 0x00, 0x77, 0x00, 0x00, /* | */
maxint 0:59d6b70df5a4 447 0x00, 0x41, 0x41, 0x36, 0x08, /* } */
maxint 0:59d6b70df5a4 448 0x08, 0x08, 0x2a, 0x1c, 0x08 /* ~ */
maxint 0:59d6b70df5a4 449 };
maxint 0:59d6b70df5a4 450
maxint 0:59d6b70df5a4 451 void DisplayN18::drawCharacter(int x, int y, const char character, unsigned short foreColor, unsigned short backColor, unsigned char fontSize) {
maxint 0:59d6b70df5a4 452 if (character > 126 || character < 32)
maxint 0:59d6b70df5a4 453 return;
maxint 0:59d6b70df5a4 454
maxint 0:59d6b70df5a4 455 unsigned short* horizontal = new unsigned short[DisplayN18::CHAR_HEIGHT * fontSize];
maxint 0:59d6b70df5a4 456 for (int i = 0; i < DisplayN18::CHAR_WIDTH; i++) {
maxint 0:59d6b70df5a4 457 for (int j = 0; j < DisplayN18::CHAR_HEIGHT; j++)
maxint 0:59d6b70df5a4 458 for (int k = 0; k < fontSize; k++)
maxint 0:59d6b70df5a4 459 horizontal[j * fontSize + k] = characters[(character - 32) * 5 + i] & (1 << j) ? foreColor : backColor;
maxint 0:59d6b70df5a4 460
maxint 0:59d6b70df5a4 461 for (int k = 0; k < fontSize; k++)
maxint 0:59d6b70df5a4 462 this->draw(horizontal, x + i * fontSize + k, y, 1, DisplayN18::CHAR_HEIGHT * fontSize);
maxint 0:59d6b70df5a4 463 }
maxint 0:59d6b70df5a4 464
maxint 0:59d6b70df5a4 465 for (int i = 0; i < DisplayN18::CHAR_HEIGHT; i++)
maxint 0:59d6b70df5a4 466 for (int k = 0; k < fontSize; k++)
maxint 0:59d6b70df5a4 467 horizontal[i * fontSize + k] = backColor;
maxint 0:59d6b70df5a4 468
maxint 0:59d6b70df5a4 469 for (int k = 0; k < fontSize; k++)
maxint 0:59d6b70df5a4 470 this->draw(horizontal, x + DisplayN18::CHAR_WIDTH * fontSize + k, y, 1, DisplayN18::CHAR_HEIGHT * fontSize);
maxint 0:59d6b70df5a4 471
maxint 0:59d6b70df5a4 472 delete[] horizontal;
maxint 0:59d6b70df5a4 473 }
maxint 0:59d6b70df5a4 474
maxint 0:59d6b70df5a4 475 void DisplayN18::drawString(int x, int y, const char* str, unsigned short foreColor, unsigned short backColor, unsigned char fontSize) {
maxint 0:59d6b70df5a4 476 if (*str == '\0')
maxint 0:59d6b70df5a4 477 return;
maxint 0:59d6b70df5a4 478
maxint 0:59d6b70df5a4 479 do {
maxint 0:59d6b70df5a4 480 this->drawCharacter(x, y, *str, foreColor, backColor, fontSize);
maxint 0:59d6b70df5a4 481
maxint 0:59d6b70df5a4 482 x += (DisplayN18::CHAR_WIDTH + DisplayN18::CHAR_SPACING) * fontSize;
maxint 0:59d6b70df5a4 483 } while (*(++str) != '\0');
maxint 0:59d6b70df5a4 484 }