Ejemplo n.º 1
0
int Zoom_PictureBox_View_Area(LCUI_Widget *widget, float scale)
/* 功能:缩放PictureBox部件的图片浏览区域 */
{
	LCUI_Graph buff, temp;
	LCUI_PictureBox *pic_box;
	
	pic_box = Get_Widget_PrivData(widget);
	if(!Graph_Valid(pic_box->image)) {
		return -1;
	}
	Graph_Init(&buff);
	Graph_Init(&temp);
	/* 有效范围为2%~2000% */
	if(scale < 0.02) {
		scale = 0.02;
	}
	if(scale > 20) {
		scale = 20;
	}
	if(pic_box->size_mode != SIZE_MODE_ZOOM
	 && pic_box->size_mode != SIZE_MODE_BLOCK_ZOOM) {
		pic_box->size_mode = SIZE_MODE_ZOOM; /* 改为缩放模式 */
	}
	pic_box->scale = scale; 
	Update_BuffGraph(widget); 
	Update_ReadBox(widget);
	Draw_Widget(widget);
	Refresh_Widget(widget);
	return 0;
}
Ejemplo n.º 2
0
static void 
Update_Label(LCUI_Widget *widget)
/* 功能:更新label部件 */
{
	int mode; 
	LCUI_Size max;
	LCUI_Label *label;
	
	label = Get_Widget_PrivData( widget );
	if(!Graph_Valid(&widget->background_image)) {
		mode = GRAPH_MIX_FLAG_REPLACE; /* 替换模式 */
	} else {
		mode = GRAPH_MIX_FLAG_OVERLAY; /* 叠加模式 */ 
	}
	/* 先绘制文本位图,在绘制前它会更新位图尺寸 */
	TextLayer_Draw( widget, &label->layer, mode );
	/* 获取尺寸 */
	max = TextLayer_Get_Size( &label->layer );
	if( widget->dock == DOCK_TYPE_NONE && label->auto_size
	 && Size_Cmp( max, widget->size ) != 0 ) {
		/* 如果开启了自动调整大小,并且尺寸有改变 */ 
		Resize_Widget(widget, max );
		Refresh_Widget(widget);
	}
}
Ejemplo n.º 3
0
static void Exec_Resize_PictureBox(LCUI_Widget *widget)
/* 功能:改变PictureBox部件的尺寸 */
{
	LCUI_PictureBox *pic_box = (LCUI_PictureBox*)
				Get_Widget_PrivData(widget);
	float scale_x, scale_y;
	if( widget->size.w <= 0 || widget->size.h <= 0 ) {
		Refresh_Widget(widget); 
		return;
	}
	
	switch(pic_box->size_mode) {
	case SIZE_MODE_BLOCK_ZOOM:
		/* 重新改变图像浏览区域的尺寸,这个尺寸指的是从源图像中截取出的图像的尺寸 */
		Resize_PictureBox_View_Area(
			widget, 
			widget->size.w / pic_box->scale, 
			widget->size.h / pic_box->scale );
		/* 以现在的缩放比例重新生成缩放后的图像 */
		Zoom_PictureBox_View_Area(widget, pic_box->scale);
		break;
	case SIZE_MODE_ZOOM:
		if(widget->size.w <= 0 || widget->size.h <= 0) {
			break; 
		}
		scale_x = (float)widget->size.w / pic_box->image->width;
		scale_y = (float)widget->size.h / pic_box->image->height;
		if(scale_x < scale_y) pic_box->scale = scale_x;
		else pic_box->scale = scale_y; 
		//printf("Exec_Resize_PictureBox(): scale: %.4f, x: %.4f, y: %.4f\n", pic_box->scale, scale_x, scale_y);
		Zoom_PictureBox_View_Area(widget, pic_box->scale); 
		//printf("Exec_Resize_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);
		break;
	case SIZE_MODE_NORMAL:/* 正常模式 */
	case SIZE_MODE_STRETCH:/* 拉伸模式 */
	case SIZE_MODE_TILE:/* 平铺模式 */
		break;
	case SIZE_MODE_CENTER: /* 居中模式 */ 
		Resize_PictureBox_View_Area(widget, widget->size.w, widget->size.h);
		break;
		default : break;
	}
	
	Refresh_Widget(widget); 
}
Ejemplo n.º 4
0
void Resize_PictureBox_View_Area(LCUI_Widget *widget, int width, int height)
/* 功能:设定PictureBox部件的图片显示区域的大小 */
{
	LCUI_Pos start, center_pos;
	LCUI_PictureBox *pic_box;
	
	pic_box = Get_Widget_PrivData(widget);
	
	if(width <= 0 || height <= 0) {
		return;
	}
	if(!Graph_Valid(pic_box->image)) {
		return;
	}
	/* 将中心点位置转换成坐标 */
	center_pos.x = pic_box->read_box.center_x * pic_box->scale * pic_box->image->width;
	center_pos.y = pic_box->read_box.center_y * pic_box->scale * pic_box->image->height;
	/* 处理区域数据,使之为有效区域 */
	start.x = center_pos.x - width/2.0;
	start.y = center_pos.y - height/2.0;
	if(start.x < 0) start.x = 0;
	if(start.y < 0) start.y = 0;
	if(start.x + width > pic_box->image->width)
	start.x = pic_box->image->width - width;
	if(start.y + height > pic_box->image->height)
	start.y = pic_box->image->height - height;
	if(start.x < 0) {
		start.x = 0;
		width = pic_box->image->width;
	}
	if(start.y < 0) {
		start.y = 0;
		height = pic_box->image->height;
	}
	pic_box->read_box.x = start.x;
	pic_box->read_box.y = start.y;
	pic_box->read_box.width = width;
	pic_box->read_box.height = height;
	/* 更新图片盒子内的图像 */
	Draw_Widget(widget);
	Refresh_Widget(widget); 
}
Ejemplo n.º 5
0
static void Update_Label(LCUI_Widget *widget)
/* 功能:更新label部件 */
{
	int mode; 
	LCUI_Size max;
	LCUI_TextLayer *layer;
	
	layer = Get_Widget_PrivData( widget );
	max = TextLayer_Get_Size( layer );  
	if( widget->auto_size && Size_Cmp( max, widget->size ) != 0 ) {
		/* 如果开启了自动调整大小,并且尺寸有改变 */ 
		Resize_Widget(widget, max );
		Refresh_Widget(widget);
		return;
	}
	if(!Graph_Valid(&widget->background_image)) {
		mode = GRAPH_MIX_FLAG_REPLACE; /* 替换模式 */
	} else {
		mode = GRAPH_MIX_FLAG_OVERLAY; /* 叠加模式 */ 
	}
	layer = Get_Widget_PrivData( widget );
	TextLayer_Draw( widget, layer, mode );
}
Ejemplo n.º 6
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);
}