diff --git a/GuiLite.h b/GuiLite.h index c43de49..201b07b 100644 --- a/GuiLite.h +++ b/GuiLite.h @@ -453,42 +453,40 @@ class c_frame_layer { public: c_frame_layer() { fb = 0; } - unsigned short* fb; + void* fb; c_rect visible_rect; }; -#define GL_ROUND_RGB_32(rgb) (rgb & 0xFFF8FCF8) //make RGB32 = RGB16 class c_surface { friend class c_display; friend class c_bitmap; public: c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_fb(0), m_phy_write_index(0), m_display(0) { - set_surface(max_zorder); + memset(m_frame_layers, 0, sizeof(m_frame_layers)); m_frame_layers[Z_ORDER_LEVEL_0].visible_rect = c_rect(0, 0, m_width, m_height); + set_surface(max_zorder); } int get_width() { return m_width; } int get_height() { return m_height; } unsigned int get_pixel(int x, int y, unsigned int z_order) { - if (x >= m_width || y >= m_height || x < 0 || y < 0 || - z_order >= Z_ORDER_LEVEL_MAX) + if (x >= m_width || y >= m_height || x < 0 || y < 0 || z_order >= Z_ORDER_LEVEL_MAX) { ASSERT(false); return 0; } - if (z_order == m_max_zorder) + if (m_frame_layers[z_order].fb) { - if (m_fb) - { - return (m_color_bytes == 4) ? ((unsigned int*)m_fb)[y * m_width + x] : GL_RGB_16_to_32(((unsigned short*)m_fb)[y * m_width + x]); - } - else if (m_phy_fb) - { - return (m_color_bytes == 4) ? ((unsigned int*)m_phy_fb)[y * m_width + x] : GL_RGB_16_to_32(((unsigned short*)m_phy_fb)[y * m_width + x]); - } - return 0; + return (m_color_bytes == 4) ? ((unsigned int*)(m_frame_layers[z_order].fb))[y * m_width + x] : GL_RGB_16_to_32(((unsigned short*)(m_frame_layers[z_order].fb))[y * m_width + x]); } - unsigned short rgb_16 = ((unsigned short*)(m_frame_layers[z_order].fb))[y * m_width + x]; - return GL_RGB_16_to_32(rgb_16); + else if (m_fb) + { + return (m_color_bytes == 4) ? ((unsigned int*)m_fb)[y * m_width + x] : GL_RGB_16_to_32(((unsigned short*)m_fb)[y * m_width + x]); + } + else if (m_phy_fb) + { + return (m_color_bytes == 4) ? ((unsigned int*)m_phy_fb)[y * m_width + x] : GL_RGB_16_to_32(((unsigned short*)m_phy_fb)[y * m_width + x]); + } + return 0; } virtual void draw_pixel(int x, int y, unsigned int rgb, unsigned int z_order) { @@ -501,21 +499,28 @@ public: ASSERT(false); return; } - rgb = GL_ROUND_RGB_32(rgb); - if (z_order == m_max_zorder) - { - return draw_pixel_on_fb(x, y, rgb); - } - if (z_order > (unsigned int)m_top_zorder) - { - m_top_zorder = (Z_ORDER_LEVEL)z_order; - } if (0 == m_frame_layers[z_order].visible_rect.PtInRect(x, y)) { ASSERT(false); return; } - ((unsigned short*)(m_frame_layers[z_order].fb))[x + y * m_width] = GL_RGB_32_to_16(rgb); + if (z_order == m_max_zorder) + { + return draw_pixel_on_fb(x, y, rgb); + } + + if (z_order > (unsigned int)m_top_zorder) + { + m_top_zorder = (Z_ORDER_LEVEL)z_order; + } + if (m_color_bytes == 4) + { + ((unsigned int*)(m_frame_layers[z_order].fb))[x + y * m_width] = rgb; + } + else + { + ((unsigned short*)(m_frame_layers[z_order].fb))[x + y * m_width] = GL_RGB_32_to_16(rgb); + } if (z_order == m_top_zorder) { return draw_pixel_on_fb(x, y, rgb); @@ -540,7 +545,6 @@ public: y0 = (y0 < 0) ? 0 : y0; x1 = (x1 > (m_width - 1)) ? (m_width - 1) : x1; y1 = (y1 > (m_height - 1)) ? (m_height - 1) : y1; - rgb = GL_ROUND_RGB_32(rgb); if (z_order == m_max_zorder) { return fill_rect_on_fb(x0, y0, x1, y1, rgb); @@ -548,15 +552,30 @@ public: if (z_order == m_top_zorder) { int x, y; - unsigned short* mem_fb; + unsigned short* mem_fb_16 = 0; + unsigned int* mem_fb_32 = 0; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); for (y = y0; y <= y1; y++) { x = x0; - mem_fb = &((unsigned short*)m_frame_layers[z_order].fb)[y * m_width + x]; + if (m_color_bytes == 4) + { + mem_fb_32 = &((unsigned int*)m_frame_layers[z_order].fb)[y * m_width + x]; + } + else + { + mem_fb_16 = &((unsigned short*)m_frame_layers[z_order].fb)[y * m_width + x]; + } for (; x <= x1; x++) { - *mem_fb++ = rgb_16; + if (m_color_bytes == 4) + { + *mem_fb_32++ = rgb; + } + else + { + *mem_fb_16++ = rgb_16; + } } } return fill_rect_on_fb(x0, y0, x1, y1, rgb); @@ -754,8 +773,8 @@ public: { if (!rect.PtInRect(x, y)) { - unsigned int rgb = ((unsigned short*)(m_frame_layers[src_zorder].fb))[x + y * m_width]; - draw_pixel_on_fb(x, y, GL_RGB_16_to_32(rgb)); + unsigned int rgb = (m_color_bytes == 4) ? ((unsigned int*)(m_frame_layers[src_zorder].fb))[x + y * m_width] : GL_RGB_16_to_32(((unsigned short*)(m_frame_layers[src_zorder].fb))[x + y * m_width]); + draw_pixel_on_fb(x, y, rgb); } } } @@ -855,7 +874,8 @@ protected: } for (int i = Z_ORDER_LEVEL_0; i < m_max_zorder; i++) {//Top layber fb always be 0 - m_frame_layers[i].fb = (unsigned short*)calloc(m_width * m_height, sizeof(unsigned short)); + ASSERT(!m_frame_layers[i].fb); + m_frame_layers[i].fb = calloc(m_width * m_height, m_color_bytes); ASSERT(m_frame_layers[i].fb); } } @@ -1341,16 +1361,19 @@ public: { return; } - unsigned short* lower_fb = 0; + unsigned short* lower_fb_16 = 0; + unsigned int* lower_fb_32 = 0; int lower_fb_width = surface->m_width; if (z_order >= Z_ORDER_LEVEL_1) { - lower_fb = surface->m_frame_layers[z_order - 1].fb; + lower_fb_16 = (unsigned short*)surface->m_frame_layers[z_order - 1].fb; + lower_fb_32 = (unsigned int*)surface->m_frame_layers[z_order - 1].fb; } unsigned int mask_rgb_16 = GL_RGB_32_to_16(mask_rgb); int xsize = pBitmap->width; int ysize = pBitmap->height; const unsigned short* pData = (const unsigned short*)pBitmap->pixel_color_array; + int color_bytes = surface->m_color_bytes; for (int j = 0; j < ysize; j++) { for (int i = 0; i < xsize; i++) @@ -1358,9 +1381,9 @@ public: unsigned int rgb = *pData++; if (mask_rgb_16 == rgb) { - if (lower_fb) + if (lower_fb_16) {//restore lower layer - surface->draw_pixel(x + i, y + j, GL_RGB_16_to_32(lower_fb[(y + j) * lower_fb_width + x + i]), z_order); + surface->draw_pixel(x + i, y + j, (color_bytes == 4) ? lower_fb_32[(y + j) * lower_fb_width + x + i] : GL_RGB_16_to_32(lower_fb_16[(y + j) * lower_fb_width + x + i]), z_order); } } else @@ -1376,14 +1399,17 @@ public: { return; } - unsigned short* lower_fb = 0; + unsigned short* lower_fb_16 = 0; + unsigned int* lower_fb_32 = 0; int lower_fb_width = surface->m_width; if (z_order >= Z_ORDER_LEVEL_1) { - lower_fb = surface->m_frame_layers[z_order - 1].fb; + lower_fb_16 = (unsigned short*)surface->m_frame_layers[z_order - 1].fb; + lower_fb_32 = (unsigned int*)surface->m_frame_layers[z_order - 1].fb; } unsigned int mask_rgb_16 = GL_RGB_32_to_16(mask_rgb); const unsigned short* pData = (const unsigned short*)pBitmap->pixel_color_array; + int color_bytes = surface->m_color_bytes; for (int j = 0; j < height; j++) { const unsigned short* p = &pData[src_x + (src_y + j) * pBitmap->width]; @@ -1392,9 +1418,9 @@ public: unsigned int rgb = *p++; if (mask_rgb_16 == rgb) { - if (lower_fb) + if (lower_fb_16) {//restore lower layer - surface->draw_pixel(x + i, y + j, GL_RGB_16_to_32(lower_fb[(y + j) * lower_fb_width + x + i]), z_order); + surface->draw_pixel(x + i, y + j, (color_bytes == 4) ? lower_fb_32[(y + j) * lower_fb_width + x + i] : GL_RGB_16_to_32(lower_fb_16[(y + j) * lower_fb_width + x + i]), z_order); } } else diff --git a/README.md b/README.md index 9a81b75..7d6192a 100644 --- a/README.md +++ b/README.md @@ -99,6 +99,7 @@ Click the image you like, and run it on your hardware
Scroll widget
+
Transparent dialog
diff --git a/README_zh.md b/README_zh.md index f1def04..efbfd01 100644 --- a/README_zh.md +++ b/README_zh.md @@ -97,6 +97,7 @@
Scroll widget
+
Transparent dialog
diff --git a/documents/HelloTransparent.gif b/documents/HelloTransparent.gif new file mode 100644 index 0000000..13278b5 Binary files /dev/null and b/documents/HelloTransparent.gif differ diff --git a/workspace/core_include/bitmap.h b/workspace/core_include/bitmap.h index aebd434..5927637 100644 --- a/workspace/core_include/bitmap.h +++ b/workspace/core_include/bitmap.h @@ -17,16 +17,19 @@ public: { return; } - unsigned short* lower_fb = 0; + unsigned short* lower_fb_16 = 0; + unsigned int* lower_fb_32 = 0; int lower_fb_width = surface->m_width; if (z_order >= Z_ORDER_LEVEL_1) { - lower_fb = surface->m_frame_layers[z_order - 1].fb; + lower_fb_16 = (unsigned short*)surface->m_frame_layers[z_order - 1].fb; + lower_fb_32 = (unsigned int*)surface->m_frame_layers[z_order - 1].fb; } unsigned int mask_rgb_16 = GL_RGB_32_to_16(mask_rgb); int xsize = pBitmap->width; int ysize = pBitmap->height; const unsigned short* pData = (const unsigned short*)pBitmap->pixel_color_array; + int color_bytes = surface->m_color_bytes; for (int j = 0; j < ysize; j++) { for (int i = 0; i < xsize; i++) @@ -34,9 +37,9 @@ public: unsigned int rgb = *pData++; if (mask_rgb_16 == rgb) { - if (lower_fb) + if (lower_fb_16) {//restore lower layer - surface->draw_pixel(x + i, y + j, GL_RGB_16_to_32(lower_fb[(y + j) * lower_fb_width + x + i]), z_order); + surface->draw_pixel(x + i, y + j, (color_bytes == 4) ? lower_fb_32[(y + j) * lower_fb_width + x + i] : GL_RGB_16_to_32(lower_fb_16[(y + j) * lower_fb_width + x + i]), z_order); } } else @@ -46,6 +49,7 @@ public: } } } + static void draw_bitmap(c_surface* surface, int z_order, const BITMAP_INFO* pBitmap, int x, int y, int src_x, int src_y, int width, int height, unsigned int mask_rgb = DEFAULT_MASK_COLOR) { if (0 == pBitmap || (src_x + width > pBitmap->width) || (src_y + height > pBitmap->height)) @@ -53,14 +57,17 @@ public: return; } - unsigned short* lower_fb = 0; + unsigned short* lower_fb_16 = 0; + unsigned int* lower_fb_32 = 0; int lower_fb_width = surface->m_width; if (z_order >= Z_ORDER_LEVEL_1) { - lower_fb = surface->m_frame_layers[z_order - 1].fb; + lower_fb_16 = (unsigned short*)surface->m_frame_layers[z_order - 1].fb; + lower_fb_32 = (unsigned int*)surface->m_frame_layers[z_order - 1].fb; } unsigned int mask_rgb_16 = GL_RGB_32_to_16(mask_rgb); const unsigned short* pData = (const unsigned short*)pBitmap->pixel_color_array; + int color_bytes = surface->m_color_bytes; for (int j = 0; j < height; j++) { const unsigned short* p = &pData[src_x + (src_y + j) * pBitmap->width]; @@ -69,9 +76,9 @@ public: unsigned int rgb = *p++; if (mask_rgb_16 == rgb) { - if (lower_fb) + if (lower_fb_16) {//restore lower layer - surface->draw_pixel(x + i, y + j, GL_RGB_16_to_32(lower_fb[(y + j) * lower_fb_width + x + i]), z_order); + surface->draw_pixel(x + i, y + j, (color_bytes == 4) ? lower_fb_32[(y + j) * lower_fb_width + x + i] : GL_RGB_16_to_32(lower_fb_16[(y + j) * lower_fb_width + x + i]), z_order); } } else diff --git a/workspace/core_include/display.h b/workspace/core_include/display.h index 2bfa83d..b891697 100644 --- a/workspace/core_include/display.h +++ b/workspace/core_include/display.h @@ -101,11 +101,10 @@ class c_frame_layer { public: c_frame_layer() { fb = 0; } - unsigned short* fb; + void* fb; c_rect visible_rect; }; -#define GL_ROUND_RGB_32(rgb) (rgb & 0xFFF8FCF8) //make RGB32 = RGB16 class c_surface { friend class c_display; friend class c_bitmap; public: @@ -121,28 +120,24 @@ public: unsigned int get_pixel(int x, int y, unsigned int z_order) { - if (x >= m_width || y >= m_height || x < 0 || y < 0 || - z_order >= Z_ORDER_LEVEL_MAX) + if (x >= m_width || y >= m_height || x < 0 || y < 0 || z_order >= Z_ORDER_LEVEL_MAX) { ASSERT(false); return 0; } - - if (z_order == m_max_zorder) + if (m_frame_layers[z_order].fb) { - if (m_fb) - { - return (m_color_bytes == 4) ? ((unsigned int*)m_fb)[y * m_width + x] : GL_RGB_16_to_32(((unsigned short*)m_fb)[y * m_width + x]); - } - else if (m_phy_fb) - { - return (m_color_bytes == 4) ? ((unsigned int*)m_phy_fb)[y * m_width + x] : GL_RGB_16_to_32(((unsigned short*)m_phy_fb)[y * m_width + x]); - } - return 0; + return (m_color_bytes == 4) ? ((unsigned int*)(m_frame_layers[z_order].fb))[y * m_width + x] : GL_RGB_16_to_32(((unsigned short*)(m_frame_layers[z_order].fb))[y * m_width + x]); } - - unsigned short rgb_16 = ((unsigned short*)(m_frame_layers[z_order].fb))[y * m_width + x]; - return GL_RGB_16_to_32(rgb_16); + else if (m_fb) + { + return (m_color_bytes == 4) ? ((unsigned int*)m_fb)[y * m_width + x] : GL_RGB_16_to_32(((unsigned short*)m_fb)[y * m_width + x]); + } + else if (m_phy_fb) + { + return (m_color_bytes == 4) ? ((unsigned int*)m_phy_fb)[y * m_width + x] : GL_RGB_16_to_32(((unsigned short*)m_phy_fb)[y * m_width + x]); + } + return 0; } virtual void draw_pixel(int x, int y, unsigned int rgb, unsigned int z_order) @@ -156,23 +151,30 @@ public: ASSERT(false); return; } - rgb = GL_ROUND_RGB_32(rgb); - if (z_order == m_max_zorder) - { - return draw_pixel_on_fb(x, y, rgb); - } - - if (z_order > (unsigned int)m_top_zorder) - { - m_top_zorder = (Z_ORDER_LEVEL)z_order; - } - if (0 == m_frame_layers[z_order].visible_rect.PtInRect(x, y)) { ASSERT(false); return; } - ((unsigned short*)(m_frame_layers[z_order].fb))[x + y * m_width] = GL_RGB_32_to_16(rgb); + + if (z_order == m_max_zorder) + { + return draw_pixel_on_fb(x, y, rgb); + } + + if (z_order > (unsigned int)m_top_zorder) + { + m_top_zorder = (Z_ORDER_LEVEL)z_order; + } + + if (m_color_bytes == 4) + { + ((unsigned int*)(m_frame_layers[z_order].fb))[x + y * m_width] = rgb; + } + else + { + ((unsigned short*)(m_frame_layers[z_order].fb))[x + y * m_width] = GL_RGB_32_to_16(rgb); + } if (z_order == m_top_zorder) { @@ -202,7 +204,6 @@ public: x1 = (x1 > (m_width - 1)) ? (m_width - 1) : x1; y1 = (y1 > (m_height - 1)) ? (m_height - 1) : y1; - rgb = GL_ROUND_RGB_32(rgb); if (z_order == m_max_zorder) { return fill_rect_on_fb(x0, y0, x1, y1, rgb); @@ -211,15 +212,30 @@ public: if (z_order == m_top_zorder) { int x, y; - unsigned short* mem_fb; + unsigned short* mem_fb_16 = 0; + unsigned int* mem_fb_32 = 0; unsigned int rgb_16 = GL_RGB_32_to_16(rgb); for (y = y0; y <= y1; y++) { x = x0; - mem_fb = &((unsigned short*)m_frame_layers[z_order].fb)[y * m_width + x]; + if (m_color_bytes == 4) + { + mem_fb_32 = &((unsigned int*)m_frame_layers[z_order].fb)[y * m_width + x]; + } + else + { + mem_fb_16 = &((unsigned short*)m_frame_layers[z_order].fb)[y * m_width + x]; + } for (; x <= x1; x++) { - *mem_fb++ = rgb_16; + if (m_color_bytes == 4) + { + *mem_fb_32++ = rgb; + } + else + { + *mem_fb_16++ = rgb_16; + } } } return fill_rect_on_fb(x0, y0, x1, y1, rgb); @@ -436,8 +452,8 @@ public: { if (!rect.PtInRect(x, y)) { - unsigned int rgb = ((unsigned short*)(m_frame_layers[src_zorder].fb))[x + y * m_width]; - draw_pixel_on_fb(x, y, GL_RGB_16_to_32(rgb)); + unsigned int rgb = (m_color_bytes == 4) ? ((unsigned int*)(m_frame_layers[src_zorder].fb))[x + y * m_width] : GL_RGB_16_to_32(((unsigned short*)(m_frame_layers[src_zorder].fb))[x + y * m_width]); + draw_pixel_on_fb(x, y, rgb); } } } @@ -545,7 +561,7 @@ protected: for (int i = Z_ORDER_LEVEL_0; i < m_max_zorder; i++) {//Top layber fb always be 0 ASSERT(!m_frame_layers[i].fb); - m_frame_layers[i].fb = (unsigned short*)calloc(m_width * m_height, sizeof(unsigned short)); + m_frame_layers[i].fb = calloc(m_width * m_height, m_color_bytes); ASSERT(m_frame_layers[i].fb); } } diff --git a/workspace/header-only.sh b/workspace/header-only.sh index a41dad8..f5bfb20 100644 --- a/workspace/header-only.sh +++ b/workspace/header-only.sh @@ -1,5 +1,3 @@ -./.sync.sh GuiLite-header - echo "Build header-only library: GuiLite.h" # build GuiLiteRaw.h @@ -55,3 +53,4 @@ mv GuiLite.h ../ echo "Done!" echo "You could find GuiLite.h in root folder" +./.sync.sh GuiLite-header