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();


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to