-/*******************************************************************************
-
- Copyright (c) 2009, Charles McGarvey
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- * 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.
-
- 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 HOLDER 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.
-
-*******************************************************************************/
+/*] Copyright (c) 2009-2010, Charles McGarvey [**************************
+**] All rights reserved.
+*
+* vi:ts=4 sw=4 tw=75
+*
+* Distributable under the terms and conditions of the 2-clause BSD license;
+* see the file COPYING for a complete text of the license.
+*
+**************************************************************************/
#include <cstdio> // FILE
#include <cstring> // strncmp
-#include <SDL/SDL.h>
+#include <boost/algorithm/string.hpp>
+
#include <png.h>
+#include <SDL/SDL.h>
-#include "Core.hh"
+#include "Backend.hh"
#include "Error.hh"
#include "Image.hh"
-#include "Library.hh"
#include "Log.hh"
+#include "Manager.hh"
namespace Mf {
-class Image::Impl : public Library<Impl>
+class Image::Impl : public Manager<Impl>
{
public:
- explicit Impl(const std::string& name, bool flipped = false) :
- Library<Impl>(name),
+ explicit Impl() :
mContext(0),
- mPixels(0)
- {
- init(getName(), flipped);
- }
+ mPixels(0) {}
~Impl()
{
}
- SDL_Surface* mContext;
- char* mPixels;
-
- unsigned mDepth;
- GLuint mColorMode;
-
- std::string mComment;
-
-
-private:
-
- Backend mBackend;
-
- bool init(const std::string& filePath, bool flipped)
+ void init(const std::string& name, bool flipped = false)
{
- logInfo("opening image file...");
- FILE* fp = fopen(filePath.c_str(), "rb");
- if (!fp) return false;
+ std::string path(name);
+
+ FILE* fp = Image::openFile(path);
+ if (!fp) return;
png_byte signature[8];
size_t bytesRead;
png_textp texts = 0;
int numTexts;
- logInfo("checking signature...");
bytesRead = fread(signature, 1, sizeof(signature), fp);
- logInfo << "reading " << bytesRead << " bytes of signature" << std::endl;
if (bytesRead < sizeof(signature) ||
png_sig_cmp(signature, 0, sizeof(signature)) != 0) goto cleanup;
- logInfo("creating png structures...");
pngObj = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
if (!pngObj) goto cleanup;
pngInfoEnd = png_create_info_struct(pngObj);
if (!pngInfoEnd) goto cleanup;
- logInfo("setting up long jump...");
if (setjmp(png_jmpbuf(pngObj))) goto cleanup;
png_init_io(pngObj, fp);
png_read_info(pngObj, pngInfo);
bpp = png_get_bit_depth(pngObj, pngInfo);
- logInfo << "texture bpp: " << bpp << std::endl;
colors = png_get_color_type(pngObj, pngInfo);
switch (colors)
{
break;
case PNG_COLOR_TYPE_GRAY:
- if (bpp < 8) png_set_gray_1_2_4_to_8(pngObj);
+ if (bpp < 8) png_set_expand(pngObj);
break;
case PNG_COLOR_TYPE_GRAY_ALPHA:
channels = png_get_channels(pngObj, pngInfo);
mDepth = bpp * channels;
- logInfo << "texture channels: " << channels << std::endl;
if (channels == 3) mColorMode = GL_RGB;
else mColorMode = GL_RGBA;
// read comments
png_get_text(pngObj, pngInfo, &texts, &numTexts);
- logInfo << "num texts: " << numTexts << std::endl;
for (int i = 0; i < numTexts; ++i)
{
- if (strncmp(texts[i].key, "Comment", 7) == 0)
+ if (strncmp(texts[i].key, "TextureInfo", 11) == 0)
{
mComment = texts[i].text;
break;
{
for (int i = 0; i < height; ++i)
{
- rows[height - 1 - i] = (png_bytep)(mPixels + i * channels * width);
+ rows[height - 1 - i] = (png_bytep)(mPixels +
+ i * channels * width);
}
}
else
cleanup:
- logInfo("cleaning up...");
delete[] rows;
png_destroy_read_struct(pngObj ? &pngObj : 0,
pngInfo ? &pngInfo : 0,
pngInfoEnd ? &pngInfoEnd : 0);
fclose(fp);
-
- return mContext;
}
+
+
+ SDL_Surface* mContext;
+ char* mPixels;
+
+ unsigned mDepth;
+ GLuint mColorMode;
+
+ std::string mComment;
+
+private:
+
+ Backend mBackend;
};
return mImpl->mContext->pitch;
}
-GLuint Image::getColorMode() const
+GLuint Image::getMode() const
{
return mImpl->mColorMode;
}
}
+bool Image::getPath(std::string& name)
+{
+ return Resource::getPath(name, "images/", "png");
+}
-std::string Image::getPath(const std::string& name)
+FILE* Image::openFile(std::string& name)
{
- std::string path = Resource::getPath("images/" + name + ".png");
- return path;
+ return Resource::openFile(name, "images/", "png");
}
} // namespace Mf
-/** vim: set ts=4 sw=4 tw=80: *************************************************/
-