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; }
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); } }
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); }
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); }
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 ); }
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); }