Files
multirom_m86/lib/framebuffer.h
2015-03-01 22:30:53 +01:00

307 lines
7.0 KiB
C

/*
* 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 <http://www.gnu.org/licenses/>.
*/
#ifndef H_FRAMEBUFFER
#define H_FRAMEBUFFER
#include <linux/fb.h>
#include <stdarg.h>
#include <pthread.h>
#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