diff options
author | aanper <mail@s3f.ru> | 2020-10-15 18:05:28 +0300 |
---|---|---|
committer | aanper <mail@s3f.ru> | 2020-10-15 18:05:28 +0300 |
commit | e684869970ce5e4b9d785dd25ccd6620c82f441a (patch) | |
tree | a4ee38426646ce889615347795d329dc06f7581c /applications/gui/canvas.c | |
parent | 19ef348c80e027f4c9ea304bc96349c195e97fbb (diff) |
refactor canvas
Diffstat (limited to 'applications/gui/canvas.c')
-rw-r--r-- | applications/gui/canvas.c | 116 |
1 files changed, 73 insertions, 43 deletions
diff --git a/applications/gui/canvas.c b/applications/gui/canvas.c index 6f137284..2572bd23 100644 --- a/applications/gui/canvas.c +++ b/applications/gui/canvas.c @@ -6,74 +6,104 @@ #include <u8g2.h> struct Canvas { - FuriRecordSubscriber* fb_record; - u8g2_t* fb; + u8g2_t fb; uint8_t offset_x; uint8_t offset_y; uint8_t width; uint8_t height; }; -Canvas* canvas_alloc() { - Canvas* canvas = furi_alloc(sizeof(Canvas)); - canvas->fb_record = furi_open_deprecated("u8g2_fb", false, false, NULL, NULL, NULL); - assert(canvas->fb_record); - return canvas; +uint8_t canvas_width(CanvasApi* api); +uint8_t canvas_height(CanvasApi* api); +void canvas_clear(CanvasApi* api); +void canvas_color_set(CanvasApi* api, uint8_t color); +void canvas_font_set(CanvasApi* api, Font font); +void canvas_str_draw(CanvasApi* api, uint8_t x, uint8_t y, const char* str); + +CanvasApi* canvas_api_init() { + CanvasApi* api = furi_alloc(sizeof(CanvasApi)); + + u8g2_t _u8g2; + u8g2_Setup_st7565_erc12864_alt_f( + &api->canvas.fb, U8G2_R0, u8x8_hw_spi_stm32, u8g2_gpio_and_delay_stm32); + u8g2_InitDisplay( + &canvas->fb); // send init sequence to the display, display is in sleep mode after this + u8g2_SetContrast(&api->canvas.fb, 36); + + u8g2_SetPowerSave(&api->canvas.fb, 0); // wake up display + u8g2_SendBuffer(&api->canvas.fb); + + api->width = canvas_width; + api->height = canvas_height; + api->clear = canvas_clear; + api->canvas_color_set = canvas_color_set; + api->canvas_font_set = canvas_font_set; + api->draw_str = canvas_str_draw; + + api->fonts = { + .primary = u8g2_font_Born2bSportyV2_tr, + .secondary = u8g2_font_HelvetiPixel_tr, + }; + + return api; } -void canvas_free(Canvas* canvas) { - assert(canvas); - free(canvas); +void canvas_api_free(CanvasApi* api) { + assert(api); + free(api); } -void canvas_commit(Canvas* canvas) { - assert(canvas); - if(canvas->fb) { - furi_commit(canvas->fb_record); - canvas->fb = NULL; - } +void canvas_commit(CanvasApi* api) { + assert(api); + + u8g2_SetPowerSave(&api->canvas.fb, 0); // wake up display + u8g2_SendBuffer(&api->canvas.fb); } void canvas_frame_set( - Canvas* canvas, + CanvasApi* api, uint8_t offset_x, uint8_t offset_y, uint8_t width, uint8_t height) { - assert(canvas); - canvas->offset_x = offset_x; - canvas->offset_y = offset_y; - canvas->width = width; - canvas->height = height; + assert(api); + api->canvas.offset_x = offset_x; + api->canvas.offset_y = offset_y; + api->canvas.width = width; + api->canvas.height = height; } -u8g2_t* canvas_fb(Canvas* canvas) { - if(!canvas->fb) { - canvas->fb = furi_take(canvas->fb_record); - assert(canvas->fb); - } - return canvas->fb; +uint8_t canvas_width(CanvasApi* api) { + assert(api); + + return api->canvas.width; +} + +uint8_t canvas_height(CanvasApi* api) { + assert(api); + + return api->canvas.height; } -void canvas_clear(Canvas* canvas) { - u8g2_t* fb = canvas_fb(canvas); - u8g2_ClearBuffer(fb); +void canvas_clear(CanvasApi* api) { + assert(api); + u8g2_ClearBuffer(&api->canvas.fb); } -void canvas_color_set(Canvas* canvas, uint8_t color) { - u8g2_t* fb = canvas_fb(canvas); - u8g2_SetDrawColor(fb, 1); +void canvas_color_set(CanvasApi* api, Color color) { + assert(api); + u8g2_SetDrawColor(&api->canvas.fb, color); } -void canvas_font_set(Canvas* canvas, font_t font) { - u8g2_t* fb = canvas_fb(canvas); - u8g2_SetFontMode(fb, 1); - u8g2_SetFont(fb, font); +void canvas_font_set(CanvasApi* api, Font font) { + assert(api); + u8g2_SetFontMode(&api->canvas.fb, 1); + u8g2_SetFont(&api->canvas.fb, font); } -void canvas_str_draw(Canvas* canvas, uint8_t x, uint8_t y, const char* str) { - x += canvas->offset_x; - y += canvas->offset_y; - u8g2_t* fb = canvas_fb(canvas); - u8g2_DrawStr(fb, x, y, str); +void canvas_str_draw(CanvasApi* api, uint8_t x, uint8_t y, const char* str) { + assert(api); + x += api->canvas.offset_x; + y += api->canvas.offset_y; + u8g2_DrawStr(&api->canvas.fb, x, y, str); } |