summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/plugins/lib/xlcd_scroll.c92
1 files changed, 92 insertions, 0 deletions
diff --git a/apps/plugins/lib/xlcd_scroll.c b/apps/plugins/lib/xlcd_scroll.c
index 6b70e2cfd2..499dbf13a9 100644
--- a/apps/plugins/lib/xlcd_scroll.c
+++ b/apps/plugins/lib/xlcd_scroll.c
@@ -31,6 +31,97 @@
31static const unsigned short patterns[4] = {0xFFFF, 0xFF00, 0x00FF, 0x0000}; 31static const unsigned short patterns[4] = {0xFFFF, 0xFF00, 0x00FF, 0x0000};
32#endif 32#endif
33 33
34#if defined(LCD_STRIDEFORMAT) && LCD_STRIDEFORMAT == VERTICAL_STRIDE
35void xlcd_scroll_left(int count)
36{
37 int length, oldmode;
38
39 if ((unsigned)count >= LCD_WIDTH)
40 return;
41
42 length = (LCD_WIDTH-count)*LCD_FBHEIGHT;
43
44 rb->memmove(rb->lcd_framebuffer, rb->lcd_framebuffer + LCD_HEIGHT*count,
45 length * sizeof(fb_data));
46
47 oldmode = rb->lcd_get_drawmode();
48 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
49 rb->lcd_fillrect(LCD_WIDTH-count, 0, count, LCD_HEIGHT);
50 rb->lcd_set_drawmode(oldmode);
51}
52
53/* Scroll right */
54void xlcd_scroll_right(int count)
55{
56 int length, oldmode;
57
58 if ((unsigned)count >= LCD_WIDTH)
59 return;
60
61 length = (LCD_WIDTH-count)*LCD_FBHEIGHT;
62
63 rb->memmove(rb->lcd_framebuffer + LCD_HEIGHT*count,
64 rb->lcd_framebuffer, length * sizeof(fb_data));
65
66 oldmode = rb->lcd_get_drawmode();
67 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
68 rb->lcd_fillrect(0, 0, count, LCD_HEIGHT);
69 rb->lcd_set_drawmode(oldmode);
70}
71
72/* Scroll up */
73void xlcd_scroll_up(int count)
74{
75 int width, length, oldmode;
76
77 fb_data *data;
78
79 if ((unsigned)count >= LCD_HEIGHT)
80 return;
81
82 length = LCD_HEIGHT - count;
83
84 width = LCD_WIDTH;
85 data = rb->lcd_framebuffer;
86
87 do {
88 rb->memmove(data,data + count,length * sizeof(fb_data));
89 data += LCD_HEIGHT;
90 } while(width--);
91
92 oldmode = rb->lcd_get_drawmode();
93 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
94 rb->lcd_fillrect(0, length, LCD_WIDTH, count);
95 rb->lcd_set_drawmode(oldmode);
96}
97
98/* Scroll down */
99void xlcd_scroll_down(int count)
100{
101 int width, length, oldmode;
102
103 fb_data *data;
104
105 if ((unsigned)count >= LCD_HEIGHT)
106 return;
107
108 length = LCD_HEIGHT - count;
109
110 width = LCD_WIDTH;
111 data = rb->lcd_framebuffer;
112
113 do {
114 rb->memmove(data + count, data, length * sizeof(fb_data));
115 data += LCD_HEIGHT;
116 } while(width--);
117
118 oldmode = rb->lcd_get_drawmode();
119 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
120 rb->lcd_fillrect(0, 0, LCD_WIDTH, count);
121 rb->lcd_set_drawmode(oldmode);
122}
123#else
124
34#if (LCD_PIXELFORMAT == HORIZONTAL_PACKING) && (LCD_DEPTH < 8) 125#if (LCD_PIXELFORMAT == HORIZONTAL_PACKING) && (LCD_DEPTH < 8)
35 126
36/* Scroll left */ 127/* Scroll left */
@@ -629,5 +720,6 @@ void xlcd_scroll_down(int count)
629} 720}
630 721
631#endif /* LCD_PIXELFORMAT, LCD_DEPTH */ 722#endif /* LCD_PIXELFORMAT, LCD_DEPTH */
723#endif /* defined(LCD_STRIDEFORMAT) && LCD_STRIDEFORMAT == VERTICAL_STRIDE */
632 724
633#endif /* HAVE_LCD_BITMAP */ 725#endif /* HAVE_LCD_BITMAP */