mirror of
https://github.com/MihailRis/voxelcore.git
synced 2026-10-10 21:41:50 +00:00
cleanup
This commit is contained in:
parent
ae54ac9975
commit
381cb77d08
2 changed files with 42 additions and 23 deletions
|
|
@ -5,6 +5,7 @@
|
||||||
#include "graphics/core/ImageData.hpp"
|
#include "graphics/core/ImageData.hpp"
|
||||||
#include "graphics/core/Texture.hpp"
|
#include "graphics/core/Texture.hpp"
|
||||||
#include "graphics/core/Font.hpp"
|
#include "graphics/core/Font.hpp"
|
||||||
|
#include "constants.hpp"
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <ft2build.h>
|
#include <ft2build.h>
|
||||||
|
|
@ -38,11 +39,6 @@ namespace {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Font> createInstance(int size) override {
|
std::unique_ptr<Font> createInstance(int size) override {
|
||||||
int pagesCount = 5;
|
|
||||||
|
|
||||||
std::vector<std::unique_ptr<Texture>> pages;
|
|
||||||
std::vector<Font::Glyph> glyphs;
|
|
||||||
|
|
||||||
if (FT_Error error = FT_Set_Pixel_Sizes(face, 0, size)) {
|
if (FT_Error error = FT_Set_Pixel_Sizes(face, 0, size)) {
|
||||||
throw std::runtime_error(
|
throw std::runtime_error(
|
||||||
"FT_Set_Pixel_Sizes error: " +
|
"FT_Set_Pixel_Sizes error: " +
|
||||||
|
|
@ -50,26 +46,15 @@ namespace {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<std::unique_ptr<Texture>> pages;
|
||||||
|
std::vector<Font::Glyph> glyphs;
|
||||||
|
|
||||||
int dstSize = size * 16;
|
int dstSize = size * 16;
|
||||||
ImageData canvas(ImageFormat::RGBA8888, dstSize, dstSize);
|
ImageData canvas(ImageFormat::RGBA8888, dstSize, dstSize);
|
||||||
|
ImageData bitmapDst(ImageFormat::RGBA8888, size, size);
|
||||||
|
|
||||||
int srcWidth = size;
|
for (int pageid = 0; pageid < FONT_PAGES; pageid++) {
|
||||||
int srcHeight = size;
|
renderPage(pageid, canvas, bitmapDst, glyphs);
|
||||||
ImageData bitmapDst(ImageFormat::RGBA8888, srcWidth, srcHeight);
|
|
||||||
|
|
||||||
for (int pageid = 0; pageid < pagesCount; pageid++) {
|
|
||||||
for (int c = 0; c < 256; c++) {
|
|
||||||
if (!renderGlyph(pageid << 8 | c, bitmapDst)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
canvas.blit(bitmapDst, (c % 16) * size, (c / 16) * size);
|
|
||||||
glyphs.push_back(Font::Glyph {
|
|
||||||
face->glyph->bitmap_top - size,
|
|
||||||
static_cast<int>(face->glyph->advance.x >> 6)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
canvas.flipY();
|
|
||||||
pages.push_back(Texture::from(&canvas));
|
pages.push_back(Texture::from(&canvas));
|
||||||
}
|
}
|
||||||
return std::make_unique<Font>(
|
return std::make_unique<Font>(
|
||||||
|
|
@ -88,9 +73,12 @@ namespace {
|
||||||
logger.warning() << get_ft_error_message(error);
|
logger.warning() << get_ft_error_message(error);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
const FT_Bitmap& bitmap = face->glyph->bitmap;
|
|
||||||
auto dstData = bitmapDst.getData();
|
auto dstData = bitmapDst.getData();
|
||||||
std::memset(dstData, 0, bitmapDst.getDataSize());
|
std::memset(dstData, 0, bitmapDst.getDataSize());
|
||||||
|
if (face->glyph->bitmap.width == 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const FT_Bitmap& bitmap = face->glyph->bitmap;
|
||||||
for (int row = 0; row < std::min<int>(bitmap.rows, height); row++) {
|
for (int row = 0; row < std::min<int>(bitmap.rows, height); row++) {
|
||||||
for (int col = 0; col < std::min<int>(bitmap.width, width); col++) {
|
for (int col = 0; col < std::min<int>(bitmap.width, width); col++) {
|
||||||
uint8_t value = bitmap.buffer[row * bitmap.pitch + col];
|
uint8_t value = bitmap.buffer[row * bitmap.pitch + col];
|
||||||
|
|
@ -102,6 +90,35 @@ namespace {
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void renderPage(
|
||||||
|
int pageid,
|
||||||
|
ImageData& canvas,
|
||||||
|
ImageData& bitmapDst,
|
||||||
|
std::vector<Font::Glyph>& glyphs
|
||||||
|
) {
|
||||||
|
int size = canvas.getWidth() / 16;
|
||||||
|
for (int c = 0; c < 256; c++) {
|
||||||
|
int codepoint = pageid << 8 | c;
|
||||||
|
if (!renderGlyph(codepoint, bitmapDst)) {
|
||||||
|
glyphs.push_back(Font::Glyph {0, size / 2});
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
canvas.blit(bitmapDst, (c % 16) * size, (c / 16) * size);
|
||||||
|
|
||||||
|
Font::Glyph glyph {
|
||||||
|
face->glyph->bitmap_top - size,
|
||||||
|
static_cast<int>(face->glyph->advance.x >> 6)
|
||||||
|
};
|
||||||
|
if (codepoint < glyphs.size()) {
|
||||||
|
glyphs[codepoint] = std::move(glyph);
|
||||||
|
} else {
|
||||||
|
glyphs.push_back(std::move(glyph));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
canvas.flipY();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,8 @@ inline constexpr int ATLAS_EXTRUSION = 2;
|
||||||
|
|
||||||
inline constexpr int DEFAULT_FONT_SIZE = 16;
|
inline constexpr int DEFAULT_FONT_SIZE = 16;
|
||||||
|
|
||||||
|
inline constexpr int FONT_PAGES = 5;
|
||||||
|
|
||||||
inline const std::string SHADERS_FOLDER = "shaders";
|
inline const std::string SHADERS_FOLDER = "shaders";
|
||||||
inline const std::string TEXTURES_FOLDER = "textures";
|
inline const std::string TEXTURES_FOLDER = "textures";
|
||||||
inline const std::string FONTS_FOLDER = "fonts";
|
inline const std::string FONTS_FOLDER = "fonts";
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue