rlm@1: #include rlm@1: #include rlm@1: #include "../Port.h" rlm@1: rlm@1: #ifdef MMX rlm@1: extern "C" bool cpu_mmx; rlm@1: #endif rlm@1: rlm@1: /* rlm@1: * Thanks to Kawaks' Mr. K for the code rlm@1: rlm@1: Incorporated into vba by Anthony Di Franco rlm@1: */ rlm@1: rlm@1: static u8 *frm1 = NULL; rlm@1: static u8 *frm2 = NULL; rlm@1: static u8 *frm3 = NULL; rlm@1: rlm@1: extern u32 RGB_LOW_BITS_MASK; rlm@1: extern u32 qRGB_COLOR_MASK[2]; rlm@1: rlm@1: static void Init() rlm@1: { rlm@1: frm1 = (u8 *)calloc(322 * 242, 4); rlm@1: // 1 frame ago rlm@1: frm2 = (u8 *)calloc(322 * 242, 4); rlm@1: // 2 frames ago rlm@1: frm3 = (u8 *)calloc(322 * 242, 4); rlm@1: // 3 frames ago rlm@1: } rlm@1: rlm@1: void InterframeCleanup() rlm@1: { rlm@1: if (frm1) rlm@1: free(frm1); rlm@1: if (frm2) rlm@1: free(frm2); rlm@1: if (frm3) rlm@1: free(frm3); rlm@1: frm1 = frm2 = frm3 = NULL; rlm@1: } rlm@1: rlm@1: #ifdef MMX rlm@1: static void SmartIB_MMX(u8 *srcPtr, u32 srcPitch, int width, int height) rlm@1: { rlm@1: u16 *src0 = (u16 *)srcPtr; rlm@1: u16 *src1 = (u16 *)frm1; rlm@1: u16 *src2 = (u16 *)frm2; rlm@1: u16 *src3 = (u16 *)frm3; rlm@1: rlm@1: int count = width >> 2; rlm@1: rlm@1: for (int i = 0; i < height; i++) rlm@1: { rlm@1: #ifdef __GNUC__ rlm@1: asm volatile ( rlm@1: "push %4\n" rlm@1: "movq 0(%5), %%mm7\n" // colorMask rlm@1: "0:\n" rlm@1: "movq 0(%0), %%mm0\n" // src0 rlm@1: "movq 0(%1), %%mm1\n" // src1 rlm@1: "movq 0(%2), %%mm2\n" // src2 rlm@1: "movq 0(%3), %%mm3\n" // src3 rlm@1: "movq %%mm0, 0(%3)\n" // src3 = src0 rlm@1: "movq %%mm0, %%mm4\n" rlm@1: "movq %%mm1, %%mm5\n" rlm@1: "pcmpeqw %%mm2, %%mm5\n" // src1 == src2 (A) rlm@1: "pcmpeqw %%mm3, %%mm4\n" // src3 == src0 (B) rlm@1: "por %%mm5, %%mm4\n" // A | B rlm@1: "movq %%mm2, %%mm5\n" rlm@1: "pcmpeqw %%mm0, %%mm5\n" // src0 == src2 (C) rlm@1: "pcmpeqw %%mm1, %%mm3\n" // src1 == src3 (D) rlm@1: "por %%mm3, %%mm5\n" // C|D rlm@1: "pandn %%mm5, %%mm4\n" // (!(A|B))&(C|D) rlm@1: "movq %%mm0, %%mm2\n" rlm@1: "pand %%mm7, %%mm2\n" // color & colorMask rlm@1: "pand %%mm7, %%mm1\n" // src1 & colorMask rlm@1: "psrlw $1, %%mm2\n" // (color & colorMask) >> 1 (E) rlm@1: "psrlw $1, %%mm1\n" // (src & colorMask) >> 1 (F) rlm@1: "paddw %%mm2, %%mm1\n" // E+F rlm@1: "pand %%mm4, %%mm1\n" // (E+F) & res rlm@1: "pandn %%mm0, %%mm4\n" // color& !res rlm@1: rlm@1: "por %%mm1, %%mm4\n" rlm@1: "movq %%mm4, 0(%0)\n" // src0 = res rlm@1: rlm@1: "addl $8, %0\n" rlm@1: "addl $8, %1\n" rlm@1: "addl $8, %2\n" rlm@1: "addl $8, %3\n" rlm@1: rlm@1: "decl %4\n" rlm@1: "jnz 0b\n" rlm@1: "pop %4\n" rlm@1: "emms\n" rlm@1: : "+r" (src0), "+r" (src1), "+r" (src2), "+r" (src3) rlm@1: : "r" (count), "r" (qRGB_COLOR_MASK) rlm@1: ); rlm@1: #else rlm@1: __asm { rlm@1: movq mm7, qword ptr [qRGB_COLOR_MASK]; rlm@1: mov eax, src0; rlm@1: mov ebx, src1; rlm@1: mov ecx, src2; rlm@1: mov edx, src3; rlm@1: mov edi, count; rlm@1: label0: rlm@1: movq mm0, qword ptr [eax]; // src0 rlm@1: movq mm1, qword ptr [ebx]; // src1 rlm@1: movq mm2, qword ptr [ecx]; // src2 rlm@1: movq mm3, qword ptr [edx]; // src3 rlm@1: movq qword ptr [edx], mm0; // src3 = src0 rlm@1: movq mm4, mm0; rlm@1: movq mm5, mm1; rlm@1: pcmpeqw mm5, mm2; // src1 == src2 (A) rlm@1: pcmpeqw mm4, mm3; // src3 == src0 (B) rlm@1: por mm4, mm5; // A | B rlm@1: movq mm5, mm2; rlm@1: pcmpeqw mm5, mm0; // src0 == src2 (C) rlm@1: pcmpeqw mm3, mm1; // src1 == src3 (D) rlm@1: por mm5, mm3; // C|D rlm@1: pandn mm4, mm5; // (!(A|B))&(C|D) rlm@1: movq mm2, mm0; rlm@1: pand mm2, mm7; // color & colorMask rlm@1: pand mm1, mm7; // src1 & colorMask rlm@1: psrlw mm2, 1; // (color & colorMask) >> 1 (E) rlm@1: psrlw mm1, 1; // (src & colorMask) >> 1 (F) rlm@1: paddw mm1, mm2; // E+F rlm@1: pand mm1, mm4; // (E+F) & res rlm@1: pandn mm4, mm0; // color & !res rlm@1: rlm@1: por mm4, mm1; rlm@1: movq qword ptr [eax], mm4; // src0 = res rlm@1: rlm@1: add eax, 8; rlm@1: add ebx, 8; rlm@1: add ecx, 8; rlm@1: add edx, 8; rlm@1: rlm@1: dec edi; rlm@1: jnz label0; rlm@1: mov src0, eax; rlm@1: mov src1, ebx; rlm@1: mov src2, ecx; rlm@1: mov src3, edx; rlm@1: emms; rlm@1: } rlm@1: #endif rlm@1: src0 += 2; rlm@1: src1 += 2; rlm@1: src2 += 2; rlm@1: src3 += 2; rlm@1: } rlm@1: rlm@1: /* Swap buffers around */ rlm@1: u8 *temp = frm1; rlm@1: frm1 = frm3; rlm@1: frm3 = frm2; rlm@1: frm2 = temp; rlm@1: } rlm@1: rlm@1: #endif rlm@1: rlm@1: void SmartIB(u8 *srcPtr, u32 srcPitch, int width, int height) rlm@1: { rlm@1: if (frm1 == NULL) rlm@1: { rlm@1: Init(); rlm@1: } rlm@1: #ifdef MMX rlm@1: if (cpu_mmx) rlm@1: { rlm@1: SmartIB_MMX(srcPtr, srcPitch, width, height); rlm@1: return; rlm@1: } rlm@1: #endif rlm@1: rlm@1: u16 colorMask = ~RGB_LOW_BITS_MASK; rlm@1: rlm@1: u16 *src0 = (u16 *)srcPtr; rlm@1: u16 *src1 = (u16 *)frm1; rlm@1: u16 *src2 = (u16 *)frm2; rlm@1: u16 *src3 = (u16 *)frm3; rlm@1: rlm@1: int sPitch = srcPitch >> 1; rlm@1: rlm@1: int pos = 0; rlm@1: for (int j = 0; j < height; j++) rlm@1: for (int i = 0; i < sPitch; i++) rlm@1: { rlm@1: u16 color = src0[pos]; rlm@1: src0[pos] = rlm@1: (src1[pos] != src2[pos]) && rlm@1: (src3[pos] != color) && rlm@1: ((color == src2[pos]) || (src1[pos] == src3[pos])) rlm@1: ? (((color & colorMask) >> 1) + ((src1[pos] & colorMask) >> 1)) : rlm@1: color; rlm@1: src3[pos] = color; /* oldest buffer now holds newest frame */ rlm@1: pos++; rlm@1: } rlm@1: rlm@1: /* Swap buffers around */ rlm@1: u8 *temp = frm1; rlm@1: frm1 = frm3; rlm@1: frm3 = frm2; rlm@1: frm2 = temp; rlm@1: } rlm@1: rlm@1: #ifdef MMX rlm@1: static void SmartIB32_MMX(u8 *srcPtr, u32 srcPitch, int width, int height) rlm@1: { rlm@1: u32 *src0 = (u32 *)srcPtr; rlm@1: u32 *src1 = (u32 *)frm1; rlm@1: u32 *src2 = (u32 *)frm2; rlm@1: u32 *src3 = (u32 *)frm3; rlm@1: rlm@1: int count = width >> 1; rlm@1: rlm@1: for (int i = 0; i < height; i++) rlm@1: { rlm@1: #ifdef __GNUC__ rlm@1: asm volatile ( rlm@1: "push %4\n" rlm@1: "movq 0(%5), %%mm7\n" // colorMask rlm@1: "0:\n" rlm@1: "movq 0(%0), %%mm0\n" // src0 rlm@1: "movq 0(%1), %%mm1\n" // src1 rlm@1: "movq 0(%2), %%mm2\n" // src2 rlm@1: "movq 0(%3), %%mm3\n" // src3 rlm@1: "movq %%mm0, 0(%3)\n" // src3 = src0 rlm@1: "movq %%mm0, %%mm4\n" rlm@1: "movq %%mm1, %%mm5\n" rlm@1: "pcmpeqd %%mm2, %%mm5\n" // src1 == src2 (A) rlm@1: "pcmpeqd %%mm3, %%mm4\n" // src3 == src0 (B) rlm@1: "por %%mm5, %%mm4\n" // A | B rlm@1: "movq %%mm2, %%mm5\n" rlm@1: "pcmpeqd %%mm0, %%mm5\n" // src0 == src2 (C) rlm@1: "pcmpeqd %%mm1, %%mm3\n" // src1 == src3 (D) rlm@1: "por %%mm3, %%mm5\n" // C|D rlm@1: "pandn %%mm5, %%mm4\n" // (!(A|B))&(C|D) rlm@1: "movq %%mm0, %%mm2\n" rlm@1: "pand %%mm7, %%mm2\n" // color & colorMask rlm@1: "pand %%mm7, %%mm1\n" // src1 & colorMask rlm@1: "psrld $1, %%mm2\n" // (color & colorMask) >> 1 (E) rlm@1: "psrld $1, %%mm1\n" // (src & colorMask) >> 1 (F) rlm@1: "paddd %%mm2, %%mm1\n" // E+F rlm@1: "pand %%mm4, %%mm1\n" // (E+F) & res rlm@1: "pandn %%mm0, %%mm4\n" // color& !res rlm@1: rlm@1: "por %%mm1, %%mm4\n" rlm@1: "movq %%mm4, 0(%0)\n" // src0 = res rlm@1: rlm@1: "addl $8, %0\n" rlm@1: "addl $8, %1\n" rlm@1: "addl $8, %2\n" rlm@1: "addl $8, %3\n" rlm@1: rlm@1: "decl %4\n" rlm@1: "jnz 0b\n" rlm@1: "pop %4\n" rlm@1: "emms\n" rlm@1: : "+r" (src0), "+r" (src1), "+r" (src2), "+r" (src3) rlm@1: : "r" (count), "r" (qRGB_COLOR_MASK) rlm@1: ); rlm@1: #else rlm@1: __asm { rlm@1: movq mm7, qword ptr [qRGB_COLOR_MASK]; rlm@1: mov eax, src0; rlm@1: mov ebx, src1; rlm@1: mov ecx, src2; rlm@1: mov edx, src3; rlm@1: mov edi, count; rlm@1: label0: rlm@1: movq mm0, qword ptr [eax]; // src0 rlm@1: movq mm1, qword ptr [ebx]; // src1 rlm@1: movq mm2, qword ptr [ecx]; // src2 rlm@1: movq mm3, qword ptr [edx]; // src3 rlm@1: movq qword ptr [edx], mm0; // src3 = src0 rlm@1: movq mm4, mm0; rlm@1: movq mm5, mm1; rlm@1: pcmpeqd mm5, mm2; // src1 == src2 (A) rlm@1: pcmpeqd mm4, mm3; // src3 == src0 (B) rlm@1: por mm4, mm5; // A | B rlm@1: movq mm5, mm2; rlm@1: pcmpeqd mm5, mm0; // src0 == src2 (C) rlm@1: pcmpeqd mm3, mm1; // src1 == src3 (D) rlm@1: por mm5, mm3; // C|D rlm@1: pandn mm4, mm5; // (!(A|B))&(C|D) rlm@1: movq mm2, mm0; rlm@1: pand mm2, mm7; // color & colorMask rlm@1: pand mm1, mm7; // src1 & colorMask rlm@1: psrld mm2, 1; // (color & colorMask) >> 1 (E) rlm@1: psrld mm1, 1; // (src & colorMask) >> 1 (F) rlm@1: paddd mm1, mm2; // E+F rlm@1: pand mm1, mm4; // (E+F) & res rlm@1: pandn mm4, mm0; // color & !res rlm@1: rlm@1: por mm4, mm1; rlm@1: movq qword ptr [eax], mm4; // src0 = res rlm@1: rlm@1: add eax, 8; rlm@1: add ebx, 8; rlm@1: add ecx, 8; rlm@1: add edx, 8; rlm@1: rlm@1: dec edi; rlm@1: jnz label0; rlm@1: mov src0, eax; rlm@1: mov src1, ebx; rlm@1: mov src2, ecx; rlm@1: mov src3, edx; rlm@1: emms; rlm@1: } rlm@1: #endif rlm@1: rlm@1: src0++; rlm@1: src1++; rlm@1: src2++; rlm@1: src3++; rlm@1: } rlm@1: /* Swap buffers around */ rlm@1: u8 *temp = frm1; rlm@1: frm1 = frm3; rlm@1: frm3 = frm2; rlm@1: frm2 = temp; rlm@1: } rlm@1: rlm@1: #endif rlm@1: rlm@1: void SmartIB32(u8 *srcPtr, u32 srcPitch, int width, int height) rlm@1: { rlm@1: if (frm1 == NULL) rlm@1: { rlm@1: Init(); rlm@1: } rlm@1: #ifdef MMX rlm@1: if (cpu_mmx) rlm@1: { rlm@1: SmartIB32_MMX(srcPtr, srcPitch, width, height); rlm@1: return; rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 *src0 = (u32 *)srcPtr; rlm@1: u32 *src1 = (u32 *)frm1; rlm@1: u32 *src2 = (u32 *)frm2; rlm@1: u32 *src3 = (u32 *)frm3; rlm@1: rlm@1: u32 colorMask = 0xfefefe; rlm@1: rlm@1: int sPitch = srcPitch >> 2; rlm@1: int pos = 0; rlm@1: rlm@1: for (int j = 0; j < height; j++) rlm@1: for (int i = 0; i < sPitch; i++) rlm@1: { rlm@1: u32 color = src0[pos]; rlm@1: src0[pos] = rlm@1: (src1[pos] != src2[pos]) && rlm@1: (src3[pos] != color) && rlm@1: ((color == src2[pos]) || (src1[pos] == src3[pos])) rlm@1: ? (((color & colorMask) >> 1) + ((src1[pos] & colorMask) >> 1)) : rlm@1: color; rlm@1: src3[pos] = color; /* oldest buffer now holds newest frame */ rlm@1: pos++; rlm@1: } rlm@1: rlm@1: /* Swap buffers around */ rlm@1: u8 *temp = frm1; rlm@1: frm1 = frm3; rlm@1: frm3 = frm2; rlm@1: frm2 = temp; rlm@1: } rlm@1: rlm@1: #ifdef MMX rlm@1: static void MotionBlurIB_MMX(u8 *srcPtr, u32 srcPitch, int width, int height) rlm@1: { rlm@1: u16 *src0 = (u16 *)srcPtr; rlm@1: u16 *src1 = (u16 *)frm1; rlm@1: rlm@1: int count = width >> 2; rlm@1: rlm@1: for (int i = 0; i < height; i++) rlm@1: { rlm@1: #ifdef __GNUC__ rlm@1: asm volatile ( rlm@1: "push %2\n" rlm@1: "movq 0(%3), %%mm7\n" // colorMask rlm@1: "0:\n" rlm@1: "movq 0(%0), %%mm0\n" // src0 rlm@1: "movq 0(%1), %%mm1\n" // src1 rlm@1: "movq %%mm0, 0(%1)\n" // src1 = src0 rlm@1: "pand %%mm7, %%mm0\n" // color & colorMask rlm@1: "pand %%mm7, %%mm1\n" // src1 & colorMask rlm@1: "psrlw $1, %%mm0\n" // (color & colorMask) >> 1 (E) rlm@1: "psrlw $1, %%mm1\n" // (src & colorMask) >> 1 (F) rlm@1: "paddw %%mm1, %%mm0\n" // E+F rlm@1: rlm@1: "movq %%mm0, 0(%0)\n" // src0 = res rlm@1: rlm@1: "addl $8, %0\n" rlm@1: "addl $8, %1\n" rlm@1: rlm@1: "decl %2\n" rlm@1: "jnz 0b\n" rlm@1: "pop %2\n" rlm@1: "emms\n" rlm@1: : "+r" (src0), "+r" (src1) rlm@1: : "r" (count), "r" (qRGB_COLOR_MASK) rlm@1: ); rlm@1: #else rlm@1: __asm { rlm@1: movq mm7, qword ptr [qRGB_COLOR_MASK]; rlm@1: mov eax, src0; rlm@1: mov ebx, src1; rlm@1: mov edi, count; rlm@1: label0: rlm@1: movq mm0, qword ptr [eax]; // src0 rlm@1: movq mm1, qword ptr [ebx]; // src1 rlm@1: movq qword ptr [ebx], mm0; // src1 = src0 rlm@1: pand mm0, mm7; // color & colorMask rlm@1: pand mm1, mm7; // src1 & colorMask rlm@1: psrlw mm0, 1; // (color & colorMask) >> 1 (E) rlm@1: psrlw mm1, 1; // (src & colorMask) >> 1 (F) rlm@1: paddw mm0, mm1; // E+F rlm@1: rlm@1: movq qword ptr [eax], mm0; // src0 = res rlm@1: rlm@1: add eax, 8; rlm@1: add ebx, 8; rlm@1: rlm@1: dec edi; rlm@1: jnz label0; rlm@1: mov src0, eax; rlm@1: mov src1, ebx; rlm@1: emms; rlm@1: } rlm@1: #endif rlm@1: src0 += 2; rlm@1: src1 += 2; rlm@1: } rlm@1: } rlm@1: rlm@1: #endif rlm@1: rlm@1: void MotionBlurIB(u8 *srcPtr, u32 srcPitch, int width, int height) rlm@1: { rlm@1: if (frm1 == NULL) rlm@1: { rlm@1: Init(); rlm@1: } rlm@1: rlm@1: #ifdef MMX rlm@1: if (cpu_mmx) rlm@1: { rlm@1: MotionBlurIB_MMX(srcPtr, srcPitch, width, height); rlm@1: return; rlm@1: } rlm@1: #endif rlm@1: rlm@1: u16 colorMask = ~RGB_LOW_BITS_MASK; rlm@1: rlm@1: u16 *src0 = (u16 *)srcPtr; rlm@1: u16 *src1 = (u16 *)frm1; rlm@1: rlm@1: int sPitch = srcPitch >> 1; rlm@1: rlm@1: int pos = 0; rlm@1: for (int j = 0; j < height; j++) rlm@1: for (int i = 0; i < sPitch; i++) rlm@1: { rlm@1: u16 color = src0[pos]; rlm@1: src0[pos] = rlm@1: (((color & colorMask) >> 1) + ((src1[pos] & colorMask) >> 1)); rlm@1: src1[pos] = color; rlm@1: pos++; rlm@1: } rlm@1: } rlm@1: rlm@1: #ifdef MMX rlm@1: static void MotionBlurIB32_MMX(u8 *srcPtr, u32 srcPitch, int width, int height) rlm@1: { rlm@1: u32 *src0 = (u32 *)srcPtr; rlm@1: u32 *src1 = (u32 *)frm1; rlm@1: rlm@1: int count = width >> 1; rlm@1: rlm@1: for (int i = 0; i < height; i++) rlm@1: { rlm@1: #ifdef __GNUC__ rlm@1: asm volatile ( rlm@1: "push %2\n" rlm@1: "movq 0(%3), %%mm7\n" // colorMask rlm@1: "0:\n" rlm@1: "movq 0(%0), %%mm0\n" // src0 rlm@1: "movq 0(%1), %%mm1\n" // src1 rlm@1: "movq %%mm0, 0(%1)\n" // src1 = src0 rlm@1: "pand %%mm7, %%mm0\n" // color & colorMask rlm@1: "pand %%mm7, %%mm1\n" // src1 & colorMask rlm@1: "psrld $1, %%mm0\n" // (color & colorMask) >> 1 (E) rlm@1: "psrld $1, %%mm1\n" // (src & colorMask) >> 1 (F) rlm@1: "paddd %%mm1, %%mm0\n" // E+F rlm@1: rlm@1: "movq %%mm0, 0(%0)\n" // src0 = res rlm@1: rlm@1: "addl $8, %0\n" rlm@1: "addl $8, %1\n" rlm@1: rlm@1: "decl %2\n" rlm@1: "jnz 0b\n" rlm@1: "pop %2\n" rlm@1: "emms\n" rlm@1: : "+r" (src0), "+r" (src1) rlm@1: : "r" (count), "r" (qRGB_COLOR_MASK) rlm@1: ); rlm@1: #else rlm@1: __asm { rlm@1: movq mm7, qword ptr [qRGB_COLOR_MASK]; rlm@1: mov eax, src0; rlm@1: mov ebx, src1; rlm@1: mov edi, count; rlm@1: label0: rlm@1: movq mm0, qword ptr [eax]; // src0 rlm@1: movq mm1, qword ptr [ebx]; // src1 rlm@1: movq qword ptr [ebx], mm0; // src1 = src0 rlm@1: pand mm0, mm7; // color & colorMask rlm@1: pand mm1, mm7; // src1 & colorMask rlm@1: psrld mm0, 1; // (color & colorMask) >> 1 (E) rlm@1: psrld mm1, 1; // (src & colorMask) >> 1 (F) rlm@1: paddd mm0, mm1; // E+F rlm@1: rlm@1: movq qword ptr [eax], mm0; // src0 = res rlm@1: rlm@1: add eax, 8; rlm@1: add ebx, 8; rlm@1: rlm@1: dec edi; rlm@1: jnz label0; rlm@1: mov src0, eax; rlm@1: mov src1, ebx; rlm@1: emms; rlm@1: } rlm@1: #endif rlm@1: src0++; rlm@1: src1++; rlm@1: } rlm@1: } rlm@1: rlm@1: #endif rlm@1: rlm@1: void MotionBlurIB32(u8 *srcPtr, u32 srcPitch, int width, int height) rlm@1: { rlm@1: if (frm1 == NULL) rlm@1: { rlm@1: Init(); rlm@1: } rlm@1: rlm@1: #ifdef MMX rlm@1: if (cpu_mmx) rlm@1: { rlm@1: MotionBlurIB32_MMX(srcPtr, srcPitch, width, height); rlm@1: return; rlm@1: } rlm@1: #endif rlm@1: rlm@1: u32 *src0 = (u32 *)srcPtr; rlm@1: u32 *src1 = (u32 *)frm1; rlm@1: rlm@1: u32 colorMask = 0xfefefe; rlm@1: rlm@1: int sPitch = srcPitch >> 2; rlm@1: int pos = 0; rlm@1: rlm@1: for (int j = 0; j < height; j++) rlm@1: for (int i = 0; i < sPitch; i++) rlm@1: { rlm@1: u32 color = src0[pos]; rlm@1: src0[pos] = (((color & colorMask) >> 1) + rlm@1: ((src1[pos] & colorMask) >> 1)); rlm@1: src1[pos] = color; rlm@1: pos++; rlm@1: } rlm@1: } rlm@1: rlm@1: static int count = 0; rlm@1: rlm@1: void InterlaceIB(u8 *srcPtr, u32 srcPitch, int width, int height) rlm@1: { rlm@1: if (frm1 == NULL) rlm@1: { rlm@1: Init(); rlm@1: } rlm@1: rlm@1: u16 colorMask = ~RGB_LOW_BITS_MASK; rlm@1: rlm@1: u16 *src0 = (u16 *)srcPtr; rlm@1: u16 *src1 = (u16 *)frm1; rlm@1: rlm@1: int sPitch = srcPitch >> 1; rlm@1: rlm@1: int pos = 0; rlm@1: for (int j = 0; j < height; j++) rlm@1: { rlm@1: bool render = count ? (j & 1) != 0 : (j & 1) == 0; rlm@1: if (render) rlm@1: { rlm@1: for (int i = 0; i < sPitch; i++) rlm@1: { rlm@1: u16 color = src0[pos]; rlm@1: src0[pos] = rlm@1: (((color & colorMask) >> 1) + ((((src1[pos] & colorMask) >> 1) & colorMask) >> 1)); rlm@1: src1[pos] = color; rlm@1: pos++; rlm@1: } rlm@1: } rlm@1: else rlm@1: { rlm@1: for (int i = 0; i < sPitch; i++) rlm@1: { rlm@1: u16 color = src0[pos]; rlm@1: src0[pos] = rlm@1: (((((color & colorMask) >> 1) & colorMask) >> 1) + ((src1[pos] & colorMask) >> 1)); rlm@1: src1[pos] = color; rlm@1: pos++; rlm@1: } rlm@1: } rlm@1: } rlm@1: count = count ^ 1; rlm@1: } rlm@1: