rlm@1: #include "../Port.h" rlm@1: #include "hq_shared32.h" rlm@1: #include "interp.h" rlm@1: rlm@1: #define SIZE_PIXEL 2 // 16bit = 2 bytes rlm@1: #define PIXELTYPE unsigned short rlm@1: #define Interp1 Interp1_16 rlm@1: #define Interp2 Interp2_16 rlm@1: #define Interp3 Interp3_16 rlm@1: #define Interp4 Interp4_16 rlm@1: #define Interp5 Interp5_16 rlm@1: rlm@1: void hq3x(unsigned char *pIn, unsigned int srcPitch, rlm@1: unsigned char *, rlm@1: unsigned char *pOut, unsigned int dstPitch, rlm@1: int Xres, int Yres) rlm@1: { rlm@1: int i, j; rlm@1: unsigned int line; rlm@1: PIXELTYPE c[10]; rlm@1: rlm@1: // +----+----+----+ rlm@1: // | | | | rlm@1: // | c1 | c2 | c3 | rlm@1: // +----+----+----+ rlm@1: // | | | | rlm@1: // | c4 | c5 | c6 | rlm@1: // +----+----+----+ rlm@1: // | | | | rlm@1: // | c7 | c8 | c9 | rlm@1: // +----+----+----+ rlm@1: rlm@1: for (j = 0; j < Yres; j++) rlm@1: { rlm@1: if ((j > 0) || (j < Yres - 1)) rlm@1: line = srcPitch; rlm@1: else rlm@1: line = 0; rlm@1: rlm@1: for (i = 0; i < Xres; i++) rlm@1: { rlm@1: c[2] = *((PIXELTYPE *)(pIn - line)); rlm@1: c[5] = *((PIXELTYPE *)(pIn)); rlm@1: c[8] = *((PIXELTYPE *)(pIn + line)); rlm@1: rlm@1: if (i > 0) rlm@1: { rlm@1: c[1] = *((PIXELTYPE *)(pIn - line - SIZE_PIXEL)); rlm@1: c[4] = *((PIXELTYPE *)(pIn - SIZE_PIXEL)); rlm@1: c[7] = *((PIXELTYPE *)(pIn + line - SIZE_PIXEL)); rlm@1: } rlm@1: else rlm@1: { rlm@1: c[1] = c[2]; rlm@1: c[4] = c[5]; rlm@1: c[7] = c[8]; rlm@1: } rlm@1: rlm@1: if (i < Xres - 1) rlm@1: { rlm@1: c[3] = *((PIXELTYPE *)(pIn - line + SIZE_PIXEL)); rlm@1: c[6] = *((PIXELTYPE *)(pIn + SIZE_PIXEL)); rlm@1: c[9] = *((PIXELTYPE *)(pIn + line + SIZE_PIXEL)); rlm@1: } rlm@1: else rlm@1: { rlm@1: c[3] = c[2]; rlm@1: c[6] = c[5]; rlm@1: c[9] = c[8]; rlm@1: } rlm@1: rlm@1: int pattern = 0; rlm@1: rlm@1: if (interp_16_diff(c[1], c[5])) rlm@1: pattern |= 1 << 0; rlm@1: if (interp_16_diff(c[2], c[5])) rlm@1: pattern |= 1 << 1; rlm@1: if (interp_16_diff(c[3], c[5])) rlm@1: pattern |= 1 << 2; rlm@1: if (interp_16_diff(c[4], c[5])) rlm@1: pattern |= 1 << 3; rlm@1: if (interp_16_diff(c[6], c[5])) rlm@1: pattern |= 1 << 4; rlm@1: if (interp_16_diff(c[7], c[5])) rlm@1: pattern |= 1 << 5; rlm@1: if (interp_16_diff(c[8], c[5])) rlm@1: pattern |= 1 << 6; rlm@1: if (interp_16_diff(c[9], c[5])) rlm@1: pattern |= 1 << 7; rlm@1: rlm@1: #define Diff interp_16_diff rlm@1: #include "hq3x32.h" rlm@1: #undef Diff rlm@1: pIn += SIZE_PIXEL; rlm@1: pOut += 3 << 1; rlm@1: } rlm@1: pIn += srcPitch - (Xres << 1); rlm@1: pOut += dstPitch - (3 * Xres << 1); rlm@1: pOut += dstPitch << 1; rlm@1: // pIn+=SIZE_PIXEL; rlm@1: // pOut+=3*SIZE_PIXEL; rlm@1: //} rlm@1: //pIn+=srcPitch-(4*Xres); rlm@1: //pOut+=dstPitch-(3*Xres*SIZE_PIXEL); rlm@1: //pOut+=2*dstPitch; rlm@1: } rlm@1: } rlm@1: rlm@1: void hq3xS(unsigned char *pIn, unsigned int srcPitch, rlm@1: unsigned char *, rlm@1: unsigned char *pOut, unsigned int dstPitch, rlm@1: int Xres, int Yres) rlm@1: { rlm@1: int i, j; rlm@1: PIXELTYPE c[10]; rlm@1: rlm@1: // +----+----+----+ rlm@1: // | | | | rlm@1: // | c1 | c2 | c3 | rlm@1: // +----+----+----+ rlm@1: // | | | | rlm@1: // | c4 | c5 | c6 | rlm@1: // +----+----+----+ rlm@1: // | | | | rlm@1: // | c7 | c8 | c9 | rlm@1: // +----+----+----+ rlm@1: rlm@1: for (j = 0; j < Yres; j++) rlm@1: { rlm@1: for (i = 0; i < Xres; i++) rlm@1: { rlm@1: c[2] = *((PIXELTYPE *)(pIn - srcPitch)); rlm@1: c[5] = *((PIXELTYPE *)(pIn)); rlm@1: c[8] = *((PIXELTYPE *)(pIn + srcPitch)); rlm@1: rlm@1: c[1] = *((PIXELTYPE *)(pIn - srcPitch - SIZE_PIXEL)); rlm@1: c[4] = *((PIXELTYPE *)(pIn - SIZE_PIXEL)); rlm@1: c[7] = *((PIXELTYPE *)(pIn + srcPitch - SIZE_PIXEL)); rlm@1: rlm@1: c[3] = *((PIXELTYPE *)(pIn - srcPitch + SIZE_PIXEL)); rlm@1: c[6] = *((PIXELTYPE *)(pIn + SIZE_PIXEL)); rlm@1: c[9] = *((PIXELTYPE *)(pIn + srcPitch + SIZE_PIXEL)); rlm@1: rlm@1: int pattern = 0; rlm@1: rlm@1: // hq3xS dynamic edge detection: rlm@1: // simply comparing the center color against its surroundings will give bad results in many cases, rlm@1: // so, instead, compare the center color relative to the max difference in brightness of this 3x3 block rlm@1: int brightArray[10]; rlm@1: int maxBright = 0, minBright = 999999; rlm@1: for (int j = 1; j < 10; j++) rlm@1: { rlm@1: int r, g, b; rlm@1: if (interp_bits_per_pixel == 16) rlm@1: { rlm@1: b = (int)((c[j] & 0x1F)) << 3; rlm@1: g = (int)((c[j] & 0x7E0)) >> 3; rlm@1: r = (int)((c[j] & 0xF800)) >> 8; rlm@1: } rlm@1: else rlm@1: { rlm@1: b = (int)((c[j] & 0x1F)) << 3; rlm@1: g = (int)((c[j] & 0x3E0)) >> 2; rlm@1: r = (int)((c[j] & 0x7C00)) >> 7; rlm@1: } rlm@1: const int bright = r + r + r + g + g + g + b + b; rlm@1: if (bright > maxBright) maxBright = bright; rlm@1: if (bright < minBright) minBright = bright; rlm@1: rlm@1: brightArray[j] = bright; rlm@1: } rlm@1: const int diffBright = ((maxBright - minBright) * 7) >> 4; rlm@1: if (diffBright > 7) rlm@1: { rlm@1: #define ABS(x) ((x) < 0 ? -(x) : (x)) rlm@1: rlm@1: const int centerBright = brightArray[5]; rlm@1: if (ABS(brightArray[1] - centerBright) > diffBright) rlm@1: pattern |= 1 << 0; rlm@1: if (ABS(brightArray[2] - centerBright) > diffBright) rlm@1: pattern |= 1 << 1; rlm@1: if (ABS(brightArray[3] - centerBright) > diffBright) rlm@1: pattern |= 1 << 2; rlm@1: if (ABS(brightArray[4] - centerBright) > diffBright) rlm@1: pattern |= 1 << 3; rlm@1: if (ABS(brightArray[6] - centerBright) > diffBright) rlm@1: pattern |= 1 << 4; rlm@1: if (ABS(brightArray[7] - centerBright) > diffBright) rlm@1: pattern |= 1 << 5; rlm@1: if (ABS(brightArray[8] - centerBright) > diffBright) rlm@1: pattern |= 1 << 6; rlm@1: if (ABS(brightArray[9] - centerBright) > diffBright) rlm@1: pattern |= 1 << 7; rlm@1: } rlm@1: rlm@1: #define Diff(x, y) false //(ABS((x) - (y)) > diffBright) rlm@1: #undef cget rlm@1: #define cget(x) brightArray[x] rlm@1: #include "hq3x32.h" rlm@1: #undef cget rlm@1: #undef Diff rlm@1: pIn += SIZE_PIXEL; rlm@1: pOut += 3 << 1; rlm@1: } rlm@1: pIn += srcPitch - (Xres << 1); rlm@1: pOut += dstPitch - (3 * Xres << 1); rlm@1: pOut += dstPitch << 1; rlm@1: // pIn+=SIZE_PIXEL; rlm@1: // pOut+=3*SIZE_PIXEL; rlm@1: //} rlm@1: //pIn+=srcPitch-(4*Xres); rlm@1: //pOut+=dstPitch-(3*Xres*SIZE_PIXEL); rlm@1: //pOut+=2*dstPitch; rlm@1: } rlm@1: } rlm@1: rlm@1: #undef Interp1 rlm@1: #undef Interp2 rlm@1: #undef Interp3 rlm@1: #undef Interp4 rlm@1: #undef Interp5 rlm@1: #undef SIZE_PIXEL rlm@1: #undef PIXELTYPE rlm@1: #define SIZE_PIXEL 4 // 32bit = 4 bytes rlm@1: #define PIXELTYPE unsigned int rlm@1: rlm@1: void hq3x32(unsigned char *pIn, unsigned int srcPitch, rlm@1: unsigned char *, rlm@1: unsigned char *pOut, unsigned int dstPitch, rlm@1: int Xres, int Yres) rlm@1: { rlm@1: unsigned int YUV1, YUV2; rlm@1: int i, j, k; rlm@1: unsigned int line; rlm@1: PIXELTYPE c[10]; rlm@1: rlm@1: // +----+----+----+ rlm@1: // | | | | rlm@1: // | c1 | c2 | c3 | rlm@1: // +----+----+----+ rlm@1: // | | | | rlm@1: // | c4 | c5 | c6 | rlm@1: // +----+----+----+ rlm@1: // | | | | rlm@1: // | c7 | c8 | c9 | rlm@1: // +----+----+----+ rlm@1: rlm@1: for (j = 0; j < Yres; j++) rlm@1: { rlm@1: if ((j > 0) && (j < Yres - 1)) rlm@1: line = srcPitch; rlm@1: else rlm@1: line = 0; rlm@1: rlm@1: for (i = 0; i < Xres; i++) rlm@1: { rlm@1: c[2] = *((PIXELTYPE *)(pIn - line)); rlm@1: c[5] = *((PIXELTYPE *)(pIn)); rlm@1: c[8] = *((PIXELTYPE *)(pIn + line)); rlm@1: rlm@1: if (i > 0) rlm@1: { rlm@1: c[1] = *((PIXELTYPE *)(pIn - line - SIZE_PIXEL)); rlm@1: c[4] = *((PIXELTYPE *)(pIn - SIZE_PIXEL)); rlm@1: c[7] = *((PIXELTYPE *)(pIn + line - SIZE_PIXEL)); rlm@1: } rlm@1: else rlm@1: { rlm@1: c[1] = c[2]; rlm@1: c[4] = c[5]; rlm@1: c[7] = c[8]; rlm@1: } rlm@1: rlm@1: if (i < Xres - 1) rlm@1: { rlm@1: c[3] = *((PIXELTYPE *)(pIn - line + SIZE_PIXEL)); rlm@1: c[6] = *((PIXELTYPE *)(pIn + SIZE_PIXEL)); rlm@1: c[9] = *((PIXELTYPE *)(pIn + line + SIZE_PIXEL)); rlm@1: } rlm@1: else rlm@1: { rlm@1: c[3] = c[2]; rlm@1: c[6] = c[5]; rlm@1: c[9] = c[8]; rlm@1: } rlm@1: rlm@1: int pattern = 0; rlm@1: int flag = 1; rlm@1: rlm@1: YUV1 = RGBtoYUV(c[5]); rlm@1: rlm@1: for (k = 1; k <= 9; k++) rlm@1: { rlm@1: if (k == 5) continue; rlm@1: rlm@1: if (c[k] != c[5]) rlm@1: { rlm@1: YUV2 = RGBtoYUV(c[k]); rlm@1: if ( rlm@1: (abs32((YUV1 & Ymask) - (YUV2 & Ymask)) > trY) || rlm@1: (abs32((YUV1 & Umask) - (YUV2 & Umask)) > trU) || rlm@1: (abs32((YUV1 & Vmask) - (YUV2 & Vmask)) > trV) rlm@1: ) rlm@1: pattern |= flag; rlm@1: } rlm@1: flag <<= 1; rlm@1: } rlm@1: rlm@1: #include "hq3x32.h" rlm@1: pIn += SIZE_PIXEL; rlm@1: pOut += 3 << 2; rlm@1: } rlm@1: pIn += srcPitch - (Xres << 2); rlm@1: pOut += dstPitch - (3 * Xres << 2); rlm@1: pOut += dstPitch << 1; rlm@1: // pIn+=SIZE_PIXEL; rlm@1: // pOut+=3*SIZE_PIXEL; rlm@1: //} rlm@1: //pIn+=srcPitch-(4*Xres); rlm@1: //pOut+=dstPitch-(3*Xres*SIZE_PIXEL); rlm@1: //pOut+=2*dstPitch; rlm@1: } rlm@1: } rlm@1: rlm@1: void hq3xS32(unsigned char *pIn, unsigned int srcPitch, rlm@1: unsigned char *, rlm@1: unsigned char *pOut, unsigned int dstPitch, rlm@1: int Xres, int Yres) rlm@1: { rlm@1: int i, j; rlm@1: unsigned int line; rlm@1: PIXELTYPE c[10]; rlm@1: rlm@1: // +----+----+----+ rlm@1: // | | | | rlm@1: // | c1 | c2 | c3 | rlm@1: // +----+----+----+ rlm@1: // | | | | rlm@1: // | c4 | c5 | c6 | rlm@1: // +----+----+----+ rlm@1: // | | | | rlm@1: // | c7 | c8 | c9 | rlm@1: // +----+----+----+ rlm@1: rlm@1: for (j = 0; j < Yres; j++) rlm@1: { rlm@1: if ((j > 0) && (j < Yres - 1)) rlm@1: line = srcPitch; rlm@1: else rlm@1: line = 0; rlm@1: rlm@1: for (i = 0; i < Xres; i++) rlm@1: { rlm@1: c[2] = *((PIXELTYPE *)(pIn - line)); rlm@1: c[5] = *((PIXELTYPE *)(pIn)); rlm@1: c[8] = *((PIXELTYPE *)(pIn + line)); rlm@1: rlm@1: if (i > 0) rlm@1: { rlm@1: c[1] = *((PIXELTYPE *)(pIn - line - SIZE_PIXEL)); rlm@1: c[4] = *((PIXELTYPE *)(pIn - SIZE_PIXEL)); rlm@1: c[7] = *((PIXELTYPE *)(pIn + line - SIZE_PIXEL)); rlm@1: } rlm@1: else rlm@1: { rlm@1: c[1] = c[2]; rlm@1: c[4] = c[5]; rlm@1: c[7] = c[8]; rlm@1: } rlm@1: rlm@1: if (i < Xres - 1) rlm@1: { rlm@1: c[3] = *((PIXELTYPE *)(pIn - line + SIZE_PIXEL)); rlm@1: c[6] = *((PIXELTYPE *)(pIn + SIZE_PIXEL)); rlm@1: c[9] = *((PIXELTYPE *)(pIn + line + SIZE_PIXEL)); rlm@1: } rlm@1: else rlm@1: { rlm@1: c[3] = c[2]; rlm@1: c[6] = c[5]; rlm@1: c[9] = c[8]; rlm@1: } rlm@1: rlm@1: int pattern = 0; rlm@1: rlm@1: // hq3xS dynamic edge detection: rlm@1: // simply comparing the center color against its surroundings will give bad results in many cases, rlm@1: // so, instead, compare the center color relative to the max difference in brightness of this 3x3 block rlm@1: int brightArray[10]; rlm@1: int maxBright = 0, minBright = 999999; rlm@1: for (int j = 1; j < 10; j++) rlm@1: { rlm@1: const int b = (int)((c[j] & 0xF8)); rlm@1: const int g = (int)((c[j] & 0xF800)) >> 8; rlm@1: const int r = (int)((c[j] & 0xF80000)) >> 16; rlm@1: const int bright = r + r + r + g + g + g + b + b; rlm@1: if (bright > maxBright) maxBright = bright; rlm@1: if (bright < minBright) minBright = bright; rlm@1: rlm@1: brightArray[j] = bright; rlm@1: } rlm@1: int diffBright = ((maxBright - minBright) * 7) >> 4; rlm@1: if (diffBright > 7) rlm@1: { rlm@1: #define ABS(x) ((x) < 0 ? -(x) : (x)) rlm@1: rlm@1: const int centerBright = brightArray[5]; rlm@1: if (ABS(brightArray[1] - centerBright) > diffBright) rlm@1: pattern |= 1 << 0; rlm@1: if (ABS(brightArray[2] - centerBright) > diffBright) rlm@1: pattern |= 1 << 1; rlm@1: if (ABS(brightArray[3] - centerBright) > diffBright) rlm@1: pattern |= 1 << 2; rlm@1: if (ABS(brightArray[4] - centerBright) > diffBright) rlm@1: pattern |= 1 << 3; rlm@1: if (ABS(brightArray[6] - centerBright) > diffBright) rlm@1: pattern |= 1 << 4; rlm@1: if (ABS(brightArray[7] - centerBright) > diffBright) rlm@1: pattern |= 1 << 5; rlm@1: if (ABS(brightArray[8] - centerBright) > diffBright) rlm@1: pattern |= 1 << 6; rlm@1: if (ABS(brightArray[9] - centerBright) > diffBright) rlm@1: pattern |= 1 << 7; rlm@1: } rlm@1: rlm@1: #define Diff(x, y) false //(ABS((x) - (y)) > diffBright) rlm@1: #undef cget rlm@1: #define cget(x) brightArray[x] rlm@1: #include "hq3x32.h" rlm@1: #undef cget rlm@1: #undef Diff rlm@1: pIn += SIZE_PIXEL; rlm@1: pOut += 3 << 2; rlm@1: } rlm@1: pIn += srcPitch - (Xres << 2); rlm@1: pOut += dstPitch - (3 * Xres << 2); rlm@1: pOut += dstPitch << 1; rlm@1: // pIn+=SIZE_PIXEL; rlm@1: // pOut+=3*SIZE_PIXEL; rlm@1: //} rlm@1: //pIn+=srcPitch-(4*Xres); rlm@1: //pOut+=dstPitch-(3*Xres*SIZE_PIXEL); rlm@1: //pOut+=2*dstPitch; rlm@1: } rlm@1: }