author | Jonathan Kew <jkew@mozilla.com> |
Thu, 08 Jan 2015 12:51:00 +0000 | |
changeset 222630 | e40c72c551bb69417eb451230af2b317ff959f6c |
parent 222629 | 2ee5068037f2639dd7bed0ac957ad4887f88a446 |
child 222631 | 9ae6481e38cd4512fe78ab4be2cb72793f884d87 |
push id | 53678 |
push user | jkew@mozilla.com |
push date | Thu, 08 Jan 2015 12:52:50 +0000 |
treeherder | mozilla-inbound@ed41c0827494 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | jdaggett |
bugs | 1062108 |
milestone | 37.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/gfx/thebes/gfxFT2Fonts.cpp +++ b/gfx/thebes/gfxFT2Fonts.cpp @@ -50,17 +50,18 @@ gfxFT2Font::ShapeText(gfxContext *aC int32_t aScript, bool aVertical, gfxShapedText *aShapedText) { if (!gfxFont::ShapeText(aContext, aText, aOffset, aLength, aScript, aVertical, aShapedText)) { // harfbuzz must have failed(?!), just render raw glyphs AddRange(aText, aOffset, aLength, aShapedText); - PostShapingFixup(aContext, aText, aOffset, aLength, aShapedText); + PostShapingFixup(aContext, aText, aOffset, aLength, aVertical, + aShapedText); } return true; } void gfxFT2Font::AddRange(const char16_t *aText, uint32_t aOffset, uint32_t aLength, gfxShapedText *aShapedText)
--- a/gfx/thebes/gfxFont.cpp +++ b/gfx/thebes/gfxFont.cpp @@ -2485,33 +2485,39 @@ gfxFont::ShapeText(gfxContext *aCon mHarfBuzzShaper = new gfxHarfBuzzShaper(this); } ok = mHarfBuzzShaper->ShapeText(aContext, aText, aOffset, aLength, aScript, aVertical, aShapedText); } NS_WARN_IF_FALSE(ok, "shaper failed, expect scrambled or missing text"); - PostShapingFixup(aContext, aText, aOffset, aLength, aShapedText); + PostShapingFixup(aContext, aText, aOffset, aLength, aVertical, + aShapedText); return ok; } void gfxFont::PostShapingFixup(gfxContext *aContext, const char16_t *aText, uint32_t aOffset, uint32_t aLength, + bool aVertical, gfxShapedText *aShapedText) { if (IsSyntheticBold()) { - float synBoldOffset = - GetSyntheticBoldOffset() * CalcXScale(aContext); - aShapedText->AdjustAdvancesForSyntheticBold(synBoldOffset, - aOffset, aLength); + const Metrics& metrics = + GetMetrics(aVertical ? eVertical : eHorizontal); + if (metrics.maxAdvance > metrics.aveCharWidth) { + float synBoldOffset = + GetSyntheticBoldOffset() * CalcXScale(aContext); + aShapedText->AdjustAdvancesForSyntheticBold(synBoldOffset, + aOffset, aLength); + } } } #define MAX_SHAPING_LENGTH 32760 // slightly less than 32K, trying to avoid // over-stressing platform shapers #define BACKTRACK_LIMIT 16 // backtrack this far looking for a good place // to split into fragments for separate shaping
--- a/gfx/thebes/gfxFont.h +++ b/gfx/thebes/gfxFont.h @@ -1876,16 +1876,17 @@ protected: // Helper to adjust for synthetic bold and set character-type flags // in the shaped text; implementations of ShapeText should call this // after glyph shaping has been completed. void PostShapingFixup(gfxContext *aContext, const char16_t *aText, uint32_t aOffset, // position within aShapedText uint32_t aLength, + bool aVertical, gfxShapedText *aShapedText); // Shape text directly into a range within a textrun, without using the // font's word cache. Intended for use when the font has layout features // that involve space, and therefore require shaping complete runs rather // than isolated words, or for long strings that are inefficient to cache. // This will split the text on "invalid" characters (tab/newline) that are // not handled via normal shaping, but does not otherwise divide up the
--- a/gfx/thebes/gfxMacFont.cpp +++ b/gfx/thebes/gfxMacFont.cpp @@ -138,17 +138,18 @@ gfxMacFont::ShapeText(gfxContext *aC // so we ignore RequiresAATLayout if vertical is requested. if (static_cast<MacOSFontEntry*>(GetFontEntry())->RequiresAATLayout() && !aVertical) { if (!mCoreTextShaper) { mCoreTextShaper = new gfxCoreTextShaper(this); } if (mCoreTextShaper->ShapeText(aContext, aText, aOffset, aLength, aScript, aVertical, aShapedText)) { - PostShapingFixup(aContext, aText, aOffset, aLength, aShapedText); + PostShapingFixup(aContext, aText, aOffset, aLength, aVertical, + aShapedText); return true; } } return gfxFont::ShapeText(aContext, aText, aOffset, aLength, aScript, aVertical, aShapedText); }