summaryrefslogtreecommitdiff
path: root/x11-libs/cairo/files/cairo-1.2.4-lcd-cleartype-like.diff
diff options
context:
space:
mode:
Diffstat (limited to 'x11-libs/cairo/files/cairo-1.2.4-lcd-cleartype-like.diff')
-rw-r--r--x11-libs/cairo/files/cairo-1.2.4-lcd-cleartype-like.diff275
1 files changed, 275 insertions, 0 deletions
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