GDISP Streaming bug fixes and new optimisation method
This commit is contained in:
parent
a7360c13c2
commit
548eb3c981
1 changed files with 70 additions and 11 deletions
|
@ -185,7 +185,7 @@ static void hline_clip(void) {
|
||||||
gdisp_lld_fill_area(GC);
|
gdisp_lld_fill_area(GC);
|
||||||
#elif GDISP_HARDWARE_STREAM
|
#elif GDISP_HARDWARE_STREAM
|
||||||
// Next best is streaming
|
// Next best is streaming
|
||||||
GC->p.cx = GC->p.x1 - GC->p.x;
|
GC->p.cx = GC->p.x1 - GC->p.x + 1;
|
||||||
GC->p.cy = 1;
|
GC->p.cy = 1;
|
||||||
gdisp_lld_stream_start(GC);
|
gdisp_lld_stream_start(GC);
|
||||||
do { gdisp_lld_stream_color(GC); } while(GC->p.cx--);
|
do { gdisp_lld_stream_color(GC); } while(GC->p.cx--);
|
||||||
|
@ -243,7 +243,7 @@ static void vline_clip(void) {
|
||||||
gdisp_lld_fill_area(GC);
|
gdisp_lld_fill_area(GC);
|
||||||
#elif GDISP_HARDWARE_STREAM
|
#elif GDISP_HARDWARE_STREAM
|
||||||
// Next best is streaming
|
// Next best is streaming
|
||||||
GC->p.cy = GC->p.y1 - GC->p.y;
|
GC->p.cy = GC->p.y1 - GC->p.y + 1;
|
||||||
GC->p.cx = 1;
|
GC->p.cx = 1;
|
||||||
gdisp_lld_stream_start(GC);
|
gdisp_lld_stream_start(GC);
|
||||||
do { gdisp_lld_stream_color(GC); } while(GC->p.cy--);
|
do { gdisp_lld_stream_color(GC); } while(GC->p.cy--);
|
||||||
|
@ -392,7 +392,10 @@ void _gdispInit(void) {
|
||||||
GC->p.y1 = GC->p.y = y;
|
GC->p.y1 = GC->p.y = y;
|
||||||
GC->p.x2 = x + cx;
|
GC->p.x2 = x + cx;
|
||||||
GC->p.y2 = y + cy;
|
GC->p.y2 = y + cy;
|
||||||
GC->p.cx = 0;
|
#if (GDISP_LINEBUF_SIZE != 0 && GDISP_HARDWARE_BITFILLS) || GDISP_HARDWARE_FILLS
|
||||||
|
GC->p.cx = 0;
|
||||||
|
GC->p.cy = 1;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Don't release the mutex as gdispStreamEnd() will do that.
|
// Don't release the mutex as gdispStreamEnd() will do that.
|
||||||
|
@ -415,12 +418,9 @@ void _gdispInit(void) {
|
||||||
gdisp_lld_stream_color(GC);
|
gdisp_lld_stream_color(GC);
|
||||||
#elif GDISP_LINEBUF_SIZE != 0 && GDISP_HARDWARE_BITFILLS
|
#elif GDISP_LINEBUF_SIZE != 0 && GDISP_HARDWARE_BITFILLS
|
||||||
GC->linebuf[GC->p.cx++] = color;
|
GC->linebuf[GC->p.cx++] = color;
|
||||||
GC->p.x++;
|
|
||||||
if (GC->p.cx >= GDISP_LINEBUF_SIZE) {
|
if (GC->p.cx >= GDISP_LINEBUF_SIZE) {
|
||||||
sx1 = GC->p.x1;
|
sx1 = GC->p.x1;
|
||||||
sy1 = GC->p.y1;
|
sy1 = GC->p.y1;
|
||||||
GC->p.x -= GC->p.cx;
|
|
||||||
GC->p.cy = 1;
|
|
||||||
GC->p.x1 = 0;
|
GC->p.x1 = 0;
|
||||||
GC->p.y1 = 0;
|
GC->p.y1 = 0;
|
||||||
GC->p.ptr = (void *)GC->linebuf;
|
GC->p.ptr = (void *)GC->linebuf;
|
||||||
|
@ -432,12 +432,10 @@ void _gdispInit(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Just wrap at end-of-line and end-of-buffer
|
// Just wrap at end-of-line and end-of-buffer
|
||||||
if (GC->p.x >= GC->p.x2) {
|
if (GC->p.x+GC->p.cx >= GC->p.x2) {
|
||||||
if (GC->p.cx) {
|
if (GC->p.cx) {
|
||||||
sx1 = GC->p.x1;
|
sx1 = GC->p.x1;
|
||||||
sy1 = GC->p.y1;
|
sy1 = GC->p.y1;
|
||||||
GC->p.x -= GC->p.cx;
|
|
||||||
GC->p.cy = 1;
|
|
||||||
GC->p.x1 = 0;
|
GC->p.x1 = 0;
|
||||||
GC->p.y1 = 0;
|
GC->p.y1 = 0;
|
||||||
GC->p.ptr = (void *)GC->linebuf;
|
GC->p.ptr = (void *)GC->linebuf;
|
||||||
|
@ -450,6 +448,33 @@ void _gdispInit(void) {
|
||||||
if (++GC->p.y >= GC->p.y2)
|
if (++GC->p.y >= GC->p.y2)
|
||||||
GC->p.y = GC->p.y1;
|
GC->p.y = GC->p.y1;
|
||||||
}
|
}
|
||||||
|
#elif GDISP_HARDWARE_FILLS
|
||||||
|
// Only slightly better than drawing pixels is to look for runs and use fill area
|
||||||
|
if (!GC->p.cx || GC->p.color == color) {
|
||||||
|
GC->p.cx++;
|
||||||
|
GC->p.color = color;
|
||||||
|
} else {
|
||||||
|
if (GC->p.cx == 1)
|
||||||
|
gdisp_lld_draw_pixel(GC);
|
||||||
|
else
|
||||||
|
gdisp_lld_fill_area(GC);
|
||||||
|
GC->p.x += GC->p.cx;
|
||||||
|
GC->p.color = color;
|
||||||
|
GC->p.cx = 1;
|
||||||
|
}
|
||||||
|
// Just wrap at end-of-line and end-of-buffer
|
||||||
|
if (GC->p.x+GC->p.cx >= GC->p.x2) {
|
||||||
|
if (GC->p.cx) {
|
||||||
|
if (GC->p.cx == 1)
|
||||||
|
gdisp_lld_draw_pixel(GC);
|
||||||
|
else
|
||||||
|
gdisp_lld_fill_area(GC);
|
||||||
|
GC->p.cx = 0;
|
||||||
|
}
|
||||||
|
GC->p.x = GC->p.x1;
|
||||||
|
if (++GC->p.y >= GC->p.y2)
|
||||||
|
GC->p.y = GC->p.y1;
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
// Worst is using pixel drawing
|
// Worst is using pixel drawing
|
||||||
GC->p.color = color;
|
GC->p.color = color;
|
||||||
|
@ -475,13 +500,18 @@ void _gdispInit(void) {
|
||||||
#endif
|
#endif
|
||||||
#elif GDISP_LINEBUF_SIZE != 0 && GDISP_HARDWARE_BITFILLS
|
#elif GDISP_LINEBUF_SIZE != 0 && GDISP_HARDWARE_BITFILLS
|
||||||
if (GC->p.cx) {
|
if (GC->p.cx) {
|
||||||
GC->p.x -= GC->p.cx;
|
|
||||||
GC->p.cy = 1;
|
|
||||||
GC->p.x1 = 0;
|
GC->p.x1 = 0;
|
||||||
GC->p.y1 = 0;
|
GC->p.y1 = 0;
|
||||||
GC->p.ptr = (void *)GC->linebuf;
|
GC->p.ptr = (void *)GC->linebuf;
|
||||||
gdisp_lld_blit_area(GC);
|
gdisp_lld_blit_area(GC);
|
||||||
}
|
}
|
||||||
|
#elif GDISP_HARDWARE_FILLS
|
||||||
|
if (GC->p.cx) {
|
||||||
|
if (GC->p.cx == 1)
|
||||||
|
gdisp_lld_draw_pixel(GC);
|
||||||
|
else
|
||||||
|
gdisp_lld_fill_area(GC);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
GC->flags &= ~GDISP_FLG_INSTREAM;
|
GC->flags &= ~GDISP_FLG_INSTREAM;
|
||||||
MUTEX_EXIT();
|
MUTEX_EXIT();
|
||||||
|
@ -595,6 +625,10 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
|
||||||
srcy = y + cy;
|
srcy = y + cy;
|
||||||
srccx -= cx;
|
srccx -= cx;
|
||||||
|
|
||||||
|
GC->p.x = x;
|
||||||
|
GC->p.y = y;
|
||||||
|
GC->p.cx = cx;
|
||||||
|
GC->p.cy = cy;
|
||||||
gdisp_lld_stream_start(GC);
|
gdisp_lld_stream_start(GC);
|
||||||
for(GC->p.y = y; GC->p.y < srcy; GC->p.y++, buffer += srccx) {
|
for(GC->p.y = y; GC->p.y < srcy; GC->p.y++, buffer += srccx) {
|
||||||
for(GC->p.x = x; GC->p.x < srcx; GC->p.x++) {
|
for(GC->p.x = x; GC->p.x < srcx; GC->p.x++) {
|
||||||
|
@ -605,6 +639,31 @@ void gdispBlitAreaEx(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx,
|
||||||
#if GDISP_HARDWARE_STREAM_STOP
|
#if GDISP_HARDWARE_STREAM_STOP
|
||||||
gdisp_lld_stream_stop(GC);
|
gdisp_lld_stream_stop(GC);
|
||||||
#endif
|
#endif
|
||||||
|
#elif GDISP_HARDWARE_FILLS
|
||||||
|
// Only slightly better than drawing pixels is to look for runs and use fill area
|
||||||
|
|
||||||
|
// Translate buffer to the real image data, use srcx,srcy as the end point, srccx as the buffer line gap
|
||||||
|
buffer += srcy*srccx+srcx;
|
||||||
|
srcx = x + cx;
|
||||||
|
srcy = y + cy;
|
||||||
|
srccx -= cx;
|
||||||
|
|
||||||
|
GC->p.cy = 1;
|
||||||
|
for(GC->p.y = y; GC->p.y < srcy; GC->p.y++, buffer += srccx) {
|
||||||
|
for(GC->p.x=x; GC->p.x < srcx; GC->p.x += GC->p.cx) {
|
||||||
|
GC->p.cx=1;
|
||||||
|
GC->p.color = *buffer++;
|
||||||
|
while(GC->p.x+GC->p.cx < srcx && *buffer == GC->p.color) {
|
||||||
|
GC->p.cx++;
|
||||||
|
buffer++;
|
||||||
|
}
|
||||||
|
if (GC->p.cx == 1) {
|
||||||
|
gdisp_lld_draw_pixel(GC);
|
||||||
|
} else {
|
||||||
|
gdisp_lld_fill_area(GC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
// Worst is drawing pixels
|
// Worst is drawing pixels
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue