summaryrefslogtreecommitdiffstatshomepage
path: root/extmod/modframebuf.c
diff options
context:
space:
mode:
Diffstat (limited to 'extmod/modframebuf.c')
-rw-r--r--extmod/modframebuf.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/extmod/modframebuf.c b/extmod/modframebuf.c
index d0ef238075..3c884c6898 100644
--- a/extmod/modframebuf.c
+++ b/extmod/modframebuf.c
@@ -33,7 +33,7 @@
#if MICROPY_PY_FRAMEBUF
-#include "font_petme128_8x8.h"
+#include "stmhal/font_petme128_8x8.h"
// 1-bit frame buffer, each byte is a column of 8 pixels
typedef struct _mp_obj_framebuf1_t {
@@ -68,7 +68,8 @@ STATIC mp_obj_t framebuf1_fill(mp_obj_t self_in, mp_obj_t col_in) {
if (col) {
col = 0xff;
}
- for (int y = 0; y < self->height / 8; ++y) {
+ int end = (self->height + 7) >> 3;
+ for (int y = 0; y < end; ++y) {
memset(self->buf + y * self->stride, col, self->width);
}
return mp_const_none;
@@ -83,7 +84,7 @@ STATIC mp_obj_t framebuf1_pixel(size_t n_args, const mp_obj_t *args) {
int index = (y / 8) * self->stride + x;
if (n_args == 3) {
// get
- return MP_OBJ_NEW_SMALL_INT(self->buf[index] >> (y & 7));
+ return MP_OBJ_NEW_SMALL_INT((self->buf[index] >> (y & 7)) & 1);
} else {
// set
if (mp_obj_get_int(args[3])) {
@@ -101,8 +102,9 @@ STATIC mp_obj_t framebuf1_scroll(mp_obj_t self_in, mp_obj_t xstep_in, mp_obj_t y
mp_obj_framebuf1_t *self = MP_OBJ_TO_PTR(self_in);
mp_int_t xstep = mp_obj_get_int(xstep_in);
mp_int_t ystep = mp_obj_get_int(ystep_in);
- if (xstep == 0 && ystep > 0) {
- for (int y = self->height / 8; y > 0;) {
+ int end = (self->height + 7) >> 3;
+ if (ystep > 0) {
+ for (int y = end; y > 0;) {
--y;
for (int x = 0; x < self->width; ++x) {
int prev = 0;
@@ -112,18 +114,31 @@ 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) {
- for (int y = 0; y < self->height / 8; ++y) {
+ } else if (ystep < 0) {
+ for (int y = 0; y < end; ++y) {
for (int x = 0; x < self->width; ++x) {
int prev = 0;
- if (y + 1 < self->height / 8) {
+ if (y + 1 < end) {
prev = self->buf[(y + 1) * self->stride + x] << (8 + ystep);
}
self->buf[y * self->stride + x] = (self->buf[y * self->stride + x] >> -ystep) | prev;
}
}
}
- // 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);