author | Jonathan Kew <jkew@mozilla.com> |
Mon, 16 Apr 2012 13:54:50 +0100 | |
changeset 91759 | 19d1e35cff9a8d93d75580bcb2df6f0a824f188d |
parent 91758 | 773b2db48d0cbb43eb33896b2073e27cf8dfbecb |
child 91760 | 6256b17dd252f141b249fb6375eca0324ae02bdf |
push id | 22477 |
push user | mak77@bonardo.net |
push date | Tue, 17 Apr 2012 13:32:31 +0000 |
treeherder | mozilla-central@40455cbb1ad3 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | roc |
bugs | 745555 |
milestone | 14.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/gfxFont.h +++ b/gfx/thebes/gfxFont.h @@ -1842,17 +1842,18 @@ public: // inverted so we can memset the array to zero to indicate all missing. FLAG_NOT_MISSING = 0x01, FLAG_NOT_CLUSTER_START = 0x02, FLAG_NOT_LIGATURE_GROUP_START = 0x04, FLAG_CHAR_IS_TAB = 0x08, FLAG_CHAR_IS_NEWLINE = 0x10, FLAG_CHAR_IS_LOW_SURROGATE = 0x20, - + CHAR_IDENTITY_FLAGS_MASK = 0x38, + GLYPH_COUNT_MASK = 0x00FFFF00U, GLYPH_COUNT_SHIFT = 8 }; // "Simple glyphs" have a simple glyph ID, simple advance and their // x and y offsets are zero. Also the glyph extents do not overflow // the font-box defined by the font ascent, descent and glyph advance width. // These case is optimized to avoid storing DetailedGlyphs. @@ -1896,16 +1897,20 @@ public: } bool CharIsNewline() const { return !IsSimpleGlyph() && (mValue & FLAG_CHAR_IS_NEWLINE) != 0; } bool CharIsLowSurrogate() const { return !IsSimpleGlyph() && (mValue & FLAG_CHAR_IS_LOW_SURROGATE) != 0; } + PRUint32 CharIdentityFlags() const { + return IsSimpleGlyph() ? 0 : (mValue & CHAR_IDENTITY_FLAGS_MASK); + } + void SetClusterStart(bool aIsClusterStart) { NS_ASSERTION(!IsSimpleGlyph(), "can't call SetClusterStart on simple glyphs"); if (aIsClusterStart) { mValue &= ~FLAG_NOT_CLUSTER_START; } else { mValue |= FLAG_NOT_CLUSTER_START; } @@ -1922,36 +1927,40 @@ public: PRUint32 toggle = breakMask ^ (mValue & FLAGS_CAN_BREAK_BEFORE); mValue ^= toggle; return toggle; } CompressedGlyph& SetSimpleGlyph(PRUint32 aAdvanceAppUnits, PRUint32 aGlyph) { NS_ASSERTION(IsSimpleAdvance(aAdvanceAppUnits), "Advance overflow"); NS_ASSERTION(IsSimpleGlyphID(aGlyph), "Glyph overflow"); - mValue = (mValue & FLAGS_CAN_BREAK_BEFORE) | + NS_ASSERTION(!CharIdentityFlags(), "Char identity flags lost"); + mValue = (mValue & (FLAGS_CAN_BREAK_BEFORE | FLAG_CHAR_IS_SPACE)) | FLAG_IS_SIMPLE_GLYPH | (aAdvanceAppUnits << ADVANCE_SHIFT) | aGlyph; return *this; } CompressedGlyph& SetComplex(bool aClusterStart, bool aLigatureStart, PRUint32 aGlyphCount) { - mValue = (mValue & FLAGS_CAN_BREAK_BEFORE) | + mValue = (mValue & (FLAGS_CAN_BREAK_BEFORE | FLAG_CHAR_IS_SPACE)) | FLAG_NOT_MISSING | + CharIdentityFlags() | (aClusterStart ? 0 : FLAG_NOT_CLUSTER_START) | (aLigatureStart ? 0 : FLAG_NOT_LIGATURE_GROUP_START) | (aGlyphCount << GLYPH_COUNT_SHIFT); return *this; } /** * Missing glyphs are treated as ligature group starts; don't mess with * the cluster-start flag (see bugs 618870 and 619286). */ CompressedGlyph& SetMissing(PRUint32 aGlyphCount) { - mValue = (mValue & (FLAGS_CAN_BREAK_BEFORE | FLAG_NOT_CLUSTER_START)) | + mValue = (mValue & (FLAGS_CAN_BREAK_BEFORE | FLAG_NOT_CLUSTER_START | + FLAG_CHAR_IS_SPACE)) | + CharIdentityFlags() | (aGlyphCount << GLYPH_COUNT_SHIFT); return *this; } PRUint32 GetGlyphCount() const { NS_ASSERTION(!IsSimpleGlyph(), "Expected non-simple-glyph"); return (mValue & GLYPH_COUNT_MASK) >> GLYPH_COUNT_SHIFT; }