/* * This file is part of MultiROM. * * MultiROM is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MultiROM is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MultiROM. If not, see . */ #ifndef H_FRAMEBUFFER #define H_FRAMEBUFFER #include #include #include #if defined(RECOVERY_BGRA) || defined(RECOVERY_RGBX) #define PIXEL_SIZE 4 typedef uint32_t px_type; #else #define PIXEL_SIZE 2 #ifndef RECOVERY_RGB_565 #define RECOVERY_RGB_565 #endif typedef uint16_t px_type; #endif #ifdef RECOVERY_BGRA #define PX_IDX_A 0 #define PX_IDX_R 1 #define PX_IDX_G 2 #define PX_IDX_B 3 #define PX_GET_R(px) ((px & 0xFF00) >> 8) #define PX_GET_G(px) ((px & 0xFF0000) >> 16) #define PX_GET_B(px) ((px & 0xFF000000) >> 24) #define PX_GET_A(px) (px & 0xFF) #elif defined(RECOVERY_RGBX) #define PX_IDX_A 3 #define PX_IDX_R 0 #define PX_IDX_G 1 #define PX_IDX_B 2 #define PX_GET_R(px) (px & 0xFF) #define PX_GET_G(px) ((px & 0xFF00) >> 8) #define PX_GET_B(px) ((px & 0xFF0000) >> 16) #define PX_GET_A(px) ((px & 0xFF000000) >> 24) #elif defined(RECOVERY_RGB_565) #define PX_GET_R(px) (((((px & 0x1F)*100)/31)*0xFF)/100) #define PX_GET_G(px) ((((((px & 0x7E0) >> 5)*100)/63)*0xFF)/100) #define PX_GET_B(px) ((((((px & 0xF800) >> 11)*100)/31)*0xFF)/100) #define PX_GET_A(px) (0xFF) #endif struct framebuffer { px_type *buffer; uint32_t size; uint32_t stride; int fd; struct fb_fix_screeninfo fi; struct fb_var_screeninfo vi; struct fb_impl *impl; void *impl_data; }; struct fb_impl { const char *name; const int impl_id; int (*open)(struct framebuffer *fb); void (*close)(struct framebuffer *fb); int (*update)(struct framebuffer *fb); void *(*get_frame_dest)(struct framebuffer *fb); }; enum { #ifdef MR_USE_QCOM_OVERLAY FB_IMPL_QCOM_OVERLAY, #endif FB_IMPL_GENERIC, // must be last FB_IMPL_CNT }; // Colors, 0xAARRGGBB #define BLACK 0xFF000000 #define WHITE 0xFFFFFFFF #define LBLUE 0xFF0099CC #define LBLUE2 0xFFA8DFF4 #define GRAYISH 0xFFBEBEBE #define GRAY 0xFF7F7F7F #define DRED 0xFFCC0000 // Font sizes in 1/4 of a point enum { SIZE_SMALL = (7*4), SIZE_NORMAL = (10*4), SIZE_BIG = (13*4), SIZE_EXTRA = (15*4), }; extern uint32_t fb_width; extern uint32_t fb_height; extern int fb_rotation; int fb_open(int rotation); int fb_open_impl(void); void fb_close(void); void fb_update(void); void fb_dump_info(void); int fb_get_vi_xres(void); int fb_get_vi_yres(void); void fb_force_generic_impl(int force); enum { FB_IT_RECT, FB_IT_IMG, FB_IT_LISTVIEW, }; enum { FB_IMG_TYPE_GENERIC, FB_IMG_TYPE_PNG, FB_IMG_TYPE_TEXT, }; enum { JUSTIFY_LEFT, JUSTIFY_CENTER, JUSTIFY_RIGHT, }; enum { STYLE_NORMAL, STYLE_ITALIC, STYLE_BOLD, STYLE_BOLD_ITALIC, STYLE_MEDIUM, STYLE_CONDENSED, STYLE_MONOSPACE, STYLE_COUNT }; enum { LEVEL_LISTVIEW = 0, LEVEL_RECT = 1, LEVEL_PNG = 2, LEVEL_TEXT = 3, }; struct fb_item_header; #define FB_ITEM_POS \ int x, y; \ int w, h; typedef struct { FB_ITEM_POS } fb_item_pos; extern fb_item_pos DEFAULT_FB_PARENT; #define FB_ITEM_HEAD \ FB_ITEM_POS \ int id; \ int type; \ int level; \ fb_item_pos *parent; \ struct fb_item_header *prev; \ struct fb_item_header *next; struct fb_item_header { FB_ITEM_HEAD }; typedef struct fb_item_header fb_item_header; typedef struct { FB_ITEM_HEAD uint32_t color; } fb_rect; /* * fb_img element draws pre-rendered image data, which can come for * example from a PNG file. * For RECOVERY_BGRA and RECOVERY_BGRX (4 bytes per px), data is just * array of pixels in selected px format. * For RECOVERY_RGB_565 (2 bytes per px), another 2 bytes with * alpha values are added after each pixel. So, one pixel is two uint16_t * entries in the result uint16_t array: * [0]: (R | (G << 5) | (B << 11)) * [1]: (alphaForRB | (alphaForG << 8)) * [2]: (R | (G << 5) | (B << 11)) * [3]: (alphaForRB | (alphaForG << 8)) * ... */ typedef struct { FB_ITEM_HEAD int img_type; px_type *data; void *extra; } fb_img; typedef fb_img fb_text; typedef struct { uint32_t background_color; fb_item_header *first_item; pthread_mutex_t mutex; volatile int batch_started; volatile pthread_t batch_thread; } fb_context_t; typedef struct { int x, y; int level; fb_item_pos *parent; uint32_t color; int size; int justify; int style; char *text; int wrap_w; } fb_text_proto; void fb_remove_item(void *item); int fb_generate_item_id(void); px_type fb_convert_color(uint32_t c); fb_img *fb_add_text(int x, int y, uint32_t color, int size, const char *fmt, ...); fb_text_proto *fb_text_create(int x, int y, uint32_t color, int size, const char *text); fb_img *fb_text_finalize(fb_text_proto *p); void fb_text_set_color(fb_img *img, uint32_t color); void fb_text_set_size(fb_img *img, int size); void fb_text_set_content(fb_img *img, const char *text); char *fb_text_get_content(fb_img *img); void fb_text_drop_cache_unused(void); void fb_text_destroy(fb_img *i); fb_rect *fb_add_rect_lvl(int level, int x, int y, int w, int h, uint32_t color); #define fb_add_rect(x, y, w, h, color) fb_add_rect_lvl(LEVEL_RECT, x, y, w, h, color) void fb_add_rect_notfilled(int level, int x, int y, int w, int h, uint32_t color, int thickness, fb_rect ***list); fb_img *fb_add_img(int level, int x, int y, int w, int h, int img_type, px_type *data); fb_img *fb_add_png_img_lvl(int level, int x, int y, int w, int h, const char *path); #define fb_add_png_img(x, y, w, h, path) fb_add_png_img_lvl(LEVEL_PNG, x, y, w, h, path) void fb_rm_text(fb_img *i); void fb_rm_rect(fb_rect *r); void fb_rm_img(fb_img *i); void fb_draw_rect(fb_rect *r); void fb_draw_img(fb_img *i); void fb_fill(uint32_t color); void fb_request_draw(void); void fb_force_draw(void); void fb_clear(void); void fb_freeze(int freeze); int fb_clone(char **buff); int fb_save_screenshot(void); void fb_push_context(void); void fb_pop_context(void); void fb_batch_start(void); void fb_batch_end(void); void fb_ctx_add_item(void *item); void fb_ctx_rm_item(void *item); inline void fb_items_lock(void); inline void fb_items_unlock(void); void fb_set_background(uint32_t color); px_type *fb_png_get(const char *path, int w, int h); void fb_png_release(px_type *data); void fb_png_drop_unused(void); int fb_png_save_img(const char *path, int w, int h, int stride, px_type *data); inline void center_text(fb_img *text, int targetX, int targetY, int targetW, int targetH); int vt_set_mode(int graphics); #endif