diff options
-rw-r--r-- | x11-libs/cairo/ChangeLog | 7 | ||||
-rw-r--r-- | x11-libs/cairo/cairo-1.8.6.ebuild | 7 | ||||
-rw-r--r-- | x11-libs/cairo/files/cairo-1.2.4-lcd-cleartype-like.diff | 275 | ||||
-rw-r--r-- | x11-libs/cairo/metadata.xml | 2 |
4 files changed, 288 insertions, 3 deletions
diff --git a/x11-libs/cairo/ChangeLog b/x11-libs/cairo/ChangeLog index 345dc76ca7a2..875c70686b6d 100644 --- a/x11-libs/cairo/ChangeLog +++ b/x11-libs/cairo/ChangeLog @@ -1,6 +1,11 @@ # ChangeLog for x11-libs/cairo # Copyright 1999-2008 Gentoo Foundation; Distributed under the GPL v2 -# $Header: /var/cvsroot/gentoo-x86/x11-libs/cairo/ChangeLog,v 1.204 2008/12/24 17:17:57 cardoe Exp $ +# $Header: /var/cvsroot/gentoo-x86/x11-libs/cairo/ChangeLog,v 1.205 2008/12/30 17:11:09 cardoe Exp $ + + 30 Dec 2008; Doug Goldstein <cardoe@gentoo.org> + +files/cairo-1.2.4-lcd-cleartype-like.diff, metadata.xml, + cairo-1.8.6.ebuild: + add ClearType-style sub-pixel hinting patch from Arch Linux *cairo-1.8.6 (24 Dec 2008) diff --git a/x11-libs/cairo/cairo-1.8.6.ebuild b/x11-libs/cairo/cairo-1.8.6.ebuild index 64f7ceaedd75..73b7eb6b551a 100644 --- a/x11-libs/cairo/cairo-1.8.6.ebuild +++ b/x11-libs/cairo/cairo-1.8.6.ebuild @@ -1,6 +1,6 @@ # Copyright 1999-2008 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 -# $Header: /var/cvsroot/gentoo-x86/x11-libs/cairo/cairo-1.8.6.ebuild,v 1.1 2008/12/24 17:17:57 cardoe Exp $ +# $Header: /var/cvsroot/gentoo-x86/x11-libs/cairo/cairo-1.8.6.ebuild,v 1.2 2008/12/30 17:11:09 cardoe Exp $ inherit eutils flag-o-matic libtool @@ -11,7 +11,7 @@ SRC_URI="http://cairographics.org/releases/${P}.tar.gz" LICENSE="|| ( LGPL-2.1 MPL-1.1 )" SLOT="0" KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sh ~sparc ~x86 ~x86-fbsd" -IUSE="debug directfb doc glitz opengl svg X xcb" +IUSE="cleartype debug directfb doc glitz opengl svg X xcb" # Test causes a circular depend on gtk+... since gtk+ needs cairo but test needs gtk+ so we need to block it RESTRICT="test" @@ -59,6 +59,9 @@ src_unpack() { unpack ${A} cd "${S}" + # ClearType-like patches applied by ArchLinux + use cleartype && epatch "${FILESDIR}"/cairo-1.2.4-lcd-cleartype-like.diff + # We need to run elibtoolize to ensure correct so versioning on FreeBSD elibtoolize } diff --git a/x11-libs/cairo/files/cairo-1.2.4-lcd-cleartype-like.diff b/x11-libs/cairo/files/cairo-1.2.4-lcd-cleartype-like.diff new file mode 100644 index 000000000000..2f908b855387 --- /dev/null +++ b/x11-libs/cairo/files/cairo-1.2.4-lcd-cleartype-like.diff @@ -0,0 +1,275 @@ +diff -rup libcairo-1.2.4.orig/src/cairo-ft-font.c libcairo-1.2.4/src/cairo-ft-font.c +--- libcairo-1.2.4.orig/src/cairo-ft-font.c 2006-08-22 21:40:02.802247352 +0800 ++++ libcairo-1.2.4/src/cairo-ft-font.c 2006-08-22 21:40:39.443677008 +0800 +@@ -53,6 +53,8 @@ + #include FT_SYNTHESIS_H + #endif + ++#define FIR_FILTER 1 ++ + #define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 64.0)) + #define DOUBLE_FROM_26_6(t) ((double)(t) / 64.0) + #define DOUBLE_TO_16_16(d) ((FT_Fixed)((d) * 65536.0)) +@@ -492,6 +494,8 @@ _cairo_ft_unscaled_font_destroy (void *a + } + } + ++static const int fir_filter[5] = { 0x1C, 0x38, 0x55, 0x38, 0x1C }; ++ + static cairo_bool_t + _has_unlocked_face (void *entry) + { +@@ -779,7 +783,220 @@ _get_bitmap_surface (FT_Bitmap *bi + } + format = CAIRO_FORMAT_A8; + break; +- case CAIRO_ANTIALIAS_SUBPIXEL: { ++ case CAIRO_ANTIALIAS_SUBPIXEL: ++#ifdef FIR_FILTER ++ { ++ unsigned char* line; ++ unsigned char* bufBitmap; ++ int pitch; ++ unsigned char *data_rgba; ++ unsigned int width_rgba, stride_rgba; ++ int vmul = 1; ++ int hmul = 1; ++ ++ switch (font_options->subpixel_order) { ++ case CAIRO_SUBPIXEL_ORDER_DEFAULT: ++ case CAIRO_SUBPIXEL_ORDER_RGB: ++ case CAIRO_SUBPIXEL_ORDER_BGR: ++ default: ++ width /= 3; ++ hmul = 3; ++ break; ++ case CAIRO_SUBPIXEL_ORDER_VRGB: ++ case CAIRO_SUBPIXEL_ORDER_VBGR: ++ vmul = 3; ++ height /= 3; ++ break; ++ } ++ /* ++ * Filter the glyph to soften the color fringes ++ */ ++ width_rgba = width; ++ stride = bitmap->pitch; ++ stride_rgba = (width_rgba * 4 + 3) & ~3; ++ data_rgba = calloc (1, stride_rgba * height); ++ ++ /* perform in-place FIR filtering in either the horizontal or ++ * vertical direction. We're going to modify the RGB graymap, ++ * but that's ok, because we either own it, or its part of ++ * the FreeType glyph slot, which will not be used anymore. ++ */ ++ pitch = bitmap->pitch; ++ line = (unsigned char*)bitmap->buffer; ++ if ( pitch < 0 ) ++ line -= pitch*(height-1); ++ ++ bufBitmap = line; ++ ++ switch (font_options->subpixel_order) { ++ case CAIRO_SUBPIXEL_ORDER_DEFAULT: ++ case CAIRO_SUBPIXEL_ORDER_RGB: ++ case CAIRO_SUBPIXEL_ORDER_BGR: ++ { ++ int h; ++ ++ for ( h = height; h > 0; h--, line += pitch ) { ++ int pix[6] = { 0, 0, 0, 0, 0, 0 }; ++ unsigned char* p = line; ++ unsigned char* limit = line + width*3; ++ int nn, val, val2; ++ ++ val = p[0]; ++ for (nn = 0; nn < 3; nn++) ++ pix[2 + nn] += val * fir_filter[nn]; ++ ++ val = p[1]; ++ for (nn = 0; nn < 4; nn++) ++ pix[1 + nn] += val * fir_filter[nn]; ++ ++ p += 2; ++ ++ for ( ; p < limit; p++ ) { ++ val = p[0]; ++ for (nn = 0; nn < 5; nn++) ++ pix[nn] += val * fir_filter[nn]; ++ ++ val2 = pix[0] / 256; ++ val2 |= -(val2 >> 8); ++ p[-2] = (unsigned char)val2; ++ ++ for (nn = 0; nn < 5; nn++) ++ pix[nn] = pix[nn + 1]; ++ } ++ for (nn = 0; nn < 2; nn++ ) { ++ val2 = pix[nn] / 256; ++ val2 |= -(val2 >> 8); ++ p[nn - 2] = (unsigned char)val2; ++ } ++ } ++ } ++ break; ++ case CAIRO_SUBPIXEL_ORDER_VRGB: ++ case CAIRO_SUBPIXEL_ORDER_VBGR: ++ { ++ int w; ++ ++ for (w = 0; w < width; w++ ) { ++ int pix[6] = { 0, 0, 0, 0, 0, 0 }; ++ unsigned char* p = bufBitmap + w; ++ unsigned char* limit = bufBitmap + w + height*3*pitch; ++ int nn, val, val2; ++ ++ val = p[0]; ++ for (nn = 0; nn < 3; nn++) ++ pix[2 + nn] += val*fir_filter[nn]; ++ ++ val = p[pitch]; ++ for (nn = 0; nn < 4; nn++ ) ++ pix[1 + nn] += val * fir_filter[nn]; ++ ++ p += 2*pitch; ++ for ( ; p < limit; p += pitch ) { ++ val = p[0]; ++ for (nn = 0; nn < 5; nn++ ) ++ pix[nn] += val * fir_filter[nn]; ++ ++ val2 = pix[0] / 256; ++ val2 |= -(val2 >> 8); ++ p[-2 * pitch] = (unsigned char)val2; ++ ++ for (nn = 0; nn < 5; nn++) ++ pix[nn] = pix[nn+1]; ++ } ++ ++ for (nn = 0; nn < 2; nn++) { ++ val2 = pix[nn] / 256; ++ val2 |= -(val2 >> 8); ++ p[(nn - 2) * pitch] = (unsigned char)val2; ++ } ++ } ++ } ++ break; ++ default: /* shouldn't happen */ ++ break; ++ } ++ ++ /* now copy the resulting graymap into an ARGB32 image */ ++ { ++ unsigned char* in_line = bufBitmap; ++ unsigned char* out_line = data_rgba; ++ int h = height; ++ ++ switch (font_options->subpixel_order) { ++ case CAIRO_SUBPIXEL_ORDER_DEFAULT: ++ case CAIRO_SUBPIXEL_ORDER_RGB: ++ for ( ; h > 0; h--, in_line += pitch, out_line += stride_rgba) { ++ unsigned char* in = in_line; ++ int* out = (int*)out_line; ++ int w; ++ ++ for (w = width; w > 0; w--, in += 3, out += 1) { ++ int r = in[0]; ++ int g = in[1]; ++ int b = in[2]; ++ ++ out[0] = (g << 24) | (r << 16) | (g << 8) | b; ++ } ++ } ++ break; ++ case CAIRO_SUBPIXEL_ORDER_BGR: ++ for ( ; h > 0; h--, in_line += pitch, out_line += stride_rgba) { ++ unsigned char* in = in_line; ++ int* out = (int*)out_line; ++ int w; ++ ++ for (w = width; w > 0; w--, in += 3, out += 1) { ++ int r = in[2]; ++ int g = in[1]; ++ int b = in[0]; ++ ++ out[0] = (g << 24) | (r << 16) | (g << 8) | b; ++ } ++ } ++ break; ++ case CAIRO_SUBPIXEL_ORDER_VRGB: ++ for ( ; h > 0; h--, in_line += pitch*3, out_line += stride_rgba) { ++ unsigned char* in = in_line; ++ int* out = (int*)out_line; ++ int w; ++ ++ for (w = width; w > 0; w--, in += 1, out += 1) { ++ int r = in[0]; ++ int g = in[pitch]; ++ int b = in[pitch*2]; ++ ++ out[0] = (g << 24) | (r << 16) | (g << 8) | b; ++ } ++ } ++ break; ++ case CAIRO_SUBPIXEL_ORDER_VBGR: ++ for ( ; h > 0; h--, in_line += pitch*3, out_line += stride_rgba) { ++ unsigned char* in = in_line; ++ int* out = (int*)out_line; ++ int w; ++ ++ for (w = width; w > 0; w--, in += 1, out += 1) { ++ int r = in[2*pitch]; ++ int g = in[pitch]; ++ int b = in[0]; ++ ++ out[0] = (g << 24) | (r << 16) | (g << 8) | b; ++ } ++ } ++ break; ++ } ++ } ++ ++ if (own_buffer) ++ free (bitmap->buffer); ++ data = data_rgba; ++ stride = stride_rgba; ++ format = CAIRO_FORMAT_ARGB32; ++ subpixel = TRUE; ++ break; ++ } ++#else /* !FIR_FILTER */ ++ { + int x, y; + unsigned char *in_line, *out_line, *in; + unsigned int *out; +@@ -871,6 +1088,7 @@ _get_bitmap_surface (FT_Bitmap *bi + subpixel = TRUE; + break; + } ++#endif /* !FIR_FILTER */ + } + break; + case FT_PIXEL_MODE_GRAY2: +@@ -986,12 +1204,22 @@ _render_glyph_outline (FT_Face + matrix.xx *= 3; + hmul = 3; + subpixel = TRUE; ++#ifdef FIR_FILTER ++ cbox.xMin -= 64; ++ cbox.xMax += 64; ++ width += 2; ++#endif + break; + case CAIRO_SUBPIXEL_ORDER_VRGB: + case CAIRO_SUBPIXEL_ORDER_VBGR: + matrix.yy *= 3; + vmul = 3; + subpixel = TRUE; ++#ifdef FIR_FILTER ++ cbox.yMin -= 64; ++ cbox.yMax += 64; ++ height += 2; ++#endif + break; + } + FT_Outline_Transform (outline, &matrix); +Only in libcairo-1.2.4/src: cairo-ft-font.c.orig diff --git a/x11-libs/cairo/metadata.xml b/x11-libs/cairo/metadata.xml index 2c308436e302..10dce299b361 100644 --- a/x11-libs/cairo/metadata.xml +++ b/x11-libs/cairo/metadata.xml @@ -10,6 +10,8 @@ <email>compnerd@gentoo.org</email> </maintainer> <use> + <flag name='cleartype'>Add ClearType-style behavior for sub-pixel hinting. + Patch taken from Arch Linux</flag> <flag name='glitz'>Build with glitz support, which replaces some software render operations with Mesa OpenGL operations</flag> <flag name='opengl'>When used along with USE=glitz, enables glitz-glx usage. |