[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