[Frugalware-git] frugalware-current: libxft-2.3.0-1-i686

Michel Hermier hermier at frugalware.org
Sun Apr 15 10:42:11 CEST 2012


Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=frugalware-current.git;a=commitdiff;h=3c49380e6e2f05a762d5c6872811202d623d7d57

commit 3c49380e6e2f05a762d5c6872811202d623d7d57
Author: Michel Hermier <hermier at frugalware.org>
Date:   Sun Mar 11 13:46:25 2012 +0100

libxft-2.3.0-1-i686

* Bump version.

diff --git a/source/x11/libxft/FrugalBuild b/source/x11/libxft/FrugalBuild
index 5ad2e7c..812626f 100644
--- a/source/x11/libxft/FrugalBuild
+++ b/source/x11/libxft/FrugalBuild
@@ -3,15 +3,14 @@

pkgname=libxft
_F_xorg_name=libXft
-pkgver=2.2.0
-pkgrel=2
+pkgver=2.3.0
+pkgrel=1
pkgdesc="X FreeType library"
groups=('x11' 'xorg-core' 'xorg-libs')
archs=('i686' 'x86_64' 'arm')
depends=('libx11>=1.3' 'libxext>=1.0.5-3' 'libxrender>=0.9.4-3' 'freetype2>=2.3.8-2' 'fontconfig')
makedepends=('pkgconfig' 'xproto>=7.0.15' 'inputproto>=2.0')
Finclude xorg
-source=(${source[@]} $pkgname-lcd-filter.patch)
-sha1sums=('ed29784259f4e26df78141035560ae8a7c62e83f' \
-          '88568c36de379f8aad959840750181c1246d35ad')
+sha1sums=('687f38a810b9ae58e1169c295d9d438370235e23')
+
# optimization OK
diff --git a/source/x11/libxft/libxft-lcd-filter.patch b/source/x11/libxft/libxft-lcd-filter.patch
deleted file mode 100644
index 21bc40c..0000000
--- a/source/x11/libxft/libxft-lcd-filter.patch
+++ /dev/null
@@ -1,851 +0,0 @@
-Index: xft/src/xftdpy.c
-===================================================================
---- xft.orig/src/xftdpy.c	2009-12-04 15:42:00.000000000 +0200
-+++ xft/src/xftdpy.c	2009-12-04 15:47:57.000000000 +0200
-@@ -369,6 +369,10 @@
- 	goto bail1;
-     if (!_XftDefaultInitInteger (dpy, pat, FC_RGBA))
- 	goto bail1;
-+#ifdef FC_LCD_FILTER
-+    if (!_XftDefaultInitInteger (dpy, pat, FC_LCD_FILTER))
-+	goto bail1;
-+#endif
-     if (!_XftDefaultInitBool (dpy, pat, FC_ANTIALIAS))
- 	goto bail1;
- #ifdef FC_EMBOLDEN
-@@ -521,6 +525,14 @@
- 			      XftDefaultGetInteger (dpy, FC_RGBA, screen,
- 						    subpixel));
-     }
-+#ifdef FC_LCD_FILTER
-+    if (FcPatternGet (pattern, FC_LCD_FILTER, 0, &v) == FcResultNoMatch)
-+    {
-+	FcPatternAddInteger (pattern, FC_LCD_FILTER,
-+			     XftDefaultGetInteger (dpy, FC_LCD_FILTER, screen,
-+						   FC_LCD_DEFAULT));
-+    }
-+#endif
-     if (FcPatternGet (pattern, FC_MINSPACE, 0, &v) == FcResultNoMatch)
-     {
- 	FcPatternAddBool (pattern, FC_MINSPACE,
-Index: xft/src/xftfreetype.c
-===================================================================
---- xft.orig/src/xftfreetype.c	2009-12-04 15:42:00.000000000 +0200
-+++ xft/src/xftfreetype.c	2009-12-04 15:47:57.000000000 +0200
-@@ -469,6 +469,21 @@
- 	goto bail1;
-     }
-
-+#ifdef FC_LCD_FILTER
-+    /*
-+     * Get lcd_filter value
-+     */
-+    switch (FcPatternGetInteger (pattern, FC_LCD_FILTER, 0, &fi->lcd_filter)) {
-+    case FcResultNoMatch:
-+	fi->lcd_filter = FC_LCD_DEFAULT;
-+	break;
-+    case FcResultMatch:
-+	break;
-+    default:
-+	goto bail1;
-+    }
-+#endif
-+
-     /*
-      * Get matrix and transform values
-      */
-Index: xft/src/xftglyphs.c
-===================================================================
---- xft.orig/src/xftglyphs.c	2009-12-04 15:42:00.000000000 +0200
-+++ xft/src/xftglyphs.c	2009-12-04 15:59:38.000000000 +0200
-@@ -21,27 +21,18 @@
-  */
-
- #include "xftint.h"
--#include <freetype/ftoutln.h>
-
- #if HAVE_FT_GLYPHSLOT_EMBOLDEN
- #include <freetype/ftsynth.h>
- #endif
-
--static const int    filters[3][3] = {
--    /* red */
--#if 0
--{    65538*4/7,65538*2/7,65538*1/7 },
--    /* green */
--{    65536*1/4, 65536*2/4, 65537*1/4 },
--    /* blue */
--{    65538*1/7,65538*2/7,65538*4/7 },
-+#if FREETYPE_MAJOR*10000 + FREETYPE_MINOR*100 + FREETYPE_PATCH < 20202
-+#  error  "FreeType 2.2.2 or later required to compile this version of libXft"
- #endif
--{    65538*9/13,65538*3/13,65538*1/13 },
--    /* green */
--{    65538*1/6, 65538*4/6, 65538*1/6 },
--    /* blue */
--{    65538*1/13,65538*3/13,65538*9/13 },
--};
-+
-+#include FT_OUTLINE_H
-+#include FT_LCD_FILTER_H
-+#include FT_SYNTHESIS_H
-
- /*
-  * Validate the memory info for a font
-@@ -69,6 +60,295 @@
- 		font->glyph_memory, glyph_memory);
- }
-
-+
-+/* we sometimes need to convert the glyph bitmap in a FT_GlyphSlot
-+ * into a different format. For example, we want to convert a
-+ * FT_PIXEL_MODE_LCD or FT_PIXEL_MODE_LCD_V bitmap into a 32-bit
-+ * ARGB or ABGR bitmap.
-+ *
-+ * this function prepares a target descriptor for this operation.
-+ *
-+ * input :: target bitmap descriptor. The function will set its
-+ *          'width', 'rows' and 'pitch' fields, and only these
-+ *
-+ * slot  :: the glyph slot containing the source bitmap. this
-+ *          function assumes that slot->format == FT_GLYPH_FORMAT_BITMAP
-+ *
-+ * mode  :: the requested final rendering mode. supported values are
-+ *          MONO, NORMAL (i.e. gray), LCD and LCD_V
-+ *
-+ * the function returns the size in bytes of the corresponding buffer,
-+ * it's up to the caller to allocate the corresponding memory block
-+ * before calling _fill_xrender_bitmap
-+ *
-+ * it also returns -1 in case of error (e.g. incompatible arguments,
-+ * like trying to convert a gray bitmap into a monochrome one)
-+ */
-+static int
-+_compute_xrender_bitmap_size( FT_Bitmap*      target,
-+                              FT_GlyphSlot    slot,
-+                              FT_Render_Mode  mode )
-+{
-+    FT_Bitmap*  ftbit;
-+    int         width, height, pitch;
-+
-+    if ( slot->format != FT_GLYPH_FORMAT_BITMAP )
-+        return -1;
-+
-+    // compute the size of the final bitmap
-+    ftbit  = &slot->bitmap;
-+
-+    width  = ftbit->width;
-+    height = ftbit->rows;
-+    pitch  = (width+3) & ~3;
-+
-+    switch ( ftbit->pixel_mode )
-+    {
-+    case FT_PIXEL_MODE_MONO:
-+        if ( mode == FT_RENDER_MODE_MONO )
-+        {
-+            pitch = (((width+31) & ~31) >> 3);
-+            break;
-+        }
-+        /* fall-through */
-+
-+    case FT_PIXEL_MODE_GRAY:
-+        if ( mode == FT_RENDER_MODE_LCD   ||
-+             mode == FT_RENDER_MODE_LCD_V )
-+        {
-+          /* each pixel is replicated into a 32-bit ARGB value */
-+          pitch = width*4;
-+        }
-+        break;
-+
-+    case FT_PIXEL_MODE_LCD:
-+        if ( mode != FT_RENDER_MODE_LCD )
-+            return -1;
-+
-+        /* horz pixel triplets are packed into 32-bit ARGB values */
-+        width   /= 3;
-+        pitch    = width*4;
-+        break;
-+
-+    case FT_PIXEL_MODE_LCD_V:
-+        if ( mode != FT_RENDER_MODE_LCD_V )
-+            return -1;
-+
-+        /* vert pixel triplets are packed into 32-bit ARGB values */
-+        height  /= 3;
-+        pitch    = width*4;
-+        break;
-+
-+    default:  /* unsupported source format */
-+        return -1;
-+    }
-+
-+    target->width  = width;
-+    target->rows   = height;
-+    target->pitch  = pitch;
-+    target->buffer = NULL;
-+
-+    return pitch * height;
-+}
-+
-+/* this functions converts the glyph bitmap found in a FT_GlyphSlot
-+ * into a different format (see _compute_xrender_bitmap_size)
-+ *
-+ * you should call this function after _compute_xrender_bitmap_size
-+ *
-+ * target :: target bitmap descriptor. Note that its 'buffer' pointer
-+ *           must point to memory allocated by the caller
-+ *
-+ * slot   :: the glyph slot containing the source bitmap
-+ *
-+ * mode   :: the requested final rendering mode
-+ *
-+ * bgr    :: boolean, set if BGR or VBGR pixel ordering is needed
-+ */
-+static void
-+_fill_xrender_bitmap( FT_Bitmap*      target,
-+                      FT_GlyphSlot    slot,
-+                      FT_Render_Mode  mode,
-+                      int             bgr )
-+{
-+    FT_Bitmap*   ftbit = &slot->bitmap;
-+
-+    {
-+        unsigned char*   srcLine   = ftbit->buffer;
-+        unsigned char*   dstLine   = target->buffer;
-+        int              src_pitch = ftbit->pitch;
-+        int              width     = target->width;
-+        int              height    = target->rows;
-+        int              pitch     = target->pitch;
-+        int              subpixel;
-+        int              h;
-+
-+        subpixel = ( mode == FT_RENDER_MODE_LCD ||
-+                     mode == FT_RENDER_MODE_LCD_V );
-+
-+        if ( src_pitch < 0 )
-+          srcLine -= src_pitch*(ftbit->rows-1);
-+
-+        switch ( ftbit->pixel_mode )
-+        {
-+        case FT_PIXEL_MODE_MONO:
-+            if ( subpixel )  /* convert mono to ARGB32 values */
-+            {
-+                for ( h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch )
-+                {
-+                    int  x;
-+
-+                    for ( x = 0; x < width; x++ )
-+                    {
-+                        if ( srcLine[(x >> 3)] & (0x80 >> (x & 7)) )
-+                            ((unsigned int*)dstLine)[x] = 0xffffffffU;
-+                    }
-+                }
-+            }
-+            else if ( mode == FT_RENDER_MODE_NORMAL )  /* convert mono to 8-bit gray */
-+            {
-+                for ( h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch )
-+                {
-+                    int  x;
-+
-+                    for ( x = 0; x < width; x++ )
-+                    {
-+                        if ( srcLine[(x >> 3)] & (0x80 >> (x & 7)) )
-+                            dstLine[x] = 0xff;
-+                    }
-+                }
-+            }
-+            else  /* copy mono to mono */
-+            {
-+                int  bytes = (width+7) >> 3;
-+
-+                for ( h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch )
-+                    memcpy( dstLine, srcLine, bytes );
-+            }
-+            break;
-+
-+        case FT_PIXEL_MODE_GRAY:
-+            if ( subpixel )  /* convert gray to ARGB32 values */
-+            {
-+                for ( h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch )
-+                {
-+                    int            x;
-+                    unsigned int*  dst = (unsigned int*)dstLine;
-+
-+                    for ( x = 0; x < width; x++ )
-+                    {
-+                        unsigned int  pix = srcLine[x];
-+
-+                        pix |= (pix << 8);
-+                        pix |= (pix << 16);
-+
-+                        dst[x] = pix;
-+                    }
-+                }
-+            }
-+            else  /* copy gray into gray */
-+            {
-+                for ( h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch )
-+                    memcpy( dstLine, srcLine, width );
-+            }
-+            break;
-+
-+        case FT_PIXEL_MODE_LCD:
-+            if ( !bgr )
-+            {
-+                /* convert horizontal RGB into ARGB32 */
-+                for ( h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch )
-+                {
-+                    int            x;
-+                    unsigned char* src = srcLine;
-+                    unsigned int*  dst = (unsigned int*)dstLine;
-+
-+                    for ( x = 0; x < width; x++, src += 3 )
-+                    {
-+                        unsigned int  pix;
-+
-+                        pix = ((unsigned int)src[0] << 16) |
-+                              ((unsigned int)src[1] <<  8) |
-+                              ((unsigned int)src[2]      ) |
-+                              ((unsigned int)src[1] << 24) ;
-+
-+                        dst[x] = pix;
-+                    }
-+                }
-+            }
-+            else
-+            {
-+                /* convert horizontal BGR into ARGB32 */
-+                for ( h = height; h > 0; h--, srcLine += src_pitch, dstLine += pitch )
-+                {
-+                    int            x;
-+                    unsigned char* src = srcLine;
-+                    unsigned int*  dst = (unsigned int*)dstLine;
-+
-+                    for ( x = 0; x < width; x++, src += 3 )
-+                    {
-+                        unsigned int  pix;
-+
-+                        pix = ((unsigned int)src[2] << 16) |
-+                              ((unsigned int)src[1] <<  8) |
-+                              ((unsigned int)src[0]      ) |
-+                              ((unsigned int)src[1] << 24) ;
-+
-+                        dst[x] = pix;
-+                    }
-+                }
-+            }
-+            break;
-+
-+        default:  /* FT_PIXEL_MODE_LCD_V */
-+            /* convert vertical RGB into ARGB32 */
-+            if ( !bgr )
-+            {
-+                for ( h = height; h > 0; h--, srcLine += 3*src_pitch, dstLine += pitch )
-+                {
-+                    int            x;
-+                    unsigned char* src = srcLine;
-+                    unsigned int*  dst = (unsigned int*)dstLine;
-+
-+                    for ( x = 0; x < width; x++, src += 1 )
-+                    {
-+                        unsigned int  pix;
-+
-+                        pix = ((unsigned int)src[0]           << 16) |
-+                              ((unsigned int)src[src_pitch]   <<  8) |
-+                              ((unsigned int)src[src_pitch*2]      ) |
-+                              ((unsigned int)src[src_pitch]   << 24) ;
-+
-+                        dst[x] = pix;
-+                    }
-+                }
-+            }
-+            else
-+            {
-+                for ( h = height; h > 0; h--, srcLine += 3*src_pitch, dstLine += pitch )
-+                {
-+                    int            x;
-+                    unsigned char* src = srcLine;
-+                    unsigned int*  dst = (unsigned int*)dstLine;
-+
-+                    for ( x = 0; x < width; x++, src += 1 )
-+                    {
-+                        unsigned int  pix;
-+
-+                        pix = ((unsigned int)src[src_pitch*2] << 16) |
-+                              ((unsigned int)src[src_pitch]   <<  8) |
-+                              ((unsigned int)src[0]                ) |
-+                              ((unsigned int)src[src_pitch]   << 24) ;
-+
-+                        dst[x] = pix;
-+                    }
-+                }
-+            }
-+        }
-+    }
-+}
-+
-+
- _X_EXPORT void
- XftFontLoadGlyphs (Display	    *dpy,
- 		   XftFont	    *pub,
-@@ -87,20 +367,14 @@
-     unsigned char   *bufBitmap = bufLocal;
-     int		    bufSize = sizeof (bufLocal);
-     int		    size, pitch;
--    unsigned char   bufLocalRgba[4096];
--    unsigned char   *bufBitmapRgba = bufLocalRgba;
--    int		    bufSizeRgba = sizeof (bufLocalRgba);
--    int		    sizergba, pitchrgba, widthrgba;
-     int		    width;
-     int		    height;
-     int		    left, right, top, bottom;
--    int		    hmul = 1;
--    int		    vmul = 1;
--    FT_Bitmap	    ftbit;
--    FT_Matrix	    matrix;
-+    FT_Bitmap*	    ftbit;
-+    FT_Bitmap       local;
-     FT_Vector	    vector;
--    Bool	    subpixel = False;
-     FT_Face	    face;
-+    FT_Render_Mode  mode = FT_RENDER_MODE_MONO;
-
-     if (!info)
- 	return;
-@@ -110,24 +384,19 @@
-     if (!face)
- 	return;
-
--    matrix.xx = matrix.yy = 0x10000L;
--    matrix.xy = matrix.yx = 0;
--
-     if (font->info.antialias)
-     {
- 	switch (font->info.rgba) {
- 	case FC_RGBA_RGB:
- 	case FC_RGBA_BGR:
--	    matrix.xx *= 3;
--	    subpixel = True;
--	    hmul = 3;
-+	    mode = FT_RENDER_MODE_LCD;
- 	    break;
- 	case FC_RGBA_VRGB:
- 	case FC_RGBA_VBGR:
--	    matrix.yy *= 3;
--	    vmul = 3;
--	    subpixel = True;
-+            mode = FT_RENDER_MODE_LCD_V;
- 	    break;
-+        default:
-+            mode = FT_RENDER_MODE_NORMAL;
- 	}
-     }
-
-@@ -148,7 +417,10 @@
- 	if (xftg->glyph_memory)
- 	    continue;
-
-+        FT_Library_SetLcdFilter( _XftFTlibrary, font->info.lcd_filter);
-+
- 	error = FT_Load_Glyph (face, glyphindex, font->info.load_flags);
-+
- 	if (error)
- 	{
- 	    /*
-@@ -181,7 +453,7 @@
- 	/*
- 	 * Compute glyph metrics from FreeType information
- 	 */
--	if(font->info.transform && glyphslot->format != ft_glyph_format_bitmap)
-+	if(font->info.transform && glyphslot->format != FT_GLYPH_FORMAT_BITMAP)
- 	{
- 	    /*
- 	     * calculate the true width by transforming all four corners.
-@@ -260,17 +532,14 @@
- 	    }
- 	}
-
--	if (font->info.antialias)
--	    pitch = (width * hmul + 3) & ~3;
--	else
--	    pitch = ((width + 31) & ~31) >> 3;
--
--	size = pitch * height * vmul;
-+        if ( glyphslot->format != FT_GLYPH_FORMAT_BITMAP )
-+        {
-+            error = FT_Render_Glyph( face->glyph, mode );
-+            if (error)
-+                continue;
-+        }
-
--	xftg->metrics.width = width;
--	xftg->metrics.height = height;
--	xftg->metrics.x = -TRUNC(left);
--	xftg->metrics.y = TRUNC(top);
-+        FT_Library_SetLcdFilter( _XftFTlibrary, FT_LCD_FILTER_NONE );
-
- 	if (font->info.spacing >= FC_MONO)
- 	{
-@@ -310,103 +579,13 @@
- 	    xftg->metrics.yOff = -TRUNC(ROUND(glyphslot->advance.y));
- 	}
-
--	/*
--	 * If the glyph is relatively large (> 1% of server memory),
--	 * don't send it until necessary
--	 */
--	if (!need_bitmaps && size > info->max_glyph_memory / 100)
--	    continue;
-
--	/*
--	 * Make sure there's enough buffer space for the glyph
--	 */
--	if (size > bufSize)
--	{
--	    if (bufBitmap != bufLocal)
--		free (bufBitmap);
--	    bufBitmap = (unsigned char *) malloc (size);
--	    if (!bufBitmap)
--		continue;
--	    bufSize = size;
--	}
--	memset (bufBitmap, 0, size);
-+        // compute the size of the final bitmap
-+        ftbit  = &glyphslot->bitmap;
-
--	/*
--	 * Rasterize into the local buffer
--	 */
--	switch (glyphslot->format) {
--	case ft_glyph_format_outline:
--	    ftbit.width      = width * hmul;
--	    ftbit.rows       = height * vmul;
--	    ftbit.pitch      = pitch;
--	    if (font->info.antialias)
--		ftbit.pixel_mode = ft_pixel_mode_grays;
--	    else
--		ftbit.pixel_mode = ft_pixel_mode_mono;
--
--	    ftbit.buffer     = bufBitmap;
--
--	    if (subpixel)
--		FT_Outline_Transform (&glyphslot->outline, &matrix);
--
--	    FT_Outline_Translate ( &glyphslot->outline, -left*hmul, -bottom*vmul );
--
--	    FT_Outline_Get_Bitmap( _XftFTlibrary, &glyphslot->outline, &ftbit );
--	    break;
--	case ft_glyph_format_bitmap:
--	    if (font->info.antialias)
--	    {
--		unsigned char	*srcLine, *dstLine;
--		int		height;
--		int		x;
--		int	    h, v;
--
--		srcLine = glyphslot->bitmap.buffer;
--		dstLine = bufBitmap;
--		height = glyphslot->bitmap.rows;
--		while (height--)
--		{
--		    for (x = 0; x < glyphslot->bitmap.width; x++)
--		    {
--			/* always MSB bitmaps */
--			unsigned char	a = ((srcLine[x >> 3] & (0x80 >> (x & 7))) ?
--					     0xff : 0x00);
--			if (subpixel)
--			{
--			    for (v = 0; v < vmul; v++)
--				for (h = 0; h < hmul; h++)
--				    dstLine[v * pitch + x*hmul + h] = a;
--			}
--			else
--			    dstLine[x] = a;
--		    }
--		    dstLine += pitch * vmul;
--		    srcLine += glyphslot->bitmap.pitch;
--		}
--	    }
--	    else
--	    {
--		unsigned char	*srcLine, *dstLine;
--		int		h, bytes;
--
--		srcLine = glyphslot->bitmap.buffer;
--		dstLine = bufBitmap;
--		h = glyphslot->bitmap.rows;
--		bytes = (glyphslot->bitmap.width + 7) >> 3;
--		while (h--)
--		{
--		    memcpy (dstLine, srcLine, bytes);
--		    dstLine += pitch;
--		    srcLine += glyphslot->bitmap.pitch;
--		}
--	    }
--	    break;
--	default:
--	    if (XftDebug() & XFT_DBG_GLYPH)
--		printf ("glyph %d is not in a usable format\n",
--			(int) glyphindex);
--	    continue;
--	}
-+        width  = ftbit->width;
-+        height = ftbit->rows;
-+        pitch  = (width+3) & ~3;
-
- 	if (XftDebug() & XFT_DBG_GLYPH)
- 	{
-@@ -423,29 +602,72 @@
- 		int		x, y;
- 		unsigned char	*line;
-
--		line = bufBitmap;
--		for (y = 0; y < height * vmul; y++)
-+                line = ftbit->buffer;
-+
-+                if (ftbit->pitch < 0)
-+                  line -= ftbit->pitch*(height-1);
-+
-+                for (y = 0; y < height; y++)
- 		{
- 		    if (font->info.antialias)
- 		    {
--			static char    den[] = { " .:;=+*#" };
--			for (x = 0; x < pitch; x++)
-+                        static const char    den[] = { " .:;=+*#" };
-+                        for (x = 0; x < width; x++)
- 			    printf ("%c", den[line[x] >> 5]);
- 		    }
- 		    else
- 		    {
--			for (x = 0; x < pitch * 8; x++)
-+                        for (x = 0; x < width * 8; x++)
- 			{
- 			    printf ("%c", line[x>>3] & (1 << (x & 7)) ? '#' : ' ');
- 			}
- 		    }
- 		    printf ("|\n");
--		    line += pitch;
-+                    line += ftbit->pitch;
- 		}
- 		printf ("\n");
- 	    }
- 	}
-
-+        size = _compute_xrender_bitmap_size( &local, glyphslot, mode );
-+        if ( size < 0 )
-+            continue;
-+
-+        xftg->metrics.width  = local.width;
-+	xftg->metrics.height = local.rows;
-+	xftg->metrics.x      = - glyphslot->bitmap_left;
-+	xftg->metrics.y      =   glyphslot->bitmap_top;
-+
-+	    /*
-+	 * If the glyph is relatively large (> 1% of server memory),
-+	 * don't send it until necessary
-+	     */
-+	if (!need_bitmaps && size > info->max_glyph_memory / 100)
-+	    continue;
-+
-+	/*
-+	 * Make sure there's enough buffer space for the glyph
-+	 */
-+	if (size > bufSize)
-+	    {
-+	    if (bufBitmap != bufLocal)
-+		free (bufBitmap);
-+	    bufBitmap = (unsigned char *) malloc (size);
-+	    if (!bufBitmap)
-+		    continue;
-+	    bufSize = size;
-+	    }
-+	memset (bufBitmap, 0, size);
-+
-+        local.buffer = bufBitmap;
-+
-+        _fill_xrender_bitmap( &local, glyphslot, mode,
-+                              (font->info.rgba == FC_RGBA_BGR  ||
-+                               font->info.rgba == FC_RGBA_VBGR ) );
-+	/*
-+	 * Copy or convert into local buffer
-+	 */
-+
- 	/*
- 	 * Use the glyph index as the wire encoding; it
- 	 * might be more efficient for some locales to map
-@@ -455,121 +677,23 @@
- 	 */
- 	glyph = (Glyph) glyphindex;
-
--	if (subpixel)
--	{
--	    int		    x, y;
--	    unsigned char   *in_line, *out_line, *in;
--	    unsigned int    *out;
--	    unsigned int    red, green, blue;
--	    int		    rf, gf, bf;
--	    int		    s;
--	    int		    o, os;
--
--	    /*
--	     * Filter the glyph to soften the color fringes
--	     */
--	    widthrgba = width;
--	    pitchrgba = (widthrgba * 4 + 3) & ~3;
--	    sizergba = pitchrgba * height;
--
--	    os = 1;
--	    switch (font->info.rgba) {
--	    case FC_RGBA_VRGB:
--		os = pitch;
--	    case FC_RGBA_RGB:
--	    default:
--		rf = 0;
--		gf = 1;
--		bf = 2;
--		break;
--	    case FC_RGBA_VBGR:
--		os = pitch;
--	    case FC_RGBA_BGR:
--		bf = 0;
--		gf = 1;
--		rf = 2;
--		break;
--	    }
--	    if (sizergba > bufSizeRgba)
--	    {
--		if (bufBitmapRgba != bufLocalRgba)
--		    free (bufBitmapRgba);
--		bufBitmapRgba = (unsigned char *) malloc (sizergba);
--		if (!bufBitmapRgba)
--		    continue;
--		bufSizeRgba = sizergba;
--	    }
--	    memset (bufBitmapRgba, 0, sizergba);
--	    in_line = bufBitmap;
--	    out_line = bufBitmapRgba;
--	    for (y = 0; y < height; y++)
--	    {
--		in = in_line;
--		out = (unsigned int *) out_line;
--		in_line += pitch * vmul;
--		out_line += pitchrgba;
--		for (x = 0; x < width * hmul; x += hmul)
--		{
--		    red = green = blue = 0;
--		    o = 0;
--		    for (s = 0; s < 3; s++)
--		    {
--			red += filters[rf][s]*in[x+o];
--			green += filters[gf][s]*in[x+o];
--			blue += filters[bf][s]*in[x+o];
--			o += os;
--		    }
--		    red = red / 65536;
--		    green = green / 65536;
--		    blue = blue / 65536;
--		    *out++ = (green << 24) | (red << 16) | (green << 8) | blue;
--		}
--	    }
--
--	    xftg->glyph_memory = sizergba + sizeof (XftGlyph);
--	    if (font->format)
-+	xftg->glyph_memory = size + sizeof (XftGlyph);
-+ 	    if (font->format)
- 	    {
- 		if (!font->glyphset)
- 		    font->glyphset = XRenderCreateGlyphSet (dpy, font->format);
--		if (ImageByteOrder (dpy) != XftNativeByteOrder ())
--		    XftSwapCARD32 ((CARD32 *) bufBitmapRgba, sizergba >> 2);
--		XRenderAddGlyphs (dpy, font->glyphset, &glyph,
--				  &xftg->metrics, 1,
--				  (char *) bufBitmapRgba, sizergba);
--	    }
--	    else
--	    {
--		if (sizergba)
--		{
--		    xftg->bitmap = malloc (sizergba);
--		    if (xftg->bitmap)
--			memcpy (xftg->bitmap, bufBitmapRgba, sizergba);
--		}
--		else
--		    xftg->bitmap = NULL;
--	    }
--	}
--	else
--	{
--	    xftg->glyph_memory = size + sizeof (XftGlyph);
--	    if (font->format)
--	    {
--		/*
--		 * swap bit order around; FreeType is always MSBFirst
--		 */
--		if (!font->info.antialias)
-+	    if ( mode == FT_RENDER_MODE_MONO )
- 		{
-+		  /* swap bits in each byte */
- 		    if (BitmapBitOrder (dpy) != MSBFirst)
- 		    {
--			unsigned char   *line;
--			unsigned char   c;
--			int		    i;
-+		      unsigned char   *line = (unsigned char*)bufBitmap;
-+		      int             i = size;
-
--			line = (unsigned char *) bufBitmap;
--			i = size;
- 			while (i--)
- 			{
--			    c = *line;
-+			  int  c = *line;
-+
- 			    c = ((c << 1) & 0xaa) | ((c >> 1) & 0x55);
- 			    c = ((c << 2) & 0xcc) | ((c >> 2) & 0x33);
- 			    c = ((c << 4) & 0xf0) | ((c >> 4) & 0x0f);
-@@ -577,8 +701,12 @@
- 			}
- 		    }
- 		}
--		if (!font->glyphset)
--		    font->glyphset = XRenderCreateGlyphSet (dpy, font->format);
-+            else if ( mode != FT_RENDER_MODE_NORMAL )
-+            {
-+                /* invert ARGB <=> BGRA */
-+                if (ImageByteOrder (dpy) != XftNativeByteOrder ())
-+                    XftSwapCARD32 ((CARD32 *) bufBitmap, size >> 2);
-+            }
- 		XRenderAddGlyphs (dpy, font->glyphset, &glyph,
- 				  &xftg->metrics, 1,
- 				  (char *) bufBitmap, size);
-@@ -594,7 +722,7 @@
- 		else
- 		    xftg->bitmap = NULL;
- 	    }
--	}
-+
- 	font->glyph_memory += xftg->glyph_memory;
- 	info->glyph_memory += xftg->glyph_memory;
- 	if (XftDebug() & XFT_DBG_CACHE)
-@@ -605,8 +733,6 @@
-     }
-     if (bufBitmap != bufLocal)
- 	free (bufBitmap);
--    if (bufBitmapRgba != bufLocalRgba)
--	free (bufBitmapRgba);
-     XftUnlockFace (&font->public);
- }
-
-Index: xft/src/xftint.h
-===================================================================
---- xft.orig/src/xftint.h	2009-12-04 15:42:00.000000000 +0200
-+++ xft/src/xftint.h	2009-12-04 15:47:57.000000000 +0200
-@@ -145,6 +145,7 @@
-     FcBool		antialias;	/* doing antialiasing */
-     FcBool		embolden;	/* force emboldening */
-     int			rgba;		/* subpixel order */
-+    int			lcd_filter;	/* lcd filter */
-     FT_Matrix		matrix;		/* glyph transformation matrix */
-     FcBool		transform;	/* non-identify matrix? */
-     FT_Int		load_flags;	/* glyph load flags */


More information about the Frugalware-git mailing list