ULRE/inc/hgl/graph/font/TextLayout.h

177 lines
7.2 KiB
C
Raw Normal View History

2020-07-29 01:00:25 +08:00
#ifndef HGL_GRAPH_TEXT_LAYOUT_INCLUDE
#define HGL_GRAPH_TEXT_LAYOUT_INCLUDE
#include<hgl/type/StringList.h>
#include<hgl/graph/font/FontSource.h>
2020-07-20 21:29:15 +08:00
#include<hgl/graph/RenderableCreater.h>
#include<hgl/graph/TileData.h>
#include<hgl/type/MemBlock.h>
namespace hgl
{
namespace graph
{
class TileFont;
class TextRenderable;
/**
2020-07-20 22:22:25 +08:00
*
*/
struct CharLayoutAttr
{
2020-07-20 22:22:25 +08:00
bool bold =false; ///<加粗
bool italic =false; ///<右斜
bool underline =false; ///<下划线
2020-07-20 22:22:25 +08:00
Color4f CharColor; ///<字符颜色
Color4f BackgroundColor; ///<背影颜色
};//struct CharLayoutAttr
2020-07-21 17:09:24 +08:00
/**
*
*/
union TextDirection
{
uint8 text_direction;
struct
{
uint vertical:1; ///<是否竖排
uint right_to_left:1; ///<是否从右往左
};
};//union TextDirection
2020-07-20 21:29:15 +08:00
2020-07-20 22:22:25 +08:00
/**
2020-07-21 17:09:24 +08:00
*
2020-07-20 22:22:25 +08:00
*/
2020-07-21 17:09:24 +08:00
enum class TextAlign
2020-07-20 22:22:25 +08:00
{
Left=0, ///<左对齐
Right, ///<右对齐
Center, ///<居中
2020-07-21 17:09:24 +08:00
Fill, ///<排满整行/列
2020-07-20 22:22:25 +08:00
Top =Left, ///<上对齐
Bottom =Right ///<下对齐
2020-07-21 17:09:24 +08:00
};//enum class TextAlign
2020-07-20 22:22:25 +08:00
/**
2020-07-21 17:09:24 +08:00
*
2020-07-20 22:22:25 +08:00
*/
2020-07-21 17:09:24 +08:00
struct TextLayoutAttributes
2020-07-20 22:22:25 +08:00
{
2020-07-21 17:09:24 +08:00
FontSource * font_source =nullptr; ///<字符源
CharLayoutAttr *char_layout_attr =nullptr; ///<缺省字符排版属性
2020-07-20 22:22:25 +08:00
2020-07-21 17:09:24 +08:00
uint8 text_direction =0; ///<文本排列方向
TextAlign align =TextAlign::Left; ///<段落对齐
float char_gap =0.0f; ///<字间距
float line_gap =0.1f; ///<行间距(相对于字符高度)
float paragraph_gap =1.0f; ///<段间距(相对于字符高度)
2020-07-20 22:22:25 +08:00
2020-07-21 17:09:24 +08:00
float max_width =0.0f; ///<最大宽度(<=0代表无限制)
float max_height =0.0f; ///<最大高度(<=0代表无限制)
2020-07-20 22:22:25 +08:00
2020-07-21 17:09:24 +08:00
bool border_symbols_disable =true; ///<边界符号禁用(如行首禁用逗号)
// bool auto_symbols_convert =true; ///<自动符号转换(如tm/(r)/(c)等)
2020-07-20 21:29:15 +08:00
2020-07-21 17:09:24 +08:00
float space_size =0.5f; ///<半角空格尺寸(对应字符高度的系数)
float full_space_size =1.0f; ///<全角空格尺寸(对应字符高度的系数)
float tab_size =4.0f; ///<Tab符号尺寸(对应字符高度的系数)
2020-07-20 21:29:15 +08:00
2020-07-21 17:09:24 +08:00
bool compress_punctuation =false; ///<压缩标点符号
2020-07-20 22:22:25 +08:00
};//struct TextLayoutAttributes
2020-07-23 18:24:45 +08:00
using TEXT_COORD_TYPE=int; //字符必须坐标对齐显示才能不模糊,所以这里坐标系全部使用整型坐标
2020-07-20 21:29:15 +08:00
2020-07-23 18:24:45 +08:00
class TextLayout
{
protected:
2020-08-04 01:27:35 +08:00
FontSource *font_source;
2020-07-23 18:24:45 +08:00
TextLayoutAttributes tla;
protected:
TextDirection direction;
bool endless;
float splite_line_max_limit;
int draw_chars_count; ///<要绘制字符列表
2020-07-23 18:24:45 +08:00
2022-02-08 11:12:17 +08:00
SortedSets<u32char> alone_chars; ///<不重复字符统计缓冲区
TileUVFloatMap alone_chars_uv; ///<所有要绘制字符的uv
2020-07-31 18:01:28 +08:00
struct CharDrawAttr
{
2020-08-04 01:27:35 +08:00
const CLA *cla;
TileUVFloat uv;
};
ObjectList<CharDrawAttr> draw_chars_list; ///<所有字符属性列表
2020-07-23 18:24:45 +08:00
2020-08-04 01:27:35 +08:00
template<typename T> bool preprocess(TileFont *,const T *,const int);
protected:
2020-07-23 18:24:45 +08:00
bool h_splite_to_lines(float view_limit);
bool v_splite_to_lines(float view_limit);
int sl_h_l2r();
int sl_h_r2l();
int sl_v_r2l();
int sl_v_l2r();
2020-07-23 18:24:45 +08:00
2020-09-05 17:54:21 +08:00
template<typename T> int SimpleLayout(TextRenderable *,TileFont *,const String<T> &); ///<简易排版
2020-09-05 17:54:21 +08:00
// template<typename T> int SimpleLayout(TileFont *,const StringList<String<T>> &); ///<简易排版
2020-08-04 01:27:35 +08:00
2020-07-23 18:24:45 +08:00
protected:
TEXT_COORD_TYPE x,y;
TEXT_COORD_TYPE char_height;
TEXT_COORD_TYPE space_size;
TEXT_COORD_TYPE full_space_size;
TEXT_COORD_TYPE tab_size;
TEXT_COORD_TYPE char_gap;
TEXT_COORD_TYPE line_gap;
TEXT_COORD_TYPE line_height;
TEXT_COORD_TYPE paragraph_gap;
protected:
TextRenderable *text_render_obj;
2021-11-29 15:58:48 +08:00
MemBlock<int16> vertex;
MemBlock<float> tex_coord;
2020-07-23 18:24:45 +08:00
public:
TextLayout()
{
direction.text_direction=0;
draw_chars_count=0;
2020-07-23 18:24:45 +08:00
text_render_obj =nullptr;
2020-07-23 18:24:45 +08:00
}
virtual ~TextLayout()=default;
2020-09-11 17:11:32 +08:00
void SetTLA (const TextLayoutAttributes *_tla) {if(_tla)memcpy(&tla,_tla,sizeof(TextLayoutAttributes));}
void SetFont (FontSource *fs) {if(fs)font_source=fs;}
void SetTextDirection (const uint8 &td) {tla.text_direction=td;}
2020-09-11 17:11:32 +08:00
void SetAlign (const TextAlign &ta) {tla.align=ta;}
void SetMaxWidth (const float mw) {tla.max_width=mw;}
void SetMaxHeight (const float mh) {tla.max_height=mh;}
2020-07-23 18:24:45 +08:00
virtual bool Init (); ///<初始化排版
2020-07-23 18:24:45 +08:00
int SimpleLayout (TextRenderable *,TileFont *,const UTF16String &); ///<简易排版
int SimpleLayout (TextRenderable *,TileFont *,const UTF32String &); ///<简易排版
// int SimpleLayout (TileFont *,const UTF16StringList &); ///<简易排版
// int SimpleLayout (TileFont *,const UTF32StringList &); ///<简易排版
2020-07-23 18:24:45 +08:00
};//class TextLayout
}//namespace graph
}//namespace hgl
#endif//HGL_GRAPH_TEXT_LAYOUT_INCLUDE