diff options
| author | Radomir Dopieralski <openstack@sheep.art.pl> | 2019-08-02 12:36:34 +0200 |
|---|---|---|
| committer | Radomir Dopieralski <openstack@sheep.art.pl> | 2019-08-02 22:55:55 +0200 |
| commit | c1e5247d51ffb34bdfdb1f5039ba9118fab25f26 (patch) | |
| tree | a241c51a530073a6382848649e58f070c65bfc75 /shared-module | |
| parent | 95d2694bc33eddba991abcff1d9b2aba5675c622 (diff) | |
Add support for scaling to _stage
On high-resolution displays we can use 2x2 or even 3x3 pixels.
Diffstat (limited to 'shared-module')
| -rw-r--r-- | shared-module/_stage/__init__.c | 37 | ||||
| -rw-r--r-- | shared-module/_stage/__init__.h | 2 |
2 files changed, 22 insertions, 17 deletions
diff --git a/shared-module/_stage/__init__.c b/shared-module/_stage/__init__.c index 1af279e92..ca71b758e 100644 --- a/shared-module/_stage/__init__.c +++ b/shared-module/_stage/__init__.c @@ -34,30 +34,35 @@ void render_stage(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, mp_obj_t *layers, size_t layers_size, uint16_t *buffer, size_t buffer_size, - displayio_display_obj_t *display) { + displayio_display_obj_t *display, uint8_t scale) { size_t index = 0; for (uint16_t y = y0; y < y1; ++y) { - for (uint16_t x = x0; x < x1; ++x) { - for (size_t layer = 0; layer < layers_size; ++layer) { + for (uint8_t yscale = 0; yscale < scale; ++yscale) { + for (uint16_t x = x0; x < x1; ++x) { uint16_t c = TRANSPARENT; - layer_obj_t *obj = MP_OBJ_TO_PTR(layers[layer]); - if (obj->base.type == &mp_type_layer) { - c = get_layer_pixel(obj, x, y); - } else if (obj->base.type == &mp_type_text) { - c = get_text_pixel((text_obj_t *)obj, x, y); + for (size_t layer = 0; layer < layers_size; ++layer) { + layer_obj_t *obj = MP_OBJ_TO_PTR(layers[layer]); + if (obj->base.type == &mp_type_layer) { + c = get_layer_pixel(obj, x, y); + } else if (obj->base.type == &mp_type_text) { + c = get_text_pixel((text_obj_t *)obj, x, y); + } + if (c != TRANSPARENT) { + break; + } } - if (c != TRANSPARENT) { + for (uint8_t xscale = 0; xscale < scale; ++xscale) { buffer[index] = c; - break; + index += 1; + // The buffer is full, send it. + if (index >= buffer_size) { + display->send(display->bus, false, ((uint8_t*)buffer), + buffer_size * 2); + index = 0; + } } } - index += 1; - // The buffer is full, send it. - if (index >= buffer_size) { - display->send(display->bus, false, ((uint8_t*)buffer), buffer_size * 2); - index = 0; - } } } // Send the remaining data. diff --git a/shared-module/_stage/__init__.h b/shared-module/_stage/__init__.h index d263302b4..5af2124ae 100644 --- a/shared-module/_stage/__init__.h +++ b/shared-module/_stage/__init__.h @@ -37,6 +37,6 @@ void render_stage(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, mp_obj_t *layers, size_t layers_size, uint16_t *buffer, size_t buffer_size, - displayio_display_obj_t *display); + displayio_display_obj_t *display, uint8_t scale); #endif // MICROPY_INCLUDED_SHARED_MODULE__STAGE |
