nomlib
Loading...
Searching...
No Matches
hqx.hpp
1/******************************************************************************
2
3 nomlib - C++11 cross-platform game engine
4
5Copyright (c) 2013, 2014 Jeffrey Carpenter <i8degrees@gmail.com>
6All rights reserved.
7
8Redistribution and use in source and binary forms, with or without
9modification, are permitted provided that the following conditions are met:
10
111. Redistributions of source code must retain the above copyright notice, this
12 list of conditions and the following disclaimer.
132. Redistributions in binary form must reproduce the above copyright notice,
14 this list of conditions and the following disclaimer in the documentation
15 and/or other materials provided with the distribution.
16
17THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
21ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28 hqx Algorithm
291. Copyright (C) 2003 Maxim Stepin ( maxst@hiend3d.com )
302. Copyright (C) 2010 Cameron Zemek ( grom@zeminvaders.net)
31
32******************************************************************************/
33#ifndef NOMLIB_HQX_HPP
34#define NOMLIB_HQX_HPP
35
54
55#include "nomlib/config.hpp"
56#include "nomlib/math/math_helpers.hpp"
57
58#define MASK_2 0x0000FF00
59#define MASK_13 0x00FF00FF
60#define MASK_RGB 0x00FFFFFF
61#define MASK_ALPHA 0xFF000000
62
63#define Ymask 0x00FF0000
64#define Umask 0x0000FF00
65#define Vmask 0x000000FF
66#define trY 0x00300000
67#define trU 0x00000700
68#define trV 0x00000006
69
70namespace nom {
71 namespace priv {
72
73/* RGB to YUV lookup table */
74extern uint32 RGBtoYUV[16777216];
75
76static inline uint32 rgb_to_yuv(uint32 c)
77{
78 // Mask against MASK_RGB to discard the alpha channel
79 return RGBtoYUV[MASK_RGB & c];
80}
81
89/* Test if there is difference in color */
90static inline int yuv_diff(int yuv1, int yuv2) {
91 return (( abs((yuv1 & Ymask) - (yuv2 & Ymask)) > trY ) ||
92 ( abs((yuv1 & Umask) - (yuv2 & Umask)) > trU ) ||
93 ( abs((yuv1 & Vmask) - (yuv2 & Vmask)) > trV ) );
94}
95
96static inline int32 Diff(uint32 c1, uint32 c2)
97{
98 return yuv_diff(rgb_to_yuv(c1), rgb_to_yuv(c2));
99}
100
101/* Interpolate functions */
102static inline uint32 Interpolate_2(uint32 c1, int w1, uint32 c2, int32 w2, int32 s)
103{
104 if (c1 == c2) {
105 return c1;
106 }
107 return
108 (((((c1 & MASK_ALPHA) >> 24) * w1 + ((c2 & MASK_ALPHA) >> 24) * w2) << (24-s)) & MASK_ALPHA) +
109 ((((c1 & MASK_2) * w1 + (c2 & MASK_2) * w2) >> s) & MASK_2) +
110 ((((c1 & MASK_13) * w1 + (c2 & MASK_13) * w2) >> s) & MASK_13);
111}
112
113static inline uint32 Interpolate_3(uint32 c1, int32 w1, uint32 c2, int32 w2, uint32 c3, int32 w3, int32 s)
114{
115 return
116 (((((c1 & MASK_ALPHA) >> 24) * w1 + ((c2 & MASK_ALPHA) >> 24) * w2 + ((c3 & MASK_ALPHA) >> 24) * w3) << (24-s)) & MASK_ALPHA) +
117 ((((c1 & MASK_2) * w1 + (c2 & MASK_2) * w2 + (c3 & MASK_2) * w3) >> s) & MASK_2) +
118 ((((c1 & MASK_13) * w1 + (c2 & MASK_13) * w2 + (c3 & MASK_13) * w3) >> s) & MASK_13);
119}
120
121static inline uint32 Interp1(uint32 c1, uint32 c2)
122{
123 //(c1*3+c2) >> 2;
124 return Interpolate_2(c1, 3, c2, 1, 2);
125}
126
127static inline uint32 Interp2(uint32 c1, uint32 c2, uint32 c3)
128{
129 //(c1*2+c2+c3) >> 2;
130 return Interpolate_3(c1, 2, c2, 1, c3, 1, 2);
131}
132
133static inline uint32 Interp3(uint32 c1, uint32 c2)
134{
135 //(c1*7+c2)/8;
136 return Interpolate_2(c1, 7, c2, 1, 3);
137}
138
139static inline uint32 Interp4(uint32 c1, uint32 c2, uint32 c3)
140{
141 //(c1*2+(c2+c3)*7)/16;
142 return Interpolate_3(c1, 2, c2, 7, c3, 7, 4);
143}
144
145static inline uint32 Interp5(uint32 c1, uint32 c2)
146{
147 //(c1+c2) >> 1;
148 return Interpolate_2(c1, 1, c2, 1, 1);
149}
150
151static inline uint32 Interp6(uint32 c1, uint32 c2, uint32 c3)
152{
153 //(c1*5+c2*2+c3)/8;
154 return Interpolate_3(c1, 5, c2, 2, c3, 1, 3);
155}
156
157static inline uint32 Interp7(uint32 c1, uint32 c2, uint32 c3)
158{
159 //(c1*6+c2+c3)/8;
160 return Interpolate_3(c1, 6, c2, 1, c3, 1, 3);
161}
162
163static inline uint32 Interp8(uint32 c1, uint32 c2)
164{
165 //(c1*5+c2*3)/8;
166 return Interpolate_2(c1, 5, c2, 3, 3);
167}
168
169static inline uint32 Interp9(uint32 c1, uint32 c2, uint32 c3)
170{
171 //(c1*2+(c2+c3)*3)/8;
172 return Interpolate_3(c1, 2, c2, 3, c3, 3, 3);
173}
174
175static inline uint32 Interp10(uint32 c1, uint32 c2, uint32 c3)
176{
177 //(c1*14+c2+c3)/16;
178 return Interpolate_3(c1, 14, c2, 1, c3, 1, 4);
179}
180
182void hq2x_32_rb( uint32* sp, uint32 srb, uint32* dp, uint32 drb, int32 Xres, int32 Yres );
183
185void hq3x_32_rb( uint32* sp, uint32 srb, uint32* dp, uint32 drb, int32 Xres, int32 Yres );
186
188void hq4x_32_rb( uint32* sp, uint32 srb, uint32* dp, uint32 drb, int32 Xres, int32 Yres );
189
191void hqxInit ( void );
192
196void hq2x_32 ( uint32* src, uint32* dest, int32 width, int32 height );
197
201void hq3x_32 ( uint32* src, uint32* dest, int32 width, int32 height );
202
206void hq4x_32 ( uint32* src, uint32* dest, int32 width, int32 height );
207
208
209 } // namespace priv
210} // namespace nom
211
212#endif // include guard defined