Test for STM32F4

Dependents:   Nucleo_SSD1331

Fork of RGB_OLED_SSD1331 by Juergen M

Committer:
messi1
Date:
Tue Nov 17 21:20:37 2015 +0000
Revision:
10:ef7440718431
Parent:
8:ff74bd4d94d6
Child:
11:162aa3e801df
Improved the drawString function; Add setFont function

Who changed what in which revision?

UserRevisionLine numberNew contents of line
messi1 0:6e810b5b40a3 1 /*
messi1 0:6e810b5b40a3 2 * SGL.cpp
messi1 0:6e810b5b40a3 3 * A library for Seeed Graphical library
messi1 0:6e810b5b40a3 4 *
messi1 0:6e810b5b40a3 5 * Copyright (c) 2014 seeed technology inc.
messi1 0:6e810b5b40a3 6 * Author : lawliet.zou(lawliet.zou@gmail.com)
messi1 0:6e810b5b40a3 7 * Create Time : Jun 06, 2014
messi1 0:6e810b5b40a3 8 * Change Log :
messi1 0:6e810b5b40a3 9 *
messi1 0:6e810b5b40a3 10 * The MIT License (MIT)
messi1 0:6e810b5b40a3 11 *
messi1 0:6e810b5b40a3 12 * Permission is hereby granted, free of charge, to any person obtaining a copy
messi1 0:6e810b5b40a3 13 * of this software and associated documentation files (the "Software"), to deal
messi1 0:6e810b5b40a3 14 * in the Software without restriction, including without limitation the rights
messi1 0:6e810b5b40a3 15 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
messi1 0:6e810b5b40a3 16 * copies of the Software, and to permit persons to whom the Software is
messi1 0:6e810b5b40a3 17 * furnished to do so, subject to the following conditions:
messi1 0:6e810b5b40a3 18 *
messi1 0:6e810b5b40a3 19 * The above copyright notice and this permission notice shall be included in
messi1 0:6e810b5b40a3 20 * all copies or substantial portions of the Software.
messi1 0:6e810b5b40a3 21 *
messi1 0:6e810b5b40a3 22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
messi1 0:6e810b5b40a3 23 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
messi1 0:6e810b5b40a3 24 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
messi1 0:6e810b5b40a3 25 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
messi1 0:6e810b5b40a3 26 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
messi1 0:6e810b5b40a3 27 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
messi1 0:6e810b5b40a3 28 * THE SOFTWARE.
messi1 0:6e810b5b40a3 29 */
messi1 0:6e810b5b40a3 30 #include <stdlib.h>
messi1 0:6e810b5b40a3 31 #include "SGL.h"
messi1 10:ef7440718431 32 #include "SimpleFont.h"
messi1 0:6e810b5b40a3 33
messi1 8:ff74bd4d94d6 34 //---------------------------------------------------------------------------------------
messi1 10:ef7440718431 35 SGL::SGL(uint8_t width, uint8_t height):
messi1 10:ef7440718431 36 _width(width), _height(height),
messi1 10:ef7440718431 37 _currentFont(0),
messi1 10:ef7440718431 38 _fontWidth(0),
messi1 10:ef7440718431 39 _fontHeight(0),
messi1 10:ef7440718431 40 _fontStart(0),
messi1 10:ef7440718431 41 _fontStop(0)
messi1 10:ef7440718431 42 {}
messi1 0:6e810b5b40a3 43
messi1 8:ff74bd4d94d6 44 //---------------------------------------------------------------------------------------
messi1 4:1707ca53e7d5 45 void SGL::drawLine(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint16_t color)
messi1 0:6e810b5b40a3 46 {
messi1 4:1707ca53e7d5 47 uint8_t x = x1-x0;
messi1 4:1707ca53e7d5 48 uint8_t y = y1-y0;
messi1 10:ef7440718431 49 uint8_t dx = abs(x), sx = x0<x1 ? 1 : -1;
messi1 4:1707ca53e7d5 50 uint8_t dy = -abs(y), sy = y0<y1 ? 1 : -1;
messi1 4:1707ca53e7d5 51 uint8_t err = dx+dy, e2;
messi1 10:ef7440718431 52 for (;;)
messi1 10:ef7440718431 53 {
messi1 4:1707ca53e7d5 54 drawPixel(x0, y0,color);
messi1 0:6e810b5b40a3 55 e2 = 2*err;
messi1 0:6e810b5b40a3 56 if (e2 >= dy) {
messi1 0:6e810b5b40a3 57 if (x0 == x1) break;
messi1 0:6e810b5b40a3 58 err += dy; x0 += sx;
messi1 0:6e810b5b40a3 59 }
messi1 0:6e810b5b40a3 60 if (e2 <= dx) {
messi1 0:6e810b5b40a3 61 if (y0 == y1) break;
messi1 0:6e810b5b40a3 62 err += dx; y0 += sy;
messi1 0:6e810b5b40a3 63 }
messi1 0:6e810b5b40a3 64 }
messi1 0:6e810b5b40a3 65 }
messi1 0:6e810b5b40a3 66
messi1 8:ff74bd4d94d6 67 //---------------------------------------------------------------------------------------
messi1 8:ff74bd4d94d6 68 void SGL::drawVLine(uint8_t x, uint8_t y, uint8_t length,uint16_t color)
messi1 0:6e810b5b40a3 69 {
messi1 8:ff74bd4d94d6 70 uint8_t y1 = MIN(y+length,_height-1);
messi1 10:ef7440718431 71 for(uint8_t i = y; i < y1; ++i)
messi1 10:ef7440718431 72 {
messi1 8:ff74bd4d94d6 73 drawPixel(x, i, color);
messi1 0:6e810b5b40a3 74 }
messi1 0:6e810b5b40a3 75 }
messi1 0:6e810b5b40a3 76
messi1 8:ff74bd4d94d6 77 //---------------------------------------------------------------------------------------
messi1 8:ff74bd4d94d6 78 void SGL::drawHLine(uint8_t x, uint8_t y, uint8_t length, uint16_t color)
messi1 0:6e810b5b40a3 79 {
messi1 8:ff74bd4d94d6 80 uint8_t x1 = MIN(x+length,_width-1);
messi1 10:ef7440718431 81 for(uint8_t i = x; i < x1; ++i)
messi1 10:ef7440718431 82 {
messi1 8:ff74bd4d94d6 83 drawPixel(i, y, color);
messi1 0:6e810b5b40a3 84 }
messi1 0:6e810b5b40a3 85 }
messi1 0:6e810b5b40a3 86
messi1 8:ff74bd4d94d6 87 //---------------------------------------------------------------------------------------
messi1 8:ff74bd4d94d6 88 void SGL::drawRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint16_t color)
messi1 0:6e810b5b40a3 89 {
messi1 8:ff74bd4d94d6 90 drawHLine(x, y, width, color);
messi1 8:ff74bd4d94d6 91 drawHLine(x, y+height, width, color);
messi1 8:ff74bd4d94d6 92 drawVLine(x, y, height, color);
messi1 8:ff74bd4d94d6 93 drawVLine(x+width, y, height, color);
messi1 0:6e810b5b40a3 94 }
messi1 0:6e810b5b40a3 95
messi1 8:ff74bd4d94d6 96 //---------------------------------------------------------------------------------------
messi1 8:ff74bd4d94d6 97 void SGL::fillRect(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint16_t color)
messi1 0:6e810b5b40a3 98 {
messi1 10:ef7440718431 99 for(uint8_t i = 0; i < height; ++i)
messi1 10:ef7440718431 100 {
messi1 10:ef7440718431 101 for(uint8_t j = 0; j < width; ++j)
messi1 10:ef7440718431 102 {
messi1 8:ff74bd4d94d6 103 drawPixel( x+j, y+i, color);
messi1 0:6e810b5b40a3 104 }
messi1 0:6e810b5b40a3 105 }
messi1 0:6e810b5b40a3 106 }
messi1 0:6e810b5b40a3 107
messi1 8:ff74bd4d94d6 108 //---------------------------------------------------------------------------------------
messi1 8:ff74bd4d94d6 109 void SGL::drawCircle(uint8_t poX, uint8_t poY, uint8_t r, uint16_t color)
messi1 0:6e810b5b40a3 110 {
messi1 0:6e810b5b40a3 111 int x = -r, y = 0, err = 2-2*r, e2;
messi1 10:ef7440718431 112 do
messi1 10:ef7440718431 113 {
messi1 0:6e810b5b40a3 114 drawPixel(poX-x, poY+y,color);
messi1 0:6e810b5b40a3 115 drawPixel(poX+x, poY+y,color);
messi1 0:6e810b5b40a3 116 drawPixel(poX+x, poY-y,color);
messi1 0:6e810b5b40a3 117 drawPixel(poX-x, poY-y,color);
messi1 0:6e810b5b40a3 118 e2 = err;
messi1 10:ef7440718431 119 if(e2 <= y)
messi1 10:ef7440718431 120 {
messi1 0:6e810b5b40a3 121 err += ++y*2+1;
messi1 0:6e810b5b40a3 122 if(-x == y && e2 <= x) e2 = 0;
messi1 0:6e810b5b40a3 123 }
messi1 0:6e810b5b40a3 124 if(e2 > x) err += ++x*2+1;
messi1 0:6e810b5b40a3 125 } while(x <= 0);
messi1 0:6e810b5b40a3 126 }
messi1 0:6e810b5b40a3 127
messi1 8:ff74bd4d94d6 128 //---------------------------------------------------------------------------------------
messi1 8:ff74bd4d94d6 129 void SGL::fillCircle(uint8_t poX, uint8_t poY, uint8_t r, uint16_t color)
messi1 0:6e810b5b40a3 130 {
messi1 0:6e810b5b40a3 131 int x = -r, y = 0, err = 2-2*r, e2;
messi1 10:ef7440718431 132 do
messi1 10:ef7440718431 133 {
messi1 8:ff74bd4d94d6 134 drawVLine(poX-x, poY-y, 2*y, color);
messi1 8:ff74bd4d94d6 135 drawVLine(poX+x, poY-y, 2*y, color);
messi1 0:6e810b5b40a3 136 e2 = err;
messi1 10:ef7440718431 137 if(e2 <= y)
messi1 10:ef7440718431 138 {
messi1 0:6e810b5b40a3 139 err += ++y*2+1;
messi1 0:6e810b5b40a3 140 if(-x == y && e2 <= x) e2 = 0;
messi1 0:6e810b5b40a3 141 }
messi1 0:6e810b5b40a3 142 if(e2 > x) err += ++x*2+1;
messi1 0:6e810b5b40a3 143 }while(x <= 0);
messi1 0:6e810b5b40a3 144 }
messi1 0:6e810b5b40a3 145
messi1 8:ff74bd4d94d6 146 //---------------------------------------------------------------------------------------
messi1 8:ff74bd4d94d6 147 void SGL::drawTraingle(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint16_t color)
messi1 0:6e810b5b40a3 148 {
messi1 0:6e810b5b40a3 149 drawLine(x0, y0, x1, y1,color);
messi1 0:6e810b5b40a3 150 drawLine(x1, y1, x2, y2,color);
messi1 0:6e810b5b40a3 151 drawLine(x2, y2, x0, y0,color);
messi1 0:6e810b5b40a3 152 }
messi1 0:6e810b5b40a3 153
messi1 8:ff74bd4d94d6 154 //---------------------------------------------------------------------------------------
messi1 8:ff74bd4d94d6 155 void SGL::fillTraingle(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t x2, uint8_t y2, uint16_t color)
messi1 0:6e810b5b40a3 156 {
messi1 8:ff74bd4d94d6 157 uint8_t a, b, y, last;
messi1 0:6e810b5b40a3 158
messi1 0:6e810b5b40a3 159 if(y0 > y1){ swap(&y0, &y1); swap(&x0, &x1); }
messi1 0:6e810b5b40a3 160 if(y1 > y2){ swap(&y2, &y1); swap(&x2, &x1); }
messi1 0:6e810b5b40a3 161 if(y0 > y1){ swap(&y1, &y0); swap(&x1, &x0); }
messi1 0:6e810b5b40a3 162
messi1 0:6e810b5b40a3 163 if(y0 == y2){
messi1 0:6e810b5b40a3 164 x0 = MIN(x0,x1)<x2?MIN(x0,x1):x2;
messi1 0:6e810b5b40a3 165 x2 = MAX(x0,x1)>x2?MAX(x0,x1):x2;
messi1 8:ff74bd4d94d6 166 drawHLine(x0, y0, x2-x0, color);
messi1 0:6e810b5b40a3 167 return;
messi1 0:6e810b5b40a3 168 }
messi1 0:6e810b5b40a3 169
messi1 0:6e810b5b40a3 170 int16_t dx01 = x1 - x0, dy01 = y1 - y0,
messi1 0:6e810b5b40a3 171 dx02 = x2 - x0, dy02 = y2 - y0,
messi1 0:6e810b5b40a3 172 dx12 = x2 - x1, dy12 = y2 - y1;
messi1 0:6e810b5b40a3 173 int16_t sa = 0, sb = 0;
messi1 0:6e810b5b40a3 174
messi1 8:ff74bd4d94d6 175 if(y1 == y2)
messi1 8:ff74bd4d94d6 176 last = y1;
messi1 8:ff74bd4d94d6 177 else
messi1 8:ff74bd4d94d6 178 last = y1-1;
messi1 0:6e810b5b40a3 179
messi1 10:ef7440718431 180 for(y = y0; y <= last; ++y)
messi1 10:ef7440718431 181 {
messi1 0:6e810b5b40a3 182 a = x0 + sa / dy01;
messi1 0:6e810b5b40a3 183 b = x0 + sb / dy02;
messi1 0:6e810b5b40a3 184 sa += dx01;
messi1 0:6e810b5b40a3 185 sb += dx02;
messi1 0:6e810b5b40a3 186 if(a > b) swap(&a,&b);
messi1 8:ff74bd4d94d6 187 drawHLine(a, y, b-a+1, color);
messi1 0:6e810b5b40a3 188 }
messi1 0:6e810b5b40a3 189
messi1 0:6e810b5b40a3 190 sa = dx12 * (y - y1);
messi1 0:6e810b5b40a3 191 sb = dx02 * (y - y0);
messi1 10:ef7440718431 192 for(; y<=y2; ++y)
messi1 10:ef7440718431 193 {
messi1 0:6e810b5b40a3 194 a = x1 + sa / dy12;
messi1 0:6e810b5b40a3 195 b = x0 + sb / dy02;
messi1 0:6e810b5b40a3 196 sa += dx12;
messi1 0:6e810b5b40a3 197 sb += dx02;
messi1 0:6e810b5b40a3 198 if(a > b) swap(&a,&b);
messi1 8:ff74bd4d94d6 199 drawHLine(a, y, b-a+1, color);
messi1 0:6e810b5b40a3 200 }
messi1 0:6e810b5b40a3 201 }
messi1 0:6e810b5b40a3 202
messi1 8:ff74bd4d94d6 203 //---------------------------------------------------------------------------------------
messi1 10:ef7440718431 204 void SGL::drawChar(uint8_t ascii, uint8_t x, uint8_t y, float zoom, uint16_t color)
messi1 0:6e810b5b40a3 205 {
messi1 10:ef7440718431 206 if(!_currentFont && !*_currentFont)
messi1 10:ef7440718431 207 return;
messi1 10:ef7440718431 208
messi1 10:ef7440718431 209 if((ascii < _fontStart)||(ascii > _fontStop)){
messi1 0:6e810b5b40a3 210 return;
messi1 0:6e810b5b40a3 211 }
messi1 0:6e810b5b40a3 212
messi1 10:ef7440718431 213 for(uint8_t i = 0; i < _fontWidth; ++i )
messi1 10:ef7440718431 214 {
messi1 10:ef7440718431 215 uint8_t temp = simpleFont[ascii-0x20][i];
messi1 10:ef7440718431 216 uint8_t inrun = 0;
messi1 8:ff74bd4d94d6 217 uint8_t runlen = 0;
messi1 8:ff74bd4d94d6 218 uint8_t endrun = 0;
messi1 0:6e810b5b40a3 219
messi1 10:ef7440718431 220 for(uint8_t f = 0; f < _fontHeight; ++f)
messi1 10:ef7440718431 221 {
messi1 10:ef7440718431 222 if((temp>>f)&0x01)
messi1 10:ef7440718431 223 {
messi1 0:6e810b5b40a3 224 if (inrun) runlen += 1;
messi1 10:ef7440718431 225 else
messi1 10:ef7440718431 226 {
messi1 10:ef7440718431 227 inrun = 1;
messi1 0:6e810b5b40a3 228 runlen = 1;
messi1 0:6e810b5b40a3 229 }
messi1 10:ef7440718431 230 }
messi1 10:ef7440718431 231 else if (inrun)
messi1 10:ef7440718431 232 {
messi1 0:6e810b5b40a3 233 endrun = 1;
messi1 10:ef7440718431 234 inrun = 0;
messi1 0:6e810b5b40a3 235 }
messi1 0:6e810b5b40a3 236
messi1 10:ef7440718431 237 if (f == _fontHeight - 1 && inrun)
messi1 10:ef7440718431 238 {
messi1 0:6e810b5b40a3 239 endrun = 1;
messi1 0:6e810b5b40a3 240 // need the +1 b/c we this code is normally
messi1 0:6e810b5b40a3 241 // only triggered when f == FONT_Y, due to the
messi1 0:6e810b5b40a3 242 // edge-triggered nature of this algorithm
messi1 0:6e810b5b40a3 243 f += 1;
messi1 0:6e810b5b40a3 244 }
messi1 0:6e810b5b40a3 245
messi1 10:ef7440718431 246 if (endrun)
messi1 10:ef7440718431 247 {
messi1 10:ef7440718431 248 fillRect(x+i*zoom, y+(f-runlen)*zoom, zoom, runlen*zoom, color);
messi1 0:6e810b5b40a3 249 inrun = 0;
messi1 0:6e810b5b40a3 250 runlen = 0;
messi1 0:6e810b5b40a3 251 endrun = 0;
messi1 0:6e810b5b40a3 252 }
messi1 0:6e810b5b40a3 253 }
messi1 0:6e810b5b40a3 254 }
messi1 0:6e810b5b40a3 255 }
messi1 0:6e810b5b40a3 256
messi1 8:ff74bd4d94d6 257 //---------------------------------------------------------------------------------------
messi1 10:ef7440718431 258 void SGL::drawString(const char *string, uint8_t x, uint8_t y, float zoom, uint16_t color, uint8_t fontSpace)
messi1 0:6e810b5b40a3 259 {
messi1 10:ef7440718431 260 if(!_currentFont && !*_currentFont)
messi1 10:ef7440718431 261 return;
messi1 10:ef7440718431 262
messi1 10:ef7440718431 263 while(*string)
messi1 10:ef7440718431 264 {
messi1 10:ef7440718431 265 drawChar(*string, x, y, zoom, color);
messi1 0:6e810b5b40a3 266 *string++;
messi1 10:ef7440718431 267 x += fontSpace*zoom;
messi1 10:ef7440718431 268 if(x >= _width-1)
messi1 10:ef7440718431 269 {
messi1 10:ef7440718431 270 y += _fontHeight*zoom;
messi1 0:6e810b5b40a3 271 x = 0;
messi1 0:6e810b5b40a3 272 }
messi1 0:6e810b5b40a3 273 }
messi1 0:6e810b5b40a3 274 }
messi1 0:6e810b5b40a3 275
messi1 8:ff74bd4d94d6 276 //---------------------------------------------------------------------------------------
messi1 8:ff74bd4d94d6 277 void SGL::drawBitMap(uint8_t x, uint8_t y, const uint8_t *bitmap, uint8_t width, uint8_t height, uint16_t color)
messi1 0:6e810b5b40a3 278 {
messi1 8:ff74bd4d94d6 279 uint8_t byteWidth = (width + 7) / 8;
messi1 8:ff74bd4d94d6 280
messi1 8:ff74bd4d94d6 281 for(uint8_t j = 0; j < height; ++j)
messi1 8:ff74bd4d94d6 282 {
messi1 8:ff74bd4d94d6 283 for(uint8_t i = 0; i < width; ++i )
messi1 8:ff74bd4d94d6 284 {
messi1 8:ff74bd4d94d6 285 if( *(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7)) )
messi1 8:ff74bd4d94d6 286 {
messi1 0:6e810b5b40a3 287 drawPixel(x+i, y+j, color);
messi1 0:6e810b5b40a3 288 }
messi1 0:6e810b5b40a3 289 }
messi1 0:6e810b5b40a3 290 }
messi1 0:6e810b5b40a3 291 }
messi1 0:6e810b5b40a3 292
messi1 8:ff74bd4d94d6 293 //---------------------------------------------------------------------------------------
messi1 0:6e810b5b40a3 294 void SGL::fillScreen(uint16_t color)
messi1 0:6e810b5b40a3 295 {
messi1 8:ff74bd4d94d6 296 fillRect(0, 0, _width, _height, color);
messi1 10:ef7440718431 297 }
messi1 10:ef7440718431 298
messi1 10:ef7440718431 299 //---------------------------------------------------------------------------------------
messi1 10:ef7440718431 300 void SGL::setFont(FontType font, uint8_t width, uint8_t height, uint8_t start, uint8_t stop)
messi1 10:ef7440718431 301 {
messi1 10:ef7440718431 302 if(!font && !*font)
messi1 10:ef7440718431 303 return;
messi1 10:ef7440718431 304
messi1 10:ef7440718431 305 _currentFont= font;
messi1 10:ef7440718431 306 _fontWidth = width;
messi1 10:ef7440718431 307 _fontHeight = height;
messi1 10:ef7440718431 308 _fontStart = start;
messi1 10:ef7440718431 309 _fontStop = stop;
messi1 0:6e810b5b40a3 310 }