int TextLayer_CurRow_Get_MaxHeight( LCUI_TextLayer *layer ) /* 获取当前行的最大高度 */ { Text_RowData *row_ptr; row_ptr = TextLayer_Get_Current_RowData( layer ); if( !row_ptr ) { return layer->default_data.pixel_size + 2; } return row_ptr->max_size.h; }
void TextLayer_Text_Process( LCUI_TextLayer *layer, char *new_text ) /* 对文本进行预处理,处理后的数据保存至layer里 */ { int total; uint32_t rows, n_ignore = 0; wchar_t *finish, *buff, *p, *q; DEBUG_MSG("%s\n", new_text); LCUI_CharData char_data; Text_RowData *current_row_data; /* 如果有选中的文本,那就删除 */ //...... total = Char_To_Wchar_T( new_text, &buff ); current_row_data = TextLayer_Get_Current_RowData ( layer ); if( !current_row_data ) { TextLayer_Text_Add_NewRow( layer ); current_row_data = TextLayer_Get_Current_RowData ( layer ); } FontBMP_Init( &char_data.bitmap ); /* 根据样式标签生成对应的样式数据 */ for(p=buff, finish=buff+total; p<finish; ++p) { if( layer->using_style_tags ) { /* 处理样式的结束标签 */ q = handle_style_endtag ( layer, p ); if(q != NULL) { /* 计算需忽略的字符数 */ n_ignore = q-p+1; } else { /* 处理样式标签 */ q = handle_style_tag ( layer, p ); if( q != NULL ) { n_ignore = q-p+1; } } } if(*p == '\n') { /* 计算需要忽略的换行符的数量 */ for( n_ignore=0,q=p; *q == '\n'; ++q,++n_ignore); } if(n_ignore > 0) { /* 被忽略的字符的属性都一样,所以只需赋一次值 */ char_data.data = NULL; char_data.display = IS_FALSE; char_data.need_update = IS_FALSE; FontBMP_Init( &char_data.bitmap ); } while(n_ignore > 0) { char_data.char_code = *p++; Queue_Insert( &layer->text_source_data, layer->current_src_pos, &char_data ); /* 遇到换行符,那就增加新行 */ if(char_data.char_code == '\n') { rows = TextLayer_Text_Add_NewRow( layer ); current_row_data = Queue_Get( &layer->rows_data, rows ); layer->current_des_pos.x = 0; layer->current_des_pos.y = rows; } else { ++layer->current_src_pos; } --n_ignore; if(n_ignore == 0) { n_ignore = -1; break; } } if(n_ignore == -1) { --p; n_ignore = 0; continue; } char_data.char_code = *p; char_data.display = TRUE; char_data.need_update = TRUE; char_data.data = TextLayer_Get_Current_TextStyle( layer ); Queue_Insert( &layer->text_source_data, layer->current_src_pos, &char_data ); Queue_Insert( ¤t_row_data->string, layer->current_des_pos.x, &char_data ); ++layer->current_src_pos; ++layer->current_des_pos.x; } }