From 9f3eddda4befaf04c0c1a08983f210ee7c77b8ea Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sat, 17 May 2014 18:31:23 +0300 Subject: Move font.cpp/h into fonts directory. --- src/CMakeLists.txt | 4 +- src/Makefile.am | 4 +- src/being/being.cpp | 3 +- src/flooritem.cpp | 3 +- src/game.cpp | 3 +- src/gui/font.cpp | 657 ----------------------------- src/gui/font.h | 214 ---------- src/gui/fonts/font.cpp | 657 +++++++++++++++++++++++++++++ src/gui/fonts/font.h | 214 ++++++++++ src/gui/gui.cpp | 3 +- src/gui/models/serverslistmodel.h | 3 +- src/gui/popups/beingpopup.cpp | 3 +- src/gui/popups/itempopup.cpp | 3 +- src/gui/popups/speechbubble.cpp | 3 +- src/gui/popups/statuspopup.cpp | 2 +- src/gui/popups/textpopup.cpp | 2 +- src/gui/viewport.cpp | 3 +- src/gui/widgets/avatarlistbox.cpp | 3 +- src/gui/widgets/browserbox.cpp | 3 +- src/gui/widgets/button.cpp | 3 +- src/gui/widgets/checkbox.cpp | 3 +- src/gui/widgets/colorpage.cpp | 3 +- src/gui/widgets/dropdown.cpp | 3 +- src/gui/widgets/dropshortcutcontainer.cpp | 3 +- src/gui/widgets/emoteshortcutcontainer.cpp | 3 +- src/gui/widgets/extendedlistbox.cpp | 3 +- src/gui/widgets/itemcontainer.cpp | 3 +- src/gui/widgets/itemshortcutcontainer.cpp | 3 +- src/gui/widgets/label.cpp | 3 +- src/gui/widgets/listbox.cpp | 3 +- src/gui/widgets/progressbar.cpp | 3 +- src/gui/widgets/radiobutton.cpp | 3 +- src/gui/widgets/serverslistbox.h | 2 +- src/gui/widgets/setupitem.cpp | 3 +- src/gui/widgets/shoplistbox.cpp | 3 +- src/gui/widgets/sliderlist.cpp | 3 +- src/gui/widgets/spellshortcutcontainer.cpp | 3 +- src/gui/widgets/tabs/setup_colors.cpp | 3 +- src/gui/widgets/textbox.cpp | 3 +- src/gui/widgets/textfield.cpp | 3 +- src/gui/widgets/textpreview.cpp | 3 +- src/gui/widgets/window.cpp | 3 +- src/gui/windows/confirmdialog.cpp | 4 +- src/gui/windows/equipmentwindow.cpp | 3 +- src/gui/windows/inventorywindow.cpp | 3 +- src/gui/windows/npcdialog.cpp | 3 +- src/gui/windows/okdialog.cpp | 4 +- src/gui/windows/questswindow.cpp | 3 +- src/gui/windows/serverdialog.cpp | 3 +- src/gui/windows/skilldialog.cpp | 3 +- src/gui/windows/textdialog.cpp | 2 +- src/gui/windows/tradewindow.cpp | 3 +- src/particle/textparticle.cpp | 3 +- src/resources/map/mapitem.cpp | 3 +- src/text.cpp | 3 +- src/touchmanager.cpp | 3 +- 56 files changed, 971 insertions(+), 927 deletions(-) delete mode 100644 src/gui/font.cpp delete mode 100644 src/gui/font.h create mode 100644 src/gui/fonts/font.cpp create mode 100644 src/gui/fonts/font.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c75791cb4..404604a65 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -425,8 +425,8 @@ SET(SRCS gui/widgets/tabs/setup_visual.cpp gui/widgets/tabs/setup_visual.h gui/setupactiondata.h - gui/font.cpp - gui/font.h + gui/fonts/font.cpp + gui/fonts/font.h gui/windows/shopwindow.cpp gui/windows/shopwindow.h gui/windows/shortcutwindow.cpp diff --git a/src/Makefile.am b/src/Makefile.am index 2802cb926..4fa1097d4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -522,8 +522,8 @@ manaplus_SOURCES += gui/widgets/avatarlistbox.cpp \ gui/widgets/tabs/setup_visual.cpp \ gui/widgets/tabs/setup_visual.h \ gui/setupactiondata.h \ - gui/font.cpp \ - gui/font.h \ + gui/fonts/font.cpp \ + gui/fonts/font.h \ gui/windows/shopwindow.cpp \ gui/windows/shopwindow.h \ gui/windows/shortcutwindow.cpp \ diff --git a/src/being/being.cpp b/src/being/being.cpp index d3df414c5..479109c2e 100644 --- a/src/being/being.cpp +++ b/src/being/being.cpp @@ -43,9 +43,10 @@ #include "particle/particle.h" #include "particle/particleinfo.h" -#include "gui/font.h" #include "gui/gui.h" +#include "gui/fonts/font.h" + #include "gui/popups/speechbubble.h" #include "gui/windows/equipmentwindow.h" diff --git a/src/flooritem.cpp b/src/flooritem.cpp index 3b5992883..4abe9047f 100644 --- a/src/flooritem.cpp +++ b/src/flooritem.cpp @@ -26,10 +26,11 @@ #include "render/graphics.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/userpalette.h" +#include "gui/fonts/font.h" + #include "resources/iteminfo.h" #include "resources/db/itemdb.h" diff --git a/src/game.cpp b/src/game.cpp index 6b265424a..34305cec2 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -49,11 +49,12 @@ #include "input/keyboardconfig.h" #include "gui/chatconsts.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/viewport.h" #include "gui/windowmenu.h" +#include "gui/fonts/font.h" + #include "gui/windows/botcheckerwindow.h" #include "gui/windows/debugwindow.h" #include "gui/windows/didyouknowwindow.h" diff --git a/src/gui/font.cpp b/src/gui/font.cpp deleted file mode 100644 index 9eef7fbcd..000000000 --- a/src/gui/font.cpp +++ /dev/null @@ -1,657 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2009 Aethyra Development Team - * Copyright (C) 2011-2014 The ManaPlus Developers - * - * This file is part of The ManaPlus Client. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* _______ __ __ __ ______ __ __ _______ __ __ - * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ - * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / - * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / - * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / - * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / - * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ - * - * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson - * - * - * Per Larsson a.k.a finalman - * Olof Naessén a.k.a jansem/yakslem - * - * Visit: http://guichan.sourceforge.net - * - * License: (BSD) - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name of Guichan nor the names of its contributors may - * be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "gui/font.h" - -#include "logger.h" -#include "main.h" - -#include "render/sdlgraphics.h" - -#include "resources/image.h" -#include "resources/imagehelper.h" -#include "resources/resourcemanager.h" -#include "resources/surfaceimagehelper.h" - -#include "utils/delete2.h" -#include "utils/paths.h" -#include "utils/sdlcheckutils.h" -#include "utils/stringutils.h" -#include "utils/timer.h" - -#include "debug.h" - -const unsigned int CACHE_SIZE = 256; -const unsigned int CACHE_SIZE_SMALL1 = 2; -const unsigned int CACHE_SIZE_SMALL2 = 50; -const unsigned int CACHE_SIZE_SMALL3 = 170; -const unsigned int CLEAN_TIME = 7; -const int OUTLINE_SIZE = 1; - -bool Font::mSoftMode(false); - -char *strBuf = nullptr; - -#ifdef UNITTESTS -int sdlTextChunkCnt = 0; -#endif - -SDLTextChunkSmall::SDLTextChunkSmall(const std::string &text0, - const Color &color0, - const Color &color1) : - text(text0), - color(color0), - color2(color1) -{ -} - -SDLTextChunkSmall::SDLTextChunkSmall(const SDLTextChunkSmall &old) : - text(old.text), - color(old.color), - color2(old.color2) -{ -} - -bool SDLTextChunkSmall::operator==(const SDLTextChunkSmall &chunk) const -{ - return (chunk.text == text && chunk.color == color - && chunk.color2 == color2); -} - -bool SDLTextChunkSmall::operator<(const SDLTextChunkSmall &chunk) const -{ - if (chunk.text != text) - return chunk.text > text; - - const Color &c = chunk.color; - if (c.r != color.r) - return c.r > color.r; - if (c.g != color.g) - return c.g > color.g; - if (c.b != color.b) - return c.b > color.b; - - const Color &c2 = chunk.color2; - if (c2.r != color2.r) - return c2.r > color2.r; - if (c2.g != color2.g) - return c2.g > color2.g; - if (c2.b != color2.b) - return c2.b > color2.b; - - if (c.a != color.a && Font::mSoftMode) - return c.a > color.a; - - return false; -} - -SDLTextChunk::SDLTextChunk(const std::string &text0, const Color &color0, - const Color &color1) : - img(nullptr), - text(text0), - color(color0), - color2(color1), - prev(nullptr), - next(nullptr) -{ -#ifdef UNITTESTS - sdlTextChunkCnt ++; -#endif -} - -SDLTextChunk::~SDLTextChunk() -{ - delete2(img); -#ifdef UNITTESTS - sdlTextChunkCnt --; -#endif -} - -bool SDLTextChunk::operator==(const SDLTextChunk &chunk) const -{ - return (chunk.text == text && chunk.color == color - && chunk.color2 == color2); -} - -void SDLTextChunk::generate(TTF_Font *const font, const float alpha) -{ - BLOCK_START("SDLTextChunk::generate") - SDL_Color sdlCol; - sdlCol.b = static_cast(color.b); - sdlCol.r = static_cast(color.r); - sdlCol.g = static_cast(color.g); -#ifdef USE_SDL2 - sdlCol.a = 255; -#else - sdlCol.unused = 0; -#endif - - getSafeUtf8String(text, strBuf); - - SDL_Surface *surface = MTTF_RenderUTF8_Blended( - font, strBuf, sdlCol); - - if (!surface) - { - img = nullptr; - BLOCK_END("SDLTextChunk::generate") - return; - } - - const int width = surface->w; - const int height = surface->h; - - if (color.r != color2.r || color.g != color2.g - || color.b != color2.b) - { // outlining - SDL_Color sdlCol2; - SDL_Surface *const background = imageHelper->create32BitSurface( - width, height); - if (!background) - { - img = nullptr; - MSDL_FreeSurface(surface); - BLOCK_END("SDLTextChunk::generate") - return; - } - sdlCol2.b = static_cast(color2.b); - sdlCol2.r = static_cast(color2.r); - sdlCol2.g = static_cast(color2.g); -#ifdef USE_SDL2 - sdlCol2.a = 255; -#else - sdlCol2.unused = 0; -#endif - SDL_Surface *const surface2 = MTTF_RenderUTF8_Blended( - font, strBuf, sdlCol2); - if (!surface2) - { - img = nullptr; - MSDL_FreeSurface(surface); - BLOCK_END("SDLTextChunk::generate") - return; - } - SDL_Rect rect = - { - OUTLINE_SIZE, - 0, - static_cast(surface->w), - static_cast(surface->h) - }; - SurfaceImageHelper::combineSurface(surface2, nullptr, - background, &rect); - rect.x = -OUTLINE_SIZE; - SurfaceImageHelper::combineSurface(surface2, nullptr, - background, &rect); - rect.x = 0; - rect.y = -OUTLINE_SIZE; - SurfaceImageHelper::combineSurface(surface2, nullptr, - background, &rect); - rect.y = OUTLINE_SIZE; - SurfaceImageHelper::combineSurface(surface2, nullptr, - background, &rect); - rect.x = 0; - rect.y = 0; - SurfaceImageHelper::combineSurface(surface, nullptr, - background, &rect); - MSDL_FreeSurface(surface); - MSDL_FreeSurface(surface2); - surface = background; - } - img = imageHelper->createTextSurface( - surface, width, height, alpha); - MSDL_FreeSurface(surface); - - BLOCK_END("SDLTextChunk::generate") -} - - -TextChunkList::TextChunkList() : - start(nullptr), - end(nullptr), - size(0), - search(), - searchWidth() -{ -} - -void TextChunkList::insertFirst(SDLTextChunk *const item) -{ - SDLTextChunk *const oldFirst = start; - if (start) - start->prev = item; - item->prev = nullptr; - if (oldFirst) - item->next = oldFirst; - else - end = item; - start = item; - size ++; - search[SDLTextChunkSmall(item->text, item->color, item->color2)] = item; - searchWidth[item->text] = item; -} - -void TextChunkList::moveToFirst(SDLTextChunk *const item) -{ - if (item == start) - return; - - SDLTextChunk *oldPrev = item->prev; - if (oldPrev) - oldPrev->next = item->next; - SDLTextChunk *oldNext = item->next; - if (oldNext) - oldNext->prev = item->prev; - else - end = oldPrev; - SDLTextChunk *const oldFirst = start; - if (start) - start->prev = item; - item->prev = nullptr; - item->next = oldFirst; - start = item; -} - -void TextChunkList::removeBack() -{ - SDLTextChunk *oldEnd = end; - if (oldEnd) - { - end = oldEnd->prev; - if (end) - end->next = nullptr; - else - start = nullptr; - search.erase(SDLTextChunkSmall(oldEnd->text, - oldEnd->color, oldEnd->color2)); - searchWidth.erase(oldEnd->text); - delete oldEnd; - size --; - } -} - -void TextChunkList::removeBack(int n) -{ - SDLTextChunk *item = end; - while (n && item) - { - n --; - SDLTextChunk *oldEnd = item; - item = item->prev; - search.erase(SDLTextChunkSmall(oldEnd->text, - oldEnd->color, oldEnd->color2)); - searchWidth.erase(oldEnd->text); - delete oldEnd; - size --; - } - if (item) - { - item->next = nullptr; - end = item; - } - else - { - start = nullptr; - end = nullptr; - } -} - -void TextChunkList::clear() -{ - search.clear(); - searchWidth.clear(); - SDLTextChunk *item = start; - while (item) - { - SDLTextChunk *item2 = item->next; - delete item; - item = item2; - } - start = nullptr; - end = nullptr; - size = 0; -} - -static int fontCounter; - -Font::Font(std::string filename, - const int size, - const int style) : - mFont(nullptr), - mCreateCounter(0), - mDeleteCounter(0), - mCleanTime(cur_time + CLEAN_TIME) -{ - if (fontCounter == 0) - { - mSoftMode = imageHelper->useOpenGL() == RENDER_SOFTWARE; - if (TTF_Init() == -1) - { - logger->error("Unable to initialize SDL_ttf: " + - std::string(TTF_GetError())); - } - } - - if (!fontCounter) - { - strBuf = new char[65535]; - memset(strBuf, 0, 65535); - } - - ++fontCounter; - - fixDirSeparators(filename); - mFont = openFont(filename.c_str(), size); - - if (!mFont) - { - logger->log("Error finding font " + filename); - std::string backFile("fonts/dejavusans.ttf"); - mFont = openFont(fixDirSeparators(backFile).c_str(), size); - if (!mFont) - { - logger->error("Font::Font: " + - std::string(TTF_GetError())); - } - } - - TTF_SetFontStyle(mFont, style); -} - -Font::~Font() -{ - TTF_CloseFont(mFont); - mFont = nullptr; - --fontCounter; - clear(); - - if (fontCounter == 0) - { - TTF_Quit(); - delete []strBuf; - } -} - -TTF_Font *Font::openFont(const char *const name, const int size) -{ -// disabled for now because some systems like gentoo cant use it -// #ifdef USE_SDL2 -// SDL_RWops *const rw = MPHYSFSRWOPS_openRead(name); -// if (!rw) -// return nullptr; -// return TTF_OpenFontIndexRW(rw, 1, size, 0); -// #else - return TTF_OpenFontIndex(ResourceManager::getPath(name).c_str(), - size, 0); -// #endif -} - -void Font::loadFont(std::string filename, - const int size, - const int style) -{ - if (fontCounter == 0 && TTF_Init() == -1) - { - logger->log("Unable to initialize SDL_ttf: " + - std::string(TTF_GetError())); - return; - } - - fixDirSeparators(filename); - TTF_Font *const font = openFont(filename.c_str(), size); - - if (!font) - { - logger->log("Font::Font: " + - std::string(TTF_GetError())); - return; - } - - if (mFont) - TTF_CloseFont(mFont); - - mFont = font; - TTF_SetFontStyle(mFont, style); - clear(); -} - -void Font::clear() -{ - for (size_t f = 0; f < CACHES_NUMBER; f ++) - mCache[f].clear(); -} - -void Font::drawString(Graphics *const graphics, - const std::string &text, - const int x, const int y) -{ - BLOCK_START("Font::drawString") - if (text.empty()) - { - BLOCK_END("Font::drawString") - return; - } - - Graphics *const g = dynamic_cast(graphics); - if (!g) - return; - - Color col = g->getColor(); - const Color &col2 = g->getColor2(); - const float alpha = static_cast(col.a) / 255.0F; - - /* The alpha value is ignored at string generation so avoid caching the - * same text with different alpha values. - */ - col.a = 255; - - const unsigned char chr = text[0]; - TextChunkList *const cache = &mCache[chr]; - - std::map &search = cache->search; - std::map::iterator i - = search.find(SDLTextChunkSmall(text, col, col2)); - if (i != search.end()) - { - SDLTextChunk *const chunk2 = (*i).second; - cache->moveToFirst(chunk2); - Image *const image = chunk2->img; - if (image) - { - image->setAlpha(alpha); - g->drawImage(image, x, y); - } - } - else - { - if (cache->size >= CACHE_SIZE) - { -#ifdef DEBUG_FONT_COUNTERS - mDeleteCounter ++; -#endif - cache->removeBack(); - } -#ifdef DEBUG_FONT_COUNTERS - mCreateCounter ++; -#endif - SDLTextChunk *chunk2 = new SDLTextChunk(text, col, col2); - - chunk2->generate(mFont, alpha); - cache->insertFirst(chunk2); - - const Image *const image = chunk2->img; - if (image) - g->drawImage(image, x, y); - } - BLOCK_END("Font::drawString") -} - -void Font::slowLogic(const int rnd) -{ - BLOCK_START("Font::slowLogic") - if (!mCleanTime) - { - mCleanTime = cur_time + CLEAN_TIME + rnd; - } - else if (mCleanTime < cur_time) - { - doClean(); - mCleanTime = cur_time + CLEAN_TIME + rnd; - } - BLOCK_END("Font::slowLogic") -} - -int Font::getWidth(const std::string &text) const -{ - if (text.empty()) - return 0; - - const unsigned char chr = text[0]; - TextChunkList *const cache = &mCache[chr]; - - std::map &search = cache->searchWidth; - std::map::iterator i = search.find(text); - if (i != search.end()) - { - SDLTextChunk *const chunk = (*i).second; - cache->moveToFirst(chunk); - const Image *const image = chunk->img; - if (image) - return image->getWidth(); - else - return 0; - } - - // if string was not drawed - int w, h; - getSafeUtf8String(text, strBuf); - TTF_SizeUTF8(mFont, strBuf, &w, &h); - return w; -} - -int Font::getHeight() const -{ - return TTF_FontHeight(mFont); -} - -void Font::doClean() -{ - for (unsigned int f = 0; f < CACHES_NUMBER; f ++) - { - TextChunkList *const cache = &mCache[f]; - const size_t size = static_cast(cache->size); -#ifdef DEBUG_FONT_COUNTERS - logger->log("ptr: %d, size: %d", f, size); -#endif - if (size > CACHE_SIZE_SMALL3) - { -#ifdef DEBUG_FONT_COUNTERS - mDeleteCounter += 100; -#endif - cache->removeBack(100); -#ifdef DEBUG_FONT_COUNTERS - logger->log("delete3"); -#endif - } - else if (size > CACHE_SIZE_SMALL2) - { -#ifdef DEBUG_FONT_COUNTERS - mDeleteCounter += 20; -#endif - cache->removeBack(20); -#ifdef DEBUG_FONT_COUNTERS - logger->log("delete2"); -#endif - } - else if (size > CACHE_SIZE_SMALL1) - { -#ifdef DEBUG_FONT_COUNTERS - mDeleteCounter ++; -#endif - cache->removeBack(); -#ifdef DEBUG_FONT_COUNTERS - logger->log("delete1"); -#endif - } - } -} - -int Font::getStringIndexAt(const std::string& text, const int x) const -{ - const size_t sz = text.size(); - for (size_t i = 0; i < sz; ++i) - { - if (getWidth(text.substr(0, i)) > x) - return static_cast(i); - } - - return static_cast(sz); -} - -const TextChunkList *Font::getCache() const -{ - return mCache; -} diff --git a/src/gui/font.h b/src/gui/font.h deleted file mode 100644 index ee1742942..000000000 --- a/src/gui/font.h +++ /dev/null @@ -1,214 +0,0 @@ -/* - * The ManaPlus Client - * Copyright (C) 2004-2009 The Mana World Development Team - * Copyright (C) 2009-2010 The Mana Developers - * Copyright (C) 2011-2014 The ManaPlus Developers - * Copyright (C) 2009 Aethyra Development Team - * - * This file is part of The ManaPlus Client. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* _______ __ __ __ ______ __ __ _______ __ __ - * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ - * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / - * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / - * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / - * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / - * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ - * - * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson - * - * - * Per Larsson a.k.a finalman - * Olof Naessén a.k.a jansem/yakslem - * - * Visit: http://guichan.sourceforge.net - * - * License: (BSD) - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name of Guichan nor the names of its contributors may - * be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef GUI_FONT_H -#define GUI_FONT_H - -#include "gui/color.h" - -#include - -#include -#include - -#include "localconsts.h" - -class Color; -class Graphics; -class Image; - -const unsigned int CACHES_NUMBER = 256; - -class SDLTextChunkSmall -{ - public: - SDLTextChunkSmall(const std::string &text0, const Color &color0, - const Color &color1); - - SDLTextChunkSmall(const SDLTextChunkSmall &old); - - bool operator==(const SDLTextChunkSmall &chunk) const; - bool operator<(const SDLTextChunkSmall &chunk) const; - - std::string text; - Color color; - Color color2; -}; - -class SDLTextChunk final -{ - public: - SDLTextChunk(const std::string &text0, const Color &color0, - const Color &color1); - - A_DELETE_COPY(SDLTextChunk) - - ~SDLTextChunk(); - - bool operator==(const SDLTextChunk &chunk) const; - - void generate(TTF_Font *const font, const float alpha); - - Image *img; - std::string text; - Color color; - Color color2; - SDLTextChunk *prev; - SDLTextChunk *next; -}; - - -class TextChunkList final -{ - public: - TextChunkList(); - - A_DELETE_COPY(TextChunkList) - - void insertFirst(SDLTextChunk *const item); - - void moveToFirst(SDLTextChunk *const item); - - void removeBack(); - - void removeBack(int n); - - void clear(); - - SDLTextChunk *start; - SDLTextChunk *end; - uint32_t size; - std::map search; - std::map searchWidth; -}; - -/** - * A wrapper around SDL_ttf for allowing the use of TrueType fonts. - * - * NOTE: This class initializes SDL_ttf as necessary. - */ -class Font final -{ - public: - Font(std::string filename, - const int size, - const int style = 0); - - A_DELETE_COPY(Font) - - ~Font(); - - void loadFont(std::string filename, - const int size, - const int style = 0); - - int getWidth(const std::string &text) const A_WARN_UNUSED; - - int getHeight() const A_WARN_UNUSED; - - const TextChunkList *getCache() const A_WARN_UNUSED; - - /** - * @see Font::drawString - */ - void drawString(Graphics *const graphics, - const std::string &text, - const int x, const int y); - - void clear(); - - void doClean(); - - void slowLogic(const int rnd); - - int getCreateCounter() const A_WARN_UNUSED - { return mCreateCounter; } - - int getDeleteCounter() const A_WARN_UNUSED - { return mDeleteCounter; } - - int getStringIndexAt(const std::string& text, - const int x) const A_WARN_UNUSED; - - static bool mSoftMode; - - private: - static TTF_Font *openFont(const char *const name, const int size); - - TTF_Font *mFont; - unsigned mCreateCounter; - unsigned mDeleteCounter; - - // Word surfaces cache - int mCleanTime; - mutable TextChunkList mCache[CACHES_NUMBER]; -}; - -#ifdef UNITTESTS -extern int sdlTextChunkCnt; -#endif - -#endif // GUI_FONT_H diff --git a/src/gui/fonts/font.cpp b/src/gui/fonts/font.cpp new file mode 100644 index 000000000..d8abc1dcf --- /dev/null +++ b/src/gui/fonts/font.cpp @@ -0,0 +1,657 @@ +/* + * The ManaPlus Client + * Copyright (C) 2004-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2009 Aethyra Development Team + * Copyright (C) 2011-2014 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* _______ __ __ __ ______ __ __ _______ __ __ + * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ + * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / + * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / + * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / + * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / + * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ + * + * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson + * + * + * Per Larsson a.k.a finalman + * Olof Naessén a.k.a jansem/yakslem + * + * Visit: http://guichan.sourceforge.net + * + * License: (BSD) + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name of Guichan nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "gui/fonts/font.h" + +#include "logger.h" +#include "main.h" + +#include "render/sdlgraphics.h" + +#include "resources/image.h" +#include "resources/imagehelper.h" +#include "resources/resourcemanager.h" +#include "resources/surfaceimagehelper.h" + +#include "utils/delete2.h" +#include "utils/paths.h" +#include "utils/sdlcheckutils.h" +#include "utils/stringutils.h" +#include "utils/timer.h" + +#include "debug.h" + +const unsigned int CACHE_SIZE = 256; +const unsigned int CACHE_SIZE_SMALL1 = 2; +const unsigned int CACHE_SIZE_SMALL2 = 50; +const unsigned int CACHE_SIZE_SMALL3 = 170; +const unsigned int CLEAN_TIME = 7; +const int OUTLINE_SIZE = 1; + +bool Font::mSoftMode(false); + +char *strBuf = nullptr; + +#ifdef UNITTESTS +int sdlTextChunkCnt = 0; +#endif + +SDLTextChunkSmall::SDLTextChunkSmall(const std::string &text0, + const Color &color0, + const Color &color1) : + text(text0), + color(color0), + color2(color1) +{ +} + +SDLTextChunkSmall::SDLTextChunkSmall(const SDLTextChunkSmall &old) : + text(old.text), + color(old.color), + color2(old.color2) +{ +} + +bool SDLTextChunkSmall::operator==(const SDLTextChunkSmall &chunk) const +{ + return (chunk.text == text && chunk.color == color + && chunk.color2 == color2); +} + +bool SDLTextChunkSmall::operator<(const SDLTextChunkSmall &chunk) const +{ + if (chunk.text != text) + return chunk.text > text; + + const Color &c = chunk.color; + if (c.r != color.r) + return c.r > color.r; + if (c.g != color.g) + return c.g > color.g; + if (c.b != color.b) + return c.b > color.b; + + const Color &c2 = chunk.color2; + if (c2.r != color2.r) + return c2.r > color2.r; + if (c2.g != color2.g) + return c2.g > color2.g; + if (c2.b != color2.b) + return c2.b > color2.b; + + if (c.a != color.a && Font::mSoftMode) + return c.a > color.a; + + return false; +} + +SDLTextChunk::SDLTextChunk(const std::string &text0, const Color &color0, + const Color &color1) : + img(nullptr), + text(text0), + color(color0), + color2(color1), + prev(nullptr), + next(nullptr) +{ +#ifdef UNITTESTS + sdlTextChunkCnt ++; +#endif +} + +SDLTextChunk::~SDLTextChunk() +{ + delete2(img); +#ifdef UNITTESTS + sdlTextChunkCnt --; +#endif +} + +bool SDLTextChunk::operator==(const SDLTextChunk &chunk) const +{ + return (chunk.text == text && chunk.color == color + && chunk.color2 == color2); +} + +void SDLTextChunk::generate(TTF_Font *const font, const float alpha) +{ + BLOCK_START("SDLTextChunk::generate") + SDL_Color sdlCol; + sdlCol.b = static_cast(color.b); + sdlCol.r = static_cast(color.r); + sdlCol.g = static_cast(color.g); +#ifdef USE_SDL2 + sdlCol.a = 255; +#else + sdlCol.unused = 0; +#endif + + getSafeUtf8String(text, strBuf); + + SDL_Surface *surface = MTTF_RenderUTF8_Blended( + font, strBuf, sdlCol); + + if (!surface) + { + img = nullptr; + BLOCK_END("SDLTextChunk::generate") + return; + } + + const int width = surface->w; + const int height = surface->h; + + if (color.r != color2.r || color.g != color2.g + || color.b != color2.b) + { // outlining + SDL_Color sdlCol2; + SDL_Surface *const background = imageHelper->create32BitSurface( + width, height); + if (!background) + { + img = nullptr; + MSDL_FreeSurface(surface); + BLOCK_END("SDLTextChunk::generate") + return; + } + sdlCol2.b = static_cast(color2.b); + sdlCol2.r = static_cast(color2.r); + sdlCol2.g = static_cast(color2.g); +#ifdef USE_SDL2 + sdlCol2.a = 255; +#else + sdlCol2.unused = 0; +#endif + SDL_Surface *const surface2 = MTTF_RenderUTF8_Blended( + font, strBuf, sdlCol2); + if (!surface2) + { + img = nullptr; + MSDL_FreeSurface(surface); + BLOCK_END("SDLTextChunk::generate") + return; + } + SDL_Rect rect = + { + OUTLINE_SIZE, + 0, + static_cast(surface->w), + static_cast(surface->h) + }; + SurfaceImageHelper::combineSurface(surface2, nullptr, + background, &rect); + rect.x = -OUTLINE_SIZE; + SurfaceImageHelper::combineSurface(surface2, nullptr, + background, &rect); + rect.x = 0; + rect.y = -OUTLINE_SIZE; + SurfaceImageHelper::combineSurface(surface2, nullptr, + background, &rect); + rect.y = OUTLINE_SIZE; + SurfaceImageHelper::combineSurface(surface2, nullptr, + background, &rect); + rect.x = 0; + rect.y = 0; + SurfaceImageHelper::combineSurface(surface, nullptr, + background, &rect); + MSDL_FreeSurface(surface); + MSDL_FreeSurface(surface2); + surface = background; + } + img = imageHelper->createTextSurface( + surface, width, height, alpha); + MSDL_FreeSurface(surface); + + BLOCK_END("SDLTextChunk::generate") +} + + +TextChunkList::TextChunkList() : + start(nullptr), + end(nullptr), + size(0), + search(), + searchWidth() +{ +} + +void TextChunkList::insertFirst(SDLTextChunk *const item) +{ + SDLTextChunk *const oldFirst = start; + if (start) + start->prev = item; + item->prev = nullptr; + if (oldFirst) + item->next = oldFirst; + else + end = item; + start = item; + size ++; + search[SDLTextChunkSmall(item->text, item->color, item->color2)] = item; + searchWidth[item->text] = item; +} + +void TextChunkList::moveToFirst(SDLTextChunk *const item) +{ + if (item == start) + return; + + SDLTextChunk *oldPrev = item->prev; + if (oldPrev) + oldPrev->next = item->next; + SDLTextChunk *oldNext = item->next; + if (oldNext) + oldNext->prev = item->prev; + else + end = oldPrev; + SDLTextChunk *const oldFirst = start; + if (start) + start->prev = item; + item->prev = nullptr; + item->next = oldFirst; + start = item; +} + +void TextChunkList::removeBack() +{ + SDLTextChunk *oldEnd = end; + if (oldEnd) + { + end = oldEnd->prev; + if (end) + end->next = nullptr; + else + start = nullptr; + search.erase(SDLTextChunkSmall(oldEnd->text, + oldEnd->color, oldEnd->color2)); + searchWidth.erase(oldEnd->text); + delete oldEnd; + size --; + } +} + +void TextChunkList::removeBack(int n) +{ + SDLTextChunk *item = end; + while (n && item) + { + n --; + SDLTextChunk *oldEnd = item; + item = item->prev; + search.erase(SDLTextChunkSmall(oldEnd->text, + oldEnd->color, oldEnd->color2)); + searchWidth.erase(oldEnd->text); + delete oldEnd; + size --; + } + if (item) + { + item->next = nullptr; + end = item; + } + else + { + start = nullptr; + end = nullptr; + } +} + +void TextChunkList::clear() +{ + search.clear(); + searchWidth.clear(); + SDLTextChunk *item = start; + while (item) + { + SDLTextChunk *item2 = item->next; + delete item; + item = item2; + } + start = nullptr; + end = nullptr; + size = 0; +} + +static int fontCounter; + +Font::Font(std::string filename, + const int size, + const int style) : + mFont(nullptr), + mCreateCounter(0), + mDeleteCounter(0), + mCleanTime(cur_time + CLEAN_TIME) +{ + if (fontCounter == 0) + { + mSoftMode = imageHelper->useOpenGL() == RENDER_SOFTWARE; + if (TTF_Init() == -1) + { + logger->error("Unable to initialize SDL_ttf: " + + std::string(TTF_GetError())); + } + } + + if (!fontCounter) + { + strBuf = new char[65535]; + memset(strBuf, 0, 65535); + } + + ++fontCounter; + + fixDirSeparators(filename); + mFont = openFont(filename.c_str(), size); + + if (!mFont) + { + logger->log("Error finding font " + filename); + std::string backFile("fonts/dejavusans.ttf"); + mFont = openFont(fixDirSeparators(backFile).c_str(), size); + if (!mFont) + { + logger->error("Font::Font: " + + std::string(TTF_GetError())); + } + } + + TTF_SetFontStyle(mFont, style); +} + +Font::~Font() +{ + TTF_CloseFont(mFont); + mFont = nullptr; + --fontCounter; + clear(); + + if (fontCounter == 0) + { + TTF_Quit(); + delete []strBuf; + } +} + +TTF_Font *Font::openFont(const char *const name, const int size) +{ +// disabled for now because some systems like gentoo cant use it +// #ifdef USE_SDL2 +// SDL_RWops *const rw = MPHYSFSRWOPS_openRead(name); +// if (!rw) +// return nullptr; +// return TTF_OpenFontIndexRW(rw, 1, size, 0); +// #else + return TTF_OpenFontIndex(ResourceManager::getPath(name).c_str(), + size, 0); +// #endif +} + +void Font::loadFont(std::string filename, + const int size, + const int style) +{ + if (fontCounter == 0 && TTF_Init() == -1) + { + logger->log("Unable to initialize SDL_ttf: " + + std::string(TTF_GetError())); + return; + } + + fixDirSeparators(filename); + TTF_Font *const font = openFont(filename.c_str(), size); + + if (!font) + { + logger->log("Font::Font: " + + std::string(TTF_GetError())); + return; + } + + if (mFont) + TTF_CloseFont(mFont); + + mFont = font; + TTF_SetFontStyle(mFont, style); + clear(); +} + +void Font::clear() +{ + for (size_t f = 0; f < CACHES_NUMBER; f ++) + mCache[f].clear(); +} + +void Font::drawString(Graphics *const graphics, + const std::string &text, + const int x, const int y) +{ + BLOCK_START("Font::drawString") + if (text.empty()) + { + BLOCK_END("Font::drawString") + return; + } + + Graphics *const g = dynamic_cast(graphics); + if (!g) + return; + + Color col = g->getColor(); + const Color &col2 = g->getColor2(); + const float alpha = static_cast(col.a) / 255.0F; + + /* The alpha value is ignored at string generation so avoid caching the + * same text with different alpha values. + */ + col.a = 255; + + const unsigned char chr = text[0]; + TextChunkList *const cache = &mCache[chr]; + + std::map &search = cache->search; + std::map::iterator i + = search.find(SDLTextChunkSmall(text, col, col2)); + if (i != search.end()) + { + SDLTextChunk *const chunk2 = (*i).second; + cache->moveToFirst(chunk2); + Image *const image = chunk2->img; + if (image) + { + image->setAlpha(alpha); + g->drawImage(image, x, y); + } + } + else + { + if (cache->size >= CACHE_SIZE) + { +#ifdef DEBUG_FONT_COUNTERS + mDeleteCounter ++; +#endif + cache->removeBack(); + } +#ifdef DEBUG_FONT_COUNTERS + mCreateCounter ++; +#endif + SDLTextChunk *chunk2 = new SDLTextChunk(text, col, col2); + + chunk2->generate(mFont, alpha); + cache->insertFirst(chunk2); + + const Image *const image = chunk2->img; + if (image) + g->drawImage(image, x, y); + } + BLOCK_END("Font::drawString") +} + +void Font::slowLogic(const int rnd) +{ + BLOCK_START("Font::slowLogic") + if (!mCleanTime) + { + mCleanTime = cur_time + CLEAN_TIME + rnd; + } + else if (mCleanTime < cur_time) + { + doClean(); + mCleanTime = cur_time + CLEAN_TIME + rnd; + } + BLOCK_END("Font::slowLogic") +} + +int Font::getWidth(const std::string &text) const +{ + if (text.empty()) + return 0; + + const unsigned char chr = text[0]; + TextChunkList *const cache = &mCache[chr]; + + std::map &search = cache->searchWidth; + std::map::iterator i = search.find(text); + if (i != search.end()) + { + SDLTextChunk *const chunk = (*i).second; + cache->moveToFirst(chunk); + const Image *const image = chunk->img; + if (image) + return image->getWidth(); + else + return 0; + } + + // if string was not drawed + int w, h; + getSafeUtf8String(text, strBuf); + TTF_SizeUTF8(mFont, strBuf, &w, &h); + return w; +} + +int Font::getHeight() const +{ + return TTF_FontHeight(mFont); +} + +void Font::doClean() +{ + for (unsigned int f = 0; f < CACHES_NUMBER; f ++) + { + TextChunkList *const cache = &mCache[f]; + const size_t size = static_cast(cache->size); +#ifdef DEBUG_FONT_COUNTERS + logger->log("ptr: %d, size: %d", f, size); +#endif + if (size > CACHE_SIZE_SMALL3) + { +#ifdef DEBUG_FONT_COUNTERS + mDeleteCounter += 100; +#endif + cache->removeBack(100); +#ifdef DEBUG_FONT_COUNTERS + logger->log("delete3"); +#endif + } + else if (size > CACHE_SIZE_SMALL2) + { +#ifdef DEBUG_FONT_COUNTERS + mDeleteCounter += 20; +#endif + cache->removeBack(20); +#ifdef DEBUG_FONT_COUNTERS + logger->log("delete2"); +#endif + } + else if (size > CACHE_SIZE_SMALL1) + { +#ifdef DEBUG_FONT_COUNTERS + mDeleteCounter ++; +#endif + cache->removeBack(); +#ifdef DEBUG_FONT_COUNTERS + logger->log("delete1"); +#endif + } + } +} + +int Font::getStringIndexAt(const std::string& text, const int x) const +{ + const size_t sz = text.size(); + for (size_t i = 0; i < sz; ++i) + { + if (getWidth(text.substr(0, i)) > x) + return static_cast(i); + } + + return static_cast(sz); +} + +const TextChunkList *Font::getCache() const +{ + return mCache; +} diff --git a/src/gui/fonts/font.h b/src/gui/fonts/font.h new file mode 100644 index 000000000..f6a64a2d8 --- /dev/null +++ b/src/gui/fonts/font.h @@ -0,0 +1,214 @@ +/* + * The ManaPlus Client + * Copyright (C) 2004-2009 The Mana World Development Team + * Copyright (C) 2009-2010 The Mana Developers + * Copyright (C) 2011-2014 The ManaPlus Developers + * Copyright (C) 2009 Aethyra Development Team + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/* _______ __ __ __ ______ __ __ _______ __ __ + * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ + * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / + * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / + * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / + * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / + * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ + * + * Copyright (c) 2004 - 2008 Olof Naessén and Per Larsson + * + * + * Per Larsson a.k.a finalman + * Olof Naessén a.k.a jansem/yakslem + * + * Visit: http://guichan.sourceforge.net + * + * License: (BSD) + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name of Guichan nor the names of its contributors may + * be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED + * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef GUI_FONTS_FONT_H +#define GUI_FONTS_FONT_H + +#include "gui/color.h" + +#include + +#include +#include + +#include "localconsts.h" + +class Color; +class Graphics; +class Image; + +const unsigned int CACHES_NUMBER = 256; + +class SDLTextChunkSmall +{ + public: + SDLTextChunkSmall(const std::string &text0, const Color &color0, + const Color &color1); + + SDLTextChunkSmall(const SDLTextChunkSmall &old); + + bool operator==(const SDLTextChunkSmall &chunk) const; + bool operator<(const SDLTextChunkSmall &chunk) const; + + std::string text; + Color color; + Color color2; +}; + +class SDLTextChunk final +{ + public: + SDLTextChunk(const std::string &text0, const Color &color0, + const Color &color1); + + A_DELETE_COPY(SDLTextChunk) + + ~SDLTextChunk(); + + bool operator==(const SDLTextChunk &chunk) const; + + void generate(TTF_Font *const font, const float alpha); + + Image *img; + std::string text; + Color color; + Color color2; + SDLTextChunk *prev; + SDLTextChunk *next; +}; + + +class TextChunkList final +{ + public: + TextChunkList(); + + A_DELETE_COPY(TextChunkList) + + void insertFirst(SDLTextChunk *const item); + + void moveToFirst(SDLTextChunk *const item); + + void removeBack(); + + void removeBack(int n); + + void clear(); + + SDLTextChunk *start; + SDLTextChunk *end; + uint32_t size; + std::map search; + std::map searchWidth; +}; + +/** + * A wrapper around SDL_ttf for allowing the use of TrueType fonts. + * + * NOTE: This class initializes SDL_ttf as necessary. + */ +class Font final +{ + public: + Font(std::string filename, + const int size, + const int style = 0); + + A_DELETE_COPY(Font) + + ~Font(); + + void loadFont(std::string filename, + const int size, + const int style = 0); + + int getWidth(const std::string &text) const A_WARN_UNUSED; + + int getHeight() const A_WARN_UNUSED; + + const TextChunkList *getCache() const A_WARN_UNUSED; + + /** + * @see Font::drawString + */ + void drawString(Graphics *const graphics, + const std::string &text, + const int x, const int y); + + void clear(); + + void doClean(); + + void slowLogic(const int rnd); + + int getCreateCounter() const A_WARN_UNUSED + { return mCreateCounter; } + + int getDeleteCounter() const A_WARN_UNUSED + { return mDeleteCounter; } + + int getStringIndexAt(const std::string& text, + const int x) const A_WARN_UNUSED; + + static bool mSoftMode; + + private: + static TTF_Font *openFont(const char *const name, const int size); + + TTF_Font *mFont; + unsigned mCreateCounter; + unsigned mDeleteCounter; + + // Word surfaces cache + int mCleanTime; + mutable TextChunkList mCache[CACHES_NUMBER]; +}; + +#ifdef UNITTESTS +extern int sdlTextChunkCnt; +#endif + +#endif // GUI_FONTS_FONT_H diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index 2841a5369..cb74090d2 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -66,12 +66,13 @@ #include "gui/gui.h" #include "gui/focushandler.h" -#include "gui/font.h" #include "gui/palette.h" #include "gui/sdlinput.h" #include "gui/theme.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/widgets/window.h" #include "client.h" diff --git a/src/gui/models/serverslistmodel.h b/src/gui/models/serverslistmodel.h index 5c7e73387..0b15aefae 100644 --- a/src/gui/models/serverslistmodel.h +++ b/src/gui/models/serverslistmodel.h @@ -25,9 +25,10 @@ #include "net/serverinfo.h" -#include "gui/font.h" #include "gui/gui.h" +#include "gui/fonts/font.h" + #include "gui/windows/serverdialog.h" #include "utils/mutex.h" diff --git a/src/gui/popups/beingpopup.cpp b/src/gui/popups/beingpopup.cpp index dd1aaf028..b15ccc7ae 100644 --- a/src/gui/popups/beingpopup.cpp +++ b/src/gui/popups/beingpopup.cpp @@ -24,9 +24,10 @@ #include "being/being.h" #include "being/playerrelations.h" -#include "gui/font.h" #include "gui/gui.h" +#include "gui/fonts/font.h" + #include "gui/widgets/label.h" #include "utils/gettext.h" diff --git a/src/gui/popups/itempopup.cpp b/src/gui/popups/itempopup.cpp index 0a65ce3bc..9b0870261 100644 --- a/src/gui/popups/itempopup.cpp +++ b/src/gui/popups/itempopup.cpp @@ -27,9 +27,10 @@ #include "item.h" #include "units.h" -#include "gui/font.h" #include "gui/gui.h" +#include "gui/fonts/font.h" + #include "gui/widgets/icon.h" #include "gui/widgets/label.h" #include "gui/widgets/textbox.h" diff --git a/src/gui/popups/speechbubble.cpp b/src/gui/popups/speechbubble.cpp index 44699499f..3f01651d8 100644 --- a/src/gui/popups/speechbubble.cpp +++ b/src/gui/popups/speechbubble.cpp @@ -23,11 +23,12 @@ #include "gui/popups/speechbubble.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/widgets/browserbox.h" #include "gui/widgets/label.h" diff --git a/src/gui/popups/statuspopup.cpp b/src/gui/popups/statuspopup.cpp index 7dd3c3634..2c149f755 100644 --- a/src/gui/popups/statuspopup.cpp +++ b/src/gui/popups/statuspopup.cpp @@ -33,7 +33,7 @@ #include "utils/stringutils.h" -#include "gui/font.h" +#include "gui/fonts/font.h" #include "debug.h" diff --git a/src/gui/popups/textpopup.cpp b/src/gui/popups/textpopup.cpp index d5cc918d3..c16c188ef 100644 --- a/src/gui/popups/textpopup.cpp +++ b/src/gui/popups/textpopup.cpp @@ -25,7 +25,7 @@ #include "gui/widgets/label.h" -#include "gui/font.h" +#include "gui/fonts/font.h" #include "debug.h" diff --git a/src/gui/viewport.cpp b/src/gui/viewport.cpp index f8f0c2ec0..d96b7c943 100644 --- a/src/gui/viewport.cpp +++ b/src/gui/viewport.cpp @@ -39,7 +39,8 @@ #include "input/inputmanager.h" #include "gui/gui.h" -#include "gui/font.h" + +#include "gui/fonts/font.h" #include "gui/popups/beingpopup.h" #include "gui/popups/popupmenu.h" diff --git a/src/gui/widgets/avatarlistbox.cpp b/src/gui/widgets/avatarlistbox.cpp index 19eb86f44..b5d3c3593 100644 --- a/src/gui/widgets/avatarlistbox.cpp +++ b/src/gui/widgets/avatarlistbox.cpp @@ -27,11 +27,12 @@ #include "being/localplayer.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/models/avatarlistmodel.h" #include "gui/windows/chatwindow.h" diff --git a/src/gui/widgets/browserbox.cpp b/src/gui/widgets/browserbox.cpp index dc5bf1700..f0a10c77c 100644 --- a/src/gui/widgets/browserbox.cpp +++ b/src/gui/widgets/browserbox.cpp @@ -25,10 +25,11 @@ #include "input/inputmanager.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" +#include "gui/fonts/font.h" + #include "gui/widgets/linkhandler.h" #include "resources/image.h" diff --git a/src/gui/widgets/button.cpp b/src/gui/widgets/button.cpp index 4c806b2b0..dbed0e4ac 100644 --- a/src/gui/widgets/button.cpp +++ b/src/gui/widgets/button.cpp @@ -75,11 +75,12 @@ #include "resources/image.h" #include "resources/imageset.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" #include "gui/rect.h" +#include "gui/fonts/font.h" + #include "utils/delete2.h" #include "debug.h" diff --git a/src/gui/widgets/checkbox.cpp b/src/gui/widgets/checkbox.cpp index 253092539..71936ab41 100644 --- a/src/gui/widgets/checkbox.cpp +++ b/src/gui/widgets/checkbox.cpp @@ -71,10 +71,11 @@ #include "resources/image.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" +#include "gui/fonts/font.h" + #include "debug.h" int CheckBox::instances = 0; diff --git a/src/gui/widgets/colorpage.cpp b/src/gui/widgets/colorpage.cpp index 42d8f3016..0f71e87d7 100644 --- a/src/gui/widgets/colorpage.cpp +++ b/src/gui/widgets/colorpage.cpp @@ -22,9 +22,10 @@ #include "gui/models/colormodel.h" -#include "gui/font.h" #include "gui/skin.h" +#include "gui/fonts/font.h" + #include "debug.h" ColorPage::ColorPage(const Widget2 *const widget, diff --git a/src/gui/widgets/dropdown.cpp b/src/gui/widgets/dropdown.cpp index 8de0cdc77..1cb7683e9 100644 --- a/src/gui/widgets/dropdown.cpp +++ b/src/gui/widgets/dropdown.cpp @@ -28,10 +28,11 @@ #include "input/keydata.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" +#include "gui/fonts/font.h" + #include "gui/models/extendedlistmodel.h" #include "gui/widgets/popuplist.h" diff --git a/src/gui/widgets/dropshortcutcontainer.cpp b/src/gui/widgets/dropshortcutcontainer.cpp index 67e027a96..59528421e 100644 --- a/src/gui/widgets/dropshortcutcontainer.cpp +++ b/src/gui/widgets/dropshortcutcontainer.cpp @@ -28,9 +28,10 @@ #include "being/playerinfo.h" -#include "gui/font.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/popups/itempopup.h" #include "gui/windows/inventorywindow.h" diff --git a/src/gui/widgets/emoteshortcutcontainer.cpp b/src/gui/widgets/emoteshortcutcontainer.cpp index 5331eab42..ad7bf7358 100644 --- a/src/gui/widgets/emoteshortcutcontainer.cpp +++ b/src/gui/widgets/emoteshortcutcontainer.cpp @@ -27,9 +27,10 @@ #include "input/inputmanager.h" -#include "gui/font.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/popups/textpopup.h" #include "resources/image.h" diff --git a/src/gui/widgets/extendedlistbox.cpp b/src/gui/widgets/extendedlistbox.cpp index ca58bf95b..36bcc365a 100644 --- a/src/gui/widgets/extendedlistbox.cpp +++ b/src/gui/widgets/extendedlistbox.cpp @@ -22,9 +22,10 @@ #include "gui/models/extendedlistmodel.h" -#include "gui/font.h" #include "gui/skin.h" +#include "gui/fonts/font.h" + #include "gui/models/listmodel.h" #include "render/graphics.h" diff --git a/src/gui/widgets/itemcontainer.cpp b/src/gui/widgets/itemcontainer.cpp index e9d9e09bf..6f8519a3c 100644 --- a/src/gui/widgets/itemcontainer.cpp +++ b/src/gui/widgets/itemcontainer.cpp @@ -29,11 +29,12 @@ #include "being/playerinfo.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/popups/itempopup.h" #include "gui/windows/chatwindow.h" diff --git a/src/gui/widgets/itemshortcutcontainer.cpp b/src/gui/widgets/itemshortcutcontainer.cpp index 420eb5578..6a47b91ac 100644 --- a/src/gui/widgets/itemshortcutcontainer.cpp +++ b/src/gui/widgets/itemshortcutcontainer.cpp @@ -33,9 +33,10 @@ #include "input/inputmanager.h" -#include "gui/font.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/popups/itempopup.h" #include "gui/popups/spellpopup.h" diff --git a/src/gui/widgets/label.cpp b/src/gui/widgets/label.cpp index bfdcc3ffd..ea183e8c3 100644 --- a/src/gui/widgets/label.cpp +++ b/src/gui/widgets/label.cpp @@ -64,10 +64,11 @@ #include "gui/widgets/label.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" +#include "gui/fonts/font.h" + #include "debug.h" Skin *Label::mSkin = nullptr; diff --git a/src/gui/widgets/listbox.cpp b/src/gui/widgets/listbox.cpp index 69d5d665f..b0e9f4236 100644 --- a/src/gui/widgets/listbox.cpp +++ b/src/gui/widgets/listbox.cpp @@ -72,10 +72,11 @@ #include "listeners/selectionlistener.h" #include "gui/focushandler.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" +#include "gui/fonts/font.h" + #include "gui/models/listmodel.h" #include "debug.h" diff --git a/src/gui/widgets/progressbar.cpp b/src/gui/widgets/progressbar.cpp index f737f0153..6823ca050 100644 --- a/src/gui/widgets/progressbar.cpp +++ b/src/gui/widgets/progressbar.cpp @@ -25,10 +25,11 @@ #include "client.h" #include "graphicsvertexes.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" +#include "gui/fonts/font.h" + #include "utils/delete2.h" #include "debug.h" diff --git a/src/gui/widgets/radiobutton.cpp b/src/gui/widgets/radiobutton.cpp index 8e122ece6..5f18d618f 100644 --- a/src/gui/widgets/radiobutton.cpp +++ b/src/gui/widgets/radiobutton.cpp @@ -71,10 +71,11 @@ #include "resources/image.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" +#include "gui/fonts/font.h" + #include "debug.h" int RadioButton::instances = 0; diff --git a/src/gui/widgets/serverslistbox.h b/src/gui/widgets/serverslistbox.h index 83fab9879..03333bdb0 100644 --- a/src/gui/widgets/serverslistbox.h +++ b/src/gui/widgets/serverslistbox.h @@ -23,7 +23,7 @@ #ifndef GUI_WIDGETS_SERVERSLISTBOX_H #define GUI_WIDGETS_SERVERSLISTBOX_H -#include "gui/font.h" +#include "gui/fonts/font.h" #include "gui/models/serverslistmodel.h" diff --git a/src/gui/widgets/setupitem.cpp b/src/gui/widgets/setupitem.cpp index 87bc2baa5..9ed8f8f08 100644 --- a/src/gui/widgets/setupitem.cpp +++ b/src/gui/widgets/setupitem.cpp @@ -24,9 +24,10 @@ #include "main.h" #include "soundmanager.h" -#include "gui/font.h" #include "gui/gui.h" +#include "gui/fonts/font.h" + #include "gui/windows/editdialog.h" #include "gui/widgets/button.h" diff --git a/src/gui/widgets/shoplistbox.cpp b/src/gui/widgets/shoplistbox.cpp index ce2aa5aae..9b9a6bba8 100644 --- a/src/gui/widgets/shoplistbox.cpp +++ b/src/gui/widgets/shoplistbox.cpp @@ -27,9 +27,10 @@ #include "being/playerinfo.h" -#include "gui/font.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/popups/itempopup.h" #include "gui/models/shopitems.h" diff --git a/src/gui/widgets/sliderlist.cpp b/src/gui/widgets/sliderlist.cpp index 76e6b54c3..f925dcb10 100644 --- a/src/gui/widgets/sliderlist.cpp +++ b/src/gui/widgets/sliderlist.cpp @@ -20,9 +20,10 @@ #include "gui/widgets/sliderlist.h" -#include "gui/font.h" #include "gui/gui.h" +#include "gui/fonts/font.h" + #include "gui/models/listmodel.h" #include "gui/widgets/button.h" diff --git a/src/gui/widgets/spellshortcutcontainer.cpp b/src/gui/widgets/spellshortcutcontainer.cpp index e86376812..3c57d1034 100644 --- a/src/gui/widgets/spellshortcutcontainer.cpp +++ b/src/gui/widgets/spellshortcutcontainer.cpp @@ -27,9 +27,10 @@ #include "itemshortcut.h" #include "spellshortcut.h" -#include "gui/font.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/popups/spellpopup.h" #include "gui/windows/shortcutwindow.h" diff --git a/src/gui/widgets/tabs/setup_colors.cpp b/src/gui/widgets/tabs/setup_colors.cpp index 83b4c6c2a..29f697ab4 100644 --- a/src/gui/widgets/tabs/setup_colors.cpp +++ b/src/gui/widgets/tabs/setup_colors.cpp @@ -21,10 +21,11 @@ #include "gui/widgets/tabs/setup_colors.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/userpalette.h" +#include "gui/fonts/font.h" + #include "gui/widgets/browserbox.h" #include "gui/widgets/containerplacer.h" #include "gui/widgets/label.h" diff --git a/src/gui/widgets/textbox.cpp b/src/gui/widgets/textbox.cpp index c03835a0e..dcb78b40a 100644 --- a/src/gui/widgets/textbox.cpp +++ b/src/gui/widgets/textbox.cpp @@ -67,9 +67,10 @@ #include "input/keydata.h" -#include "gui/font.h" #include "gui/gui.h" +#include "gui/fonts/font.h" + #include #include "debug.h" diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp index 0080a8d22..2369f1c65 100644 --- a/src/gui/widgets/textfield.cpp +++ b/src/gui/widgets/textfield.cpp @@ -69,11 +69,12 @@ #include "input/inputmanager.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/popups/popupmenu.h" #include "resources/image.h" diff --git a/src/gui/widgets/textpreview.cpp b/src/gui/widgets/textpreview.cpp index c567c5f06..e215d21b3 100644 --- a/src/gui/widgets/textpreview.cpp +++ b/src/gui/widgets/textpreview.cpp @@ -24,10 +24,11 @@ #include "client.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" +#include "gui/fonts/font.h" + #include "debug.h" int TextPreview::instances = 0; diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp index 1348b055c..923999437 100644 --- a/src/gui/widgets/window.cpp +++ b/src/gui/widgets/window.cpp @@ -73,11 +73,12 @@ #include "soundmanager.h" #include "gui/focushandler.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/widgets/containerplacer.h" #include "gui/widgets/layout.h" diff --git a/src/gui/windows/confirmdialog.cpp b/src/gui/windows/confirmdialog.cpp index 6eb21622d..f71d4e551 100644 --- a/src/gui/windows/confirmdialog.cpp +++ b/src/gui/windows/confirmdialog.cpp @@ -24,13 +24,13 @@ #include "soundmanager.h" +#include "gui/fonts/font.h" + #include "gui/widgets/button.h" #include "gui/widgets/textbox.h" #include "utils/gettext.h" -#include "gui/font.h" - #include "debug.h" ConfirmDialog::ConfirmDialog(const std::string &restrict title, diff --git a/src/gui/windows/equipmentwindow.cpp b/src/gui/windows/equipmentwindow.cpp index ebe5a81b9..25cb5f629 100644 --- a/src/gui/windows/equipmentwindow.cpp +++ b/src/gui/windows/equipmentwindow.cpp @@ -32,9 +32,10 @@ #include "being/localplayer.h" #include "being/playerinfo.h" -#include "gui/font.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/popups/itempopup.h" #include "gui/windows/setupwindow.h" diff --git a/src/gui/windows/inventorywindow.cpp b/src/gui/windows/inventorywindow.cpp index 90ce6eca4..14226ee38 100644 --- a/src/gui/windows/inventorywindow.cpp +++ b/src/gui/windows/inventorywindow.cpp @@ -33,10 +33,11 @@ #include "input/inputmanager.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/models/sortlistmodelinv.h" #include "gui/popups/textpopup.h" diff --git a/src/gui/windows/npcdialog.cpp b/src/gui/windows/npcdialog.cpp index 5de307963..a2ac10073 100644 --- a/src/gui/windows/npcdialog.cpp +++ b/src/gui/windows/npcdialog.cpp @@ -32,10 +32,11 @@ #include "being/being.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/windows/inventorywindow.h" #include "gui/widgets/browserbox.h" diff --git a/src/gui/windows/okdialog.cpp b/src/gui/windows/okdialog.cpp index 5ab5356ca..bf8a64026 100644 --- a/src/gui/windows/okdialog.cpp +++ b/src/gui/windows/okdialog.cpp @@ -28,9 +28,9 @@ #include "gui/widgets/button.h" #include "gui/widgets/textbox.h" -#include "utils/gettext.h" +#include "gui/fonts/font.h" -#include "gui/font.h" +#include "utils/gettext.h" #include "debug.h" diff --git a/src/gui/windows/questswindow.cpp b/src/gui/windows/questswindow.cpp index f07d6f6b2..2e4ce2693 100644 --- a/src/gui/windows/questswindow.cpp +++ b/src/gui/windows/questswindow.cpp @@ -26,9 +26,10 @@ #include "being/localplayer.h" -#include "gui/font.h" #include "gui/gui.h" +#include "gui/fonts/font.h" + #include "gui/models/questsmodel.h" #include "gui/widgets/browserbox.h" diff --git a/src/gui/windows/serverdialog.cpp b/src/gui/windows/serverdialog.cpp index f63a3d5ba..25dfff02e 100644 --- a/src/gui/windows/serverdialog.cpp +++ b/src/gui/windows/serverdialog.cpp @@ -31,9 +31,10 @@ #include "input/keydata.h" -#include "gui/font.h" #include "gui/gui.h" +#include "gui/fonts/font.h" + #include "gui/models/serverslistmodel.h" #include "gui/widgets/checkbox.h" diff --git a/src/gui/windows/skilldialog.cpp b/src/gui/windows/skilldialog.cpp index 76296cfe4..f9351f29a 100644 --- a/src/gui/windows/skilldialog.cpp +++ b/src/gui/windows/skilldialog.cpp @@ -30,10 +30,11 @@ #include "being/attributes.h" #include "being/localplayer.h" -#include "gui/font.h" #include "gui/skin.h" #include "gui/viewport.h" +#include "gui/fonts/font.h" + #include "gui/popups/textpopup.h" #include "gui/models/skillmodel.h" diff --git a/src/gui/windows/textdialog.cpp b/src/gui/windows/textdialog.cpp index 9b7bb3eb1..3aa3211ad 100644 --- a/src/gui/windows/textdialog.cpp +++ b/src/gui/windows/textdialog.cpp @@ -30,7 +30,7 @@ #include "utils/gettext.h" -#include "gui/font.h" +#include "gui/fonts/font.h" #include "debug.h" diff --git a/src/gui/windows/tradewindow.cpp b/src/gui/windows/tradewindow.cpp index a6300d060..5827ca8a0 100644 --- a/src/gui/windows/tradewindow.cpp +++ b/src/gui/windows/tradewindow.cpp @@ -32,9 +32,10 @@ #include "being/playerinfo.h" #include "being/playerrelations.h" -#include "gui/font.h" #include "gui/gui.h" +#include "gui/fonts/font.h" + #include "gui/windows/inventorywindow.h" #include "gui/windows/itemamountwindow.h" #include "gui/windows/setupwindow.h" diff --git a/src/particle/textparticle.cpp b/src/particle/textparticle.cpp index 9d37ca73d..12942fa4c 100644 --- a/src/particle/textparticle.cpp +++ b/src/particle/textparticle.cpp @@ -27,7 +27,8 @@ #include "gui/theme.h" #include "gui/color.h" -#include "gui/font.h" + +#include "gui/fonts/font.h" #include "debug.h" diff --git a/src/resources/map/mapitem.cpp b/src/resources/map/mapitem.cpp index eee82d253..967b851a5 100644 --- a/src/resources/map/mapitem.cpp +++ b/src/resources/map/mapitem.cpp @@ -20,10 +20,11 @@ #include "resources/map/mapitem.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/userpalette.h" +#include "gui/fonts/font.h" + #include "resources/image.h" #include "resources/resourcemanager.h" diff --git a/src/text.cpp b/src/text.cpp index 542dc60d9..bae0bd6dc 100644 --- a/src/text.cpp +++ b/src/text.cpp @@ -26,10 +26,11 @@ #include "configuration.h" #include "textmanager.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/theme.h" +#include "gui/fonts/font.h" + #include "resources/image.h" #include "utils/delete2.h" diff --git a/src/touchmanager.cpp b/src/touchmanager.cpp index 177eb45be..6158d1254 100644 --- a/src/touchmanager.cpp +++ b/src/touchmanager.cpp @@ -26,10 +26,11 @@ #include "input/mouseinput.h" -#include "gui/font.h" #include "gui/gui.h" #include "gui/skin.h" +#include "gui/fonts/font.h" + #include "input/inputmanager.h" #include "render/graphics.h" -- cgit v1.2.3-60-g2f50