Extra2D/Extra2D/include/extra2d/graphics/resources/font_atlas.h

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