GuiLite/core_include/surface.h

87 lines
3.1 KiB
C
Raw Normal View History

2019-02-02 11:30:40 +08:00
#ifndef GAL_H
#define GAL_H
2017-12-06 21:43:47 +08:00
2019-02-13 17:34:14 +08:00
class c_frame_layer
2017-12-06 21:43:47 +08:00
{
2019-02-13 17:34:14 +08:00
public:
c_frame_layer() { fb = NULL;}
unsigned short* fb;
2017-12-06 21:43:47 +08:00
c_rect rect;
};
typedef enum
{
Z_ORDER_LEVEL_0,//view/wave/page
Z_ORDER_LEVEL_1,//dialog
Z_ORDER_LEVEL_2,//editbox/spinbox/listbox/keyboard
Z_ORDER_LEVEL_MAX
}Z_ORDER_LEVEL;
struct EXTERNAL_GFX_OP
{
void(*draw_pixel)(int x, int y, unsigned int rgb);
void(*fill_rect)(int x0, int y0, int x1, int y1, unsigned int rgb);
};
2017-12-06 21:43:47 +08:00
class c_display;
class c_surface {
2019-02-20 12:55:27 +08:00
friend class c_display; friend class c_bitmap;
2017-12-06 21:43:47 +08:00
public:
int get_width() { return m_width; }
int get_height() { return m_height; }
unsigned int get_pixel(int x, int y, unsigned int z_order);
void draw_pixel(int x, int y, unsigned int rgb, unsigned int z_order);
void fill_rect(int x0, int y0, int x1, int y1, unsigned int rgb, unsigned int z_order);
2017-12-06 21:43:47 +08:00
void draw_hline(int x0, int x1, int y, unsigned int rgb, unsigned int z_order);
void draw_vline(int x, int y0, int y1, unsigned int rgb, unsigned int z_order);
void draw_line(int x0, int y0, int x1, int y1, unsigned int rgb, unsigned int z_order);
2018-12-28 15:56:36 +08:00
void draw_rect(int x0, int y0, int x1, int y1, unsigned int rgb, unsigned int z_order, unsigned int size = 1);
2017-12-06 21:43:47 +08:00
inline void draw_rect(c_rect rect, unsigned int rgb, unsigned int size, unsigned int z_order)
{
draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, rgb, z_order, size);
}
inline void fill_rect(c_rect rect, unsigned int rgb, unsigned int z_order)
{
fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, rgb, z_order);
}
int flush_scrren(int left, int top, int right, int bottom);
2017-12-06 21:43:47 +08:00
bool is_valid(c_rect rect);
bool is_active() { return m_is_active; }
c_display* get_display() { return m_display; }
int set_frame_layer(c_rect& rect, unsigned int z_order);
void set_active(bool flag){m_is_active = flag;}
protected:
virtual void fill_rect_on_fb(int x0, int y0, int x1, int y1, unsigned int rgb);
2019-02-13 17:34:14 +08:00
virtual void draw_pixel_on_fb(int x, int y, unsigned int rgb);
void set_surface(void* wnd_root, Z_ORDER_LEVEL max_z_order);
c_surface(c_display* display, unsigned int width, unsigned int height, unsigned int color_bytes);
int m_width; //in pixels
int m_height; //in pixels
int m_color_bytes; //16 bits, 32 bits only
2019-02-13 17:34:14 +08:00
void* m_fb; //Top frame buffer you could see
c_frame_layer m_frame_layers[Z_ORDER_LEVEL_MAX];//Top layber fb always be NULL
2017-12-06 21:43:47 +08:00
void* m_usr;
bool m_is_active;
Z_ORDER_LEVEL m_max_zorder;
Z_ORDER_LEVEL m_top_zorder;
void* m_phy_fb;
int* m_phy_write_index;
2017-12-06 21:43:47 +08:00
c_display* m_display;
};
2019-02-13 17:34:14 +08:00
class c_surface_no_fb : public c_surface {//No physical framebuffer, memory fb is 32 bits
friend class c_display;
2019-02-13 17:34:14 +08:00
c_surface_no_fb(c_display* display, unsigned int width, unsigned int height, unsigned int color_bytes, struct EXTERNAL_GFX_OP* gfx_op) :
c_surface(display, width, height, color_bytes) {m_gfx_op = gfx_op;}
2018-11-01 10:35:37 +08:00
protected:
virtual void fill_rect_on_fb(int x0, int y0, int x1, int y1, unsigned int rgb);
2019-02-13 17:34:14 +08:00
virtual void draw_pixel_on_fb(int x, int y, unsigned int rgb);
struct EXTERNAL_GFX_OP* m_gfx_op;//Rendering by external method
};
2019-02-13 17:34:14 +08:00
2017-12-06 21:43:47 +08:00
#endif