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

Revision 3286, 4.2 kB (checked in by robert, 10 years ago)

Added fxtctool in prep for adding compressed imagery swap

  • 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
15
16
17//////////////////////////////////////////////////////////////////////
18// Construction/Destruction
19//////////////////////////////////////////////////////////////////////
20
21
22
23//////////////////////////////////////////////////////////////////////
24// Members Functions
25//////////////////////////////////////////////////////////////////////
26
27bool dxtc_pixels::OpenGLSize() const
28{
29        size_t Width = m_Width;
30        size_t Height = m_Height;
31        // size_t TotalTrueBits = 0;
32
33        if ((Width == 0) || (Height == 0))
34                return false;
35
36        for (; (Width % 2) == 0; Width /= 2);
37        for (; (Height % 2) == 0; Height /= 2);
38
39        if ((Width != 1) || (Height != 1))
40                return false;
41        else
42                return true;
43}
44
45
46
47bool dxtc_pixels::VFlip() const
48{
49        // Check that the given dimentions are 2^x, 2^y
50        if (! OpenGLSize())
51                return false;
52
53        // Check that the given format are supported
54        if (! SupportedFormat())
55                return false;
56
57        // Nothing to do if Height == 1
58        if (m_Height == 1)
59                return true;
60               
61        if (DXT1())
62                VFlip_DXT1();
63        else if (DXT3())
64                VFlip_DXT3();
65        else if (DXT5())
66                VFlip_DXT5();
67        else
68                return false; // We should never get there
69
70        return true;
71}
72
73
74
75void dxtc_pixels::VFlip_DXT1() const
76{
77        // const size_t Size = ((m_Width + 3) / 4) * ((m_Height + 3) / 4) * BSIZE_DXT1;
78        __int8 * const pPixels = (__int8 * const) m_pPixels;
79
80        if (m_Height == 2)
81                for (size_t j = 0; j < (m_Width + 3) / 4; ++j)
82                        BVF_Color_H2(pPixels + j * BSIZE_DXT1);
83
84        if (m_Height == 4)
85                for (size_t j = 0; j < (m_Width + 3) / 4; ++j)
86                        BVF_Color_H4(pPixels + j * BSIZE_DXT1);
87
88        if (m_Height > 4)
89                for (size_t i = 0; i < ((m_Height + 7) / 8); ++i)
90                        for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
91                                const size_t TargetRow = ((m_Height + 3) / 4) - (i + 1);
92                                BVF_Color(GetBlock(i, j, BSIZE_DXT1), GetBlock(TargetRow, j, BSIZE_DXT1));
93                        }
94}
95
96
97
98void dxtc_pixels::VFlip_DXT3() const
99{
100        // const size_t Size = ((m_Width + 3) / 4) * ((m_Height + 3) / 4) * BSIZE_DXT3;
101        // __int8 * const pPixels = (__int8 * const) m_pPixels;
102
103        if (m_Height == 2)
104                for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
105                        BVF_Alpha_DXT3_H2(((__int8 * const) m_pPixels) + (j * BSIZE_DXT3));
106                        BVF_Color_H2(((__int8 * const) m_pPixels) + (j * BSIZE_DXT3 + BSIZE_ALPHA_DXT3));
107                }
108
109        if (m_Height == 4)
110                for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
111                        BVF_Alpha_DXT3_H4(((__int8 * const) m_pPixels) + (j * BSIZE_DXT3));
112                        BVF_Color_H4(((__int8 * const) m_pPixels) + (j * BSIZE_DXT3 + BSIZE_ALPHA_DXT3));
113                }
114
115        if (m_Height > 4)
116                for (size_t i = 0; i < ((m_Height + 7) / 8); ++i)
117                        for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
118                                const size_t TargetRow = ((m_Height + 3) / 4) - (i + 1);
119                                BVF_Alpha_DXT3(GetBlock(i, j, BSIZE_DXT3), GetBlock(TargetRow, j, BSIZE_DXT3));
120                                BVF_Color(((__int8 * const) GetBlock(i, j, BSIZE_DXT3)) + BSIZE_ALPHA_DXT3,
121                                                  ((__int8 * const) GetBlock(TargetRow, j, BSIZE_DXT3)) + BSIZE_ALPHA_DXT3);
122                        }
123}
124
125
126
127void dxtc_pixels::VFlip_DXT5() const
128{
129        // const size_t Size = ((m_Width + 3) / 4) * ((m_Height + 3) / 4) * BSIZE_DXT5;
130        // __int8 * const pPixels = (__int8 * const) m_pPixels;
131
132        if (m_Height == 2)
133                for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
134                        BVF_Alpha_DXT5_H2(((__int8 * const) m_pPixels) + (j * BSIZE_DXT5));
135                        BVF_Color_H2(((__int8 * const) m_pPixels) + (j * BSIZE_DXT5 + BSIZE_ALPHA_DXT5));
136                }
137
138        if (m_Height == 4)
139                for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
140                        BVF_Alpha_DXT5_H4(((__int8 * const) m_pPixels) + (j * BSIZE_DXT5));
141                        BVF_Color_H4(((__int8 * const) m_pPixels) + (j * BSIZE_DXT5 + BSIZE_ALPHA_DXT5));
142                }
143
144        if (m_Height > 4)
145                for (size_t i = 0; i < ((m_Height + 7) / 8); ++i)
146                        for (size_t j = 0; j < (m_Width + 3) / 4; ++j) {
147                                const size_t TargetRow = ((m_Height + 3) / 4) - (i + 1);
148                                BVF_Alpha_DXT5(GetBlock(i, j, BSIZE_DXT5), GetBlock(TargetRow, j, BSIZE_DXT5));
149                                BVF_Color(((__int8 * const) GetBlock(i, j, BSIZE_DXT5)) + BSIZE_ALPHA_DXT5,
150                                                  ((__int8 * const) GetBlock(TargetRow, j, BSIZE_DXT5)) + BSIZE_ALPHA_DXT5);
151                        }
152}
153
154
155
156
157}; // namespace dxtc_tool
Note: See TracBrowser for help on using the browser.