A tiny drawing library. include line draw and bitmap-font draw.bitmap-font is from linux-kernel-source.

Committer:
tosihisa
Date:
Sat Nov 06 12:34:54 2010 +0000
Revision:
4:68c16070d1db
Parent:
1:c2860a9f58b4
Update comment(not changed code)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
tosihisa 0:b49309b1b9d3 1
tosihisa 0:b49309b1b9d3 2 /**
tosihisa 0:b49309b1b9d3 3 * @section LICENSE
tosihisa 0:b49309b1b9d3 4 *
tosihisa 0:b49309b1b9d3 5 * This source code is "GPLv2" license.
tosihisa 0:b49309b1b9d3 6 * The original of the font image is Linux kernel source.
tosihisa 0:b49309b1b9d3 7 * Because the Linux kernel license is "GPLv2 with the exception articles",
tosihisa 0:b49309b1b9d3 8 * this program also applies GPLv2.
tosihisa 0:b49309b1b9d3 9 *
tosihisa 0:b49309b1b9d3 10 * Copyright (C) 2010 tosihisa
tosihisa 0:b49309b1b9d3 11 *
tosihisa 0:b49309b1b9d3 12 * @section DESCRIPTION
tosihisa 0:b49309b1b9d3 13 *
tosihisa 0:b49309b1b9d3 14 * Tiny library of drawing in framebuffer
tosihisa 0:b49309b1b9d3 15 *
tosihisa 0:b49309b1b9d3 16 */
tosihisa 0:b49309b1b9d3 17
tosihisa 0:b49309b1b9d3 18 #include "tinydraw.h"
tosihisa 0:b49309b1b9d3 19
tosihisa 0:b49309b1b9d3 20 TD_COLOR_t *TinyDraw::getVRAMPtr(void) {
tosihisa 0:b49309b1b9d3 21 return &VRAM[0];
tosihisa 0:b49309b1b9d3 22 }
tosihisa 0:b49309b1b9d3 23
tosihisa 0:b49309b1b9d3 24 TD_COLOR_t *TinyDraw::getVRAMPtr(TD_POINT_t *pnt) {
tosihisa 0:b49309b1b9d3 25 int pageNo = pnt->y / 8;
tosihisa 0:b49309b1b9d3 26 return &(VRAM[(X_MAX * pageNo) + pnt->x]);
tosihisa 0:b49309b1b9d3 27 }
tosihisa 0:b49309b1b9d3 28
tosihisa 0:b49309b1b9d3 29 void TinyDraw::drawPoint(TD_XY_t x,TD_XY_t y,TD_COLOR_t fcol) {
tosihisa 0:b49309b1b9d3 30 TD_COLOR_t *byte_ptr;
tosihisa 0:b49309b1b9d3 31 TD_COLOR_t bitmask = 0x80;
tosihisa 0:b49309b1b9d3 32 TD_POINT_t pnt;
tosihisa 0:b49309b1b9d3 33
tosihisa 0:b49309b1b9d3 34 pnt.x = x;
tosihisa 0:b49309b1b9d3 35 pnt.y = y;
tosihisa 0:b49309b1b9d3 36 byte_ptr = getVRAMPtr(&pnt);
tosihisa 0:b49309b1b9d3 37 bitmask = 0x01 << (y % 8);
tosihisa 0:b49309b1b9d3 38
tosihisa 0:b49309b1b9d3 39 /* When it is not a transparent shade, it writes it in VRAM. */
tosihisa 0:b49309b1b9d3 40 if((fcol & COL_TRANS) == 0){
tosihisa 0:b49309b1b9d3 41 if(fcol != 0x00){
tosihisa 0:b49309b1b9d3 42 *byte_ptr |= bitmask; /* write 1 */
tosihisa 0:b49309b1b9d3 43 } else {
tosihisa 0:b49309b1b9d3 44 *byte_ptr &= (~bitmask); /* write 0 */
tosihisa 0:b49309b1b9d3 45 }
tosihisa 0:b49309b1b9d3 46 }
tosihisa 0:b49309b1b9d3 47 }
tosihisa 0:b49309b1b9d3 48
tosihisa 0:b49309b1b9d3 49 void TinyDraw::clear(void) {
tosihisa 0:b49309b1b9d3 50 int i;
tosihisa 0:b49309b1b9d3 51 for (i = 0;i < sizeof(VRAM);i++) {
tosihisa 0:b49309b1b9d3 52 VRAM[i] = 0;
tosihisa 0:b49309b1b9d3 53 }
tosihisa 0:b49309b1b9d3 54 }
tosihisa 0:b49309b1b9d3 55
tosihisa 0:b49309b1b9d3 56 char *TinyDraw::getCharImage(int c,const struct font_desc *fontdesc) {
tosihisa 0:b49309b1b9d3 57 int w;
tosihisa 0:b49309b1b9d3 58 w = (fontdesc->width > 8) ? 2 : 1;
tosihisa 0:b49309b1b9d3 59 return ((char *)fontdesc->data) + ((w*fontdesc->height)*(c & 0xff));
tosihisa 0:b49309b1b9d3 60 }
tosihisa 0:b49309b1b9d3 61
tosihisa 0:b49309b1b9d3 62 /* It corresponds only when the width is below 16dots. */
tosihisa 0:b49309b1b9d3 63 void TinyDraw::drawChar(TD_POINT_t *pnt,int c,TD_COLOR_PAIR_t *col,const struct font_desc *fontdesc) {
tosihisa 0:b49309b1b9d3 64 int w,h;
tosihisa 0:b49309b1b9d3 65 char *imagePtr = getCharImage(c,fontdesc);
tosihisa 0:b49309b1b9d3 66 unsigned long mask = 0;
tosihisa 0:b49309b1b9d3 67 unsigned long maskTbl[] = { 0x80,0x8000 };
tosihisa 0:b49309b1b9d3 68 unsigned short yline;
tosihisa 0:b49309b1b9d3 69 TD_COLOR_t wcol;
tosihisa 0:b49309b1b9d3 70
tosihisa 0:b49309b1b9d3 71 for (h = 0;h < fontdesc->height;h++) {
tosihisa 0:b49309b1b9d3 72 mask = maskTbl[ (fontdesc->width - 1) / 8 ];
tosihisa 0:b49309b1b9d3 73 yline = (unsigned short)(*(imagePtr + 0));
tosihisa 0:b49309b1b9d3 74 if(fontdesc->width > 8){
tosihisa 0:b49309b1b9d3 75 yline = yline << 8;
tosihisa 0:b49309b1b9d3 76 yline |= (unsigned short)(*(imagePtr + 1));
tosihisa 0:b49309b1b9d3 77 }
tosihisa 0:b49309b1b9d3 78 for (w = 0;w < fontdesc->width;w++) {
tosihisa 0:b49309b1b9d3 79 wcol = (yline & mask) ? col->fore : col->back;
tosihisa 0:b49309b1b9d3 80 drawPoint(pnt->x+w,pnt->y+h,wcol);
tosihisa 0:b49309b1b9d3 81 mask = mask >> 1;
tosihisa 0:b49309b1b9d3 82 }
tosihisa 0:b49309b1b9d3 83 imagePtr += (fontdesc->width > 8) ? 2 : 1;
tosihisa 0:b49309b1b9d3 84 }
tosihisa 0:b49309b1b9d3 85 }
tosihisa 0:b49309b1b9d3 86
tosihisa 0:b49309b1b9d3 87 void TinyDraw::drawStr(TD_POINT_t *pnt,char *str,TD_COLOR_PAIR_t *col,const struct font_desc *fontdesc) {
tosihisa 0:b49309b1b9d3 88 char c;
tosihisa 0:b49309b1b9d3 89 TD_POINT_t tmp = *pnt;
tosihisa 0:b49309b1b9d3 90 int i = 0;
tosihisa 0:b49309b1b9d3 91 for (i = 0;(c = *(str+i)) != (char)('\0');i++) {
tosihisa 0:b49309b1b9d3 92 drawChar(&tmp,c,col,fontdesc);
tosihisa 0:b49309b1b9d3 93 tmp.x += fontdesc->width;
tosihisa 0:b49309b1b9d3 94 }
tosihisa 0:b49309b1b9d3 95 }
tosihisa 0:b49309b1b9d3 96
tosihisa 0:b49309b1b9d3 97 TD_XY_t TinyDraw::calcAbs(TD_XY_t v) {
tosihisa 0:b49309b1b9d3 98 return (v < 0) ? (0-v) : v;
tosihisa 0:b49309b1b9d3 99 }
tosihisa 0:b49309b1b9d3 100
tosihisa 0:b49309b1b9d3 101 TD_XY_t TinyDraw::calcMin(TD_XY_t v1,TD_XY_t v2) {
tosihisa 0:b49309b1b9d3 102 return (v1 <= v2) ? v1 : v2;
tosihisa 0:b49309b1b9d3 103 }
tosihisa 0:b49309b1b9d3 104
tosihisa 0:b49309b1b9d3 105 int TinyDraw::checkSign(TD_XY_t v) {
tosihisa 0:b49309b1b9d3 106 if (v < 0)
tosihisa 0:b49309b1b9d3 107 return -1;
tosihisa 0:b49309b1b9d3 108 else if (v == 0)
tosihisa 0:b49309b1b9d3 109 return 0;
tosihisa 0:b49309b1b9d3 110 return 1;
tosihisa 0:b49309b1b9d3 111 }
tosihisa 0:b49309b1b9d3 112
tosihisa 0:b49309b1b9d3 113 void TinyDraw::drawLine(TD_POINT_t *p1,TD_POINT_t *p2,TD_COLOR_PAIR_t *col) {
tosihisa 0:b49309b1b9d3 114 TD_XY_t d_x;
tosihisa 0:b49309b1b9d3 115 TD_XY_t d_y;
tosihisa 0:b49309b1b9d3 116 int s_1;
tosihisa 0:b49309b1b9d3 117 int s_2;
tosihisa 0:b49309b1b9d3 118 int i_c = 0;
tosihisa 0:b49309b1b9d3 119 TD_XY_t tmp;
tosihisa 0:b49309b1b9d3 120 long e;
tosihisa 0:b49309b1b9d3 121 TD_XY_t i;
tosihisa 0:b49309b1b9d3 122 TD_XY_t n_x;
tosihisa 0:b49309b1b9d3 123 TD_XY_t n_y;
tosihisa 0:b49309b1b9d3 124
tosihisa 0:b49309b1b9d3 125 n_x = p1->x;
tosihisa 0:b49309b1b9d3 126 n_y = p1->y;
tosihisa 0:b49309b1b9d3 127 d_x = calcAbs(p2->x - p1->x);
tosihisa 0:b49309b1b9d3 128 d_y = calcAbs(p2->y - p1->y);
tosihisa 0:b49309b1b9d3 129 s_1 = checkSign(p2->x - p1->x);
tosihisa 0:b49309b1b9d3 130 s_2 = checkSign(p2->y - p1->y);
tosihisa 0:b49309b1b9d3 131
tosihisa 0:b49309b1b9d3 132 if (d_x == 0) {
tosihisa 0:b49309b1b9d3 133 /* vertical */
tosihisa 0:b49309b1b9d3 134 n_y = calcMin(p1->y,p2->y);
tosihisa 0:b49309b1b9d3 135 for (i=0;i <= d_y;i++) {
tosihisa 0:b49309b1b9d3 136 drawPoint(n_x,n_y,col->fore);
tosihisa 0:b49309b1b9d3 137 n_y++;
tosihisa 0:b49309b1b9d3 138 }
tosihisa 0:b49309b1b9d3 139 } else if (d_y == 0) {
tosihisa 0:b49309b1b9d3 140 /* horizontal */
tosihisa 0:b49309b1b9d3 141 n_x = calcMin(p1->x,p2->x);
tosihisa 0:b49309b1b9d3 142 for (i=0;i <= d_x;i++) {
tosihisa 0:b49309b1b9d3 143 drawPoint(n_x,n_y,col->fore);
tosihisa 0:b49309b1b9d3 144 n_x++;
tosihisa 0:b49309b1b9d3 145 }
tosihisa 0:b49309b1b9d3 146 } else {
tosihisa 0:b49309b1b9d3 147 i_c = 0;
tosihisa 0:b49309b1b9d3 148 if (d_y > d_x) {
tosihisa 0:b49309b1b9d3 149 tmp = d_x;
tosihisa 0:b49309b1b9d3 150 d_x = d_y;
tosihisa 0:b49309b1b9d3 151 d_y = tmp;
tosihisa 0:b49309b1b9d3 152 i_c = 1;
tosihisa 0:b49309b1b9d3 153 }
tosihisa 0:b49309b1b9d3 154
tosihisa 0:b49309b1b9d3 155 e = 2 * d_y - d_x;
tosihisa 0:b49309b1b9d3 156 for (i=0;i <= d_x;i++) {
tosihisa 0:b49309b1b9d3 157 drawPoint(n_x,n_y,col->fore);
tosihisa 0:b49309b1b9d3 158 while (e>=0) {
tosihisa 0:b49309b1b9d3 159 if (i_c) {
tosihisa 0:b49309b1b9d3 160 n_x = n_x + s_1;
tosihisa 0:b49309b1b9d3 161 } else {
tosihisa 0:b49309b1b9d3 162 n_y = n_y + s_2;
tosihisa 0:b49309b1b9d3 163 }
tosihisa 0:b49309b1b9d3 164 e = e - 2 * d_x;
tosihisa 0:b49309b1b9d3 165 }
tosihisa 0:b49309b1b9d3 166 if (i_c) {
tosihisa 0:b49309b1b9d3 167 n_y = n_y + s_2;
tosihisa 0:b49309b1b9d3 168 } else {
tosihisa 0:b49309b1b9d3 169 n_x = n_x + s_1;
tosihisa 0:b49309b1b9d3 170 }
tosihisa 0:b49309b1b9d3 171 e = e + 2 * d_y;
tosihisa 0:b49309b1b9d3 172 }
tosihisa 0:b49309b1b9d3 173 }
tosihisa 0:b49309b1b9d3 174 /* last point (or p1 == p2 (1dot)) */
tosihisa 0:b49309b1b9d3 175 drawPoint(p2->x,p2->y,col->fore);
tosihisa 0:b49309b1b9d3 176 }
tosihisa 0:b49309b1b9d3 177
tosihisa 1:c2860a9f58b4 178 #if 0
tosihisa 1:c2860a9f58b4 179 void TinyDraw::drawEllipse( int x0, int y0, int r, int a, int b, int col )
tosihisa 1:c2860a9f58b4 180 {
tosihisa 1:c2860a9f58b4 181 int x = (int)( (double)r / sqrt( (double)a ) );
tosihisa 1:c2860a9f58b4 182 int y = 0;
tosihisa 1:c2860a9f58b4 183 double d = sqrt( (double)a ) * (double)r;
tosihisa 1:c2860a9f58b4 184 int F = (int)( -2.0 * d ) + a + 2 * b;
tosihisa 1:c2860a9f58b4 185 int H = (int)( -4.0 * d ) + 2 * a + b;
tosihisa 1:c2860a9f58b4 186
tosihisa 1:c2860a9f58b4 187 while ( x >= 0 ) {
tosihisa 1:c2860a9f58b4 188 pset( x0 + x, y0 + y, col );
tosihisa 1:c2860a9f58b4 189 pset( x0 - x, y0 + y, col );
tosihisa 1:c2860a9f58b4 190 pset( x0 + x, y0 - y, col );
tosihisa 1:c2860a9f58b4 191 pset( x0 - x, y0 - y, col );
tosihisa 1:c2860a9f58b4 192 if ( F >= 0 ) {
tosihisa 1:c2860a9f58b4 193 --x;
tosihisa 1:c2860a9f58b4 194 F -= 4 * a * x;
tosihisa 1:c2860a9f58b4 195 H -= 4 * a * x - 2 * a;
tosihisa 1:c2860a9f58b4 196 }
tosihisa 1:c2860a9f58b4 197 if ( H < 0 ) {
tosihisa 1:c2860a9f58b4 198 ++y;
tosihisa 1:c2860a9f58b4 199 F += 4 * b * y + 2 * b;
tosihisa 1:c2860a9f58b4 200 H += 4 * b * y;
tosihisa 1:c2860a9f58b4 201 }
tosihisa 1:c2860a9f58b4 202 }
tosihisa 1:c2860a9f58b4 203 }
tosihisa 1:c2860a9f58b4 204
tosihisa 1:c2860a9f58b4 205 void TinyDraw::drawCircle( int x0, int y0, int r, unsigned int col )
tosihisa 1:c2860a9f58b4 206 {
tosihisa 1:c2860a9f58b4 207 int x = r;
tosihisa 1:c2860a9f58b4 208 int y = 0;
tosihisa 1:c2860a9f58b4 209 int F = -2 * r + 3;
tosihisa 1:c2860a9f58b4 210
tosihisa 1:c2860a9f58b4 211 while ( x >= y ) {
tosihisa 1:c2860a9f58b4 212 pset( x0 + x, y0 + y, col );
tosihisa 1:c2860a9f58b4 213 pset( x0 - x, y0 + y, col );
tosihisa 1:c2860a9f58b4 214 pset( x0 + x, y0 - y, col );
tosihisa 1:c2860a9f58b4 215 pset( x0 - x, y0 - y, col );
tosihisa 1:c2860a9f58b4 216 pset( x0 + y, y0 + x, col );
tosihisa 1:c2860a9f58b4 217 pset( x0 - y, y0 + x, col );
tosihisa 1:c2860a9f58b4 218 pset( x0 + y, y0 - x, col );
tosihisa 1:c2860a9f58b4 219 pset( x0 - y, y0 - x, col );
tosihisa 1:c2860a9f58b4 220 if ( F >= 0 ) {
tosihisa 1:c2860a9f58b4 221 x--;
tosihisa 1:c2860a9f58b4 222 F -= 4 * x;
tosihisa 1:c2860a9f58b4 223 }
tosihisa 1:c2860a9f58b4 224 y++;
tosihisa 1:c2860a9f58b4 225 F += 4 * y + 2;
tosihisa 1:c2860a9f58b4 226 }
tosihisa 1:c2860a9f58b4 227 }
tosihisa 1:c2860a9f58b4 228
tosihisa 1:c2860a9f58b4 229 void TinyDraw::rotatePoint(int p1x,int p1y,int cx,int cy,double deg,int *p2x,int *p2y)
tosihisa 1:c2860a9f58b4 230 {
tosihisa 1:c2860a9f58b4 231 double xl1;
tosihisa 1:c2860a9f58b4 232 double yl1;
tosihisa 1:c2860a9f58b4 233 double xl2;
tosihisa 1:c2860a9f58b4 234 double yl2;
tosihisa 1:c2860a9f58b4 235 double _rad = deg * PI / 180;
tosihisa 1:c2860a9f58b4 236 double _cos_rad = cos(_rad);
tosihisa 1:c2860a9f58b4 237 double _sin_rad = sin(_rad);
tosihisa 1:c2860a9f58b4 238
tosihisa 1:c2860a9f58b4 239 xl1 = p1x - cx;
tosihisa 1:c2860a9f58b4 240 yl1 = p1y - cy;
tosihisa 1:c2860a9f58b4 241
tosihisa 1:c2860a9f58b4 242 xl2 = (_cos_rad*xl1) - (_sin_rad*yl1);
tosihisa 1:c2860a9f58b4 243 yl2 = (_sin_rad*xl1) - (_cos_rad*yl1);
tosihisa 1:c2860a9f58b4 244 *p2x = cx + (int)xl2;
tosihisa 1:c2860a9f58b4 245 *p2y = cy + (int)yl2;
tosihisa 1:c2860a9f58b4 246 }
tosihisa 1:c2860a9f58b4 247 #endif