Browse Source

update image container.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1255 bbd45198-f89e-11dd-88c7-29a3b14d5316
bernard.xiong@gmail.com 14 years ago
parent
commit
0ce73d5b17

+ 36 - 36
components/rtgui/common/font_hz_bmp.c

@@ -71,43 +71,43 @@ static void _rtgui_hz_bitmap_font_draw_text(struct rtgui_font_bitmap* bmp_font,
 	}
 }
 
-static void rtgui_hz_bitmap_font_draw_text (struct rtgui_font* font, struct rtgui_dc* dc, const char* text, rt_ubase_t length, struct rtgui_rect* rect)
-{
-	rt_uint32_t len;
-	struct rtgui_font *efont;
+static void rtgui_hz_bitmap_font_draw_text (struct rtgui_font* font, struct rtgui_dc* dc, const char* text, rt_ubase_t length, struct rtgui_rect* rect)
+{
+	rt_uint32_t len;
+	struct rtgui_font *efont;
 	struct rtgui_font_bitmap* bmp_font = (struct rtgui_font_bitmap*)(font->data);
-
-	RT_ASSERT(dc != RT_NULL);
-
-	/* get English font */
-	efont = rtgui_font_refer("asc", bmp_font->height);
-	if (efont == RT_NULL) efont = rtgui_font_default(); /* use system default font */
-
-	while (length > 0)
-	{
-		len = 0;
-		while (((rt_uint8_t)*(text + len)) < 0x80 && *(text + len)) len ++;
-		/* draw text with English font */
-		if (len > 0)
-		{
-			rtgui_font_draw(efont, dc, text, len, rect);
-
-			text += len;
-			length -= len;
-		}
-
-		len = 0;
-		while (((rt_uint8_t)*(text + len)) >= 0x80) len ++;
-		if (len > 0)
-		{
-			_rtgui_hz_bitmap_font_draw_text(bmp_font, dc, text, len, rect);
-
-			text += len;
-			length -= len;
-		}
-	}
-
-	rtgui_font_derefer(efont);
+
+	RT_ASSERT(dc != RT_NULL);
+
+	/* get English font */
+	efont = rtgui_font_refer("asc", bmp_font->height);
+	if (efont == RT_NULL) efont = rtgui_font_default(); /* use system default font */
+
+	while (length > 0)
+	{
+		len = 0;
+		while (((rt_uint8_t)*(text + len)) < 0x80 && *(text + len)) len ++;
+		/* draw text with English font */
+		if (len > 0)
+		{
+			rtgui_font_draw(efont, dc, text, len, rect);
+
+			text += len;
+			length -= len;
+		}
+
+		len = 0;
+		while (((rt_uint8_t)*(text + len)) >= 0x80) len ++;
+		if (len > 0)
+		{
+			_rtgui_hz_bitmap_font_draw_text(bmp_font, dc, text, len, rect);
+
+			text += len;
+			length -= len;
+		}
+	}
+
+	rtgui_font_derefer(efont);
 }
 
 static void rtgui_hz_bitmap_font_get_metrics(struct rtgui_font* font, const char* text, rtgui_rect_t* rect)

+ 36 - 36
components/rtgui/common/font_hz_file.c

@@ -161,44 +161,44 @@ static void _rtgui_hz_file_font_draw_text(struct rtgui_hz_file_font* hz_file_fon
 	}
 }
 
-static void rtgui_hz_file_font_draw_text(struct rtgui_font* font, struct rtgui_dc* dc, const char* text, rt_ubase_t length, struct rtgui_rect* rect)
-{
-	rt_uint32_t len;
-	struct rtgui_font *efont;
+static void rtgui_hz_file_font_draw_text(struct rtgui_font* font, struct rtgui_dc* dc, const char* text, rt_ubase_t length, struct rtgui_rect* rect)
+{
+	rt_uint32_t len;
+	struct rtgui_font *efont;
 	struct rtgui_hz_file_font* hz_file_font = (struct rtgui_hz_file_font*)font->data;
-
-	RT_ASSERT(dc != RT_NULL);
+
+	RT_ASSERT(dc != RT_NULL);
 	RT_ASSERT(hz_file_font != RT_NULL);
-
-	/* get English font */
-	efont = rtgui_font_refer("asc", hz_file_font->font_size);
-	if (efont == RT_NULL) efont = rtgui_font_default(); /* use system default font */
-
-	while (length > 0)
-	{
-		len = 0;
-		while (((rt_uint8_t)*(text + len)) < 0x80 && *(text + len)) len ++;
-		/* draw text with English font */
-		if (len > 0)
-		{
-			rtgui_font_draw(efont, dc, text, len, rect);
-
-			text += len;
-			length -= len;
-		}
-
-		len = 0;
-		while (((rt_uint8_t)*(text + len)) >= 0x80) len ++;
-		if (len > 0)
-		{
-			_rtgui_hz_file_font_draw_text(hz_file_font, dc, text, len, rect);
-
-			text += len;
-			length -= len;
-		}
-	}
-
-	rtgui_font_derefer(efont);
+
+	/* get English font */
+	efont = rtgui_font_refer("asc", hz_file_font->font_size);
+	if (efont == RT_NULL) efont = rtgui_font_default(); /* use system default font */
+
+	while (length > 0)
+	{
+		len = 0;
+		while (((rt_uint8_t)*(text + len)) < 0x80 && *(text + len)) len ++;
+		/* draw text with English font */
+		if (len > 0)
+		{
+			rtgui_font_draw(efont, dc, text, len, rect);
+
+			text += len;
+			length -= len;
+		}
+
+		len = 0;
+		while (((rt_uint8_t)*(text + len)) >= 0x80) len ++;
+		if (len > 0)
+		{
+			_rtgui_hz_file_font_draw_text(hz_file_font, dc, text, len, rect);
+
+			text += len;
+			length -= len;
+		}
+	}
+
+	rtgui_font_derefer(efont);
 }
 
 static void rtgui_hz_file_font_get_metrics(struct rtgui_font* font, const char* text, rtgui_rect_t* rect)

+ 16 - 4
components/rtgui/common/image.c

@@ -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,12 +36,15 @@
 
 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();
@@ -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)

+ 45 - 43
components/rtgui/common/image_container.c

@@ -1,5 +1,6 @@
 #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

+ 76 - 77
components/rtgui/include/rtgui/image.h

@@ -1,77 +1,76 @@
-/*
- * File      : image.h
- * This file is part of RT-Thread RTOS
- * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
- *
- * The license and distribution terms for this file may be
- * found in the file LICENSE in this distribution or at
- * http://www.rt-thread.org/license/LICENSE
- *
- * Change Logs:
- * Date           Author       Notes
- * 2009-10-16     Bernard      first version
- */
-#ifndef __RTGUI_IMAGE_H__
-#define __RTGUI_IMAGE_H__
-
-#include <rtgui/dc.h>
-#include <rtgui/filerw.h>
-#include <rtgui/region.h>
-
-struct rtgui_image;
-struct rtgui_image_engine
-{
-	const char* name;
-	struct rtgui_list_node list;
-
-	/* image engine function */
-	rt_bool_t (*image_check)(struct rtgui_filerw* file);
-
-	rt_bool_t (*image_load)(struct rtgui_image* image, struct rtgui_filerw* file, rt_bool_t load);
-	void (*image_unload)(struct rtgui_image* image);
-
-	void (*image_blit)(struct rtgui_image* image, struct rtgui_dc* dc, struct rtgui_rect* rect);
-};
-
-struct rtgui_image_palette
-{
-	rtgui_color_t* colors;
-	rt_uint32_t ncolors;
-};
-typedef struct rtgui_image_palette rtgui_image_palette_t;
-
-struct rtgui_image
-{
-	/* image metrics */
-	rt_uint16_t w, h;
-
-	/* image engine */
-	const struct rtgui_image_engine* engine;
-
-	/* image palette */
-	rtgui_image_palette_t* palette;
-
-	/* image private data */
-	void* data;
-};
-typedef struct rtgui_image rtgui_image_t;
-
-/* init rtgui image system */
-void rtgui_system_image_init(void);
-
-#if defined(RTGUI_USING_DFS_FILERW) || defined(RTGUI_USING_STDIO_FILERW)
-struct rtgui_image* rtgui_image_create_from_file(const char* type, const char* filename, rt_bool_t load);
-struct rtgui_image* rtgui_image_create(const char* filename, rt_bool_t load);
-#endif
-struct rtgui_image* rtgui_image_create_from_mem(const char* type, const rt_uint8_t* data, rt_size_t length, rt_bool_t load);
-void rtgui_image_destroy(struct rtgui_image* image);
-
-/* register an image engine */
-void rtgui_image_register_engine(struct rtgui_image_engine* engine);
-
-/* blit an image on DC */
-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
+/*
+ * File      : image.h
+ * This file is part of RT-Thread RTOS
+ * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rt-thread.org/license/LICENSE
+ *
+ * Change Logs:
+ * Date           Author       Notes
+ * 2009-10-16     Bernard      first version
+ */
+#ifndef __RTGUI_IMAGE_H__
+#define __RTGUI_IMAGE_H__
+
+#include <rtgui/dc.h>
+#include <rtgui/filerw.h>
+#include <rtgui/region.h>
+
+struct rtgui_image;
+struct rtgui_image_engine
+{
+	const char* name;
+	struct rtgui_list_node list;
+
+	/* image engine function */
+	rt_bool_t (*image_check)(struct rtgui_filerw* file);
+
+	rt_bool_t (*image_load)(struct rtgui_image* image, struct rtgui_filerw* file, rt_bool_t load);
+	void (*image_unload)(struct rtgui_image* image);
+
+	void (*image_blit)(struct rtgui_image* image, struct rtgui_dc* dc, struct rtgui_rect* rect);
+};
+
+struct rtgui_image_palette
+{
+	rtgui_color_t* colors;
+	rt_uint32_t ncolors;
+};
+typedef struct rtgui_image_palette rtgui_image_palette_t;
+
+struct rtgui_image
+{
+	/* image metrics */
+	rt_uint16_t w, h;
+
+	/* image engine */
+	const struct rtgui_image_engine* engine;
+
+	/* image palette */
+	rtgui_image_palette_t* palette;
+
+	/* image private data */
+	void* data;
+};
+typedef struct rtgui_image rtgui_image_t;
+
+/* init rtgui image system */
+void rtgui_system_image_init(void);
+
+#if defined(RTGUI_USING_DFS_FILERW) || defined(RTGUI_USING_STDIO_FILERW)
+struct rtgui_image* rtgui_image_create_from_file(const char* type, const char* filename, rt_bool_t load);
+struct rtgui_image* rtgui_image_create(const char* filename, rt_bool_t load);
+#endif
+struct rtgui_image* rtgui_image_create_from_mem(const char* type, const rt_uint8_t* data, rt_size_t length, rt_bool_t load);
+void rtgui_image_destroy(struct rtgui_image* image);
+
+/* register an image engine */
+void rtgui_image_register_engine(struct rtgui_image_engine* engine);
+
+/* blit an image on DC */
+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

+ 17 - 3
components/rtgui/include/rtgui/image_container.h

@@ -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

+ 2 - 0
components/rtgui/include/rtgui/rtgui_config.h

@@ -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