summaryrefslogtreecommitdiff
path: root/src/resources/imageloader.cpp
diff options
context:
space:
mode:
authorBjørn Lindeijer <bjorn@lindeijer.nl>2007-10-18 18:39:48 +0000
committerBjørn Lindeijer <bjorn@lindeijer.nl>2007-10-18 18:39:48 +0000
commit86441fda9c561dd264039edc68ddabbf7cb54ce2 (patch)
treef9d15edf9587bc149a42399369bfcf3b9d5c5b27 /src/resources/imageloader.cpp
parentd3ab0ef7be4c1f0098acc08748c308091e75dfff (diff)
downloadmana-86441fda9c561dd264039edc68ddabbf7cb54ce2.tar.gz
mana-86441fda9c561dd264039edc68ddabbf7cb54ce2.tar.bz2
mana-86441fda9c561dd264039edc68ddabbf7cb54ce2.tar.xz
mana-86441fda9c561dd264039edc68ddabbf7cb54ce2.zip
Merged removal of dependency on Guichan OpenGL from trunk to 0.0 branch,
including optimization of OpenGL memory usage on modern OpenGL drivers. Patches by Guillaume Melquiond.
Diffstat (limited to 'src/resources/imageloader.cpp')
-rw-r--r--src/resources/imageloader.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/src/resources/imageloader.cpp b/src/resources/imageloader.cpp
new file mode 100644
index 00000000..81a5cf63
--- /dev/null
+++ b/src/resources/imageloader.cpp
@@ -0,0 +1,99 @@
+/*
+ * The Mana World
+ * Copyright 2007 The Mana World Development Team
+ *
+ * This file is part of The Mana World.
+ *
+ * The Mana World 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.
+ *
+ * The Mana World 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 The Mana World; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * $Id: imageloader.cpp 3515 2007-08-25 16:56:52Z gmelquio $
+ */
+
+#include <cassert>
+#include <string>
+#include <guichan/color.hpp>
+#include <guichan/sdl/sdlpixel.hpp>
+
+#include "imageloader.h"
+
+#include "image.h"
+#include "resourcemanager.h"
+
+ProxyImage::ProxyImage(SDL_Surface *s):
+ mImage(NULL), mSDLImage(s)
+{
+}
+
+ProxyImage::~ProxyImage()
+{
+ free();
+}
+
+void ProxyImage::free()
+{
+ if (mSDLImage)
+ {
+ SDL_FreeSurface(mSDLImage);
+ mSDLImage = NULL;
+ }
+ else if (mImage)
+ {
+ delete mImage;
+ mImage = NULL;
+ }
+}
+
+int ProxyImage::getWidth() const
+{
+ return mSDLImage ? mSDLImage->w : mImage->getWidth();
+}
+
+int ProxyImage::getHeight() const
+{
+ return mSDLImage ? mSDLImage->h : mImage->getHeight();
+}
+
+gcn::Color ProxyImage::getPixel(int x, int y)
+{
+ assert(mSDLImage);
+ return gcn::SDLgetPixel(mSDLImage, x, y);
+}
+
+void ProxyImage::putPixel(int x, int y, gcn::Color const &color)
+{
+ assert(mSDLImage);
+ gcn::SDLputPixel(mSDLImage, x, y, color);
+}
+
+void ProxyImage::convertToDisplayFormat()
+{
+ assert(mSDLImage);
+ /* The picture is most probably full of the pink pixels Guichan uses for
+ transparency, as this function will only be called when setting an image
+ font. Get rid of them. */
+ SDL_SetColorKey(mSDLImage, SDL_SRCCOLORKEY,
+ SDL_MapRGB(mSDLImage->format, 255, 0, 255));
+ mImage = ::Image::load(mSDLImage, std::string());
+ SDL_FreeSurface(mSDLImage);
+ mSDLImage = NULL;
+}
+
+gcn::Image *ImageLoader::load(std::string const &filename, bool convert)
+{
+ ResourceManager *resman = ResourceManager::getInstance();
+ ProxyImage *i = new ProxyImage(resman->loadSDLSurface(filename));
+ if (convert) i->convertToDisplayFormat();
+ return i;
+}