LCUI_API int GraphLayer_DeleteChild( LCUI_GraphLayer *child_glayer ) { int i, total; LCUI_Queue *child_list; LCUI_GraphLayer *tmp_glayer; if( !child_glayer ) { return -1; } if( !child_glayer->parent ) { return 0; } /* 引用父图层的子图层列表 */ child_list = &child_glayer->parent->child; total = Queue_GetTotal( child_list ); /* 查找子图层记录 */ for( i=0; i<total; ++i ) { tmp_glayer = (LCUI_GraphLayer*)Queue_Get( child_list, i ); /* 若找到则删除该子图层记录 */ if( tmp_glayer == child_glayer ) { Queue_DeletePointer( child_list, i ); child_glayer->parent = NULL; return 0; } } child_glayer->parent = NULL; return 0; }
static int LCUIApp_RunTask( LCUI_App *app ) { LCUI_Task *task; Queue_Lock( &app->tasks ); task = Queue_Get( &app->tasks, 0 ); if( task == NULL ) { Queue_Unlock( &app->tasks ); return -1; } Queue_DeletePointer( &app->tasks, 0 ); if( task->func == NULL ) { Queue_Unlock( &app->tasks ); return -2; } Queue_Unlock( &app->tasks ); /* 调用函数指针指向的函数,并传递参数 */ task->func( task->arg[0], task->arg[1] ); /* 若需要在调用回调函数后销毁参数 */ if( task->destroy_arg[0] ) { free( task->arg[0] ); } if( task->destroy_arg[1] ) { free( task->arg[1] ); } free( task ); return 0; }
/* 对目标行进行断行处理,也就是将目标行指定位置后面的全部文字转移到另一行 */ static void TextLayer_Text_RowBreak ( LCUI_TextLayer *layer, Text_RowData *src, int break_point, Text_RowData *des ) { static int i, total; static LCUI_CharData *char_ptr; total = Queue_GetTotal( &src->string ); for(i=break_point; i<total; ++i ) { char_ptr = Queue_Get( &src->string, break_point ); Queue_AddPointer( &des->string, char_ptr ); char_ptr->need_update = TRUE; Queue_DeletePointer( &src->string, break_point ); } }
/* 将单选框从互斥关系链中移除 */ LCUI_API void RadioButton_DeleteMutex( LCUI_Widget widget ) { int i, total; LCUI_Widget tmp; LCUI_RadioButton *rb; rb = (LCUI_RadioButton *)Widget_GetPrivData(widget); total = Queue_GetTotal(rb->mutex); for(i=0; i<total; ++i) { tmp = (LCUI_Widget*)Queue_Get(rb->mutex, i); if(tmp == widget) { Queue_DeletePointer(rb->mutex, i); break; } } }
LCUI_API int GraphLayer_GetGraph( LCUI_GraphLayer *ctnr, LCUI_Graph *graph_buff, LCUI_Rect rect ) { int i, total; uchar_t tmp_alpha, alpha; LCUI_Pos pos, glayer_pos; LCUI_GraphLayer *glayer; LCUI_Queue glayerQ; LCUI_Rect valid_area; LCUI_Graph tmp_graph; /* 检测这个区域是否有效 */ if (rect.x < 0 || rect.y < 0) { return -1; } if (rect.x + rect.width > ctnr->graph.w || rect.y + rect.height > ctnr->graph.h ) { return -1; } if (rect.width <= 0 || rect.height <= 0) { return -2; } if( !Graph_IsValid(graph_buff) ) { graph_buff->color_type = COLOR_TYPE_ARGB; Graph_Create( graph_buff, rect.width, rect.height ); } Graph_Init( &tmp_graph ); Queue_Init( &glayerQ, 0, NULL); Queue_UsingPointer( &glayerQ ); /* 获取rect区域内的图层列表 */ GraphLayer_GetLayers( ctnr, rect, &glayerQ ); total = Queue_GetTotal( &glayerQ ); DEBUG_MSG( "total: %d\n", total ); /* 若记录数为零,则表明该区域没有图层 */ if( total <= 0 ) { /* 若没有父图层,则填充白色 */ if( ctnr == NULL ) { Graph_FillColor( graph_buff, RGB(255,255,255) ); } else { /* 否则使用父图层的图形 */ Graph_Cut( &ctnr->graph, rect, graph_buff ); } /* 销毁记录 */ Queue_Destroy( &glayerQ ); return 0; } /* 从顶层到底层遍历图层,排除被其它图层完全遮挡或者自身完全透明的图层 */ for(i=total-1; i>=0; --i) { glayer = (LCUI_GraphLayer*)Queue_Get( &glayerQ, i ); valid_area = GraphLayer_GetValidRect( ctnr, glayer ); glayer_pos = GraphLayer_GetGlobalPos( ctnr, glayer ); valid_area.x += glayer_pos.x; valid_area.y += glayer_pos.y; alpha = GraphLayer_GetRealAlpha( glayer ); /* 当前图层的透明度小于255的话,就跳过 */ if( alpha < 255 ) { continue; } /* 跳过有alpha通道的图层 */ if( glayer->graph.color_type == COLOR_TYPE_ARGB ) { continue; } /* 如果该图层的有效区域包含目标区域 */ if( rect.x >= valid_area.x && rect.y >= valid_area.y && rect.x + rect.w <= valid_area.x + valid_area.w && rect.y + rect.h <= valid_area.y + valid_area.h ) { /* 移除底层的图层,因为已经被完全遮挡 */ for(total=i-1;total>=0; --total) { Queue_DeletePointer( &glayerQ, 0 ); } goto skip_loop; } } skip_loop: total = Queue_GetTotal( &glayerQ ); DEBUG_MSG( "total: %d\n", total ); if(i <= 0 && ctnr ) { Graph_Cut( &ctnr->graph, rect, graph_buff ); } /* 获取图层列表中的图层 */ for(i=0; i<total; ++i) { glayer = (LCUI_GraphLayer*)Queue_Get( &glayerQ, i ); //_DEBUG_MSG("%p = Queue_Get( %p, %d )\n", glayer, &glayerQ, i); if( !glayer ) { continue; } DEBUG_MSG("%d,%d,%d,%d\n", glayer->pos.x, glayer->pos.y, glayer->graph.w, glayer->graph.h); /* 获取该图层的有效区域及全局坐标 */ pos = GraphLayer_GetGlobalPos( ctnr, glayer ); valid_area = GraphLayer_GetValidRect( ctnr, glayer ); /* 引用该图层的有效区域内的图像 */ Graph_Quote( &tmp_graph, &glayer->graph, valid_area ); //_DEBUG_MSG("valid area: %d,%d,%d,%d, pos: %d,%d, size: %d,%d\n", // valid_area.x, valid_area.y, valid_area.width, valid_area.height, // pos.x, pos.y, glayer->graph.w, glayer->graph.h // ); /* 获取相对坐标 */ pos.x = pos.x - rect.x + valid_area.x; pos.y = pos.y - rect.y + valid_area.y; //_DEBUG_MSG("mix pos: %d,%d\n", pos.x, pos.y); /* 如果该图层没有继承父图层的透明度 */ if( !glayer->inherit_alpha ) { /* 直接叠加至graph_buff */ Graph_Mix( graph_buff, &tmp_graph, pos ); } else { /* 否则,计算该图层应有的透明度 */ alpha = GraphLayer_GetRealAlpha( glayer ); /* 备份该图层的全局透明度 */ tmp_alpha = glayer->graph.alpha; /* 将实际透明度作为全局透明度,参与图像叠加 */ glayer->graph.alpha = alpha; Graph_Mix( graph_buff, &tmp_graph, pos ); /* 还原全局透明度 */ glayer->graph.alpha = tmp_alpha; } } Queue_Destroy( &glayerQ ); return 0; }
static int _TextLayer_Text_Delete ( LCUI_TextLayer *layer, LCUI_Pos start_pos, int len ) /* 以start_pos为起点,删除n个文字 */ { LCUI_BOOL refresh = TRUE; LCUI_CharData *char_ptr; LCUI_Pos tmp_pos, pixel_pos; int left_or_right, rows, cols; Text_RowData *row_ptr, *tmp_row; if( start_pos.x < 0 ) { len += start_pos.x; start_pos.x = 0; } if( start_pos.y < 0 ) { start_pos.y = 0; } if( len <= 0 ) { return -1; } /* 确定起点位置的XY轴坐标 */ pixel_pos = TextLayer_Char_GetPixelPos( layer, start_pos ); rows = Queue_GetTotal( &layer->rows_data ); row_ptr = Queue_Get( &layer->rows_data, start_pos.y ); if( !row_ptr ) { return -1; } cols = Queue_GetTotal( &row_ptr->string ); /* 根据光标所在位置,确定遍历方向 */ if( layer->current_des_pos.y > start_pos.y || (layer->current_des_pos.y == start_pos.y && layer->current_des_pos.x > start_pos.x)) { left_or_right = 0; } else { left_or_right = 1; } /* 如果需删除的字符只在当前行 */ if( start_pos.x + len <= cols ) { /* 标记后面的文字位图需要刷新 */ TextLayer_CharLater_Refresh( layer, start_pos ); } for( ; start_pos.x<=cols && len>0; --len ) { /* 如果到了行尾 */ if( start_pos.x == cols ) { /* 如果当前行是最后一行 */ if( start_pos.y >= rows-1 ) { break; } if( refresh ) { tmp_pos.x = 0; tmp_pos.y=start_pos.y+1; /* 刷新该行后面所有行的字符 */ for( ; tmp_pos.y<rows; ++tmp_pos.y ) { TextLayer_CharLater_Refresh( layer, tmp_pos ); } refresh = FALSE; } /* 将当前行行尾的换行符'\n'从源文本中移除 */ TextLayer_Text_DeleteChar( layer, row_ptr->last_char, left_or_right ); /* 获取指向下一行文本的指针 */ tmp_row = Queue_Get( &layer->rows_data, start_pos.y+1 ); /* 将下一行的文本拼接至当前行行尾 */ Queue_Cat( &row_ptr->string, &tmp_row->string ); /* 将下一行的行尾字符数据转移至当前行 */ row_ptr->last_char = tmp_row->last_char; /* 销毁下一行的文本 */ Queue_Destroy( &tmp_row->string ); Queue_Delete( &layer->rows_data, start_pos.y+1 ); /* 更新当前行的总字符数 */ cols = Queue_GetTotal( &row_ptr->string ); /* 更新总行数 */ rows = Queue_GetTotal( &layer->rows_data ); /* 更新当前行的尺寸 */ TextLayer_Update_RowSize( layer, start_pos.y ); continue; } char_ptr = Queue_Get( &row_ptr->string, start_pos.x ); if( !char_ptr ) { continue; } TextLayer_Clear( layer, pixel_pos, row_ptr->max_size.h, char_ptr ); pixel_pos.x += char_ptr->bitmap->advance.x; /* 将该字从源文本中移除 */ TextLayer_Text_DeleteChar( layer, char_ptr, left_or_right ); /* 该字在这行的字体位图也需要删除 */ cols = Queue_GetTotal( &row_ptr->string ); Queue_DeletePointer( &row_ptr->string, start_pos.x ); cols = Queue_GetTotal( &row_ptr->string ); char_ptr = Queue_Get( &row_ptr->string, start_pos.x ); cols = Queue_GetTotal( &row_ptr->string ); } /* 更新当前行的尺寸 */ TextLayer_Update_RowSize( layer, start_pos.y ); return 0; }