Example #1
0
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);
}
Example #2
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 );
}
Example #3
0
/***************************** Event ***********************************/
static void 
Destroy_Event(void *arg)
/* 功能:销毁事件数据 */
{
	LCUI_Event *event = (LCUI_Event*)arg;
	if(event != NULL) {
		Destroy_Queue(&event->func_data); 
	}
}
Example #4
0
int main()
{
  SeQueue *q;
  q = Init_Queue();
  for (int i = 0; i < 6; i++)
    Push_Queue(q, i);
  Print_Queue(q);
  Destroy_Queue(q);
}
Example #5
0
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;
}
Example #6
0
static void 
Destroy_Text_RowData(Text_RowData *data)
{
	Destroy_Queue ( &data->string );
}
Example #7
0
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;
}