Test for STM32F4

Dependents:   Nucleo_SSD1331

Fork of RGB_OLED_SSD1331 by Juergen M

Committer:
messi1
Date:
Tue Nov 10 22:51:46 2015 +0000
Revision:
0:6e810b5b40a3
Child:
4:1707ca53e7d5
Init version

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 0:6e810b5b40a3 32
messi1 0:6e810b5b40a3 33 SGL::SGL(uint16_t width, uint16_t height)
messi1 0:6e810b5b40a3 34 {
messi1 0:6e810b5b40a3 35 _width = width;
messi1 0:6e810b5b40a3 36 _height = height;
messi1 0:6e810b5b40a3 37 }
messi1 0:6e810b5b40a3 38
messi1 0:6e810b5b40a3 39 void SGL::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color)
messi1 0:6e810b5b40a3 40 {
messi1 0:6e810b5b40a3 41 int x = x1-x0;
messi1 0:6e810b5b40a3 42 int y = y1-y0;
messi1 0:6e810b5b40a3 43 int dx = abs(x), sx = x0<x1 ? 1 : -1;
messi1 0:6e810b5b40a3 44 int dy = -abs(y), sy = y0<y1 ? 1 : -1;
messi1 0:6e810b5b40a3 45 int err = dx+dy, e2;
messi1 0:6e810b5b40a3 46 for (;;){
messi1 0:6e810b5b40a3 47 drawPixel(x0,y0,color);
messi1 0:6e810b5b40a3 48 e2 = 2*err;
messi1 0:6e810b5b40a3 49 if (e2 >= dy) {
messi1 0:6e810b5b40a3 50 if (x0 == x1) break;
messi1 0:6e810b5b40a3 51 err += dy; x0 += sx;
messi1 0:6e810b5b40a3 52 }
messi1 0:6e810b5b40a3 53 if (e2 <= dx) {
messi1 0:6e810b5b40a3 54 if (y0 == y1) break;
messi1 0:6e810b5b40a3 55 err += dx; y0 += sy;
messi1 0:6e810b5b40a3 56 }
messi1 0:6e810b5b40a3 57 }
messi1 0:6e810b5b40a3 58 }
messi1 0:6e810b5b40a3 59
messi1 0:6e810b5b40a3 60 void SGL::drawVerticalLine(uint16_t x, uint16_t y, uint16_t height,uint16_t color)
messi1 0:6e810b5b40a3 61 {
messi1 0:6e810b5b40a3 62 uint16_t y1 = MIN(y+height,_height-1);
messi1 0:6e810b5b40a3 63 for(int16_t i = y; i < y1; i++){
messi1 0:6e810b5b40a3 64 drawPixel(x,i,color);
messi1 0:6e810b5b40a3 65 }
messi1 0:6e810b5b40a3 66 }
messi1 0:6e810b5b40a3 67
messi1 0:6e810b5b40a3 68 void SGL::drawHorizontalLine(uint16_t x, uint16_t y, uint16_t width, uint16_t color)
messi1 0:6e810b5b40a3 69 {
messi1 0:6e810b5b40a3 70 uint16_t x1 = MIN(x+width,_width-1);
messi1 0:6e810b5b40a3 71 for(int16_t i = x; i < x1; i++){
messi1 0:6e810b5b40a3 72 drawPixel(i,y,color);
messi1 0:6e810b5b40a3 73 }
messi1 0:6e810b5b40a3 74 }
messi1 0:6e810b5b40a3 75
messi1 0:6e810b5b40a3 76 void SGL::drawRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color)
messi1 0:6e810b5b40a3 77 {
messi1 0:6e810b5b40a3 78 drawHorizontalLine(x, y, width, color);
messi1 0:6e810b5b40a3 79 drawHorizontalLine(x, y+height, width, color);
messi1 0:6e810b5b40a3 80 drawVerticalLine(x, y, height, color);
messi1 0:6e810b5b40a3 81 drawVerticalLine(x+width, y, height, color);
messi1 0:6e810b5b40a3 82 }
messi1 0:6e810b5b40a3 83
messi1 0:6e810b5b40a3 84 void SGL::fillRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color)
messi1 0:6e810b5b40a3 85 {
messi1 0:6e810b5b40a3 86 for(uint16_t i = 0; i < height; i++){
messi1 0:6e810b5b40a3 87 for(uint16_t j = 0; j < width; j++){
messi1 0:6e810b5b40a3 88 drawPixel(x+j,y+i,color);
messi1 0:6e810b5b40a3 89 }
messi1 0:6e810b5b40a3 90 }
messi1 0:6e810b5b40a3 91 }
messi1 0:6e810b5b40a3 92
messi1 0:6e810b5b40a3 93 void SGL::drawCircle(uint16_t poX, uint16_t poY, uint16_t r, uint16_t color)
messi1 0:6e810b5b40a3 94 {
messi1 0:6e810b5b40a3 95 int x = -r, y = 0, err = 2-2*r, e2;
messi1 0:6e810b5b40a3 96 do{
messi1 0:6e810b5b40a3 97 drawPixel(poX-x, poY+y,color);
messi1 0:6e810b5b40a3 98 drawPixel(poX+x, poY+y,color);
messi1 0:6e810b5b40a3 99 drawPixel(poX+x, poY-y,color);
messi1 0:6e810b5b40a3 100 drawPixel(poX-x, poY-y,color);
messi1 0:6e810b5b40a3 101 e2 = err;
messi1 0:6e810b5b40a3 102 if(e2 <= y) {
messi1 0:6e810b5b40a3 103 err += ++y*2+1;
messi1 0:6e810b5b40a3 104 if(-x == y && e2 <= x) e2 = 0;
messi1 0:6e810b5b40a3 105 }
messi1 0:6e810b5b40a3 106 if(e2 > x) err += ++x*2+1;
messi1 0:6e810b5b40a3 107 } while(x <= 0);
messi1 0:6e810b5b40a3 108 }
messi1 0:6e810b5b40a3 109
messi1 0:6e810b5b40a3 110 void SGL::fillCircle(uint16_t poX, uint16_t poY, uint16_t r, uint16_t color)
messi1 0:6e810b5b40a3 111 {
messi1 0:6e810b5b40a3 112 int x = -r, y = 0, err = 2-2*r, e2;
messi1 0:6e810b5b40a3 113 do{
messi1 0:6e810b5b40a3 114 drawVerticalLine(poX-x, poY-y, 2*y, color);
messi1 0:6e810b5b40a3 115 drawVerticalLine(poX+x, poY-y, 2*y, color);
messi1 0:6e810b5b40a3 116 e2 = err;
messi1 0:6e810b5b40a3 117 if(e2 <= y){
messi1 0:6e810b5b40a3 118 err += ++y*2+1;
messi1 0:6e810b5b40a3 119 if(-x == y && e2 <= x) e2 = 0;
messi1 0:6e810b5b40a3 120 }
messi1 0:6e810b5b40a3 121 if(e2 > x) err += ++x*2+1;
messi1 0:6e810b5b40a3 122 }while(x <= 0);
messi1 0:6e810b5b40a3 123 }
messi1 0:6e810b5b40a3 124
messi1 0:6e810b5b40a3 125 void SGL::drawTraingle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1,uint16_t x2, uint16_t y2, uint16_t color)
messi1 0:6e810b5b40a3 126 {
messi1 0:6e810b5b40a3 127 drawLine(x0, y0, x1, y1,color);
messi1 0:6e810b5b40a3 128 drawLine(x1, y1, x2, y2,color);
messi1 0:6e810b5b40a3 129 drawLine(x2, y2, x0, y0,color);
messi1 0:6e810b5b40a3 130 }
messi1 0:6e810b5b40a3 131
messi1 0:6e810b5b40a3 132 void SGL::fillTraingle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1,uint16_t x2, uint16_t y2, uint16_t color)
messi1 0:6e810b5b40a3 133 {
messi1 0:6e810b5b40a3 134 uint16_t a, b, y, last;
messi1 0:6e810b5b40a3 135
messi1 0:6e810b5b40a3 136 if(y0 > y1){ swap(&y0, &y1); swap(&x0, &x1); }
messi1 0:6e810b5b40a3 137 if(y1 > y2){ swap(&y2, &y1); swap(&x2, &x1); }
messi1 0:6e810b5b40a3 138 if(y0 > y1){ swap(&y1, &y0); swap(&x1, &x0); }
messi1 0:6e810b5b40a3 139
messi1 0:6e810b5b40a3 140 if(y0 == y2){
messi1 0:6e810b5b40a3 141 x0 = MIN(x0,x1)<x2?MIN(x0,x1):x2;
messi1 0:6e810b5b40a3 142 x2 = MAX(x0,x1)>x2?MAX(x0,x1):x2;
messi1 0:6e810b5b40a3 143 drawHorizontalLine(x0, y0, x2-x0, color);
messi1 0:6e810b5b40a3 144 return;
messi1 0:6e810b5b40a3 145 }
messi1 0:6e810b5b40a3 146
messi1 0:6e810b5b40a3 147 int16_t dx01 = x1 - x0, dy01 = y1 - y0,
messi1 0:6e810b5b40a3 148 dx02 = x2 - x0, dy02 = y2 - y0,
messi1 0:6e810b5b40a3 149 dx12 = x2 - x1, dy12 = y2 - y1;
messi1 0:6e810b5b40a3 150 int16_t sa = 0, sb = 0;
messi1 0:6e810b5b40a3 151
messi1 0:6e810b5b40a3 152 if(y1 == y2) last = y1;
messi1 0:6e810b5b40a3 153 else last = y1-1;
messi1 0:6e810b5b40a3 154
messi1 0:6e810b5b40a3 155 for(y=y0; y<=last; y++) {
messi1 0:6e810b5b40a3 156 a = x0 + sa / dy01;
messi1 0:6e810b5b40a3 157 b = x0 + sb / dy02;
messi1 0:6e810b5b40a3 158 sa += dx01;
messi1 0:6e810b5b40a3 159 sb += dx02;
messi1 0:6e810b5b40a3 160 if(a > b) swap(&a,&b);
messi1 0:6e810b5b40a3 161 drawHorizontalLine(a, y, b-a+1, color);
messi1 0:6e810b5b40a3 162 }
messi1 0:6e810b5b40a3 163
messi1 0:6e810b5b40a3 164 sa = dx12 * (y - y1);
messi1 0:6e810b5b40a3 165 sb = dx02 * (y - y0);
messi1 0:6e810b5b40a3 166 for(; y<=y2; y++) {
messi1 0:6e810b5b40a3 167 a = x1 + sa / dy12;
messi1 0:6e810b5b40a3 168 b = x0 + sb / dy02;
messi1 0:6e810b5b40a3 169 sa += dx12;
messi1 0:6e810b5b40a3 170 sb += dx02;
messi1 0:6e810b5b40a3 171 if(a > b) swap(&a,&b);
messi1 0:6e810b5b40a3 172 drawHorizontalLine(a, y, b-a+1, color);
messi1 0:6e810b5b40a3 173 }
messi1 0:6e810b5b40a3 174 }
messi1 0:6e810b5b40a3 175
messi1 0:6e810b5b40a3 176 void SGL::drawChar(uint8_t ascii, uint16_t x, uint16_t y, uint16_t size, uint16_t color)
messi1 0:6e810b5b40a3 177 {
messi1 0:6e810b5b40a3 178 if((ascii<32)||(ascii>=127)){
messi1 0:6e810b5b40a3 179 return;
messi1 0:6e810b5b40a3 180 }
messi1 0:6e810b5b40a3 181
messi1 0:6e810b5b40a3 182 for (int8_t i = 0; i < FONT_X; i++ ) {
messi1 0:6e810b5b40a3 183 int8_t temp = simpleFont[ascii-0x20][i];
messi1 0:6e810b5b40a3 184 int8_t inrun = 0;
messi1 0:6e810b5b40a3 185 int8_t runlen = 0;
messi1 0:6e810b5b40a3 186 int8_t endrun = 0;
messi1 0:6e810b5b40a3 187
messi1 0:6e810b5b40a3 188 for(int8_t f = 0; f < FONT_Y; f++){
messi1 0:6e810b5b40a3 189 if((temp>>f)&0x01){
messi1 0:6e810b5b40a3 190 if (inrun) runlen += 1;
messi1 0:6e810b5b40a3 191 else {
messi1 0:6e810b5b40a3 192 inrun = 1;
messi1 0:6e810b5b40a3 193 runlen = 1;
messi1 0:6e810b5b40a3 194 }
messi1 0:6e810b5b40a3 195 } else if (inrun) {
messi1 0:6e810b5b40a3 196 endrun = 1;
messi1 0:6e810b5b40a3 197 inrun = 0;
messi1 0:6e810b5b40a3 198 }
messi1 0:6e810b5b40a3 199
messi1 0:6e810b5b40a3 200 if (f == FONT_Y - 1 && inrun) {
messi1 0:6e810b5b40a3 201 endrun = 1;
messi1 0:6e810b5b40a3 202 // need the +1 b/c we this code is normally
messi1 0:6e810b5b40a3 203 // only triggered when f == FONT_Y, due to the
messi1 0:6e810b5b40a3 204 // edge-triggered nature of this algorithm
messi1 0:6e810b5b40a3 205 f += 1;
messi1 0:6e810b5b40a3 206 }
messi1 0:6e810b5b40a3 207
messi1 0:6e810b5b40a3 208 if (endrun) {
messi1 0:6e810b5b40a3 209 fillRectangle(x+i*size, y+(f-runlen)*size, size, runlen*size, color);
messi1 0:6e810b5b40a3 210 inrun = 0;
messi1 0:6e810b5b40a3 211 runlen = 0;
messi1 0:6e810b5b40a3 212 endrun = 0;
messi1 0:6e810b5b40a3 213 }
messi1 0:6e810b5b40a3 214 }
messi1 0:6e810b5b40a3 215 }
messi1 0:6e810b5b40a3 216 }
messi1 0:6e810b5b40a3 217
messi1 0:6e810b5b40a3 218 void SGL::drawString(char *string, uint16_t x, uint16_t y, uint16_t size, uint16_t color)
messi1 0:6e810b5b40a3 219 {
messi1 0:6e810b5b40a3 220 while(*string){
messi1 0:6e810b5b40a3 221 drawChar(*string, x, y, size, color);
messi1 0:6e810b5b40a3 222 *string++;
messi1 0:6e810b5b40a3 223 x += FONT_SPACE*size;
messi1 0:6e810b5b40a3 224 if(x >= _width-1){
messi1 0:6e810b5b40a3 225 y += FONT_Y*size;
messi1 0:6e810b5b40a3 226 x = 0;
messi1 0:6e810b5b40a3 227 }
messi1 0:6e810b5b40a3 228 }
messi1 0:6e810b5b40a3 229 }
messi1 0:6e810b5b40a3 230
messi1 0:6e810b5b40a3 231 void SGL::drawBitMap(uint16_t x, uint16_t y, const uint8_t *bitmap, uint16_t width, int16_t height, uint16_t color)
messi1 0:6e810b5b40a3 232 {
messi1 0:6e810b5b40a3 233 uint16_t i, j, byteWidth = (width + 7) / 8;
messi1 0:6e810b5b40a3 234 for(j = 0; j < height; j++){
messi1 0:6e810b5b40a3 235 for(i = 0; i < width; i++ ) {
messi1 0:6e810b5b40a3 236 if( *(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7)) ) {
messi1 0:6e810b5b40a3 237 drawPixel(x+i, y+j, color);
messi1 0:6e810b5b40a3 238 }
messi1 0:6e810b5b40a3 239 }
messi1 0:6e810b5b40a3 240 }
messi1 0:6e810b5b40a3 241 }
messi1 0:6e810b5b40a3 242
messi1 0:6e810b5b40a3 243 void SGL::fillScreen(uint16_t color)
messi1 0:6e810b5b40a3 244 {
messi1 0:6e810b5b40a3 245 fillRectangle(0, 0, _width, _height, color);
messi1 0:6e810b5b40a3 246 }