/** * @file canvas_i.h * GUI: internal Canvas API */ #pragma once #include "canvas.h" #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif typedef void (*CanvasCommitCallback)( uint8_t* data, size_t size, CanvasOrientation orientation, void* context); typedef struct { CanvasCommitCallback callback; void* context; } CanvasCallbackPair; ARRAY_DEF(CanvasCallbackPairArray, CanvasCallbackPair, M_POD_OPLIST); #define M_OPL_CanvasCallbackPairArray_t() ARRAY_OPLIST(CanvasCallbackPairArray, M_POD_OPLIST) ALGO_DEF(CanvasCallbackPairArray, CanvasCallbackPairArray_t); /** Canvas structure */ struct Canvas { u8g2_t fb; CanvasOrientation orientation; uint8_t offset_x; uint8_t offset_y; uint8_t width; uint8_t height; CompressIcon* compress_icon; CanvasCallbackPairArray_t canvas_callback_pair; FuriMutex* mutex; }; /** Allocate memory and initialize canvas * * @return Canvas instance */ Canvas* canvas_init(); /** Free canvas memory * * @param canvas Canvas instance */ void canvas_free(Canvas* canvas); /** Get canvas buffer. * * @param canvas Canvas instance * * @return pointer to buffer */ uint8_t* canvas_get_buffer(Canvas* canvas); /** Get canvas buffer size. * * @param canvas Canvas instance * * @return size of canvas in bytes */ size_t canvas_get_buffer_size(const Canvas* canvas); /** Set drawing region relative to real screen buffer * * @param canvas Canvas instance * @param offset_x x coordinate offset * @param offset_y y coordinate offset * @param width width * @param height height */ void canvas_frame_set( Canvas* canvas, uint8_t offset_x, uint8_t offset_y, uint8_t width, uint8_t height); /** Set canvas orientation * * @param canvas Canvas instance * @param orientation CanvasOrientation */ void canvas_set_orientation(Canvas* canvas, CanvasOrientation orientation); /** Get canvas orientation * * @param canvas Canvas instance * * @return CanvasOrientation */ CanvasOrientation canvas_get_orientation(const Canvas* canvas); /** Draw a u8g2 bitmap * * @param canvas Canvas instance * @param x x coordinate * @param y y coordinate * @param width width * @param height height * @param bitmap bitmap * @param rotation rotation */ void canvas_draw_u8g2_bitmap( u8g2_t* u8g2, uint8_t x, uint8_t y, uint8_t width, uint8_t height, const uint8_t* bitmap, IconRotation rotation); /** Add canvas commit callback. * * This callback will be called upon Canvas commit. * * @param canvas Canvas instance * @param callback CanvasCommitCallback * @param context CanvasCommitCallback context */ void canvas_add_framebuffer_callback(Canvas* canvas, CanvasCommitCallback callback, void* context); /** Remove canvas commit callback. * * @param canvas Canvas instance * @param callback CanvasCommitCallback * @param context CanvasCommitCallback context */ void canvas_remove_framebuffer_callback( Canvas* canvas, CanvasCommitCallback callback, void* context); #ifdef __cplusplus } #endif