示例#1
0
文件: LCUI_Graph.c 项目: fshunj/LCUI
LCUI_API int Graph_FillImage(	LCUI_Graph *graph,
				LCUI_Graph *bg, 
				int mode,
				LCUI_RGB color )
{
	LCUI_Size size;
	LCUI_Pos pos;
	LCUI_Graph temp_bg;
	LCUI_BOOL replace_mix;
	
	if( Check_Option( mode, GRAPH_MIX_FLAG_REPLACE ) ) {
		/* 将alpha通道置为0 */
		Graph_FillAlpha( graph, 0 );
		replace_mix = TRUE;
	} else {
		/* 填充背景色,将alpha通道置为255 */
		Graph_FillColor( graph, color );
		Graph_FillAlpha( graph, 255 );
		replace_mix = FALSE;
	}
	if(!Graph_IsValid(bg) || !Graph_IsValid(graph)) {
		return -1; 
	}
	size.w = graph->w;
	size.h = graph->h;
	Graph_Init(&temp_bg);
	pos.x = pos.y = 0;
	/* 平铺 */
	if( Check_Option( mode, LAYOUT_TILE ) ) {
		return Graph_Tile( bg, graph, replace_mix );
	}
	/* 缩放 */
	if( Check_Option( mode, LAYOUT_ZOOM ) ) {
		Graph_Zoom( bg, &temp_bg, TRUE, size );
		pos.x = (size.w - temp_bg.w) / 2.0;
		pos.y = (size.h - temp_bg.h) / 2.0;
		bg = &temp_bg;
	}
	/* 拉伸 */
	else if( Check_Option( mode, LAYOUT_STRETCH ) ) {
		Graph_Zoom( bg, &temp_bg, FALSE, size );
		bg = &temp_bg;
	}
	/* 居中 */
	else if( Check_Option( mode, LAYOUT_CENTER ) ) {
		pos.x = (size.w - bg->w) / 2.0;
		pos.y = (size.h - bg->h) / 2.0;
	}
	if( replace_mix ) {
		Graph_Replace( graph, bg, pos );
	} else {
		Graph_Mix( graph, bg, pos );
	}
	Graph_Free( &temp_bg );
	return 0; 
}
示例#2
0
static void Exec_Update_PictureBox(LCUI_Widget *widget)
/* 功能:更新PictureBox部件 */
{
    LCUI_Pos pos;
    LCUI_PictureBox *pic_box;
    LCUI_Graph graph, *p;
    //printf("Exec_Update_PictureBox(): start\n");
    pos = Pos(0,0);
    Graph_Init(&graph);
    pic_box  = (LCUI_PictureBox*)Get_Widget_PrivData(widget);

    //print_widget_info(widget);
    //Print_Graph_Info(&widget->graph);
    //Print_Graph_Info(pic_box->image);
    //printf("Exec_Update_PictureBox(): 1\n");
    if(! Graph_Valid(pic_box->image)) return;

    //printf("Exec_Update_PictureBox(): widget size: w: %d, h: %d\n", widget->size.w, widget->size.h);
    //printf("Exec_Update_PictureBox(): read box: %d,%d,%d,%d\n",
    //pic_box->read_box.x, pic_box->read_box.y,
    //pic_box->read_box.width, pic_box->read_box.height);
    switch(pic_box->size_mode) {
    case SIZE_MODE_BLOCK_ZOOM:
    case SIZE_MODE_ZOOM:
        /* 裁剪图像 */
        if(pic_box->scale == 1.00) p = pic_box->image;
        else p = &pic_box->buff_graph;
        if(! Graph_Valid(p)) {
            //printf("! Graph_Valid(p)\n");
            return;
        }

        pos.x = (widget->size.w - pic_box->read_box.width)/2.0;
        pos.y = (widget->size.h - pic_box->read_box.height)/2.0;
        /* 引用图像中指定区域的图形 */
        Quote_Graph(&graph, p, pic_box->read_box);
        break;

    case SIZE_MODE_NORMAL:/* 正常模式 */
        Quote_Graph(&graph, pic_box->image, pic_box->read_box);
        break;

    case SIZE_MODE_STRETCH:/* 拉伸模式 */
        /* 开始缩放图片 */
        Graph_Zoom( pic_box->image, &graph, CUSTOM, widget->size );
        break;

    case SIZE_MODE_TILE:/* 平铺模式 */
        Graph_Tile( pic_box->image, &graph, widget->size.w, widget->size.h);
        break;

    case SIZE_MODE_CENTER:
        /* 判断图像的尺寸是否小于图片盒子的尺寸,并计算坐标位置 */
        if(pic_box->image->width < widget->size.w) {
            pic_box->read_box.x = 0;
            pic_box->read_box.width = pic_box->image->width;
            pos.x = (widget->size.w - pic_box->image->width)/2 + 0.5;
        }
        if(pic_box->image->height < widget->size.h) {
            pos.y = (widget->size.h - pic_box->image->height)/2 + 0.5;
            pic_box->read_box.y = 0;
            pic_box->read_box.height = pic_box->image->height;
        }
        if(pic_box->read_box.y + pic_box->read_box.height >= pic_box->image->height)
            /* 如果读取区域的尺寸大于图片尺寸 */
            pic_box->read_box.y = pic_box->image->height - pic_box->read_box.height;
        if(pic_box->read_box.x + pic_box->read_box.width >= pic_box->image->width)
            pic_box->read_box.x = pic_box->image->width - pic_box->read_box.width;

        Quote_Graph(&graph, pic_box->image, pic_box->read_box);
        break;
    default :
        break;
    }
    // 用于调试
    //printf("Exec_Update_PictureBox(): read box: %d,%d,%d,%d; %d/%d, %d/%d\n",
    //pic_box->read_box.x, pic_box->read_box.y,
    //pic_box->read_box.width, pic_box->read_box.height,
    //pic_box->read_box.x + pic_box->read_box.width, pic_box->buff_graph.width,
    //pic_box->read_box.y + pic_box->read_box.height, pic_box->buff_graph.height);
    if(!Graph_Valid(&widget->background_image)) {
        Graph_Replace(&widget->graph, &graph, pos);
    } else {
        Graph_Mix(&widget->graph, &graph, pos);
    }
    Graph_Free(&graph);
    //printf("scale: %.4f\n", pic_box->scale);
    //printf("Exec_Update_PictureBox(): end\n");
    Refresh_Widget(widget);
}
示例#3
0
文件: picturebox.c 项目: fshunj/LCUI
/* 在PictureBox部件更新时进行附加处理 */
static void 
PictureBox_ExecUpdate(LCUI_Widget *widget)
{
	LCUI_Pos pos;
	LCUI_PictureBox *pic_box;
	LCUI_Graph graph, *widget_graph, *p;
	
	pos = Pos(0,0);
	Graph_Init(&graph);
	pic_box  = (LCUI_PictureBox*)Widget_GetPrivData(widget);
	widget_graph = Widget_GetSelfGraph( widget );
	//print_widget_info(widget);
	//Graph_PrintInfo(widget_graph);
	//Graph_PrintInfo(pic_box->image);
	//printf("PictureBox_ExecUpdate(): 1\n");
	if(! Graph_IsValid(pic_box->image)) {
		return;
	}
	
	//printf("PictureBox_ExecUpdate(): widget size: w: %d, h: %d\n", widget->size.w, widget->size.h);
	//printf("PictureBox_ExecUpdate(): read box: %d,%d,%d,%d\n",
		//pic_box->read_box.x, pic_box->read_box.y, 
		//pic_box->read_box.width, pic_box->read_box.height);
	switch(pic_box->size_mode) {
	case SIZE_MODE_BLOCK_ZOOM:
	case SIZE_MODE_ZOOM:
	/* 裁剪图像 */ 
		if(pic_box->scale == 1.00) p = pic_box->image; 
		else p = &pic_box->buff_graph; 
		if(! Graph_IsValid(p)) {
			//printf("! Graph_IsValid(p)\n");
			return;
		}
		
		pos.x = (widget->size.w - pic_box->read_box.width)/2.0;
		pos.y = (widget->size.h - pic_box->read_box.height)/2.0;
		/* 引用图像中指定区域的图形 */
		Graph_Quote(&graph, p, pic_box->read_box);
		break;
		 
	case SIZE_MODE_NORMAL:/* 正常模式 */
		Graph_Quote(&graph, pic_box->image, pic_box->read_box); 
		break;
		
	case SIZE_MODE_STRETCH:/* 拉伸模式 */ 
		/* 开始缩放图片 */
		Graph_Zoom( pic_box->image, &graph, FALSE, widget->size ); 
		break;
		
	case SIZE_MODE_TILE:/* 平铺模式 */ 
		Graph_Tile( pic_box->image, &graph, TRUE );
		break;
		
	case SIZE_MODE_CENTER:
		/* 判断图像的尺寸是否小于图片盒子的尺寸,并计算坐标位置 */
		if(pic_box->image->w < widget->size.w) {
			pic_box->read_box.x = 0;
			pic_box->read_box.width = pic_box->image->w;
			pos.x = (widget->size.w - pic_box->image->w)/2 + 0.5;
		}
		if(pic_box->image->h < widget->size.h) {
			pos.y = (widget->size.h - pic_box->image->h)/2 + 0.5;
			pic_box->read_box.y = 0;
			pic_box->read_box.height = pic_box->image->h;
		}
		if(pic_box->read_box.y + pic_box->read_box.height >= pic_box->image->h) 
		/* 如果读取区域的尺寸大于图片尺寸 */
			pic_box->read_box.y = pic_box->image->h - pic_box->read_box.height;
		if(pic_box->read_box.x + pic_box->read_box.width >= pic_box->image->w) 
			pic_box->read_box.x = pic_box->image->w - pic_box->read_box.width;
			
		Graph_Quote(&graph, pic_box->image, pic_box->read_box); 
		break;
	default : break;
	}
	// 用于调试
	//printf("PictureBox_ExecUpdate(): read box: %d,%d,%d,%d; %d/%d, %d/%d\n", 
	//pic_box->read_box.x, pic_box->read_box.y, 
	//pic_box->read_box.width, pic_box->read_box.height, 
	//pic_box->read_box.x + pic_box->read_box.width, pic_box->buff_graph.w, 
	//pic_box->read_box.y + pic_box->read_box.height, pic_box->buff_graph.h);
	if(!Graph_IsValid(&widget->background.image)) {
		Graph_Replace( widget_graph, &graph, pos );
	} else {
		Graph_Mix( widget_graph, &graph, pos );
	}
	Graph_Free(&graph);
	//printf("scale: %.4f\n", pic_box->scale);
	//printf("PictureBox_ExecUpdate(): end\n");
	Widget_Refresh(widget); 
}