提交 0ce73d5b 编写于 作者: B bernard.xiong@gmail.com

update image container.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1255 bbd45198-f89e-11dd-88c7-29a3b14d5316
上级 bb1518ef
......@@ -14,12 +14,16 @@
#include <rtthread.h>
#include <rtgui/image.h>
#include <rtgui/image_xpm.h>
#include <rtgui/image_hdc.h>
#include <rtgui/rtgui_system.h>
#include <rtgui/image_container.h>
#include <string.h>
#ifdef RTGUI_IMAGE_XPM
#include <rtgui/image_xpm.h>
#endif
#ifdef RTGUI_IMAGE_BMP
#include <rtgui/image_bmp.h>
#endif
......@@ -32,13 +36,16 @@
static rtgui_list_t _rtgui_system_image_list = {RT_NULL};
/* init rtgui image system */
/* initialize rtgui image system */
void rtgui_system_image_init(void)
{
/* always support XPM image */
rtgui_image_xpm_init();
/* always support HDC image */
rtgui_image_hdc_init();
#ifdef RTGUI_IMAGE_XPM
rtgui_image_xpm_init();
#endif
#ifdef RTGUI_IMAGE_BMP
rtgui_image_bmp_init();
#endif
......@@ -50,6 +57,11 @@ void rtgui_system_image_init(void)
#ifdef RTGUI_IMAGE_PNG
rtgui_image_png_init();
#endif
#ifdef RTGUI_IMAGE_CONTAINER
/* initialize image container */
rtgui_system_image_container_init(RT_FALSE);
#endif
}
static struct rtgui_image_engine* rtgui_image_get_engine_by_filename(const char* fn)
......
#include <rtgui/image_container.h>
#ifdef RTGUI_IMAGE_CONTAINER
typedef unsigned int (*rtgui_hash_func_t) (const void* key);
typedef struct _rtgui_hash_table rtgui_hash_table_t;
typedef rt_bool_t (*rtgui_equal_func_t) (const void* a, const void* b);
......@@ -352,92 +353,93 @@ rt_bool_t string_equal_func(const void* a, const void* b)
return RT_FALSE;
}
/* hash node for imnage */
struct image_hash_node
{
rt_image_t *image;
char *filename;
};
static rtgui_hash_table_t* image_hash_table;
rt_bool_t load_image = RT_FALSE;
void image_container_system_init(rt_bool_t is_load)
static rt_bool_t load_image = RT_FALSE;
void rtgui_system_image_container_init(rt_bool_t load)
{
/* create image hash table */
image_hash_table = hash_table_create(string_hash_func, string_equal_func);
RT_ASSERT(image_hash_table != RT_NULL);
load_image = is_load;
/* set load type */
load_image = load;
}
rtgui_image_t* rtgui_image_container_get(const char* filename)
rtgui_image_item_t* rtgui_image_container_get(const char* filename)
{
struct image_hash_node* node;
struct rtgui_image_item* item;
node = hash_table_find(image_hash_table, filename);
if (node == RT_NULL)
item = hash_table_find(image_hash_table, filename);
if (item == RT_NULL)
{
rtgui_image_t *image;
node = (struct image_hash_node*) rt_malloc (sizeof(struct image_hash_node));
if (node == RT_NULL) return RT_NULL;
item = (struct rtgui_image_item*) rt_malloc (sizeof(struct rtgui_image_item));
if (item == RT_NULL) return RT_NULL;
/* create a image object */
image = rtgui_image_create(filename, load_image);
if (image == RT_NULL)
item->image = rtgui_image_create(filename, load_image);
if (item->image == RT_NULL)
{
rt_free(node);
rt_free(item);
return RT_NULL; /* create image failed */
}
node->image = image;
node->filename = rt_strdup(filename);
hash_table_add(image_hash_table, node->filename, node);
item->refcount = 1;
item->filename = rt_strdup(filename);
hash_table_insert(image_hash_table, item->filename, item);
}
else
{
node->image->ref ++; /* increase refcount */
item->refcount ++; /* increase refcount */
}
return node->image;
return item;
}
rtgui_image_t* rtgui_image_container_get_memref(const rt_uint8_t* memory, const char* type)
rtgui_image_item_t* rtgui_image_container_get_memref(const char* type, const rt_uint8_t* memory, rt_uint32_t length)
{
struct image_hash_node* node;
char filename[32];
struct rtgui_image_item* item;
/* create filename for image identification */
rt_snprintf(filename, sizeof(filename), "0x%08x_%s", memory, type);
/* search in container */
node = hash_table_find(image_hash_table, filename);
if (node == RT_NULL)
item = hash_table_find(image_hash_table, filename);
if (item == RT_NULL)
{
node = (struct image_hash_node*) rt_malloc (sizeof(struct image_hash_node));
if (node == RT_NULL) return RT_NULL;
item = (struct rtgui_image_item*) rt_malloc (sizeof(struct rtgui_image_item));
if (item == RT_NULL) return RT_NULL;
/* create image object */
image = rtgui_image_create_from_mem(memory, type, load_image);
if (image == RT_NULL)
item->image = rtgui_image_create_from_mem(type, memory, length, load_image);
if (item->image == RT_NULL)
{
rt_free(node);
rt_free(item);
return RT_NULL; /* create image failed */
}
node->image = image;
node->filename = rt_strdup(image_id);
hash_table_add(image_hash_table, node->filename, node);
item->refcount = 1;
item->filename = rt_strdup(filename);
hash_table_insert(image_hash_table, item->filename, item);
}
else node->image->ref ++;
else item->refcount ++;
return node->image;
return item;
}
void rtgui_image_container_put(rtgui_image_t* image)
void rtgui_image_container_put(rtgui_image_item_t* item)
{
image->ref --;
if (image->ref == 0)
item->refcount --;
if (item->refcount == 0)
{
/* remove item from container */
hash_table_remove(image_hash_table, item->filename);
/* destroy image and image item */
rt_free(item->filename);
rtgui_image_destroy(item->image);
rt_free(item);
}
}
#endif
......@@ -73,5 +73,4 @@ void rtgui_image_register_engine(struct rtgui_image_engine* engine);
void rtgui_image_blit(struct rtgui_image* image, struct rtgui_dc* dc, struct rtgui_rect* rect);
struct rtgui_image_palette* rtgui_image_palette_create(rt_uint32_t ncolors);
#endif
......@@ -4,9 +4,23 @@
#include <rtgui/rtgui.h>
#include <rtgui/image.h>
void image_container_system_init(void);
#ifdef RTGUI_IMAGE_CONTAINER
/* image item in image container */
struct rtgui_image_item
{
rtgui_image_t *image;
char *filename;
rtgui_image_t* image_container_get(const char* filename);
void image_container_put(rtgui_image_t* image);
rt_uint32_t refcount;
};
typedef struct rtgui_image_item rtgui_image_item_t;
void rtgui_system_image_container_init(rt_bool_t load);
rtgui_image_item_t* rtgui_image_container_get(const char* filename);
rtgui_image_item_t* rtgui_image_container_get_from_mem(const rt_uint8_t* mem, const char* type, rt_uint32_t len);
void rtgui_image_container_put(rtgui_image_item_t* item);
#endif
#endif
......@@ -35,6 +35,8 @@
#define RTGUI_DEFAULT_FONT_SIZE 12
#define RTGUI_USING_STDIO_FILERW
#define RTGUI_IMAGE_CONTAINER
#define RTGUI_IMAGE_XPM
#define RTGUI_IMAGE_BMP
// #define RTGUI_IMAGE_PNG
// #define RTGUI_IMAGE_JPEG
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册