From f3fb21d364c8c8372d65060e6f3636dbb009bb43 Mon Sep 17 00:00:00 2001 From: raster Date: Wed, 1 Oct 2008 06:37:31 +0000 Subject: [PATCH] and now i added "line dither". what is this. it's only for non-rotated 16bpp 565. what it does is it's a half-way house between no dither and "small dither mask". what is does is change the "rounding" between odd and even lines. the resolt is not as nice as small (or large) dither mask - but its almost "good". it gives a horizontal-blinds like look to dithering. it's almost as fast as no-dither in my tests on a core2 (of course making lots of use of branch prediction or conditional instructins - whihc arm nd x86 have). git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@36373 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- configure.ac | 24 ++++++++ src/lib/engines/common/evas_convert_rgb_16.c | 90 +++++++++++++++++++++++++++- 2 files changed, 113 insertions(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 8f3ff2b..312ab3d 100644 --- a/configure.ac +++ b/configure.ac @@ -1556,6 +1556,29 @@ AC_ARG_ENABLE(small-dither-mask, ) ####################################### +## Alternate Line dither mask instead of big one (lower quality - but fastest) +conv_line_dither="no" +AC_MSG_CHECKING(whether to build line dither mask code) +AC_ARG_ENABLE(line-dither-mask, + AC_HELP_STRING([--enable-line-dither-mask], [enable line dither mask code]), + [ + if test "x$enableval" = "xyes" ; then + AC_MSG_RESULT(yes) + AC_DEFINE(BUILD_LINE_DITHER_MASK, 1, [Line Dither Mask Support]) + conv_line_dither="yes" + else + AC_MSG_RESULT(no) + conv_line_dither="no" + fi + ], [ + AC_MSG_RESULT($conv_line_dither) + if test "x$conv_line_dither" = "xyes" ; then + AC_DEFINE(BUILD_LINE_DITHER_MASK, 1, [Line Dither Mask Support]) + fi + ] +) + +####################################### ## No dither mask at all for 16bpp conv_no_dither="no" AC_MSG_CHECKING(whether to build without dither mask for 16bpp) @@ -1904,6 +1927,7 @@ echo " YUV Converter...........: $conv_yuv" echo echo "ARGB Conversion Options:" echo " Smaller Dither Mask.....: $conv_small_dither" +echo " Line Dither Mask........: $conv_line_dither" echo " No Dither Mask for 16bpp: $conv_no_dither" echo " 8bpp RGB 332............: $conv_8_rgb_332" echo " 8bpp RGB 666............: $conv_8_rgb_666" diff --git a/src/lib/engines/common/evas_convert_rgb_16.c b/src/lib/engines/common/evas_convert_rgb_16.c index e633c35..844fe38 100644 --- a/src/lib/engines/common/evas_convert_rgb_16.c +++ b/src/lib/engines/common/evas_convert_rgb_16.c @@ -26,6 +26,60 @@ evas_common_convert_rgba2_to_16bpp_rgb_565_dith (DATA32 *src, DATA8 *dst, int sr int dith, dith2; int x, y; +#ifdef BUILD_LINE_DITHER_MASK + for (y = 0; y < h; y++) + { + if ((y + dith_y) & 0x1) + { + for (x = 0; x < w; x+=2) + { + DATA32 p = *src++, q = *src++; + r1 = ((p & 0xff0000) + 0x030000) >> 19; + if (r1 > 0x1f) r1 = 0x1f; + g1 = ((p & 0xff00) + 0x000100) >> 10; + if (g1 > 0x3f) g1 = 0x3f; + b1 = ((p & 0xff) + 0x000003) >> 3; + if (b1 > 0x1f) b1 = 0x1f; + r2 = ((q & 0xff0000) + 0x030000) >> 19; + if (r2 > 0x1f) r2 = 0x1f; + g2 = ((q & 0xff00) + 0x000100) >> 10; + if (g2 > 0x3f) g2 = 0x3f; + b2 = ((q & 0xff) + 0x000003) >> 3; + if (b2 > 0x1f) b2 = 0x1f; +#ifndef WORDS_BIGENDIAN + *((DATA32 *)d) = (r2 << 27) | (g2 << 21) | (b2 << 16) | + (r1 << 11) | (g1 << 5) | (b1); +#else + *((DATA32 *)d) = (r1 << 27) | (g1 << 21) | (b1 << 16) | + (r2 << 11) | (g2 << 5) | (b2); +#endif + d += 2; + } + } + else + { + x = w; + while (w > 0) + { + DATA32 p = *src++, q = *src++; + +#ifndef WORDS_BIGENDIAN + *((DATA32 *)d) = + (((q & 0xff0000) >> 19) << 27) | (((q & 0xff00) >> 10) << 21) | (((q & 0xff) >> 3) << 16) | + (((p & 0xff0000) >> 19) << 11) | (((p & 0xff00) >> 10) << 5) | ((p & 0xff) >> 3); +#else + *((DATA32 *)d) = + (((p & 0xff0000) >> 19) << 27) | (((p & 0xff00) >> 10) << 21) | (((p & 0xff) >> 3) << 16) | + (((q & 0xff0000) >> 19) << 11) | (((q & 0xff00) >> 10) << 5) | ((q & 0xff) >> 3); +#endif + d += 2; w -= 2; + } + w = x; + } + src += src_jump; + d += dst_jump; + } +#else for (y = 0; y < h; y++) { for (x = 0; x < w; x++) @@ -52,7 +106,7 @@ evas_common_convert_rgba2_to_16bpp_rgb_565_dith (DATA32 *src, DATA8 *dst, int sr if ((r2 < 0x1f) && ((((q & 0xff0000) >> 16) - (r2 << 3)) >= dith )) r2++; if ((g2 < 0x3f) && ((((q & 0xff00) >> 8) - (g2 << 2)) >= dith2)) g2++; if ((b2 < 0x1f) && (((q & 0xff) - (b2 << 3)) >= dith )) b2++; - + #ifndef WORDS_BIGENDIAN *((DATA32 *)d) = (r2 << 27) | (g2 << 21) | (b2 << 16) | (r1 << 11) | (g1 << 5) | (b1); @@ -65,6 +119,7 @@ evas_common_convert_rgba2_to_16bpp_rgb_565_dith (DATA32 *src, DATA8 *dst, int sr src += src_jump; d += dst_jump; } +#endif return; pal = 0; #else @@ -110,6 +165,38 @@ evas_common_convert_rgba_to_16bpp_rgb_565_dith (DATA32 *src, DATA8 *dst, int src int dith, dith2; int x, y; +#ifdef BUILD_LINE_DITHER_MASK + for (y = 0; y < h; y++) + { + if ((y + dith_y) & 0x1) + { + for (x = 0; x < w; x++) + { + DATA32 p = *src++; + + r = (p & 0xff0000) >> 19; + if (r > 0x1f) r = 0x1f; + g = (p & 0xff00) >> 10; + if (g > 0x3f) g = 0x3f; + b = (p & 0xff) >> 3; + if (b > 0x1f) b = 0x1f; + *d++ = (r << 11) | (g << 5) | b; + } + } + else + { + x = w; + while (w--) + { + *d++ = (((*src & 0xff0000) >> 19) << 11) | (((*src & 0xff00) >> 10) << 5) | ((*src & 0xff) >> 3); + src++; + } + w = x; + } + src += src_jump; + d += dst_jump; + } +#else for (y = 0; y < h; y++) { for (x = 0; x < w; x++) @@ -131,6 +218,7 @@ evas_common_convert_rgba_to_16bpp_rgb_565_dith (DATA32 *src, DATA8 *dst, int src src += src_jump; d += dst_jump; } +#endif return; pal = 0; #else -- 2.7.4