aboutsummaryrefslogtreecommitdiffstats
path: root/src/gdisp
diff options
context:
space:
mode:
authorinmarket <andrewh@inmarket.com.au>2013-11-05 13:45:19 +1000
committerinmarket <andrewh@inmarket.com.au>2013-11-05 13:45:19 +1000
commit250adaf028848c0aa0dfa2029b722274cb7a6d6a (patch)
tree29c2c91f7dc599e605e6e6c2c3d65039e68679eb /src/gdisp
parent009d9f1f60d6d77f6ed75e8c5fc93e5e979e9db0 (diff)
downloaduGFX-250adaf028848c0aa0dfa2029b722274cb7a6d6a.tar.gz
uGFX-250adaf028848c0aa0dfa2029b722274cb7a6d6a.tar.bz2
uGFX-250adaf028848c0aa0dfa2029b722274cb7a6d6a.zip
Fixes to gdisp vertical scrolling.
Also added improved optimisation for drivers without blit but with a fill routine.
Diffstat (limited to 'src/gdisp')
-rw-r--r--src/gdisp/gdisp.c42
1 files changed, 38 insertions, 4 deletions
diff --git a/src/gdisp/gdisp.c b/src/gdisp/gdisp.c
index 263e882d..b08fe627 100644
--- a/src/gdisp/gdisp.c
+++ b/src/gdisp/gdisp.c
@@ -1041,7 +1041,7 @@ void gdispGBlitArea(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, c
if (!g->vmt->setclip)
#endif
{
- // This is a different cliping to fillarea(g) as it needs to take into account srcx,srcy
+ // This is a different clipping to fillarea(g) as it needs to take into account srcx,srcy
if (x < g->clipx0) { cx -= g->clipx0 - x; srcx += g->clipx0 - x; x = g->clipx0; }
if (y < g->clipy0) { cy -= g->clipy0 - y; srcy += g->clipy0 - x; y = g->clipy0; }
if (x+cx > g->clipx1) cx = g->clipx1 - x;
@@ -2130,7 +2130,7 @@ void gdispGBlitArea(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, c
#if GDISP_NEED_SCROLL
void gdispGVerticalScroll(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor) {
coord_t abslines;
- #if !GDISP_HARDWARE_SCROLL
+ #if GDISP_HARDWARE_SCROLL != TRUE
coord_t fy, dy, ix, fx, i, j;
#endif
@@ -2232,9 +2232,11 @@ void gdispGBlitArea(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, c
}
}
#if GDISP_HARDWARE_PIXELREAD == HARDWARE_AUTODETECT
- else
+ else {
// Worst is "not possible"
+ MUTEX_EXIT(g);
return;
+ }
#endif
#endif
@@ -2291,8 +2293,40 @@ void gdispGBlitArea(GDisplay *g, coord_t x, coord_t y, coord_t cx, coord_t cy, c
#endif
#endif
+ // Next best line write is drawing pixels in combination with filling
+ #if GDISP_HARDWARE_BITFILLS != TRUE && GDISP_HARDWARE_STREAM_WRITE != TRUE && GDISP_HARDWARE_FILLS && GDISP_HARDWARE_DRAWPIXEL
+ // We don't need to test for auto-detect on drawpixel as we know we have it because we don't have streaming.
+ #if GDISP_HARDWARE_FILLS == HARDWARE_AUTODETECT
+ if (g->vmt->fill)
+ #endif
+ {
+ g->p.y = fy;
+ g->p.cy = 1;
+ g->p.x = x+ix;
+ g->p.cx = 1;
+ for(j = 0; j < fx; ) {
+ g->p.color = g->linebuf[j];
+ if (j + g->p.cx < fx && g->linebuf[j] == g->linebuf[j + g->p.cx])
+ g->p.cx++;
+ else if (g->p.cx == 1) {
+ gdisp_lld_draw_pixel(g);
+ j++;
+ g->p.x++;
+ } else {
+ gdisp_lld_fill_area(g);
+ j += g->p.cx;
+ g->p.x += g->p.cx;
+ g->p.cx = 1;
+ }
+ }
+ }
+ #if GDISP_HARDWARE_FILLS == HARDWARE_AUTODETECT
+ else
+ #endif
+ #endif
+
// Worst line write is drawing pixels
- #if GDISP_HARDWARE_BITFILLS != TRUE && GDISP_HARDWARE_STREAM_WRITE != TRUE && GDISP_HARDWARE_DRAWPIXEL
+ #if GDISP_HARDWARE_BITFILLS != TRUE && GDISP_HARDWARE_STREAM_WRITE != TRUE && GDISP_HARDWARE_FILLS != TRUE && GDISP_HARDWARE_DRAWPIXEL
// The following test is unneeded because we are guaranteed to have draw pixel if we don't have streaming
//#if GDISP_HARDWARE_DRAWPIXEL == HARDWARE_AUTODETECT
// if (g->vmt->pixel)