Skip to content

Commit de38007

Browse files
committed
Support scaling
1 parent b712572 commit de38007

File tree

2 files changed

+40
-26
lines changed

2 files changed

+40
-26
lines changed

modules/stage/mod_stage.c

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ inline
302302
void render_stage(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1,
303303
mp_obj_t *layers, size_t layers_size,
304304
uint16_t *buffer, size_t buffer_size,
305-
mp_obj_t spi) {
305+
mp_obj_t spi, uint8_t scale) {
306306

307307
// TODO(deshipu): Do a collision check of each layer with the
308308
// rectangle, and only process the layers that overlap with it.
@@ -312,27 +312,31 @@ void render_stage(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1,
312312

313313
size_t index = 0;
314314
for (uint16_t y = y0; y < y1; ++y) {
315-
for (uint16_t x = x0; x < x1; ++x) {
316-
for (size_t layer = 0; layer < layers_size; ++layer) {
315+
for (uint8_t yscale = 0; yscale < scale; ++yscale) {
316+
for (uint16_t x = x0; x < x1; ++x) {
317317
uint16_t c = TRANSPARENT;
318-
layer_obj_t *obj = MP_OBJ_TO_PTR(layers[layer]);
319-
if (obj->base.type == &mp_type_layer) {
320-
c = get_layer_pixel(obj, x, y);
321-
} else if (obj->base.type == &mp_type_text) {
322-
c = get_text_pixel((text_obj_t *)obj, x, y);
318+
for (size_t layer = 0; layer < layers_size; ++layer) {
319+
layer_obj_t *obj = MP_OBJ_TO_PTR(layers[layer]);
320+
if (obj->base.type == &mp_type_layer) {
321+
c = get_layer_pixel(obj, x, y);
322+
} else if (obj->base.type == &mp_type_text) {
323+
c = get_text_pixel((text_obj_t *)obj, x, y);
324+
}
325+
if (c != TRANSPARENT) {
326+
break;
327+
}
323328
}
324-
if (c != TRANSPARENT) {
329+
for (uint8_t xscale = 0; xscale < scale; ++xscale) {
325330
buffer[index] = c;
326-
break;
331+
index += 1;
332+
// The buffer is full, send it.
333+
if (index >= buffer_size) {
334+
spi_p->transfer(s, buffer_size * 2,
335+
(const uint8_t*)buffer, NULL);
336+
index = 0;
337+
}
327338
}
328339
}
329-
index += 1;
330-
// The buffer is full, send it.
331-
if (index >= buffer_size) {
332-
spi_p->transfer(s, buffer_size * 2,
333-
(const uint8_t*)buffer, NULL);
334-
index = 0;
335-
}
336340
}
337341
}
338342
// Send the remaining data.
@@ -363,12 +367,17 @@ STATIC mp_obj_t stage_render(size_t n_args, const mp_obj_t *args) {
363367
if (type->protocol == NULL) {
364368
mp_raise_ValueError("SPI protocol required");
365369
}
370+
uint8_t scale = 1;
371+
if (n_args >= 8) {
372+
scale = mp_obj_get_int(args[7]);
373+
}
366374

367-
render_stage(x0, y0, x1, y1, layers, layers_size, buffer, buffer_size, spi);
375+
render_stage(x0, y0, x1, y1, layers, layers_size,
376+
buffer, buffer_size, spi, scale);
368377

369378
return mp_const_none;
370379
}
371-
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(stage_render_obj, 7, 7, stage_render);
380+
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(stage_render_obj, 7, 8, stage_render);
372381

373382

374383
STATIC const mp_rom_map_elem_t stage_module_globals_table[] = {

stage.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -348,11 +348,12 @@ def clear(self):
348348
class Stage:
349349
buffer = bytearray(512)
350350

351-
def __init__(self, display, fps=6):
351+
def __init__(self, display, fps=6, scale=1):
352+
self.scale = scale
352353
self.layers = []
353354
self.display = display
354-
self.width = display.width
355-
self.height = display.height
355+
self.width = display.width // scale
356+
self.height = display.height // scale
356357
self.last_tick = utime.ticks_ms()
357358
self.tick_delay = 1000 // fps
358359

@@ -371,8 +372,10 @@ def render_block(self, x0=0, y0=0, x1=None, y1=None):
371372
y1 = self.height
372373
layers = [l.layer for l in self.layers]
373374
with self.display as display:
374-
display.block(x0, y0, x1 - 1, y1 - 1)
375-
_stage.render(x0, y0, x1, y1, layers, self.buffer, display.spi)
375+
display.block(x0 * self.scale, y0 * self.scale,
376+
x1 * self.scale - 1, y1 * self.scale - 1)
377+
_stage.render(x0, y0, x1, y1, layers, self.buffer,
378+
display.spi, self.scale)
376379

377380
def render_sprites(self, sprites):
378381
layers = [l.layer for l in self.layers]
@@ -388,6 +391,8 @@ def render_sprites(self, sprites):
388391
max(sprite.py, int(sprite.y)) + 16))
389392
if x0 == x1 or y0 == y1:
390393
continue
391-
display.block(x0, y0, x1 - 1, y1 - 1)
392-
_stage.render(x0, y0, x1, y1, layers, self.buffer, display.spi)
394+
display.block(x0 * self.scale, y0 * self.scale,
395+
x1 * self.scale - 1, y1 * self.scale - 1)
396+
_stage.render(x0, y0, x1, y1, layers, self.buffer,
397+
display.spi, self.scale)
393398
sprite._updated()

0 commit comments

Comments
 (0)