[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [14268] trunk/blender/source/blender/imbuf /intern/dds: This is patches:

Kent Mein mein at cs.umn.edu
Fri Mar 28 15:44:34 CET 2008


Revision: 14268
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=14268
Author:   sirdude
Date:     2008-03-28 15:44:31 +0100 (Fri, 28 Mar 2008)

Log Message:
-----------
This is patches:

[#8578] imbuf for DDS textures: minor bugs fixed 
	(syncing with upstream nvidia texture tools)
[#8727] imbuf for DDS textures: fix for DXT5 alpha channel corruption

Submitted by our DDS person, Amorilia

Kent

Modified Paths:
--------------
    trunk/blender/source/blender/imbuf/intern/dds/BlockDXT.cpp
    trunk/blender/source/blender/imbuf/intern/dds/BlockDXT.h
    trunk/blender/source/blender/imbuf/intern/dds/ColorBlock.cpp
    trunk/blender/source/blender/imbuf/intern/dds/ColorBlock.h
    trunk/blender/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp

Modified: trunk/blender/source/blender/imbuf/intern/dds/BlockDXT.cpp
===================================================================
--- trunk/blender/source/blender/imbuf/intern/dds/BlockDXT.cpp	2008-03-28 00:30:46 UTC (rev 14267)
+++ trunk/blender/source/blender/imbuf/intern/dds/BlockDXT.cpp	2008-03-28 14:44:31 UTC (rev 14268)
@@ -277,7 +277,7 @@
 
 void AlphaBlockDXT5::evaluatePalette(uint8 alpha[8]) const
 {
-	if (alpha0 > alpha1) {
+	if (alpha0() > alpha1()) {
 		evaluatePalette8(alpha);
 	}
 	else {
@@ -289,8 +289,8 @@
 {
 	// 8-alpha block:  derive the other six alphas.
 	// Bit code 000 = alpha0, 001 = alpha1, others are interpolated.
-	alpha[0] = alpha0;
-	alpha[1] = alpha1;
+	alpha[0] = alpha0();
+	alpha[1] = alpha1();
 	alpha[2] = (6 * alpha[0] + 1 * alpha[1]) / 7;	// bit code 010
 	alpha[3] = (5 * alpha[0] + 2 * alpha[1]) / 7;	// bit code 011
 	alpha[4] = (4 * alpha[0] + 3 * alpha[1]) / 7;	// bit code 100
@@ -303,8 +303,8 @@
 {
 	// 6-alpha block.
 	// Bit code 000 = alpha0, 001 = alpha1, others are interpolated.
-	alpha[0] = alpha0;
-	alpha[1] = alpha1;
+	alpha[0] = alpha0();
+	alpha[1] = alpha1();
 	alpha[2] = (4 * alpha[0] + 1 * alpha[1]) / 5;	// Bit code 010
 	alpha[3] = (3 * alpha[0] + 2 * alpha[1]) / 5;	// Bit code 011
 	alpha[4] = (2 * alpha[0] + 3 * alpha[1]) / 5;	// Bit code 100
@@ -315,22 +315,22 @@
 
 void AlphaBlockDXT5::indices(uint8 index_array[16]) const
 {
-	index_array[0x0] = bits0;
-	index_array[0x1] = bits1;
-	index_array[0x2] = bits2;
-	index_array[0x3] = bits3;
-	index_array[0x4] = bits4;
-	index_array[0x5] = bits5;
-	index_array[0x6] = bits6;
-	index_array[0x7] = bits7;
-	index_array[0x8] = bits8;
-	index_array[0x9] = bits9;
-	index_array[0xA] = bitsA;
-	index_array[0xB] = bitsB;
-	index_array[0xC] = bitsC;
-	index_array[0xD] = bitsD;
-	index_array[0xE] = bitsE;
-	index_array[0xF] = bitsF;
+	index_array[0x0] = bits0();
+	index_array[0x1] = bits1();
+	index_array[0x2] = bits2();
+	index_array[0x3] = bits3();
+	index_array[0x4] = bits4();
+	index_array[0x5] = bits5();
+	index_array[0x6] = bits6();
+	index_array[0x7] = bits7();
+	index_array[0x8] = bits8();
+	index_array[0x9] = bits9();
+	index_array[0xA] = bitsA();
+	index_array[0xB] = bitsB();
+	index_array[0xC] = bitsC();
+	index_array[0xD] = bitsD();
+	index_array[0xE] = bitsE();
+	index_array[0xF] = bitsF();
 }
 
 uint AlphaBlockDXT5::index(uint index) const

Modified: trunk/blender/source/blender/imbuf/intern/dds/BlockDXT.h
===================================================================
--- trunk/blender/source/blender/imbuf/intern/dds/BlockDXT.h	2008-03-28 00:30:46 UTC (rev 14267)
+++ trunk/blender/source/blender/imbuf/intern/dds/BlockDXT.h	2008-03-28 14:44:31 UTC (rev 14268)
@@ -143,29 +143,51 @@
 /// DXT5 alpha block.
 struct AlphaBlockDXT5
 {
+	// uint64 unions do not compile on all platforms
+	/*
 	union {
 		struct {
-			unsigned int alpha0 : 8;	// 8
-			unsigned int alpha1 : 8;	// 16
-			unsigned int bits0 : 3;		// 3 - 19
-			unsigned int bits1 : 3; 	// 6 - 22
-			unsigned int bits2 : 3; 	// 9 - 25
-			unsigned int bits3 : 3;		// 12 - 28
-			unsigned int bits4 : 3;		// 15 - 31
-			unsigned int bits5 : 3;		// 18 - 34
-			unsigned int bits6 : 3;		// 21 - 37
-			unsigned int bits7 : 3;		// 24 - 40
-			unsigned int bits8 : 3;		// 27 - 43
-			unsigned int bits9 : 3; 	// 30 - 46
-			unsigned int bitsA : 3; 	// 33 - 49
-			unsigned int bitsB : 3;		// 36 - 52
-			unsigned int bitsC : 3;		// 39 - 55
-			unsigned int bitsD : 3;		// 42 - 58
-			unsigned int bitsE : 3;		// 45 - 61
-			unsigned int bitsF : 3;		// 48 - 64
+			uint64 alpha0 : 8;	// 8
+			uint64 alpha1 : 8;	// 16
+			uint64 bits0 : 3;		// 3 - 19
+			uint64 bits1 : 3; 	// 6 - 22
+			uint64 bits2 : 3; 	// 9 - 25
+			uint64 bits3 : 3;		// 12 - 28
+			uint64 bits4 : 3;		// 15 - 31
+			uint64 bits5 : 3;		// 18 - 34
+			uint64 bits6 : 3;		// 21 - 37
+			uint64 bits7 : 3;		// 24 - 40
+			uint64 bits8 : 3;		// 27 - 43
+			uint64 bits9 : 3; 	// 30 - 46
+			uint64 bitsA : 3; 	// 33 - 49
+			uint64 bitsB : 3;		// 36 - 52
+			uint64 bitsC : 3;		// 39 - 55
+			uint64 bitsD : 3;		// 42 - 58
+			uint64 bitsE : 3;		// 45 - 61
+			uint64 bitsF : 3;		// 48 - 64
 		};
 		uint64 u;
 	};
+	*/
+	uint64 u;
+	uint8 alpha0() const { return u & 0xffLL; };
+	uint8 alpha1() const { return (u >> 8) & 0xffLL; };
+	uint8 bits0() const { return (u >> 16) & 0x7LL; };
+	uint8 bits1() const { return (u >> 19) & 0x7LL; };
+	uint8 bits2() const { return (u >> 22) & 0x7LL; };
+	uint8 bits3() const { return (u >> 25) & 0x7LL; };
+	uint8 bits4() const { return (u >> 28) & 0x7LL; };
+	uint8 bits5() const { return (u >> 31) & 0x7LL; };
+	uint8 bits6() const { return (u >> 34) & 0x7LL; };
+	uint8 bits7() const { return (u >> 37) & 0x7LL; };
+	uint8 bits8() const { return (u >> 40) & 0x7LL; };
+	uint8 bits9() const { return (u >> 43) & 0x7LL; };
+	uint8 bitsA() const { return (u >> 46) & 0x7LL; };
+	uint8 bitsB() const { return (u >> 49) & 0x7LL; };
+	uint8 bitsC() const { return (u >> 52) & 0x7LL; };
+	uint8 bitsD() const { return (u >> 55) & 0x7LL; };
+	uint8 bitsE() const { return (u >> 58) & 0x7LL; };
+	uint8 bitsF() const { return (u >> 61) & 0x7LL; };
 	
 	void evaluatePalette(uint8 alpha[8]) const;
 	void evaluatePalette8(uint8 alpha[8]) const;

Modified: trunk/blender/source/blender/imbuf/intern/dds/ColorBlock.cpp
===================================================================
--- trunk/blender/source/blender/imbuf/intern/dds/ColorBlock.cpp	2008-03-28 00:30:46 UTC (rev 14267)
+++ trunk/blender/source/blender/imbuf/intern/dds/ColorBlock.cpp	2008-03-28 14:44:31 UTC (rev 14268)
@@ -103,7 +103,7 @@
 	for(int i = 0; i < 16; i++)
 	{
 		Color32 c = m_color[i];
-		m_color[i] = Color32(0, c.g, 0, c.r);
+		m_color[i] = Color32(0xFF, c.g, 0, c.r);
 	}
 }
 
@@ -125,6 +125,19 @@
 	}
 }
 
+/// Returns true if the block has a single color.
+bool ColorBlock::isSingleColor() const
+{
+	for(int i = 1; i < 16; i++)
+	{
+		if (m_color[0] != m_color[i])
+		{
+			return false;
+		}
+	}
+	
+	return true;
+}
 
 /// Count number of unique colors in this color block.
 uint ColorBlock::countUniqueColors() const

Modified: trunk/blender/source/blender/imbuf/intern/dds/ColorBlock.h
===================================================================
--- trunk/blender/source/blender/imbuf/intern/dds/ColorBlock.h	2008-03-28 00:30:46 UTC (rev 14267)
+++ trunk/blender/source/blender/imbuf/intern/dds/ColorBlock.h	2008-03-28 14:44:31 UTC (rev 14268)
@@ -53,6 +53,7 @@
 	void splatX();
 	void splatY();
 	
+	bool isSingleColor() const;
 	uint countUniqueColors() const;
 	Color32 averageColor() const;
 	bool hasAlpha() const;
@@ -61,7 +62,6 @@
 	void luminanceRange(Color32 * start, Color32 * end) const;
 	void boundsRange(Color32 * start, Color32 * end) const;
 	void boundsRangeAlpha(Color32 * start, Color32 * end) const;
-	void bestFitRange(Color32 * start, Color32 * end) const;
 	
 	void sortColorsByAbsoluteValue();
 

Modified: trunk/blender/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp
===================================================================
--- trunk/blender/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp	2008-03-28 00:30:46 UTC (rev 14267)
+++ trunk/blender/source/blender/imbuf/intern/dds/DirectDrawSurface.cpp	2008-03-28 14:44:31 UTC (rev 14268)
@@ -496,9 +496,9 @@
 	}
 
 	// Align to 8.
-	if (bitcount < 8) bitcount = 8;
-	else if (bitcount < 16) bitcount = 16;
-	else if (bitcount < 24) bitcount = 24;
+	if (bitcount <= 8) bitcount = 8;
+	else if (bitcount <= 16) bitcount = 16;
+	else if (bitcount <= 24) bitcount = 24;
 	else bitcount = 32;
 
 	this->pf.fourcc = 0; //findD3D9Format(bitcount, rmask, gmask, bmask, amask);
@@ -606,7 +606,7 @@
 uint DirectDrawSurface::mipmapCount() const
 {
 	if (header.flags & DDSD_MIPMAPCOUNT) return header.mipmapcount;
-	else return 0;
+	else return 1;
 }
 
 
@@ -770,7 +770,7 @@
 	float nx = 2 * (x / 255.0f) - 1;
 	float ny = 2 * (y / 255.0f) - 1;
 	float nz = 0.0f;
-	if (1 - nx*nx - ny*ny > 0) nz = sqrt(1 - nx*nx - ny*ny);
+	if (1 - nx*nx - ny*ny > 0) nz = sqrtf(1 - nx*nx - ny*ny);
 	uint8 z = clamp(int(255.0f * (nz + 1) / 2.0f), 0, 255);
 	
 	return Color32(x, y, z);
@@ -921,6 +921,11 @@
 {
 	uint size = 128; //sizeof(DDSHeader);
 	
+	if (header.hasDX10Header())
+	{
+		size += 20; // sizeof(DDSHeader10);
+	}
+
 	if (face != 0)
 	{
 		size += face * faceSize();





More information about the Bf-blender-cvs mailing list