DOGS-102 Graphic LCD module Example. Based on Igor Skochinsky's "DOGLCDDemo" program.
Dependencies: DOG-S_GraphicLCD mbed
Fork of DOGLCDDemo by
Graphics/Graphics.cpp@0:2a5dccfd318f, 2010-01-14 (annotated)
- Committer:
- igorsk
- Date:
- Thu Jan 14 00:49:39 2010 +0000
- Revision:
- 0:2a5dccfd318f
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
igorsk | 0:2a5dccfd318f | 1 | /* |
igorsk | 0:2a5dccfd318f | 2 | * libmbed-graphics 2D and wireframe 3D graphics library for the MBED |
igorsk | 0:2a5dccfd318f | 3 | * microcontroller platform |
igorsk | 0:2a5dccfd318f | 4 | * Copyright (C) <2009> Michael Sheldon <mike@mikeasoft.com> |
igorsk | 0:2a5dccfd318f | 5 | * Optimized and adapted for AbstractLCD interface |
igorsk | 0:2a5dccfd318f | 6 | * Copyright (C) <2010> Igor Skochinsky <skochinsky@gmail.com> |
igorsk | 0:2a5dccfd318f | 7 | * |
igorsk | 0:2a5dccfd318f | 8 | * This library is free software; you can redistribute it and/or |
igorsk | 0:2a5dccfd318f | 9 | * modify it under the terms of the GNU Library General Public |
igorsk | 0:2a5dccfd318f | 10 | * License as published by the Free Software Foundation; either |
igorsk | 0:2a5dccfd318f | 11 | * version 2 of the License, or (at your option) any later version. |
igorsk | 0:2a5dccfd318f | 12 | * |
igorsk | 0:2a5dccfd318f | 13 | * This library is distributed in the hope that it will be useful, |
igorsk | 0:2a5dccfd318f | 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
igorsk | 0:2a5dccfd318f | 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
igorsk | 0:2a5dccfd318f | 16 | * Library General Public License for more details. |
igorsk | 0:2a5dccfd318f | 17 | * |
igorsk | 0:2a5dccfd318f | 18 | * You should have received a copy of the GNU Library General Public |
igorsk | 0:2a5dccfd318f | 19 | * License along with this library; if not, write to the |
igorsk | 0:2a5dccfd318f | 20 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
igorsk | 0:2a5dccfd318f | 21 | * Boston, MA 02111-1307, USA. |
igorsk | 0:2a5dccfd318f | 22 | */ |
igorsk | 0:2a5dccfd318f | 23 | |
igorsk | 0:2a5dccfd318f | 24 | #include "Graphics.h" |
igorsk | 0:2a5dccfd318f | 25 | |
igorsk | 0:2a5dccfd318f | 26 | // swap two values |
igorsk | 0:2a5dccfd318f | 27 | #define SWAP(a, b) (((a) == (b)) || (((a) ^= (b)), ((b) ^= (a)), ((a) ^= (b)))) |
igorsk | 0:2a5dccfd318f | 28 | |
igorsk | 0:2a5dccfd318f | 29 | Graphics::Graphics(AbstractLCD *lcd) |
igorsk | 0:2a5dccfd318f | 30 | : _lcd(lcd) { |
igorsk | 0:2a5dccfd318f | 31 | _cx3d = _lcd->width() / 2; |
igorsk | 0:2a5dccfd318f | 32 | _cy3d = _lcd->height() / 2; |
igorsk | 0:2a5dccfd318f | 33 | _cz3d = 150; |
igorsk | 0:2a5dccfd318f | 34 | } |
igorsk | 0:2a5dccfd318f | 35 | |
igorsk | 0:2a5dccfd318f | 36 | void Graphics::line(int x0, int y0, int x1, int y1, int colour) { |
igorsk | 0:2a5dccfd318f | 37 | // Bresenham |
igorsk | 0:2a5dccfd318f | 38 | //printf("line(%d, %d, %d, %d, %d)\n", x0, y0, x1, y1, colour); |
igorsk | 0:2a5dccfd318f | 39 | bool steep = abs(y1 - y0) > abs(x1 - x0); |
igorsk | 0:2a5dccfd318f | 40 | int temp, deltax, deltay, error, ystep, y, x; |
igorsk | 0:2a5dccfd318f | 41 | if (steep) { |
igorsk | 0:2a5dccfd318f | 42 | temp = y0; |
igorsk | 0:2a5dccfd318f | 43 | y0 = x0; |
igorsk | 0:2a5dccfd318f | 44 | x0 = temp; |
igorsk | 0:2a5dccfd318f | 45 | temp = y1; |
igorsk | 0:2a5dccfd318f | 46 | y1 = x1; |
igorsk | 0:2a5dccfd318f | 47 | x1 = temp; |
igorsk | 0:2a5dccfd318f | 48 | } |
igorsk | 0:2a5dccfd318f | 49 | if (x0 > x1) { |
igorsk | 0:2a5dccfd318f | 50 | temp = x1; |
igorsk | 0:2a5dccfd318f | 51 | x1 = x0; |
igorsk | 0:2a5dccfd318f | 52 | x0 = temp; |
igorsk | 0:2a5dccfd318f | 53 | temp = y1; |
igorsk | 0:2a5dccfd318f | 54 | y1 = y0; |
igorsk | 0:2a5dccfd318f | 55 | y0 = temp; |
igorsk | 0:2a5dccfd318f | 56 | } |
igorsk | 0:2a5dccfd318f | 57 | deltax = x1 - x0; |
igorsk | 0:2a5dccfd318f | 58 | deltay = abs(y1 - y0); |
igorsk | 0:2a5dccfd318f | 59 | error = deltax / 2; |
igorsk | 0:2a5dccfd318f | 60 | y = y0; |
igorsk | 0:2a5dccfd318f | 61 | if (y0 < y1) { |
igorsk | 0:2a5dccfd318f | 62 | ystep = 1; |
igorsk | 0:2a5dccfd318f | 63 | } else { |
igorsk | 0:2a5dccfd318f | 64 | ystep = -1; |
igorsk | 0:2a5dccfd318f | 65 | } |
igorsk | 0:2a5dccfd318f | 66 | for (x=x0; x<=x1; x++) { |
igorsk | 0:2a5dccfd318f | 67 | if (steep) { |
igorsk | 0:2a5dccfd318f | 68 | _lcd->pixel(y, x, colour); |
igorsk | 0:2a5dccfd318f | 69 | } else { |
igorsk | 0:2a5dccfd318f | 70 | _lcd->pixel(x, y, colour); |
igorsk | 0:2a5dccfd318f | 71 | } |
igorsk | 0:2a5dccfd318f | 72 | error = error - deltay; |
igorsk | 0:2a5dccfd318f | 73 | if (error < 0) { |
igorsk | 0:2a5dccfd318f | 74 | y = y + ystep; |
igorsk | 0:2a5dccfd318f | 75 | error = error + deltax; |
igorsk | 0:2a5dccfd318f | 76 | } |
igorsk | 0:2a5dccfd318f | 77 | } |
igorsk | 0:2a5dccfd318f | 78 | } |
igorsk | 0:2a5dccfd318f | 79 | |
igorsk | 0:2a5dccfd318f | 80 | void Graphics::line3d(int x0, int y0, int z0, int x1, int y1, int z1, int colour) { |
igorsk | 0:2a5dccfd318f | 81 | if (z0 + _cz3d <= 0 || z1 + _cz3d <= 0) { |
igorsk | 0:2a5dccfd318f | 82 | // Behind the camera |
igorsk | 0:2a5dccfd318f | 83 | return; |
igorsk | 0:2a5dccfd318f | 84 | } |
igorsk | 0:2a5dccfd318f | 85 | |
igorsk | 0:2a5dccfd318f | 86 | int u0 = _cx3d + x0 * _cz3d / (z0 + _cz3d); |
igorsk | 0:2a5dccfd318f | 87 | int v0 = _cy3d + y0 * _cz3d / (z0 + _cz3d); |
igorsk | 0:2a5dccfd318f | 88 | int u1 = _cx3d + x1 * _cz3d / (z1 + _cz3d); |
igorsk | 0:2a5dccfd318f | 89 | int v1 = _cy3d + y1 * _cz3d / (z1 + _cz3d); |
igorsk | 0:2a5dccfd318f | 90 | line(u0, v0, u1, v1, colour); |
igorsk | 0:2a5dccfd318f | 91 | } |
igorsk | 0:2a5dccfd318f | 92 | |
igorsk | 0:2a5dccfd318f | 93 | void Graphics::circle(int cx, int cy, int radius, int colour) { |
igorsk | 0:2a5dccfd318f | 94 | int x = 0; |
igorsk | 0:2a5dccfd318f | 95 | int y = radius; |
igorsk | 0:2a5dccfd318f | 96 | int d = 3 - (2 * radius); |
igorsk | 0:2a5dccfd318f | 97 | |
igorsk | 0:2a5dccfd318f | 98 | while (x <= y) { |
igorsk | 0:2a5dccfd318f | 99 | _lcd->pixel(cx + x, cy + y, colour); |
igorsk | 0:2a5dccfd318f | 100 | _lcd->pixel(cx + y, cy + x, colour); |
igorsk | 0:2a5dccfd318f | 101 | _lcd->pixel(cx - x, cy + y, colour); |
igorsk | 0:2a5dccfd318f | 102 | _lcd->pixel(cx + y, cy - x, colour); |
igorsk | 0:2a5dccfd318f | 103 | _lcd->pixel(cx - x, cy - y, colour); |
igorsk | 0:2a5dccfd318f | 104 | _lcd->pixel(cx - y, cy - x, colour); |
igorsk | 0:2a5dccfd318f | 105 | _lcd->pixel(cx + x, cy - y, colour); |
igorsk | 0:2a5dccfd318f | 106 | _lcd->pixel(cx - y, cy + x, colour); |
igorsk | 0:2a5dccfd318f | 107 | |
igorsk | 0:2a5dccfd318f | 108 | if (d<0) |
igorsk | 0:2a5dccfd318f | 109 | d += (4 * x) + 6; |
igorsk | 0:2a5dccfd318f | 110 | else |
igorsk | 0:2a5dccfd318f | 111 | { |
igorsk | 0:2a5dccfd318f | 112 | d += (4 * (x - y)) + 10; |
igorsk | 0:2a5dccfd318f | 113 | y--; |
igorsk | 0:2a5dccfd318f | 114 | } |
igorsk | 0:2a5dccfd318f | 115 | x++; |
igorsk | 0:2a5dccfd318f | 116 | } |
igorsk | 0:2a5dccfd318f | 117 | } |