Implement better error detection

This commit is contained in:
Benau 2015-11-08 10:22:40 +08:00
parent 09101e923c
commit cee7cf0b37
2 changed files with 49 additions and 25 deletions

View File

@ -31,7 +31,7 @@ namespace GUIEngine
FTEnvironment::FTEnvironment()
{
m_ft_err += FT_Init_FreeType(&(m_ft_lib));
checkError(FT_Init_FreeType(&m_ft_lib), "loading freetype library");
loadFont();
}
@ -41,12 +41,15 @@ FTEnvironment::FTEnvironment()
FTEnvironment::~FTEnvironment()
{
for (int i = 0; i < F_COUNT; ++i)
m_ft_err += FT_Done_Face(m_ft_face[i]);
checkError(FT_Done_Face(m_ft_face[i]), "removing freetype face");
m_ft_err += FT_Done_FreeType(m_ft_lib);
checkError(FT_Done_FreeType(m_ft_lib), "removing freetype library");
if (m_ft_err > 0)
{
Log::error("Freetype Environment", "Can't destroy all fonts.");
m_ft_err = 0;
}
else
Log::info("Freetype Environment", "Successfully destroy all fonts.");
}
@ -60,35 +63,46 @@ FT_Face FTEnvironment::getFace(const FontUse font)
// ----------------------------------------------------------------------------
void FTEnvironment::checkError(FT_Error err, const irr::core::stringc desc)
{
if (err)
{
Log::error("Freetype Environment", "Something wrong when %s!", desc);
m_ft_err++;
}
}
// ----------------------------------------------------------------------------
void FTEnvironment::loadFont()
{
m_ft_err += FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
checkError(FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
(FileManager::TTF, "Ubuntu-R.ttf", true)).c_str(),
0, &m_ft_face[F_DEFAULT]);
0, &m_ft_face[F_DEFAULT]), "loading F_DEFAULT");
m_ft_err += FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
checkError(FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
(FileManager::TTF, "FreeSans.ttf",true)).c_str(),
0, &m_ft_face[F_DEFAULT_FALLBACK]);
0, &m_ft_face[F_DEFAULT_FALLBACK]), "loading F_DEFAULT_FALLBACK");
m_ft_err += FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
checkError(FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
(FileManager::TTF, "wqy-microhei.ttf",true)).c_str(),
0, &m_ft_face[F_CJK]);
0, &m_ft_face[F_CJK]), "loading F_CJK");
m_ft_err += FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
checkError(FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
(FileManager::TTF, "NotoNaskhArabicUI-Bold.ttf",true)).c_str(),
0, &m_ft_face[F_AR]);
0, &m_ft_face[F_AR]), "loading F_AR");
m_ft_err += FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
checkError(FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
(FileManager::TTF, "Ubuntu-B.ttf", true)).c_str(),
0, &m_ft_face[F_BOLD]);
0, &m_ft_face[F_BOLD]), "loading F_BOLD");
m_ft_err += FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
checkError(FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
(FileManager::TTF, "FreeSansBold.ttf", true)).c_str(),
0, &m_ft_face[F_BOLD_FALLBACK]);
0, &m_ft_face[F_BOLD_FALLBACK]), "loading F_BOLD_FALLBACK");
m_ft_err += FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
checkError(FT_New_Face(m_ft_lib, (file_manager->getAssetChecked
(FileManager::TTF, "SigmarOne.otf",true)).c_str(),
0, &m_ft_face[F_DIGIT]);
0, &m_ft_face[F_DIGIT]), "loading F_DIGIT");
//Set charmap
for (int h = 0; h < F_COUNT; ++h)
@ -98,7 +112,7 @@ void FTEnvironment::loadFont()
FT_UShort pid = m_ft_face[h]->charmaps[i]->platform_id;
FT_UShort eid = m_ft_face[h]->charmaps[i]->encoding_id;
if (((pid == 0) && (eid == 3)) || ((pid == 3) && (eid == 1)))
m_ft_err += FT_Set_Charmap(m_ft_face[h], m_ft_face[h]->charmaps[i]);
checkError(FT_Set_Charmap(m_ft_face[h], m_ft_face[h]->charmaps[i]), "setting charmaps");
}
}
@ -124,16 +138,19 @@ void FTEnvironment::loadFont()
Log::info("Freetype Environment", "DPI for Title Font is %d.", title_dpi);
Log::info("Freetype Environment", "DPI for Digit Font is %d.", digit_dpi);
m_ft_err += FT_Set_Pixel_Sizes(m_ft_face[F_DEFAULT], 0, normal_dpi);
m_ft_err += FT_Set_Pixel_Sizes(m_ft_face[F_DEFAULT_FALLBACK], 0, normal_dpi);
m_ft_err += FT_Set_Pixel_Sizes(m_ft_face[F_CJK], 0, normal_dpi);
m_ft_err += FT_Set_Pixel_Sizes(m_ft_face[F_AR], 0, normal_dpi);
m_ft_err += FT_Set_Pixel_Sizes(m_ft_face[F_BOLD], 0, title_dpi);
m_ft_err += FT_Set_Pixel_Sizes(m_ft_face[F_BOLD_FALLBACK], 0, title_dpi);
m_ft_err += FT_Set_Pixel_Sizes(m_ft_face[F_DIGIT], 0, digit_dpi);
checkError(FT_Set_Pixel_Sizes(m_ft_face[F_DEFAULT], 0, normal_dpi), "setting F_DEFAULT size");
checkError(FT_Set_Pixel_Sizes(m_ft_face[F_DEFAULT_FALLBACK], 0, normal_dpi), "setting F_DEFAULT_FALLBACK size");
checkError(FT_Set_Pixel_Sizes(m_ft_face[F_CJK], 0, normal_dpi), "setting F_CJK size");
checkError(FT_Set_Pixel_Sizes(m_ft_face[F_AR], 0, normal_dpi), "setting F_AR size");
checkError(FT_Set_Pixel_Sizes(m_ft_face[F_BOLD], 0, title_dpi), "setting F_BOLD size");
checkError(FT_Set_Pixel_Sizes(m_ft_face[F_BOLD_FALLBACK], 0, title_dpi), "setting F_BOLD_FALLBACK size");
checkError(FT_Set_Pixel_Sizes(m_ft_face[F_DIGIT], 0, digit_dpi), "setting F_DIGIT size");
if (m_ft_err > 0)
{
Log::error("Freetype Environment", "Can't load all fonts.");
m_ft_err = 0;
}
else
Log::info("Freetype Environment", "Successfully loaded all fonts.");
}

View File

@ -20,6 +20,7 @@
#include <ft2build.h>
#include FT_FREETYPE_H
#include <irrlicht.h>
#include "utils/leak_check.hpp"
@ -62,6 +63,12 @@ enum TTFLoadingType {T_NORMAL, T_DIGIT, T_BOLD};
FT_Face getFace(const FontUse font);
private:
/** Check for any error discovered in a freetype function that will return a FT_Error value.
* \param err The Freetype function.
* \param desc The description of what is the function doing.
*/
void checkError(FT_Error err, const irr::core::stringc desc);
/** Load font face into memory, but don't create glyph yet.
*/
void loadFont();