gfx/cairo/dwrite-glyph-extents.patch

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/gfx/cairo/dwrite-glyph-extents.patch	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,44 @@
     1.4 +diff --git a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp
     1.5 +--- a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp
     1.6 ++++ b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp
     1.7 +@@ -582,22 +582,37 @@ _cairo_dwrite_scaled_font_init_glyph_met
     1.8 +     DWRITE_FONT_METRICS fontMetrics;
     1.9 +     font_face->dwriteface->GetMetrics(&fontMetrics);
    1.10 +     HRESULT hr = font_face->dwriteface->GetDesignGlyphMetrics(&charIndex, 1, &metrics);
    1.11 +     if (FAILED(hr)) {
    1.12 + 	return CAIRO_INT_STATUS_UNSUPPORTED;
    1.13 +     }
    1.14 + 
    1.15 +     // TODO: Treat swap_xy.
    1.16 +-    extents.width = (FLOAT)(metrics.advanceWidth - metrics.leftSideBearing - metrics.rightSideBearing) / fontMetrics.designUnitsPerEm;
    1.17 +-    extents.height = (FLOAT)(metrics.advanceHeight - metrics.topSideBearing - metrics.bottomSideBearing) / fontMetrics.designUnitsPerEm;
    1.18 ++    extents.width = (FLOAT)(metrics.advanceWidth - metrics.leftSideBearing - metrics.rightSideBearing) /
    1.19 ++        fontMetrics.designUnitsPerEm;
    1.20 ++    extents.height = (FLOAT)(metrics.advanceHeight - metrics.topSideBearing - metrics.bottomSideBearing) /
    1.21 ++        fontMetrics.designUnitsPerEm;
    1.22 +     extents.x_advance = (FLOAT)metrics.advanceWidth / fontMetrics.designUnitsPerEm;
    1.23 +     extents.x_bearing = (FLOAT)metrics.leftSideBearing / fontMetrics.designUnitsPerEm;
    1.24 +     extents.y_advance = 0.0;
    1.25 +-    extents.y_bearing = (FLOAT)(metrics.topSideBearing - metrics.verticalOriginY) / fontMetrics.designUnitsPerEm;
    1.26 ++    extents.y_bearing = (FLOAT)(metrics.topSideBearing - metrics.verticalOriginY) /
    1.27 ++        fontMetrics.designUnitsPerEm;
    1.28 ++
    1.29 ++    // We pad the extents here because GetDesignGlyphMetrics returns "ideal" metrics
    1.30 ++    // for the glyph outline, without accounting for hinting/gridfitting/antialiasing,
    1.31 ++    // and therefore it does not always cover all pixels that will actually be touched.
    1.32 ++    if (scaled_font->base.options.antialias != CAIRO_ANTIALIAS_NONE &&
    1.33 ++        extents.width > 0 && extents.height > 0) {
    1.34 ++        extents.width += scaled_font->mat_inverse.xx * 2;
    1.35 ++        extents.x_bearing -= scaled_font->mat_inverse.xx;
    1.36 ++        extents.height += scaled_font->mat_inverse.yy * 2;
    1.37 ++        extents.y_bearing -= scaled_font->mat_inverse.yy;
    1.38 ++    }
    1.39 ++
    1.40 +     _cairo_scaled_glyph_set_metrics (scaled_glyph,
    1.41 + 				     &scaled_font->base,
    1.42 + 				     &extents);
    1.43 +     return CAIRO_INT_STATUS_SUCCESS;
    1.44 + }
    1.45 + 
    1.46 + /**
    1.47 +  * Stack-based helper implementing IDWriteGeometrySink.

mercurial