From f54d4562ae64675db00d5df17e2eef509a231814 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=83=C2=A9d=C3=83=C2=A9ric=20Wang?= Date: Fri, 10 Aug 2012 11:29:59 -0400 Subject: [PATCH] Bug 781494 - Change line length in nsMathMLChar to be 80 characters or less. r=karlt --- layout/mathml/nsMathMLChar.cpp | 186 ++++++++++++++++++++------------- layout/mathml/nsMathMLChar.h | 24 +++-- 2 files changed, 125 insertions(+), 85 deletions(-) diff --git a/layout/mathml/nsMathMLChar.cpp b/layout/mathml/nsMathMLChar.cpp index 1c790e62981a..34b598e3d7e7 100644 --- a/layout/mathml/nsMathMLChar.cpp +++ b/layout/mathml/nsMathMLChar.cpp @@ -35,13 +35,13 @@ using namespace mozilla; //#define NOISY_SEARCH 1 -// ----------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- static const PRUnichar kSpaceCh = PRUnichar(' '); static const nsGlyphCode kNullGlyph = {{0, 0}, 0}; typedef enum {eExtension_base, eExtension_variants, eExtension_parts} nsMathfontPrefExtension; -// ----------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // nsGlyphTable is a class that provides an interface for accessing glyphs // of stretchy chars. It acts like a table that stores the variants of bigger // sizes (if any) and the partial glyphs needed to build extensible symbols. @@ -58,31 +58,36 @@ typedef enum {eExtension_base, eExtension_variants, eExtension_parts} // points or as direct glyph indices, depending on the type of the table. // XXX The latter is not yet supported. -// General format of MathFont Property Files from which glyph data are retrieved: -// ----------------------------------------------------------------------------------- +// General format of MathFont Property Files from which glyph data are +// retrieved: +// ----------------------------------------------------------------------------- // Each font should have its set of glyph data. For example, the glyph data for // the "Symbol" font and the "MT Extra" font are in "mathfontSymbol.properties" -// and "mathfontMTExtra.properties", respectively. The mathfont property file is a -// set of all the stretchy MathML characters that can be rendered with that font -// using larger and/or partial glyphs. The entry of each stretchy character in the -// mathfont property file gives, in that order, the 4 partial glyphs: Top (or Left), -// Middle, Bottom (or Right), Glue; and the variants of bigger sizes (if any). +// and "mathfontMTExtra.properties", respectively. The mathfont property file +// is a set of all the stretchy MathML characters that can be rendered with that +// font using larger and/or partial glyphs. The entry of each stretchy character +// in the mathfont property file gives, in that order, the 4 partial glyphs: +// Top (or Left), Middle, Bottom (or Right), Glue; and the variants of bigger +// sizes (if any). // A position that is not relevant to a particular character is indicated there // with the UNICODE REPLACEMENT CHARACTER 0xFFFD. // Characters that need to be built recursively from other characters are said // to be composite. For example, chars like over/underbrace in CMEX10 have to -// be built from two half stretchy chars and joined in the middle (TeXbook, p.225). -// Such chars are handled in a special manner by the nsMathMLChar class, which allows -// several (2 or more) child chars to be composed in order to render another char. -// To specify such chars, their list of glyphs in the property file should be given -// as space-separated segments of glyphs. Each segment gives the 4 partial +// be built from two half stretchy chars and joined in the middle +// (TeXbook, p.225). +// Such chars are handled in a special manner by the nsMathMLChar class, which +// allows several (2 or more) child chars to be composed in order to render +// another char. +// To specify such chars, their list of glyphs in the property file should be +// given as space-separated segments of glyphs. Each segment gives the 4 partial // glyphs with which to build the child char that will be joined with its other -// siblings. In this code, when this situation happens (see the detailed description -// of Stretch() below), the original char (referred to as "parent") creates a -// singly-linked list of child chars, asking them to stretch in an equally divided -// space. The nsGlyphTable embeds the necessary logic to guarantee correctness in a -// recursive stretch (and in the use of TopOf(), GlueOf(), etc) on these child chars. -// ----------------------------------------------------------------------------------- +// siblings. In this code, when this situation happens (see the detailed +// description of Stretch() below), the original char (referred to as "parent") +// creates a singly-linked list of child chars, asking them to stretch in an +// equally divided space. The nsGlyphTable embeds the necessary logic to +// guarantee correctness in a recursive stretch (and in the use of TopOf(), +// GlueOf(), etc) on these child chars. +// ----------------------------------------------------------------------------- #define NS_TABLE_TYPE_UNICODE 0 #define NS_TABLE_TYPE_GLYPH_INDEX 1 @@ -115,7 +120,7 @@ LoadProperties(const nsString& aName, NS_ConvertUTF16toUTF8(uriStr)); } -// ----------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- class nsGlyphTable { public: @@ -129,7 +134,8 @@ public: mFontName.AppendElement(aPrimaryFontName); } - ~nsGlyphTable() // not a virtual destructor: this class is not intended to be subclassed + // not a virtual destructor: this class is not intended to be subclassed + ~nsGlyphTable() { MOZ_COUNT_DTOR(nsGlyphTable); } @@ -173,7 +179,8 @@ public: nsGlyphCode GlueOf(nsPresContext* aPresContext, nsMathMLChar* aChar) { return ElementAt(aPresContext, aChar, 3); } - nsGlyphCode BigOf(nsPresContext* aPresContext, nsMathMLChar* aChar, PRInt32 aSize) { + nsGlyphCode BigOf(nsPresContext* aPresContext, nsMathMLChar* aChar, + PRInt32 aSize) { return ElementAt(aPresContext, aChar, 4 + aSize); } nsGlyphCode LeftOf(nsPresContext* aPresContext, nsMathMLChar* aChar) { @@ -184,7 +191,8 @@ public: } private: - nsGlyphCode ElementAt(nsPresContext* aPresContext, nsMathMLChar* aChar, PRUint32 aPosition); + nsGlyphCode ElementAt(nsPresContext* aPresContext, nsMathMLChar* aChar, + PRUint32 aPosition); // The type is either NS_TABLE_TYPE_UNICODE or NS_TABLE_TYPE_GLYPH_INDEX PRInt32 mType; @@ -197,31 +205,36 @@ private: // Tri-state variable for error/empty/ready PRInt32 mState; - // The set of glyph data in this table, as provided by the MathFont Property File + // The set of glyph data in this table, as provided by the MathFont Property + // File nsCOMPtr mGlyphProperties; // For speedy re-use, we always cache the last data used in the table. // mCharCache is the Unicode point of the last char that was queried in this // table. mGlyphCache is a buffer containing the glyph data associated to // that char. For a property line 'key = value' in the MathFont Property File, - // mCharCache will retain the 'key' -- which is a Unicode point, while mGlyphCache - // will retain the 'value', which is a consecutive list of nsGlyphCodes, i.e., - // the pairs of 'code@font' needed by the char -- in which 'code@0' can be specified - // without the optional '@0'. However, to ease subsequent processing, mGlyphCache - // excludes the '@' symbol and explicitly inserts all optional '0' that indicates - // the primary font identifier. Specifically therefore, the k-th glyph is - // characterized by : - // 1) mGlyphCache[3*k],mGlyphCache[3*k+1] : its Unicode point (or glyph index -- depending on mType), - // 2) mGlyphCache[3*k+2] : the numeric identifier of the font where it comes from. + // mCharCache will retain the 'key' -- which is a Unicode point, while + // mGlyphCache will retain the 'value', which is a consecutive list of + // nsGlyphCodes, i.e., the pairs of 'code@font' needed by the char -- in + // which 'code@0' can be specified + // without the optional '@0'. However, to ease subsequent processing, + // mGlyphCache excludes the '@' symbol and explicitly inserts all optional '0' + // that indicates the primary font identifier. Specifically therefore, the + // k-th glyph is characterized by : + // 1) mGlyphCache[3*k],mGlyphCache[3*k+1] : its Unicode point (or glyph index + // -- depending on mType), + // 2) mGlyphCache[3*k+2] : the numeric identifier of the font where it comes + // from. // A font identifier of '0' means the default primary font associated to this - // table. Other digits map to the "external" fonts that may have been specified - // in the MathFont Property File. + // table. Other digits map to the "external" fonts that may have been + // specified in the MathFont Property File. nsString mGlyphCache; PRUnichar mCharCache; }; nsGlyphCode -nsGlyphTable::ElementAt(nsPresContext* aPresContext, nsMathMLChar* aChar, PRUint32 aPosition) +nsGlyphTable::ElementAt(nsPresContext* aPresContext, nsMathMLChar* aChar, + PRUint32 aPosition) { if (mState == NS_TABLE_STATE_ERROR) return kNullGlyph; // Load glyph properties if this is the first time we have been here @@ -267,15 +280,19 @@ nsGlyphTable::ElementAt(nsPresContext* aPresContext, nsMathMLChar* aChar, PRUint // as such ... char key[10]; PR_snprintf(key, sizeof(key), "\\u%04X", uchar); nsAutoString value; - nsresult rv = mGlyphProperties->GetStringProperty(nsDependentCString(key), value); + nsresult rv = mGlyphProperties->GetStringProperty(nsDependentCString(key), + value); if (NS_FAILED(rv)) return kNullGlyph; Clean(value); - // See if this char uses external fonts; e.g., if the 2nd glyph is taken from the - // external font '1', the property line looks like \uNNNN = \uNNNN\uNNNN@1\uNNNN. - // This is where mGlyphCache is pre-processed to explicitly store all glyph codes - // as combined pairs of 'code@font', excluding the '@' separator. This means that - // mGlyphCache[3*k],mGlyphCache[3*k+1] will later be rendered with mFontName[mGlyphCache[3*k+2]] - // Note: font identifier is internally an ASCII digit to avoid the null char issue + // See if this char uses external fonts; e.g., if the 2nd glyph is taken + // from the external font '1', the property line looks like + // \uNNNN = \uNNNN\uNNNN@1\uNNNN. + // This is where mGlyphCache is pre-processed to explicitly store all glyph + // codes as combined pairs of 'code@font', excluding the '@' separator. This + // means that mGlyphCache[3*k],mGlyphCache[3*k+1] will later be rendered + // with mFontName[mGlyphCache[3*k+2]] + // Note: font identifier is internally an ASCII digit to avoid the null + // char issue nsAutoString buffer; PRInt32 length = value.Length(); PRInt32 i = 0; // index in value @@ -362,9 +379,11 @@ nsGlyphTable::ElementAt(nsPresContext* aPresContext, nsMathMLChar* aChar, PRUint offset += 5; // skip the 4 partial glyphs + the whitespace separator child = child->mSibling; } - length = 3*(offset + 4); // stay confined in the 4 partial glyphs of this child + // stay confined in the 4 partial glyphs of this child + length = 3*(offset + 4); } - PRUint32 index = 3*(offset + aPosition); // 3* is to account for the code@font pairs + // 3* is to account for the code@font pairs + PRUint32 index = 3*(offset + aPosition); if (index+2 >= length) return kNullGlyph; nsGlyphCode ch; ch.code[0] = mGlyphCache.CharAt(index); @@ -419,7 +438,7 @@ nsGlyphTable::HasPartsOf(nsPresContext* aPresContext, nsMathMLChar* aChar) IsComposite(aPresContext, aChar); } -// ----------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // This is the list of all the applicable glyph tables. // We will maintain a single global instance that will only reveal those // glyph tables that are associated to fonts currently installed on the @@ -475,7 +494,7 @@ private: NS_IMPL_ISUPPORTS1(nsGlyphTableList, nsIObserver) -// ----------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // Here is the global list of applicable glyph tables that we will be using static nsGlyphTableList* gGlyphTableList = nullptr; @@ -567,7 +586,7 @@ nsGlyphTableList::GetGlyphTableFor(const nsAString& aFamily) return &mUnicodeTable; } -// ----------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // Lookup the preferences: // "font.mathfont-family.\uNNNN.base" -- fonts for the base size @@ -586,7 +605,8 @@ GetFontExtensionPref(PRUnichar aChar, // user_pref("font.mathfont-family.\uNNNN.base", "...") rather than // user_pref("font.mathfont-family.\\uNNNN.base", "..."). // The \uNNNN in the former is interpreted as an UTF16 escape sequence by - // JavaScript and is converted to the internal UTF8 string that JavaScript uses. + // JavaScript and is converted to the internal UTF8 string that JavaScript + // uses. // But clueless users who are not savvy of JavaScript have no idea as to what // is going on and are baffled as to why their pref setting is not working. // So to save countless explanations, we are going to support both keys. @@ -691,7 +711,7 @@ InitGlobals(nsPresContext* aPresContext) return rv; } -// ----------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // And now the implementation of nsMathMLChar nsStyleContext* @@ -747,7 +767,7 @@ nsMathMLChar::SetData(nsPresContext* aPresContext, } } -// ----------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- /* The Stretch: @param aContainerSize - suggested size for the stretched char @@ -830,7 +850,7 @@ nsMathMLChar::SetData(nsPresContext* aPresContext, account for the spacing when setting aContainerSize, and to leave any extra margin when placing the stretched char. */ -// ----------------------------------------------------------------------------------- +// ----------------------------------------------------------------------------- // plain TeX settings (TeXbook p.152) @@ -854,7 +874,8 @@ IsSizeOK(nsPresContext* aPresContext, nscoord a, nscoord b, PRUint32 aHint) bool isNearer = false; if (aHint & (NS_STRETCH_NEARER | NS_STRETCH_LARGEOP)) { float c = NS_MAX(float(b) * NS_MATHML_DELIMITER_FACTOR, - float(b) - nsPresContext::CSSPointsToAppUnits(NS_MATHML_DELIMITER_SHORTFALL_POINTS)); + float(b) - nsPresContext:: + CSSPointsToAppUnits(NS_MATHML_DELIMITER_SHORTFALL_POINTS)); isNearer = bool(float(NS_ABS(b - a)) <= (float(b) - c)); } // Smaller: Mainly for transitory use, to compare two candidate @@ -1178,7 +1199,8 @@ nsMathMLChar::StretchEnumContext::TryVariants(nsGlyphTable* aGlyphTable, } return haveBetter && - (largeopOnly || IsSizeOK(mPresContext, bestSize, mTargetSize, mStretchHint)); + (largeopOnly || + IsSizeOK(mPresContext, bestSize, mTargetSize, mStretchHint)); } // 3. Build by parts. @@ -1315,7 +1337,8 @@ nsMathMLChar::StretchEnumContext::TryParts(nsGlyphTable* aGlyphTable, // When maxWidth, updating ascent and descent indicates that no characters // larger than this character's minimum size need to be checked as they // will not be used. - mBoundingMetrics.ascent = bmdata[0].ascent; // not used except with descent for height + mBoundingMetrics.ascent = bmdata[0].ascent; // not used except with descent + // for height mBoundingMetrics.descent = computedSize - mBoundingMetrics.ascent; mBoundingMetrics.leftBearing = lbearing; mBoundingMetrics.rightBearing = rbearing; @@ -1356,7 +1379,8 @@ nsMathMLChar::StretchEnumContext::EnumCallback(const nsString& aFamily, // See if there is a special table for the family, but always use the // Unicode table for generic fonts. nsGlyphTable* glyphTable = aGeneric ? - &gGlyphTableList->mUnicodeTable : gGlyphTableList->GetGlyphTableFor(aFamily); + &gGlyphTableList->mUnicodeTable : + gGlyphTableList->GetGlyphTableFor(aFamily); if (context->mTablesTried.Contains(glyphTable)) return true; // already tried this one @@ -1437,9 +1461,9 @@ nsMathMLChar::StretchInternal(nsPresContext* aPresContext, mUnscaledAscent = aDesiredStretchSize.ascent; } - //////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// // 1. Check the common situations where stretching is not actually needed - //////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// // quick return if there is nothing special about this char if ((aStretchDirection != direction && @@ -1519,9 +1543,9 @@ nsMathMLChar::StretchInternal(nsPresContext* aPresContext, done = true; } - //////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// // 2/3. Search for a glyph or set of part glyphs of appropriate size - //////////////////////////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////// bool glyphFound = false; nsAutoString cssFamilies; @@ -1727,7 +1751,8 @@ nsMathMLChar::ComposeChildren(nsPresContext* aPresContext, NS_ASSERTION(count, "something is wrong somewhere"); if (!count) return NS_ERROR_FAILURE; // if we haven't been here before, create the linked list of children now - // otherwise, use what we have, adding more children as needed or deleting the extra + // otherwise, use what we have, adding more children as needed or deleting + // the extra nsMathMLChar* last = this; while ((i < count) && last->mSibling) { i++; @@ -1753,7 +1778,8 @@ nsMathMLChar::ComposeChildren(nsPresContext* aPresContext, } nscoord dx = 0, dy = 0; for (i = 0, child = mSibling; child; child = child->mSibling, i++) { - // child chars should just inherit our values - which may change between calls... + // child chars should just inherit our values - which may change between + // calls... child->mData = mData; child->mDirection = mDirection; child->mStyleContext = mStyleContext; @@ -1763,13 +1789,16 @@ nsMathMLChar::ComposeChildren(nsPresContext* aPresContext, nsBoundingMetrics childSize; nsresult rv = child->Stretch(aPresContext, aRenderingContext, mDirection, splitSize, childSize, aStretchHint, mMirrored); - // check if something went wrong or the child couldn't fit in the alloted space - if (NS_FAILED(rv) || (NS_STRETCH_DIRECTION_UNSUPPORTED == child->mDirection)) { + // check if something went wrong or the child couldn't fit in the alloted + // space + if (NS_FAILED(rv) || + (NS_STRETCH_DIRECTION_UNSUPPORTED == child->mDirection)) { delete mSibling; // don't leave a dangling list behind ... mSibling = nullptr; return NS_ERROR_FAILURE; } - child->SetRect(nsRect(dx, dy, childSize.width, childSize.ascent+childSize.descent)); + child->SetRect(nsRect(dx, dy, childSize.width, + childSize.ascent+childSize.descent)); if (0 == i) aCompositeSize = childSize; else { @@ -1827,7 +1856,8 @@ public: nsDisplayMathMLCharBackground(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, const nsRect& aRect, nsStyleContext* aStyleContext) - : nsDisplayItem(aBuilder, aFrame), mStyleContext(aStyleContext), mRect(aRect) { + : nsDisplayItem(aBuilder, aFrame), mStyleContext(aStyleContext), + mRect(aRect) { MOZ_COUNT_CTOR(nsDisplayMathMLCharBackground); } #ifdef NS_BUILD_REFCNT_LOGGING @@ -1896,7 +1926,10 @@ public: return GetBounds(aBuilder, &snap); } - virtual PRUint32 GetPerFrameKey() { return (mIndex << nsDisplayItem::TYPE_BITS) | nsDisplayItem::GetPerFrameKey(); } + virtual PRUint32 GetPerFrameKey() { + return (mIndex << nsDisplayItem::TYPE_BITS) + | nsDisplayItem::GetPerFrameKey(); + } private: nsMathMLChar* mChar; @@ -1976,7 +2009,8 @@ nsMathMLChar::Display(nsDisplayListBuilder* aBuilder, if (styleContext != parentContext && NS_GET_A(backg->mBackgroundColor) > 0) { rv = aLists.BorderBackground()->AppendNewToTop(new (aBuilder) - nsDisplayMathMLCharBackground(aBuilder, aForFrame, mRect, styleContext)); + nsDisplayMathMLCharBackground(aBuilder, aForFrame, mRect, + styleContext)); NS_ENSURE_SUCCESS(rv, rv); } //else @@ -1992,7 +2026,8 @@ nsMathMLChar::Display(nsDisplayListBuilder* aBuilder, return aLists.Content()->AppendNewToTop(new (aBuilder) nsDisplayMathMLCharForeground(aBuilder, aForFrame, this, aIndex, - aSelectedRect && !aSelectedRect->IsEmpty())); + aSelectedRect && + !aSelectedRect->IsEmpty())); } void @@ -2070,16 +2105,16 @@ nsMathMLChar::PaintForeground(nsPresContext* aPresContext, PaintVertically(aPresContext, aRenderingContext, theFont, styleContext, mGlyphTable, r); else if (NS_STRETCH_DIRECTION_HORIZONTAL == mDirection) - PaintHorizontally(aPresContext, aRenderingContext, theFont, styleContext, - mGlyphTable, r); + PaintHorizontally(aPresContext, aRenderingContext, theFont, + styleContext, mGlyphTable, r); } } aRenderingContext.PopState(); } -/* ================================================================================= - And now the helper routines that actually do the job of painting the char by parts +/* ============================================================================= + Helper routines that actually do the job of painting the char by parts */ class AutoPushClipRect { @@ -2241,7 +2276,8 @@ nsMathMLChar::PaintVertically(nsPresContext* aPresContext, // fill the gap between top and middle, and between middle and bottom. if (!chGlue.Exists()) { // null glue : draw a rule // figure out the dimensions of the rule to be drawn : - // set lbearing to rightmost lbearing among the two current successive parts. + // set lbearing to rightmost lbearing among the two current successive + // parts. // set rbearing to leftmost rbearing among the two current successive parts. // this not only satisfies the convention used for over/underbraces // in TeX, but also takes care of broken fonts like the stretchy integral diff --git a/layout/mathml/nsMathMLChar.h b/layout/mathml/nsMathMLChar.h index 2b147487e929..66a6c62e52df 100644 --- a/layout/mathml/nsMathMLChar.h +++ b/layout/mathml/nsMathMLChar.h @@ -30,10 +30,11 @@ enum { NS_STRETCH_MAXWIDTH = 0x40 }; -// A single glyph in our internal representation is characterized by a 'code@font' -// pair. The 'code' is interpreted as a Unicode point or as the direct glyph index -// (depending on the type of nsGlyphTable where this comes from). The 'font' is a -// numeric identifier given to the font to which the glyph belongs. +// A single glyph in our internal representation is characterized by a +// 'code@font' pair. The 'code' is interpreted as a Unicode point or as the +// direct glyph index (depending on the type of nsGlyphTable where this comes +// from). The 'font' is a numeric identifier given to the font to which the +// glyph belongs. struct nsGlyphCode { PRUnichar code[2]; PRInt32 font; @@ -54,16 +55,17 @@ struct nsGlyphCode { } }; -// Class used to handle stretchy symbols (accent, delimiter and boundary symbols). +// Class used to handle stretchy symbols (accent, delimiter and boundary +// symbols). // There are composite characters that need to be built recursively from other // characters. Since these are rare we use a light-weight mechanism to handle // them. Specifically, as need arises we append a singly-linked list of child // chars with their mParent pointing to the first element in the list, except in // the originating first element itself where it points to null. mSibling points // to the next element in the list. Since the originating first element is the -// parent of the others, we call it the "root" char of the list. Testing !mParent -// tells whether you are that "root" during the recursion. The parent delegates -// most of the tasks to the children. +// parent of the others, we call it the "root" char of the list. Testing +// !mParent tells whether you are that "root" during the recursion. The parent +// delegates most of the tasks to the children. class nsMathMLChar { public: @@ -79,7 +81,8 @@ public: mMirrored = false; } - ~nsMathMLChar() { // not a virtual destructor: this class is not intended to be subclassed + // not a virtual destructor: this class is not intended to be subclassed + ~nsMathMLChar() { MOZ_COUNT_DTOR(nsMathMLChar); // there is only one style context owned by the "root" char // and it may be used by child chars as well @@ -150,7 +153,8 @@ public: SetRect(const nsRect& aRect) { mRect = aRect; // shift the orgins of child chars if any - if (!mParent && mSibling) { // only a "root" having child chars can enter here + if (!mParent && mSibling) { // only a "root" having child chars can + // enter here for (nsMathMLChar* child = mSibling; child; child = child->mSibling) { nsRect rect; child->GetRect(rect);