mirror of
https://git.planet-casio.com/Lephenixnoir/gint.git
synced 2025-04-18 00:46:56 +02:00
gray: add gpixel() and gline()
Optimized cases for gline() rely on grect() instead of reimplementing the mechanics of the fully-optimized drawing to save some space.
This commit is contained in:
parent
d7c33b12a5
commit
144ff90e37
3 changed files with 115 additions and 1 deletions
55
src/gray/gline.c
Normal file
55
src/gray/gline.c
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
#include <gint/gray.h>
|
||||||
|
#include <gint/defs/util.h>
|
||||||
|
#include <display/common.h>
|
||||||
|
|
||||||
|
/* gline(): Bresenham line drawing algorithm
|
||||||
|
Remotely adapted from MonochromeLib code by Pierre "PerriotLL" Le Gall.
|
||||||
|
Relies on grect() for optimized situations.
|
||||||
|
@x1 @y1 @x2 @y2 Coordinates of endpoints of line (included)
|
||||||
|
@color Any color */
|
||||||
|
void gline(int x1, int y1, int x2, int y2, color_t color)
|
||||||
|
{
|
||||||
|
/* Trivial optimizations */
|
||||||
|
if(x1 == x2 || y1 == y2)
|
||||||
|
{
|
||||||
|
grect(x1, y1, x2, y2, color);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Brensenham line drawing algorithm */
|
||||||
|
|
||||||
|
int i, x = x1, y = y1, cumul;
|
||||||
|
int dx = x2 - x1, dy = y2 - y1;
|
||||||
|
int sx = sgn(dx), sy = sgn(dy);
|
||||||
|
|
||||||
|
dx = abs(dx), dy = abs(dy);
|
||||||
|
|
||||||
|
gpixel(x1, y1, color);
|
||||||
|
|
||||||
|
if(dx >= dy)
|
||||||
|
{
|
||||||
|
/* Start with a non-zero cumul to even the overdue between the
|
||||||
|
two ends of the line (for more regularity) */
|
||||||
|
cumul = dx >> 1;
|
||||||
|
for(i = 1; i < dx; i++)
|
||||||
|
{
|
||||||
|
x += sx;
|
||||||
|
cumul += dy;
|
||||||
|
if(cumul > dx) cumul -= dx, y += sy;
|
||||||
|
gpixel(x, y, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
cumul = dy >> 1;
|
||||||
|
for(i = 1; i < dy; i++)
|
||||||
|
{
|
||||||
|
y += sy;
|
||||||
|
cumul += dx;
|
||||||
|
if(cumul > dy) cumul -= dy, x += sx;
|
||||||
|
gpixel(x, y, color);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gpixel(x2, y2, color);
|
||||||
|
}
|
59
src/gray/gpixel.c
Normal file
59
src/gray/gpixel.c
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
#include <gint/gray.h>
|
||||||
|
#include <gint/defs/types.h>
|
||||||
|
|
||||||
|
/* gpixel(): Change a pixel's color */
|
||||||
|
void gpixel(int x, int y, color_t color)
|
||||||
|
{
|
||||||
|
if((uint)x >= 128 || (uint)y >= 64) return;
|
||||||
|
|
||||||
|
uint32_t *light, *dark;
|
||||||
|
gvram(&light, &dark);
|
||||||
|
|
||||||
|
int offset = (y << 2) + (x >> 5);
|
||||||
|
uint32_t mask = 1 << (~x & 31), tmp;
|
||||||
|
|
||||||
|
switch(color)
|
||||||
|
{
|
||||||
|
case C_WHITE:
|
||||||
|
light[offset] &= ~mask;
|
||||||
|
dark [offset] &= ~mask;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case C_LIGHT:
|
||||||
|
light[offset] |= mask;
|
||||||
|
dark [offset] &= ~mask;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case C_DARK:
|
||||||
|
light[offset] &= ~mask;
|
||||||
|
dark [offset] |= mask;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case C_BLACK:
|
||||||
|
light[offset] |= mask;
|
||||||
|
dark [offset] |= mask;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case C_NONE:
|
||||||
|
break;
|
||||||
|
|
||||||
|
case C_INVERT:
|
||||||
|
light[offset] ^= mask;
|
||||||
|
dark [offset] ^= mask;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case C_LIGHTEN:
|
||||||
|
tmp = dark[offset];
|
||||||
|
|
||||||
|
dark[offset] &= light[offset] | ~mask;
|
||||||
|
light[offset] = (light[offset] ^ mask) & (tmp | ~mask);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case C_DARKEN:
|
||||||
|
tmp = dark[offset];
|
||||||
|
|
||||||
|
dark[offset] |= light[offset] & mask;
|
||||||
|
light[offset] = (light[offset] ^ mask) | (tmp & mask);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,7 +6,7 @@
|
||||||
Remotely adapted from MonochromeLib code by Pierre "PerriotLL" Le Gall.
|
Remotely adapted from MonochromeLib code by Pierre "PerriotLL" Le Gall.
|
||||||
Relies on platform-dependent dhline() and dvline() for optimized situations.
|
Relies on platform-dependent dhline() and dvline() for optimized situations.
|
||||||
@x1 @y1 @x2 @y2 Coordinates of endpoints of line (included)
|
@x1 @y1 @x2 @y2 Coordinates of endpoints of line (included)
|
||||||
@color Any R5G6B5 color */
|
@color Any color accepted by dpixel() on the platform */
|
||||||
void dline(int x1, int y1, int x2, int y2, color_t color)
|
void dline(int x1, int y1, int x2, int y2, color_t color)
|
||||||
{
|
{
|
||||||
/* Possible optimizations */
|
/* Possible optimizations */
|
||||||
|
|
Loading…
Add table
Reference in a new issue