132 lines
3.5 KiB
C++
132 lines
3.5 KiB
C++
#pragma once
|
|
|
|
#include <extra2d/core/color.h>
|
|
#include <extra2d/core/math_types.h>
|
|
#include <extra2d/core/types.h>
|
|
#include <extra2d/graphics/texture/texture.h>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
|
|
namespace extra2d {
|
|
|
|
// ============================================================================
|
|
// 字形信息结构
|
|
// ============================================================================
|
|
struct Glyph {
|
|
float width = 0; // 字形宽度
|
|
float height = 0; // 字形高度
|
|
float bearingX = 0; // 水平偏移
|
|
float bearingY = 0; // 垂直偏移(从基线到字形顶部)
|
|
float advance = 0; // 水平步进
|
|
float u0 = 0, v0 = 0; // 纹理坐标左下角
|
|
float u1 = 0, v1 = 0; // 纹理坐标右上角
|
|
};
|
|
|
|
// ============================================================================
|
|
// 字体图集描述结构
|
|
// ============================================================================
|
|
struct FontAtlasDesc {
|
|
std::string filepath; // 字体文件路径
|
|
int fontSize = 16; // 字体大小
|
|
bool useSDF = false; // 是否使用SDF渲染
|
|
int atlasSize = 512; // 图集大小
|
|
int padding = 2; // 字形间距
|
|
};
|
|
|
|
// ============================================================================
|
|
// 字体图集抽象接口 - 渲染后端无关
|
|
// ============================================================================
|
|
class FontAtlas {
|
|
public:
|
|
virtual ~FontAtlas() = default;
|
|
|
|
/**
|
|
* @brief 初始化字体图集
|
|
* @param desc 字体图集描述
|
|
* @return 成功返回 true
|
|
*/
|
|
virtual bool init(const FontAtlasDesc& desc) = 0;
|
|
|
|
/**
|
|
* @brief 关闭字体图集,释放资源
|
|
*/
|
|
virtual void shutdown() = 0;
|
|
|
|
/**
|
|
* @brief 获取字形信息
|
|
* @param codepoint Unicode 码点
|
|
* @return 字形信息指针,未找到返回 nullptr
|
|
*/
|
|
virtual const Glyph* getGlyph(char32_t codepoint) const = 0;
|
|
|
|
/**
|
|
* @brief 获取纹理
|
|
* @return 纹理对象
|
|
*/
|
|
virtual Ptr<Texture> getTexture() const = 0;
|
|
|
|
/**
|
|
* @brief 获取字体大小
|
|
* @return 字体大小
|
|
*/
|
|
virtual int getFontSize() const = 0;
|
|
|
|
/**
|
|
* @brief 获取行高
|
|
* @return 行高
|
|
*/
|
|
virtual float getLineHeight() const = 0;
|
|
|
|
/**
|
|
* @brief 获取基线到顶部的距离
|
|
* @return 上升高度
|
|
*/
|
|
virtual float getAscent() const = 0;
|
|
|
|
/**
|
|
* @brief 获取基线到底部的距离
|
|
* @return 下降高度
|
|
*/
|
|
virtual float getDescent() const = 0;
|
|
|
|
/**
|
|
* @brief 计算文本宽度
|
|
* @param text 文本内容
|
|
* @return 文本宽度
|
|
*/
|
|
virtual float measureText(const std::string& text) const = 0;
|
|
|
|
/**
|
|
* @brief 计算文本尺寸
|
|
* @param text 文本内容
|
|
* @return 文本尺寸
|
|
*/
|
|
virtual Size measureTextSize(const std::string& text) const = 0;
|
|
|
|
/**
|
|
* @brief 是否使用SDF渲染
|
|
* @return 使用SDF返回 true
|
|
*/
|
|
virtual bool isSDF() const = 0;
|
|
|
|
/**
|
|
* @brief 检查字体图集是否有效
|
|
* @return 有效返回 true
|
|
*/
|
|
virtual bool isValid() const = 0;
|
|
|
|
/**
|
|
* @brief 预加载字符到图集
|
|
* @param text 需要预加载的文本
|
|
* @return 成功加载的字符数
|
|
*/
|
|
virtual int preloadGlyphs(const std::string& text) = 0;
|
|
|
|
/**
|
|
* @brief 清空已加载的字形缓存
|
|
*/
|
|
virtual void clearCache() = 0;
|
|
};
|
|
|
|
} // namespace extra2d
|