RogueLife/src/geometry.c

39 lines
1.1 KiB
C
Raw Normal View History

#include "geometry.h"
#include <gint/display.h>
void geometry_draw(int x, int y, struct shape const *s, fixed_t ppu)
{
if(s->type == SHAPE_RECT) {
int w = fround(fmul(s->rect.width, ppu));
int h = fround(fmul(s->rect.height, ppu));
int x0 = x - w/2, x1 = x + (w+1)/2 - 1;
int y0 = y - h/2, y1 = y + (h+1)/2 - 1;
dline(x0, y0, x1, y0, s->color);
dline(x0, y0, x0, y1, s->color);
dline(x1, y0, x1, y1, s->color);
dline(x0, y1, x1, y1, s->color);
}
else if(s->type == SHAPE_CIRCLE) {
int r = fround(fmul(s->circle.radius, ppu));
int dx = -r, dy = 0, err = 2 - 2 * r;
do {
dpixel(x - dx, y + dy, s->color);
dpixel(x - dy, y - dx, s->color);
dpixel(x + dx, y - dy, s->color);
dpixel(x + dy, y + dx, s->color);
r = err;
if(r <= dy) err += ++dy * 2 + 1;
if(r > dx || err > dy) err += ++dx * 2 + 1;
} while(dx < 0);
}
dline(x-1, y, x+1, y, s->color);
dline(x, y-1, x, y+1, s->color);
}