Git-Url: http://git.frugalware.org/gitweb/gitweb.cgi?p=xorgtesting.git;a=commitdiff;h=6c42f1e5cce22766f6dd30c9e7f0acb0a0dd6625
commit 6c42f1e5cce22766f6dd30c9e7f0acb0a0dd6625 Author: Michel Hermier <[email protected]> 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 5783766..7370d9a9 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' 'ppc' '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 */ _______________________________________________ Frugalware-git mailing list [email protected] http://frugalware.org/mailman/listinfo/frugalware-git
