About 3/4 done with new font system

This commit is contained in:
2023-06-09 23:12:10 -07:00
parent c6d0801db0
commit 4acf77257a
23 changed files with 383 additions and 332 deletions

View File

@ -6,7 +6,6 @@
# Sources
target_sources(${DAWN_TARGET_NAME}
PRIVATE
FontManager.cpp
BitmapFont.cpp
ExampleFont.cpp
TrueTypeFont.cpp

View File

@ -1,24 +0,0 @@
// Copyright (c) 2023 Dominic Masters
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
#include "FontManager.hpp"
using namespace Dawn;
FontManager::FontManager() {
}
void FontManager::init() {
// Init FreeType
if(FT_Init_FreeType(&fontLibrary)) {
std::cout << "ERROR::FREETYPE: Could not init FreeType Library" << std::endl;
assertUnreachable();
}
}
FontManager::~FontManager() {
}

View File

@ -1,23 +0,0 @@
// Copyright (c) 2023 Dominic Masters
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
#pragma once
#include "dawnlibs.hpp"
#include "assert/assert.hpp"
namespace Dawn {
class FontManager {
protected:
public:
FT_Library fontLibrary;
FontManager();
void init();
~FontManager();
};
}

View File

@ -6,7 +6,6 @@
# Sources
target_sources(${DAWN_TARGET_NAME}
PRIVATE
NewTrueType.cpp
NewTrueTypeFace.cpp
NewTrueTypeFaceTexture.hpp
NewTrueTypeFaceTexture.cpp
)

View File

@ -1,28 +0,0 @@
// Copyright (c) 2023 Dominic Masters
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
#include "NewTrueType.hpp"
using namespace Dawn;
NewTrueType::NewTrueType(FontManager *fontMan) {
assertNotNull(fontMan);
this->fontManager = fontMan;
}
void NewTrueType::addStyle(flag_t style) {
assertTrue(this->faces.find(style) == this->faces.end());
//Create the face
this->faces[style] = new NewTrueTypeFace();
}
NewTrueType::~NewTrueType() {
auto it = this->faces.begin();
while(it != this->faces.end()) {
delete it->second;
it++;
}
}

View File

@ -1,24 +0,0 @@
// Copyright (c) 2023 Dominic Masters
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
#pragma once
#include "NewTrueTypeFace.hpp"
#include "display/font/FontManager.hpp"
namespace Dawn {
class NewTrueType {
protected:
std::map<flag_t, NewTrueTypeFace*> faces;
FontManager *fontManager;
public:
NewTrueType(FontManager *fontMan);
void addStyle(flag_t style);
NewTrueTypeFace * getFace(flag_t style);
~NewTrueType();
friend class NewTrueTypeFace;
};
}

View File

@ -3,7 +3,7 @@
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
#include "NewTrueType.hpp"
#include "asset/assets/NewTrueTypeAsset.hpp"
using namespace Dawn;
@ -15,17 +15,10 @@ usagelockid_t NewTrueTypeFace::lock(struct NewTrueTypeFaceTextureStyle style) {
NewTrueTypeFaceTexture *texture = nullptr;
auto existing = this->texturesByStyle.find(style);
if(existing == this->texturesByStyle.end()) {
// Load face
FT_Face face;
assertUnreachable();
// Does not exist, create it.
texture = new NewTrueTypeFaceTexture(this, face, style);
this->textures.push_back(texture);
this->texturesByStyle[style] = texture;
// Cleanup face
FT_Done_Face(face);
} else {
texture = existing->second;
}
@ -48,6 +41,7 @@ NewTrueTypeFaceTexture * NewTrueTypeFace::getTexture(usagelockid_t lock) {
void NewTrueTypeFace::unlock(usagelockid_t lock) {
auto texture = this->getTexture(lock);
assertNotNull(texture);
texture->locks.removeLock(lock);
this->stylesByLock.erase(lock);
auto it = std::find(this->locksByStyle[texture->style].begin(), this->locksByStyle[texture->style].end(), lock);
@ -59,6 +53,5 @@ NewTrueTypeFace::~NewTrueTypeFace() {
auto it = this->textures.begin();
while(it != this->textures.end()) {
delete *it;
it = this->textures.erase(it);
}
}

View File

@ -8,13 +8,13 @@
namespace Dawn {
class NewTrueTypeFace {
protected:
public:
std::vector<NewTrueTypeFaceTexture*> textures;
std::map<struct NewTrueTypeFaceTextureStyle, NewTrueTypeFaceTexture*> texturesByStyle;
std::map<struct NewTrueTypeFaceTextureStyle, std::vector<usagelockid_t>> locksByStyle;
std::map<usagelockid_t, struct NewTrueTypeFaceTextureStyle> stylesByLock;
FT_Face face;
public:
/**
* Create a new TrueTypeFace object. TrueType face holds multiple textures
* of various styles of this face. This face may be "Arial Bold" and have
@ -51,7 +51,5 @@ namespace Dawn {
* Destroys this TrueTypeFace object, and all textures associated with it.
*/
~NewTrueTypeFace();
friend class NewTrueType;
};
}

View File

@ -3,7 +3,7 @@
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
#include "NewTrueTypeFaceTexture.hpp"
#include "NewTrueTypeFace.hpp"
using namespace Dawn;
@ -13,11 +13,15 @@ NewTrueTypeFaceTexture::NewTrueTypeFaceTexture(
struct NewTrueTypeFaceTextureStyle style
) {
assertNotNull(trueTypeFace);
assertTrue(this->style.fontSize < 256);
assertTrue(style.fontSize < 256);
this->trueTypeFace = trueTypeFace;
this->face = &face;
this->style = style;
this->locks.onEmpty = [&]() {
delete this;
};
// Set freetype font size prior to baking.
if(FT_Set_Pixel_Sizes(face, 0, this->style.fontSize)) {
@ -85,4 +89,14 @@ NewTrueTypeFaceTexture::NewTrueTypeFaceTexture(
struct NewTrueTypeCharacter NewTrueTypeFaceTexture::getCharacterData(FT_ULong c) {
return this->characterData[c];
}
NewTrueTypeFaceTexture::~NewTrueTypeFaceTexture() {
auto it = std::find(
this->trueTypeFace->textures.begin(),
this->trueTypeFace->textures.end(),
this
);
assertTrue(it != this->trueTypeFace->textures.end());
this->trueTypeFace->textures.erase(it);
}

View File

@ -11,7 +11,6 @@
namespace Dawn {
class NewTrueTypeFace;
class NewTrueType;
typedef uint32_t newtruetypelock_t;
@ -26,17 +25,19 @@ namespace Dawn {
struct NewTrueTypeFaceTextureStyle {
uint32_t fontSize;
flag_t style;
bool operator < (const struct NewTrueTypeFaceTextureStyle& r) const {
return std::tie(fontSize, style) < std::tie(r.fontSize, r.style);
}
};
class NewTrueTypeFaceTexture {
protected:
public:
FT_Face *face;
NewTrueTypeFace *trueTypeFace;
std::map<FT_ULong, struct NewTrueTypeCharacter> characterData;
struct NewTrueTypeFaceTextureStyle style;
UsageLock locks;
public:
Texture texture;
/**
@ -66,6 +67,5 @@ namespace Dawn {
~NewTrueTypeFaceTexture();
friend class NewTrueTypeFace;
friend class NewTrueType;
};
}