annotate src/filters/2xSaI.cpp @ 273:69184558fcf3

further improvements on hxc-pokemon-base.
author Dylan Holmes <ocsenave@gmail.com>
date Tue, 27 Mar 2012 02:05:16 -0500
parents f9f4f1b99eed
children
rev   line source
rlm@1 1 #include "../common/System.h"
rlm@1 2
rlm@1 3 extern "C"
rlm@1 4 {
rlm@1 5 #ifdef MMX
rlm@1 6 void _2xSaILine(u8 *srcPtr, u8 *deltaPtr, u32 srcPitch,
rlm@1 7 u32 width, u8 *dstPtr, u32 dstPitch);
rlm@1 8 void _2xSaISuperEagleLine(u8 *srcPtr, u8 *deltaPtr,
rlm@1 9 u32 srcPitch, u32 width,
rlm@1 10 u8 *dstPtr, u32 dstPitch);
rlm@1 11 void _2xSaISuper2xSaILine(u8 *srcPtr, u8 *deltaPtr,
rlm@1 12 u32 srcPitch, u32 width,
rlm@1 13 u8 *dstPtr, u32 dstPitch);
rlm@1 14 void Init_2xSaIMMX(u32 BitFormat);
rlm@1 15 void BilinearMMX(u16 *A, u16 *B, u16 *C, u16 *D,
rlm@1 16 u16 *dx, u16 *dy, u8 *dP);
rlm@1 17 void BilinearMMXGrid0(u16 *A, u16 *B, u16 *C, u16 *D,
rlm@1 18 u16 *dx, u16 *dy, u8 *dP);
rlm@1 19 void BilinearMMXGrid1(u16 *A, u16 *B, u16 *C, u16 *D,
rlm@1 20 u16 *dx, u16 *dy, u8 *dP);
rlm@1 21 void EndMMX();
rlm@1 22
rlm@1 23 bool cpu_mmx = 1;
rlm@1 24 #endif
rlm@1 25 }
rlm@1 26 static u32 colorMask = 0xF7DEF7DE;
rlm@1 27 static u32 lowPixelMask = 0x08210821;
rlm@1 28 static u32 qcolorMask = 0xE79CE79C;
rlm@1 29 static u32 qlowpixelMask = 0x18631863;
rlm@1 30 static u32 redblueMask = 0xF81F;
rlm@1 31 static u32 greenMask = 0x7E0;
rlm@1 32
rlm@1 33 u32 qRGB_COLOR_MASK[2] = { 0xF7DEF7DE, 0xF7DEF7DE };
rlm@1 34
rlm@1 35 extern void hq2x_init(unsigned);
rlm@1 36
rlm@1 37 int Init_2xSaI(u32 BitFormat)
rlm@1 38 {
rlm@1 39 if (systemColorDepth == 16)
rlm@1 40 {
rlm@1 41 if (BitFormat == 565)
rlm@1 42 {
rlm@1 43 colorMask = 0xF7DEF7DE;
rlm@1 44 lowPixelMask = 0x08210821;
rlm@1 45 qcolorMask = 0xE79CE79C;
rlm@1 46 qlowpixelMask = 0x18631863;
rlm@1 47 redblueMask = 0xF81F;
rlm@1 48 greenMask = 0x7E0;
rlm@1 49 qRGB_COLOR_MASK[0] = qRGB_COLOR_MASK[1] = 0xF7DEF7DE;
rlm@1 50 hq2x_init(16);
rlm@1 51 }
rlm@1 52 else if (BitFormat == 555)
rlm@1 53 {
rlm@1 54 colorMask = 0x7BDE7BDE;
rlm@1 55 lowPixelMask = 0x04210421;
rlm@1 56 qcolorMask = 0x739C739C;
rlm@1 57 qlowpixelMask = 0x0C630C63;
rlm@1 58 redblueMask = 0x7C1F;
rlm@1 59 greenMask = 0x3E0;
rlm@1 60 qRGB_COLOR_MASK[0] = qRGB_COLOR_MASK[1] = 0x7BDE7BDE;
rlm@1 61 hq2x_init(15);
rlm@1 62 }
rlm@1 63 else
rlm@1 64 {
rlm@1 65 return 0;
rlm@1 66 }
rlm@1 67 }
rlm@1 68 else if (systemColorDepth == 32)
rlm@1 69 {
rlm@1 70 colorMask = 0xfefefe;
rlm@1 71 lowPixelMask = 0x010101;
rlm@1 72 qcolorMask = 0xfcfcfc;
rlm@1 73 qlowpixelMask = 0x030303;
rlm@1 74 qRGB_COLOR_MASK[0] = qRGB_COLOR_MASK[1] = 0xfefefe;
rlm@1 75 hq2x_init(32);
rlm@1 76 }
rlm@1 77 else
rlm@1 78 return 0;
rlm@1 79
rlm@1 80 #ifdef MMX
rlm@1 81 Init_2xSaIMMX(BitFormat);
rlm@1 82 #endif
rlm@1 83
rlm@1 84 return 1;
rlm@1 85 }
rlm@1 86
rlm@1 87 static inline int GetResult1(u32 A, u32 B, u32 C, u32 D,
rlm@1 88 u32 /* E */)
rlm@1 89 {
rlm@1 90 int x = 0;
rlm@1 91 int y = 0;
rlm@1 92 int r = 0;
rlm@1 93
rlm@1 94 if (A == C)
rlm@1 95 x += 1;
rlm@1 96 else if (B == C)
rlm@1 97 y += 1;
rlm@1 98 if (A == D)
rlm@1 99 x += 1;
rlm@1 100 else if (B == D)
rlm@1 101 y += 1;
rlm@1 102 if (x <= 1)
rlm@1 103 r += 1;
rlm@1 104 if (y <= 1)
rlm@1 105 r -= 1;
rlm@1 106 return r;
rlm@1 107 }
rlm@1 108
rlm@1 109 static inline int GetResult2(u32 A, u32 B, u32 C, u32 D,
rlm@1 110 u32 /* E */)
rlm@1 111 {
rlm@1 112 int x = 0;
rlm@1 113 int y = 0;
rlm@1 114 int r = 0;
rlm@1 115
rlm@1 116 if (A == C)
rlm@1 117 x += 1;
rlm@1 118 else if (B == C)
rlm@1 119 y += 1;
rlm@1 120 if (A == D)
rlm@1 121 x += 1;
rlm@1 122 else if (B == D)
rlm@1 123 y += 1;
rlm@1 124 if (x <= 1)
rlm@1 125 r -= 1;
rlm@1 126 if (y <= 1)
rlm@1 127 r += 1;
rlm@1 128 return r;
rlm@1 129 }
rlm@1 130
rlm@1 131 static inline int GetResult(u32 A, u32 B, u32 C, u32 D)
rlm@1 132 {
rlm@1 133 int x = 0;
rlm@1 134 int y = 0;
rlm@1 135 int r = 0;
rlm@1 136
rlm@1 137 if (A == C)
rlm@1 138 x += 1;
rlm@1 139 else if (B == C)
rlm@1 140 y += 1;
rlm@1 141 if (A == D)
rlm@1 142 x += 1;
rlm@1 143 else if (B == D)
rlm@1 144 y += 1;
rlm@1 145 if (x <= 1)
rlm@1 146 r += 1;
rlm@1 147 if (y <= 1)
rlm@1 148 r -= 1;
rlm@1 149 return r;
rlm@1 150 }
rlm@1 151
rlm@1 152 static inline u32 INTERPOLATE(u32 A, u32 B)
rlm@1 153 {
rlm@1 154 if (A != B)
rlm@1 155 {
rlm@1 156 return (((A & colorMask) >> 1) + ((B & colorMask) >> 1) +
rlm@1 157 (A & B & lowPixelMask));
rlm@1 158 }
rlm@1 159 else
rlm@1 160 return A;
rlm@1 161 }
rlm@1 162
rlm@1 163 static inline u32 Q_INTERPOLATE(u32 A, u32 B, u32 C, u32 D)
rlm@1 164 {
rlm@1 165 register u32 x = ((A & qcolorMask) >> 2) +
rlm@1 166 ((B & qcolorMask) >> 2) +
rlm@1 167 ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2);
rlm@1 168 register u32 y = (A & qlowpixelMask) +
rlm@1 169 (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask);
rlm@1 170
rlm@1 171 y = (y >> 2) & qlowpixelMask;
rlm@1 172 return x + y;
rlm@1 173 }
rlm@1 174
rlm@1 175 static inline int GetResult1_32(u32 A, u32 B, u32 C, u32 D,
rlm@1 176 u32 /* E */)
rlm@1 177 {
rlm@1 178 int x = 0;
rlm@1 179 int y = 0;
rlm@1 180 int r = 0;
rlm@1 181
rlm@1 182 if (A == C)
rlm@1 183 x += 1;
rlm@1 184 else if (B == C)
rlm@1 185 y += 1;
rlm@1 186 if (A == D)
rlm@1 187 x += 1;
rlm@1 188 else if (B == D)
rlm@1 189 y += 1;
rlm@1 190 if (x <= 1)
rlm@1 191 r += 1;
rlm@1 192 if (y <= 1)
rlm@1 193 r -= 1;
rlm@1 194 return r;
rlm@1 195 }
rlm@1 196
rlm@1 197 static inline int GetResult2_32(u32 A, u32 B, u32 C, u32 D,
rlm@1 198 u32 /* E */)
rlm@1 199 {
rlm@1 200 int x = 0;
rlm@1 201 int y = 0;
rlm@1 202 int r = 0;
rlm@1 203
rlm@1 204 if (A == C)
rlm@1 205 x += 1;
rlm@1 206 else if (B == C)
rlm@1 207 y += 1;
rlm@1 208 if (A == D)
rlm@1 209 x += 1;
rlm@1 210 else if (B == D)
rlm@1 211 y += 1;
rlm@1 212 if (x <= 1)
rlm@1 213 r -= 1;
rlm@1 214 if (y <= 1)
rlm@1 215 r += 1;
rlm@1 216 return r;
rlm@1 217 }
rlm@1 218
rlm@1 219 #define BLUE_MASK565 0x001F001F
rlm@1 220 #define RED_MASK565 0xF800F800
rlm@1 221 #define GREEN_MASK565 0x07E007E0
rlm@1 222
rlm@1 223 #define BLUE_MASK555 0x001F001F
rlm@1 224 #define RED_MASK555 0x7C007C00
rlm@1 225 #define GREEN_MASK555 0x03E003E0
rlm@1 226
rlm@1 227 void Super2xSaI(u8 *srcPtr, u32 srcPitch,
rlm@1 228 u8 *deltaPtr, u8 *dstPtr, u32 dstPitch,
rlm@1 229 int width, int height)
rlm@1 230 {
rlm@1 231 u16 *bP;
rlm@1 232 u8 * dP;
rlm@1 233 u32 inc_bP;
rlm@1 234 u32 Nextline = srcPitch >> 1;
rlm@1 235 #ifdef MMX
rlm@1 236 if (cpu_mmx)
rlm@1 237 {
rlm@1 238 for (; height; height--)
rlm@1 239 {
rlm@1 240 _2xSaISuper2xSaILine(srcPtr, deltaPtr, srcPitch, width,
rlm@1 241 dstPtr, dstPitch);
rlm@1 242 srcPtr += srcPitch;
rlm@1 243 dstPtr += dstPitch * 2;
rlm@1 244 deltaPtr += srcPitch;
rlm@1 245 }
rlm@1 246 }
rlm@1 247 else
rlm@1 248 #endif
rlm@1 249 {
rlm@1 250 inc_bP = 1;
rlm@1 251
rlm@1 252 for (; height; height--)
rlm@1 253 {
rlm@1 254 bP = (u16 *) srcPtr;
rlm@1 255 dP = (u8 *) dstPtr;
rlm@1 256
rlm@1 257 for (u32 finish = width; finish; finish -= inc_bP)
rlm@1 258 {
rlm@1 259 u32 color4, color5, color6;
rlm@1 260 u32 color1, color2, color3;
rlm@1 261 u32 colorA0, colorA1, colorA2, colorA3,
rlm@1 262 colorB0, colorB1, colorB2, colorB3, colorS1, colorS2;
rlm@1 263 u32 product1a, product1b, product2a, product2b;
rlm@1 264
rlm@1 265 //--------------------------------------- B1 B2
rlm@1 266 // 4 5 6 S2
rlm@1 267 // 1 2 3 S1
rlm@1 268 // A1 A2
rlm@1 269
rlm@1 270 colorB0 = *(bP - Nextline - 1);
rlm@1 271 colorB1 = *(bP - Nextline);
rlm@1 272 colorB2 = *(bP - Nextline + 1);
rlm@1 273 colorB3 = *(bP - Nextline + 2);
rlm@1 274
rlm@1 275 color4 = *(bP - 1);
rlm@1 276 color5 = *(bP);
rlm@1 277 color6 = *(bP + 1);
rlm@1 278 colorS2 = *(bP + 2);
rlm@1 279
rlm@1 280 color1 = *(bP + Nextline - 1);
rlm@1 281 color2 = *(bP + Nextline);
rlm@1 282 color3 = *(bP + Nextline + 1);
rlm@1 283 colorS1 = *(bP + Nextline + 2);
rlm@1 284
rlm@1 285 colorA0 = *(bP + Nextline + Nextline - 1);
rlm@1 286 colorA1 = *(bP + Nextline + Nextline);
rlm@1 287 colorA2 = *(bP + Nextline + Nextline + 1);
rlm@1 288 colorA3 = *(bP + Nextline + Nextline + 2);
rlm@1 289
rlm@1 290 //--------------------------------------
rlm@1 291 if (color2 == color6 && color5 != color3)
rlm@1 292 {
rlm@1 293 product2b = product1b = color2;
rlm@1 294 }
rlm@1 295 else if (color5 == color3 && color2 != color6)
rlm@1 296 {
rlm@1 297 product2b = product1b = color5;
rlm@1 298 }
rlm@1 299 else if (color5 == color3 && color2 == color6)
rlm@1 300 {
rlm@1 301 register int r = 0;
rlm@1 302
rlm@1 303 r += GetResult(color6, color5, color1, colorA1);
rlm@1 304 r += GetResult(color6, color5, color4, colorB1);
rlm@1 305 r += GetResult(color6, color5, colorA2, colorS1);
rlm@1 306 r += GetResult(color6, color5, colorB2, colorS2);
rlm@1 307
rlm@1 308 if (r > 0)
rlm@1 309 product2b = product1b = color6;
rlm@1 310 else if (r < 0)
rlm@1 311 product2b = product1b = color5;
rlm@1 312 else
rlm@1 313 {
rlm@1 314 product2b = product1b = INTERPOLATE(color5, color6);
rlm@1 315 }
rlm@1 316 }
rlm@1 317 else
rlm@1 318 {
rlm@1 319 if (color6 == color3 && color3 == colorA1
rlm@1 320 && color2 != colorA2 && color3 != colorA0)
rlm@1 321 product2b =
rlm@1 322 Q_INTERPOLATE(color3, color3, color3, color2);
rlm@1 323 else if (color5 == color2 && color2 == colorA2
rlm@1 324 && colorA1 != color3 && color2 != colorA3)
rlm@1 325 product2b =
rlm@1 326 Q_INTERPOLATE(color2, color2, color2, color3);
rlm@1 327 else
rlm@1 328 product2b = INTERPOLATE(color2, color3);
rlm@1 329
rlm@1 330 if (color6 == color3 && color6 == colorB1
rlm@1 331 && color5 != colorB2 && color6 != colorB0)
rlm@1 332 product1b =
rlm@1 333 Q_INTERPOLATE(color6, color6, color6, color5);
rlm@1 334 else if (color5 == color2 && color5 == colorB2
rlm@1 335 && colorB1 != color6 && color5 != colorB3)
rlm@1 336 product1b =
rlm@1 337 Q_INTERPOLATE(color6, color5, color5, color5);
rlm@1 338 else
rlm@1 339 product1b = INTERPOLATE(color5, color6);
rlm@1 340 }
rlm@1 341
rlm@1 342 if (color5 == color3 && color2 != color6 && color4 == color5
rlm@1 343 && color5 != colorA2)
rlm@1 344 product2a = INTERPOLATE(color2, color5);
rlm@1 345 else
rlm@1 346 if (color5 == color1 && color6 == color5
rlm@1 347 && color4 != color2 && color5 != colorA0)
rlm@1 348 product2a = INTERPOLATE(color2, color5);
rlm@1 349 else
rlm@1 350 product2a = color2;
rlm@1 351
rlm@1 352 if (color2 == color6 && color5 != color3 && color1 == color2
rlm@1 353 && color2 != colorB2)
rlm@1 354 product1a = INTERPOLATE(color2, color5);
rlm@1 355 else
rlm@1 356 if (color4 == color2 && color3 == color2
rlm@1 357 && color1 != color5 && color2 != colorB0)
rlm@1 358 product1a = INTERPOLATE(color2, color5);
rlm@1 359 else
rlm@1 360 product1a = color5;
rlm@1 361
rlm@1 362 #ifdef WORDS_BIGENDIAN
rlm@1 363 product1a = (product1a << 16) | product1b;
rlm@1 364 product2a = (product2a << 16) | product2b;
rlm@1 365 #else
rlm@1 366 product1a = product1a | (product1b << 16);
rlm@1 367 product2a = product2a | (product2b << 16);
rlm@1 368 #endif
rlm@1 369
rlm@1 370 *((u32 *) dP) = product1a;
rlm@1 371 *((u32 *) (dP + dstPitch)) = product2a;
rlm@1 372
rlm@1 373 bP += inc_bP;
rlm@1 374 dP += sizeof(u32);
rlm@1 375 } // end of for ( finish= width etc..)
rlm@1 376
rlm@1 377 srcPtr += srcPitch;
rlm@1 378 dstPtr += dstPitch << 1;
rlm@1 379 deltaPtr += srcPitch;
rlm@1 380 } // endof: for (; height; height--)
rlm@1 381 }
rlm@1 382 }
rlm@1 383
rlm@1 384 void Super2xSaI32(u8 *srcPtr, u32 srcPitch,
rlm@1 385 u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch,
rlm@1 386 int width, int height)
rlm@1 387 {
rlm@1 388 u32 *bP;
rlm@1 389 u32 *dP;
rlm@1 390 u32 inc_bP;
rlm@1 391 u32 Nextline = srcPitch >> 2;
rlm@1 392 inc_bP = 1;
rlm@1 393
rlm@1 394 for (; height; height--)
rlm@1 395 {
rlm@1 396 bP = (u32 *) srcPtr;
rlm@1 397 dP = (u32 *) dstPtr;
rlm@1 398
rlm@1 399 for (u32 finish = width; finish; finish -= inc_bP)
rlm@1 400 {
rlm@1 401 u32 color4, color5, color6;
rlm@1 402 u32 color1, color2, color3;
rlm@1 403 u32 colorA0, colorA1, colorA2, colorA3,
rlm@1 404 colorB0, colorB1, colorB2, colorB3, colorS1, colorS2;
rlm@1 405 u32 product1a, product1b, product2a, product2b;
rlm@1 406
rlm@1 407 //--------------------------------------- B1 B2
rlm@1 408 // 4 5 6 S2
rlm@1 409 // 1 2 3 S1
rlm@1 410 // A1 A2
rlm@1 411
rlm@1 412 colorB0 = *(bP - Nextline - 1);
rlm@1 413 colorB1 = *(bP - Nextline);
rlm@1 414 colorB2 = *(bP - Nextline + 1);
rlm@1 415 colorB3 = *(bP - Nextline + 2);
rlm@1 416
rlm@1 417 color4 = *(bP - 1);
rlm@1 418 color5 = *(bP);
rlm@1 419 color6 = *(bP + 1);
rlm@1 420 colorS2 = *(bP + 2);
rlm@1 421
rlm@1 422 color1 = *(bP + Nextline - 1);
rlm@1 423 color2 = *(bP + Nextline);
rlm@1 424 color3 = *(bP + Nextline + 1);
rlm@1 425 colorS1 = *(bP + Nextline + 2);
rlm@1 426
rlm@1 427 colorA0 = *(bP + Nextline + Nextline - 1);
rlm@1 428 colorA1 = *(bP + Nextline + Nextline);
rlm@1 429 colorA2 = *(bP + Nextline + Nextline + 1);
rlm@1 430 colorA3 = *(bP + Nextline + Nextline + 2);
rlm@1 431
rlm@1 432 //--------------------------------------
rlm@1 433 if (color2 == color6 && color5 != color3)
rlm@1 434 {
rlm@1 435 product2b = product1b = color2;
rlm@1 436 }
rlm@1 437 else if (color5 == color3 && color2 != color6)
rlm@1 438 {
rlm@1 439 product2b = product1b = color5;
rlm@1 440 }
rlm@1 441 else if (color5 == color3 && color2 == color6)
rlm@1 442 {
rlm@1 443 register int r = 0;
rlm@1 444
rlm@1 445 r += GetResult(color6, color5, color1, colorA1);
rlm@1 446 r += GetResult(color6, color5, color4, colorB1);
rlm@1 447 r += GetResult(color6, color5, colorA2, colorS1);
rlm@1 448 r += GetResult(color6, color5, colorB2, colorS2);
rlm@1 449
rlm@1 450 if (r > 0)
rlm@1 451 product2b = product1b = color6;
rlm@1 452 else if (r < 0)
rlm@1 453 product2b = product1b = color5;
rlm@1 454 else
rlm@1 455 {
rlm@1 456 product2b = product1b = INTERPOLATE(color5, color6);
rlm@1 457 }
rlm@1 458 }
rlm@1 459 else
rlm@1 460 {
rlm@1 461 if (color6 == color3 && color3 == colorA1
rlm@1 462 && color2 != colorA2 && color3 != colorA0)
rlm@1 463 product2b =
rlm@1 464 Q_INTERPOLATE(color3, color3, color3, color2);
rlm@1 465 else if (color5 == color2 && color2 == colorA2
rlm@1 466 && colorA1 != color3 && color2 != colorA3)
rlm@1 467 product2b =
rlm@1 468 Q_INTERPOLATE(color2, color2, color2, color3);
rlm@1 469 else
rlm@1 470 product2b = INTERPOLATE(color2, color3);
rlm@1 471
rlm@1 472 if (color6 == color3 && color6 == colorB1
rlm@1 473 && color5 != colorB2 && color6 != colorB0)
rlm@1 474 product1b =
rlm@1 475 Q_INTERPOLATE(color6, color6, color6, color5);
rlm@1 476 else if (color5 == color2 && color5 == colorB2
rlm@1 477 && colorB1 != color6 && color5 != colorB3)
rlm@1 478 product1b =
rlm@1 479 Q_INTERPOLATE(color6, color5, color5, color5);
rlm@1 480 else
rlm@1 481 product1b = INTERPOLATE(color5, color6);
rlm@1 482 }
rlm@1 483
rlm@1 484 if (color5 == color3 && color2 != color6 && color4 == color5
rlm@1 485 && color5 != colorA2)
rlm@1 486 product2a = INTERPOLATE(color2, color5);
rlm@1 487 else
rlm@1 488 if (color5 == color1 && color6 == color5
rlm@1 489 && color4 != color2 && color5 != colorA0)
rlm@1 490 product2a = INTERPOLATE(color2, color5);
rlm@1 491 else
rlm@1 492 product2a = color2;
rlm@1 493
rlm@1 494 if (color2 == color6 && color5 != color3 && color1 == color2
rlm@1 495 && color2 != colorB2)
rlm@1 496 product1a = INTERPOLATE(color2, color5);
rlm@1 497 else
rlm@1 498 if (color4 == color2 && color3 == color2
rlm@1 499 && color1 != color5 && color2 != colorB0)
rlm@1 500 product1a = INTERPOLATE(color2, color5);
rlm@1 501 else
rlm@1 502 product1a = color5;
rlm@1 503 *(dP) = product1a;
rlm@1 504 *(dP + 1) = product1b;
rlm@1 505 *(dP + (dstPitch >> 2)) = product2a;
rlm@1 506 *(dP + (dstPitch >> 2) + 1) = product2b;
rlm@1 507
rlm@1 508 bP += inc_bP;
rlm@1 509 dP += 2;
rlm@1 510 } // end of for ( finish= width etc..)
rlm@1 511
rlm@1 512 srcPtr += srcPitch;
rlm@1 513 dstPtr += dstPitch << 1;
rlm@1 514 // deltaPtr += srcPitch;
rlm@1 515 } // endof: for (; height; height--)
rlm@1 516 }
rlm@1 517
rlm@1 518 void SuperEagle(u8 *srcPtr, u32 srcPitch, u8 *deltaPtr,
rlm@1 519 u8 *dstPtr, u32 dstPitch, int width, int height)
rlm@1 520 {
rlm@1 521 u8 * dP;
rlm@1 522 u16 *bP;
rlm@1 523 u16 *xP;
rlm@1 524 u32 inc_bP;
rlm@1 525
rlm@1 526 #ifdef MMX
rlm@1 527 if (cpu_mmx)
rlm@1 528 {
rlm@1 529 for (; height; height--)
rlm@1 530 {
rlm@1 531 _2xSaISuperEagleLine(srcPtr, deltaPtr, srcPitch, width,
rlm@1 532 dstPtr, dstPitch);
rlm@1 533 srcPtr += srcPitch;
rlm@1 534 dstPtr += dstPitch * 2;
rlm@1 535 deltaPtr += srcPitch;
rlm@1 536 }
rlm@1 537 }
rlm@1 538 else
rlm@1 539 #endif
rlm@1 540 {
rlm@1 541 inc_bP = 1;
rlm@1 542
rlm@1 543 u32 Nextline = srcPitch >> 1;
rlm@1 544
rlm@1 545 for (; height; height--)
rlm@1 546 {
rlm@1 547 bP = (u16 *) srcPtr;
rlm@1 548 xP = (u16 *) deltaPtr;
rlm@1 549 dP = dstPtr;
rlm@1 550 for (u32 finish = width; finish; finish -= inc_bP)
rlm@1 551 {
rlm@1 552 u32 color4, color5, color6;
rlm@1 553 u32 color1, color2, color3;
rlm@1 554 u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2;
rlm@1 555 u32 product1a, product1b, product2a, product2b;
rlm@1 556
rlm@1 557 colorB1 = *(bP - Nextline);
rlm@1 558 colorB2 = *(bP - Nextline + 1);
rlm@1 559
rlm@1 560 color4 = *(bP - 1);
rlm@1 561 color5 = *(bP);
rlm@1 562 color6 = *(bP + 1);
rlm@1 563 colorS2 = *(bP + 2);
rlm@1 564
rlm@1 565 color1 = *(bP + Nextline - 1);
rlm@1 566 color2 = *(bP + Nextline);
rlm@1 567 color3 = *(bP + Nextline + 1);
rlm@1 568 colorS1 = *(bP + Nextline + 2);
rlm@1 569
rlm@1 570 colorA1 = *(bP + Nextline + Nextline);
rlm@1 571 colorA2 = *(bP + Nextline + Nextline + 1);
rlm@1 572
rlm@1 573 // --------------------------------------
rlm@1 574 if (color2 == color6 && color5 != color3)
rlm@1 575 {
rlm@1 576 product1b = product2a = color2;
rlm@1 577 if ((color1 == color2) || (color6 == colorB2))
rlm@1 578 {
rlm@1 579 product1a = INTERPOLATE(color2, color5);
rlm@1 580 product1a = INTERPOLATE(color2, product1a);
rlm@1 581 // product1a = color2;
rlm@1 582 }
rlm@1 583 else
rlm@1 584 {
rlm@1 585 product1a = INTERPOLATE(color5, color6);
rlm@1 586 }
rlm@1 587
rlm@1 588 if ((color6 == colorS2) || (color2 == colorA1))
rlm@1 589 {
rlm@1 590 product2b = INTERPOLATE(color2, color3);
rlm@1 591 product2b = INTERPOLATE(color2, product2b);
rlm@1 592 // product2b = color2;
rlm@1 593 }
rlm@1 594 else
rlm@1 595 {
rlm@1 596 product2b = INTERPOLATE(color2, color3);
rlm@1 597 }
rlm@1 598 }
rlm@1 599 else if (color5 == color3 && color2 != color6)
rlm@1 600 {
rlm@1 601 product2b = product1a = color5;
rlm@1 602
rlm@1 603 if ((colorB1 == color5) || (color3 == colorS1))
rlm@1 604 {
rlm@1 605 product1b = INTERPOLATE(color5, color6);
rlm@1 606 product1b = INTERPOLATE(color5, product1b);
rlm@1 607 // product1b = color5;
rlm@1 608 }
rlm@1 609 else
rlm@1 610 {
rlm@1 611 product1b = INTERPOLATE(color5, color6);
rlm@1 612 }
rlm@1 613
rlm@1 614 if ((color3 == colorA2) || (color4 == color5))
rlm@1 615 {
rlm@1 616 product2a = INTERPOLATE(color5, color2);
rlm@1 617 product2a = INTERPOLATE(color5, product2a);
rlm@1 618 // product2a = color5;
rlm@1 619 }
rlm@1 620 else
rlm@1 621 {
rlm@1 622 product2a = INTERPOLATE(color2, color3);
rlm@1 623 }
rlm@1 624 }
rlm@1 625 else if (color5 == color3 && color2 == color6)
rlm@1 626 {
rlm@1 627 register int r = 0;
rlm@1 628
rlm@1 629 r += GetResult(color6, color5, color1, colorA1);
rlm@1 630 r += GetResult(color6, color5, color4, colorB1);
rlm@1 631 r += GetResult(color6, color5, colorA2, colorS1);
rlm@1 632 r += GetResult(color6, color5, colorB2, colorS2);
rlm@1 633
rlm@1 634 if (r > 0)
rlm@1 635 {
rlm@1 636 product1b = product2a = color2;
rlm@1 637 product1a = product2b = INTERPOLATE(color5, color6);
rlm@1 638 }
rlm@1 639 else if (r < 0)
rlm@1 640 {
rlm@1 641 product2b = product1a = color5;
rlm@1 642 product1b = product2a = INTERPOLATE(color5, color6);
rlm@1 643 }
rlm@1 644 else
rlm@1 645 {
rlm@1 646 product2b = product1a = color5;
rlm@1 647 product1b = product2a = color2;
rlm@1 648 }
rlm@1 649 }
rlm@1 650 else
rlm@1 651 {
rlm@1 652 product2b = product1a = INTERPOLATE(color2, color6);
rlm@1 653 product2b =
rlm@1 654 Q_INTERPOLATE(color3, color3, color3, product2b);
rlm@1 655 product1a =
rlm@1 656 Q_INTERPOLATE(color5, color5, color5, product1a);
rlm@1 657
rlm@1 658 product2a = product1b = INTERPOLATE(color5, color3);
rlm@1 659 product2a =
rlm@1 660 Q_INTERPOLATE(color2, color2, color2, product2a);
rlm@1 661 product1b =
rlm@1 662 Q_INTERPOLATE(color6, color6, color6, product1b);
rlm@1 663
rlm@1 664 // product1a = color5;
rlm@1 665 // product1b = color6;
rlm@1 666 // product2a = color2;
rlm@1 667 // product2b = color3;
rlm@1 668 }
rlm@1 669 #ifdef WORDS_BIGENDIAN
rlm@1 670 product1a = (product1a << 16) | product1b;
rlm@1 671 product2a = (product2a << 16) | product2b;
rlm@1 672 #else
rlm@1 673 product1a = product1a | (product1b << 16);
rlm@1 674 product2a = product2a | (product2b << 16);
rlm@1 675 #endif
rlm@1 676
rlm@1 677 *((u32 *) dP) = product1a;
rlm@1 678 *((u32 *) (dP + dstPitch)) = product2a;
rlm@1 679 *xP = color5;
rlm@1 680
rlm@1 681 bP += inc_bP;
rlm@1 682 xP += inc_bP;
rlm@1 683 dP += sizeof(u32);
rlm@1 684 } // end of for ( finish= width etc..)
rlm@1 685
rlm@1 686 srcPtr += srcPitch;
rlm@1 687 dstPtr += dstPitch << 1;
rlm@1 688 deltaPtr += srcPitch;
rlm@1 689 } // endof: for (height; height; height--)
rlm@1 690 }
rlm@1 691 }
rlm@1 692
rlm@1 693 void SuperEagle32(u8 *srcPtr, u32 srcPitch, u8 *deltaPtr,
rlm@1 694 u8 *dstPtr, u32 dstPitch, int width, int height)
rlm@1 695 {
rlm@1 696 u32 *dP;
rlm@1 697 u32 *bP;
rlm@1 698 u32 *xP;
rlm@1 699 u32 inc_bP;
rlm@1 700
rlm@1 701 inc_bP = 1;
rlm@1 702
rlm@1 703 u32 Nextline = srcPitch >> 2;
rlm@1 704
rlm@1 705 for (; height; height--)
rlm@1 706 {
rlm@1 707 bP = (u32 *) srcPtr;
rlm@1 708 xP = (u32 *) deltaPtr;
rlm@1 709 dP = (u32 *)dstPtr;
rlm@1 710 for (u32 finish = width; finish; finish -= inc_bP)
rlm@1 711 {
rlm@1 712 u32 color4, color5, color6;
rlm@1 713 u32 color1, color2, color3;
rlm@1 714 u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2;
rlm@1 715 u32 product1a, product1b, product2a, product2b;
rlm@1 716
rlm@1 717 colorB1 = *(bP - Nextline);
rlm@1 718 colorB2 = *(bP - Nextline + 1);
rlm@1 719
rlm@1 720 color4 = *(bP - 1);
rlm@1 721 color5 = *(bP);
rlm@1 722 color6 = *(bP + 1);
rlm@1 723 colorS2 = *(bP + 2);
rlm@1 724
rlm@1 725 color1 = *(bP + Nextline - 1);
rlm@1 726 color2 = *(bP + Nextline);
rlm@1 727 color3 = *(bP + Nextline + 1);
rlm@1 728 colorS1 = *(bP + Nextline + 2);
rlm@1 729
rlm@1 730 colorA1 = *(bP + Nextline + Nextline);
rlm@1 731 colorA2 = *(bP + Nextline + Nextline + 1);
rlm@1 732
rlm@1 733 // --------------------------------------
rlm@1 734 if (color2 == color6 && color5 != color3)
rlm@1 735 {
rlm@1 736 product1b = product2a = color2;
rlm@1 737 if ((color1 == color2) || (color6 == colorB2))
rlm@1 738 {
rlm@1 739 product1a = INTERPOLATE(color2, color5);
rlm@1 740 product1a = INTERPOLATE(color2, product1a);
rlm@1 741 // product1a = color2;
rlm@1 742 }
rlm@1 743 else
rlm@1 744 {
rlm@1 745 product1a = INTERPOLATE(color5, color6);
rlm@1 746 }
rlm@1 747
rlm@1 748 if ((color6 == colorS2) || (color2 == colorA1))
rlm@1 749 {
rlm@1 750 product2b = INTERPOLATE(color2, color3);
rlm@1 751 product2b = INTERPOLATE(color2, product2b);
rlm@1 752 // product2b = color2;
rlm@1 753 }
rlm@1 754 else
rlm@1 755 {
rlm@1 756 product2b = INTERPOLATE(color2, color3);
rlm@1 757 }
rlm@1 758 }
rlm@1 759 else if (color5 == color3 && color2 != color6)
rlm@1 760 {
rlm@1 761 product2b = product1a = color5;
rlm@1 762
rlm@1 763 if ((colorB1 == color5) || (color3 == colorS1))
rlm@1 764 {
rlm@1 765 product1b = INTERPOLATE(color5, color6);
rlm@1 766 product1b = INTERPOLATE(color5, product1b);
rlm@1 767 // product1b = color5;
rlm@1 768 }
rlm@1 769 else
rlm@1 770 {
rlm@1 771 product1b = INTERPOLATE(color5, color6);
rlm@1 772 }
rlm@1 773
rlm@1 774 if ((color3 == colorA2) || (color4 == color5))
rlm@1 775 {
rlm@1 776 product2a = INTERPOLATE(color5, color2);
rlm@1 777 product2a = INTERPOLATE(color5, product2a);
rlm@1 778 // product2a = color5;
rlm@1 779 }
rlm@1 780 else
rlm@1 781 {
rlm@1 782 product2a = INTERPOLATE(color2, color3);
rlm@1 783 }
rlm@1 784 }
rlm@1 785 else if (color5 == color3 && color2 == color6)
rlm@1 786 {
rlm@1 787 register int r = 0;
rlm@1 788
rlm@1 789 r += GetResult(color6, color5, color1, colorA1);
rlm@1 790 r += GetResult(color6, color5, color4, colorB1);
rlm@1 791 r += GetResult(color6, color5, colorA2, colorS1);
rlm@1 792 r += GetResult(color6, color5, colorB2, colorS2);
rlm@1 793
rlm@1 794 if (r > 0)
rlm@1 795 {
rlm@1 796 product1b = product2a = color2;
rlm@1 797 product1a = product2b = INTERPOLATE(color5, color6);
rlm@1 798 }
rlm@1 799 else if (r < 0)
rlm@1 800 {
rlm@1 801 product2b = product1a = color5;
rlm@1 802 product1b = product2a = INTERPOLATE(color5, color6);
rlm@1 803 }
rlm@1 804 else
rlm@1 805 {
rlm@1 806 product2b = product1a = color5;
rlm@1 807 product1b = product2a = color2;
rlm@1 808 }
rlm@1 809 }
rlm@1 810 else
rlm@1 811 {
rlm@1 812 product2b = product1a = INTERPOLATE(color2, color6);
rlm@1 813 product2b =
rlm@1 814 Q_INTERPOLATE(color3, color3, color3, product2b);
rlm@1 815 product1a =
rlm@1 816 Q_INTERPOLATE(color5, color5, color5, product1a);
rlm@1 817
rlm@1 818 product2a = product1b = INTERPOLATE(color5, color3);
rlm@1 819 product2a =
rlm@1 820 Q_INTERPOLATE(color2, color2, color2, product2a);
rlm@1 821 product1b =
rlm@1 822 Q_INTERPOLATE(color6, color6, color6, product1b);
rlm@1 823
rlm@1 824 // product1a = color5;
rlm@1 825 // product1b = color6;
rlm@1 826 // product2a = color2;
rlm@1 827 // product2b = color3;
rlm@1 828 }
rlm@1 829 *(dP) = product1a;
rlm@1 830 *(dP + 1) = product1b;
rlm@1 831 *(dP + (dstPitch >> 2)) = product2a;
rlm@1 832 *(dP + (dstPitch >> 2) + 1) = product2b;
rlm@1 833 *xP = color5;
rlm@1 834
rlm@1 835 bP += inc_bP;
rlm@1 836 xP += inc_bP;
rlm@1 837 dP += 2;
rlm@1 838 } // end of for ( finish= width etc..)
rlm@1 839
rlm@1 840 srcPtr += srcPitch;
rlm@1 841 dstPtr += dstPitch << 1;
rlm@1 842 deltaPtr += srcPitch;
rlm@1 843 } // endof: for (height; height; height--)
rlm@1 844 }
rlm@1 845
rlm@1 846 void _2xSaI(u8 *srcPtr, u32 srcPitch, u8 *deltaPtr,
rlm@1 847 u8 *dstPtr, u32 dstPitch, int width, int height)
rlm@1 848 {
rlm@1 849 u8 * dP;
rlm@1 850 u16 *bP;
rlm@1 851 u32 inc_bP;
rlm@1 852
rlm@1 853 #ifdef MMX
rlm@1 854 if (cpu_mmx)
rlm@1 855 {
rlm@1 856 for (; height; height -= 1)
rlm@1 857 {
rlm@1 858 _2xSaILine(srcPtr, deltaPtr, srcPitch, width, dstPtr, dstPitch);
rlm@1 859 srcPtr += srcPitch;
rlm@1 860 dstPtr += dstPitch * 2;
rlm@1 861 deltaPtr += srcPitch;
rlm@1 862 }
rlm@1 863 }
rlm@1 864 else
rlm@1 865 #endif
rlm@1 866 {
rlm@1 867 inc_bP = 1;
rlm@1 868
rlm@1 869 u32 Nextline = srcPitch >> 1;
rlm@1 870
rlm@1 871 for (; height; height--)
rlm@1 872 {
rlm@1 873 bP = (u16 *) srcPtr;
rlm@1 874 dP = dstPtr;
rlm@1 875
rlm@1 876 for (u32 finish = width; finish; finish -= inc_bP)
rlm@1 877 {
rlm@1 878 register u32 colorA, colorB;
rlm@1 879 u32 colorC, colorD,
rlm@1 880 colorE, colorF, colorG, colorH,
rlm@1 881 colorI, colorJ, colorK, colorL,
rlm@1 882
rlm@1 883 colorM, colorN, colorO, colorP;
rlm@1 884 u32 product, product1, product2;
rlm@1 885
rlm@1 886 //---------------------------------------
rlm@1 887 // Map of the pixels: I|E F|J
rlm@1 888 // G|A B|K
rlm@1 889 // H|C D|L
rlm@1 890 // M|N O|P
rlm@1 891 colorI = *(bP - Nextline - 1);
rlm@1 892 colorE = *(bP - Nextline);
rlm@1 893 colorF = *(bP - Nextline + 1);
rlm@1 894 colorJ = *(bP - Nextline + 2);
rlm@1 895
rlm@1 896 colorG = *(bP - 1);
rlm@1 897 colorA = *(bP);
rlm@1 898 colorB = *(bP + 1);
rlm@1 899 colorK = *(bP + 2);
rlm@1 900
rlm@1 901 colorH = *(bP + Nextline - 1);
rlm@1 902 colorC = *(bP + Nextline);
rlm@1 903 colorD = *(bP + Nextline + 1);
rlm@1 904 colorL = *(bP + Nextline + 2);
rlm@1 905
rlm@1 906 colorM = *(bP + Nextline + Nextline - 1);
rlm@1 907 colorN = *(bP + Nextline + Nextline);
rlm@1 908 colorO = *(bP + Nextline + Nextline + 1);
rlm@1 909 colorP = *(bP + Nextline + Nextline + 2);
rlm@1 910
rlm@1 911 if ((colorA == colorD) && (colorB != colorC))
rlm@1 912 {
rlm@1 913 if (((colorA == colorE) && (colorB == colorL)) ||
rlm@1 914 ((colorA == colorC) && (colorA == colorF)
rlm@1 915 && (colorB != colorE) && (colorB == colorJ)))
rlm@1 916 {
rlm@1 917 product = colorA;
rlm@1 918 }
rlm@1 919 else
rlm@1 920 {
rlm@1 921 product = INTERPOLATE(colorA, colorB);
rlm@1 922 }
rlm@1 923
rlm@1 924 if (((colorA == colorG) && (colorC == colorO)) ||
rlm@1 925 ((colorA == colorB) && (colorA == colorH)
rlm@1 926 && (colorG != colorC) && (colorC == colorM)))
rlm@1 927 {
rlm@1 928 product1 = colorA;
rlm@1 929 }
rlm@1 930 else
rlm@1 931 {
rlm@1 932 product1 = INTERPOLATE(colorA, colorC);
rlm@1 933 }
rlm@1 934 product2 = colorA;
rlm@1 935 }
rlm@1 936 else if ((colorB == colorC) && (colorA != colorD))
rlm@1 937 {
rlm@1 938 if (((colorB == colorF) && (colorA == colorH)) ||
rlm@1 939 ((colorB == colorE) && (colorB == colorD)
rlm@1 940 && (colorA != colorF) && (colorA == colorI)))
rlm@1 941 {
rlm@1 942 product = colorB;
rlm@1 943 }
rlm@1 944 else
rlm@1 945 {
rlm@1 946 product = INTERPOLATE(colorA, colorB);
rlm@1 947 }
rlm@1 948
rlm@1 949 if (((colorC == colorH) && (colorA == colorF)) ||
rlm@1 950 ((colorC == colorG) && (colorC == colorD)
rlm@1 951 && (colorA != colorH) && (colorA == colorI)))
rlm@1 952 {
rlm@1 953 product1 = colorC;
rlm@1 954 }
rlm@1 955 else
rlm@1 956 {
rlm@1 957 product1 = INTERPOLATE(colorA, colorC);
rlm@1 958 }
rlm@1 959 product2 = colorB;
rlm@1 960 }
rlm@1 961 else if ((colorA == colorD) && (colorB == colorC))
rlm@1 962 {
rlm@1 963 if (colorA == colorB)
rlm@1 964 {
rlm@1 965 product = colorA;
rlm@1 966 product1 = colorA;
rlm@1 967 product2 = colorA;
rlm@1 968 }
rlm@1 969 else
rlm@1 970 {
rlm@1 971 register int r = 0;
rlm@1 972
rlm@1 973 product1 = INTERPOLATE(colorA, colorC);
rlm@1 974 product = INTERPOLATE(colorA, colorB);
rlm@1 975
rlm@1 976 r +=
rlm@1 977 GetResult1(colorA, colorB, colorG, colorE,
rlm@1 978 colorI);
rlm@1 979 r +=
rlm@1 980 GetResult2(colorB, colorA, colorK, colorF,
rlm@1 981 colorJ);
rlm@1 982 r +=
rlm@1 983 GetResult2(colorB, colorA, colorH, colorN,
rlm@1 984 colorM);
rlm@1 985 r +=
rlm@1 986 GetResult1(colorA, colorB, colorL, colorO,
rlm@1 987 colorP);
rlm@1 988
rlm@1 989 if (r > 0)
rlm@1 990 product2 = colorA;
rlm@1 991 else if (r < 0)
rlm@1 992 product2 = colorB;
rlm@1 993 else
rlm@1 994 {
rlm@1 995 product2 =
rlm@1 996 Q_INTERPOLATE(colorA, colorB, colorC,
rlm@1 997 colorD);
rlm@1 998 }
rlm@1 999 }
rlm@1 1000 }
rlm@1 1001 else
rlm@1 1002 {
rlm@1 1003 product2 = Q_INTERPOLATE(colorA, colorB, colorC, colorD);
rlm@1 1004
rlm@1 1005 if ((colorA == colorC) && (colorA == colorF)
rlm@1 1006 && (colorB != colorE) && (colorB == colorJ))
rlm@1 1007 {
rlm@1 1008 product = colorA;
rlm@1 1009 }
rlm@1 1010 else if ((colorB == colorE) && (colorB == colorD)
rlm@1 1011 && (colorA != colorF) && (colorA == colorI))
rlm@1 1012 {
rlm@1 1013 product = colorB;
rlm@1 1014 }
rlm@1 1015 else
rlm@1 1016 {
rlm@1 1017 product = INTERPOLATE(colorA, colorB);
rlm@1 1018 }
rlm@1 1019
rlm@1 1020 if ((colorA == colorB) && (colorA == colorH)
rlm@1 1021 && (colorG != colorC) && (colorC == colorM))
rlm@1 1022 {
rlm@1 1023 product1 = colorA;
rlm@1 1024 }
rlm@1 1025 else if ((colorC == colorG) && (colorC == colorD)
rlm@1 1026 && (colorA != colorH) && (colorA == colorI))
rlm@1 1027 {
rlm@1 1028 product1 = colorC;
rlm@1 1029 }
rlm@1 1030 else
rlm@1 1031 {
rlm@1 1032 product1 = INTERPOLATE(colorA, colorC);
rlm@1 1033 }
rlm@1 1034 }
rlm@1 1035
rlm@1 1036 #ifdef WORDS_BIGENDIAN
rlm@1 1037 product = (colorA << 16) | product;
rlm@1 1038 product1 = (product1 << 16) | product2;
rlm@1 1039 #else
rlm@1 1040 product = colorA | (product << 16);
rlm@1 1041 product1 = product1 | (product2 << 16);
rlm@1 1042 #endif
rlm@1 1043 *((s32 *) dP) = product;
rlm@1 1044 *((u32 *) (dP + dstPitch)) = product1;
rlm@1 1045
rlm@1 1046 bP += inc_bP;
rlm@1 1047 dP += sizeof(u32);
rlm@1 1048 } // end of for ( finish= width etc..)
rlm@1 1049
rlm@1 1050 srcPtr += srcPitch;
rlm@1 1051 dstPtr += dstPitch << 1;
rlm@1 1052 deltaPtr += srcPitch;
rlm@1 1053 } // endof: for (height; height; height--)
rlm@1 1054 }
rlm@1 1055 }
rlm@1 1056
rlm@1 1057 void _2xSaI32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,
rlm@1 1058 u8 *dstPtr, u32 dstPitch, int width, int height)
rlm@1 1059 {
rlm@1 1060 u32 *dP;
rlm@1 1061 u32 *bP;
rlm@1 1062 u32 inc_bP = 1;
rlm@1 1063
rlm@1 1064 u32 Nextline = srcPitch >> 2;
rlm@1 1065
rlm@1 1066 for (; height; height--)
rlm@1 1067 {
rlm@1 1068 bP = (u32 *) srcPtr;
rlm@1 1069 dP = (u32 *) dstPtr;
rlm@1 1070
rlm@1 1071 for (u32 finish = width; finish; finish -= inc_bP)
rlm@1 1072 {
rlm@1 1073 register u32 colorA, colorB;
rlm@1 1074 u32 colorC, colorD,
rlm@1 1075 colorE, colorF, colorG, colorH,
rlm@1 1076 colorI, colorJ, colorK, colorL,
rlm@1 1077
rlm@1 1078 colorM, colorN, colorO, colorP;
rlm@1 1079 u32 product, product1, product2;
rlm@1 1080
rlm@1 1081 //---------------------------------------
rlm@1 1082 // Map of the pixels: I|E F|J
rlm@1 1083 // G|A B|K
rlm@1 1084 // H|C D|L
rlm@1 1085 // M|N O|P
rlm@1 1086 colorI = *(bP - Nextline - 1);
rlm@1 1087 colorE = *(bP - Nextline);
rlm@1 1088 colorF = *(bP - Nextline + 1);
rlm@1 1089 colorJ = *(bP - Nextline + 2);
rlm@1 1090
rlm@1 1091 colorG = *(bP - 1);
rlm@1 1092 colorA = *(bP);
rlm@1 1093 colorB = *(bP + 1);
rlm@1 1094 colorK = *(bP + 2);
rlm@1 1095
rlm@1 1096 colorH = *(bP + Nextline - 1);
rlm@1 1097 colorC = *(bP + Nextline);
rlm@1 1098 colorD = *(bP + Nextline + 1);
rlm@1 1099 colorL = *(bP + Nextline + 2);
rlm@1 1100
rlm@1 1101 colorM = *(bP + Nextline + Nextline - 1);
rlm@1 1102 colorN = *(bP + Nextline + Nextline);
rlm@1 1103 colorO = *(bP + Nextline + Nextline + 1);
rlm@1 1104 colorP = *(bP + Nextline + Nextline + 2);
rlm@1 1105
rlm@1 1106 if ((colorA == colorD) && (colorB != colorC))
rlm@1 1107 {
rlm@1 1108 if (((colorA == colorE) && (colorB == colorL)) ||
rlm@1 1109 ((colorA == colorC) && (colorA == colorF)
rlm@1 1110 && (colorB != colorE) && (colorB == colorJ)))
rlm@1 1111 {
rlm@1 1112 product = colorA;
rlm@1 1113 }
rlm@1 1114 else
rlm@1 1115 {
rlm@1 1116 product = INTERPOLATE(colorA, colorB);
rlm@1 1117 }
rlm@1 1118
rlm@1 1119 if (((colorA == colorG) && (colorC == colorO)) ||
rlm@1 1120 ((colorA == colorB) && (colorA == colorH)
rlm@1 1121 && (colorG != colorC) && (colorC == colorM)))
rlm@1 1122 {
rlm@1 1123 product1 = colorA;
rlm@1 1124 }
rlm@1 1125 else
rlm@1 1126 {
rlm@1 1127 product1 = INTERPOLATE(colorA, colorC);
rlm@1 1128 }
rlm@1 1129 product2 = colorA;
rlm@1 1130 }
rlm@1 1131 else if ((colorB == colorC) && (colorA != colorD))
rlm@1 1132 {
rlm@1 1133 if (((colorB == colorF) && (colorA == colorH)) ||
rlm@1 1134 ((colorB == colorE) && (colorB == colorD)
rlm@1 1135 && (colorA != colorF) && (colorA == colorI)))
rlm@1 1136 {
rlm@1 1137 product = colorB;
rlm@1 1138 }
rlm@1 1139 else
rlm@1 1140 {
rlm@1 1141 product = INTERPOLATE(colorA, colorB);
rlm@1 1142 }
rlm@1 1143
rlm@1 1144 if (((colorC == colorH) && (colorA == colorF)) ||
rlm@1 1145 ((colorC == colorG) && (colorC == colorD)
rlm@1 1146 && (colorA != colorH) && (colorA == colorI)))
rlm@1 1147 {
rlm@1 1148 product1 = colorC;
rlm@1 1149 }
rlm@1 1150 else
rlm@1 1151 {
rlm@1 1152 product1 = INTERPOLATE(colorA, colorC);
rlm@1 1153 }
rlm@1 1154 product2 = colorB;
rlm@1 1155 }
rlm@1 1156 else if ((colorA == colorD) && (colorB == colorC))
rlm@1 1157 {
rlm@1 1158 if (colorA == colorB)
rlm@1 1159 {
rlm@1 1160 product = colorA;
rlm@1 1161 product1 = colorA;
rlm@1 1162 product2 = colorA;
rlm@1 1163 }
rlm@1 1164 else
rlm@1 1165 {
rlm@1 1166 register int r = 0;
rlm@1 1167
rlm@1 1168 product1 = INTERPOLATE(colorA, colorC);
rlm@1 1169 product = INTERPOLATE(colorA, colorB);
rlm@1 1170
rlm@1 1171 r +=
rlm@1 1172 GetResult1(colorA, colorB, colorG, colorE,
rlm@1 1173 colorI);
rlm@1 1174 r +=
rlm@1 1175 GetResult2(colorB, colorA, colorK, colorF,
rlm@1 1176 colorJ);
rlm@1 1177 r +=
rlm@1 1178 GetResult2(colorB, colorA, colorH, colorN,
rlm@1 1179 colorM);
rlm@1 1180 r +=
rlm@1 1181 GetResult1(colorA, colorB, colorL, colorO,
rlm@1 1182 colorP);
rlm@1 1183
rlm@1 1184 if (r > 0)
rlm@1 1185 product2 = colorA;
rlm@1 1186 else if (r < 0)
rlm@1 1187 product2 = colorB;
rlm@1 1188 else
rlm@1 1189 {
rlm@1 1190 product2 =
rlm@1 1191 Q_INTERPOLATE(colorA, colorB, colorC,
rlm@1 1192 colorD);
rlm@1 1193 }
rlm@1 1194 }
rlm@1 1195 }
rlm@1 1196 else
rlm@1 1197 {
rlm@1 1198 product2 = Q_INTERPOLATE(colorA, colorB, colorC, colorD);
rlm@1 1199
rlm@1 1200 if ((colorA == colorC) && (colorA == colorF)
rlm@1 1201 && (colorB != colorE) && (colorB == colorJ))
rlm@1 1202 {
rlm@1 1203 product = colorA;
rlm@1 1204 }
rlm@1 1205 else if ((colorB == colorE) && (colorB == colorD)
rlm@1 1206 && (colorA != colorF) && (colorA == colorI))
rlm@1 1207 {
rlm@1 1208 product = colorB;
rlm@1 1209 }
rlm@1 1210 else
rlm@1 1211 {
rlm@1 1212 product = INTERPOLATE(colorA, colorB);
rlm@1 1213 }
rlm@1 1214
rlm@1 1215 if ((colorA == colorB) && (colorA == colorH)
rlm@1 1216 && (colorG != colorC) && (colorC == colorM))
rlm@1 1217 {
rlm@1 1218 product1 = colorA;
rlm@1 1219 }
rlm@1 1220 else if ((colorC == colorG) && (colorC == colorD)
rlm@1 1221 && (colorA != colorH) && (colorA == colorI))
rlm@1 1222 {
rlm@1 1223 product1 = colorC;
rlm@1 1224 }
rlm@1 1225 else
rlm@1 1226 {
rlm@1 1227 product1 = INTERPOLATE(colorA, colorC);
rlm@1 1228 }
rlm@1 1229 }
rlm@1 1230 *(dP) = colorA;
rlm@1 1231 *(dP + 1) = product;
rlm@1 1232 *(dP + (dstPitch >> 2)) = product1;
rlm@1 1233 *(dP + (dstPitch >> 2) + 1) = product2;
rlm@1 1234
rlm@1 1235 bP += inc_bP;
rlm@1 1236 dP += 2;
rlm@1 1237 } // end of for ( finish= width etc..)
rlm@1 1238
rlm@1 1239 srcPtr += srcPitch;
rlm@1 1240 dstPtr += dstPitch << 1;
rlm@1 1241 // deltaPtr += srcPitch;
rlm@1 1242 } // endof: for (height; height; height--)
rlm@1 1243 }
rlm@1 1244
rlm@1 1245 static u32 Bilinear(u32 A, u32 B, u32 x)
rlm@1 1246 {
rlm@1 1247 unsigned long areaA, areaB;
rlm@1 1248 unsigned long result;
rlm@1 1249
rlm@1 1250 if (A == B)
rlm@1 1251 return A;
rlm@1 1252
rlm@1 1253 areaB = (x >> 11) & 0x1f; // reduce 16 bit fraction to 5 bits
rlm@1 1254 areaA = 0x20 - areaB;
rlm@1 1255
rlm@1 1256 A = (A & redblueMask) | ((A & greenMask) << 16);
rlm@1 1257 B = (B & redblueMask) | ((B & greenMask) << 16);
rlm@1 1258
rlm@1 1259 result = ((areaA * A) + (areaB * B)) >> 5;
rlm@1 1260
rlm@1 1261 return (result & redblueMask) | ((result >> 16) & greenMask);
rlm@1 1262 }
rlm@1 1263
rlm@1 1264 static u32 Bilinear4(u32 A, u32 B, u32 C, u32 D, u32 x,
rlm@1 1265 u32 y)
rlm@1 1266 {
rlm@1 1267 unsigned long areaA, areaB, areaC, areaD;
rlm@1 1268 unsigned long result, xy;
rlm@1 1269
rlm@1 1270 x = (x >> 11) & 0x1f;
rlm@1 1271 y = (y >> 11) & 0x1f;
rlm@1 1272 xy = (x * y) >> 5;
rlm@1 1273
rlm@1 1274 A = (A & redblueMask) | ((A & greenMask) << 16);
rlm@1 1275 B = (B & redblueMask) | ((B & greenMask) << 16);
rlm@1 1276 C = (C & redblueMask) | ((C & greenMask) << 16);
rlm@1 1277 D = (D & redblueMask) | ((D & greenMask) << 16);
rlm@1 1278
rlm@1 1279 areaA = 0x20 + xy - x - y;
rlm@1 1280 areaB = x - xy;
rlm@1 1281 areaC = y - xy;
rlm@1 1282 areaD = xy;
rlm@1 1283
rlm@1 1284 result = ((areaA * A) + (areaB * B) + (areaC * C) + (areaD * D)) >> 5;
rlm@1 1285
rlm@1 1286 return (result & redblueMask) | ((result >> 16) & greenMask);
rlm@1 1287 }
rlm@1 1288
rlm@1 1289 void Scale_2xSaI(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */,
rlm@1 1290 u8 *dstPtr, u32 dstPitch,
rlm@1 1291 u32 dstWidth, u32 dstHeight, int width, int height)
rlm@1 1292 {
rlm@1 1293 u8 * dP;
rlm@1 1294 u16 *bP;
rlm@1 1295
rlm@1 1296 u32 w;
rlm@1 1297 u32 h;
rlm@1 1298 u32 dw;
rlm@1 1299 u32 dh;
rlm@1 1300 u32 hfinish;
rlm@1 1301 u32 wfinish;
rlm@1 1302
rlm@1 1303 u32 Nextline = srcPitch >> 1;
rlm@1 1304
rlm@1 1305 wfinish = (width - 1) << 16; // convert to fixed point
rlm@1 1306 dw = wfinish / (dstWidth - 1);
rlm@1 1307 hfinish = (height - 1) << 16; // convert to fixed point
rlm@1 1308 dh = hfinish / (dstHeight - 1);
rlm@1 1309
rlm@1 1310 for (h = 0; h < hfinish; h += dh)
rlm@1 1311 {
rlm@1 1312 u32 y1, y2;
rlm@1 1313
rlm@1 1314 y1 = h & 0xffff; // fraction part of fixed point
rlm@1 1315 bP = (u16 *) (srcPtr + ((h >> 16) * srcPitch));
rlm@1 1316 dP = dstPtr;
rlm@1 1317 y2 = 0x10000 - y1;
rlm@1 1318
rlm@1 1319 w = 0;
rlm@1 1320
rlm@1 1321 for (; w < wfinish; )
rlm@1 1322 {
rlm@1 1323 u32 A, B, C, D;
rlm@1 1324 u32 E, F, G, H;
rlm@1 1325 u32 I, J, K, L;
rlm@1 1326 u32 x1, x2, a1, f1, f2;
rlm@1 1327 u32 position, product1;
rlm@1 1328
rlm@1 1329 position = w >> 16;
rlm@1 1330 A = bP[position]; // current pixel
rlm@1 1331 B = bP[position + 1]; // next pixel
rlm@1 1332 C = bP[position + Nextline];
rlm@1 1333 D = bP[position + Nextline + 1];
rlm@1 1334 E = bP[position - Nextline];
rlm@1 1335 F = bP[position - Nextline + 1];
rlm@1 1336 G = bP[position - 1];
rlm@1 1337 H = bP[position + Nextline - 1];
rlm@1 1338 I = bP[position + 2];
rlm@1 1339 J = bP[position + Nextline + 2];
rlm@1 1340 K = bP[position + Nextline + Nextline];
rlm@1 1341 L = bP[position + Nextline + Nextline + 1];
rlm@1 1342
rlm@1 1343 x1 = w & 0xffff; // fraction part of fixed point
rlm@1 1344 x2 = 0x10000 - x1;
rlm@1 1345
rlm@1 1346 /*0*/
rlm@1 1347 if (A == B && C == D && A == C)
rlm@1 1348 product1 = A;
rlm@1 1349 else /*1*/ if (A == D && B != C)
rlm@1 1350 {
rlm@1 1351 f1 = (x1 >> 1) + (0x10000 >> 2);
rlm@1 1352 f2 = (y1 >> 1) + (0x10000 >> 2);
rlm@1 1353 if (y1 <= f1 && A == J && A != E) // close to B
rlm@1 1354 {
rlm@1 1355 a1 = f1 - y1;
rlm@1 1356 product1 = Bilinear(A, B, a1);
rlm@1 1357 }
rlm@1 1358 else if (y1 >= f1 && A == G && A != L) // close to C
rlm@1 1359 {
rlm@1 1360 a1 = y1 - f1;
rlm@1 1361 product1 = Bilinear(A, C, a1);
rlm@1 1362 }
rlm@1 1363 else if (x1 >= f2 && A == E && A != J) // close to B
rlm@1 1364 {
rlm@1 1365 a1 = x1 - f2;
rlm@1 1366 product1 = Bilinear(A, B, a1);
rlm@1 1367 }
rlm@1 1368 else if (x1 <= f2 && A == L && A != G) // close to C
rlm@1 1369 {
rlm@1 1370 a1 = f2 - x1;
rlm@1 1371 product1 = Bilinear(A, C, a1);
rlm@1 1372 }
rlm@1 1373 else if (y1 >= x1) // close to C
rlm@1 1374 {
rlm@1 1375 a1 = y1 - x1;
rlm@1 1376 product1 = Bilinear(A, C, a1);
rlm@1 1377 }
rlm@1 1378 else if (y1 <= x1) // close to B
rlm@1 1379 {
rlm@1 1380 a1 = x1 - y1;
rlm@1 1381 product1 = Bilinear(A, B, a1);
rlm@1 1382 }
rlm@1 1383 }
rlm@1 1384 else
rlm@1 1385 /*2*/
rlm@1 1386 if (B == C && A != D)
rlm@1 1387 {
rlm@1 1388 f1 = (x1 >> 1) + (0x10000 >> 2);
rlm@1 1389 f2 = (y1 >> 1) + (0x10000 >> 2);
rlm@1 1390 if (y2 >= f1 && B == H && B != F) // close to A
rlm@1 1391 {
rlm@1 1392 a1 = y2 - f1;
rlm@1 1393 product1 = Bilinear(B, A, a1);
rlm@1 1394 }
rlm@1 1395 else if (y2 <= f1 && B == I && B != K) // close to D
rlm@1 1396 {
rlm@1 1397 a1 = f1 - y2;
rlm@1 1398 product1 = Bilinear(B, D, a1);
rlm@1 1399 }
rlm@1 1400 else if (x2 >= f2 && B == F && B != H) // close to A
rlm@1 1401 {
rlm@1 1402 a1 = x2 - f2;
rlm@1 1403 product1 = Bilinear(B, A, a1);
rlm@1 1404 }
rlm@1 1405 else if (x2 <= f2 && B == K && B != I) // close to D
rlm@1 1406 {
rlm@1 1407 a1 = f2 - x2;
rlm@1 1408 product1 = Bilinear(B, D, a1);
rlm@1 1409 }
rlm@1 1410 else if (y2 >= x1) // close to A
rlm@1 1411 {
rlm@1 1412 a1 = y2 - x1;
rlm@1 1413 product1 = Bilinear(B, A, a1);
rlm@1 1414 }
rlm@1 1415 else if (y2 <= x1) // close to D
rlm@1 1416 {
rlm@1 1417 a1 = x1 - y2;
rlm@1 1418 product1 = Bilinear(B, D, a1);
rlm@1 1419 }
rlm@1 1420 }
rlm@1 1421 /*3*/
rlm@1 1422 else
rlm@1 1423 {
rlm@1 1424 product1 = Bilinear4(A, B, C, D, x1, y1);
rlm@1 1425 }
rlm@1 1426
rlm@1 1427 //end First Pixel
rlm@1 1428 *(u32 *) dP = product1;
rlm@1 1429 dP += 2;
rlm@1 1430 w += dw;
rlm@1 1431 }
rlm@1 1432 dstPtr += dstPitch;
rlm@1 1433 }
rlm@1 1434 }