SmartGUI 定位為與具體渲染引擎無關的 GUI 庫,因此字體系統需提供統一介面,由外掛實現具體渲染。核心抽象包含三大類:紋理/位圖、字體、基本圖元繪製。本文聚焦字體介面設計。
class GUI_EXPORT GFont : public Object {
public:
static const int LEFT = -1, TOP = -1, CENTER = 0, RIGHT = 1, BOTTOM = 1;
virtual ~GFont();
virtual gstring GetFileName() const = 0;
virtual int GetFontSize() = 0;
virtual int GetLineHeight() const = 0;
virtual int GetWidth(const gstring& text) const = 0;
virtual int GetHitCharIndex(const gstring& text, float offset) const = 0;
virtual void Render(const gstring& text, const Recti& area,
int halignment = CENTER, int valignment = CENTER,
bool oneline = true) = 0;
DECLARE_OBJECT(GFont)
};
關鍵設計點:
GFontFactory 負責根據字體文件名與大小創建字體實例:
class GUI_EXPORT GFontFactory : public Object {
virtual ~GFontFactory();
virtual boost::shared_ptr<GFont> CreateFont(const gstring& font, int size) = 0;
DECLARE_OBJECT(GFontFactory)
};
GFontManager 為單例,繼承自 Manager<shared_ptr<GFont>> 與 GSerializer,提供:
AddFont(name, fontFile, size, del)SetFontFactory 供渲染外掛注入具體工廠實現(標記 apiuse)字體系統體現抽象工廠(GFontFactory)、單例(GFontManager)、策略(不同渲染後端實現 GFont)等模式。介面穩定,未來擴展僅需增加介面方法,不影響現有架構。