X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FTexture.cc;h=22d3f15e92cab597259673d86c08cd2f4692d292;hp=61cabd2c89296eb06e24884cd289448a7fb39ce1;hb=b357615aba1dbde81e3c6999366604e6001010a7;hpb=246d7d6e4386b686327163d621c7c8b398b7d479 diff --git a/src/Moof/Texture.cc b/src/Moof/Texture.cc index 61cabd2..22d3f15 100644 --- a/src/Moof/Texture.cc +++ b/src/Moof/Texture.cc @@ -26,16 +26,15 @@ *******************************************************************************/ -#include // memcpy +#include // FILE +#include // strncmp #include -#include -#include - #include "Dispatch.hh" #include "Engine.hh" #include "Exception.hh" +#include "Image.hh" #include "Library.hh" #include "Log.hh" #include "OpenGL.hh" @@ -50,8 +49,8 @@ namespace Mf { * which is worth having in memory. The image data itself is not worth keeping * in memory if the texture has been loaded to GL, but the name of the resource * is retained so that it can be reloaded if necessary. The implementation is a - * mippleton so that multiple texture objects can share the same internal - * objects and avoid having duplicate textures loaded to GL. + * library so that multiple texture objects can share the same internal objects + * and avoid having duplicate textures loaded to GL. */ class Texture::Impl : public Library @@ -103,29 +102,6 @@ class Texture::Impl : public Library return value; } - - static void flipSurface(SDL_Surface* image) - { - unsigned char* pixels = (Uint8*)(image->pixels); - - unsigned pitch = image->pitch; - unsigned char line[pitch]; - - int yBegin = 0; - int yEnd = image->h - 1; - - if (SDL_MUSTLOCK(image)) SDL_LockSurface(image); - while (yBegin < yEnd) - { - memcpy(line, pixels + pitch * yBegin, pitch); - memcpy(pixels + pitch * yBegin, pixels + pitch * yEnd, pitch); - memcpy(pixels + pitch * yEnd, line, pitch); - yBegin++; - yEnd--; - } - if (SDL_MUSTLOCK(image)) SDL_UnlockSurface(image); - } - public: /** @@ -134,7 +110,8 @@ public: explicit Impl(const std::string& name) : Library(name), - mContext(0), + //mContext(0), + mImage(Texture::getPath(getName())), mWidth(0), mHeight(0), mMode(0), @@ -158,11 +135,6 @@ public: ~Impl() { - if (mContext) - { - SDL_FreeSurface(mContext); - } - unloadFromGL(); } @@ -174,6 +146,7 @@ public: * method makes them ready. */ + /* static SDL_Surface* prepareImageForGL(SDL_Surface* surface) { int w = powerOfTwo(surface->w); @@ -234,6 +207,7 @@ public: return image; } + */ /** * Use SDL_image to load images from file. A surface with the image data is @@ -243,42 +217,17 @@ public: void loadFromFile() { - SDL_Surface* surface; - - surface = IMG_Load(Texture::getPath(getName()).c_str()); - - if (!surface) + if (!mImage.isValid()) { logWarning << "texture not found: " << getName() << std::endl; - throw Exception(ErrorCode::FILE_NOT_FOUND, getName()); - } - - SDL_Surface* temp = prepareImageForGL(surface); - SDL_FreeSurface(surface); - - if (!temp) - { - throw Exception(ErrorCode::UNKNOWN_IMAGE_FORMAT, getName()); - } - - if (temp->format->BytesPerPixel == 3) - { - mMode = GL_RGB; - } - else if (temp->format->BytesPerPixel == 4) - { - mMode = GL_RGBA; - } - else - { - SDL_FreeSurface(temp); - throw Exception(ErrorCode::UNKNOWN_IMAGE_FORMAT, getName()); + throw Exception(ErrorCode::RESOURCE_NOT_FOUND, getName()); } - mWidth = temp->w; - mHeight = temp->h; + mImage.flip(); - mContext = temp; + mWidth = mImage.getWidth(); + mHeight = mImage.getHeight(); + mMode = mImage.getColorMode(); } @@ -295,7 +244,7 @@ public: return; } - if (!mContext) loadFromFile(); + //if (!mContext) loadFromFile(); glGenTextures(1, &mObject); glBindTexture(GL_TEXTURE_2D, mObject); @@ -307,18 +256,18 @@ public: 0, mMode, //3, - mContext->w, - mContext->h, + mWidth, + mHeight, 0, mMode, GL_UNSIGNED_BYTE, - mContext->pixels + mImage.getPixels() ); setProperties(); - SDL_FreeSurface(mContext); - mContext = 0; + //SDL_FreeSurface(mContext); + //mContext = 0; } @@ -378,7 +327,7 @@ public: } - SDL_Surface* mContext; + Image mImage; unsigned mWidth; ///< Horizontal dimension of the image. unsigned mHeight; ///< Vertical dimension.