Merge pull request #24 from srandoux/master

Added DrawCircle and DrawLine contributed by @srandoux
This commit is contained in:
Henner Zeller 2015-04-06 21:38:36 -07:00
commit 44a1c0eaa1
2 changed files with 58 additions and 2 deletions

View file

@ -65,8 +65,10 @@ private:
// Returns how far we advance on the screen.
int DrawText(Canvas *c, const Font &font, int x, int y, const Color &color,
const char *utf8_text);
// lines, circles and stuff.
// Draw a circle centered at "x0", "y0", with a radius of "radius" and with "color"
void DrawCircle(Canvas *c, int32_t x0, int32_t y0, int32_t radius, const Color &color);
// Draw a line from "x0", "y0" to "x1", "y1" and with "color"
void DrawLine(Canvas *c, int32_t x0, int32_t y0, int32_t x1, int32_t y1, const Color &color);
} // namespace rgb_matrix

View file

@ -15,6 +15,8 @@
#include "graphics.h"
#include "utf8-internal.h"
#include <stdlib.h>
#include <functional>
namespace rgb_matrix {
int DrawText(Canvas *c, const Font &font,
@ -27,4 +29,56 @@ int DrawText(Canvas *c, const Font &font,
}
return x - start_x;
}
void DrawCircle(Canvas *c, int32_t x0, int32_t y0, int32_t radius, const Color &color){
int32_t x = radius, y = 0;
int32_t radiusError = 1 - x;
while (y <= x){
c->SetPixel(x + x0, y + y0, color.r, color.g, color.b);
c->SetPixel(y + x0, x + y0, color.r, color.g, color.b);
c->SetPixel(-x + x0, y + y0, color.r, color.g, color.b);
c->SetPixel(-y + x0, x + y0, color.r, color.g, color.b);
c->SetPixel(-x + x0, -y + y0, color.r, color.g, color.b);
c->SetPixel(-y + x0, -x + y0, color.r, color.g, color.b);
c->SetPixel(x + x0, -y + y0, color.r, color.g, color.b);
c->SetPixel(y + x0, -x + y0, color.r, color.g, color.b);
y++;
if (radiusError<0){
radiusError += 2 * y + 1;
} else {
x--;
radiusError+= 2 * (y - x + 1);
}
}
}
void DrawLine(Canvas *c, int32_t x0, int32_t y0, int32_t x1, int32_t y1, const Color &color){
int32_t dy = y1 - y0, dx = x1 - x0, gradient, x, y, shift = 0x10;
if (abs(dx) > abs(dy)) {
// x variation is bigger than y variation
if (x1 < x0) {
std::swap(x0, x1);
std::swap(y0, y1);
}
gradient = (dy << shift) / dx ;
for (x = x0 , y = 0x8000 + (y0 << shift); x <= x1; ++x, y += gradient) {
c->SetPixel(x, y >> shift, color.r, color.g, color.b);
}
} else {
// y variation is bigger than x variation
if (y1 < y0) {
std::swap(x0, x1);
std::swap(y0, y1);
}
gradient = (dx << shift) / dy;
for (y = y0 , x = 0x8000 + (x0 << shift); y <= y1; ++y, x += gradient) {
c->SetPixel(x >> shift, y, color.r, color.g, color.b);
}
}
}
}//namespace