gfx/cairo/dwrite-glyph-extents.patch

Thu, 15 Jan 2015 21:03:48 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 21:03:48 +0100
branch
TOR_BUG_9701
changeset 11
deefc01c0e14
permissions
-rw-r--r--

Integrate friendly tips from Tor colleagues to make (or not) 4.5 alpha 3;
This includes removal of overloaded (but unused) methods, and addition of
a overlooked call to DataStruct::SetData(nsISupports, uint32_t, bool.)

     1 diff --git a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp
     2 --- a/gfx/cairo/cairo/src/cairo-dwrite-font.cpp
     3 +++ b/gfx/cairo/cairo/src/cairo-dwrite-font.cpp
     4 @@ -582,22 +582,37 @@ _cairo_dwrite_scaled_font_init_glyph_met
     5      DWRITE_FONT_METRICS fontMetrics;
     6      font_face->dwriteface->GetMetrics(&fontMetrics);
     7      HRESULT hr = font_face->dwriteface->GetDesignGlyphMetrics(&charIndex, 1, &metrics);
     8      if (FAILED(hr)) {
     9  	return CAIRO_INT_STATUS_UNSUPPORTED;
    10      }
    12      // TODO: Treat swap_xy.
    13 -    extents.width = (FLOAT)(metrics.advanceWidth - metrics.leftSideBearing - metrics.rightSideBearing) / fontMetrics.designUnitsPerEm;
    14 -    extents.height = (FLOAT)(metrics.advanceHeight - metrics.topSideBearing - metrics.bottomSideBearing) / fontMetrics.designUnitsPerEm;
    15 +    extents.width = (FLOAT)(metrics.advanceWidth - metrics.leftSideBearing - metrics.rightSideBearing) /
    16 +        fontMetrics.designUnitsPerEm;
    17 +    extents.height = (FLOAT)(metrics.advanceHeight - metrics.topSideBearing - metrics.bottomSideBearing) /
    18 +        fontMetrics.designUnitsPerEm;
    19      extents.x_advance = (FLOAT)metrics.advanceWidth / fontMetrics.designUnitsPerEm;
    20      extents.x_bearing = (FLOAT)metrics.leftSideBearing / fontMetrics.designUnitsPerEm;
    21      extents.y_advance = 0.0;
    22 -    extents.y_bearing = (FLOAT)(metrics.topSideBearing - metrics.verticalOriginY) / fontMetrics.designUnitsPerEm;
    23 +    extents.y_bearing = (FLOAT)(metrics.topSideBearing - metrics.verticalOriginY) /
    24 +        fontMetrics.designUnitsPerEm;
    25 +
    26 +    // We pad the extents here because GetDesignGlyphMetrics returns "ideal" metrics
    27 +    // for the glyph outline, without accounting for hinting/gridfitting/antialiasing,
    28 +    // and therefore it does not always cover all pixels that will actually be touched.
    29 +    if (scaled_font->base.options.antialias != CAIRO_ANTIALIAS_NONE &&
    30 +        extents.width > 0 && extents.height > 0) {
    31 +        extents.width += scaled_font->mat_inverse.xx * 2;
    32 +        extents.x_bearing -= scaled_font->mat_inverse.xx;
    33 +        extents.height += scaled_font->mat_inverse.yy * 2;
    34 +        extents.y_bearing -= scaled_font->mat_inverse.yy;
    35 +    }
    36 +
    37      _cairo_scaled_glyph_set_metrics (scaled_glyph,
    38  				     &scaled_font->base,
    39  				     &extents);
    40      return CAIRO_INT_STATUS_SUCCESS;
    41  }
    43  /**
    44   * Stack-based helper implementing IDWriteGeometrySink.

mercurial