From 56d76f4ebc3321a755d20b0b706e02e96b7b1198 Mon Sep 17 00:00:00 2001 From: "M. Liebmann" Date: Fri, 27 Nov 2015 12:11:41 +0100 Subject: [PATCH] CNeutrinoFonts: Add 'getDynFontExt()' for create custom fonts... ...in external plugins --- src/driver/neutrinofonts.cpp | 81 ++++++++++++++++++++++++++++++++---- src/driver/neutrinofonts.h | 10 +++++ 2 files changed, 84 insertions(+), 7 deletions(-) diff --git a/src/driver/neutrinofonts.cpp b/src/driver/neutrinofonts.cpp index d0a2b6ad0..4dc538f65 100644 --- a/src/driver/neutrinofonts.cpp +++ b/src/driver/neutrinofonts.cpp @@ -69,17 +69,22 @@ CNeutrinoFonts::CNeutrinoFonts() InitDynFonts(); } +void CNeutrinoFonts::clearDynFontStruct(dyn_font_t* f) +{ + f->dx = 0; + f->dy = 0; + f->size = 0; + f->style = 0; + f->text = ""; + f->font = NULL; + f->useDigitOffset = false; +} + void CNeutrinoFonts::InitDynFonts() { for (int i = 0; i < FONT_ID_MAX; i++) { dyn_font_t dyn_font; - dyn_font.dx = 0; - dyn_font.dy = 0; - dyn_font.size = 0; - dyn_font.style = 0; - dyn_font.text = ""; - dyn_font.font = NULL; - dyn_font.useDigitOffset = false; + clearDynFontStruct(&dyn_font); v_dyn_fonts.push_back(dyn_font); } } @@ -97,6 +102,8 @@ CNeutrinoFonts::~CNeutrinoFonts() delete v_dyn_fonts[i].font; v_dyn_fonts.clear(); } + + deleteDynFontExtAll(); } CNeutrinoFonts* CNeutrinoFonts::getInstance() @@ -344,6 +351,66 @@ Font **CNeutrinoFonts::getDynFontWithID(int &dx, int &dy, std::string text, int return ret; } +void CNeutrinoFonts::initDynFontExt() +{ + for (int i = 0; i < DYNFONTEXT_MAX; i++) { + dyn_font_t dyn_font; + clearDynFontStruct(&dyn_font); + v_dyn_fonts_ext.push_back(dyn_font); + } +} + +void CNeutrinoFonts::deleteDynFontExtAll() +{ + if (!v_dyn_fonts_ext.empty()) { + for (size_t i = 0; i < v_dyn_fonts_ext.size(); ++i) { + if (v_dyn_fonts_ext[i].font != NULL) + delete v_dyn_fonts_ext[i].font; + } + v_dyn_fonts_ext.clear(); + } +} + +Font *CNeutrinoFonts::getDynFontExt(int &dx, int &dy, unsigned int f_id, std::string text/*=""*/, int style/*=FONT_STYLE_REGULAR*/) +{ + if ((dx <= 0) && (dy <= 0)) + return NULL; + if ((fontDescr.name.empty()) || (fontDescr.filename.empty())) + SetupNeutrinoFonts(); + if (g_dynFontRenderer == NULL) + SetupDynamicFonts(); + if (v_dyn_fonts_ext.empty()) + initDynFontExt(); + + int dynSize = getDynFontSize(dx, dy, text, style); + Font *dynFont = NULL; + Font *ret = NULL; + + if (f_id < v_dyn_fonts_ext.size()) { + dynFont = g_dynFontRenderer->getFont(fontDescr.name.c_str(), dynFontStyle[style].c_str(), dynSize); + if (v_dyn_fonts_ext[f_id].font != NULL) + delete v_dyn_fonts_ext[f_id].font; + v_dyn_fonts_ext[f_id].dx = dx; + v_dyn_fonts_ext[f_id].dy = dy; + v_dyn_fonts_ext[f_id].size = dynSize; + v_dyn_fonts_ext[f_id].style = style; + v_dyn_fonts_ext[f_id].text = text; + v_dyn_fonts_ext[f_id].font = dynFont; + v_dyn_fonts_ext[f_id].useDigitOffset = useDigitOffset; + ret = v_dyn_fonts_ext[f_id].font; + } + else + return NULL; + + dy = ret->getHeight(); + if (!text.empty()) + dx = ret->getRenderWidth(text); +#ifdef DEBUG_NFONTS + printf("##### [%s] dx: %d, dy: %d, dynSize: %d, dynFont: %p, ret: %p, FontID: %d\n", __FUNCTION__, dx, dy, dynSize, *ret, ret, f_id); +#endif + return ret; +} + Font **CNeutrinoFonts::getDynFontShare(int &dx, int &dy, std::string text, int style) { if ((dx <= 0) && (dy <= 0)) diff --git a/src/driver/neutrinofonts.h b/src/driver/neutrinofonts.h index ce6e623c2..6073f0dba 100644 --- a/src/driver/neutrinofonts.h +++ b/src/driver/neutrinofonts.h @@ -70,6 +70,7 @@ class CNeutrinoFonts typedef std::vector v_dyn_fonts_t; v_dyn_fonts_t v_share_fonts; v_dyn_fonts_t v_dyn_fonts; + v_dyn_fonts_t v_dyn_fonts_ext; bool useDigitOffset; void InitDynFonts(); @@ -78,6 +79,8 @@ class CNeutrinoFonts int getDynFontSize(int dx, int dy, std::string text, int style); Font **getDynFontShare(int &dx, int &dy, std::string text, int style); Font **getDynFontWithID(int &dx, int &dy, std::string text, int style, unsigned int f_id); + void clearDynFontStruct(dyn_font_t* f); + void initDynFontExt(); public: enum { @@ -104,6 +107,10 @@ class CNeutrinoFonts FONTSETUP_ALL = FONTSETUP_NEUTRINO_FONT | FONTSETUP_NEUTRINO_FONT_INST | FONTSETUP_DYN_FONT | FONTSETUP_DYN_FONT_INST }; + enum { + DYNFONTEXT_MAX = 16 + }; + CNeutrinoFonts(); ~CNeutrinoFonts(); static CNeutrinoFonts* getInstance(); @@ -116,6 +123,9 @@ class CNeutrinoFonts void refreshDynFonts(); Font **getDynFont(int &dx, int &dy, std::string text="", int style=FONT_STYLE_REGULAR, int share=FONT_ID_SHARE); void setFontUseDigitHeight(bool set=true) {useDigitOffset = set;} + + Font *getDynFontExt(int &dx, int &dy, unsigned int f_id, std::string text="", int style=FONT_STYLE_REGULAR); + void deleteDynFontExtAll(); };