void TextLayer_Clear( LCUI_TextLayer *layer ) /* 清空文本内容 */ { Destroy_Queue( &layer->text_source_data ); Destroy_Queue( &layer->rows_data ); Destroy_Queue( &layer->style_data ); layer->current_src_pos = 0; layer->current_des_pos = Pos(0,0); }
void Destroy_TextLayer( LCUI_TextLayer *layer ) /* 销毁文本图层占用的资源 */ { Destroy_Queue( &layer->text_source_data ); Destroy_Queue( &layer->rows_data ); Destroy_Queue( &layer->tag_buff ); Destroy_Queue( &layer->style_data ); Destroy_Queue( &layer->clear_area ); String_Free( &layer->text_buff ); }
/***************************** Event ***********************************/ static void Destroy_Event(void *arg) /* 功能:销毁事件数据 */ { LCUI_Event *event = (LCUI_Event*)arg; if(event != NULL) { Destroy_Queue(&event->func_data); } }
int main() { SeQueue *q; q = Init_Queue(); for (int i = 0; i < 6; i++) Push_Queue(q, i); Print_Queue(q); Destroy_Queue(q); }
void TextLayer_Merge( LCUI_TextLayer *des, LCUI_TextLayer *src ) /* 合并两个文本图层 */ { LCUI_Rect area, tmp_area; uint_t i, j, old_size, new_size; LCUI_CharData *src_ptr, *des_ptr; Text_RowData *src_row_ptr, *des_row_ptr; uint_t old_rows, new_rows, max_rows, min_rows; int32_t src_len, des_len, max_len, min_len; old_rows = Queue_Get_Total( &des->rows_data ); new_rows = Queue_Get_Total( &src->rows_data ); DEBUG_MSG("old_rows: %d, new_rows: %d\n", old_rows, new_rows); if(old_rows > new_rows) { max_rows = old_rows; min_rows = new_rows; } else { max_rows = new_rows; min_rows = old_rows; } for(area.y=0,i=0; i<min_rows; ++i) { area.x = 0; src_row_ptr = Queue_Get( &src->rows_data, i ); des_row_ptr = Queue_Get( &des->rows_data, i ); src_len = Queue_Get_Total( &src_row_ptr->string ); des_len = Queue_Get_Total( &des_row_ptr->string ); if(src_len > des_len) { max_len = src_len; min_len = des_len; } else { max_len = des_len; min_len = src_len; } for(j=0; j<min_len; ++j) { src_ptr = Queue_Get( &src_row_ptr->string, j ); des_ptr = Queue_Get( &des_row_ptr->string, j ); area.x += des_ptr->bitmap.left; /* 获取字体大小 */ if(src_ptr->data == NULL) { new_size = 12; } else { if(src_ptr->data->pixel_size > 0) { new_size = src_ptr->data->pixel_size; } else { new_size = 12; } } if(des_ptr->data == NULL) { old_size = 12; } else { if(des_ptr->data->pixel_size > 0) { old_size = des_ptr->data->pixel_size; } else { old_size = 12; } } if(src_ptr->char_code == des_ptr->char_code) { /* 转移字体位图数据 */ src_ptr->bitmap = des_ptr->bitmap; /* 指针赋值为NULL,避免被释放 */ des_ptr->bitmap.buffer = NULL; src_ptr->need_update = FALSE; } else { src_ptr->need_update = TRUE; } if(new_size != old_size) { src_ptr->need_update = TRUE; } //文本样式也要对比 //.... if(src_ptr->need_update) { tmp_area.x = area.x; tmp_area.y = area.y + old_size+2 - des_ptr->bitmap.top; tmp_area.width = des_ptr->bitmap.width; tmp_area.height = des_ptr->bitmap.rows; RectQueue_Add( &des->clear_area, tmp_area ); area.x += des_ptr->bitmap.width; FontBMP_Free(&des_ptr->bitmap); } else { area.x += des_ptr->bitmap.width; } } if( src_len < max_len ) { /* 如果这一行删减了几个字,则记录区域 */ for(j=min_len; j<max_len; ++j) { des_ptr = Queue_Get( &des_row_ptr->string, j ); if(des_ptr->data == NULL) { old_size = 12; } else { if(des_ptr->data->pixel_size > 0) { old_size = des_ptr->data->pixel_size; } else { old_size = 12; } } area.x += des_ptr->bitmap.left; area.width = area.height = old_size+2; RectQueue_Add( &des->clear_area, area ); area.x += des_ptr->bitmap.width; } } area.y += des_row_ptr->max_size.h; } area.x = 0; if(new_rows < max_rows) {/* 如果是删减几行文本,则需要记录被删文本的区域 */ for(i=min_rows; i<max_rows; ++i) { des_row_ptr = Queue_Get( &des->rows_data, min_rows ); area.width = des_row_ptr->max_size.w; area.height = des_row_ptr->max_size.h; RectQueue_Add( &des->clear_area, area ); } } /* 转移数据 */ Destroy_Queue( &des->text_source_data ); des->text_source_data = src->text_source_data; Destroy_Queue( &des->rows_data ); des->rows_data = src->rows_data; }
static void Destroy_Text_RowData(Text_RowData *data) { Destroy_Queue ( &data->string ); }
static int _TextLayer_Text_Delete ( LCUI_TextLayer *layer, LCUI_Pos start_pos, int len ) /* 以start_pos为起点,删除n个文字 */ { 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_Get_Char_PixelPos( layer, start_pos ); rows = Queue_Get_Total( &layer->rows_data ); row_ptr = Queue_Get( &layer->rows_data, start_pos.y ); if( !row_ptr ) { return -1; } cols = Queue_Get_Total( &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; /* 销毁下一行的文本 */ Destroy_Queue( &tmp_row->string ); Queue_Delete( &layer->rows_data, start_pos.y+1 ); /* 更新当前行的总字符数 */ cols = Queue_Get_Total( &row_ptr->string ); /* 更新总行数 */ rows = Queue_Get_Total( &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_Get_Total( &row_ptr->string ); Queue_Delete_Pointer( &row_ptr->string, start_pos.x ); cols = Queue_Get_Total( &row_ptr->string ); char_ptr = Queue_Get( &row_ptr->string, start_pos.x ); cols = Queue_Get_Total( &row_ptr->string ); } /* 更新当前行的尺寸 */ TextLayer_Update_RowSize( layer, start_pos.y ); return 0; }