Some line drawing functions
This commit is contained in:
@@ -17,6 +17,43 @@ void putpixel(gfx_context *ctx, uint64_t x, uint64_t y, uint32_t clr)
|
||||
*fb = clr;
|
||||
}
|
||||
|
||||
void draw_line(gfx_context *ctx, uint64_t x0, uint64_t x1, uint64_t y0, uint64_t y1, uint32_t clr)
|
||||
{
|
||||
int64_t dx = x1 > x0 ? x1 - x0 : x0 - x1;
|
||||
int64_t dy = y1 > y0 ? y1 - y0 : y0 - y1;
|
||||
int sx = x1 > x0 ? 1 : -1;
|
||||
int sy = y1 > y0 ? 1 : -1;
|
||||
uint64_t x = x0, y = y0;
|
||||
int64_t diff = dx - dy;
|
||||
while(1)
|
||||
{
|
||||
putpixel(ctx, x, y, clr);
|
||||
if(x == x1 && y == y1) break;
|
||||
|
||||
if((2*diff) > -dy) {
|
||||
diff -= dy;
|
||||
x += sx;
|
||||
} else {
|
||||
diff += dx;
|
||||
y += sy;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void draw_rect(gfx_context *ctx, uint64_t x, uint64_t y, uint64_t width, uint64_t height, uint32_t clr)
|
||||
{
|
||||
for(uint64_t _x = x; _x <= x+width; _x++)
|
||||
{
|
||||
putpixel(ctx, _x, y, clr);
|
||||
putpixel(ctx, _x, y+height, clr);
|
||||
}
|
||||
for(uint64_t _y = y; _y <= y+height; _y++)
|
||||
{
|
||||
putpixel(ctx, x, _y, clr);
|
||||
putpixel(ctx, x+width, _y, clr);
|
||||
}
|
||||
}
|
||||
|
||||
void putCharacter(gfx_context *ctx, uint64_t x, uint64_t y, uint32_t clr_fg, uint32_t clr_bg, char c)
|
||||
{
|
||||
|
||||
@@ -14,6 +14,8 @@ typedef struct {
|
||||
#define RGB(r, g, b) (((uint32_t) (r<<16) + (g<<8) + (b)))
|
||||
|
||||
void putpixel(gfx_context *ctx, uint64_t x, uint64_t y, uint32_t clr);
|
||||
void draw_line(gfx_context *ctx, uint64_t x0, uint64_t x1, uint64_t y0, uint64_t y1, uint32_t clr);
|
||||
void draw_rect(gfx_context *ctx, uint64_t x, uint64_t y, uint64_t width, uint64_t height, uint32_t clr);
|
||||
void putCharacter(gfx_context *ctx, uint64_t x, uint64_t y, uint32_t clr_fg, uint32_t clr_bg, char c);
|
||||
void flip(gfx_context *ctx);
|
||||
gfx_context *framebuffer_make_subcontext(gfx_context *ctx, uint64_t x, uint64_t y, uint64_t width, uint64_t height);
|
||||
Reference in New Issue
Block a user