extmod/modframebuf: Optimise argument handling.
Several methods extract mp_int_t from adjacent arguments. This reduces code size for the repeated calls to mp_obj_get_int. Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
This commit is contained in:
parent
59e3348c10
commit
470a44bd3a
@ -263,21 +263,21 @@ STATIC void fill_rect(const mp_obj_framebuf_t *fb, int x, int y, int w, int h, u
|
|||||||
formats[fb->format].fill_rect(fb, x, y, xend - x, yend - y, col);
|
formats[fb->format].fill_rect(fb, x, y, xend - x, yend - y, col);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC mp_obj_t framebuf_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
|
STATIC mp_obj_t framebuf_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args_in) {
|
||||||
mp_arg_check_num(n_args, n_kw, 4, 5, false);
|
mp_arg_check_num(n_args, n_kw, 4, 5, false);
|
||||||
|
|
||||||
mp_obj_framebuf_t *o = mp_obj_malloc(mp_obj_framebuf_t, type);
|
mp_obj_framebuf_t *o = mp_obj_malloc(mp_obj_framebuf_t, type);
|
||||||
o->buf_obj = args[0];
|
o->buf_obj = args_in[0];
|
||||||
|
|
||||||
mp_buffer_info_t bufinfo;
|
mp_buffer_info_t bufinfo;
|
||||||
mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_WRITE);
|
mp_get_buffer_raise(args_in[0], &bufinfo, MP_BUFFER_WRITE);
|
||||||
o->buf = bufinfo.buf;
|
o->buf = bufinfo.buf;
|
||||||
|
|
||||||
o->width = mp_obj_get_int(args[1]);
|
o->width = mp_obj_get_int(args_in[1]);
|
||||||
o->height = mp_obj_get_int(args[2]);
|
o->height = mp_obj_get_int(args_in[2]);
|
||||||
o->format = mp_obj_get_int(args[3]);
|
o->format = mp_obj_get_int(args_in[3]);
|
||||||
if (n_args >= 5) {
|
if (n_args >= 5) {
|
||||||
o->stride = mp_obj_get_int(args[4]);
|
o->stride = mp_obj_get_int(args_in[4]);
|
||||||
} else {
|
} else {
|
||||||
o->stride = o->width;
|
o->stride = o->width;
|
||||||
}
|
}
|
||||||
@ -305,6 +305,12 @@ STATIC mp_obj_t framebuf_make_new(const mp_obj_type_t *type, size_t n_args, size
|
|||||||
return MP_OBJ_FROM_PTR(o);
|
return MP_OBJ_FROM_PTR(o);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC void framebuf_args(const mp_obj_t *args_in, mp_int_t *args_out, int n) {
|
||||||
|
for (int i = 0; i < n; ++i) {
|
||||||
|
args_out[i] = mp_obj_get_int(args_in[i + 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
STATIC mp_int_t framebuf_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufinfo, mp_uint_t flags) {
|
STATIC mp_int_t framebuf_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufinfo, mp_uint_t flags) {
|
||||||
(void)flags;
|
(void)flags;
|
||||||
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(self_in);
|
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
@ -322,98 +328,71 @@ STATIC mp_obj_t framebuf_fill(mp_obj_t self_in, mp_obj_t col_in) {
|
|||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_2(framebuf_fill_obj, framebuf_fill);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_2(framebuf_fill_obj, framebuf_fill);
|
||||||
|
|
||||||
STATIC mp_obj_t framebuf_fill_rect(size_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t framebuf_fill_rect(size_t n_args, const mp_obj_t *args_in) {
|
||||||
(void)n_args;
|
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args_in[0]);
|
||||||
|
mp_int_t args[5]; // x, y, w, h, col
|
||||||
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args[0]);
|
framebuf_args(args_in, args, 5);
|
||||||
mp_int_t x = mp_obj_get_int(args[1]);
|
fill_rect(self, args[0], args[1], args[2], args[3], args[4]);
|
||||||
mp_int_t y = mp_obj_get_int(args[2]);
|
|
||||||
mp_int_t width = mp_obj_get_int(args[3]);
|
|
||||||
mp_int_t height = mp_obj_get_int(args[4]);
|
|
||||||
mp_int_t col = mp_obj_get_int(args[5]);
|
|
||||||
|
|
||||||
fill_rect(self, x, y, width, height, col);
|
|
||||||
|
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(framebuf_fill_rect_obj, 6, 6, framebuf_fill_rect);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(framebuf_fill_rect_obj, 6, 6, framebuf_fill_rect);
|
||||||
|
|
||||||
STATIC mp_obj_t framebuf_pixel(size_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t framebuf_pixel(size_t n_args, const mp_obj_t *args_in) {
|
||||||
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args[0]);
|
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args_in[0]);
|
||||||
mp_int_t x = mp_obj_get_int(args[1]);
|
mp_int_t x = mp_obj_get_int(args_in[1]);
|
||||||
mp_int_t y = mp_obj_get_int(args[2]);
|
mp_int_t y = mp_obj_get_int(args_in[2]);
|
||||||
if (0 <= x && x < self->width && 0 <= y && y < self->height) {
|
if (0 <= x && x < self->width && 0 <= y && y < self->height) {
|
||||||
if (n_args == 3) {
|
if (n_args == 3) {
|
||||||
// get
|
// get
|
||||||
return MP_OBJ_NEW_SMALL_INT(getpixel(self, x, y));
|
return MP_OBJ_NEW_SMALL_INT(getpixel(self, x, y));
|
||||||
} else {
|
} else {
|
||||||
// set
|
// set
|
||||||
setpixel(self, x, y, mp_obj_get_int(args[3]));
|
setpixel(self, x, y, mp_obj_get_int(args_in[3]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(framebuf_pixel_obj, 3, 4, framebuf_pixel);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(framebuf_pixel_obj, 3, 4, framebuf_pixel);
|
||||||
|
|
||||||
STATIC mp_obj_t framebuf_hline(size_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t framebuf_hline(size_t n_args, const mp_obj_t *args_in) {
|
||||||
(void)n_args;
|
(void)n_args;
|
||||||
|
|
||||||
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args[0]);
|
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args_in[0]);
|
||||||
mp_int_t x = mp_obj_get_int(args[1]);
|
mp_int_t args[4]; // x, y, w, col
|
||||||
mp_int_t y = mp_obj_get_int(args[2]);
|
framebuf_args(args_in, args, 4);
|
||||||
mp_int_t w = mp_obj_get_int(args[3]);
|
|
||||||
mp_int_t col = mp_obj_get_int(args[4]);
|
|
||||||
|
|
||||||
fill_rect(self, x, y, w, 1, col);
|
fill_rect(self, args[0], args[1], args[2], 1, args[3]);
|
||||||
|
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(framebuf_hline_obj, 5, 5, framebuf_hline);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(framebuf_hline_obj, 5, 5, framebuf_hline);
|
||||||
|
|
||||||
STATIC mp_obj_t framebuf_vline(size_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t framebuf_vline(size_t n_args, const mp_obj_t *args_in) {
|
||||||
(void)n_args;
|
(void)n_args;
|
||||||
|
|
||||||
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args[0]);
|
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args_in[0]);
|
||||||
mp_int_t x = mp_obj_get_int(args[1]);
|
mp_int_t args[4]; // x, y, h, col
|
||||||
mp_int_t y = mp_obj_get_int(args[2]);
|
framebuf_args(args_in, args, 4);
|
||||||
mp_int_t h = mp_obj_get_int(args[3]);
|
|
||||||
mp_int_t col = mp_obj_get_int(args[4]);
|
|
||||||
|
|
||||||
fill_rect(self, x, y, 1, h, col);
|
fill_rect(self, args[0], args[1], 1, args[2], args[3]);
|
||||||
|
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(framebuf_vline_obj, 5, 5, framebuf_vline);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(framebuf_vline_obj, 5, 5, framebuf_vline);
|
||||||
|
|
||||||
STATIC mp_obj_t framebuf_rect(size_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t framebuf_rect(size_t n_args, const mp_obj_t *args_in) {
|
||||||
(void)n_args;
|
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args_in[0]);
|
||||||
|
mp_int_t args[5]; // x, y, w, h, col
|
||||||
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args[0]);
|
framebuf_args(args_in, args, 5);
|
||||||
mp_int_t x = mp_obj_get_int(args[1]);
|
fill_rect(self, args[0], args[1], args[2], 1, args[4]);
|
||||||
mp_int_t y = mp_obj_get_int(args[2]);
|
fill_rect(self, args[0], args[1] + args[3] - 1, args[2], 1, args[4]);
|
||||||
mp_int_t w = mp_obj_get_int(args[3]);
|
fill_rect(self, args[0], args[1], 1, args[3], args[4]);
|
||||||
mp_int_t h = mp_obj_get_int(args[4]);
|
fill_rect(self, args[0] + args[2] - 1, args[1], 1, args[3], args[4]);
|
||||||
mp_int_t col = mp_obj_get_int(args[5]);
|
|
||||||
|
|
||||||
fill_rect(self, x, y, w, 1, col);
|
|
||||||
fill_rect(self, x, y + h - 1, w, 1, col);
|
|
||||||
fill_rect(self, x, y, 1, h, col);
|
|
||||||
fill_rect(self, x + w - 1, y, 1, h, col);
|
|
||||||
|
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(framebuf_rect_obj, 6, 6, framebuf_rect);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(framebuf_rect_obj, 6, 6, framebuf_rect);
|
||||||
|
|
||||||
STATIC mp_obj_t framebuf_line(size_t n_args, const mp_obj_t *args) {
|
STATIC void line(const mp_obj_framebuf_t *fb, mp_int_t x1, mp_int_t y1, mp_int_t x2, mp_int_t y2, mp_int_t col) {
|
||||||
(void)n_args;
|
|
||||||
|
|
||||||
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args[0]);
|
|
||||||
mp_int_t x1 = mp_obj_get_int(args[1]);
|
|
||||||
mp_int_t y1 = mp_obj_get_int(args[2]);
|
|
||||||
mp_int_t x2 = mp_obj_get_int(args[3]);
|
|
||||||
mp_int_t y2 = mp_obj_get_int(args[4]);
|
|
||||||
mp_int_t col = mp_obj_get_int(args[5]);
|
|
||||||
|
|
||||||
mp_int_t dx = x2 - x1;
|
mp_int_t dx = x2 - x1;
|
||||||
mp_int_t sx;
|
mp_int_t sx;
|
||||||
if (dx > 0) {
|
if (dx > 0) {
|
||||||
@ -452,12 +431,12 @@ STATIC mp_obj_t framebuf_line(size_t n_args, const mp_obj_t *args) {
|
|||||||
mp_int_t e = 2 * dy - dx;
|
mp_int_t e = 2 * dy - dx;
|
||||||
for (mp_int_t i = 0; i < dx; ++i) {
|
for (mp_int_t i = 0; i < dx; ++i) {
|
||||||
if (steep) {
|
if (steep) {
|
||||||
if (0 <= y1 && y1 < self->width && 0 <= x1 && x1 < self->height) {
|
if (0 <= y1 && y1 < fb->width && 0 <= x1 && x1 < fb->height) {
|
||||||
setpixel(self, y1, x1, col);
|
setpixel(fb, y1, x1, col);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (0 <= x1 && x1 < self->width && 0 <= y1 && y1 < self->height) {
|
if (0 <= x1 && x1 < fb->width && 0 <= y1 && y1 < fb->height) {
|
||||||
setpixel(self, x1, y1, col);
|
setpixel(fb, x1, y1, col);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (e >= 0) {
|
while (e >= 0) {
|
||||||
@ -468,31 +447,41 @@ STATIC mp_obj_t framebuf_line(size_t n_args, const mp_obj_t *args) {
|
|||||||
e += 2 * dy;
|
e += 2 * dy;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 <= x2 && x2 < self->width && 0 <= y2 && y2 < self->height) {
|
if (0 <= x2 && x2 < fb->width && 0 <= y2 && y2 < fb->height) {
|
||||||
setpixel(self, x2, y2, col);
|
setpixel(fb, x2, y2, col);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC mp_obj_t framebuf_line(size_t n_args, const mp_obj_t *args_in) {
|
||||||
|
(void)n_args;
|
||||||
|
|
||||||
|
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args_in[0]);
|
||||||
|
mp_int_t args[5]; // x1, y1, x2, y2, col
|
||||||
|
framebuf_args(args_in, args, 5);
|
||||||
|
|
||||||
|
line(self, args[0], args[1], args[2], args[3], args[4]);
|
||||||
|
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(framebuf_line_obj, 6, 6, framebuf_line);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(framebuf_line_obj, 6, 6, framebuf_line);
|
||||||
|
|
||||||
STATIC mp_obj_t framebuf_blit(size_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t framebuf_blit(size_t n_args, const mp_obj_t *args_in) {
|
||||||
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args[0]);
|
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args_in[0]);
|
||||||
mp_obj_t source_in = mp_obj_cast_to_native_base(args[1], MP_OBJ_FROM_PTR(&mp_type_framebuf));
|
mp_obj_t source_in = mp_obj_cast_to_native_base(args_in[1], MP_OBJ_FROM_PTR(&mp_type_framebuf));
|
||||||
if (source_in == MP_OBJ_NULL) {
|
if (source_in == MP_OBJ_NULL) {
|
||||||
mp_raise_TypeError(NULL);
|
mp_raise_TypeError(NULL);
|
||||||
}
|
}
|
||||||
mp_obj_framebuf_t *source = MP_OBJ_TO_PTR(source_in);
|
mp_obj_framebuf_t *source = MP_OBJ_TO_PTR(source_in);
|
||||||
|
|
||||||
mp_int_t x = mp_obj_get_int(args[2]);
|
mp_int_t x = mp_obj_get_int(args_in[2]);
|
||||||
mp_int_t y = mp_obj_get_int(args[3]);
|
mp_int_t y = mp_obj_get_int(args_in[3]);
|
||||||
mp_int_t key = -1;
|
mp_int_t key = -1;
|
||||||
if (n_args > 4) {
|
if (n_args > 4) {
|
||||||
key = mp_obj_get_int(args[4]);
|
key = mp_obj_get_int(args_in[4]);
|
||||||
}
|
}
|
||||||
mp_obj_framebuf_t *palette = NULL;
|
mp_obj_framebuf_t *palette = NULL;
|
||||||
if (n_args > 5 && args[5] != mp_const_none) {
|
if (n_args > 5 && args_in[5] != mp_const_none) {
|
||||||
palette = MP_OBJ_TO_PTR(mp_obj_cast_to_native_base(args[5], MP_OBJ_FROM_PTR(&mp_type_framebuf)));
|
palette = MP_OBJ_TO_PTR(mp_obj_cast_to_native_base(args_in[5], MP_OBJ_FROM_PTR(&mp_type_framebuf)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@ -563,15 +552,15 @@ STATIC mp_obj_t framebuf_scroll(mp_obj_t self_in, mp_obj_t xstep_in, mp_obj_t ys
|
|||||||
}
|
}
|
||||||
STATIC MP_DEFINE_CONST_FUN_OBJ_3(framebuf_scroll_obj, framebuf_scroll);
|
STATIC MP_DEFINE_CONST_FUN_OBJ_3(framebuf_scroll_obj, framebuf_scroll);
|
||||||
|
|
||||||
STATIC mp_obj_t framebuf_text(size_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t framebuf_text(size_t n_args, const mp_obj_t *args_in) {
|
||||||
// extract arguments
|
// extract arguments
|
||||||
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args[0]);
|
mp_obj_framebuf_t *self = MP_OBJ_TO_PTR(args_in[0]);
|
||||||
const char *str = mp_obj_str_get_str(args[1]);
|
const char *str = mp_obj_str_get_str(args_in[1]);
|
||||||
mp_int_t x0 = mp_obj_get_int(args[2]);
|
mp_int_t x0 = mp_obj_get_int(args_in[2]);
|
||||||
mp_int_t y0 = mp_obj_get_int(args[3]);
|
mp_int_t y0 = mp_obj_get_int(args_in[3]);
|
||||||
mp_int_t col = 1;
|
mp_int_t col = 1;
|
||||||
if (n_args >= 5) {
|
if (n_args >= 5) {
|
||||||
col = mp_obj_get_int(args[4]);
|
col = mp_obj_get_int(args_in[4]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// loop over chars
|
// loop over chars
|
||||||
@ -626,18 +615,18 @@ STATIC const mp_obj_type_t mp_type_framebuf = {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
// this factory function is provided for backwards compatibility with old FrameBuffer1 class
|
// this factory function is provided for backwards compatibility with old FrameBuffer1 class
|
||||||
STATIC mp_obj_t legacy_framebuffer1(size_t n_args, const mp_obj_t *args) {
|
STATIC mp_obj_t legacy_framebuffer1(size_t n_args, const mp_obj_t *args_in) {
|
||||||
mp_obj_framebuf_t *o = mp_obj_malloc(mp_obj_framebuf_t, &mp_type_framebuf);
|
mp_obj_framebuf_t *o = mp_obj_malloc(mp_obj_framebuf_t, &mp_type_framebuf);
|
||||||
|
|
||||||
mp_buffer_info_t bufinfo;
|
mp_buffer_info_t bufinfo;
|
||||||
mp_get_buffer_raise(args[0], &bufinfo, MP_BUFFER_WRITE);
|
mp_get_buffer_raise(args_in[0], &bufinfo, MP_BUFFER_WRITE);
|
||||||
o->buf = bufinfo.buf;
|
o->buf = bufinfo.buf;
|
||||||
|
|
||||||
o->width = mp_obj_get_int(args[1]);
|
o->width = mp_obj_get_int(args_in[1]);
|
||||||
o->height = mp_obj_get_int(args[2]);
|
o->height = mp_obj_get_int(args_in[2]);
|
||||||
o->format = FRAMEBUF_MVLSB;
|
o->format = FRAMEBUF_MVLSB;
|
||||||
if (n_args >= 4) {
|
if (n_args >= 4) {
|
||||||
o->stride = mp_obj_get_int(args[3]);
|
o->stride = mp_obj_get_int(args_in[3]);
|
||||||
} else {
|
} else {
|
||||||
o->stride = o->width;
|
o->stride = o->width;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user