summaryrefslogtreecommitdiff
path: root/x11-libs/cairo
diff options
context:
space:
mode:
authorRené Neumann <rene.neumann@in.tum.de>2011-08-11 19:41:33 +0200
committerRené Neumann <rene.neumann@in.tum.de>2011-08-11 19:41:33 +0200
commit649ed3773a9fef8712733fbdcc9d09a5bae62f99 (patch)
tree7e44a016031820de7adb3a770c93fe26f21a826e /x11-libs/cairo
parentda28afd29226a8445a65d22865589a71e6e06488 (diff)
downloadoverlay-649ed3773a9fef8712733fbdcc9d09a5bae62f99.tar.gz
overlay-649ed3773a9fef8712733fbdcc9d09a5bae62f99.tar.bz2
overlay-649ed3773a9fef8712733fbdcc9d09a5bae62f99.zip
Patched cairo
Diffstat (limited to '')
-rw-r--r--x11-libs/cairo/Manifest8
-rw-r--r--x11-libs/cairo/cairo-1.10.2-r1.ebuild159
-rw-r--r--x11-libs/cairo/files/cairo-1.10.0-buggy_gradients.patch17
-rw-r--r--x11-libs/cairo/files/cairo-1.10.2-interix.patch36
-rw-r--r--x11-libs/cairo/files/cairo-1.2.4-lcd-cleartype-like.diff275
-rw-r--r--x11-libs/cairo/files/cairo-1.8.10-libpng14.patch11
-rw-r--r--x11-libs/cairo/files/cairo-1.8.8-interix.patch16
-rw-r--r--x11-libs/cairo/files/cairo-respect-fontconfig.patch13
8 files changed, 535 insertions, 0 deletions
diff --git a/x11-libs/cairo/Manifest b/x11-libs/cairo/Manifest
new file mode 100644
index 0000000..14afcb4
--- /dev/null
+++ b/x11-libs/cairo/Manifest
@@ -0,0 +1,8 @@
+AUX cairo-1.10.0-buggy_gradients.patch 581 RMD160 077fb7a18c2840c0d637d2161ca9d244cb69608b SHA1 45f4b6a834cb9f1c153f092fba18416d257d71c7 SHA256 3b622bb250b996ea5f5adc5c899af343e0efba5c477fa0e51fdbb720a8dd1b18
+AUX cairo-1.10.2-interix.patch 1235 RMD160 83803df650e8381649b11bd3c81dd0c6ee5f8e53 SHA1 d6b731fc8aa0c9461e62a9afc1431782d3af433b SHA256 d915d69e2eb96f6a4bef1de0c493ed9face7b5d6a79194ab9f2a7f3d85b799ea
+AUX cairo-1.2.4-lcd-cleartype-like.diff 7244 RMD160 e50d5bf17cbead688a8b808a78fe4104c09af52e SHA1 f63131fd75bb496db59e3ce6bc755bbfb70baacb SHA256 4926d20d2b6b5071a5bf9ee9a12a36fef69510ebebd717c1dab151fe650f173a
+AUX cairo-1.8.10-libpng14.patch 426 RMD160 f97e4f2d1e65e2c6a90c5fddbce66caeb4337bba SHA1 bb029f710432af7b24175aa941fc7cd3187ef767 SHA256 b090f829d3b9fb69b83bfa094552335b8382988d60ce7e46558c4069b8bca532
+AUX cairo-1.8.8-interix.patch 619 RMD160 9bb28c5a88aa1f2776d32ac7020aef4ba93872b5 SHA1 857a4d2be0118a6d2d0d80388b5963a5f768341d SHA256 505be82a1a0b7f963cb49ff85ecf1fa1389a4e43621df76b91fc1529616b2299
+AUX cairo-respect-fontconfig.patch 538 RMD160 2686a46bc6fcdc1961686bdc36bfdf91c23c507e SHA1 745a4ca5d2a84714714b4ab2907a8d06d3322e1d SHA256 1732f21adfe5ab291d987b7537b13470266253f599901a4707d27fd2b3d66734
+DIST cairo-1.10.2.tar.gz 23558405 RMD160 8c8de00120398fe2b3a60a08ff59a464b2eebf47 SHA1 ccce5ae03f99c505db97c286a0c9a90a926d3c6e SHA256 32018c7998358eebc2ad578ff8d8559d34fc80252095f110a572ed23d989fc41
+EBUILD cairo-1.10.2-r1.ebuild 4196 RMD160 d1e0700106fb6740f5f9c9d6162a21176a51d599 SHA1 393a3d739a59488c38db42e44c43d90b9d4ae52e SHA256 d15a22f0cf9b181547d682fd713c8d6293cbfdd003ecf8a982a01c9024a39ef5
diff --git a/x11-libs/cairo/cairo-1.10.2-r1.ebuild b/x11-libs/cairo/cairo-1.10.2-r1.ebuild
new file mode 100644
index 0000000..570c90a
--- /dev/null
+++ b/x11-libs/cairo/cairo-1.10.2-r1.ebuild
@@ -0,0 +1,159 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/x11-libs/cairo/cairo-1.10.2-r1.ebuild,v 1.13 2011/07/13 09:05:48 mduft Exp $
+
+EAPI=3
+
+EGIT_REPO_URI="git://anongit.freedesktop.org/git/cairo"
+[[ ${PV} == *9999 ]] && GIT_ECLASS="git"
+
+inherit eutils flag-o-matic autotools ${GIT_ECLASS}
+
+DESCRIPTION="A vector graphics library with cross-device output support"
+HOMEPAGE="http://cairographics.org/"
+[[ ${PV} == *9999 ]] || 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 ~x86-freebsd ~x86-interix ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
+IUSE="X aqua debug directfb doc drm gallium +glib opengl openvg qt4 static-libs +svg xcb"
+
+# Test causes a circular depend on gtk+... since gtk+ needs cairo but test needs gtk+ so we need to block it
+RESTRICT="test"
+
+RDEPEND="media-libs/fontconfig
+ media-libs/freetype:2
+ media-libs/libpng:0
+ sys-libs/zlib
+ >=x11-libs/pixman-0.18.4
+ directfb? ( dev-libs/DirectFB )
+ glib? ( dev-libs/glib:2 )
+ opengl? ( virtual/opengl )
+ openvg? ( media-libs/mesa[gallium] )
+ qt4? ( >=x11-libs/qt-gui-4.4:4 )
+ svg? ( dev-libs/libxml2 )
+ X? (
+ >=x11-libs/libXrender-0.6
+ x11-libs/libXext
+ x11-libs/libX11
+ x11-libs/libXft
+ drm? (
+ >=sys-fs/udev-136
+ gallium? ( media-libs/mesa[gallium] )
+ )
+ )
+ xcb? (
+ x11-libs/libxcb
+ x11-libs/xcb-util
+ )"
+DEPEND="${RDEPEND}
+ dev-util/pkgconfig
+ >=sys-devel/libtool-2
+ doc? (
+ >=dev-util/gtk-doc-1.6
+ ~app-text/docbook-xml-dtd-4.2
+ )
+ X? (
+ x11-proto/renderproto
+ drm? (
+ x11-proto/xproto
+ >=x11-proto/xextproto-7.1
+ )
+ )"
+
+src_prepare() {
+ epatch "${FILESDIR}"/${PN}-1.8.8-interix.patch
+ epatch "${FILESDIR}"/${PN}-1.10.0-buggy_gradients.patch
+ epatch "${FILESDIR}"/${P}-interix.patch
+ epatch "${FILESDIR}"/${PN}-respect-fontconfig.patch
+
+ # Slightly messed build system YAY
+ if [[ ${PV} == *9999* ]]; then
+ touch boilerplate/Makefile.am.features
+ touch src/Makefile.am.features
+ touch ChangeLog
+ fi
+
+ # We need to run elibtoolize to ensure correct so versioning on FreeBSD
+ # upgraded to an eautoreconf for the above interix patch.
+ eautoreconf
+}
+
+src_configure() {
+ local myopts
+
+ # SuperH doesn't have native atomics yet
+ use sh && myopts+=" --disable-atomic"
+
+ [[ ${CHOST} == *-interix* ]] && append-flags -D_REENTRANT
+
+ # tracing fails to compile, because Solaris' libelf doesn't do large files
+ [[ ${CHOST} == *-solaris* ]] && myopts+=" --disable-trace"
+
+ # 128-bits long arithemetic functions are missing
+ [[ ${CHOST} == powerpc*-*-darwin* ]] && filter-flags -mcpu=*
+
+ #gets rid of fbmmx.c inlining warnings
+ append-flags -finline-limit=1200
+
+ if use X; then
+ myopts+="
+ --enable-tee=yes
+ $(use_enable drm)
+ "
+
+ if use drm; then
+ myopts+="
+ $(use_enable gallium)
+ $(use_enable xcb xcb-drm)
+ "
+ else
+ use gallium && ewarn "Gallium use requires drm use enabled. So disabling for now."
+ myopts+="
+ --disable-gallium
+ --disable-xcb-drm
+ "
+ fi
+ else
+ use drm && ewarn "drm use requires X use enabled. So disabling for now."
+ myopts+="
+ --disable-drm
+ --disable-gallium
+ --disable-xcb-drm
+ "
+ fi
+
+ # --disable-xcb-lib:
+ # do not override good xlib backed by hardforcing rendering over xcb
+ econf \
+ --disable-dependency-tracking \
+ $(use_with X x) \
+ $(use_enable X xlib) \
+ $(use_enable X xlib-xrender) \
+ $(use_enable aqua quartz) \
+ $(use_enable aqua quartz-image) \
+ $(use_enable debug test-surfaces) \
+ $(use_enable directfb) \
+ $(use_enable glib gobject) \
+ $(use_enable doc gtk-doc) \
+ $(use_enable openvg vg) \
+ $(use_enable opengl gl) \
+ $(use_enable qt4 qt) \
+ $(use_enable static-libs static) \
+ $(use_enable svg) \
+ $(use_enable xcb) \
+ $(use_enable xcb xcb-shm) \
+ --enable-ft \
+ --enable-pdf \
+ --enable-png \
+ --enable-ps \
+ --disable-xlib-xcb \
+ ${myopts}
+}
+
+src_install() {
+ # parallel make install fails
+ emake -j1 DESTDIR="${D}" install || die
+ find "${ED}" -name '*.la' -exec rm -f {} +
+ dodoc AUTHORS ChangeLog NEWS README || die
+}
diff --git a/x11-libs/cairo/files/cairo-1.10.0-buggy_gradients.patch b/x11-libs/cairo/files/cairo-1.10.0-buggy_gradients.patch
new file mode 100644
index 0000000..a58c2f8
--- /dev/null
+++ b/x11-libs/cairo/files/cairo-1.10.0-buggy_gradients.patch
@@ -0,0 +1,17 @@
+http://repos.archlinux.org/wsvn/packages/cairo/trunk/cairo-1.10.0-buggy_gradients.patch
+http://bugs.gentoo.org/336696
+
+--- src/cairo-xlib-display.c
++++ src/cairo-xlib-display.c
+@@ -353,11 +353,7 @@
+ /* Prior to Render 0.10, there is no protocol support for gradients and
+ * we call function stubs instead, which would silently consume the drawing.
+ */
+-#if RENDER_MAJOR == 0 && RENDER_MINOR < 10
+ display->buggy_gradients = TRUE;
+-#else
+- display->buggy_gradients = FALSE;
+-#endif
+ display->buggy_pad_reflect = FALSE;
+ display->buggy_repeat = FALSE;
+
diff --git a/x11-libs/cairo/files/cairo-1.10.2-interix.patch b/x11-libs/cairo/files/cairo-1.10.2-interix.patch
new file mode 100644
index 0000000..3333e3e
--- /dev/null
+++ b/x11-libs/cairo/files/cairo-1.10.2-interix.patch
@@ -0,0 +1,36 @@
+commit 95f6f7a174ca096a3d3dbe84ff220d166d1e2baa
+Author: Uli Schlachter <psychon@znc.in>
+Date: Fri Oct 22 11:54:57 2010 +0200
+
+ Make both versions of _cairo_lround consistent again
+
+ Commit c0008242b0f made cairo use libm's lround instead of its own _cairo_lround
+ by default. However, since commit ce58f874 from 2006, _cairo_lround does
+ arithmetic rounding instead of away-from-zero rounding (before said commit, it
+ was using baker's rounding).
+
+ So to make the rounding of _cairo_lround be independent from
+ DISABLE_SOME_FLOATING_POINT, we have to use another function. Turns out that
+ _cairo_round already does the same thing that _cairo_lround does. Their only
+ difference is the return type.
+
+ Signed-off-by: Uli Schlachter <psychon@znc.in>
+ Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
+
+diff --git a/src/cairoint.h b/src/cairoint.h
+index 53c87e5..539d92e 100644
+--- a/src/cairoint.h
++++ b/src/cairoint.h
+@@ -968,7 +968,11 @@ _cairo_round (double r)
+ cairo_private int
+ _cairo_lround (double d) cairo_const;
+ #else
+-#define _cairo_lround lround
++static inline int cairo_const
++_cairo_lround (double r)
++{
++ return _cairo_round (r);
++}
+ #endif
+
+ cairo_private uint16_t
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 0000000..2f908b8
--- /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/files/cairo-1.8.10-libpng14.patch b/x11-libs/cairo/files/cairo-1.8.10-libpng14.patch
new file mode 100644
index 0000000..1872367
--- /dev/null
+++ b/x11-libs/cairo/files/cairo-1.8.10-libpng14.patch
@@ -0,0 +1,11 @@
+--- configure.ac
++++ configure.ac
+@@ -161,7 +161,7 @@
+ AC_ARG_VAR([png_REQUIRES], [module name for libpng to search for using pkg-config])
+ if test "x$png_REQUIRES" = x; then
+ # libpng13 is GnuWin32's libpng-1.2.8 :-(
+- for l in libpng12 libpng13 libpng10 libpng; do
++ for l in libpng14 libpng12 libpng13 libpng10 libpng; do
+ if $PKG_CONFIG --exists $l ; then
+ png_REQUIRES=$l
+ use_png=yes
diff --git a/x11-libs/cairo/files/cairo-1.8.8-interix.patch b/x11-libs/cairo/files/cairo-1.8.8-interix.patch
new file mode 100644
index 0000000..dc20714
--- /dev/null
+++ b/x11-libs/cairo/files/cairo-1.8.8-interix.patch
@@ -0,0 +1,16 @@
+diff -ru cairo-1.8.8.orig/build/configure.ac.tools cairo-1.8.8/build/configure.ac.tools
+--- cairo-1.8.8.orig/build/configure.ac.tools 2009-09-30 13:36:42 +0200
++++ cairo-1.8.8/build/configure.ac.tools 2009-09-30 13:50:50 +0200
+@@ -21,5 +21,12 @@
+ *) PKGCONFIG_REQUIRES="Requires.private"; ;;
+ esac
+
++dnl hmm... on interix, things go really bad with Requires.private, since libpng12
++dnl is missing on the final link commands, so gtk+'s configure checks for cairo
++dnl fail miserably with unresolved symbols to it.
++case "$host_os" in
++interix*) PKGCONFIG_REQUIRES="Requires" ;;
++esac
++
+ AC_SUBST(PKGCONFIG_REQUIRES)
+
diff --git a/x11-libs/cairo/files/cairo-respect-fontconfig.patch b/x11-libs/cairo/files/cairo-respect-fontconfig.patch
new file mode 100644
index 0000000..b0a1b29
--- /dev/null
+++ b/x11-libs/cairo/files/cairo-respect-fontconfig.patch
@@ -0,0 +1,13 @@
+--- cairo-1.7.6-orig/src/cairo-ft-font.c 2008-09-29 21:43:13.000000000 +0100
++++ cairo-1.7.6/src/cairo-ft-font.c 2008-09-29 21:52:19.000000000 +0100
+@@ -1705,7 +1705,9 @@
+ options->base.subpixel_order = other->base.subpixel_order;
+ }
+
+- if (options->base.hint_style == CAIRO_HINT_STYLE_DEFAULT)
++ options->base.hint_style = CAIRO_HINT_STYLE_DEFAULT;
++
++ if (other->base.hint_style != CAIRO_HINT_STYLE_DEFAULT)
+ options->base.hint_style = other->base.hint_style;
+
+ if (other->base.hint_style == CAIRO_HINT_STYLE_NONE)