diff options
Diffstat (limited to 'src/utils')
-rw-r--r-- | src/utils/files.cpp | 3 | ||||
-rw-r--r-- | src/utils/mathutils.h | 6 | ||||
-rw-r--r-- | src/utils/paths.cpp | 2 | ||||
-rw-r--r-- | src/utils/sdlpixel.h | 236 | ||||
-rw-r--r-- | src/utils/stringutils.cpp | 2 | ||||
-rw-r--r-- | src/utils/stringutils.h | 2 | ||||
-rw-r--r-- | src/utils/translation/poparser.cpp | 2 | ||||
-rw-r--r-- | src/utils/translation/poparser.h | 4 | ||||
-rw-r--r-- | src/utils/xml.h | 2 | ||||
-rw-r--r-- | src/utils/xmlutils.cpp | 63 | ||||
-rw-r--r-- | src/utils/xmlutils.h | 34 | ||||
-rw-r--r-- | src/utils/xmlutils_unittest.cc | 70 |
12 files changed, 417 insertions, 9 deletions
diff --git a/src/utils/files.cpp b/src/utils/files.cpp index 24ec9366e..d671cb0db 100644 --- a/src/utils/files.cpp +++ b/src/utils/files.cpp @@ -22,9 +22,10 @@ #if defined(ANDROID) || defined(__native_client__) #include "resources/resourcemanager.h" -#endif #include "utils/mkdir.h" +#endif + #include "utils/physfstools.h" #include "localconsts.h" diff --git a/src/utils/mathutils.h b/src/utils/mathutils.h index 545a1cc4b..f5a3dc102 100644 --- a/src/utils/mathutils.h +++ b/src/utils/mathutils.h @@ -70,7 +70,7 @@ inline float fastSqrt(const float x) A_WARN_UNUSED; constexpr inline float weightedAverage(const float n1, const float n2, const float w) A_WARN_UNUSED; constexpr inline int roundDouble(const double v) A_WARN_UNUSED; -inline int powerOfTwo(const int input) A_WARN_UNUSED; +inline int powerOfTwo(const unsigned int input) A_WARN_UNUSED; inline uint16_t getCrc16(const std::string &str) { @@ -123,9 +123,9 @@ constexpr inline int roundDouble(const double v) return (v > 0.0) ? static_cast<int>(v + 0.5) : static_cast<int>(v - 0.5); } -inline int powerOfTwo(const int input) +inline int powerOfTwo(const unsigned int input) { - int value = 1; + unsigned int value = 1; while (value < input) value <<= 1; return value; diff --git a/src/utils/paths.cpp b/src/utils/paths.cpp index a3f61bde3..96cd0ed29 100644 --- a/src/utils/paths.cpp +++ b/src/utils/paths.cpp @@ -28,7 +28,9 @@ #include "utils/physfstools.h" #include "utils/stringutils.h" +#ifdef USE_X11 #include "resources/resourcemanager.h" +#endif #ifdef __native_client__ #include <limits.h> diff --git a/src/utils/sdlpixel.h b/src/utils/sdlpixel.h new file mode 100644 index 000000000..282b90afb --- /dev/null +++ b/src/utils/sdlpixel.h @@ -0,0 +1,236 @@ +/* + * The ManaPlus Client + * 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 <http://www.gnu.org/licenses/>. + */ + +/* _______ __ __ __ ______ __ __ _______ __ __ + * / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___ /\ / |\/ /\ + * / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / / + * / / /__ / / // / // / // / / / ___ / // ___ / // /| ' / / + * / /_// /\ / /_// / // / // /_/_ / / // / // /\_/ / // / | / / + * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ / + * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/ + * + * 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 UTILS_SDLPIXEL_H +#define UTILS_SDLPIXEL_H + +#include "gui/color.h" + +#include "SDL.h" + +/** + * Puts a pixel on an SDL_Surface. + * + * @param x the x coordinate on the surface. + * @param y the y coordinate on the surface. + * @param color the color the pixel should be in. + */ +inline void SDLputPixel(SDL_Surface* surface, int x, int y, + const Color& color) +{ + if (!surface) + return; + + const int bpp = surface->format->BytesPerPixel; + + SDL_LockSurface(surface); + + Uint8 *const p = static_cast<uint8_t*>(surface->pixels) + + y * surface->pitch + x * bpp; + + const Uint32 pixel = SDL_MapRGB(surface->format, + static_cast<uint8_t>(color.r), static_cast<uint8_t>(color.g), + static_cast<uint8_t>(color.b)); + + switch (bpp) + { + case 1: + *p = static_cast<uint8_t>(pixel); + break; + + case 2: + *reinterpret_cast<uint16_t*>(p) = static_cast<uint16_t>(pixel); + break; + + case 3: +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + p[0] = static_cast<uint8_t>((pixel >> 16) & 0xff); + p[1] = static_cast<uint8_t>((pixel >> 8) & 0xff); + p[2] = static_cast<uint8_t>((pixel) & 0xff); +#else + p[0] = static_cast<uint8_t>((pixel) & 0xff); + p[1] = static_cast<uint8_t>((pixel >> 8) & 0xff); + p[2] = static_cast<uint8_t>((pixel >> 16) & 0xff); +#endif + break; + + case 4: + *reinterpret_cast<Uint32*>(p) = pixel; + break; + + default: + break; + } + + SDL_UnlockSurface(surface); +} + +/** + * Blends two 32 bit colors together. + * + * @param src the source color. + * @param dst the destination color. + * @param a alpha. + */ +inline unsigned int SDLAlpha32(const unsigned int src, + const unsigned int dst, + const unsigned char a) +{ + const unsigned int b = ((src & 0xff) * a + (dst & 0xff) * (255 - a)) >> 8; + const unsigned int g = ((src & 0xff00) * a + (dst & 0xff00) + * (255 - a)) >> 8; + const unsigned int r = ((src & 0xff0000) * a + (dst & 0xff0000) + * (255 - a)) >> 8; + + return (b & 0xff) | (g & 0xff00) | (r & 0xff0000); +} + +/** + * Blends two 16 bit colors together. + * + * @param src the source color. + * @param dst the destination color. + * @param a alpha. + */ +inline unsigned short SDLAlpha16(const unsigned short src, + const unsigned short dst, + const unsigned char a, + const SDL_PixelFormat *const f) +{ + unsigned int b = ((src & f->Rmask) * a + (dst & f->Rmask) + * (255 - a)) >> 8; + unsigned int g = ((src & f->Gmask) * a + (dst & f->Gmask) + * (255 - a)) >> 8; + unsigned int r = ((src & f->Bmask) * a + (dst & f->Bmask) + * (255 - a)) >> 8; + + return static_cast<unsigned short>((b & f->Rmask) + | (g & f->Gmask) | (r & f->Bmask)); +} + +/** + * Puts a pixel on an SDL_Surface with alpha + * + * @param x the x coordinate on the surface. + * @param y the y coordinate on the surface. + * @param color the color the pixel should be in. + */ +inline void SDLputPixelAlpha(SDL_Surface* surface, int x, int y, + const Color& color) +{ + const int bpp = surface->format->BytesPerPixel; + + SDL_LockSurface(surface); + + Uint8 *const p = static_cast<uint8_t*>(surface->pixels) + + y * surface->pitch + x * bpp; + + const Uint32 pixel = SDL_MapRGB(surface->format, + static_cast<uint8_t>(color.r), + static_cast<uint8_t>(color.g), + static_cast<uint8_t>(color.b)); + + switch (bpp) + { + case 1: + *p = static_cast<uint8_t>(pixel); + break; + + case 2: + *reinterpret_cast<Uint16*>(p) = SDLAlpha16( + static_cast<unsigned short>(pixel), + *reinterpret_cast<unsigned short*>(p), + static_cast<unsigned char>(color.a), surface->format); + break; + + case 3: +#if SDL_BYTEORDER == SDL_BIG_ENDIAN + p[2] = static_cast<uint8_t>((p[2] * (255 - color.a) + + color.b * color.a) >> 8); + p[1] = static_cast<uint8_t>((p[1] * (255 - color.a) + + color.g * color.a) >> 8); + p[0] = static_cast<uint8_t>((p[0] * (255 - color.a) + + color.r * color.a) >> 8); +#else + p[0] = static_cast<uint8_t>((p[0] * (255 - color.a) + + color.b * color.a) >> 8); + p[1] = static_cast<uint8_t>((p[1] * (255 - color.a) + + color.g * color.a) >> 8); + p[2] = static_cast<uint8_t>((p[2] * (255 - color.a) + + color.r * color.a) >> 8); +#endif + break; + + case 4: + *reinterpret_cast<Uint32*>(p) = SDLAlpha32(pixel, + *reinterpret_cast<Uint32*>(p), + static_cast<unsigned char>(color.a)); + break; + default: + break; + } + + SDL_UnlockSurface(surface); +} + +#endif // UTILS_SDLPIXEL_H diff --git a/src/utils/stringutils.cpp b/src/utils/stringutils.cpp index 224c2a8e8..f47f724a8 100644 --- a/src/utils/stringutils.cpp +++ b/src/utils/stringutils.cpp @@ -73,7 +73,7 @@ unsigned int atox(const std::string &str) return value; } -const char *ipToString(const int address) +const char *ipToString(const uint32_t address) { static char asciiIP[18]; diff --git a/src/utils/stringutils.h b/src/utils/stringutils.h index 4a73b3e58..7cf924d98 100644 --- a/src/utils/stringutils.h +++ b/src/utils/stringutils.h @@ -90,7 +90,7 @@ std::string toStringPrint(const unsigned int val); * @param address the address to convert to a string * @return the string representation of the address */ -const char *ipToString(const int address) A_WARN_UNUSED; +const char *ipToString(const uint32_t address) A_WARN_UNUSED; /** * A safe version of sprintf that returns a std::string of the result. diff --git a/src/utils/translation/poparser.cpp b/src/utils/translation/poparser.cpp index f0ab95005..c105bf0da 100644 --- a/src/utils/translation/poparser.cpp +++ b/src/utils/translation/poparser.cpp @@ -24,6 +24,8 @@ #include "utils/stringutils.h" +#include "utils/translation/podict.h" + #include "logger.h" #include "debug.h" diff --git a/src/utils/translation/poparser.h b/src/utils/translation/poparser.h index 08a6ac7b1..41598442b 100644 --- a/src/utils/translation/poparser.h +++ b/src/utils/translation/poparser.h @@ -21,13 +21,13 @@ #ifndef UTILS_TRANSLATION_POPARSER_H #define UTILS_TRANSLATION_POPARSER_H -#include "utils/translation/podict.h" - #include "localconsts.h" #include <sstream> #include <string> +class PoDict; + class PoParser final { public: diff --git a/src/utils/xml.h b/src/utils/xml.h index 48d60cda7..d8a281045 100644 --- a/src/utils/xml.h +++ b/src/utils/xml.h @@ -23,8 +23,8 @@ #ifndef UTILS_XML_H #define UTILS_XML_H -#include <libxml/xmlwriter.h> #include <libxml/tree.h> +#include <libxml/xmlwriter.h> #include <string> diff --git a/src/utils/xmlutils.cpp b/src/utils/xmlutils.cpp new file mode 100644 index 000000000..7d19b1064 --- /dev/null +++ b/src/utils/xmlutils.cpp @@ -0,0 +1,63 @@ +/* + * The ManaPlus Client + * Copyright (C) 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 <http://www.gnu.org/licenses/>. + */ + +#include "utils/xmlutils.h" + +#include "logger.h" + +#include "utils/xml.h" + +#include "debug.h" + +void readXmlIntVector(const std::string &fileName, + const std::string &rootName, + const std::string §ionName, + const std::string &itemName, + const std::string &attributeName, + std::vector<int> &arr) +{ + arr.clear(); + XML::Document doc(fileName); + const XmlNodePtrConst rootNode = doc.rootNode(); + + if (!rootNode || !xmlNameEqual(rootNode, rootName.c_str())) + { + logger->log("Error while loading %s!", fileName.c_str()); + return; + } + + for_each_xml_child_node(sectionNode, rootNode) + { + if (!xmlNameEqual(sectionNode, sectionName.c_str())) + continue; + for_each_xml_child_node(childNode, sectionNode) + { + if (!xmlNameEqual(childNode, itemName.c_str())) + continue; + + const int val = XML::getProperty(childNode, + attributeName.c_str(), -1); + if (val == -1) + continue; + + arr.push_back(val); + } + } +} diff --git a/src/utils/xmlutils.h b/src/utils/xmlutils.h new file mode 100644 index 000000000..3dbee5f95 --- /dev/null +++ b/src/utils/xmlutils.h @@ -0,0 +1,34 @@ +/* + * The ManaPlus Client + * Copyright (C) 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 <http://www.gnu.org/licenses/>. + */ + +#ifndef UTILS_XMLUTILS_H +#define UTILS_XMLUTILS_H + +#include <string> +#include <vector> + +void readXmlIntVector(const std::string &fileName, + const std::string &rootName, + const std::string §ionName, + const std::string &itemName, + const std::string &attributeName, + std::vector<int> &arr); + +#endif // UTILS_XMLUTILS_H diff --git a/src/utils/xmlutils_unittest.cc b/src/utils/xmlutils_unittest.cc new file mode 100644 index 000000000..5b3469805 --- /dev/null +++ b/src/utils/xmlutils_unittest.cc @@ -0,0 +1,70 @@ +/* + * The ManaPlus Client + * Copyright (C) 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 <http://www.gnu.org/licenses/>. + */ + +#include "utils/xmlutils.h" + +#include "client.h" +#include "logger.h" + +#include "gtest/gtest.h" + +#include "utils/physfstools.h" +#include "utils/xml.h" + +#include "resources/resourcemanager.h" + +#include <string> +#include <vector> + +#include "debug.h" + +static void init() +{ + PHYSFS_init("manaplus"); + dirSeparator = "/"; + XML::initXML(); + logger = new Logger(); + ResourceManager *resman = ResourceManager::getInstance(); + resman->addToSearchPath("data", false); + resman->addToSearchPath("../data", false); +} + +TEST(xmlutils, readXmlIntVector1) +{ + Client::Options options; + client = new Client(options); + init(); + + std::vector<int> arr; + + readXmlIntVector("graphics/gui/browserbox.xml", + "skinset", + "widget", + "option", + "value", + arr); + + EXPECT_EQ(5, arr.size()); + EXPECT_EQ(1, arr[0]); + EXPECT_EQ(15, arr[1]); + EXPECT_EQ(0, arr[2]); + EXPECT_EQ(1, arr[3]); + EXPECT_EQ(1, arr[4]); +} |