forked from len0rd/rockbox
Faster filled triangle drawing for colour targets and greyscale iPods.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8751 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
265d1a0936
commit
e48e60b3e0
1 changed files with 73 additions and 1 deletions
|
@ -35,7 +35,78 @@ void xlcd_init(struct plugin_api* newrb)
|
|||
local_rb = newrb;
|
||||
}
|
||||
|
||||
/* draw a filled triangle */
|
||||
#if (LCD_DEPTH >= 8) || (LCD_PIXELFORMAT == HORIZONTAL_PACKING)
|
||||
/* draw a filled triangle, using horizontal lines for speed */
|
||||
void xlcd_filltriangle(int x1, int y1, int x2, int y2, int x3, int y3)
|
||||
{
|
||||
int x, y;
|
||||
long fp_x1, fp_x2, fp_dx1, fp_dx2;
|
||||
|
||||
/* sort vertices by increasing y value */
|
||||
if (y1 > y3)
|
||||
{
|
||||
if (y2 < y3) /* y2 < y3 < y1 */
|
||||
{
|
||||
x = x1; x1 = x2; x2 = x3; x3 = x;
|
||||
y = y1; y1 = y2; y2 = y3; y3 = y;
|
||||
}
|
||||
else if (y2 > y1) /* y3 < y1 < y2 */
|
||||
{
|
||||
x = x1; x1 = x3; x3 = x2; x2 = x;
|
||||
y = y1; y1 = y3; y3 = y2; y2 = y;
|
||||
}
|
||||
else /* y3 <= y2 <= y1 */
|
||||
{
|
||||
x = x1; x1 = x3; x3 = x;
|
||||
y = y1; y1 = y3; y3 = y;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (y2 < y1) /* y2 < y1 <= y3 */
|
||||
{
|
||||
x = x1; x1 = x2; x2 = x;
|
||||
y = y1; y1 = y2; y2 = y;
|
||||
}
|
||||
else if (y2 > y3) /* y1 <= y3 < y2 */
|
||||
{
|
||||
x = x2; x2 = x3; x3 = x;
|
||||
y = y2; y2 = y3; y3 = y;
|
||||
}
|
||||
/* else already sorted */
|
||||
}
|
||||
|
||||
if (y1 < y3) /* draw */
|
||||
{
|
||||
fp_dx1 = ((x3 - x1) << 16) / (y3 - y1);
|
||||
fp_x1 = (x1 << 16) + (1<<15) + (fp_dx1 >> 1);
|
||||
|
||||
if (y1 < y2) /* first part */
|
||||
{
|
||||
fp_dx2 = ((x2 - x1) << 16) / (y2 - y1);
|
||||
fp_x2 = (x1 << 16) + (1<<15) + (fp_dx2 >> 1);
|
||||
for (y = y1; y < y2; y++)
|
||||
{
|
||||
local_rb->lcd_hline(fp_x1 >> 16, fp_x2 >> 16, y);
|
||||
fp_x1 += fp_dx1;
|
||||
fp_x2 += fp_dx2;
|
||||
}
|
||||
}
|
||||
if (y2 < y3) /* second part */
|
||||
{
|
||||
fp_dx2 = ((x3 - x2) << 16) / (y3 - y2);
|
||||
fp_x2 = (x2 << 16) + (1<<15) + (fp_dx2 >> 1);
|
||||
for (y = y2; y < y3; y++)
|
||||
{
|
||||
local_rb->lcd_hline(fp_x1 >> 16, fp_x2 >> 16, y);
|
||||
fp_x1 += fp_dx1;
|
||||
fp_x2 += fp_dx2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#else /* (LCD_DEPTH < 8) && (LCD_PIXELFORMAT == VERTICAL_PACKING) */
|
||||
/* draw a filled triangle, using vertical lines for speed */
|
||||
void xlcd_filltriangle(int x1, int y1, int x2, int y2, int x3, int y3)
|
||||
{
|
||||
int x, y;
|
||||
|
@ -104,6 +175,7 @@ void xlcd_filltriangle(int x1, int y1, int x2, int y2, int x3, int y3)
|
|||
}
|
||||
}
|
||||
}
|
||||
#endif /* LCD_DEPTH, LCD_PIXELFORMAT */
|
||||
|
||||
#if LCD_DEPTH >= 8
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue