Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 4a4d5d6
Showing
3 changed files
with
547 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,223 @@ | |||
#include "Adafruit_GFX.h" | |||
#include "glcdfont.c" | |||
#include <avr/pgmspace.h> | |||
|
|||
// draw a circle outline | |||
void Adafruit_GFX::drawCircle(uint8_t x0, uint8_t y0, uint8_t r, | |||
uint8_t color) { | |||
int8_t f = 1 - r; | |||
int8_t ddF_x = 1; | |||
int8_t ddF_y = -2 * r; | |||
int8_t x = 0; | |||
int8_t y = r; | |||
|
|||
drawPixel(x0, y0+r, color); | |||
drawPixel(x0, y0-r, color); | |||
drawPixel(x0+r, y0, color); | |||
drawPixel(x0-r, y0, color); | |||
|
|||
while (x<y) { | |||
if (f >= 0) { | |||
y--; | |||
ddF_y += 2; | |||
f += ddF_y; | |||
} | |||
x++; | |||
ddF_x += 2; | |||
f += ddF_x; | |||
|
|||
drawPixel(x0 + x, y0 + y, color); | |||
drawPixel(x0 - x, y0 + y, color); | |||
drawPixel(x0 + x, y0 - y, color); | |||
drawPixel(x0 - x, y0 - y, color); | |||
|
|||
drawPixel(x0 + y, y0 + x, color); | |||
drawPixel(x0 - y, y0 + x, color); | |||
drawPixel(x0 + y, y0 - x, color); | |||
drawPixel(x0 - y, y0 - x, color); | |||
|
|||
} | |||
} | |||
|
|||
void Adafruit_GFX::fillCircle(uint8_t x0, uint8_t y0, uint8_t r, | |||
uint8_t color) { | |||
int8_t f = 1 - r; | |||
int8_t ddF_x = 1; | |||
int8_t ddF_y = -2 * r; | |||
int8_t x = 0; | |||
int8_t y = r; | |||
|
|||
drawFastVLine(x0, y0-r, r*2+1, color); | |||
|
|||
while (x<y) { | |||
if (f >= 0) { | |||
y--; | |||
ddF_y += 2; | |||
f += ddF_y; | |||
} | |||
x++; | |||
ddF_x += 2; | |||
f += ddF_x; | |||
|
|||
drawFastVLine(x0+x, y0-y, y*2+1, color); | |||
drawFastVLine(x0-x, y0-y, y*2+1, color); | |||
|
|||
drawFastVLine(x0+y, y0-x, x*2+1, color); | |||
drawFastVLine(x0-y, y0-x, x*2+1, color); | |||
} | |||
} | |||
|
|||
// bresenham's algorithm - thx wikpedia | |||
void Adafruit_GFX::drawLine(int16_t x0, int16_t y0, | |||
int16_t x1, int16_t y1, | |||
uint8_t color) { | |||
int16_t steep = abs(y1 - y0) > abs(x1 - x0); | |||
if (steep) { | |||
swap(x0, y0); | |||
swap(x1, y1); | |||
} | |||
|
|||
if (x0 > x1) { | |||
swap(x0, x1); | |||
swap(y0, y1); | |||
} | |||
|
|||
int16_t dx, dy; | |||
dx = x1 - x0; | |||
dy = abs(y1 - y0); | |||
|
|||
int16_t err = dx / 2; | |||
int16_t ystep; | |||
|
|||
if (y0 < y1) { | |||
ystep = 1; | |||
} else { | |||
ystep = -1; | |||
} | |||
|
|||
for (; x0<=x1; x0++) { | |||
if (steep) { | |||
drawPixel(y0, x0, color); | |||
} else { | |||
drawPixel(x0, y0, color); | |||
} | |||
err -= dy; | |||
if (err < 0) { | |||
y0 += ystep; | |||
err += dx; | |||
} | |||
} | |||
} | |||
|
|||
|
|||
// draw a rectangle | |||
void Adafruit_GFX::drawRect(uint8_t x, uint8_t y, | |||
uint8_t w, uint8_t h, | |||
uint8_t color) { | |||
// stupidest version - update in subclasses if desired! | |||
for (uint8_t i=x; i<x+w; i++) { | |||
drawPixel(i, y, color); | |||
drawPixel(i, y+h-1, color); | |||
} | |||
drawFastVLine(x, y, h, color); | |||
drawFastVLine(x+w-1, y, h, color); | |||
} | |||
|
|||
void Adafruit_GFX::drawFastVLine(uint8_t x, uint8_t y, | |||
uint8_t h, uint8_t color) { | |||
// stupidest version - update in subclasses if desired! | |||
for (uint8_t j=y; j<y+h; j++) { | |||
drawPixel(x, j, color); | |||
} | |||
} | |||
|
|||
void Adafruit_GFX::fillRect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, | |||
uint8_t color) { | |||
// stupidest version - update in subclasses if desired! | |||
for (uint8_t i=x; i<x+w; i++) { | |||
drawFastVLine(i, y, h, color); | |||
} | |||
} | |||
|
|||
void Adafruit_GFX::drawBitmap(uint8_t x, uint8_t y, | |||
const uint8_t *bitmap, uint8_t w, uint8_t h, | |||
uint8_t color) { | |||
for (uint8_t j=0; j<h; j++) { | |||
for (uint8_t i=0; i<w; i++ ) { | |||
if (pgm_read_byte(bitmap + i + (j/8)*w) & _BV(j%8)) { | |||
drawPixel(x+i, y+j, color); | |||
} | |||
} | |||
} | |||
} | |||
|
|||
|
|||
#if ARDUINO >= 100 | |||
size_t Adafruit_GFX::write(uint8_t c) { | |||
#else | |||
void Adafruit_GFX::write(uint8_t c) { | |||
#endif | |||
if (c == '\n') { | |||
cursor_y += textsize*8; | |||
cursor_x = 0; | |||
} else if (c == '\r') { | |||
// skip em | |||
} else { | |||
drawChar(cursor_x, cursor_y, c, textcolor, textbgcolor, textsize); | |||
cursor_x += textsize*6; | |||
} | |||
#if ARDUINO >= 100 | |||
return 1; | |||
#endif | |||
} | |||
|
|||
// draw a character | |||
void Adafruit_GFX::drawChar(uint8_t x, uint8_t y, char c, | |||
uint16_t color, uint16_t bg, uint8_t size) { | |||
for (uint8_t i=0; i<6; i++ ) { | |||
uint8_t line; | |||
if (i == 5) | |||
line = 0x0; | |||
else | |||
line = pgm_read_byte(font+(c*5)+i); | |||
for (uint8_t j = 0; j<8; j++) { | |||
if (line & 0x1) { | |||
if (size == 1) // default size | |||
drawPixel(x+i, y+j, color); | |||
else { // big size | |||
fillRect(x+(i*size), y+(j*size), size, size, color); | |||
} | |||
} else if (bg != color) { | |||
if (size == 1) // default size | |||
drawPixel(x+i, y+j, bg); | |||
else { // big size | |||
fillRect(x+i*size, y+j*size, size, size, bg); | |||
} | |||
} | |||
line >>= 1; | |||
} | |||
} | |||
} | |||
|
|||
void Adafruit_GFX::setCursor(uint16_t x, uint16_t y) { | |||
cursor_x = x; | |||
cursor_y = y; | |||
} | |||
|
|||
|
|||
void Adafruit_GFX::setTextSize(uint8_t s) { | |||
textsize = (s > 0) ? s : 1; | |||
} | |||
|
|||
|
|||
void Adafruit_GFX::setTextColor(uint16_t c) { | |||
textcolor = c; | |||
textbgcolor = c; | |||
// for 'transparent' background, we'll set the bg | |||
// to the same as fg instead of using a flag | |||
} | |||
|
|||
void Adafruit_GFX::setTextColor(uint16_t c, uint16_t b) { | |||
textcolor = c; | |||
textbgcolor = b; | |||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,58 @@ | |||
#ifndef _ADAFRUIT_GFX_H | |||
#define _ADAFRUIT_GFX_H | |||
|
|||
#if ARDUINO >= 100 | |||
#include "Arduino.h" | |||
#include "Print.h" | |||
#else | |||
#include "WProgram.h" | |||
#endif | |||
|
|||
#define swap(a, b) { int16_t t = a; a = b; b = t; } | |||
|
|||
class Adafruit_GFX : public Print{ | |||
public: | |||
// this must be defined by the subclass | |||
virtual void drawPixel(uint8_t x, uint8_t y, uint8_t color); | |||
|
|||
// these are 'generic' drawing functions, so we can share them! | |||
void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, | |||
uint8_t color); | |||
virtual void drawFastVLine(uint8_t x, uint8_t y, uint8_t h, uint8_t color); | |||
void drawRect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, | |||
uint8_t color); | |||
void fillRect(uint8_t x, uint8_t y, uint8_t w, uint8_t h, | |||
uint8_t color); | |||
|
|||
void drawCircle(uint8_t x0, uint8_t y0, uint8_t r, | |||
uint8_t color); | |||
void fillCircle(uint8_t x0, uint8_t y0, uint8_t r, | |||
uint8_t color); | |||
|
|||
void drawBitmap(uint8_t x, uint8_t y, | |||
const uint8_t *bitmap, uint8_t w, uint8_t h, | |||
uint8_t color); | |||
void drawChar(uint8_t x, uint8_t y, char c, | |||
uint16_t color, uint16_t bg, uint8_t size); | |||
#if ARDUINO >= 100 | |||
virtual size_t write(uint8_t); | |||
#else | |||
virtual void write(uint8_t); | |||
#endif | |||
void setCursor(uint16_t x, uint16_t y); | |||
void setTextColor(uint16_t c); | |||
void setTextColor(uint16_t c, uint16_t bg); | |||
void setTextSize(uint8_t s); | |||
|
|||
|
|||
// return the size of the display | |||
uint16_t width() { return WIDTH; } | |||
uint16_t height() { return HEIGHT; } | |||
|
|||
protected: | |||
uint16_t WIDTH, HEIGHT; | |||
uint16_t cursor_x, cursor_y, textcolor, textbgcolor; | |||
uint8_t textsize; | |||
}; | |||
|
|||
#endif |
Oops, something went wrong.