rlm@1: #include "../common/System.h" rlm@1: rlm@1: extern "C" rlm@1: { rlm@1: #ifdef MMX rlm@1: void _2xSaILine(u8 *srcPtr, u8 *deltaPtr, u32 srcPitch, rlm@1: u32 width, u8 *dstPtr, u32 dstPitch); rlm@1: void _2xSaISuperEagleLine(u8 *srcPtr, u8 *deltaPtr, rlm@1: u32 srcPitch, u32 width, rlm@1: u8 *dstPtr, u32 dstPitch); rlm@1: void _2xSaISuper2xSaILine(u8 *srcPtr, u8 *deltaPtr, rlm@1: u32 srcPitch, u32 width, rlm@1: u8 *dstPtr, u32 dstPitch); rlm@1: void Init_2xSaIMMX(u32 BitFormat); rlm@1: void BilinearMMX(u16 *A, u16 *B, u16 *C, u16 *D, rlm@1: u16 *dx, u16 *dy, u8 *dP); rlm@1: void BilinearMMXGrid0(u16 *A, u16 *B, u16 *C, u16 *D, rlm@1: u16 *dx, u16 *dy, u8 *dP); rlm@1: void BilinearMMXGrid1(u16 *A, u16 *B, u16 *C, u16 *D, rlm@1: u16 *dx, u16 *dy, u8 *dP); rlm@1: void EndMMX(); rlm@1: rlm@1: bool cpu_mmx = 1; rlm@1: #endif rlm@1: } rlm@1: static u32 colorMask = 0xF7DEF7DE; rlm@1: static u32 lowPixelMask = 0x08210821; rlm@1: static u32 qcolorMask = 0xE79CE79C; rlm@1: static u32 qlowpixelMask = 0x18631863; rlm@1: static u32 redblueMask = 0xF81F; rlm@1: static u32 greenMask = 0x7E0; rlm@1: rlm@1: u32 qRGB_COLOR_MASK[2] = { 0xF7DEF7DE, 0xF7DEF7DE }; rlm@1: rlm@1: extern void hq2x_init(unsigned); rlm@1: rlm@1: int Init_2xSaI(u32 BitFormat) rlm@1: { rlm@1: if (systemColorDepth == 16) rlm@1: { rlm@1: if (BitFormat == 565) rlm@1: { rlm@1: colorMask = 0xF7DEF7DE; rlm@1: lowPixelMask = 0x08210821; rlm@1: qcolorMask = 0xE79CE79C; rlm@1: qlowpixelMask = 0x18631863; rlm@1: redblueMask = 0xF81F; rlm@1: greenMask = 0x7E0; rlm@1: qRGB_COLOR_MASK[0] = qRGB_COLOR_MASK[1] = 0xF7DEF7DE; rlm@1: hq2x_init(16); rlm@1: } rlm@1: else if (BitFormat == 555) rlm@1: { rlm@1: colorMask = 0x7BDE7BDE; rlm@1: lowPixelMask = 0x04210421; rlm@1: qcolorMask = 0x739C739C; rlm@1: qlowpixelMask = 0x0C630C63; rlm@1: redblueMask = 0x7C1F; rlm@1: greenMask = 0x3E0; rlm@1: qRGB_COLOR_MASK[0] = qRGB_COLOR_MASK[1] = 0x7BDE7BDE; rlm@1: hq2x_init(15); rlm@1: } rlm@1: else rlm@1: { rlm@1: return 0; rlm@1: } rlm@1: } rlm@1: else if (systemColorDepth == 32) rlm@1: { rlm@1: colorMask = 0xfefefe; rlm@1: lowPixelMask = 0x010101; rlm@1: qcolorMask = 0xfcfcfc; rlm@1: qlowpixelMask = 0x030303; rlm@1: qRGB_COLOR_MASK[0] = qRGB_COLOR_MASK[1] = 0xfefefe; rlm@1: hq2x_init(32); rlm@1: } rlm@1: else rlm@1: return 0; rlm@1: rlm@1: #ifdef MMX rlm@1: Init_2xSaIMMX(BitFormat); rlm@1: #endif rlm@1: rlm@1: return 1; rlm@1: } rlm@1: rlm@1: static inline int GetResult1(u32 A, u32 B, u32 C, u32 D, rlm@1: u32 /* E */) rlm@1: { rlm@1: int x = 0; rlm@1: int y = 0; rlm@1: int r = 0; rlm@1: rlm@1: if (A == C) rlm@1: x += 1; rlm@1: else if (B == C) rlm@1: y += 1; rlm@1: if (A == D) rlm@1: x += 1; rlm@1: else if (B == D) rlm@1: y += 1; rlm@1: if (x <= 1) rlm@1: r += 1; rlm@1: if (y <= 1) rlm@1: r -= 1; rlm@1: return r; rlm@1: } rlm@1: rlm@1: static inline int GetResult2(u32 A, u32 B, u32 C, u32 D, rlm@1: u32 /* E */) rlm@1: { rlm@1: int x = 0; rlm@1: int y = 0; rlm@1: int r = 0; rlm@1: rlm@1: if (A == C) rlm@1: x += 1; rlm@1: else if (B == C) rlm@1: y += 1; rlm@1: if (A == D) rlm@1: x += 1; rlm@1: else if (B == D) rlm@1: y += 1; rlm@1: if (x <= 1) rlm@1: r -= 1; rlm@1: if (y <= 1) rlm@1: r += 1; rlm@1: return r; rlm@1: } rlm@1: rlm@1: static inline int GetResult(u32 A, u32 B, u32 C, u32 D) rlm@1: { rlm@1: int x = 0; rlm@1: int y = 0; rlm@1: int r = 0; rlm@1: rlm@1: if (A == C) rlm@1: x += 1; rlm@1: else if (B == C) rlm@1: y += 1; rlm@1: if (A == D) rlm@1: x += 1; rlm@1: else if (B == D) rlm@1: y += 1; rlm@1: if (x <= 1) rlm@1: r += 1; rlm@1: if (y <= 1) rlm@1: r -= 1; rlm@1: return r; rlm@1: } rlm@1: rlm@1: static inline u32 INTERPOLATE(u32 A, u32 B) rlm@1: { rlm@1: if (A != B) rlm@1: { rlm@1: return (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + rlm@1: (A & B & lowPixelMask)); rlm@1: } rlm@1: else rlm@1: return A; rlm@1: } rlm@1: rlm@1: static inline u32 Q_INTERPOLATE(u32 A, u32 B, u32 C, u32 D) rlm@1: { rlm@1: register u32 x = ((A & qcolorMask) >> 2) + rlm@1: ((B & qcolorMask) >> 2) + rlm@1: ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2); rlm@1: register u32 y = (A & qlowpixelMask) + rlm@1: (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask); rlm@1: rlm@1: y = (y >> 2) & qlowpixelMask; rlm@1: return x + y; rlm@1: } rlm@1: rlm@1: static inline int GetResult1_32(u32 A, u32 B, u32 C, u32 D, rlm@1: u32 /* E */) rlm@1: { rlm@1: int x = 0; rlm@1: int y = 0; rlm@1: int r = 0; rlm@1: rlm@1: if (A == C) rlm@1: x += 1; rlm@1: else if (B == C) rlm@1: y += 1; rlm@1: if (A == D) rlm@1: x += 1; rlm@1: else if (B == D) rlm@1: y += 1; rlm@1: if (x <= 1) rlm@1: r += 1; rlm@1: if (y <= 1) rlm@1: r -= 1; rlm@1: return r; rlm@1: } rlm@1: rlm@1: static inline int GetResult2_32(u32 A, u32 B, u32 C, u32 D, rlm@1: u32 /* E */) rlm@1: { rlm@1: int x = 0; rlm@1: int y = 0; rlm@1: int r = 0; rlm@1: rlm@1: if (A == C) rlm@1: x += 1; rlm@1: else if (B == C) rlm@1: y += 1; rlm@1: if (A == D) rlm@1: x += 1; rlm@1: else if (B == D) rlm@1: y += 1; rlm@1: if (x <= 1) rlm@1: r -= 1; rlm@1: if (y <= 1) rlm@1: r += 1; rlm@1: return r; rlm@1: } rlm@1: rlm@1: #define BLUE_MASK565 0x001F001F rlm@1: #define RED_MASK565 0xF800F800 rlm@1: #define GREEN_MASK565 0x07E007E0 rlm@1: rlm@1: #define BLUE_MASK555 0x001F001F rlm@1: #define RED_MASK555 0x7C007C00 rlm@1: #define GREEN_MASK555 0x03E003E0 rlm@1: rlm@1: void Super2xSaI(u8 *srcPtr, u32 srcPitch, rlm@1: u8 *deltaPtr, u8 *dstPtr, u32 dstPitch, rlm@1: int width, int height) rlm@1: { rlm@1: u16 *bP; rlm@1: u8 * dP; rlm@1: u32 inc_bP; rlm@1: u32 Nextline = srcPitch >> 1; rlm@1: #ifdef MMX rlm@1: if (cpu_mmx) rlm@1: { rlm@1: for (; height; height--) rlm@1: { rlm@1: _2xSaISuper2xSaILine(srcPtr, deltaPtr, srcPitch, width, rlm@1: dstPtr, dstPitch); rlm@1: srcPtr += srcPitch; rlm@1: dstPtr += dstPitch * 2; rlm@1: deltaPtr += srcPitch; rlm@1: } rlm@1: } rlm@1: else rlm@1: #endif rlm@1: { rlm@1: inc_bP = 1; rlm@1: rlm@1: for (; height; height--) rlm@1: { rlm@1: bP = (u16 *) srcPtr; rlm@1: dP = (u8 *) dstPtr; rlm@1: rlm@1: for (u32 finish = width; finish; finish -= inc_bP) rlm@1: { rlm@1: u32 color4, color5, color6; rlm@1: u32 color1, color2, color3; rlm@1: u32 colorA0, colorA1, colorA2, colorA3, rlm@1: colorB0, colorB1, colorB2, colorB3, colorS1, colorS2; rlm@1: u32 product1a, product1b, product2a, product2b; rlm@1: rlm@1: //--------------------------------------- B1 B2 rlm@1: // 4 5 6 S2 rlm@1: // 1 2 3 S1 rlm@1: // A1 A2 rlm@1: rlm@1: colorB0 = *(bP - Nextline - 1); rlm@1: colorB1 = *(bP - Nextline); rlm@1: colorB2 = *(bP - Nextline + 1); rlm@1: colorB3 = *(bP - Nextline + 2); rlm@1: rlm@1: color4 = *(bP - 1); rlm@1: color5 = *(bP); rlm@1: color6 = *(bP + 1); rlm@1: colorS2 = *(bP + 2); rlm@1: rlm@1: color1 = *(bP + Nextline - 1); rlm@1: color2 = *(bP + Nextline); rlm@1: color3 = *(bP + Nextline + 1); rlm@1: colorS1 = *(bP + Nextline + 2); rlm@1: rlm@1: colorA0 = *(bP + Nextline + Nextline - 1); rlm@1: colorA1 = *(bP + Nextline + Nextline); rlm@1: colorA2 = *(bP + Nextline + Nextline + 1); rlm@1: colorA3 = *(bP + Nextline + Nextline + 2); rlm@1: rlm@1: //-------------------------------------- rlm@1: if (color2 == color6 && color5 != color3) rlm@1: { rlm@1: product2b = product1b = color2; rlm@1: } rlm@1: else if (color5 == color3 && color2 != color6) rlm@1: { rlm@1: product2b = product1b = color5; rlm@1: } rlm@1: else if (color5 == color3 && color2 == color6) rlm@1: { rlm@1: register int r = 0; rlm@1: rlm@1: r += GetResult(color6, color5, color1, colorA1); rlm@1: r += GetResult(color6, color5, color4, colorB1); rlm@1: r += GetResult(color6, color5, colorA2, colorS1); rlm@1: r += GetResult(color6, color5, colorB2, colorS2); rlm@1: rlm@1: if (r > 0) rlm@1: product2b = product1b = color6; rlm@1: else if (r < 0) rlm@1: product2b = product1b = color5; rlm@1: else rlm@1: { rlm@1: product2b = product1b = INTERPOLATE(color5, color6); rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: if (color6 == color3 && color3 == colorA1 rlm@1: && color2 != colorA2 && color3 != colorA0) rlm@1: product2b = rlm@1: Q_INTERPOLATE(color3, color3, color3, color2); rlm@1: else if (color5 == color2 && color2 == colorA2 rlm@1: && colorA1 != color3 && color2 != colorA3) rlm@1: product2b = rlm@1: Q_INTERPOLATE(color2, color2, color2, color3); rlm@1: else rlm@1: product2b = INTERPOLATE(color2, color3); rlm@1: rlm@1: if (color6 == color3 && color6 == colorB1 rlm@1: && color5 != colorB2 && color6 != colorB0) rlm@1: product1b = rlm@1: Q_INTERPOLATE(color6, color6, color6, color5); rlm@1: else if (color5 == color2 && color5 == colorB2 rlm@1: && colorB1 != color6 && color5 != colorB3) rlm@1: product1b = rlm@1: Q_INTERPOLATE(color6, color5, color5, color5); rlm@1: else rlm@1: product1b = INTERPOLATE(color5, color6); rlm@1: } rlm@1: rlm@1: if (color5 == color3 && color2 != color6 && color4 == color5 rlm@1: && color5 != colorA2) rlm@1: product2a = INTERPOLATE(color2, color5); rlm@1: else rlm@1: if (color5 == color1 && color6 == color5 rlm@1: && color4 != color2 && color5 != colorA0) rlm@1: product2a = INTERPOLATE(color2, color5); rlm@1: else rlm@1: product2a = color2; rlm@1: rlm@1: if (color2 == color6 && color5 != color3 && color1 == color2 rlm@1: && color2 != colorB2) rlm@1: product1a = INTERPOLATE(color2, color5); rlm@1: else rlm@1: if (color4 == color2 && color3 == color2 rlm@1: && color1 != color5 && color2 != colorB0) rlm@1: product1a = INTERPOLATE(color2, color5); rlm@1: else rlm@1: product1a = color5; rlm@1: rlm@1: #ifdef WORDS_BIGENDIAN rlm@1: product1a = (product1a << 16) | product1b; rlm@1: product2a = (product2a << 16) | product2b; rlm@1: #else rlm@1: product1a = product1a | (product1b << 16); rlm@1: product2a = product2a | (product2b << 16); rlm@1: #endif rlm@1: rlm@1: *((u32 *) dP) = product1a; rlm@1: *((u32 *) (dP + dstPitch)) = product2a; rlm@1: rlm@1: bP += inc_bP; rlm@1: dP += sizeof(u32); rlm@1: } // end of for ( finish= width etc..) rlm@1: rlm@1: srcPtr += srcPitch; rlm@1: dstPtr += dstPitch << 1; rlm@1: deltaPtr += srcPitch; rlm@1: } // endof: for (; height; height--) rlm@1: } rlm@1: } rlm@1: rlm@1: void Super2xSaI32(u8 *srcPtr, u32 srcPitch, rlm@1: u8 * /* deltaPtr */, u8 *dstPtr, u32 dstPitch, rlm@1: int width, int height) rlm@1: { rlm@1: u32 *bP; rlm@1: u32 *dP; rlm@1: u32 inc_bP; rlm@1: u32 Nextline = srcPitch >> 2; rlm@1: inc_bP = 1; rlm@1: rlm@1: for (; height; height--) rlm@1: { rlm@1: bP = (u32 *) srcPtr; rlm@1: dP = (u32 *) dstPtr; rlm@1: rlm@1: for (u32 finish = width; finish; finish -= inc_bP) rlm@1: { rlm@1: u32 color4, color5, color6; rlm@1: u32 color1, color2, color3; rlm@1: u32 colorA0, colorA1, colorA2, colorA3, rlm@1: colorB0, colorB1, colorB2, colorB3, colorS1, colorS2; rlm@1: u32 product1a, product1b, product2a, product2b; rlm@1: rlm@1: //--------------------------------------- B1 B2 rlm@1: // 4 5 6 S2 rlm@1: // 1 2 3 S1 rlm@1: // A1 A2 rlm@1: rlm@1: colorB0 = *(bP - Nextline - 1); rlm@1: colorB1 = *(bP - Nextline); rlm@1: colorB2 = *(bP - Nextline + 1); rlm@1: colorB3 = *(bP - Nextline + 2); rlm@1: rlm@1: color4 = *(bP - 1); rlm@1: color5 = *(bP); rlm@1: color6 = *(bP + 1); rlm@1: colorS2 = *(bP + 2); rlm@1: rlm@1: color1 = *(bP + Nextline - 1); rlm@1: color2 = *(bP + Nextline); rlm@1: color3 = *(bP + Nextline + 1); rlm@1: colorS1 = *(bP + Nextline + 2); rlm@1: rlm@1: colorA0 = *(bP + Nextline + Nextline - 1); rlm@1: colorA1 = *(bP + Nextline + Nextline); rlm@1: colorA2 = *(bP + Nextline + Nextline + 1); rlm@1: colorA3 = *(bP + Nextline + Nextline + 2); rlm@1: rlm@1: //-------------------------------------- rlm@1: if (color2 == color6 && color5 != color3) rlm@1: { rlm@1: product2b = product1b = color2; rlm@1: } rlm@1: else if (color5 == color3 && color2 != color6) rlm@1: { rlm@1: product2b = product1b = color5; rlm@1: } rlm@1: else if (color5 == color3 && color2 == color6) rlm@1: { rlm@1: register int r = 0; rlm@1: rlm@1: r += GetResult(color6, color5, color1, colorA1); rlm@1: r += GetResult(color6, color5, color4, colorB1); rlm@1: r += GetResult(color6, color5, colorA2, colorS1); rlm@1: r += GetResult(color6, color5, colorB2, colorS2); rlm@1: rlm@1: if (r > 0) rlm@1: product2b = product1b = color6; rlm@1: else if (r < 0) rlm@1: product2b = product1b = color5; rlm@1: else rlm@1: { rlm@1: product2b = product1b = INTERPOLATE(color5, color6); rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: if (color6 == color3 && color3 == colorA1 rlm@1: && color2 != colorA2 && color3 != colorA0) rlm@1: product2b = rlm@1: Q_INTERPOLATE(color3, color3, color3, color2); rlm@1: else if (color5 == color2 && color2 == colorA2 rlm@1: && colorA1 != color3 && color2 != colorA3) rlm@1: product2b = rlm@1: Q_INTERPOLATE(color2, color2, color2, color3); rlm@1: else rlm@1: product2b = INTERPOLATE(color2, color3); rlm@1: rlm@1: if (color6 == color3 && color6 == colorB1 rlm@1: && color5 != colorB2 && color6 != colorB0) rlm@1: product1b = rlm@1: Q_INTERPOLATE(color6, color6, color6, color5); rlm@1: else if (color5 == color2 && color5 == colorB2 rlm@1: && colorB1 != color6 && color5 != colorB3) rlm@1: product1b = rlm@1: Q_INTERPOLATE(color6, color5, color5, color5); rlm@1: else rlm@1: product1b = INTERPOLATE(color5, color6); rlm@1: } rlm@1: rlm@1: if (color5 == color3 && color2 != color6 && color4 == color5 rlm@1: && color5 != colorA2) rlm@1: product2a = INTERPOLATE(color2, color5); rlm@1: else rlm@1: if (color5 == color1 && color6 == color5 rlm@1: && color4 != color2 && color5 != colorA0) rlm@1: product2a = INTERPOLATE(color2, color5); rlm@1: else rlm@1: product2a = color2; rlm@1: rlm@1: if (color2 == color6 && color5 != color3 && color1 == color2 rlm@1: && color2 != colorB2) rlm@1: product1a = INTERPOLATE(color2, color5); rlm@1: else rlm@1: if (color4 == color2 && color3 == color2 rlm@1: && color1 != color5 && color2 != colorB0) rlm@1: product1a = INTERPOLATE(color2, color5); rlm@1: else rlm@1: product1a = color5; rlm@1: *(dP) = product1a; rlm@1: *(dP + 1) = product1b; rlm@1: *(dP + (dstPitch >> 2)) = product2a; rlm@1: *(dP + (dstPitch >> 2) + 1) = product2b; rlm@1: rlm@1: bP += inc_bP; rlm@1: dP += 2; rlm@1: } // end of for ( finish= width etc..) rlm@1: rlm@1: srcPtr += srcPitch; rlm@1: dstPtr += dstPitch << 1; rlm@1: // deltaPtr += srcPitch; rlm@1: } // endof: for (; height; height--) rlm@1: } rlm@1: rlm@1: void SuperEagle(u8 *srcPtr, u32 srcPitch, u8 *deltaPtr, rlm@1: u8 *dstPtr, u32 dstPitch, int width, int height) rlm@1: { rlm@1: u8 * dP; rlm@1: u16 *bP; rlm@1: u16 *xP; rlm@1: u32 inc_bP; rlm@1: rlm@1: #ifdef MMX rlm@1: if (cpu_mmx) rlm@1: { rlm@1: for (; height; height--) rlm@1: { rlm@1: _2xSaISuperEagleLine(srcPtr, deltaPtr, srcPitch, width, rlm@1: dstPtr, dstPitch); rlm@1: srcPtr += srcPitch; rlm@1: dstPtr += dstPitch * 2; rlm@1: deltaPtr += srcPitch; rlm@1: } rlm@1: } rlm@1: else rlm@1: #endif rlm@1: { rlm@1: inc_bP = 1; rlm@1: rlm@1: u32 Nextline = srcPitch >> 1; rlm@1: rlm@1: for (; height; height--) rlm@1: { rlm@1: bP = (u16 *) srcPtr; rlm@1: xP = (u16 *) deltaPtr; rlm@1: dP = dstPtr; rlm@1: for (u32 finish = width; finish; finish -= inc_bP) rlm@1: { rlm@1: u32 color4, color5, color6; rlm@1: u32 color1, color2, color3; rlm@1: u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2; rlm@1: u32 product1a, product1b, product2a, product2b; rlm@1: rlm@1: colorB1 = *(bP - Nextline); rlm@1: colorB2 = *(bP - Nextline + 1); rlm@1: rlm@1: color4 = *(bP - 1); rlm@1: color5 = *(bP); rlm@1: color6 = *(bP + 1); rlm@1: colorS2 = *(bP + 2); rlm@1: rlm@1: color1 = *(bP + Nextline - 1); rlm@1: color2 = *(bP + Nextline); rlm@1: color3 = *(bP + Nextline + 1); rlm@1: colorS1 = *(bP + Nextline + 2); rlm@1: rlm@1: colorA1 = *(bP + Nextline + Nextline); rlm@1: colorA2 = *(bP + Nextline + Nextline + 1); rlm@1: rlm@1: // -------------------------------------- rlm@1: if (color2 == color6 && color5 != color3) rlm@1: { rlm@1: product1b = product2a = color2; rlm@1: if ((color1 == color2) || (color6 == colorB2)) rlm@1: { rlm@1: product1a = INTERPOLATE(color2, color5); rlm@1: product1a = INTERPOLATE(color2, product1a); rlm@1: // product1a = color2; rlm@1: } rlm@1: else rlm@1: { rlm@1: product1a = INTERPOLATE(color5, color6); rlm@1: } rlm@1: rlm@1: if ((color6 == colorS2) || (color2 == colorA1)) rlm@1: { rlm@1: product2b = INTERPOLATE(color2, color3); rlm@1: product2b = INTERPOLATE(color2, product2b); rlm@1: // product2b = color2; rlm@1: } rlm@1: else rlm@1: { rlm@1: product2b = INTERPOLATE(color2, color3); rlm@1: } rlm@1: } rlm@1: else if (color5 == color3 && color2 != color6) rlm@1: { rlm@1: product2b = product1a = color5; rlm@1: rlm@1: if ((colorB1 == color5) || (color3 == colorS1)) rlm@1: { rlm@1: product1b = INTERPOLATE(color5, color6); rlm@1: product1b = INTERPOLATE(color5, product1b); rlm@1: // product1b = color5; rlm@1: } rlm@1: else rlm@1: { rlm@1: product1b = INTERPOLATE(color5, color6); rlm@1: } rlm@1: rlm@1: if ((color3 == colorA2) || (color4 == color5)) rlm@1: { rlm@1: product2a = INTERPOLATE(color5, color2); rlm@1: product2a = INTERPOLATE(color5, product2a); rlm@1: // product2a = color5; rlm@1: } rlm@1: else rlm@1: { rlm@1: product2a = INTERPOLATE(color2, color3); rlm@1: } rlm@1: } rlm@1: else if (color5 == color3 && color2 == color6) rlm@1: { rlm@1: register int r = 0; rlm@1: rlm@1: r += GetResult(color6, color5, color1, colorA1); rlm@1: r += GetResult(color6, color5, color4, colorB1); rlm@1: r += GetResult(color6, color5, colorA2, colorS1); rlm@1: r += GetResult(color6, color5, colorB2, colorS2); rlm@1: rlm@1: if (r > 0) rlm@1: { rlm@1: product1b = product2a = color2; rlm@1: product1a = product2b = INTERPOLATE(color5, color6); rlm@1: } rlm@1: else if (r < 0) rlm@1: { rlm@1: product2b = product1a = color5; rlm@1: product1b = product2a = INTERPOLATE(color5, color6); rlm@1: } rlm@1: else rlm@1: { rlm@1: product2b = product1a = color5; rlm@1: product1b = product2a = color2; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: product2b = product1a = INTERPOLATE(color2, color6); rlm@1: product2b = rlm@1: Q_INTERPOLATE(color3, color3, color3, product2b); rlm@1: product1a = rlm@1: Q_INTERPOLATE(color5, color5, color5, product1a); rlm@1: rlm@1: product2a = product1b = INTERPOLATE(color5, color3); rlm@1: product2a = rlm@1: Q_INTERPOLATE(color2, color2, color2, product2a); rlm@1: product1b = rlm@1: Q_INTERPOLATE(color6, color6, color6, product1b); rlm@1: rlm@1: // product1a = color5; rlm@1: // product1b = color6; rlm@1: // product2a = color2; rlm@1: // product2b = color3; rlm@1: } rlm@1: #ifdef WORDS_BIGENDIAN rlm@1: product1a = (product1a << 16) | product1b; rlm@1: product2a = (product2a << 16) | product2b; rlm@1: #else rlm@1: product1a = product1a | (product1b << 16); rlm@1: product2a = product2a | (product2b << 16); rlm@1: #endif rlm@1: rlm@1: *((u32 *) dP) = product1a; rlm@1: *((u32 *) (dP + dstPitch)) = product2a; rlm@1: *xP = color5; rlm@1: rlm@1: bP += inc_bP; rlm@1: xP += inc_bP; rlm@1: dP += sizeof(u32); rlm@1: } // end of for ( finish= width etc..) rlm@1: rlm@1: srcPtr += srcPitch; rlm@1: dstPtr += dstPitch << 1; rlm@1: deltaPtr += srcPitch; rlm@1: } // endof: for (height; height; height--) rlm@1: } rlm@1: } rlm@1: rlm@1: void SuperEagle32(u8 *srcPtr, u32 srcPitch, u8 *deltaPtr, rlm@1: u8 *dstPtr, u32 dstPitch, int width, int height) rlm@1: { rlm@1: u32 *dP; rlm@1: u32 *bP; rlm@1: u32 *xP; rlm@1: u32 inc_bP; rlm@1: rlm@1: inc_bP = 1; rlm@1: rlm@1: u32 Nextline = srcPitch >> 2; rlm@1: rlm@1: for (; height; height--) rlm@1: { rlm@1: bP = (u32 *) srcPtr; rlm@1: xP = (u32 *) deltaPtr; rlm@1: dP = (u32 *)dstPtr; rlm@1: for (u32 finish = width; finish; finish -= inc_bP) rlm@1: { rlm@1: u32 color4, color5, color6; rlm@1: u32 color1, color2, color3; rlm@1: u32 colorA1, colorA2, colorB1, colorB2, colorS1, colorS2; rlm@1: u32 product1a, product1b, product2a, product2b; rlm@1: rlm@1: colorB1 = *(bP - Nextline); rlm@1: colorB2 = *(bP - Nextline + 1); rlm@1: rlm@1: color4 = *(bP - 1); rlm@1: color5 = *(bP); rlm@1: color6 = *(bP + 1); rlm@1: colorS2 = *(bP + 2); rlm@1: rlm@1: color1 = *(bP + Nextline - 1); rlm@1: color2 = *(bP + Nextline); rlm@1: color3 = *(bP + Nextline + 1); rlm@1: colorS1 = *(bP + Nextline + 2); rlm@1: rlm@1: colorA1 = *(bP + Nextline + Nextline); rlm@1: colorA2 = *(bP + Nextline + Nextline + 1); rlm@1: rlm@1: // -------------------------------------- rlm@1: if (color2 == color6 && color5 != color3) rlm@1: { rlm@1: product1b = product2a = color2; rlm@1: if ((color1 == color2) || (color6 == colorB2)) rlm@1: { rlm@1: product1a = INTERPOLATE(color2, color5); rlm@1: product1a = INTERPOLATE(color2, product1a); rlm@1: // product1a = color2; rlm@1: } rlm@1: else rlm@1: { rlm@1: product1a = INTERPOLATE(color5, color6); rlm@1: } rlm@1: rlm@1: if ((color6 == colorS2) || (color2 == colorA1)) rlm@1: { rlm@1: product2b = INTERPOLATE(color2, color3); rlm@1: product2b = INTERPOLATE(color2, product2b); rlm@1: // product2b = color2; rlm@1: } rlm@1: else rlm@1: { rlm@1: product2b = INTERPOLATE(color2, color3); rlm@1: } rlm@1: } rlm@1: else if (color5 == color3 && color2 != color6) rlm@1: { rlm@1: product2b = product1a = color5; rlm@1: rlm@1: if ((colorB1 == color5) || (color3 == colorS1)) rlm@1: { rlm@1: product1b = INTERPOLATE(color5, color6); rlm@1: product1b = INTERPOLATE(color5, product1b); rlm@1: // product1b = color5; rlm@1: } rlm@1: else rlm@1: { rlm@1: product1b = INTERPOLATE(color5, color6); rlm@1: } rlm@1: rlm@1: if ((color3 == colorA2) || (color4 == color5)) rlm@1: { rlm@1: product2a = INTERPOLATE(color5, color2); rlm@1: product2a = INTERPOLATE(color5, product2a); rlm@1: // product2a = color5; rlm@1: } rlm@1: else rlm@1: { rlm@1: product2a = INTERPOLATE(color2, color3); rlm@1: } rlm@1: } rlm@1: else if (color5 == color3 && color2 == color6) rlm@1: { rlm@1: register int r = 0; rlm@1: rlm@1: r += GetResult(color6, color5, color1, colorA1); rlm@1: r += GetResult(color6, color5, color4, colorB1); rlm@1: r += GetResult(color6, color5, colorA2, colorS1); rlm@1: r += GetResult(color6, color5, colorB2, colorS2); rlm@1: rlm@1: if (r > 0) rlm@1: { rlm@1: product1b = product2a = color2; rlm@1: product1a = product2b = INTERPOLATE(color5, color6); rlm@1: } rlm@1: else if (r < 0) rlm@1: { rlm@1: product2b = product1a = color5; rlm@1: product1b = product2a = INTERPOLATE(color5, color6); rlm@1: } rlm@1: else rlm@1: { rlm@1: product2b = product1a = color5; rlm@1: product1b = product2a = color2; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: product2b = product1a = INTERPOLATE(color2, color6); rlm@1: product2b = rlm@1: Q_INTERPOLATE(color3, color3, color3, product2b); rlm@1: product1a = rlm@1: Q_INTERPOLATE(color5, color5, color5, product1a); rlm@1: rlm@1: product2a = product1b = INTERPOLATE(color5, color3); rlm@1: product2a = rlm@1: Q_INTERPOLATE(color2, color2, color2, product2a); rlm@1: product1b = rlm@1: Q_INTERPOLATE(color6, color6, color6, product1b); rlm@1: rlm@1: // product1a = color5; rlm@1: // product1b = color6; rlm@1: // product2a = color2; rlm@1: // product2b = color3; rlm@1: } rlm@1: *(dP) = product1a; rlm@1: *(dP + 1) = product1b; rlm@1: *(dP + (dstPitch >> 2)) = product2a; rlm@1: *(dP + (dstPitch >> 2) + 1) = product2b; rlm@1: *xP = color5; rlm@1: rlm@1: bP += inc_bP; rlm@1: xP += inc_bP; rlm@1: dP += 2; rlm@1: } // end of for ( finish= width etc..) rlm@1: rlm@1: srcPtr += srcPitch; rlm@1: dstPtr += dstPitch << 1; rlm@1: deltaPtr += srcPitch; rlm@1: } // endof: for (height; height; height--) rlm@1: } rlm@1: rlm@1: void _2xSaI(u8 *srcPtr, u32 srcPitch, u8 *deltaPtr, rlm@1: u8 *dstPtr, u32 dstPitch, int width, int height) rlm@1: { rlm@1: u8 * dP; rlm@1: u16 *bP; rlm@1: u32 inc_bP; rlm@1: rlm@1: #ifdef MMX rlm@1: if (cpu_mmx) rlm@1: { rlm@1: for (; height; height -= 1) rlm@1: { rlm@1: _2xSaILine(srcPtr, deltaPtr, srcPitch, width, dstPtr, dstPitch); rlm@1: srcPtr += srcPitch; rlm@1: dstPtr += dstPitch * 2; rlm@1: deltaPtr += srcPitch; rlm@1: } rlm@1: } rlm@1: else rlm@1: #endif rlm@1: { rlm@1: inc_bP = 1; rlm@1: rlm@1: u32 Nextline = srcPitch >> 1; rlm@1: rlm@1: for (; height; height--) rlm@1: { rlm@1: bP = (u16 *) srcPtr; rlm@1: dP = dstPtr; rlm@1: rlm@1: for (u32 finish = width; finish; finish -= inc_bP) rlm@1: { rlm@1: register u32 colorA, colorB; rlm@1: u32 colorC, colorD, rlm@1: colorE, colorF, colorG, colorH, rlm@1: colorI, colorJ, colorK, colorL, rlm@1: rlm@1: colorM, colorN, colorO, colorP; rlm@1: u32 product, product1, product2; rlm@1: rlm@1: //--------------------------------------- rlm@1: // Map of the pixels: I|E F|J rlm@1: // G|A B|K rlm@1: // H|C D|L rlm@1: // M|N O|P rlm@1: colorI = *(bP - Nextline - 1); rlm@1: colorE = *(bP - Nextline); rlm@1: colorF = *(bP - Nextline + 1); rlm@1: colorJ = *(bP - Nextline + 2); rlm@1: rlm@1: colorG = *(bP - 1); rlm@1: colorA = *(bP); rlm@1: colorB = *(bP + 1); rlm@1: colorK = *(bP + 2); rlm@1: rlm@1: colorH = *(bP + Nextline - 1); rlm@1: colorC = *(bP + Nextline); rlm@1: colorD = *(bP + Nextline + 1); rlm@1: colorL = *(bP + Nextline + 2); rlm@1: rlm@1: colorM = *(bP + Nextline + Nextline - 1); rlm@1: colorN = *(bP + Nextline + Nextline); rlm@1: colorO = *(bP + Nextline + Nextline + 1); rlm@1: colorP = *(bP + Nextline + Nextline + 2); rlm@1: rlm@1: if ((colorA == colorD) && (colorB != colorC)) rlm@1: { rlm@1: if (((colorA == colorE) && (colorB == colorL)) || rlm@1: ((colorA == colorC) && (colorA == colorF) rlm@1: && (colorB != colorE) && (colorB == colorJ))) rlm@1: { rlm@1: product = colorA; rlm@1: } rlm@1: else rlm@1: { rlm@1: product = INTERPOLATE(colorA, colorB); rlm@1: } rlm@1: rlm@1: if (((colorA == colorG) && (colorC == colorO)) || rlm@1: ((colorA == colorB) && (colorA == colorH) rlm@1: && (colorG != colorC) && (colorC == colorM))) rlm@1: { rlm@1: product1 = colorA; rlm@1: } rlm@1: else rlm@1: { rlm@1: product1 = INTERPOLATE(colorA, colorC); rlm@1: } rlm@1: product2 = colorA; rlm@1: } rlm@1: else if ((colorB == colorC) && (colorA != colorD)) rlm@1: { rlm@1: if (((colorB == colorF) && (colorA == colorH)) || rlm@1: ((colorB == colorE) && (colorB == colorD) rlm@1: && (colorA != colorF) && (colorA == colorI))) rlm@1: { rlm@1: product = colorB; rlm@1: } rlm@1: else rlm@1: { rlm@1: product = INTERPOLATE(colorA, colorB); rlm@1: } rlm@1: rlm@1: if (((colorC == colorH) && (colorA == colorF)) || rlm@1: ((colorC == colorG) && (colorC == colorD) rlm@1: && (colorA != colorH) && (colorA == colorI))) rlm@1: { rlm@1: product1 = colorC; rlm@1: } rlm@1: else rlm@1: { rlm@1: product1 = INTERPOLATE(colorA, colorC); rlm@1: } rlm@1: product2 = colorB; rlm@1: } rlm@1: else if ((colorA == colorD) && (colorB == colorC)) rlm@1: { rlm@1: if (colorA == colorB) rlm@1: { rlm@1: product = colorA; rlm@1: product1 = colorA; rlm@1: product2 = colorA; rlm@1: } rlm@1: else rlm@1: { rlm@1: register int r = 0; rlm@1: rlm@1: product1 = INTERPOLATE(colorA, colorC); rlm@1: product = INTERPOLATE(colorA, colorB); rlm@1: rlm@1: r += rlm@1: GetResult1(colorA, colorB, colorG, colorE, rlm@1: colorI); rlm@1: r += rlm@1: GetResult2(colorB, colorA, colorK, colorF, rlm@1: colorJ); rlm@1: r += rlm@1: GetResult2(colorB, colorA, colorH, colorN, rlm@1: colorM); rlm@1: r += rlm@1: GetResult1(colorA, colorB, colorL, colorO, rlm@1: colorP); rlm@1: rlm@1: if (r > 0) rlm@1: product2 = colorA; rlm@1: else if (r < 0) rlm@1: product2 = colorB; rlm@1: else rlm@1: { rlm@1: product2 = rlm@1: Q_INTERPOLATE(colorA, colorB, colorC, rlm@1: colorD); rlm@1: } rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: product2 = Q_INTERPOLATE(colorA, colorB, colorC, colorD); rlm@1: rlm@1: if ((colorA == colorC) && (colorA == colorF) rlm@1: && (colorB != colorE) && (colorB == colorJ)) rlm@1: { rlm@1: product = colorA; rlm@1: } rlm@1: else if ((colorB == colorE) && (colorB == colorD) rlm@1: && (colorA != colorF) && (colorA == colorI)) rlm@1: { rlm@1: product = colorB; rlm@1: } rlm@1: else rlm@1: { rlm@1: product = INTERPOLATE(colorA, colorB); rlm@1: } rlm@1: rlm@1: if ((colorA == colorB) && (colorA == colorH) rlm@1: && (colorG != colorC) && (colorC == colorM)) rlm@1: { rlm@1: product1 = colorA; rlm@1: } rlm@1: else if ((colorC == colorG) && (colorC == colorD) rlm@1: && (colorA != colorH) && (colorA == colorI)) rlm@1: { rlm@1: product1 = colorC; rlm@1: } rlm@1: else rlm@1: { rlm@1: product1 = INTERPOLATE(colorA, colorC); rlm@1: } rlm@1: } rlm@1: rlm@1: #ifdef WORDS_BIGENDIAN rlm@1: product = (colorA << 16) | product; rlm@1: product1 = (product1 << 16) | product2; rlm@1: #else rlm@1: product = colorA | (product << 16); rlm@1: product1 = product1 | (product2 << 16); rlm@1: #endif rlm@1: *((s32 *) dP) = product; rlm@1: *((u32 *) (dP + dstPitch)) = product1; rlm@1: rlm@1: bP += inc_bP; rlm@1: dP += sizeof(u32); rlm@1: } // end of for ( finish= width etc..) rlm@1: rlm@1: srcPtr += srcPitch; rlm@1: dstPtr += dstPitch << 1; rlm@1: deltaPtr += srcPitch; rlm@1: } // endof: for (height; height; height--) rlm@1: } rlm@1: } rlm@1: rlm@1: void _2xSaI32(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, rlm@1: u8 *dstPtr, u32 dstPitch, int width, int height) rlm@1: { rlm@1: u32 *dP; rlm@1: u32 *bP; rlm@1: u32 inc_bP = 1; rlm@1: rlm@1: u32 Nextline = srcPitch >> 2; rlm@1: rlm@1: for (; height; height--) rlm@1: { rlm@1: bP = (u32 *) srcPtr; rlm@1: dP = (u32 *) dstPtr; rlm@1: rlm@1: for (u32 finish = width; finish; finish -= inc_bP) rlm@1: { rlm@1: register u32 colorA, colorB; rlm@1: u32 colorC, colorD, rlm@1: colorE, colorF, colorG, colorH, rlm@1: colorI, colorJ, colorK, colorL, rlm@1: rlm@1: colorM, colorN, colorO, colorP; rlm@1: u32 product, product1, product2; rlm@1: rlm@1: //--------------------------------------- rlm@1: // Map of the pixels: I|E F|J rlm@1: // G|A B|K rlm@1: // H|C D|L rlm@1: // M|N O|P rlm@1: colorI = *(bP - Nextline - 1); rlm@1: colorE = *(bP - Nextline); rlm@1: colorF = *(bP - Nextline + 1); rlm@1: colorJ = *(bP - Nextline + 2); rlm@1: rlm@1: colorG = *(bP - 1); rlm@1: colorA = *(bP); rlm@1: colorB = *(bP + 1); rlm@1: colorK = *(bP + 2); rlm@1: rlm@1: colorH = *(bP + Nextline - 1); rlm@1: colorC = *(bP + Nextline); rlm@1: colorD = *(bP + Nextline + 1); rlm@1: colorL = *(bP + Nextline + 2); rlm@1: rlm@1: colorM = *(bP + Nextline + Nextline - 1); rlm@1: colorN = *(bP + Nextline + Nextline); rlm@1: colorO = *(bP + Nextline + Nextline + 1); rlm@1: colorP = *(bP + Nextline + Nextline + 2); rlm@1: rlm@1: if ((colorA == colorD) && (colorB != colorC)) rlm@1: { rlm@1: if (((colorA == colorE) && (colorB == colorL)) || rlm@1: ((colorA == colorC) && (colorA == colorF) rlm@1: && (colorB != colorE) && (colorB == colorJ))) rlm@1: { rlm@1: product = colorA; rlm@1: } rlm@1: else rlm@1: { rlm@1: product = INTERPOLATE(colorA, colorB); rlm@1: } rlm@1: rlm@1: if (((colorA == colorG) && (colorC == colorO)) || rlm@1: ((colorA == colorB) && (colorA == colorH) rlm@1: && (colorG != colorC) && (colorC == colorM))) rlm@1: { rlm@1: product1 = colorA; rlm@1: } rlm@1: else rlm@1: { rlm@1: product1 = INTERPOLATE(colorA, colorC); rlm@1: } rlm@1: product2 = colorA; rlm@1: } rlm@1: else if ((colorB == colorC) && (colorA != colorD)) rlm@1: { rlm@1: if (((colorB == colorF) && (colorA == colorH)) || rlm@1: ((colorB == colorE) && (colorB == colorD) rlm@1: && (colorA != colorF) && (colorA == colorI))) rlm@1: { rlm@1: product = colorB; rlm@1: } rlm@1: else rlm@1: { rlm@1: product = INTERPOLATE(colorA, colorB); rlm@1: } rlm@1: rlm@1: if (((colorC == colorH) && (colorA == colorF)) || rlm@1: ((colorC == colorG) && (colorC == colorD) rlm@1: && (colorA != colorH) && (colorA == colorI))) rlm@1: { rlm@1: product1 = colorC; rlm@1: } rlm@1: else rlm@1: { rlm@1: product1 = INTERPOLATE(colorA, colorC); rlm@1: } rlm@1: product2 = colorB; rlm@1: } rlm@1: else if ((colorA == colorD) && (colorB == colorC)) rlm@1: { rlm@1: if (colorA == colorB) rlm@1: { rlm@1: product = colorA; rlm@1: product1 = colorA; rlm@1: product2 = colorA; rlm@1: } rlm@1: else rlm@1: { rlm@1: register int r = 0; rlm@1: rlm@1: product1 = INTERPOLATE(colorA, colorC); rlm@1: product = INTERPOLATE(colorA, colorB); rlm@1: rlm@1: r += rlm@1: GetResult1(colorA, colorB, colorG, colorE, rlm@1: colorI); rlm@1: r += rlm@1: GetResult2(colorB, colorA, colorK, colorF, rlm@1: colorJ); rlm@1: r += rlm@1: GetResult2(colorB, colorA, colorH, colorN, rlm@1: colorM); rlm@1: r += rlm@1: GetResult1(colorA, colorB, colorL, colorO, rlm@1: colorP); rlm@1: rlm@1: if (r > 0) rlm@1: product2 = colorA; rlm@1: else if (r < 0) rlm@1: product2 = colorB; rlm@1: else rlm@1: { rlm@1: product2 = rlm@1: Q_INTERPOLATE(colorA, colorB, colorC, rlm@1: colorD); rlm@1: } rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: product2 = Q_INTERPOLATE(colorA, colorB, colorC, colorD); rlm@1: rlm@1: if ((colorA == colorC) && (colorA == colorF) rlm@1: && (colorB != colorE) && (colorB == colorJ)) rlm@1: { rlm@1: product = colorA; rlm@1: } rlm@1: else if ((colorB == colorE) && (colorB == colorD) rlm@1: && (colorA != colorF) && (colorA == colorI)) rlm@1: { rlm@1: product = colorB; rlm@1: } rlm@1: else rlm@1: { rlm@1: product = INTERPOLATE(colorA, colorB); rlm@1: } rlm@1: rlm@1: if ((colorA == colorB) && (colorA == colorH) rlm@1: && (colorG != colorC) && (colorC == colorM)) rlm@1: { rlm@1: product1 = colorA; rlm@1: } rlm@1: else if ((colorC == colorG) && (colorC == colorD) rlm@1: && (colorA != colorH) && (colorA == colorI)) rlm@1: { rlm@1: product1 = colorC; rlm@1: } rlm@1: else rlm@1: { rlm@1: product1 = INTERPOLATE(colorA, colorC); rlm@1: } rlm@1: } rlm@1: *(dP) = colorA; rlm@1: *(dP + 1) = product; rlm@1: *(dP + (dstPitch >> 2)) = product1; rlm@1: *(dP + (dstPitch >> 2) + 1) = product2; rlm@1: rlm@1: bP += inc_bP; rlm@1: dP += 2; rlm@1: } // end of for ( finish= width etc..) rlm@1: rlm@1: srcPtr += srcPitch; rlm@1: dstPtr += dstPitch << 1; rlm@1: // deltaPtr += srcPitch; rlm@1: } // endof: for (height; height; height--) rlm@1: } rlm@1: rlm@1: static u32 Bilinear(u32 A, u32 B, u32 x) rlm@1: { rlm@1: unsigned long areaA, areaB; rlm@1: unsigned long result; rlm@1: rlm@1: if (A == B) rlm@1: return A; rlm@1: rlm@1: areaB = (x >> 11) & 0x1f; // reduce 16 bit fraction to 5 bits rlm@1: areaA = 0x20 - areaB; rlm@1: rlm@1: A = (A & redblueMask) | ((A & greenMask) << 16); rlm@1: B = (B & redblueMask) | ((B & greenMask) << 16); rlm@1: rlm@1: result = ((areaA * A) + (areaB * B)) >> 5; rlm@1: rlm@1: return (result & redblueMask) | ((result >> 16) & greenMask); rlm@1: } rlm@1: rlm@1: static u32 Bilinear4(u32 A, u32 B, u32 C, u32 D, u32 x, rlm@1: u32 y) rlm@1: { rlm@1: unsigned long areaA, areaB, areaC, areaD; rlm@1: unsigned long result, xy; rlm@1: rlm@1: x = (x >> 11) & 0x1f; rlm@1: y = (y >> 11) & 0x1f; rlm@1: xy = (x * y) >> 5; rlm@1: rlm@1: A = (A & redblueMask) | ((A & greenMask) << 16); rlm@1: B = (B & redblueMask) | ((B & greenMask) << 16); rlm@1: C = (C & redblueMask) | ((C & greenMask) << 16); rlm@1: D = (D & redblueMask) | ((D & greenMask) << 16); rlm@1: rlm@1: areaA = 0x20 + xy - x - y; rlm@1: areaB = x - xy; rlm@1: areaC = y - xy; rlm@1: areaD = xy; rlm@1: rlm@1: result = ((areaA * A) + (areaB * B) + (areaC * C) + (areaD * D)) >> 5; rlm@1: rlm@1: return (result & redblueMask) | ((result >> 16) & greenMask); rlm@1: } rlm@1: rlm@1: void Scale_2xSaI(u8 *srcPtr, u32 srcPitch, u8 * /* deltaPtr */, rlm@1: u8 *dstPtr, u32 dstPitch, rlm@1: u32 dstWidth, u32 dstHeight, int width, int height) rlm@1: { rlm@1: u8 * dP; rlm@1: u16 *bP; rlm@1: rlm@1: u32 w; rlm@1: u32 h; rlm@1: u32 dw; rlm@1: u32 dh; rlm@1: u32 hfinish; rlm@1: u32 wfinish; rlm@1: rlm@1: u32 Nextline = srcPitch >> 1; rlm@1: rlm@1: wfinish = (width - 1) << 16; // convert to fixed point rlm@1: dw = wfinish / (dstWidth - 1); rlm@1: hfinish = (height - 1) << 16; // convert to fixed point rlm@1: dh = hfinish / (dstHeight - 1); rlm@1: rlm@1: for (h = 0; h < hfinish; h += dh) rlm@1: { rlm@1: u32 y1, y2; rlm@1: rlm@1: y1 = h & 0xffff; // fraction part of fixed point rlm@1: bP = (u16 *) (srcPtr + ((h >> 16) * srcPitch)); rlm@1: dP = dstPtr; rlm@1: y2 = 0x10000 - y1; rlm@1: rlm@1: w = 0; rlm@1: rlm@1: for (; w < wfinish; ) rlm@1: { rlm@1: u32 A, B, C, D; rlm@1: u32 E, F, G, H; rlm@1: u32 I, J, K, L; rlm@1: u32 x1, x2, a1, f1, f2; rlm@1: u32 position, product1; rlm@1: rlm@1: position = w >> 16; rlm@1: A = bP[position]; // current pixel rlm@1: B = bP[position + 1]; // next pixel rlm@1: C = bP[position + Nextline]; rlm@1: D = bP[position + Nextline + 1]; rlm@1: E = bP[position - Nextline]; rlm@1: F = bP[position - Nextline + 1]; rlm@1: G = bP[position - 1]; rlm@1: H = bP[position + Nextline - 1]; rlm@1: I = bP[position + 2]; rlm@1: J = bP[position + Nextline + 2]; rlm@1: K = bP[position + Nextline + Nextline]; rlm@1: L = bP[position + Nextline + Nextline + 1]; rlm@1: rlm@1: x1 = w & 0xffff; // fraction part of fixed point rlm@1: x2 = 0x10000 - x1; rlm@1: rlm@1: /*0*/ rlm@1: if (A == B && C == D && A == C) rlm@1: product1 = A; rlm@1: else /*1*/ if (A == D && B != C) rlm@1: { rlm@1: f1 = (x1 >> 1) + (0x10000 >> 2); rlm@1: f2 = (y1 >> 1) + (0x10000 >> 2); rlm@1: if (y1 <= f1 && A == J && A != E) // close to B rlm@1: { rlm@1: a1 = f1 - y1; rlm@1: product1 = Bilinear(A, B, a1); rlm@1: } rlm@1: else if (y1 >= f1 && A == G && A != L) // close to C rlm@1: { rlm@1: a1 = y1 - f1; rlm@1: product1 = Bilinear(A, C, a1); rlm@1: } rlm@1: else if (x1 >= f2 && A == E && A != J) // close to B rlm@1: { rlm@1: a1 = x1 - f2; rlm@1: product1 = Bilinear(A, B, a1); rlm@1: } rlm@1: else if (x1 <= f2 && A == L && A != G) // close to C rlm@1: { rlm@1: a1 = f2 - x1; rlm@1: product1 = Bilinear(A, C, a1); rlm@1: } rlm@1: else if (y1 >= x1) // close to C rlm@1: { rlm@1: a1 = y1 - x1; rlm@1: product1 = Bilinear(A, C, a1); rlm@1: } rlm@1: else if (y1 <= x1) // close to B rlm@1: { rlm@1: a1 = x1 - y1; rlm@1: product1 = Bilinear(A, B, a1); rlm@1: } rlm@1: } rlm@1: else rlm@1: /*2*/ rlm@1: if (B == C && A != D) rlm@1: { rlm@1: f1 = (x1 >> 1) + (0x10000 >> 2); rlm@1: f2 = (y1 >> 1) + (0x10000 >> 2); rlm@1: if (y2 >= f1 && B == H && B != F) // close to A rlm@1: { rlm@1: a1 = y2 - f1; rlm@1: product1 = Bilinear(B, A, a1); rlm@1: } rlm@1: else if (y2 <= f1 && B == I && B != K) // close to D rlm@1: { rlm@1: a1 = f1 - y2; rlm@1: product1 = Bilinear(B, D, a1); rlm@1: } rlm@1: else if (x2 >= f2 && B == F && B != H) // close to A rlm@1: { rlm@1: a1 = x2 - f2; rlm@1: product1 = Bilinear(B, A, a1); rlm@1: } rlm@1: else if (x2 <= f2 && B == K && B != I) // close to D rlm@1: { rlm@1: a1 = f2 - x2; rlm@1: product1 = Bilinear(B, D, a1); rlm@1: } rlm@1: else if (y2 >= x1) // close to A rlm@1: { rlm@1: a1 = y2 - x1; rlm@1: product1 = Bilinear(B, A, a1); rlm@1: } rlm@1: else if (y2 <= x1) // close to D rlm@1: { rlm@1: a1 = x1 - y2; rlm@1: product1 = Bilinear(B, D, a1); rlm@1: } rlm@1: } rlm@1: /*3*/ rlm@1: else rlm@1: { rlm@1: product1 = Bilinear4(A, B, C, D, x1, y1); rlm@1: } rlm@1: rlm@1: //end First Pixel rlm@1: *(u32 *) dP = product1; rlm@1: dP += 2; rlm@1: w += dw; rlm@1: } rlm@1: dstPtr += dstPitch; rlm@1: } rlm@1: }