summaryrefslogtreecommitdiff
path: root/shared-module/displayio/Display.c
diff options
context:
space:
mode:
authorMark Roberts <mdroberts1243@gmail.com>2020-09-24 22:07:33 -0400
committerMark Roberts <mdroberts1243@gmail.com>2020-09-24 22:07:33 -0400
commit06a3d152664a97cc0a2f2faee86d2f5ea4e063e2 (patch)
tree131a01d0a55f893d1ffff4129c654d8b0a873ef4 /shared-module/displayio/Display.c
parent5a176c2c67cff17415d1a713ed2ee3cbf94dd020 (diff)
Mostly-working-version with comments
Diffstat (limited to 'shared-module/displayio/Display.c')
-rw-r--r--shared-module/displayio/Display.c36
1 files changed, 29 insertions, 7 deletions
diff --git a/shared-module/displayio/Display.c b/shared-module/displayio/Display.c
index b6979c0b2..afc4b7564 100644
--- a/shared-module/displayio/Display.c
+++ b/shared-module/displayio/Display.c
@@ -49,7 +49,8 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self,
uint8_t* init_sequence, uint16_t init_sequence_len, const mcu_pin_obj_t* backlight_pin,
uint16_t brightness_command, mp_float_t brightness, bool auto_brightness,
bool single_byte_bounds, bool data_as_commands, bool auto_refresh, uint16_t native_frames_per_second,
- bool backlight_on_high, bool column_and_page_addressing) {
+ bool backlight_on_high, bool SH1107_addressing) {
+
// Turn off auto-refresh as we init.
self->auto_refresh = false;
uint16_t ram_width = 0x100;
@@ -69,7 +70,7 @@ void common_hal_displayio_display_construct(displayio_display_obj_t* self,
self->first_manual_refresh = !auto_refresh;
self->data_as_commands = data_as_commands;
self->backlight_on_high = backlight_on_high;
- self->column_and_page_addressing = column_and_page_addressing;
+ self->SH1107_addressing = SH1107_addressing;
self->native_frames_per_second = native_frames_per_second;
self->native_ms_per_frame = 1000 / native_frames_per_second;
@@ -242,11 +243,23 @@ STATIC bool _refresh_area(displayio_display_obj_t* self, const displayio_area_t*
if (!displayio_display_core_clip_area(&self->core, area, &clipped)) {
return true;
}
- uint16_t subrectangles = 1;
uint16_t rows_per_buffer = displayio_area_height(&clipped);
uint8_t pixels_per_word = (sizeof(uint32_t) * 8) / self->core.colorspace.depth;
uint16_t pixels_per_buffer = displayio_area_size(&clipped);
- if (displayio_area_size(&clipped) > buffer_size * pixels_per_word) {
+
+ uint16_t subrectangles = 1;
+ // for SH1107 and other boundary constrained controllers
+ // write one single row at a time
+ if (self->SH1107_addressing) {
+ subrectangles = rows_per_buffer; // vertical (column mode) write each separately (height times)
+ }
+
+ // Skip this recalculation of subrectangles if SH1107 (each subrectangle is a single row)
+ // [mdroberts1243] I am worried/confused about the pixels_in_byte_share_row calculation though
+ // since it makes sense to be on a byte boundary (actually a page boundary too)
+ // seems to work as is though.
+ if ((displayio_area_size(&clipped) > buffer_size * pixels_per_word)
+ && (!self->SH1107_addressing)) {
rows_per_buffer = buffer_size * pixels_per_word / displayio_area_width(&clipped);
if (rows_per_buffer == 0) {
rows_per_buffer = 1;
@@ -283,14 +296,23 @@ STATIC bool _refresh_area(displayio_display_obj_t* self, const displayio_area_t*
.x2 = clipped.x2,
.y2 = clipped.y1 + rows_per_buffer * (j + 1)
};
- if (remaining_rows < rows_per_buffer) {
+ if (self->SH1107_addressing) {
+ // one row only for SH1107 in vertical (column) mode
+ subrectangle.y1 = clipped.y1 + j;
+ subrectangle.y2 = clipped.y1 + (j + 1);
+ };
+ if ((remaining_rows < rows_per_buffer) && (!self->SH1107_addressing)) {
subrectangle.y2 = subrectangle.y1 + remaining_rows;
}
- remaining_rows -= rows_per_buffer;
+ if (self->SH1107_addressing) {
+ remaining_rows -= 1;
+ } else {
+ remaining_rows -= rows_per_buffer;
+ }
displayio_display_core_set_region_to_update(&self->core, self->set_column_command,
self->set_row_command, NO_COMMAND, NO_COMMAND, self->data_as_commands, false,
- &subrectangle, self->column_and_page_addressing);
+ &subrectangle, self->SH1107_addressing);
uint16_t subrectangle_size_bytes;
if (self->core.colorspace.depth >= 8) {