示例#1
0
static void ftk_check_button_destroy(FtkWidget* thiz)
{
	if(thiz != NULL)
	{
		DECL_PRIV0(thiz, priv);
		ftk_bitmap_unref(priv->onimg);  
		ftk_bitmap_unref(priv->offimg); 
		FTK_ZFREE(priv, sizeof(PrivInfo));
	}

	return;
}
示例#2
0
Ret ftk_check_button_set_image(FtkWidget* thiz, FtkBitmap* onimg, FtkBitmap* offimg)
{
	DECL_PRIV0(thiz, priv);
	return_val_if_fail(thiz != NULL, RET_FAIL);

	ftk_bitmap_unref(priv->onimg);
	ftk_bitmap_unref(priv->offimg);

	priv->onimg = onimg;
	ftk_bitmap_ref(priv->onimg);
	priv->offimg = offimg;
	ftk_bitmap_ref(priv->offimg);

	return RET_OK;
}
示例#3
0
int main(int argc, char* argv[])
{
	ftk_backend_init(argc, argv);
	ftk_set_allocator(ftk_allocator_default_create());
	FtkDisplay* thiz = ftk_default_display();

	if(thiz != NULL)
	{
		FtkBitmap* bitmap = NULL;
		FtkColor color = {.a=0xff};
		FtkRect rect = {0};
		rect.width = ftk_display_width(thiz);
		rect.height = ftk_display_height(thiz);

		bitmap = ftk_bitmap_create(rect.width, rect.height, color);
		red_bitmap(bitmap);
		ftk_display_update(thiz, bitmap, &rect, 0, 0);
		sleep(3);
		green_bitmap(bitmap);
		ftk_display_update(thiz, bitmap, &rect, 0, 0);
		sleep(3);
		blue_bitmap(bitmap);
		ftk_display_update(thiz, bitmap, &rect, 0, 0);
		sleep(3);
		mire_bitmap(bitmap);
		ftk_display_update(thiz, bitmap, &rect, 0, 0);
		sleep(3);

		ftk_display_destroy(thiz);
		ftk_bitmap_unref(bitmap);
	}

	return 0;
}
示例#4
0
static void ftk_app_music_destroy(FtkApp* thiz)
{
	if(thiz != NULL)
	{
		DECL_PRIV(thiz, priv);
		ftk_bitmap_unref(priv->icon);
		FTK_FREE(thiz);
	}

	return;
}
示例#5
0
static void ftk_scroll_bar_destroy(FtkWidget* thiz)
{
	if(thiz != NULL)
	{
		DECL_PRIV0(thiz, priv);
		ftk_bitmap_unref(priv->bitmap);
		FTK_ZFREE(priv, sizeof(PrivInfo));
	}

	return;
}
示例#6
0
Ret ftk_scroll_bar_set_bitmap(FtkWidget* thiz, FtkBitmap* bitmap)
{
	DECL_PRIV0(thiz, priv);
	return_val_if_fail(priv != NULL, RET_FAIL);

	ftk_bitmap_unref(priv->bitmap);
	priv->bitmap = bitmap;
	ftk_bitmap_ref(priv->bitmap);

	return RET_OK;
}
示例#7
0
static void _app_music_create_button(FtkWidget *win, int x, int id, const char *icons)
{
	FtkGc gc = {0};
	char temp[100];
	char path[FTK_MAX_PATH+1] = {0};

	FtkWidget* button = NULL;
	FtkBitmap* bitmap_normal = NULL;
	FtkBitmap* bitmap_active = NULL;
	FtkBitmap* bitmap_focus = NULL;

	gc.mask = FTK_GC_BITMAP;

	sprintf(temp, "icons/%s_normal.png", icons);
	bitmap_normal =  ftk_bitmap_factory_load(ftk_default_bitmap_factory(),
			ftk_translate_path(temp, path));

	sprintf(temp, "icons/%s_pressed.png", icons);
	bitmap_active =  ftk_bitmap_factory_load(ftk_default_bitmap_factory(),
			ftk_translate_path(temp, path));

	sprintf(temp, "icons/%s_selected.png", icons);
	bitmap_focus =  ftk_bitmap_factory_load(ftk_default_bitmap_factory(),
			ftk_translate_path(temp, path));

	button = ftk_button_create(win, x, 170, 68, 68);
	ftk_widget_set_id(button, id);
	ftk_button_set_clicked_listener(button, ftk_music_on_button_clicked, win);

	gc.bitmap = bitmap_normal;
	ftk_widget_set_gc(button, FTK_WIDGET_NORMAL, &gc);
	gc.bitmap = bitmap_focus;
	ftk_widget_set_gc(button, FTK_WIDGET_FOCUSED, &gc);
	gc.bitmap = bitmap_active;
	ftk_widget_set_gc(button, FTK_WIDGET_ACTIVE, &gc);

	ftk_bitmap_unref(bitmap_normal);
	ftk_bitmap_unref(bitmap_active);
	ftk_bitmap_unref(bitmap_focus);

}
示例#8
0
static Ret ftk_check_button_on_paint(FtkWidget* thiz)
{
	int dx = 0;
	int dy = 0;
	int icon_w = 0;
	int icon_h = 0;

	FtkBitmap* bitmap = NULL;
	DECL_PRIV0(thiz, priv);
	const char** bg_imgs = NULL;
	FTK_BEGIN_PAINT(x, y, width, height, canvas);

	if (priv->onimg && priv->offimg) { 
		if (priv->checked)
			bitmap = priv->onimg;
		else
			bitmap = priv->offimg;
	}
	else { // orignal code
		if(priv->is_radio)
		{
			bg_imgs = priv->checked ? radio_bg_on_imgs : radio_bg_off_imgs;
		}
		else
		{
			bg_imgs = priv->checked ? check_bg_on_imgs : check_bg_off_imgs;
		}

		bitmap = ftk_theme_load_image(ftk_default_theme(), bg_imgs[ftk_widget_state(thiz)]);
	} 
	return_val_if_fail(bitmap != NULL, RET_FAIL);

	icon_w = ftk_bitmap_width(bitmap);
	icon_h = ftk_bitmap_height(bitmap);
	assert((icon_w) <= width && icon_h <= height);

	dy = (height - icon_h) / 2;
	dx = priv->icon_at_right ? width - icon_w : 0;
	ftk_canvas_draw_bitmap_simple(canvas, bitmap, 0, 0, icon_w, icon_h, x + dx, y + dy);
	if (NULL == priv->onimg) 
	ftk_bitmap_unref(bitmap);

	if(ftk_widget_get_text(thiz) != NULL)
	{
		dy = height/2;
		dx = priv->icon_at_right ? 2 : icon_w;
		
		ftk_canvas_set_gc(canvas, ftk_widget_get_gc(thiz)); 
		ftk_canvas_draw_string(canvas, x + dx, y + dy, ftk_widget_get_text(thiz), -1, 1);
	}

	FTK_END_PAINT();
}
示例#9
0
static int lua_ftk_bitmap_unref(lua_State* L)
{
	tolua_Error err = {0};
	FtkBitmap* thiz;
	int param_ok = tolua_isusertype(L, 1, "FtkBitmap", 0, &err);

	return_val_if_fail(param_ok, 0);

	thiz = tolua_tousertype(L, 1, 0);
	ftk_bitmap_unref(thiz);

	return 1;
}
示例#10
0
int main(int argc, char* argv[])
{
	FtkBitmap* bitmap = NULL;
	const char* filename = argv[1];
	FtkImageDecoder* thiz = ftk_image_jpeg_decoder_create();
	
	assert(ftk_image_decoder_match(thiz, filename) == RET_OK);
	assert((bitmap = ftk_image_decoder_decode(thiz, filename)) != NULL);
	ftk_logd("w=%d h=%d\n", ftk_bitmap_width(bitmap), ftk_bitmap_height(bitmap));
	ftk_bitmap_unref(bitmap);
	ftk_image_decoder_destroy(thiz);

	return 0;
}
示例#11
0
Ret ftk_image_set_image(FtkWidget* thiz, FtkBitmap* image)
{
	FtkGc gc = {0};
	return_val_if_fail(thiz != NULL && image != NULL, RET_FAIL);

	gc.mask = FTK_GC_BITMAP;
	gc.bitmap = image;
	ftk_widget_set_gc(thiz, FTK_WIDGET_INSENSITIVE, &gc);
	ftk_bitmap_unref(image);

	ftk_widget_invalidate(thiz);

	return RET_OK;
}
示例#12
0
static Ret designer_on_popup_menu(void* ctx, void* obj)
{
	size_t i = 0;
	int nr = 0;
	int height = 0;
	FtkBitmap* icon = NULL; 
	FtkWidget* popup = NULL;
	FtkListItemInfo infos;
	FtkWidget* win = (FtkWidget*)ctx;

	memset(&infos, 0x00, sizeof(infos));
	icon = ftk_theme_load_image(ftk_default_theme(), "info"FTK_STOCK_IMG_SUFFIX); 

	for(i = 0; i < FTK_ARRAY_SIZE(s_popup_menu_items); i++)
	{
		if(s_popup_menu_items[i].need_selected_widget && !designer_has_selected_widget(win))
		{
			continue;
		}
		nr++;
	}

	height = (nr + 1) * FTK_POPUP_MENU_ITEM_HEIGHT;
	height = height < ftk_widget_height(win) ? height : ftk_widget_height(win);

	popup = ftk_popup_menu_create(0, 0, 0, height, icon, _("Edit"));	

	infos.state = 0;
	infos.type = FTK_LIST_ITEM_NORMAL;
	for(i = 0; i < FTK_ARRAY_SIZE(s_popup_menu_items); i++)
	{
		if(s_popup_menu_items[i].need_selected_widget && !designer_has_selected_widget(win))
		{
			continue;
		}

		infos.value = i;
		infos.text = s_popup_menu_items[i].name;
		infos.extra_user_data = s_popup_menu_items[i].on_clicked;
		
		ftk_popup_menu_add(popup, &infos);
	}
	ftk_bitmap_unref(icon);
	
	ftk_popup_menu_set_clicked_listener(popup, designer_on_popup_menu_item_clicked, ctx);
	ftk_widget_show_all(popup, 1);

	return RET_OK;
}
示例#13
0
static void ftk_display_android_destroy(FtkDisplay* thiz)
{
	if(thiz != NULL)
	{
		DECL_PRIV(thiz, priv);

		ftk_wnd_manager_remove_global_listener(ftk_default_wnd_manager(),
			(FtkListener)ftk_display_android_handle_event, thiz);

		ftk_bitmap_unref(priv->bitmap);
		FTK_ZFREE(thiz, sizeof(FtkDisplay) + sizeof(PrivInfo));
	}

	return;
}
示例#14
0
static void ftk_app_bluetooth_destroy(FtkApp* thiz)
{
	if(thiz != NULL)
	{
		DECL_PRIV(thiz, priv);
		ftk_bitmap_unref(priv->icon);
		FTK_FREE(thiz);

		if (_bt) {
			bt_close(_bt);
			_bt = NULL;
		}
	}

	return;
}
示例#15
0
FTK_HIDE int FTK_MAIN(int argc, char* argv[])
{
	int width = 0;
	int height = 0;
	FtkWidget* win = NULL;
	FtkWidget* button = NULL;
	FtkWidget* icon_view = NULL;
	FtkIconViewItem item;
	FTK_INIT(argc, argv);
	
	win = ftk_app_window_create();
	ftk_window_set_animation_hint(win, "app_main_window");
	width = ftk_widget_width(win);
	height = ftk_widget_height(win);

	button = ftk_button_create(win, 10, 0, width/3-10, 60);
	ftk_widget_set_text(button, "more");
	ftk_button_set_clicked_listener(button, button_more_clicked, win);
	ftk_window_set_focus(win, button);
	
	button = ftk_button_create(win, 2*width/3, 0, width/3-10, 60);
	ftk_widget_set_text(button, "quit");
	ftk_button_set_clicked_listener(button, button_quit_clicked, win);
	ftk_window_set_focus(win, button);

	item.icon = ftk_theme_load_image(ftk_default_theme(), "flag-32.png");
	icon_view = ftk_icon_view_create(win, 5, 70, width-10, height-80);
	ftk_widget_set_id(icon_view, 100);
	ftk_icon_view_set_clicked_listener(icon_view, item_clicked, win);
	for(; i < 4; i++)
	{
		char text[100] = {0};
		ftk_snprintf(text, sizeof(text), "%d", i);
		item.text = text;
		item.user_data = (void*)i;
		ftk_icon_view_add(icon_view, &item);
	}
	
	ftk_bitmap_unref(item.icon);
	ftk_widget_set_text(win, "icon view demo");
	ftk_widget_show_all(win, 1);
	FTK_QUIT_WHEN_WIDGET_CLOSE(win);

	FTK_RUN();

	return 0;
}
示例#16
0
static void ftk_wait_box_destroy(FtkWidget* thiz)
{
	if(thiz != NULL)
	{
		DECL_PRIV0(thiz, priv);

		if(priv->waiting)
		{
			ftk_wait_box_stop_waiting(thiz);
		}
		ftk_source_unref(priv->timer);
		ftk_bitmap_unref(priv->bitmap);
		FTK_ZFREE(priv, sizeof(PrivInfo));
	}

	return;
}
示例#17
0
文件: demo4.c 项目: xianjimli/misc
int main(int argc, char* argv[])
{
	int i = 0;
	int j = 0;
	int width = 0;
	int height = 0;
	FtkGc gc = {0};
	FtkWidget* win = NULL;
	FtkWidget* button = NULL;
	ftk_init(argc, argv);

	width = ftk_display_width(ftk_default_display());
	height = ftk_display_height(ftk_default_display());
	gc.mask = FTK_GC_BITMAP;
	win = ftk_window_create(0, 0, width, height);

	for(i = 0; i < height/80; i++)
	{
		for(j = 0; j < width/80; j++)
		{
			gc.bitmap = ftk_bitmap_factory_load(ftk_default_bitmap_factory(), pngs[i + 1]);
			button = ftk_button_create(1000, j * 80, i * 80, ftk_bitmap_width(gc.bitmap), ftk_bitmap_height(gc.bitmap));
			ftk_widget_set_gc(button, FTK_WIDGET_NORMAL, &gc);
			ftk_widget_set_gc(button, FTK_WIDGET_FOCUSED, &gc);
			ftk_widget_append_child(win, button);
			ftk_widget_show(button, 1);
			ftk_bitmap_unref(gc.bitmap);

			if(i == 0 && j == 0)
			{
				ftk_button_set_clicked_listener(button, button_clicked, NULL);
				ftk_button_set_text(button, "Quit");
			}
		}
	}

	ftk_window_set_title(win, "button demo");
	ftk_widget_show(win, 1);

	ftk_run();

	return 0;
}
示例#18
0
文件: bmp_test.c 项目: htbegin/pyftk
int main(int argc, char* argv[])
{
	FtkBitmap* bitmap = NULL;
	FtkImageDecoder* decoder = NULL;
	
	ftk_init(argc, argv);

	decoder = ftk_image_bmp_decoder_create();
	bitmap = ftk_image_decoder_decode(decoder, argv[1]);
	
	if(bitmap != NULL)
	{
		printf("%s: width=%d height=%d\n", argv[1], 
			ftk_bitmap_width(bitmap), ftk_bitmap_height(bitmap));
		ftk_bitmap_unref(bitmap);
	}
	ftk_image_decoder_destroy(decoder);

	return 0;
}
示例#19
0
static Ret button_more_clicked(void* ctx, void* obj)
{
	int j = 0;
	FtkIconViewItem item;
	FtkWidget* icon_view = ftk_widget_lookup(ctx, 100);
	item.icon = ftk_theme_load_image(ftk_default_theme(), "flag-32.png");
	
	for(j=0; j < 4; j++)
	{
		char text[100] = {0};
		ftk_snprintf(text, sizeof(text), "%d", i);
		item.text = text;
		ftk_bitmap_ref(item.icon);
		item.user_data = (void*)i;
		ftk_icon_view_add(icon_view, &item);
		i+=1000;
	}
	ftk_bitmap_unref(item.icon);

	return RET_OK;
}
示例#20
0
int main(int argc, char* argv[])
{
	FtkColor c = {0};
	FtkBitmap* bitmap = NULL;
	FtkBitmapFactory* f = NULL;
	ftk_set_allocator(ftk_allocator_default_create());
	
	if(argv[1] != NULL)
	{
		f = ftk_bitmap_factory_create();
		bitmap = ftk_bitmap_factory_load(f, argv[1]);
		c = ftk_bitmap_get_pixel(bitmap, 0, 0);
		ftk_logi("r=%02x g=%02x b=%02x a=%02x\n", c.r, c.g, c.b, c.a);
		ftk_bitmap_unref(bitmap);
		ftk_bitmap_factory_destroy(f);
	}

	ftk_bitmap_auto_test();

	return 0;
}
示例#21
0
static void ftk_key_board_desc_destroy(FtkKeyBoardDesc* desc)
{
	size_t v = 0;
	size_t r = 0;
	size_t c = 0;
	if(desc != NULL)
	{
		ftk_key_board_desc_dump(desc);

		for(v = 0 ; v < desc->view_nr; v++)
		{
			FtkKeyBoardView* view = desc->views+v;
			for(r = 0; r < view->row_nr; r++)
			{
				FtkKeyBoardRow* row = view->rows+r;
				for(c = 0; c < row->cell_nr; c++)
				{
					FtkKeyBoardCell* cell = row->cells+c;
					ftk_bitmap_unref(cell->icon);
					ftk_bitmap_unref(cell->bg_active);
					ftk_bitmap_unref(cell->bg_normal);
				}
				FTK_FREE(row->cells);
			}
			FTK_FREE(view->rows);
			ftk_bitmap_unref(view->bg);
			ftk_bitmap_unref(view->cell_bg_active);
			ftk_bitmap_unref(view->cell_bg_normal);
		}
		FTK_FREE(desc->views);
		ftk_bitmap_unref(desc->candidates_vertical_line);
		FTK_FREE(desc);
	}

	return;
}
示例#22
0
static void ftk_list_render_default_destroy(FtkListRender* thiz)
{
	if(thiz != NULL)
	{
		DECL_PRIV(thiz, priv);
		ftk_bitmap_unref(priv->radio_on);
		ftk_bitmap_unref(priv->radio_off);
		ftk_bitmap_unref(priv->check_on);
		ftk_bitmap_unref(priv->check_off);
		ftk_bitmap_unref(priv->more);
		ftk_bitmap_unref(priv->bg_disable);
		if(priv->marquee_timer != NULL)
		{
			ftk_source_disable(priv->marquee_timer);
			ftk_main_loop_remove_source(ftk_default_main_loop(), priv->marquee_timer);
		}
		FTK_ZFREE(thiz, sizeof(FtkListRender) + sizeof(PrivInfo));
	}

	return;
}
示例#23
0
int ftk_message_box(FtkBitmap* icon, const char* title, const char* text, const char* buttons[FTK_MSGBOX_MAX_BUTTONS])
{
	int i = 0;
	int w = 0;
	int h = 0;
	int id = 0;
	int ret = 0;
	int width = 0;
	int height = 0;
	int xoffset = 0;
	int yoffset = 0;
	int h_margin = 0;
	int has_title = icon != NULL || title != NULL;
	int buttons_nr = ftk_count_strings(buttons);

	FtkWidget* label = NULL;
	FtkWidget* button = NULL;
	FtkWidget* dialog = NULL;
	
	return_val_if_fail(text != NULL, -1);

	ftk_message_box_size(has_title, buttons_nr, text, &width, &height);
	dialog = ftk_dialog_create(0, 0, width, height);
	ftk_window_set_animation_hint(dialog, "msgbox");
	if(has_title) 
	{
		ftk_dialog_set_icon(dialog, icon);
		ftk_widget_set_text(dialog, title);
	}
	else
	{
		ftk_dialog_hide_title(dialog);
		ftk_widget_set_attr(dialog, FTK_ATTR_POPUP);
	}

	width  = ftk_widget_width(dialog);
	height = ftk_widget_height(dialog);

	/*create label.*/
	xoffset = FTK_H_MARGIN;
	yoffset = FTK_V_MARGIN;
	w = width - 2 * (FTK_DIALOG_BORDER + FTK_H_MARGIN);
	h = height - FTK_DIALOG_BORDER - 4 * FTK_V_MARGIN;
	h -= has_title ? ftk_dialog_get_title_height() : 0;
	h -= buttons_nr > 0 ? FTK_BUTTON_DEFAULT_HEIGHT : 0;

	label = ftk_label_create(dialog, xoffset, yoffset, w, h);
	ftk_widget_set_text(label, text);

	/*create buttons*/

	if(buttons_nr > 0)
	{
		xoffset = 0;
		w = FTK_BUTTON_DEFAULT_WIDTH;
		h = FTK_BUTTON_DEFAULT_HEIGHT;
		w = ((buttons_nr + 1) * w) < width ? w : (width / (buttons_nr + 1));
		yoffset = height - h - FTK_V_MARGIN - (has_title ? ftk_dialog_get_title_height() : 0);
		h_margin = (width - buttons_nr * w) / (buttons_nr + 1);

		for(i = 0; i < buttons_nr; i++)
		{
			xoffset += h_margin;
			button = ftk_button_create(dialog, xoffset, yoffset, w, h);
			ftk_widget_set_id(button, i + 1);
			ftk_widget_set_text(button, buttons[i]);
			ftk_button_set_clicked_listener(button, message_box_on_button_clicked, &id);
			xoffset += w;
		}
	}
	else
	{
		/*if no buttons, quit when timeout.*/
		ftk_dialog_quit_after(dialog, 3000);
	}

	ftk_widget_show_all(dialog, 1);
	ret = ftk_dialog_run(dialog);
	ftk_widget_unref(dialog);
	
	if(icon != NULL)
	{
		ftk_bitmap_unref(icon);
	}

	return ret;
}
示例#24
0
static void show_canvas(FtkDisplay* display, FtkCanvas* canvas)
{
	FtkBitmap* bitmap = NULL;
	FtkRect rect = {.x = 0, .y=0, .width=0, .height=0};
	rect.width = ftk_display_width(display);
	rect.height = ftk_display_height(display);

	ftk_canvas_lock_buffer(canvas, &bitmap);
	ftk_display_update(display, bitmap, &rect, 0, 0);
	ftk_canvas_unlock_buffer(canvas);

	return;
}
#if 1
void test_misc(FtkDisplay* display, FtkFont* font)
{
	if(display != NULL)
	{
		int i = 0;
		FtkGc gc = {0};
		int extent = 0;
		FtkColor color = {0x0, 0, 0, 0x0};
		FtkRect rect = {.x = 0, .y=0, .width=0, .height=0};
		rect.width = ftk_display_width(display);
		rect.height = ftk_display_height(display);
		gc.mask = FTK_GC_FG | FTK_GC_FONT;
		gc.fg.a = 0xff;
		gc.fg.r = 0x00;
		gc.fg.g = 0x00;
		gc.fg.b = 0xff;
		gc.font = font;

		FtkCanvas* thiz = ftk_canvas_create(rect.width, rect.height, &color);
		show_canvas(display, thiz);
		for(i = 0; i < ftk_display_height(display); i++)
		{
			if(gc.fg.r < 0xff)
			{
				gc.fg.r++;
			}
			else
			{
				gc.fg.g++;
			}
			ftk_canvas_set_gc(thiz, &gc);
			ftk_canvas_draw_hline(thiz, 0, i, 320);
		}
		FtkBitmap* bitmap = ftk_bitmap_create(100, 100, color);
		ftk_canvas_draw_bitmap_simple(thiz, bitmap, 0, 0, 100, 100, 100, 100);
		ftk_canvas_draw_string(thiz, 0, 240, " Jim is a Programmer.", -1, 0);
		gc.fg.b = 0xff;
		ftk_canvas_set_gc(thiz, &gc);
		ftk_canvas_draw_string(thiz, 0, 220, "李先静是一个程序员", -1, 0);
	
		unsigned int line_mask = 0xaaaaaaaa;
		gc.line_mask = line_mask;
		gc.mask = FTK_GC_LINE_MASK;
		ftk_canvas_set_gc(thiz, &gc);
		show_canvas(display, thiz);

		assert(ftk_canvas_font_height(thiz) == 16);
		extent = ftk_canvas_get_extent(thiz, "李先静", -1);
		printf("extent=%d\n", ftk_canvas_get_extent(thiz, "李先静", -1));


		ftk_bitmap_unref(bitmap);
		ftk_canvas_destroy(thiz);
	}

	sleep(3);

	return;
}
#if 0
void test_draw_point(FtkDisplay* display)
{
	int i = 0;
	FtkGc gc = {.mask = FTK_GC_FG};
	FtkRect rect = {0};
	FtkColor color = {.a = 0xff};
	int width = ftk_display_width(display);
	int height = ftk_display_height(display);
	FtkCanvas* thiz = ftk_canvas_create(width, height, color);

	rect.width = width;
	rect.height = height;

	color.r = 0xff;
	color.a = 0xff;
	gc.fg = color;
	for(i = 0; i < width; i++)
	{
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_point(thiz, i, 10);
	}
	
	color.g = 0xff;
	color.r = 0;
	for(i = 0; i < width; i++)
	{
		color.a = 0xff - (0xff & i);
		gc.fg = color;
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_point(thiz, i, 20);
	}
	
	color.r = 0;
	color.g = 0;
	color.b = 0xff;
	color.a = 0xff;
	gc.fg = color;
	gc.mask |= FTK_GC_ALPHA;
	for(i = 0; i < width; i++)
	{
		gc.alpha = 0xff - (0xff & i);
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_point(thiz, i, 30);
	}

	show_canvas(display, thiz);
	
	ftk_canvas_destroy(thiz);

	sleep(3);

	return;
}
#endif
void test_draw_vline(FtkDisplay* display)
{
	int i = 0;
	FtkGc gc = {.mask = FTK_GC_FG};
	FtkRect rect = {0};
	FtkColor color = {.a = 0xff};
	int width = ftk_display_width(display);
	int height = ftk_display_height(display);
	FtkCanvas* thiz = ftk_canvas_create(width, height, &color);

	rect.width = width;
	rect.height = height;

	color.r = 0xff;
	color.a = 0xff;
	gc.fg = color;
	for(i = 0; i < width; i++)
	{
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_vline(thiz, i, 0, 20);
	}
	
	color.g = 0xff;
	color.r = 0;
	for(i = 0; i < width; i++)
	{
		color.a = 0xff - (0xff & i);
		gc.fg = color;
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_vline(thiz, i, 30, 20);
	}
	
	color.r = 0;
	color.g = 0;
	color.b = 0xff;
	color.a = 0xff;
	gc.fg = color;
	gc.mask |= FTK_GC_ALPHA;
	for(i = 0; i < width; i++)
	{
		gc.alpha = 0xff - (0xff & i);
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_vline(thiz, i, 60, 20);
	}

	show_canvas(display, thiz);
	
	ftk_canvas_destroy(thiz);
	sleep(3);

	return;
}

void test_draw_hline(FtkDisplay* display)
{
	int i = 0;
	FtkGc gc = {.mask = FTK_GC_FG};
	FtkRect rect = {0};
	FtkColor color = {.a = 0xff};
	int width = ftk_display_width(display);
	int height = ftk_display_height(display);
	FtkCanvas* thiz = ftk_canvas_create(width, height, &color);

	rect.width = width;
	rect.height = height;

	color.r = 0xff;
	color.a = 0xff;
	gc.fg = color;
	for(i = 0; i < height; i++)
	{
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_hline(thiz, 0, i, 20);
	}
	
	color.g = 0xff;
	color.r = 0;
	for(i = 0; i < height; i++)
	{
		color.a = 0xff - (0xff & i);
		gc.fg = color;
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_hline(thiz, 30, i, 20);
	}
	
	color.r = 0;
	color.g = 0;
	color.b = 0xff;
	color.a = 0xff;
	gc.fg = color;
	gc.mask |= FTK_GC_ALPHA;
	for(i = 0; i < height; i++)
	{
		gc.alpha = 0xff - (0xff & i);
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_hline(thiz, 60, i, 20);
	}

	show_canvas(display, thiz);
	
	ftk_canvas_destroy(thiz);

	sleep(3);

	return;
}

#if 0
void test_draw_line(FtkDisplay* display)
{
	int i = 0;
	FtkGc gc = {.mask = FTK_GC_FG};
	FtkRect rect = {0};
	FtkColor color = {.a = 0xff};
	int width = ftk_display_width(display);
	int height = ftk_display_height(display);
	FtkCanvas* thiz = ftk_canvas_create(width, height, color);

	rect.width = width;
	rect.height = height;

	color.r = 0xff;
	color.a = 0xff;
	gc.fg = color;
	for(i = 0; i < height/2; i++)
	{
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_line(thiz, 0, i, 20, i+10);
	}
	
	color.g = 0xff;
	color.r = 0;
	for(i = 0; i < height/2; i++)
	{
		color.a = 0xff - (0xff & i);
		gc.fg = color;
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_line(thiz, 30, i, 50, i+10);
	}
	
	color.r = 0;
	color.g = 0;
	color.b = 0xff;
	color.a = 0xff;
	gc.fg = color;
	gc.mask |= FTK_GC_ALPHA;
	for(i = 0; i < height/2; i++)
	{
		gc.alpha = 0xff - (0xff & i);
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_line(thiz, 60, i, 80, i+10);
	}

	ftk_display_update(display, ftk_canvas_bitmap(thiz), &rect, 0, 0);
	
	ftk_canvas_destroy(thiz);

	sleep(3);

	return;
}
#endif
void test_alpha(FtkDisplay* display)
{
	int i = 0;
	FtkGc gc = {.mask = FTK_GC_FG};
	FtkRect rect = {0};
	FtkColor color = {.a = 0xff};
	int width = ftk_display_width(display);
	int height = ftk_display_height(display);
	FtkCanvas* thiz = ftk_canvas_create(width, height, &color);

	rect.width = width;
	rect.height = height;

	color.g = 0xff;
	color.r = 0;
	for(i = 0; i < 0xff; i += 4)
	{
		color.a = 0xff;
		color.g = 0;
		gc.fg = color;
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_rect(thiz, 0, 0, width, height, 0, 1);
		
		color.a = 0xff - i;
		color.g = 0xff;
		gc.fg = color;
		ftk_canvas_reset_gc(thiz, &gc);
		ftk_canvas_draw_rect(thiz, 0, 0, width, height, 0, 1);
		show_canvas(display, thiz);
		usleep(200000);
	}
	
	ftk_canvas_destroy(thiz);

	sleep(3);

	return;
}

void test_put_get_pixel(FtkDisplay* display)
{
	int i = 0;
	int j = 0;
	FtkColor color = {.a=0xff, .r=0xef, .g=0xdf, .b=0xcf};
	int width = ftk_display_width(display);
	int height = ftk_display_height(display);
	FtkCanvas* thiz = ftk_canvas_create(width, height, &color);

	for(i = 0; i < height; i++)
	{
		for(j = 0; j < width; j++)
		{
			FtkColor c = {0};
			FtkColor* colorp = NULL;
			colorp = &c;
			assert(colorp->r == color.r);
			assert(colorp->g == color.g);
			assert(colorp->b == color.b);
			assert(colorp->a == color.a);
		}
	}

	ftk_canvas_destroy(thiz);

	return;
}

void test_font(FtkDisplay* display, FtkFont* font)
{
	int extent2 = 0;
	FtkGc gc = {.mask = FTK_GC_FONT};
	FtkColor color = {.a=0xff, .r=0xef, .g=0xdf, .b=0xcf};
	int width = ftk_display_width(display);
	int height = ftk_display_height(display);
	FtkCanvas* thiz = ftk_canvas_create(width, height, &color);
	const char* str = "隐式声明与内建函数";
	const char* other_side = NULL;
	
	gc.font = font;
	ftk_canvas_set_gc(thiz, &gc);
	
	other_side = ftk_canvas_calc_str_visible_range(thiz, str, 0, -1, 60);
	assert(strcmp(other_side, "明与内建函数") == 0);

	other_side = ftk_canvas_calc_str_visible_range(thiz, str, other_side-str, -1, 60);
	assert(strcmp(other_side, "建函数") == 0);
	
	other_side = ftk_canvas_calc_str_visible_range(thiz, str, other_side-str, -1, 60);
	assert(strcmp(other_side, "") == 0);

	other_side = ftk_canvas_calc_str_visible_range(thiz, str, -1, other_side-str, 60);
	assert(strcmp(other_side, "建函数") == 0);
	
	other_side = ftk_canvas_calc_str_visible_range(thiz, str, -1, other_side-str, 60);
	assert(strcmp(other_side, "明与内建函数") == 0);
	
	other_side = ftk_canvas_calc_str_visible_range(thiz, str, -1, other_side-str, 60);
	assert(strcmp(other_side, str) == 0);
	
	other_side = ftk_canvas_calc_str_visible_range(thiz, str, -1, other_side-str, 60);
	assert(strcmp(other_side, str) == 0);

	printf("other_side = %s\n", other_side);
	

	str = "Single line editor, that means you can input a one line only.";
	
	extent2 = ftk_canvas_get_extent(thiz, str, -1);

	ftk_canvas_destroy(thiz);
	sleep(3);

	return;
}

static void test_fill_bg(FtkDisplay* display)
{
	FtkRect rect = {0};
	FtkColor color = {.a=0xff, .r=0xef, .g=0xdf, .b=0xcf};
	int width = ftk_display_width(display);
	int height = ftk_display_height(display);
	FtkCanvas* thiz = ftk_canvas_create(width, height, &color);
	FtkBitmap* bitmap = ftk_theme_load_image(ftk_default_theme(), "btn_default_pressed.9.png");
	ftk_canvas_draw_bg_image(thiz, bitmap, FTK_BG_FOUR_CORNER, 10, 10, 100, 60);
	ftk_canvas_draw_bg_image(thiz, bitmap, FTK_BG_FOUR_CORNER, 120, 10, 40, 60);
	
	ftk_canvas_draw_bg_image(thiz, bitmap, FTK_BG_FOUR_CORNER, 10, 80, 20, 20);
	ftk_canvas_draw_bg_image(thiz, bitmap, FTK_BG_FOUR_CORNER, 30, 80, 40, 20);
	ftk_canvas_draw_bg_image(thiz, bitmap, FTK_BG_FOUR_CORNER, 80, 80, 60, 20);
	rect.width = width;
	rect.height = height;
	show_canvas(display, thiz);
	ftk_canvas_destroy(thiz);

	sleep(3);
	
	return;
}

static void test_draw_rect(FtkDisplay* display)
{
	int i = 0;
	FtkColor color = {.a = 0xff};
	FtkRect rect = {0};
	int width = ftk_display_width(display);
	int height = ftk_display_height(display);
	FtkGc gc = {.mask = FTK_GC_FG};
	FtkCanvas* thiz = ftk_canvas_create(width, height, &color);
	gc.fg.a = 0xff;

	gc.fg.r = 0xff;
	for(i = 0; i < width/8; i++)
	{
		gc.fg.r -= 0x10;
		ftk_canvas_set_gc(thiz, &gc);
		ftk_canvas_draw_rect(thiz, width * i/8, 0, width/8 - 1, height/8 - 1, 0, 1);
	}
	
	gc.fg.r = 0xff;
	for(i = 0; i < width/8; i++)
	{
		gc.fg.r -= 0x10;
		gc.fg.b += 0x10;
		ftk_canvas_set_gc(thiz, &gc);
		ftk_canvas_draw_rect(thiz, width * i/8, height/8, width/8 - 1, height/8 - 1, 0, 0);
	}
	
	gc.fg.r = 0xff;
	for(i = 0; i < width/8; i++)
	{
		gc.fg.r -= 0x10;
		ftk_canvas_set_gc(thiz, &gc);
		ftk_canvas_draw_rect(thiz, width * i/8, height/4, width/8 - 1, height/8 - 1, 1, 1);
	}
	
	gc.fg.r = 0xff;
	for(i = 0; i < width/8; i++)
	{
		gc.fg.r -= 0x10;
		gc.fg.b += 0x10;
		ftk_canvas_set_gc(thiz, &gc);
		ftk_canvas_draw_rect(thiz, width * i/8, 3*height/8, width/8 - 1, height/8 - 1, 1, 0);
	}
	rect.width = width;
	rect.height = height;
	show_canvas(display, thiz);
	ftk_canvas_destroy(thiz);

	sleep(3);

	return;
}

int main(int argc, char* argv[])
{
	ftk_init(argc, argv);

	FtkRect rect = {0};
	FtkColor bg = {.a = 0xff};
	FtkBitmap* bitmap = NULL;
	FtkFont* font = ftk_default_font();
	FtkDisplay* display = ftk_default_display();

	rect.width = ftk_display_width(display);
	rect.height = ftk_display_height(display);
#if 0
#else	
	test_draw_rect(display);
	test_alpha(display);
	test_draw_vline(display);
	bitmap = ftk_bitmap_create(ftk_display_width(display), ftk_display_height(display), bg);
	ftk_display_snap(display, &rect, bitmap);
	test_draw_hline(display);
	ftk_display_update(display, bitmap, &rect, 0, 0);
	test_fill_bg(display);
	test_font(display, font);
	test_put_get_pixel(display);
	test_draw_hline(display);
	test_draw_vline(display);
	ftk_bitmap_unref(bitmap);
#endif
	ftk_run();

	return 0;
}
#else
int main(int argc, char* argv[])
{
	return 0;
}