Skip to content

Commit

Permalink
Merge pull request #24 from srandoux/master
Browse files Browse the repository at this point in the history
Added DrawCircle and DrawLine contributed by @srandoux
  • Loading branch information
hzeller committed Apr 7, 2015
2 parents 4adfb0e + 6474b43 commit 44a1c0e
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 2 deletions.
6 changes: 4 additions & 2 deletions include/graphics.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,10 @@ class Font {
// 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

Expand Down
54 changes: 54 additions & 0 deletions lib/graphics.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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

0 comments on commit 44a1c0e

Please sign in to comment.