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

Comparing cf.schmorp.de/server/utils/cfhq2xa.C (file contents):
Revision 1.6 by root, Mon Oct 12 14:01:00 2009 UTC vs.
Revision 1.15 by root, Fri Nov 18 05:53:42 2016 UTC

1/* 1/*
2 * This file is part of Deliantra, the Roguelike Realtime MMORPG. 2 * This file is part of Deliantra, the Roguelike Realtime MMORPG.
3 * 3 *
4 * Copyright (©) 2007 Marc Alexander Lehmann / Robin Redeker / the Deliantra team 4 * Copyright (©) 2007,2008,2009,2010,2011,2012,2013,2014,2015,2016 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
5 * Copyright (©) 2003,2007 MaxSt <maxst@hiend3d.com> 5 * Copyright (©) 2003 MaxSt <maxst@hiend3d.com>
6 * 6 *
7 * Deliantra is free software: you can redistribute it and/or modify it under 7 * Deliantra is free software: you can redistribute it and/or modify it under
8 * the terms of the Affero GNU General Public License as published by the 8 * the terms of the Affero GNU General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your 9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version. 10 * option) any later version.
11 * 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 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU 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 Affero GNU General Public License 17 * You should have received a copy of the Affero GNU General Public License
18 * and the GNU General Public License along with this program. If not, see 18 * and the GNU General Public License along with this program. If not, see
19 * <http://www.gnu.org/licenses/>. 19 * <http://www.gnu.org/licenses/>.
20 * 20 *
21 * The authors can be reached via e-mail to <support@deliantra.net> 21 * The authors can be reached via e-mail to <support@deliantra.net>
22 */ 22 */
23 23
24// note: the original code was released under the LGPL version 2.1 24// note: the original code was released under the LGPL version 2.1
25 25
53# define trY 0x30 53# define trY 0x30
54# define trU 0x11 54# define trU 0x11
55# define trV 0x10 55# define trV 0x10
56# define trA 0x40 56# define trA 0x40
57 57
58static int32_t
59udiff (uint32_t a, uint32_t b)
60{
61 return a > b ? a - b : b - a;
62
63}
64
58static inline pixel lerp (pixel c1, int w1, pixel c2, int w2, pixel c3, int w3, int shift) 65static inline pixel lerp (pixel c1, int w1, pixel c2, int w2, pixel c3, int w3, int shift)
59{ 66{
60#if 0 67#if 0
61 if (!(c1 >> Ashift) & Cmask) w1 = 0; 68 if (!(c1 >> Ashift) & Cmask) w1 = 0;
62 if (!(c2 >> Ashift) & Cmask) w2 = 0; 69 if (!(c2 >> Ashift) & Cmask) w2 = 0;
66 int w = w1 + w2 + w3; 73 int w = w1 + w2 + w3;
67 74
68 return ((((c1 >> shift) & Cmask) * w1 + ((c2 >> shift) & Cmask) * w2 + ((c3 >> shift) & Cmask) * w3 + w / 2) / w) << shift; 75 return ((((c1 >> shift) & Cmask) * w1 + ((c2 >> shift) & Cmask) * w2 + ((c3 >> shift) & Cmask) * w3 + w / 2) / w) << shift;
69} 76}
70 77
71inline void lerp (unsigned char *pc, pixel c1, int w1, pixel c2, int w2, pixel c3 = 0, int w3 = 0) 78static inline void lerp (unsigned char *pc, pixel c1, int w1, pixel c2, int w2, pixel c3 = 0, int w3 = 0)
72{ 79{
73 *(pixel *)pc = lerp (c1, w1, c2, w2, c3, w3, Rshift) 80 *(pixel *)pc = lerp (c1, w1, c2, w2, c3, w3, Rshift)
74 | lerp (c1, w1, c2, w2, c3, w3, Gshift) 81 | lerp (c1, w1, c2, w2, c3, w3, Gshift)
75 | lerp (c1, w1, c2, w2, c3, w3, Bshift) 82 | lerp (c1, w1, c2, w2, c3, w3, Bshift)
76 | lerp (c1, w1, c2, w2, c3, w3, Ashift); 83 | lerp (c1, w1, c2, w2, c3, w3, Ashift);
77} 84}
78 85
79inline void Interp1 (unsigned char *pc, pixel c1, pixel c2) 86static inline void Interp1 (unsigned char *pc, pixel c1, pixel c2)
80{ 87{
81 lerp (pc, c1, 3, c2, 1); 88 lerp (pc, c1, 3, c2, 1);
82} 89}
83 90
84inline void Interp2 (unsigned char *pc, pixel c1, pixel c2, pixel c3) 91static inline void Interp2 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
85{ 92{
86 lerp (pc, c1, 2, c2, 1, c3, 1); 93 lerp (pc, c1, 2, c2, 1, c3, 1);
87} 94}
88 95
89inline void Interp5 (unsigned char *pc, pixel c1, pixel c2) 96static inline void Interp5 (unsigned char *pc, pixel c1, pixel c2)
90{ 97{
91 lerp (pc, c1, 1, c2, 1); 98 lerp (pc, c1, 1, c2, 1);
92} 99}
93 100
94inline void Interp6 (unsigned char *pc, pixel c1, pixel c2, pixel c3) 101static inline void Interp6 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
95{ 102{
96 lerp (pc, c1, 5, c2, 2, c3, 1); 103 lerp (pc, c1, 5, c2, 2, c3, 1);
97} 104}
98 105
99inline void Interp7 (unsigned char *pc, pixel c1, pixel c2, pixel c3) 106static inline void Interp7 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
100{ 107{
101 lerp (pc, c1, 6, c2, 1, c3, 1); 108 lerp (pc, c1, 6, c2, 1, c3, 1);
102} 109}
103 110
104inline void Interp9 (unsigned char *pc, pixel c1, pixel c2, pixel c3) 111static inline void Interp9 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
105{ 112{
106 lerp (pc, c1, 2, c2, 3, c2, 3); 113 lerp (pc, c1, 2, c2, 3, c2, 3);
107} 114}
108 115
109inline void Interp10 (unsigned char *pc, pixel c1, pixel c2, pixel c3) 116static inline void Interp10 (unsigned char *pc, pixel c1, pixel c2, pixel c3)
110{ 117{
111 lerp (pc, c1, 14, c2, 1, c3, 1); 118 lerp (pc, c1, 14, c2, 1, c3, 1);
112} 119}
113 120
114#define PIXEL00_0 *((pixel *)(pOut)) = w[5]; 121#define PIXEL00_0 *((pixel *)(pOut)) = w[5];
158#define PIXEL11_61 Interp6(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]); 165#define PIXEL11_61 Interp6(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]); 166#define PIXEL11_70 Interp7(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]); 167#define PIXEL11_90 Interp9(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]); 168#define PIXEL11_100 Interp10(pOut+BpL + sizeof (pixel), w[5], w[6], w[8]);
162 169
163inline pixel RGBAtoYUVA (pixel w) 170static inline pixel RGBAtoYUVA (pixel w)
164{ 171{
165 int r = (w >> Rshift) & Cmask; 172 int r = (w >> Rshift) & Cmask;
166 int g = (w >> Gshift) & Cmask; 173 int g = (w >> Gshift) & Cmask;
167 int b = (w >> Bshift) & Cmask; 174 int b = (w >> Bshift) & Cmask;
168 int a = (w >> Ashift) & Cmask; 175 int a = (w >> Ashift) & Cmask;
175 | (u << Gshift) 182 | (u << Gshift)
176 | (v << Bshift) 183 | (v << Bshift)
177 | (a << Ashift); 184 | (a << Ashift);
178} 185}
179 186
180inline bool Diff (pixel w1, pixel w2) 187static inline bool Diff (pixel w1, pixel w2)
181{ 188{
182 pixel YUV1 = RGBAtoYUVA (w1); 189 pixel YUV1 = RGBAtoYUVA (w1);
183 pixel YUV2 = RGBAtoYUVA (w2); 190 pixel YUV2 = RGBAtoYUVA (w2);
184 191
185 return ((abs (((YUV1 >> Rshift) & Cmask) - ((YUV2 >> Rshift) & Cmask)) > trY) || 192 return ((udiff ((YUV1 >> Rshift) & Cmask, (YUV2 >> Rshift) & Cmask) > trY) ||
186 (abs (((YUV1 >> Gshift) & Cmask) - ((YUV2 >> Gshift) & Cmask)) > trU) || 193 (udiff ((YUV1 >> Gshift) & Cmask, (YUV2 >> Gshift) & Cmask) > trU) ||
187 (abs (((YUV1 >> Bshift) & Cmask) - ((YUV2 >> Bshift) & Cmask)) > trV) || 194 (udiff ((YUV1 >> Bshift) & Cmask, (YUV2 >> Bshift) & Cmask) > trV) ||
188 (abs (((YUV1 >> Ashift) & Cmask) - ((YUV2 >> Ashift) & Cmask)) > trA) ); 195 (udiff ((YUV1 >> Ashift) & Cmask, (YUV2 >> Ashift) & Cmask) > trA) );
189} 196}
190 197
191void 198static void
192hq2x_32 (unsigned char *pIn, unsigned char *pOut, int Xres, int Yres, int BpL, bool wrap) 199hq2x_32 (unsigned char *pIn, unsigned char *pOut, int Xres, int Yres, int BpL, bool wrap)
193{ 200{
194 int i, j, k; 201 int i, j, k;
195 int prevline, nextline; 202 int prevline, nextline;
196 pixel w[10]; 203 pixel w[10];

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines