aboutsummaryrefslogtreecommitdiff
path: root/extmod/modframebuf.c
diff options
context:
space:
mode:
authorRadomir Dopieralski <openstack@sheep.art.pl>2016-09-02 16:15:37 +0200
committerDamien George <damien.p.george@gmail.com>2016-09-05 12:06:56 +1000
commit778729c5977633978aef2ec302472505973a657e (patch)
treea99791b2844801b6ba0f4466050eee2d4de0336c /extmod/modframebuf.c
parentb4df3e74e15ac1658c125b13bbaca5203bab5505 (diff)
extmod/framebuf: Add the xstep!=0 case to scroll() method.
Adds horizontal scrolling. Right now, I'm just leaving the margins created by the scrolling as they were -- so they will repeat the edge of the framebuf. This is fast, and the user can always fill the margins themselves.
Diffstat (limited to 'extmod/modframebuf.c')
-rw-r--r--extmod/modframebuf.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/extmod/modframebuf.c b/extmod/modframebuf.c
index 569b75e1c..3c884c689 100644
--- a/extmod/modframebuf.c
+++ b/extmod/modframebuf.c
@@ -103,7 +103,7 @@ STATIC mp_obj_t framebuf1_scroll(mp_obj_t self_in, mp_obj_t xstep_in, mp_obj_t y
mp_int_t xstep = mp_obj_get_int(xstep_in);
mp_int_t ystep = mp_obj_get_int(ystep_in);
int end = (self->height + 7) >> 3;
- if (xstep == 0 && ystep > 0) {
+ if (ystep > 0) {
for (int y = end; y > 0;) {
--y;
for (int x = 0; x < self->width; ++x) {
@@ -114,7 +114,7 @@ STATIC mp_obj_t framebuf1_scroll(mp_obj_t self_in, mp_obj_t xstep_in, mp_obj_t y
self->buf[y * self->stride + x] = (self->buf[y * self->stride + x] << ystep) | prev;
}
}
- } else if (xstep == 0 && ystep < 0) {
+ } else if (ystep < 0) {
for (int y = 0; y < end; ++y) {
for (int x = 0; x < self->width; ++x) {
int prev = 0;
@@ -125,7 +125,20 @@ STATIC mp_obj_t framebuf1_scroll(mp_obj_t self_in, mp_obj_t xstep_in, mp_obj_t y
}
}
}
- // TODO xstep!=0
+ if (xstep < 0) {
+ for (int y = 0; y < end; ++y) {
+ for (int x = 0; x < self->width + xstep; ++x) {
+ self->buf[y * self->stride + x] = self->buf[y * self->stride + x - xstep];
+ }
+ }
+ } else if (xstep > 0) {
+ for (int y = 0; y < end; ++y) {
+ for (int x = self->width - 1; x >= xstep; --x) {
+ self->buf[y * self->stride + x] = self->buf[y * self->stride + x - xstep];
+ }
+ }
+ }
+ // TODO: Should we clear the margin created by scrolling?
return mp_const_none;
}
STATIC MP_DEFINE_CONST_FUN_OBJ_3(framebuf1_scroll_obj, framebuf1_scroll);