holdingarea/libGLESv1/src/GLESTexture.cpp
branchbug235_bringup_0
changeset 24 a3f46bb01be2
parent 20 d2d6724aef32
--- a/holdingarea/libGLESv1/src/GLESTexture.cpp	Thu Sep 16 12:43:44 2010 +0100
+++ b/holdingarea/libGLESv1/src/GLESTexture.cpp	Mon Sep 20 14:29:05 2010 +0100
@@ -1,90 +1,90 @@
-/* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and /or associated documentation files
- * (the "Materials "), to deal in the Materials without restriction,
- * including without limitation the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Materials,
- * and to permit persons to whom the Materials are furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Materials.
- *
- * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR
- * THE USE OR OTHER DEALINGS IN THE MATERIALS.
- *
- * Initial Contributors:
- * Nokia Corporation - initial contribution.
- *
- * Contributors:
- *
- * Description:
- *
- */
-
-#include "GLESTexture.h"
-#include "glesInternal.h"
-
-GLESTexture::GLESTexture(unsigned int name) :
-	m_name(name),
-	m_numLevels(0),
-	m_levels(NULL)
-{
-}
-
-GLESTexture::~GLESTexture()
-{
-	delete[] m_levels;
-}
-
-bool GLESTexture::AllocateLevels(int numLevels)
-{
-	GLES_ASSERT(m_levels == NULL);
-
-	m_numLevels = numLevels;
-	m_levels = GLES_NEW GLESTextureLevel[numLevels];
-	if(m_levels == NULL)
-	{
-		return false;
-	}
-
-	for(int i = 0; i < numLevels; i++)
-	{
-		// From desktop GL spec.
-		m_levels[i].format = 1;
-		m_levels[i].width = 0;
-		m_levels[i].height = 0;
-		
-		m_levels[i].boundSurface = NULL;
-	}
-
-	return true;
-}
-
-GLESTextureLevel* GLESTexture::Level(int level)
-{
-	GLES_ASSERT(m_levels != NULL);
-	GLES_ASSERT(level >= 0 && level < m_numLevels);
-	return &m_levels[level];
-}
-
-void GLESTexture::SetLevel(int level, GLenum format, GLsizei width, GLsizei height)
-{
-	GLES_ASSERT(m_levels != NULL);
-	GLES_ASSERT(level >= 0 && level < m_numLevels);
-	m_levels[level].format = format;
-	m_levels[level].width = width;
-	m_levels[level].height = height;
-}
-
-void GLESTexture::GenerateMipmap()
-{
+/* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and /or associated documentation files
+ * (the "Materials "), to deal in the Materials without restriction,
+ * including without limitation the rights to use, copy, modify, merge,
+ * publish, distribute, sublicense, and/or sell copies of the Materials,
+ * and to permit persons to whom the Materials are furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Materials.
+ *
+ * THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR
+ * THE USE OR OTHER DEALINGS IN THE MATERIALS.
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+#include "GLESTexture.h"
+#include "glesInternal.h"
+
+GLESTexture::GLESTexture(unsigned int name) :
+	m_name(name),
+	m_numLevels(0),
+	m_levels(NULL)
+{
+}
+
+GLESTexture::~GLESTexture()
+{
+	delete[] m_levels;
+}
+
+bool GLESTexture::AllocateLevels(int numLevels)
+{
+	GLES_ASSERT(m_levels == NULL);
+
+	m_numLevels = numLevels;
+	m_levels = GLES_NEW GLESTextureLevel[numLevels];
+	if(m_levels == NULL)
+	{
+		return false;
+	}
+
+	for(int i = 0; i < numLevels; i++)
+	{
+		// From desktop GL spec.
+		m_levels[i].format = 1;
+		m_levels[i].width = 0;
+		m_levels[i].height = 0;
+		
+		m_levels[i].boundSurface = NULL;
+	}
+
+	return true;
+}
+
+GLESTextureLevel* GLESTexture::Level(int level)
+{
+	GLES_ASSERT(m_levels != NULL);
+	GLES_ASSERT(level >= 0 && level < m_numLevels);
+	return &m_levels[level];
+}
+
+void GLESTexture::SetLevel(int level, GLenum format, GLsizei width, GLsizei height)
+{
+	GLES_ASSERT(m_levels != NULL);
+	GLES_ASSERT(level >= 0 && level < m_numLevels);
+	m_levels[level].format = format;
+	m_levels[level].width = width;
+	m_levels[level].height = height;
+}
+
+void GLESTexture::GenerateMipmap()
+{
 	GLES_ASSERT(m_levels != NULL);
 
 	const GLESTextureLevel& level_zero = m_levels[0];
@@ -104,234 +104,234 @@
 		m_levels[level].format = level_zero.format;
 		m_levels[level].width = width;
 		m_levels[level].height = height;
-	}
-}
-
-bool glesIsValidCompressedFormat(GLenum format)
-{
-	switch(format)
-	{
-	case GL_PALETTE4_RGB8_OES:
-	case GL_PALETTE4_RGBA8_OES:
-	case GL_PALETTE4_R5_G6_B5_OES:
-	case GL_PALETTE4_RGBA4_OES:
-	case GL_PALETTE4_RGB5_A1_OES:
-	case GL_PALETTE8_RGB8_OES:
-	case GL_PALETTE8_RGBA8_OES:
-	case GL_PALETTE8_R5_G6_B5_OES:
-	case GL_PALETTE8_RGBA4_OES:
-	case GL_PALETTE8_RGB5_A1_OES:
-		return true;
-	default:
-		return false;
-	}
-}
-
-GLenum glesMapCompressedToBaseFormat(GLenum format)
-{
-	switch(format)
-	{
-	case GL_PALETTE4_RGB8_OES:
-	case GL_PALETTE4_R5_G6_B5_OES:
-	case GL_PALETTE8_RGB8_OES:
-	case GL_PALETTE8_R5_G6_B5_OES:
-		return GL_RGB;
-
-	case GL_PALETTE4_RGBA8_OES:
-	case GL_PALETTE4_RGBA4_OES:
-	case GL_PALETTE4_RGB5_A1_OES:
-	case GL_PALETTE8_RGBA8_OES:
-	case GL_PALETTE8_RGBA4_OES:
-	case GL_PALETTE8_RGB5_A1_OES:
-		return GL_RGBA;
-	
-	default:
-		GLES_ASSERT(false);
-	}
-
-	// not reached
-	return 0;
-}
-
-void* glesUncompressImage(int level, GLenum format, int width, int height, int imageSize, const void* data)
-{
-	const unsigned char* palette = static_cast<const unsigned char*>(data);
-	int bitsPerPixel;
-	int paletteEntrySize;
-	
-	switch(format)
-	{
-	case GL_PALETTE4_RGB8_OES:
-		bitsPerPixel = 4;
-		paletteEntrySize = 3;
-		break;
-
-	case GL_PALETTE4_RGBA8_OES:
-		bitsPerPixel = 4;
-		paletteEntrySize = 4;
-		break;
-
-	case GL_PALETTE4_R5_G6_B5_OES:
-	case GL_PALETTE4_RGB5_A1_OES:
-	case GL_PALETTE4_RGBA4_OES:
-		bitsPerPixel = 4;
-		paletteEntrySize = 2;
-		break;
-
-	case GL_PALETTE8_RGB8_OES:
-		bitsPerPixel = 8;
-		paletteEntrySize = 3;
-		break;
-
-	case GL_PALETTE8_RGBA8_OES:
-		bitsPerPixel = 8;
-		paletteEntrySize = 4;
-		break;
-
-	case GL_PALETTE8_R5_G6_B5_OES:
-	case GL_PALETTE8_RGBA4_OES:
-	case GL_PALETTE8_RGB5_A1_OES:
-		bitsPerPixel = 8;
-		paletteEntrySize = 2;
-		break;
-
-	default:
-		GLES_ASSERT(false);
-	}
-
-	int numPaletteEntries = 2 << (bitsPerPixel - 1);
-	const unsigned char* imageData = palette + numPaletteEntries * paletteEntrySize;
-
-	// Skip to the correct mip level
-	for(int i = 0; i < level; i++)
-	{
-		if(bitsPerPixel == 8)
-		{
-			imageData += width * height * bitsPerPixel / 8;
-		}
-		else
-		{
-			GLES_ASSERT(bitsPerPixel == 4);
-			imageData += width * height * bitsPerPixel / 8 / 2;
-		}
-		width /= 2;
-		height /= 2;
-	}
-
-	int bytesPerPixel;
-	GLenum baseFormat = glesMapCompressedToBaseFormat(format);
-	if(baseFormat == GL_RGB)
-	{
-		bytesPerPixel = 3;
-	}
-	else
-	{
-		GLES_ASSERT(baseFormat == GL_RGBA);
-		bytesPerPixel = 4;
-	}
-
-	char* uncompressedData = GLES_NEW char[width * height * bytesPerPixel];
-	if(uncompressedData == NULL)
-	{
-		return NULL;
-	}
-	
-	// Don't go past the end of the data
-	int pixelsPerByte = 8 / bitsPerPixel;
-	int maxPixels = (static_cast<const unsigned char*>(data) + imageSize - imageData) * pixelsPerByte;
-	int end = GLES_MIN(width * height, maxPixels);
-
-	for(int i = 0; i < end; i++)
-	{
-		int index;
-		if(bitsPerPixel == 4)
-		{
-			if(i & 1)
-			{
-				index = imageData[i / 2] & 15;
-			}
-			else
-			{
-				index = imageData[i / 2] >> 4;
-			}
-		}
-		else
-		{
-			GLES_ASSERT(bitsPerPixel == 8);
-			index = imageData[i];
-		}
-
-		int r, g, b, a;
-
-		switch(format)
-		{
-		case GL_PALETTE4_RGB8_OES:
-		case GL_PALETTE8_RGB8_OES:
-			r = palette[index*3];
-			g = palette[index*3+1];
-			b = palette[index*3+2];
-			break;
-
-		case GL_PALETTE4_RGBA8_OES:
-		case GL_PALETTE8_RGBA8_OES:
-			r = palette[index*4];
-			g = palette[index*4+1];
-			b = palette[index*4+2];
-			a = palette[index*4+3];
-			break;
-
-		case GL_PALETTE4_R5_G6_B5_OES:
-		case GL_PALETTE8_R5_G6_B5_OES:
-			r = palette[index*2+1] >> 3;
-			r = (r << 3) | (r >> 2);
-			g = ((palette[index*2+1] & 7) << 3) | (palette[index*2] >> 5);
-			g = (g << 2) | (g >> 4);
-			b = palette[index*2] & 0x1f;
-			b = (b << 3) | (b >> 2);
-			break;
-
-		case GL_PALETTE4_RGBA4_OES:
-		case GL_PALETTE8_RGBA4_OES:
-			r = palette[index*2+1] >> 4;
-			r |= (r << 4) | r;
-			g = palette[index*2+1] & 0xf;
-			g |= (g << 4) | g;
-			b = palette[index*2] >> 4;
-			b |= (b << 4) | b;
-			a = palette[index*2] & 0xf;
-			a |= (a << 4) | a;
-			break;
-
-		case GL_PALETTE4_RGB5_A1_OES:
-		case GL_PALETTE8_RGB5_A1_OES:
-			r = palette[index*2+1] >> 3;
-			r = (r << 3) | (r >> 2);
-			g = ((palette[index*2+1] & 7) << 2) | (palette[index*2] >> 6);
-			g = (g << 3) | (g >> 2);
-			b = (palette[index*2] >> 1) & 0x1f;
-			b = (b << 3) | (b >> 2);
-			a = (palette[index*2] & 1) ? 255 : 0;
-			break;
-			
-		default:
-			GLES_ASSERT(false);
-		}
-
-		if(baseFormat == GL_RGB)
-		{
-			uncompressedData[i*3+0] = r;
-			uncompressedData[i*3+1] = g;
-			uncompressedData[i*3+2] = b;
-		}
-		else
-		{
-			GLES_ASSERT(baseFormat == GL_RGBA);
-			uncompressedData[i*4+0] = r;
-			uncompressedData[i*4+1] = g;
-			uncompressedData[i*4+2] = b;
-			uncompressedData[i*4+3] = a;
-		}
-	}
-
-	return uncompressedData;
+	}
+}
+
+bool glesIsValidCompressedFormat(GLenum format)
+{
+	switch(format)
+	{
+	case GL_PALETTE4_RGB8_OES:
+	case GL_PALETTE4_RGBA8_OES:
+	case GL_PALETTE4_R5_G6_B5_OES:
+	case GL_PALETTE4_RGBA4_OES:
+	case GL_PALETTE4_RGB5_A1_OES:
+	case GL_PALETTE8_RGB8_OES:
+	case GL_PALETTE8_RGBA8_OES:
+	case GL_PALETTE8_R5_G6_B5_OES:
+	case GL_PALETTE8_RGBA4_OES:
+	case GL_PALETTE8_RGB5_A1_OES:
+		return true;
+	default:
+		return false;
+	}
+}
+
+GLenum glesMapCompressedToBaseFormat(GLenum format)
+{
+	switch(format)
+	{
+	case GL_PALETTE4_RGB8_OES:
+	case GL_PALETTE4_R5_G6_B5_OES:
+	case GL_PALETTE8_RGB8_OES:
+	case GL_PALETTE8_R5_G6_B5_OES:
+		return GL_RGB;
+
+	case GL_PALETTE4_RGBA8_OES:
+	case GL_PALETTE4_RGBA4_OES:
+	case GL_PALETTE4_RGB5_A1_OES:
+	case GL_PALETTE8_RGBA8_OES:
+	case GL_PALETTE8_RGBA4_OES:
+	case GL_PALETTE8_RGB5_A1_OES:
+		return GL_RGBA;
+	
+	default:
+		GLES_ASSERT(false);
+	}
+
+	// not reached
+	return 0;
+}
+
+void* glesUncompressImage(int level, GLenum format, int width, int height, int imageSize, const void* data)
+{
+	const unsigned char* palette = static_cast<const unsigned char*>(data);
+	int bitsPerPixel;
+	int paletteEntrySize;
+	
+	switch(format)
+	{
+	case GL_PALETTE4_RGB8_OES:
+		bitsPerPixel = 4;
+		paletteEntrySize = 3;
+		break;
+
+	case GL_PALETTE4_RGBA8_OES:
+		bitsPerPixel = 4;
+		paletteEntrySize = 4;
+		break;
+
+	case GL_PALETTE4_R5_G6_B5_OES:
+	case GL_PALETTE4_RGB5_A1_OES:
+	case GL_PALETTE4_RGBA4_OES:
+		bitsPerPixel = 4;
+		paletteEntrySize = 2;
+		break;
+
+	case GL_PALETTE8_RGB8_OES:
+		bitsPerPixel = 8;
+		paletteEntrySize = 3;
+		break;
+
+	case GL_PALETTE8_RGBA8_OES:
+		bitsPerPixel = 8;
+		paletteEntrySize = 4;
+		break;
+
+	case GL_PALETTE8_R5_G6_B5_OES:
+	case GL_PALETTE8_RGBA4_OES:
+	case GL_PALETTE8_RGB5_A1_OES:
+		bitsPerPixel = 8;
+		paletteEntrySize = 2;
+		break;
+
+	default:
+		GLES_ASSERT(false);
+	}
+
+	int numPaletteEntries = 2 << (bitsPerPixel - 1);
+	const unsigned char* imageData = palette + numPaletteEntries * paletteEntrySize;
+
+	// Skip to the correct mip level
+	for(int i = 0; i < level; i++)
+	{
+		if(bitsPerPixel == 8)
+		{
+			imageData += width * height * bitsPerPixel / 8;
+		}
+		else
+		{
+			GLES_ASSERT(bitsPerPixel == 4);
+			imageData += width * height * bitsPerPixel / 8 / 2;
+		}
+		width /= 2;
+		height /= 2;
+	}
+
+	int bytesPerPixel;
+	GLenum baseFormat = glesMapCompressedToBaseFormat(format);
+	if(baseFormat == GL_RGB)
+	{
+		bytesPerPixel = 3;
+	}
+	else
+	{
+		GLES_ASSERT(baseFormat == GL_RGBA);
+		bytesPerPixel = 4;
+	}
+
+	char* uncompressedData = GLES_NEW char[width * height * bytesPerPixel];
+	if(uncompressedData == NULL)
+	{
+		return NULL;
+	}
+	
+	// Don't go past the end of the data
+	int pixelsPerByte = 8 / bitsPerPixel;
+	int maxPixels = (static_cast<const unsigned char*>(data) + imageSize - imageData) * pixelsPerByte;
+	int end = GLES_MIN(width * height, maxPixels);
+
+	for(int i = 0; i < end; i++)
+	{
+		int index;
+		if(bitsPerPixel == 4)
+		{
+			if(i & 1)
+			{
+				index = imageData[i / 2] & 15;
+			}
+			else
+			{
+				index = imageData[i / 2] >> 4;
+			}
+		}
+		else
+		{
+			GLES_ASSERT(bitsPerPixel == 8);
+			index = imageData[i];
+		}
+
+		int r, g, b, a;
+
+		switch(format)
+		{
+		case GL_PALETTE4_RGB8_OES:
+		case GL_PALETTE8_RGB8_OES:
+			r = palette[index*3];
+			g = palette[index*3+1];
+			b = palette[index*3+2];
+			break;
+
+		case GL_PALETTE4_RGBA8_OES:
+		case GL_PALETTE8_RGBA8_OES:
+			r = palette[index*4];
+			g = palette[index*4+1];
+			b = palette[index*4+2];
+			a = palette[index*4+3];
+			break;
+
+		case GL_PALETTE4_R5_G6_B5_OES:
+		case GL_PALETTE8_R5_G6_B5_OES:
+			r = palette[index*2+1] >> 3;
+			r = (r << 3) | (r >> 2);
+			g = ((palette[index*2+1] & 7) << 3) | (palette[index*2] >> 5);
+			g = (g << 2) | (g >> 4);
+			b = palette[index*2] & 0x1f;
+			b = (b << 3) | (b >> 2);
+			break;
+
+		case GL_PALETTE4_RGBA4_OES:
+		case GL_PALETTE8_RGBA4_OES:
+			r = palette[index*2+1] >> 4;
+			r |= (r << 4) | r;
+			g = palette[index*2+1] & 0xf;
+			g |= (g << 4) | g;
+			b = palette[index*2] >> 4;
+			b |= (b << 4) | b;
+			a = palette[index*2] & 0xf;
+			a |= (a << 4) | a;
+			break;
+
+		case GL_PALETTE4_RGB5_A1_OES:
+		case GL_PALETTE8_RGB5_A1_OES:
+			r = palette[index*2+1] >> 3;
+			r = (r << 3) | (r >> 2);
+			g = ((palette[index*2+1] & 7) << 2) | (palette[index*2] >> 6);
+			g = (g << 3) | (g >> 2);
+			b = (palette[index*2] >> 1) & 0x1f;
+			b = (b << 3) | (b >> 2);
+			a = (palette[index*2] & 1) ? 255 : 0;
+			break;
+			
+		default:
+			GLES_ASSERT(false);
+		}
+
+		if(baseFormat == GL_RGB)
+		{
+			uncompressedData[i*3+0] = r;
+			uncompressedData[i*3+1] = g;
+			uncompressedData[i*3+2] = b;
+		}
+		else
+		{
+			GLES_ASSERT(baseFormat == GL_RGBA);
+			uncompressedData[i*4+0] = r;
+			uncompressedData[i*4+1] = g;
+			uncompressedData[i*4+2] = b;
+			uncompressedData[i*4+3] = a;
+		}
+	}
+
+	return uncompressedData;
 }
\ No newline at end of file