awtk/tests/image_loader_stb_test.cc

146 lines
4.6 KiB
C++
Raw Normal View History

#include "tkc/fs.h"
#include "tkc/mem.h"
2018-04-18 14:27:14 +08:00
#include "gtest/gtest.h"
#include "tools/common/utils.h"
#include "base/image_manager.h"
2018-08-24 07:45:37 +08:00
#include "base/assets_manager.h"
2018-04-18 14:27:14 +08:00
#include "tools/image_gen/image_gen.h"
#include "image_loader/image_loader_stb.h"
2018-04-27 11:23:09 +08:00
#define PNG_NAME TK_ROOT "/tests/testdata/test.png"
#define JPG_NAME TK_ROOT "/tests/testdata/test.jpg"
#define PNG_OPAQUE_NAME TK_ROOT "/tests/testdata/test_opaque.png"
2018-04-18 14:27:14 +08:00
static ret_t load_image(const char* filename, bitmap_t* image) {
ret_t ret = RET_OK;
image_loader_t* loader = image_loader_stb();
2018-11-25 18:57:44 +08:00
uint32_t size = file_get_size(filename);
asset_info_t* info = (asset_info_t*)TKMEM_ALLOC(sizeof(asset_info_t) + size);
return_value_if_fail(info != NULL, RET_OOM);
memset(info, 0x00, sizeof(asset_info_t));
info->size = size;
info->type = ASSET_TYPE_IMAGE;
2019-05-07 18:15:04 +08:00
info->subtype = ASSET_TYPE_IMAGE_PNG;
2018-11-25 18:57:44 +08:00
info->refcount = 1;
info->is_in_rom = FALSE;
2018-12-26 09:14:02 +08:00
strncpy(info->name, "name", TK_NAME_LEN);
2018-11-25 18:57:44 +08:00
ENSURE(file_read_part(filename, info->data, size, 0) == size);
ret = image_loader_load(loader, info, image);
TKMEM_FREE(info);
2018-04-18 14:27:14 +08:00
return ret;
}
TEST(ImageLoaderStb, basic) {
bitmap_t image;
2018-08-04 11:58:43 +08:00
memset(&image, 0x00, sizeof(image));
2018-04-18 14:27:14 +08:00
ret_t ret = load_image(PNG_NAME, &image);
2018-04-20 21:49:47 +08:00
2018-04-18 14:27:14 +08:00
ASSERT_EQ(ret, RET_OK);
ASSERT_EQ(32, image.w);
ASSERT_EQ(32, image.h);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_IMMUTABLE), true);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_OPAQUE), false);
2018-08-04 11:58:43 +08:00
bitmap_destroy(&image);
2018-04-20 21:49:47 +08:00
2018-04-18 14:27:14 +08:00
ret = load_image(JPG_NAME, &image);
ASSERT_EQ(ret, RET_OK);
ASSERT_EQ(32, image.w);
ASSERT_EQ(32, image.h);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_IMMUTABLE), true);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_OPAQUE), true);
2018-08-04 11:58:43 +08:00
bitmap_destroy(&image);
2018-04-20 21:49:47 +08:00
2018-04-18 14:27:14 +08:00
ret = load_image(PNG_OPAQUE_NAME, &image);
ASSERT_EQ(ret, RET_OK);
ASSERT_EQ(32, image.w);
ASSERT_EQ(32, image.h);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_IMMUTABLE), true);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_OPAQUE), true);
2018-08-04 11:58:43 +08:00
bitmap_destroy(&image);
2018-04-18 14:27:14 +08:00
}
static ret_t add_image_res(const char* filename, const char* name) {
bitmap_t image;
static uint8_t buff[8092];
2018-08-04 11:58:43 +08:00
memset(&image, 0x00, sizeof(image));
2018-04-18 14:27:14 +08:00
ret_t ret = load_image(filename, &image);
2018-08-24 07:45:37 +08:00
asset_info_t* r = (asset_info_t*)buff;
2018-04-18 14:27:14 +08:00
return_value_if_fail(ret == RET_OK, RET_FAIL);
strcpy(r->name, name);
r->is_in_rom = TRUE;
2018-08-24 07:45:37 +08:00
r->type = ASSET_TYPE_IMAGE;
r->subtype = ASSET_TYPE_IMAGE_RAW;
2019-08-12 10:47:09 +08:00
r->size = image_gen_buff(&image, r->data, sizeof(buff) - sizeof(asset_info_t), FALSE);
2018-08-04 11:58:43 +08:00
bitmap_destroy(&image);
2018-04-18 14:27:14 +08:00
2018-08-24 07:45:37 +08:00
return assets_manager_add(assets_manager(), buff);
2018-04-18 14:27:14 +08:00
}
TEST(ImageLoaderStb, gen) {
bitmap_t image;
ASSERT_EQ(add_image_res(PNG_OPAQUE_NAME, "test.png"), RET_OK);
2018-12-29 12:17:06 +08:00
ASSERT_EQ(image_manager_get_bitmap(image_manager(), "test.png", &image), RET_OK);
2018-04-18 14:27:14 +08:00
ASSERT_EQ(32, image.w);
ASSERT_EQ(32, image.h);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_IMMUTABLE), true);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_OPAQUE), true);
2018-08-04 11:58:43 +08:00
image_manager_unload_unused(image_manager(), 0);
2018-04-18 14:27:14 +08:00
}
2018-10-17 09:57:47 +08:00
static ret_t load_image_ex(const char* filename, bitmap_t* image, bool_t require_bgra,
bool_t enable_bgr565) {
uint32_t size = 0;
ret_t ret = RET_OK;
printf("%s\n", filename);
uint8_t* buff = (uint8_t*)read_file(filename, &size);
2020-04-21 15:45:18 +08:00
ret = stb_load_image(0, buff, size, image, require_bgra, enable_bgr565, FALSE);
2018-10-17 09:57:47 +08:00
TKMEM_FREE(buff);
return ret;
}
TEST(ImageLoaderStb, bgr565_apaque) {
bitmap_t image;
ASSERT_EQ(load_image_ex(PNG_OPAQUE_NAME, &image, TRUE, TRUE), RET_OK);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_OPAQUE), TRUE);
ASSERT_EQ(image.format, BITMAP_FMT_BGR565);
bitmap_destroy(&image);
ASSERT_EQ(load_image_ex(PNG_OPAQUE_NAME, &image, TRUE, FALSE), RET_OK);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_OPAQUE), TRUE);
ASSERT_EQ(image.format, BITMAP_FMT_BGRA8888);
bitmap_destroy(&image);
}
TEST(ImageLoaderStb, bgr565_trans) {
bitmap_t image;
ASSERT_EQ(load_image_ex(PNG_NAME, &image, TRUE, TRUE), RET_OK);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_OPAQUE), FALSE);
ASSERT_EQ(image.format, BITMAP_FMT_BGRA8888);
bitmap_destroy(&image);
ASSERT_EQ(load_image_ex(PNG_NAME, &image, TRUE, FALSE), RET_OK);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_OPAQUE), FALSE);
ASSERT_EQ(image.format, BITMAP_FMT_BGRA8888);
bitmap_destroy(&image);
}
TEST(ImageLoaderStb, rgba) {
bitmap_t image;
ASSERT_EQ(load_image_ex(PNG_NAME, &image, FALSE, FALSE), RET_OK);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_OPAQUE), FALSE);
ASSERT_EQ(image.format, BITMAP_FMT_RGBA8888);
bitmap_destroy(&image);
ASSERT_EQ(load_image_ex(PNG_NAME, &image, TRUE, FALSE), RET_OK);
ASSERT_EQ(!!(image.flags & BITMAP_FLAG_OPAQUE), FALSE);
ASSERT_EQ(image.format, BITMAP_FMT_BGRA8888);
bitmap_destroy(&image);
}