From 7fe60435bce6595a9c58a9bfd8244d74b5320e96 Mon Sep 17 00:00:00 2001 From: Benjamin Franzke Date: Tue, 15 Jan 2013 08:46:13 +0100 Subject: Import DirectFB141_2k11R3_beta5 --- Source/DirectFB/src/gfx/generic/stretch_hvx_88.h | 152 +++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100755 Source/DirectFB/src/gfx/generic/stretch_hvx_88.h (limited to 'Source/DirectFB/src/gfx/generic/stretch_hvx_88.h') diff --git a/Source/DirectFB/src/gfx/generic/stretch_hvx_88.h b/Source/DirectFB/src/gfx/generic/stretch_hvx_88.h new file mode 100755 index 0000000..6394b5b --- /dev/null +++ b/Source/DirectFB/src/gfx/generic/stretch_hvx_88.h @@ -0,0 +1,152 @@ +#ifndef SOURCE_LOOKUP +#define SOURCE_LOOKUP(x) (x) +#define SOURCE_LOOKUP_AUTO +#endif + +#ifndef SOURCE_TYPE +#define SOURCE_TYPE u16 +#define SOURCE_TYPE_AUTO +#endif + +#if 0 +#define HVX_DEBUG(x...) direct_log_printf( NULL, x ) +#else +#define HVX_DEBUG(x...) do {} while (0) +#endif + + +/*** OPTIMIZE by doing two pixels at once (vertically) with a 32 bit line buffer ***/ + +/*static void STRETCH_HVX_NV16( void *dst, + int dpitch, + const void *src, + int spitch, + int width, + int height, + int dst_width, + int dst_height, + DFBRegion *clip )*/ +{ + long x, y = 0; + long cw = clip->x2 - clip->x1 + 1; + long ch = clip->y2 - clip->y1 + 1; + long hfraq = ((long)(width - MINUS_1) << 18) / (long)(dst_width); + long vfraq = ((long)(height - MINUS_1) << 18) / (long)(dst_height); + long point0 = POINT_0 + clip->x1 * hfraq; + long point = point0; + long line = LINE_0 + clip->y1 * vfraq; + long ratios[cw]; + u16 *dst16; + + u16 _lbT[cw+16]; + u16 _lbB[cw+16]; + + u16 *lbX; + u16 *lbT = (u16*)((((ulong)(&_lbT[0])) + 31) & ~31); + u16 *lbB = (u16*)((((ulong)(&_lbB[0])) + 31) & ~31); + + long lineT = -2000; + + for (x=0; xx1 * 2 + clip->y1 * dpitch; + + dst16 = dst; + + /* + * Scale line by line. + */ + for (y=0; y= 0 ); + D_ASSERT( nlT < height-1 ); + + /* + * Fill line buffer(s) ? + */ + if (nlT != lineT) { + u16 L, R; + const SOURCE_TYPE *srcT = src + spitch * nlT; + const SOURCE_TYPE *srcB = src + spitch * (nlT + 1); + long diff = nlT - lineT; + + if (diff > 1) { + /* + * Horizontal interpolation + */ + for (x=0, point=point0; x= 0 ); + D_ASSERT( pl < width-1 ); + + L = SOURCE_LOOKUP(srcT[pl]); + R = SOURCE_LOOKUP(srcT[pl+1]); + + lbT[x] = (((((R & 0x00ff)-(L & 0x00ff))*ratios[x] + ((L & 0x00ff)<<8)) & 0x00ff00) + + ((((R & 0xff00)-(L & 0xff00))*ratios[x] + ((L & 0xff00)<<8)) & 0xff0000)) >> 8; + + L = SOURCE_LOOKUP(srcB[pl]); + R = SOURCE_LOOKUP(srcB[pl+1]); + + lbB[x] = (((((R & 0x00ff)-(L & 0x00ff))*ratios[x] + ((L & 0x00ff)<<8)) & 0x00ff00) + + ((((R & 0xff00)-(L & 0xff00))*ratios[x] + ((L & 0xff00)<<8)) & 0xff0000)) >> 8; + } + } + else { + /* Swap */ + lbX = lbT; + lbT = lbB; + lbB = lbX; + + /* + * Horizontal interpolation + */ + for (x=0, point=point0; x= 0 ); + D_ASSERT( pl < width-1 ); + + L = SOURCE_LOOKUP(srcB[pl]); + R = SOURCE_LOOKUP(srcB[pl+1]); + + lbB[x] = (((((R & 0x00ff)-(L & 0x00ff))*ratios[x] + ((L & 0x00ff)<<8)) & 0x00ff00) + + ((((R & 0xff00)-(L & 0xff00))*ratios[x] + ((L & 0xff00)<<8)) & 0xff0000)) >> 8; + } + } + + lineT = nlT; + } + + /* + * Vertical interpolation + */ + long X = LINE_TO_RATIO( line, vfraq ); + + for (x=0; x> 8; + + dst16 += dpitch / 2; + line += vfraq; + } +} + +#ifdef SOURCE_LOOKUP_AUTO +#undef SOURCE_LOOKUP_AUTO +#undef SOURCE_LOOKUP +#endif + +#ifdef SOURCE_TYPE_AUTO +#undef SOURCE_TYPE_AUTO +#undef SOURCE_TYPE +#endif + -- cgit