Files
Seele/src/Engine/Asset/FontLoader.cpp
T

76 lines
2.4 KiB
C++
Raw Normal View History

2022-04-13 13:01:35 +02:00
#include "FontLoader.h"
#include "Graphics/Graphics.h"
#include "FontAsset.h"
#include "AssetRegistry.h"
2023-01-29 18:58:59 +01:00
#include "Graphics/GraphicsResources.h"
#include <ft2build.h>
#include FT_FREETYPE_H
2022-04-13 13:01:35 +02:00
using namespace Seele;
FontLoader::FontLoader(Gfx::PGraphics graphics)
: graphics(graphics)
{
}
FontLoader::~FontLoader()
{
}
2023-02-01 22:13:04 +01:00
void FontLoader::importAsset(FontImportArgs args)
2022-04-13 13:01:35 +02:00
{
2023-02-01 22:13:04 +01:00
std::filesystem::path assetPath = args.filePath.filename();
2022-04-13 13:01:35 +02:00
assetPath.replace_extension("asset");
2023-02-13 14:56:13 +01:00
PFontAsset asset = new FontAsset(args.importPath, assetPath.stem().string());
2022-04-13 13:01:35 +02:00
asset->setStatus(Asset::Status::Loading);
2023-02-13 14:56:13 +01:00
AssetRegistry::get().registerFont(asset);
2023-02-01 22:13:04 +01:00
import(args, asset);
2022-04-13 13:01:35 +02:00
}
2023-01-29 18:58:59 +01:00
// in case of the space character there is no bitmap
// so we create a single pixel empty texture
uint8 transparentPixel = 0;
2023-02-01 22:13:04 +01:00
void FontLoader::import(FontImportArgs args, PFontAsset asset)
2022-04-13 13:01:35 +02:00
{
2023-01-29 18:58:59 +01:00
FT_Library ft;
FT_Error error = FT_Init_FreeType(&ft);
assert(!error);
FT_Face face;
2023-02-13 14:56:13 +01:00
error = FT_New_Face(ft, args.filePath.string().c_str(), 0, &face);
2023-01-29 18:58:59 +01:00
assert(!error);
FT_Set_Pixel_Sizes(face, 0, 48);
for(uint32 c = 0; c < 256; ++c)
{
if(FT_Load_Char(face, c, FT_LOAD_RENDER))
{
std::cout << "error loading " << (char)c << std::endl;
continue;
}
FontAsset::Glyph& glyph = asset->glyphs[c];
glyph.size = IVector2(face->glyph->bitmap.width, face->glyph->bitmap.rows);
glyph.bearing = IVector2(face->glyph->bitmap_left, face->glyph->bitmap_top);
glyph.advance = face->glyph->advance.x;
TextureCreateInfo imageData;
imageData.format = Gfx::SE_FORMAT_R8_UINT;
imageData.width = face->glyph->bitmap.width;
imageData.height = face->glyph->bitmap.rows;
imageData.resourceData.data = face->glyph->bitmap.buffer;
imageData.resourceData.size = imageData.width * imageData.height;
2023-02-13 14:56:13 +01:00
if(imageData.width == 0 || imageData.height == 0)
2023-01-29 18:58:59 +01:00
{
glyph.size.x = 1;
glyph.size.y = 1;
glyph.bearing.x = 0;
glyph.bearing.y = 0;
imageData.width = 1;
imageData.height = 1;
imageData.resourceData.size = sizeof(uint8);
imageData.resourceData.data = &transparentPixel;
}
glyph.texture = graphics->createTexture2D(imageData);
}
FT_Done_Face(face);
FT_Done_FreeType(ft);
asset->setStatus(Asset::Status::Ready);
2022-04-13 13:01:35 +02:00
}