DOGS-102 Graphic LCD module Example. Based on Igor Skochinsky's "DOGLCDDemo" program.

Dependencies:   DOG-S_GraphicLCD mbed

Fork of DOGLCDDemo by Igor Skochinsky

Committer:
igorsk
Date:
Thu Jan 14 00:49:39 2010 +0000
Revision:
0:2a5dccfd318f

        

Who changed what in which revision?

UserRevisionLine numberNew 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 }