diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e162bac..837232f 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -66,11 +66,10 @@ IF(SDL2_FOUND)
target_link_libraries(freerct ${SDL2_LIBRARY})
ENDIF()
-find_package(SDL2_ttf REQUIRED)
-# Legacy variable names
-IF(SDL2_TTF_FOUND)
- include_directories(${SDL2TTF_INCLUDE_DIR})
- target_link_libraries(freerct ${SDL2TTF_LIBRARY})
+find_package(Freetype REQUIRED)
+IF(FREETYPE_FOUND)
+ include_directories(${FREETYPE_INCLUDE_DIRS})
+ target_link_libraries(freerct ${FREETYPE_LIBRARIES})
ENDIF()
# Translated messages are bad
diff --git a/src/video.cpp b/src/video.cpp
index 11141ad..c7f3f0f 100644
--- a/src/video.cpp
+++ b/src/video.cpp
@@ -185,29 +185,17 @@ std::string VideoSystem::Initialize(const char *font_name, int font_size)
printf("Could not set window icon (%s)\n", SDL_GetError());
}
- if (TTF_Init() != 0) {
- SDL_Quit();
- delete[] this->mem;
- std::string err = "TTF font initialization failed: ";
- err += TTF_GetError();
- return err;
+ if (FT_Init_FreeType(&this->library) != 0) {
}
- this->font = TTF_OpenFont(font_name, font_size);
- if (this->font == nullptr) {
- std::string err = "TTF Opening font \"";
- err += font_name;
- err += "\" size ";
- err += std::to_string(font_size);
- err += " failed: ";
- err += TTF_GetError();
- TTF_Quit();
- SDL_Quit();
- delete[] this->mem;
- return err;
+ if (FT_New_Face(this->library, font_name, 0, &this->face) != 0) {
+ }
+
+ /** @todo use actual screen dpi? */
+ if (FT_Set_Char_Size(this->face, 0, font_size * 64, 0, 0) != 0) {
}
- this->font_height = TTF_FontLineSkip(this->font);
+ this->font_height = this->face->height / 64;
this->initialized = true;
this->dirty = true; // Ensure it gets painted.
this->missing_sprites = false;
@@ -454,8 +442,8 @@ void VideoSystem::MainLoop()
void VideoSystem::Shutdown()
{
if (this->initialized) {
- TTF_CloseFont(this->font);
- TTF_Quit();
+ FT_Done_Face(this->face);
+ FT_Done_FreeType(this->library);
SDL_Quit();
delete[] this->mem;
this->initialized = false;
@@ -856,9 +844,29 @@ void VideoSystem::BlitImages(int32 x_base, int32 y_base, const ImageData *spr, u
*/
void VideoSystem::GetTextSize(const uint8 *text, int *width, int *height)
{
- if (TTF_SizeUTF8(this->font, (const char *)text, width, height) != 0) {
- *width = 0;
- *height = 0;
+ *width = 0;
+ *height = 0;
+
+ bool use_kerning = FT_HAS_KERNING(this->face);
+ uint previous = 0;
+ FT_GlyphSlot slot = this->face->glyph;
+
+ for (int n = 0; n < strlen((const char*)text); n++) {
+ uint glyph = FT_Get_Char_Index(this->face, text[n]);
+
+ if (use_kerning && previous && glyph) {
+ FT_Vector delta;
+ FT_Get_Kerning(this->face, previous, glyph, FT_KERNING_DEFAULT, &delta);
+
+ *width += delta.x / 64;
+ }
+
+ if (FT_Load_Glyph(this->face, glyph, FT_LOAD_RENDER) != 0) {
+ }
+ *width += slot->advance.x / 64;
+ *height = std::max(*height, (int)slot->metrics.height / 64);
+
+ previous = glyph;
}
}
@@ -911,18 +919,37 @@ void VideoSystem::GetNumberRangeSize(int64 smallest, int64 biggest, int *width,
*/
void VideoSystem::BlitText(const uint8 *text, uint32 colour, int xpos, int ypos, int width, Alignment align)
{
- SDL_Color col = {0, 0, 0}; // Font colour does not matter as only the bitmap is used.
- SDL_Surface *surf = TTF_RenderUTF8_Solid(this->font, (const char *)text, col);
- if (surf == nullptr) {
- fprintf(stderr, "Rendering text failed (%s)\n", TTF_GetError());
- return;
- }
+ bool use_kerning = FT_HAS_KERNING(this->face);
+ uint previous = 0;
+ FT_GlyphSlot slot = this->face->glyph;
- if (surf->format->BitsPerPixel != 8 || surf->format->BytesPerPixel != 1) {
- fprintf(stderr, "Rendering text failed (Wrong surface format)\n");
- return;
+ for (int n = 0; n < strlen((const char*)tex); n++) {
+ uint glyph = FT_Get_Char_Index(this->face, tex[n]);
+
+ if (use_kerning && previous && glyph) {
+ FT_Vector delta;
+ FT_Get_Kerning(this->face, previous, glyph, FT_KERNING_DEFAULT, &delta);
+
+ }
+
+ if (FT_Load_Glyph(this->face, glyph, FT_LOAD_RENDER) != 0) {
+ }
+
+ for (int i = 0; i < slot->bitmap.rows; i++) {
+ for (int j = 0; j < slot->bitmap.pitch; j++) {
+ printf("%02x ", slot->bitmap.buffer[i * slot->bitmap.pitch + j]);
+ }
+ printf("\n");
+ }
+
+ printf("\n");
+
+ previous = glyph;
}
+ SDL_Surface *surf = nullptr;
+ return;
+
int real_w = std::min(surf->w, width);
switch (align) {
case ALG_LEFT:
diff --git a/src/video.h b/src/video.h
index 6f435a9..f5bbb2b 100644
--- a/src/video.h
+++ b/src/video.h
@@ -13,8 +13,11 @@
#define VIDEO_H
#include <set>
+
#include <SDL.h>
-#include <SDL_ttf.h>
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
#include "geometry.h"
#include "palette.h"
@@ -160,7 +163,9 @@ private:
bool initialized; ///< Video system is initialized.
bool dirty; ///< Video display needs being repainted.
- TTF_Font *font; ///< Opened text font.
+ FT_Library library;
+ FT_Face face;
+
SDL_Window *window; ///< %Window of the application.
SDL_Renderer *renderer; ///< GPU renderer to the application window.
SDL_Texture *texture; ///< GPU Texture storage of the application window.