diff options
-rw-r--r-- | drivers/gdisp/Win32/gdisp_lld.c | 56 | ||||
-rw-r--r-- | drivers/touchscreen/MCU/.touchscreen_lld_config.h.swp | bin | 12288 -> 0 bytes | |||
-rw-r--r-- | src/gwin.c | 17 |
3 files changed, 40 insertions, 33 deletions
diff --git a/drivers/gdisp/Win32/gdisp_lld.c b/drivers/gdisp/Win32/gdisp_lld.c index 560a5f20..8aff8efc 100644 --- a/drivers/gdisp/Win32/gdisp_lld.c +++ b/drivers/gdisp/Win32/gdisp_lld.c @@ -709,7 +709,7 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) { * @notapi
*/
void GDISP_LLD(verticalscroll)(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor) {
- RECT rect, frect;
+ RECT rect, frect, srect;
HBRUSH hbr;
#if GDISP_NEED_VALIDATION || GDISP_NEED_CLIP
@@ -748,17 +748,19 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) { rect.right = GDISP.Width - x;
rect.left = rect.right-cx;
vertical_scroll:
- if (cy >= lines && cy >= -lines)
- ScrollDC(dcBuffer, 0, lines, &rect, 0, 0, 0);
- frect.left = rect.left;
- frect.right = rect.right;
+ srect.left = frect.left = rect.left;
+ srect.right = frect.right = rect.right;
if (lines > 0) {
- frect.top = rect.top;
- frect.bottom = frect.top+lines;
+ srect.top = frect.top = rect.top;
+ frect.bottom = rect.top+lines;
+ srect.bottom = rect.bottom-lines;
} else {
- frect.bottom = rect.bottom;
- frect.top = frect.bottom+lines;
+ srect.bottom = frect.bottom = rect.bottom;
+ frect.top = rect.bottom+lines;
+ srect.top = rect.top-lines;
}
+ if (cy >= lines && cy >= -lines)
+ ScrollDC(dcBuffer, 0, lines, &srect, 0, 0, 0);
break;
case GDISP_ROTATE_270:
rect.bottom = GDISP.Width - x;
@@ -767,17 +769,19 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) { rect.right = rect.left+cy;
lines = -lines;
horizontal_scroll:
- if (cy >= lines && cy >= -lines)
- ScrollDC(dcBuffer, lines, 0, &rect, 0, 0, 0);
- frect.top = rect.top;
- frect.bottom = rect.bottom;
+ srect.top = frect.top = rect.top;
+ srect.bottom = frect.bottom = rect.bottom;
if (lines > 0) {
- frect.left = rect.left;
- frect.right = frect.left+lines;
+ srect.left = frect.left = rect.left;
+ frect.right = rect.left+lines;
+ srect.right = rect.right-lines;
} else {
- frect.right = rect.right;
- frect.left = frect.right+lines;
+ srect.right = frect.right = rect.right;
+ frect.left = rect.right+lines;
+ srect.left = rect.left-lines;
}
+ if (cy >= lines && cy >= -lines)
+ ScrollDC(dcBuffer, lines, 0, &srect, 0, 0, 0);
break;
}
#else
@@ -786,17 +790,19 @@ void GDISP_LLD(drawpixel)(coord_t x, coord_t y, color_t color) { rect.left = x;
rect.right = rect.left+cx;
lines = -lines;
- if (cy >= lines && cy >= -lines)
- ScrollDC(dcBuffer, 0, lines, &rect, 0, 0, 0);
- frect.left = rect.left;
- frect.right = rect.right;
+ srect.left = frect.left = rect.left;
+ srect.right = frect.right = rect.right;
if (lines > 0) {
- frect.top = rect.top;
- frect.bottom = frect.top+lines;
+ srect.top = frect.top = rect.top;
+ frect.bottom = rect.top+lines;
+ srect.bottom = rect.bottom-lines;
} else {
- frect.bottom = rect.bottom;
- frect.top = frect.bottom+lines;
+ srect.bottom = frect.bottom = rect.bottom;
+ frect.top = rect.bottom+lines;
+ srect.top = rect.top-lines;
}
+ if (cy >= lines && cy >= -lines)
+ ScrollDC(dcBuffer, 0, lines, &srect, 0, 0, 0);
#endif
if (hbr)
diff --git a/drivers/touchscreen/MCU/.touchscreen_lld_config.h.swp b/drivers/touchscreen/MCU/.touchscreen_lld_config.h.swp Binary files differdeleted file mode 100644 index 595c456f..00000000 --- a/drivers/touchscreen/MCU/.touchscreen_lld_config.h.swp +++ /dev/null @@ -36,7 +36,8 @@ #include <string.h>
-#define GWIN_USE_FILLED_CHARS FALSE
+#define GWIN_CONSOLE_USE_CLEAR_LINES TRUE
+#define GWIN_CONSOLE_USE_FILLED_CHARS FALSE
#define GWIN_FLG_DYNAMIC 0x0001
#define GWIN_FIRST_CONTROL_FLAG 0x0002
@@ -635,19 +636,14 @@ void gwinPutChar(GHandle gh, char c) { #endif
if (c == '\n') {
- /* clear the text at the end of the line */
- if (gcw->cx < gh->width)
- gdispFillArea(gh->x + gcw->cx, gh->y + gcw->cy, gh->width - gcw->cx, gcw->fy, gh->bgcolor);
gcw->cx = 0;
gcw->cy += gcw->fy;
+ // We use lazy scrolling here and only scroll when the next char arrives
} else if (c == '\r') {
// gcw->cx = 0;
} else {
width = gdispGetCharWidth(c, gh->font) + gcw->fp;
if (gcw->cx + width >= gh->width) {
- /* clear the text at the end of the line */
- if (gcw->cy + gcw->fy <= gh->height)
- gdispFillArea(gh->x + gcw->cx, gh->y + gcw->cy, gh->width - (gcw->cx + width), gcw->fy, gh->bgcolor);
gcw->cx = 0;
gcw->cy += gcw->fy;
}
@@ -668,7 +664,12 @@ void gwinPutChar(GHandle gh, char c) { #endif
}
-#if GWIN_USE_FILLED_CHARS
+#if GWIN_CONSOLE_USE_CLEAR_LINES
+ /* clear to the end of the line */
+ if (gcw->cx == 0)
+ gdispFillArea(gh->x, gh->y + gcw->cy, gh->width, gcw->fy, gh->bgcolor);
+#endif
+#if GWIN_CONSOLE_USE_FILLED_CHARS
gdispFillChar(gh->x + gcw->cx, gh->y + gcw->cy, c, gh->font, gh->color, gh->bgcolor);
#else
gdispDrawChar(gh->x + gcw->cx, gh->y + gcw->cy, c, gh->font, gh->color);
|