ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/utils/cfhq2xa.C
(Generate patch)

Comparing deliantra/server/utils/cfhq2xa.C (file contents):
Revision 1.1 by root, Sun Apr 1 00:36:35 2007 UTC vs.
Revision 1.9 by root, Fri Mar 26 00:59:22 2010 UTC

1//hq2xa filter 1/*
2//---------------------------------------------------------- 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 *
4 * Copyright (©) 2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
3//Copyright (C) 2003 MaxSt ( maxst@hiend3d.com ) 5 * Copyright (©) 2003 MaxSt <maxst@hiend3d.com>
4//Copyright (C) 2006 Marc Lehmann <pcg@goof.com> 6 *
5// converted to RGBA, cleaned up 7 * Deliantra is free software: you can redistribute it and/or modify it under
6 8 * the terms of the Affero GNU General Public License as published by the
7//This program is free software; you can redistribute it and/or 9 * Free Software Foundation, either version 3 of the License, or (at your
8//modify it under the terms of the GNU Lesser General Public 10 * option) any later version.
9//License as published by the Free Software Foundation; either 11 *
10//version 2.1 of the License, or (at your option) any later version.
11//
12//This program is distributed in the hope that it will be useful, 12 * This program is distributed in the hope that it will be useful,
13//but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15//Lesser General Public License for more details. 15 * GNU General Public License for more details.
16// 16 *
17//You should have received a copy of the GNU Lesser General Public 17 * You should have received a copy of the Affero GNU General Public License
18//License along with this program; if not, write to the Free Software 18 * and the GNU General Public License along with this program. If not, see
19//Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 * <http://www.gnu.org/licenses/>.
20 *
21 * The authors can be reached via e-mail to <support@deliantra.net>
22 */
23
24// note: the original code was released under the LGPL version 2.1
20 25
21#include <cstdio> 26#include <cstdio>
22#include <cstring> 27#include <cstring>
23#include <stdlib.h> 28#include <stdlib.h>
24#include <stdint.h> 29#include <stdint.h>
61 int w = w1 + w2 + w3; 66 int w = w1 + w2 + w3;
62 67
63 return ((((c1 >> shift) & Cmask) * w1 + ((c2 >> shift) & Cmask) * w2 + ((c3 >> shift) & Cmask) * w3 + w / 2) / w) << shift; 68 return ((((c1 >> shift) & Cmask) * w1 + ((c2 >> shift) & Cmask) * w2 + ((c3 >> shift) & Cmask) * w3 + w / 2) / w) << shift;
64} 69}
65 70
66inline void lerp (unsigned char *pc, pixel c1, int w1, pixel c2, int w2, pixel c3 = 0, int w3 = 0) 71static inline void lerp (unsigned char *pc, pixel c1, int w1, pixel c2, int w2, pixel c3 = 0, int w3 = 0)
67{ 72{
68 *(pixel *)pc = lerp (c1, w1, c2, w2, c3, w3, Rshift) 73 *(pixel *)pc = lerp (c1, w1, c2, w2, c3, w3, Rshift)
69 | lerp (c1, w1, c2, w2, c3, w3, Gshift) 74 | lerp (c1, w1, c2, w2, c3, w3, Gshift)
70 | lerp (c1, w1, c2, w2, c3, w3, Bshift) 75 | lerp (c1, w1, c2, w2, c3, w3, Bshift)
71 | lerp (c1, w1, c2, w2, c3, w3, Ashift); 76 | lerp (c1, w1, c2, w2, c3, w3, Ashift);
72} 77}
73 78
74inline void Interp1 (unsigned char *pc, pixel c1, pixel c2) 79static inline void Interp1 (unsigned char *pc, pixel c1, pixel c2)
75{ 80{
76 lerp (pc, c1, 3, c2, 1); 81 lerp (pc, c1, 3, c2, 1);
77} 82}
78 83
79inline void Interp2 (unsigned char *pc, pixel c1, pixel c2, pixel c3) 84static inline void Interp2 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
80{ 85{
81 lerp (pc, c1, 2, c2, 1, c3, 1); 86 lerp (pc, c1, 2, c2, 1, c3, 1);
82} 87}
83 88
84inline void Interp5 (unsigned char *pc, pixel c1, pixel c2) 89static inline void Interp5 (unsigned char *pc, pixel c1, pixel c2)
85{ 90{
86 lerp (pc, c1, 1, c2, 1); 91 lerp (pc, c1, 1, c2, 1);
87} 92}
88 93
89inline void Interp6 (unsigned char *pc, pixel c1, pixel c2, pixel c3) 94static inline void Interp6 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
90{ 95{
91 lerp (pc, c1, 5, c2, 2, c3, 1); 96 lerp (pc, c1, 5, c2, 2, c3, 1);
92} 97}
93 98
94inline void Interp7 (unsigned char *pc, pixel c1, pixel c2, pixel c3) 99static inline void Interp7 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
95{ 100{
96 lerp (pc, c1, 6, c2, 1, c3, 1); 101 lerp (pc, c1, 6, c2, 1, c3, 1);
97} 102}
98 103
99inline void Interp9 (unsigned char *pc, pixel c1, pixel c2, pixel c3) 104static inline void Interp9 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
100{ 105{
101 lerp (pc, c1, 2, c2, 3, c2, 3); 106 lerp (pc, c1, 2, c2, 3, c2, 3);
102} 107}
103 108
104inline void Interp10 (unsigned char *pc, pixel c1, pixel c2, pixel c3) 109static inline void Interp10 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
105{ 110{
106 lerp (pc, c1, 14, c2, 1, c3, 1); 111 lerp (pc, c1, 14, c2, 1, c3, 1);
107} 112}
108 113
109#define PIXEL00_0 *((pixel *)(pOut)) = w[5]; 114#define PIXEL00_0 *((pixel *)(pOut)) = w[5];
153#define PIXEL11_61 Interp6(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]); 158#define PIXEL11_61 Interp6(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]);
154#define PIXEL11_70 Interp7(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]); 159#define PIXEL11_70 Interp7(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]);
155#define PIXEL11_90 Interp9(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]); 160#define PIXEL11_90 Interp9(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]);
156#define PIXEL11_100 Interp10(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]); 161#define PIXEL11_100 Interp10(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]);
157 162
158inline pixel RGBAtoYUVA (pixel w) 163static inline pixel RGBAtoYUVA (pixel w)
159{ 164{
160 int r = (w >> Rshift) & Cmask; 165 int r = (w >> Rshift) & Cmask;
161 int g = (w >> Gshift) & Cmask; 166 int g = (w >> Gshift) & Cmask;
162 int b = (w >> Bshift) & Cmask; 167 int b = (w >> Bshift) & Cmask;
163 int a = (w >> Ashift) & Cmask; 168 int a = (w >> Ashift) & Cmask;
170 | (u << Gshift) 175 | (u << Gshift)
171 | (v << Bshift) 176 | (v << Bshift)
172 | (a << Ashift); 177 | (a << Ashift);
173} 178}
174 179
175inline bool Diff (pixel w1, pixel w2) 180static inline bool Diff (pixel w1, pixel w2)
176{ 181{
177 pixel YUV1 = RGBAtoYUVA (w1); 182 pixel YUV1 = RGBAtoYUVA (w1);
178 pixel YUV2 = RGBAtoYUVA (w2); 183 pixel YUV2 = RGBAtoYUVA (w2);
179 184
180 return ((abs (((YUV1 >> Rshift) & Cmask) - ((YUV2 >> Rshift) & Cmask)) > trY) || 185 return ((abs (((YUV1 >> Rshift) & Cmask) - ((YUV2 >> Rshift) & Cmask)) > trY) ||
181 (abs (((YUV1 >> Gshift) & Cmask) - ((YUV2 >> Gshift) & Cmask)) > trU) || 186 (abs (((YUV1 >> Gshift) & Cmask) - ((YUV2 >> Gshift) & Cmask)) > trU) ||
182 (abs (((YUV1 >> Bshift) & Cmask) - ((YUV2 >> Bshift) & Cmask)) > trV) || 187 (abs (((YUV1 >> Bshift) & Cmask) - ((YUV2 >> Bshift) & Cmask)) > trV) ||
183 (abs (((YUV1 >> Ashift) & Cmask) - ((YUV2 >> Ashift) & Cmask)) > trA) ); 188 (abs (((YUV1 >> Ashift) & Cmask) - ((YUV2 >> Ashift) & Cmask)) > trA) );
184} 189}
185 190
186void 191static void
187hq2x_32 (unsigned char *pIn, unsigned char *pOut, int Xres, int Yres, int BpL, bool wrap) 192hq2x_32 (unsigned char *pIn, unsigned char *pOut, int Xres, int Yres, int BpL, bool wrap)
188{ 193{
189 int i, j, k; 194 int i, j, k;
190 int prevline, nextline; 195 int prevline, nextline;
191 pixel w[10]; 196 pixel w[10];
192 197
193 // +----+----+----+ 198 // +--+--+--+
194 // | | | |
195 // | w1 | w2 | w3 | 199 // |w1|w2|w3|
196 // +----+----+----+ 200 // +--+--+--+
197 // | | | |
198 // | w4 | w5 | w6 | 201 // |w4|w5|w6|
199 // +----+----+----+ 202 // +--+--+--+
200 // | | | |
201 // | w7 | w8 | w9 | 203 // |w7|w8|w9|
202 // +----+----+----+ 204 // +--+--+--+
203 205
204 for (j = 0; j < Yres; j++) 206 for (j = 0; j < Yres; j++)
205 { 207 {
206 if (j > 0) 208 if (j > 0)
207 prevline = -Xres * sizeof (pixel); 209 prevline = -Xres * sizeof (pixel);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines