root/OpenSceneGraph/trunk/src/osg/dxtctool.cpp @ 13041

Revision 13041, 7.2 kB (checked in by robert, 3 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1// dxtctool.cpp: implementation of DXTC Tools functions.
2//
3// Copyright (C) 2002 Tanguy Fautré.
4// For conditions of distribution and use,
5// see copyright notice in dxtctool.h
6//
7//////////////////////////////////////////////////////////////////////
8
9#include "dxtctool.h"
10
11
12namespace dxtc_tool {
13
14    const size_t dxtc_pixels::BSIZE_DXT1 = 8;
15    const size_t dxtc_pixels::BSIZE_DXT3 = 16;
16    const size_t dxtc_pixels::BSIZE_DXT5 = 16;
17    const size_t dxtc_pixels::BSIZE_ALPHA_DXT3 = 8;
18    const size_t dxtc_pixels::BSIZE_ALPHA_DXT5 = 8;
19
20//////////////////////////////////////////////////////////////////////
21// Construction/Destruction
22//////////////////////////////////////////////////////////////////////
23
24
25
26//////////////////////////////////////////////////////////////////////
27// Members Functions
28//////////////////////////////////////////////////////////////////////
29
30bool dxtc_pixels::OpenGLSize() const
31{
32    size_t Width = m_Width;
33    size_t Height = m_Height;
34    // size_t TotalTrueBits = 0;
35
36    if ((Width == 0) || (Height == 0))
37        return false;
38
39    for (; (Width % 2) == 0; Width /= 2);
40    for (; (Height % 2) == 0; Height /= 2);
41
42    if ((Width != 1) || (Height != 1))
43        return false;
44    else
45        return true;
46}
47
48
49
50bool dxtc_pixels::VFlip() const
51{
52    // Check that the given dimensions are 2^x, 2^y
53    if (! OpenGLSize())
54        return false;
55
56    // Check that the given format are supported
57    if (! SupportedFormat())
58        return false;
59
60    // Nothing to do if Height == 1
61    if (m_Height == 1)
62        return true;
63
64    if (DXT1())
65        VFlip_DXT1();
66    else if (DXT3())
67        VFlip_DXT3();
68    else if (DXT5())
69        VFlip_DXT5();
70    else
71        return false; // We should never get there
72
73    return true;
74}
75
76
77
78void dxtc_pixels::VFlip_DXT1() const
79{
80    // const size_t Size = ((m_Width + 3) / 4) * ((m_Height + 3) / 4) * BSIZE_DXT1;
81    dxtc_int8 * pPixels = (dxtc_int8 * ) m_pPixels;
82
83    if (m_Height == 2)
84        for (size_t j = 0; j < (m_Width + 3) / 4; ++j)
85            BVF_Color_H2(pPixels + j * BSIZE_DXT1);
86
87    if (m_Height == 4)
88        for (size_t j = 0; j < (m_Width + 3) / 4; ++j)
89            BVF_Color_H4(pPixels + j * BSIZE_DXT1);
90
91    if (m_Height > 4)
92        for (size_t i = 0; i < ((m_Height + 7) / 8); ++i)
93            for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
94                const size_t TargetRow = ((m_Height + 3) / 4) - (i + 1);
95                BVF_Color(GetBlock(i, j, BSIZE_DXT1), GetBlock(TargetRow, j, BSIZE_DXT1));
96            }
97}
98
99
100
101void dxtc_pixels::VFlip_DXT3() const
102{
103    // const size_t Size = ((m_Width + 3) / 4) * ((m_Height + 3) / 4) * BSIZE_DXT3;
104    // dxtc_int8 * const pPixels = (dxtc_int8 * const) m_pPixels;
105
106    if (m_Height == 2)
107        for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
108            BVF_Alpha_DXT3_H2(((dxtc_int8 * ) m_pPixels) + (j * BSIZE_DXT3));
109            BVF_Color_H2(((dxtc_int8 * ) m_pPixels) + (j * BSIZE_DXT3 + BSIZE_ALPHA_DXT3));
110        }
111
112    if (m_Height == 4)
113        for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
114            BVF_Alpha_DXT3_H4(((dxtc_int8 * ) m_pPixels) + (j * BSIZE_DXT3));
115            BVF_Color_H4(((dxtc_int8 * ) m_pPixels) + (j * BSIZE_DXT3 + BSIZE_ALPHA_DXT3));
116        }
117
118    if (m_Height > 4)
119        for (size_t i = 0; i < ((m_Height + 7) / 8); ++i)
120            for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
121                const size_t TargetRow = ((m_Height + 3) / 4) - (i + 1);
122                BVF_Alpha_DXT3(GetBlock(i, j, BSIZE_DXT3), GetBlock(TargetRow, j, BSIZE_DXT3));
123                BVF_Color(((dxtc_int8 * ) GetBlock(i, j, BSIZE_DXT3)) + BSIZE_ALPHA_DXT3,
124                          ((dxtc_int8 * ) GetBlock(TargetRow, j, BSIZE_DXT3)) + BSIZE_ALPHA_DXT3);
125            }
126}
127
128
129
130void dxtc_pixels::VFlip_DXT5() const
131{
132    // const size_t Size = ((m_Width + 3) / 4) * ((m_Height + 3) / 4) * BSIZE_DXT5;
133    // dxtc_int8 * const pPixels = (dxtc_int8 * const) m_pPixels;
134
135    if (m_Height == 2)
136        for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
137            BVF_Alpha_DXT5_H2(((dxtc_int8 * ) m_pPixels) + (j * BSIZE_DXT5));
138            BVF_Color_H2(((dxtc_int8 * ) m_pPixels) + (j * BSIZE_DXT5 + BSIZE_ALPHA_DXT5));
139        }
140
141    if (m_Height == 4)
142        for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
143            BVF_Alpha_DXT5_H4(((dxtc_int8 * ) m_pPixels) + (j * BSIZE_DXT5));
144            BVF_Color_H4(((dxtc_int8 * ) m_pPixels) + (j * BSIZE_DXT5 + BSIZE_ALPHA_DXT5));
145        }
146
147    if (m_Height > 4)
148        for (size_t i = 0; i < ((m_Height + 7) / 8); ++i)
149            for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
150                const size_t TargetRow = ((m_Height + 3) / 4) - (i + 1);
151                BVF_Alpha_DXT5(GetBlock(i, j, BSIZE_DXT5), GetBlock(TargetRow, j, BSIZE_DXT5));
152                BVF_Color(((dxtc_int8 * ) GetBlock(i, j, BSIZE_DXT5)) + BSIZE_ALPHA_DXT5,
153                          ((dxtc_int8 * ) GetBlock(TargetRow, j, BSIZE_DXT5)) + BSIZE_ALPHA_DXT5);
154            }
155}
156
157//
158// Structure of a DXT-1 compressed texture block
159// see page "Opaque and 1-Bit Alpha Textures (Direct3D 9)" on http://msdn.microsoft.com
160// url at time of writing http://msdn.microsoft.com/en-us/library/bb147243(v=VS.85).aspx
161//
162struct DXT1TexelsBlock
163{
164    unsigned short color_0;     // colors at their
165    unsigned short color_1;     // extreme
166    unsigned int   texels4x4;   // interpolated colors (2 bits per texel)
167};
168
169bool CompressedImageTranslucent(size_t width, size_t height, GLenum format, void * imageData)
170{
171    // OSG_NOTICE<<"CompressedImageTranslucent("<<width<<", "<<height<<", "<<format<<", "<<imageData<<")"<<std::endl;
172
173    switch(format)
174    {
175        case(GL_COMPRESSED_RGB_S3TC_DXT1_EXT):
176            return false;
177
178        case(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT):
179        {
180            const DXT1TexelsBlock *texelsBlock = reinterpret_cast<const DXT1TexelsBlock*>(imageData);
181
182            // Only do the check on the first mipmap level, and stop when we
183            // see the first alpha texel
184            int i = (width*height)/16;
185            bool foundAlpha = false;
186            while ((!foundAlpha) && (i>0))
187            {
188                // See if this block might contain transparent texels
189                if (texelsBlock->color_0<=texelsBlock->color_1)
190                {
191                    // Scan the texels block for the '11' bit pattern that
192                    // indicates a transparent texel
193                    int j = 0;
194                    while ((!foundAlpha) && (j < 32))
195                    {
196                        // Check for the '11' bit pattern on this texel
197                        if ( ((texelsBlock->texels4x4 >> j) & 0x03) == 0x03)
198                        {
199                            // Texture is using the 1-bit alpha encoding, so we
200                            return true;
201                        }
202
203                        // Next texel
204                        j += 2;
205                    }
206                }
207
208                // Next block
209                --i;
210                ++texelsBlock;
211            }
212            return false;
213        }
214
215        case(GL_COMPRESSED_RGBA_S3TC_DXT3_EXT):
216            return true;
217
218        case(GL_COMPRESSED_RGBA_S3TC_DXT5_EXT):
219            return true;
220
221        default:
222            break;
223    }
224
225    return false;
226}
227
228} // namespace dxtc_tool
Note: See TracBrowser for help on using the browser.