Browse Source

Image settings now survive setMode, fixes bug #10

Bart van Strien 15 years ago
parent
commit
29c68d06f1

+ 19 - 14
src/modules/graphics/opengl/Image.cpp

@@ -1,14 +1,14 @@
 /**
 * Copyright (c) 2006-2010 LOVE Development Team
-* 
+*
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
-* 
+*
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
-* 
+*
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
@@ -106,7 +106,7 @@ namespace opengl
 	void Image::draw(float x, float y, float angle, float sx, float sy, float ox, float oy) const
 	{
 		static Matrix t;
-		
+
 		t.setTransformation(x, y, angle, sx, sy, ox, oy);
 		drawv(t, vertices);
 	}
@@ -165,7 +165,7 @@ namespace opengl
 		glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, &gmag);
 
 		Image::Filter f;
-		
+
 		switch(gmin)
 		{
 		case GL_NEAREST:
@@ -272,7 +272,7 @@ namespace opengl
 
 	void Image::unload()
 	{
-		unloadVolatile();
+		return unloadVolatile();
 	}
 
 	bool Image::loadVolatile()
@@ -285,21 +285,26 @@ namespace opengl
 		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 
-		glTexImage2D(GL_TEXTURE_2D, 
-			0, 
-			GL_RGBA8, 
-			(GLsizei)width, 
-			(GLsizei)height, 
-			0, 
-			GL_RGBA, 
-			GL_UNSIGNED_BYTE, 
+		glTexImage2D(GL_TEXTURE_2D,
+			0,
+			GL_RGBA8,
+			(GLsizei)width,
+			(GLsizei)height,
+			0,
+			GL_RGBA,
+			GL_UNSIGNED_BYTE,
 			data->getData());
 
+		setFilter(settings.filter);
+		setWrap(settings.wrap);
+
 		return true;
 	}
 
 	void Image::unloadVolatile()
 	{
+		settings.filter = getFilter();
+		settings.wrap = getWrap();
 		// Delete the hardware texture.
 		if(texture != 0)
 		{

+ 22 - 15
src/modules/graphics/opengl/Image.h

@@ -1,14 +1,14 @@
 /**
 * Copyright (c) 2006-2010 LOVE Development Team
-* 
+*
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
-* 
+*
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
-* 
+*
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
@@ -39,11 +39,11 @@ namespace graphics
 {
 namespace opengl
 {
-	
+
 	/**
 	* A drawable image based on OpenGL-textures. This class takes ImageData
-	* objects and create textures on the GPU for fast drawing. 
-	* 
+	* objects and create textures on the GPU for fast drawing.
+	*
 	* @author Anders Ruud
 	**/
 	class Image : public love::graphics::Image
@@ -53,7 +53,7 @@ namespace opengl
 		// The ImageData from which the texture is created.
 		love::image::ImageData * data;
 
-		// Width and height of the hardware texture. 
+		// Width and height of the hardware texture.
 		float width, height;
 
 		// OpenGL texture identifier.
@@ -62,16 +62,23 @@ namespace opengl
 		// The source vertices of the image.
 		vertex vertices[4];
 
+		// The settings we need to save when reloading.
+		struct
+		{
+			Image::Filter filter;
+			Image::Wrap wrap;
+		} settings;
+
 	public:
 
 		/**
 		* Creates a new Image. Not that anything is ready to use
 		* before load is called.
-		* 
+		*
 		* @param file The file from which to load the image.
 		**/
 		Image(love::image::ImageData * data);
-		
+
 		/**
 		* Destructor. Deletes the hardware texture and other resources.
 		**/
@@ -81,15 +88,15 @@ namespace opengl
 		float getHeight() const;
 
 		const vertex * getVertices() const;
-		
+
 		love::image::ImageData * getData() const;
 
 		/**
 		* Generate vertices according to a subimage.
-		* 
-		* Note: out-of-range values will be clamped. 
+		*
+		* Note: out-of-range values will be clamped.
 		* Note: the vertex colors will not be changed.
-		* 
+		*
 		* @param x The top-left corner of the subimage along the x-axis.
 		* @param y The top-left corner of the subimage along the y-axis.
 		* @param w The width of the subimage.
@@ -131,14 +138,14 @@ namespace opengl
 
 		// Implements Volatile.
 		bool loadVolatile();
-		void unloadVolatile();		
+		void unloadVolatile();
 
 	private:
 
 		void drawv(const Matrix & t, const vertex * v) const;
 
 	}; // Image
-	
+
 } // opengl
 } // graphics
 } // love

+ 11 - 11
src/modules/sound/lullaby/VorbisDecoder.cpp

@@ -1,14 +1,14 @@
 /**
 * Copyright (c) 2006-2010 LOVE Development Team
-* 
+*
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
-* 
+*
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
-* 
+*
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
@@ -39,9 +39,9 @@ namespace lullaby
 		return 1;
 	}
 
-	size_t vorbisRead(void * ptr		/* ptr to the data that the vorbis files need*/, 
-					  size_t byteSize	/* how big a byte is*/, 
-					  size_t sizeToRead	/* How much we can read*/, 
+	size_t vorbisRead(void * ptr		/* ptr to the data that the vorbis files need*/,
+					  size_t byteSize	/* how big a byte is*/,
+					  size_t sizeToRead	/* How much we can read*/,
 					  void * datasource	/* this is a pointer to the data we passed into ov_open_callbacks (our SOggFile struct*/)
 	{
 		size_t				spaceToEOF;			// How much more we can read till we hit the EOF marker
@@ -56,8 +56,8 @@ namespace lullaby
 		if ((sizeToRead*byteSize) < spaceToEOF)
 			actualSizeToRead = (sizeToRead*byteSize);
 		else
-			actualSizeToRead = spaceToEOF;	
-		
+			actualSizeToRead = spaceToEOF;
+
 		// A simple copy of the data from memory to the datastruct that the vorbis libs will use
 		if (actualSizeToRead)
 		{
@@ -100,7 +100,7 @@ namespace lullaby
 			if (offset < spaceToEOF)
 				actualOffset = (offset);
 			else
-				actualOffset = spaceToEOF;	
+				actualOffset = spaceToEOF;
 			// Seek from our currrent location
 			vorbisData->dataRead += (int)actualOffset;
 			break;
@@ -133,7 +133,7 @@ namespace lullaby
 		vorbisCallbacks.seek_func  = vorbisSeek;
 		vorbisCallbacks.read_func  = vorbisRead;
 		vorbisCallbacks.tell_func  = vorbisTell;
-		
+
 		// Check endianness
 #ifdef LOVE_BIG_ENDIAN
 		endian = 1;
@@ -149,7 +149,7 @@ namespace lullaby
 		// Open Vorbis handle
 		if(ov_open_callbacks(&oggFile, &handle, NULL, 0, vorbisCallbacks) < 0)
 			throw love::Exception("Could not read Ogg bitstream");
-		
+
 		// Get info and comments
 		vorbisInfo = ov_info(&handle, -1);
 		vorbisComment = ov_comment(&handle, -1);