impl bitmap_create_ex with bitmap_init_ex

This commit is contained in:
lixianjing 2024-11-28 08:37:46 +08:00
parent f310109da3
commit 8f3e1c9773
3 changed files with 68 additions and 40 deletions

View File

@ -1,20 +1,21 @@
# 最新动态 # 最新动态
2024/11/28 2024/11/28
* 增加函数 bitmap_set_dirty/bitmap_is_dirty * 增加函数 bitmap\_set\_dirty/bitmap\_is\_dirty
* 重构bitmap用bitmap\_init\_ex 实现bitmap\_create\_ex
2024/11/26 2024/11/26
* 增加tab_button_group删除tab_button和对应page的函数(感谢智明提供补丁) * 增加tab\_button\_group删除tab\_button和对应page的函数(感谢智明提供补丁)
2024/11/22 2024/11/22
* 修复 mledit编译警告(感谢泽武提供补丁) * 修复 mledit编译警告(感谢泽武提供补丁)
2024/11/21 2024/11/21
* 完善conf_json(感谢兆坤提供补丁) * 完善conf\_json(感谢兆坤提供补丁)
2024/11/19 2024/11/19
* 增加函数 str_append_format_padding * 增加函数 str\_append\_format\_padding
* 增加 atomic_compare_exchange(感谢兆坤提供补丁) * 增加 atomic\_compare\_exchange(感谢兆坤提供补丁)
* 完善 atomic(感谢兆坤提供补丁) * 完善 atomic(感谢兆坤提供补丁)
2024/11/18 2024/11/18
@ -23,7 +24,7 @@
* fix memory error whene change theme. * fix memory error whene change theme.
2024/11/17 2024/11/17
* 完善 TK_STRINGIZE(感谢兆坤提供补丁) * 完善 TK\_STRINGIZE(感谢兆坤提供补丁)
* value完善调试log(感谢兆坤提供补丁) * value完善调试log(感谢兆坤提供补丁)
* 修复拼写错误(感谢兆坤提供补丁) * 修复拼写错误(感谢兆坤提供补丁)
* 增加原子操作(感谢兆坤提供补丁) * 增加原子操作(感谢兆坤提供补丁)
@ -31,8 +32,8 @@
2024/11/15 2024/11/15
* 修复拼写错误(感谢兆坤提供补丁) * 修复拼写错误(感谢兆坤提供补丁)
* 修复 demoui dialog(感谢兆坤提供补丁) * 修复 demoui dialog(感谢兆坤提供补丁)
* 增加tk_strs_bsearch * 增加tk\_strs\_bsearch
* 修复text_selector测试用例报错问题(感谢颖健提供补丁) * 修复text\_selector测试用例报错问题(感谢颖健提供补丁)
* 修复控件有offset时更新指针icon没更新的问题(感谢颖健提供补丁) * 修复控件有offset时更新指针icon没更新的问题(感谢颖健提供补丁)
2024/11/14 2024/11/14

View File

@ -124,41 +124,35 @@ static ret_t bitmap_web_destroy(bitmap_t* bitmap) {
return RET_OK; return RET_OK;
} }
static ret_t bitmap_platform_create(bitmap_t* bitmap) {
uint32_t w = bitmap->w;
uint32_t h = bitmap->h;
uint32_t line_length = bitmap_get_physical_line_length(bitmap);
bitmap_format_t format = bitmap->format;
uint8_t* data = bitmap_lock_buffer_for_write(bitmap);
return_value_if_fail(format == BITMAP_FMT_RGBA8888, NULL);
int32_t id = EM_ASM_INT(
{ return VGCanvas.createMutableImage($0, $1, $2, $3, $4); }, data, w, h, line_length, format);
bitmap->specific = tk_pointer_from_int(id);
bitmap->specific_destroy = bitmap_web_destroy;
bitmap_unlock_buffer(bitmap);
return RET_OK;
}
#else
static ret_t bitmap_platform_create(bitmap_t* bitmap) {
return RET_OK;
}
#endif /*AWTK_WEB*/ #endif /*AWTK_WEB*/
bitmap_t* bitmap_create_ex(uint32_t w, uint32_t h, uint32_t line_length, bitmap_format_t format) { bitmap_t* bitmap_create_ex(uint32_t w, uint32_t h, uint32_t line_length, bitmap_format_t format) {
bitmap_t* bitmap = TKMEM_ZALLOC(bitmap_t); bitmap_t* bitmap = TKMEM_ZALLOC(bitmap_t);
uint32_t bpp = bitmap_get_bpp_of_format(format);
return_value_if_fail(bitmap != NULL, NULL); return_value_if_fail(bitmap != NULL, NULL);
bitmap->w = w; bitmap_init_ex(bitmap, w, h, line_length, format, NULL);
bitmap->h = h;
bitmap->format = format;
bitmap->should_free_handle = TRUE; bitmap->should_free_handle = TRUE;
if (bpp < 4) {
bitmap->flags = BITMAP_FLAG_OPAQUE;
}
bitmap_set_line_length(bitmap, line_length);
bitmap_alloc_data(bitmap);
if (bitmap->buffer == NULL) {
TKMEM_FREE(bitmap);
bitmap = NULL;
} else {
#ifdef AWTK_WEB
uint8_t* data = bitmap_lock_buffer_for_write(bitmap);
return_value_if_fail(format == BITMAP_FMT_RGBA8888, NULL);
int32_t id = EM_ASM_INT({ return VGCanvas.createMutableImage($0, $1, $2, $3, $4); }, data, w, h,
line_length, format);
bitmap->specific = tk_pointer_from_int(id);
bitmap->specific_destroy = bitmap_web_destroy;
bitmap_unlock_buffer(bitmap);
#endif /*AWTK_WEB*/
}
return bitmap; return bitmap;
} }
@ -587,6 +581,7 @@ ret_t bitmap_init(bitmap_t* bitmap, uint32_t w, uint32_t h, bitmap_format_t form
uint32_t bpp = bitmap_get_bpp_of_format(format); uint32_t bpp = bitmap_get_bpp_of_format(format);
line_length = tk_max(w * bpp, line_length); line_length = tk_max(w * bpp, line_length);
} }
return bitmap_init_ex(bitmap, w, h, line_length, format, data); return bitmap_init_ex(bitmap, w, h, line_length, format, data);
} }
@ -612,6 +607,10 @@ ret_t bitmap_init_ex(bitmap_t* bitmap, uint32_t w, uint32_t h, uint32_t line_len
bitmap->should_free_data = TRUE; bitmap->should_free_data = TRUE;
} }
if (bitmap->buffer == NULL) {
bitmap_platform_create(bitmap);
}
return bitmap->buffer != NULL ? RET_OK : RET_OOM; return bitmap->buffer != NULL ? RET_OK : RET_OOM;
} }

View File

@ -2,7 +2,7 @@
#include "base/bitmap.h" #include "base/bitmap.h"
#include "gtest/gtest.h" #include "gtest/gtest.h"
TEST(Bitmap, basic) { TEST(Bitmap, basic1) {
uint32_t n = 100; uint32_t n = 100;
uint32_t i = 0; uint32_t i = 0;
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
@ -10,10 +10,10 @@ TEST(Bitmap, basic) {
uint8_t* bdata = bitmap_lock_buffer_for_write(b); uint8_t* bdata = bitmap_lock_buffer_for_write(b);
ASSERT_EQ(((intptr_t)(bdata)) % BITMAP_ALIGN_SIZE, (intptr_t)0); ASSERT_EQ(((intptr_t)(bdata)) % BITMAP_ALIGN_SIZE, (intptr_t)0);
ASSERT_EQ(bitmap_get_line_length(b), b->w * 4u); ASSERT_EQ(bitmap_get_line_length(b), b->w * 4u);
ASSERT_EQ(bitmap_is_dirty(b), TRUE);
bitmap_unlock_buffer(b);
ASSERT_EQ(bitmap_is_dirty(b), FALSE); ASSERT_EQ(bitmap_is_dirty(b), FALSE);
bitmap_unlock_buffer(b);
ASSERT_EQ(bitmap_is_dirty(b), TRUE);
ASSERT_EQ(b->should_free_handle, TRUE);
bitmap_destroy(b); bitmap_destroy(b);
} }
@ -23,10 +23,38 @@ TEST(Bitmap, basic) {
ASSERT_EQ(((intptr_t)(bdata)) % BITMAP_ALIGN_SIZE, (intptr_t)0); ASSERT_EQ(((intptr_t)(bdata)) % BITMAP_ALIGN_SIZE, (intptr_t)0);
ASSERT_EQ(bitmap_get_line_length(b), b->w * 2u); ASSERT_EQ(bitmap_get_line_length(b), b->w * 2u);
bitmap_unlock_buffer(b); bitmap_unlock_buffer(b);
ASSERT_EQ(b->should_free_handle, TRUE);
bitmap_destroy(b); bitmap_destroy(b);
} }
} }
TEST(Bitmap, basic2) {
bitmap_t bitmap;
uint32_t n = 100;
uint32_t i = 0;
bitmap_t* b = &bitmap;
for (i = 0; i < n; i++) {
bitmap_init_ex(b, i + 1, i + 1, 0, BITMAP_FMT_BGRA8888, NULL);
uint8_t* bdata = bitmap_lock_buffer_for_write(b);
ASSERT_EQ(((intptr_t)(bdata)) % BITMAP_ALIGN_SIZE, (intptr_t)0);
ASSERT_EQ(bitmap_get_line_length(b), b->w * 4u);
ASSERT_EQ(bitmap_is_dirty(b), FALSE);
bitmap_unlock_buffer(b);
ASSERT_EQ(bitmap_is_dirty(b), TRUE);
ASSERT_EQ(b->should_free_handle, FALSE);
}
for (i = 0; i < n; i++) {
bitmap_init_ex(b, i + 1, i + 1, 0, BITMAP_FMT_BGR565, NULL);
uint8_t* bdata = bitmap_lock_buffer_for_write(b);
ASSERT_EQ(((intptr_t)(bdata)) % BITMAP_ALIGN_SIZE, (intptr_t)0);
ASSERT_EQ(bitmap_get_line_length(b), b->w * 2u);
bitmap_unlock_buffer(b);
ASSERT_EQ(b->should_free_handle, FALSE);
}
}
TEST(Bitmap, row_size) { TEST(Bitmap, row_size) {
ASSERT_EQ(TK_BITMAP_MONO_LINE_LENGTH(8), 2); ASSERT_EQ(TK_BITMAP_MONO_LINE_LENGTH(8), 2);
ASSERT_EQ(TK_BITMAP_MONO_LINE_LENGTH(9), 2); ASSERT_EQ(TK_BITMAP_MONO_LINE_LENGTH(9), 2);