/* virtual */ nsresult nsMathMLmpaddedFrame::MeasureForWidth(nsRenderingContext& aRenderingContext, nsHTMLReflowMetrics& aDesiredSize) { ProcessAttributes(); return Place(aRenderingContext, false, aDesiredSize); }
NS_IMETHODIMP nsMathMLmspaceFrame::Reflow(nsPresContext* aPresContext, nsHTMLReflowMetrics& aDesiredSize, const nsHTMLReflowState& aReflowState, nsReflowStatus& aStatus) { ProcessAttributes(aPresContext); mBoundingMetrics.Clear(); mBoundingMetrics.width = mWidth; mBoundingMetrics.ascent = mHeight; mBoundingMetrics.descent = mDepth; aDesiredSize.ascent = mHeight; aDesiredSize.descent = mDepth; aDesiredSize.width = mWidth; aDesiredSize.height = aDesiredSize.ascent + aDesiredSize.descent; if (aDesiredSize.mComputeMEW) { aDesiredSize.mMaxElementWidth = aDesiredSize.width; } // Also return our bounding metrics aDesiredSize.mBoundingMetrics = mBoundingMetrics; aStatus = NS_FRAME_COMPLETE; NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize); return NS_OK; }
/* virtual */ nsresult nsMathMLmpaddedFrame::MeasureForWidth(DrawTarget* aDrawTarget, ReflowOutput& aDesiredSize) { ProcessAttributes(); return Place(aDrawTarget, false, aDesiredSize); }
void nsMathMLmspaceFrame::Reflow(nsPresContext* aPresContext, nsHTMLReflowMetrics& aDesiredSize, const nsHTMLReflowState& aReflowState, nsReflowStatus& aStatus) { MarkInReflow(); mPresentationData.flags &= ~NS_MATHML_ERROR; ProcessAttributes(aPresContext); mBoundingMetrics = nsBoundingMetrics(); mBoundingMetrics.width = mWidth; mBoundingMetrics.ascent = mHeight; mBoundingMetrics.descent = mDepth; mBoundingMetrics.leftBearing = 0; mBoundingMetrics.rightBearing = mBoundingMetrics.width; aDesiredSize.SetBlockStartAscent(mHeight); aDesiredSize.Width() = std::max(0, mBoundingMetrics.width); aDesiredSize.Height() = aDesiredSize.BlockStartAscent() + mDepth; // Also return our bounding metrics aDesiredSize.mBoundingMetrics = mBoundingMetrics; aStatus = NS_FRAME_COMPLETE; NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize); }
/* virtual */ nsresult nsMathMLmspaceFrame::MeasureForWidth(nsRenderingContext& aRenderingContext, nsHTMLReflowMetrics& aDesiredSize) { ProcessAttributes(PresContext()); mBoundingMetrics = nsBoundingMetrics(); mBoundingMetrics.width = mWidth; aDesiredSize.Width() = std::max(0, mBoundingMetrics.width); aDesiredSize.mBoundingMetrics = mBoundingMetrics; return NS_OK; }
void nsMathMLmpaddedFrame::Reflow(nsPresContext* aPresContext, nsHTMLReflowMetrics& aDesiredSize, const nsHTMLReflowState& aReflowState, nsReflowStatus& aStatus) { ProcessAttributes(); /////////////// // Let the base class format our content like an inferred mrow nsMathMLContainerFrame::Reflow(aPresContext, aDesiredSize, aReflowState, aStatus); //NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus), "bad status"); }
void nsMathMLmpaddedFrame::Reflow(nsPresContext* aPresContext, ReflowOutput& aDesiredSize, const ReflowInput& aReflowInput, nsReflowStatus& aStatus) { mPresentationData.flags &= ~NS_MATHML_ERROR; ProcessAttributes(); /////////////// // Let the base class format our content like an inferred mrow nsMathMLContainerFrame::Reflow(aPresContext, aDesiredSize, aReflowInput, aStatus); //NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus), "bad status"); }
/* virtual */ nsresult nsMathMLmmultiscriptsFrame::Place(nsRenderingContext& aRenderingContext, bool aPlaceOrigin, nsHTMLReflowMetrics& aDesiredSize) { //////////////////////////////////// // Get the children's desired sizes nscoord minShiftFromXHeight, subDrop, supDrop; //////////////////////////////////////// // Initialize super/sub shifts that // depend only on the current font //////////////////////////////////////// ProcessAttributes(); // get x-height (an ex) const nsStyleFont* font = GetStyleFont(); nsRefPtr<nsFontMetrics> fm; nsLayoutUtils::GetFontMetricsForFrame(this, getter_AddRefs(fm)); aRenderingContext.SetFont(fm); nscoord xHeight = fm->XHeight(); nscoord ruleSize; GetRuleThickness (aRenderingContext, fm, ruleSize); // scriptspace from TeX for extra spacing after sup/subscript (0.5pt in plain TeX) // forced to be at least 1 pixel here nscoord onePixel = nsPresContext::CSSPixelsToAppUnits(1); nscoord scriptSpace = NS_MAX(nsPresContext::CSSPointsToAppUnits(0.5f), onePixel); ///////////////////////////////////// // first the shift for the subscript // subScriptShift{1,2} // = minimum amount to shift the subscript down // = sub{1,2} in TeXbook // subScriptShift1 = subscriptshift attribute * x-height nscoord subScriptShift1, subScriptShift2; // Get subScriptShift{1,2} default from font GetSubScriptShifts (fm, subScriptShift1, subScriptShift2); if (0 < mSubScriptShift) { // the user has set the subscriptshift attribute float scaler = ((float) subScriptShift2) / subScriptShift1; subScriptShift1 = NS_MAX(subScriptShift1, mSubScriptShift); subScriptShift2 = NSToCoordRound(scaler * subScriptShift1); } // the font dependent shift nscoord subScriptShift = NS_MAX(subScriptShift1,subScriptShift2); ///////////////////////////////////// // next the shift for the superscript // supScriptShift{1,2,3} // = minimum amount to shift the supscript up // = sup{1,2,3} in TeX // supScriptShift1 = superscriptshift attribute * x-height // Note that there are THREE values for supscript shifts depending // on the current style nscoord supScriptShift1, supScriptShift2, supScriptShift3; // Set supScriptShift{1,2,3} default from font GetSupScriptShifts (fm, supScriptShift1, supScriptShift2, supScriptShift3); if (0 < mSupScriptShift) { // the user has set the superscriptshift attribute float scaler2 = ((float) supScriptShift2) / supScriptShift1; float scaler3 = ((float) supScriptShift3) / supScriptShift1; supScriptShift1 = NS_MAX(supScriptShift1, mSupScriptShift); supScriptShift2 = NSToCoordRound(scaler2 * supScriptShift1); supScriptShift3 = NSToCoordRound(scaler3 * supScriptShift1); } // get sup script shift depending on current script level and display style // Rule 18c, App. G, TeXbook nscoord supScriptShift; if ( font->mScriptLevel == 0 && NS_MATHML_IS_DISPLAYSTYLE(mPresentationData.flags) && !NS_MATHML_IS_COMPRESSED(mPresentationData.flags)) { // Style D in TeXbook supScriptShift = supScriptShift1; } else if (NS_MATHML_IS_COMPRESSED(mPresentationData.flags)) { // Style C' in TeXbook = D',T',S',SS' supScriptShift = supScriptShift3; } else { // everything else = T,S,SS supScriptShift = supScriptShift2; } //////////////////////////////////// // Get the children's sizes //////////////////////////////////// nscoord width = 0, prescriptsWidth = 0, rightBearing = 0; nsIFrame* mprescriptsFrame = nsnull; // frame of <mprescripts/>, if there. bool isSubScript = false; nscoord minSubScriptShift = 0, minSupScriptShift = 0; nscoord trySubScriptShift = subScriptShift; nscoord trySupScriptShift = supScriptShift; nscoord maxSubScriptShift = subScriptShift; nscoord maxSupScriptShift = supScriptShift; PRInt32 count = 0; nsHTMLReflowMetrics baseSize; nsHTMLReflowMetrics subScriptSize; nsHTMLReflowMetrics supScriptSize; nsIFrame* baseFrame = nsnull; nsIFrame* subScriptFrame = nsnull; nsIFrame* supScriptFrame = nsnull; bool firstPrescriptsPair = false; nsBoundingMetrics bmBase, bmSubScript, bmSupScript; nscoord italicCorrection = 0; mBoundingMetrics.width = 0; mBoundingMetrics.ascent = mBoundingMetrics.descent = -0x7FFFFFFF; nscoord ascent = -0x7FFFFFFF, descent = -0x7FFFFFFF; aDesiredSize.width = aDesiredSize.height = 0; nsIFrame* childFrame = mFrames.FirstChild(); while (childFrame) { if (childFrame->GetContent()->Tag() == nsGkAtoms::mprescripts_) { if (mprescriptsFrame) { // duplicate <mprescripts/> found // report an error, encourage people to get their markups in order return ReflowError(aRenderingContext, aDesiredSize); } mprescriptsFrame = childFrame; firstPrescriptsPair = true; } else { if (0 == count) { // base baseFrame = childFrame; GetReflowAndBoundingMetricsFor(baseFrame, baseSize, bmBase); GetItalicCorrection(bmBase, italicCorrection); // for the superscript, we always add "a little to spare" italicCorrection += onePixel; // we update mBoundingMetrics.{ascent,descent} with that // of the baseFrame only after processing all the sup/sub pairs // XXX need italic correction only *if* there are postscripts ? mBoundingMetrics.width = bmBase.width + italicCorrection; mBoundingMetrics.rightBearing = bmBase.rightBearing; mBoundingMetrics.leftBearing = bmBase.leftBearing; // until overwritten } else { // super/subscript block if (isSubScript) { // subscript subScriptFrame = childFrame; GetReflowAndBoundingMetricsFor(subScriptFrame, subScriptSize, bmSubScript); // get the subdrop from the subscript font GetSubDropFromChild (subScriptFrame, subDrop); // parameter v, Rule 18a, App. G, TeXbook minSubScriptShift = bmBase.descent + subDrop; trySubScriptShift = NS_MAX(minSubScriptShift,subScriptShift); mBoundingMetrics.descent = NS_MAX(mBoundingMetrics.descent,bmSubScript.descent); descent = NS_MAX(descent,subScriptSize.height - subScriptSize.ascent); width = bmSubScript.width + scriptSpace; rightBearing = bmSubScript.rightBearing; } else { // supscript supScriptFrame = childFrame; GetReflowAndBoundingMetricsFor(supScriptFrame, supScriptSize, bmSupScript); // get the supdrop from the supscript font GetSupDropFromChild (supScriptFrame, supDrop); // parameter u, Rule 18a, App. G, TeXbook minSupScriptShift = bmBase.ascent - supDrop; // get min supscript shift limit from x-height // = d(x) + 1/4 * sigma_5, Rule 18c, App. G, TeXbook minShiftFromXHeight = NSToCoordRound ((bmSupScript.descent + (1.0f/4.0f) * xHeight)); trySupScriptShift = NS_MAX(minSupScriptShift,NS_MAX(minShiftFromXHeight,supScriptShift)); mBoundingMetrics.ascent = NS_MAX(mBoundingMetrics.ascent,bmSupScript.ascent); ascent = NS_MAX(ascent,supScriptSize.ascent); width = NS_MAX(width, bmSupScript.width + scriptSpace); rightBearing = NS_MAX(rightBearing, bmSupScript.rightBearing); if (!mprescriptsFrame) { // we are still looping over base & postscripts mBoundingMetrics.rightBearing = mBoundingMetrics.width + rightBearing; mBoundingMetrics.width += width; } else { prescriptsWidth += width; if (firstPrescriptsPair) { firstPrescriptsPair = false; mBoundingMetrics.leftBearing = NS_MIN(bmSubScript.leftBearing, bmSupScript.leftBearing); } } width = rightBearing = 0; // negotiate between the various shifts so that // there is enough gap between the sup and subscripts // Rule 18e, App. G, TeXbook nscoord gap = (trySupScriptShift - bmSupScript.descent) - (bmSubScript.ascent - trySubScriptShift); if (gap < 4.0f * ruleSize) { // adjust trySubScriptShift to get a gap of (4.0 * ruleSize) trySubScriptShift += NSToCoordRound ((4.0f * ruleSize) - gap); } // next we want to ensure that the bottom of the superscript // will be > (4/5) * x-height above baseline gap = NSToCoordRound ((4.0f/5.0f) * xHeight - (trySupScriptShift - bmSupScript.descent)); if (gap > 0.0f) { trySupScriptShift += gap; trySubScriptShift -= gap; } maxSubScriptShift = NS_MAX(maxSubScriptShift, trySubScriptShift); maxSupScriptShift = NS_MAX(maxSupScriptShift, trySupScriptShift); trySubScriptShift = subScriptShift; trySupScriptShift = supScriptShift; } } isSubScript = !isSubScript; } count++; childFrame = childFrame->GetNextSibling(); } // note: width=0 if all sup-sub pairs match correctly if ((0 != width) || !baseFrame || !subScriptFrame || !supScriptFrame) { // report an error, encourage people to get their markups in order return ReflowError(aRenderingContext, aDesiredSize); } // we left out the width of prescripts, so ... mBoundingMetrics.rightBearing += prescriptsWidth; mBoundingMetrics.width += prescriptsWidth; // we left out the base during our bounding box updates, so ... mBoundingMetrics.ascent = NS_MAX(mBoundingMetrics.ascent+maxSupScriptShift,bmBase.ascent); mBoundingMetrics.descent = NS_MAX(mBoundingMetrics.descent+maxSubScriptShift,bmBase.descent); // get the reflow metrics ... aDesiredSize.ascent = NS_MAX(ascent+maxSupScriptShift,baseSize.ascent); aDesiredSize.height = aDesiredSize.ascent + NS_MAX(descent+maxSubScriptShift,baseSize.height - baseSize.ascent); aDesiredSize.width = mBoundingMetrics.width; aDesiredSize.mBoundingMetrics = mBoundingMetrics; mReference.x = 0; mReference.y = aDesiredSize.ascent; ////////////////// // Place Children // Place prescripts, followed by base, and then postscripts. // The list of frames is in the order: {base} {postscripts} {prescripts} // We go over the list in a circular manner, starting at <prescripts/> if (aPlaceOrigin) { nscoord dx = 0, dy = 0; count = 0; childFrame = mprescriptsFrame; do { if (!childFrame) { // end of prescripts, // place the base ... childFrame = baseFrame; dy = aDesiredSize.ascent - baseSize.ascent; FinishReflowChild (baseFrame, PresContext(), nsnull, baseSize, MirrorIfRTL(aDesiredSize.width, baseSize.width, dx), dy, 0); dx += bmBase.width + italicCorrection; } else if (mprescriptsFrame != childFrame) { // process each sup/sub pair if (0 == count) { subScriptFrame = childFrame; count = 1; } else if (1 == count) { supScriptFrame = childFrame; count = 0; // get the ascent/descent of sup/subscripts stored in their rects // rect.x = descent, rect.y = ascent GetReflowAndBoundingMetricsFor(subScriptFrame, subScriptSize, bmSubScript); GetReflowAndBoundingMetricsFor(supScriptFrame, supScriptSize, bmSupScript); // center w.r.t. largest width width = NS_MAX(subScriptSize.width, supScriptSize.width); dy = aDesiredSize.ascent - subScriptSize.ascent + maxSubScriptShift; FinishReflowChild (subScriptFrame, PresContext(), nsnull, subScriptSize, MirrorIfRTL(aDesiredSize.width, subScriptSize.width, dx + (width-subScriptSize.width)/2), dy, 0); dy = aDesiredSize.ascent - supScriptSize.ascent - maxSupScriptShift; FinishReflowChild (supScriptFrame, PresContext(), nsnull, supScriptSize, MirrorIfRTL(aDesiredSize.width, supScriptSize.width, dx + (width-supScriptSize.width)/2), dy, 0); dx += width + scriptSpace; } } childFrame = childFrame->GetNextSibling(); } while (mprescriptsFrame != childFrame); } return NS_OK; }
void CXMLparser::ProcessNode (CXMLelement & parent) { CString strName; CString strValue; CString strPrefix; UINT iNodeStart = m_xmlPos; UINT iFirstLine = m_xmlLine; while (m_xmlBuff [m_xmlPos]) { // bypass spaces and comments SkipComments (true); // nothing left? all done if (m_xmlBuff [m_xmlPos] == 0) break; // look for element start if (m_xmlBuff [m_xmlPos] != '<') { // not element - must be content // can't have content at root level if (parent.strName.IsEmpty ()) ThrowErrorException ("Expected '<', got \"%c\" (content not permitted here)", m_xmlBuff [m_xmlPos]); if (m_xmlBuff [m_xmlPos] == '\n') m_xmlLine++; // count lines // <![CDATA[ terminator invalid here (ie. ]]> ) if (m_xmlBuff [m_xmlPos] == ']' && m_xmlBuff [m_xmlPos + 1] == ']' && m_xmlBuff [m_xmlPos + 2] == '>') ThrowErrorException ("CDATA terminator ']]>' invalid"); // don't let them slip in non-printables if ((unsigned char) m_xmlBuff [m_xmlPos] < ' ' && (unsigned char) m_xmlBuff [m_xmlPos] != '\n' && (unsigned char) m_xmlBuff [m_xmlPos] != '\r') ThrowErrorException ("Non-printable character, code %i, not permitted", (int) m_xmlBuff [m_xmlPos]); m_xmlPos++; // skip character continue; // keep processing content } m_xmlPos++; // skip < // special cases: <?xml blah?> <!doctype blah> </end-of-something> if (m_xmlBuff [m_xmlPos] == '!' || m_xmlBuff [m_xmlPos] == '?' || m_xmlBuff [m_xmlPos] == '/') { strPrefix = m_xmlBuff [m_xmlPos]; m_xmlPos++; // bypass special types } else strPrefix.Empty (); // special and bizarre case of <![CDATA[ ... ]]> if (strPrefix == '!' && m_xmlBuff [m_xmlPos] == '[' && m_xmlBuff [m_xmlPos + 1] == 'C' && m_xmlBuff [m_xmlPos + 2] == 'D' && m_xmlBuff [m_xmlPos + 3] == 'A' && m_xmlBuff [m_xmlPos + 4] == 'T' && m_xmlBuff [m_xmlPos + 5] == 'A' && m_xmlBuff [m_xmlPos + 6] == '[') { // can't have content at root level if (parent.strName.IsEmpty ()) ThrowErrorException ("<![CDATA[ invalid at root level"); m_xmlPos += 7; // skip [CDATA[ while (m_xmlBuff [m_xmlPos] != ']' || m_xmlBuff [m_xmlPos + 1] != ']' || m_xmlBuff [m_xmlPos + 2] != '>') { // shouldn't have end-of-file before the ]]> if (m_xmlBuff [m_xmlPos] == 0) ThrowErrorException ("Unexpected end-of-file inside [CDATA[ definition"); // don't let them slip in non-printables if ((unsigned char) m_xmlBuff [m_xmlPos] < ' ' && (unsigned char) m_xmlBuff [m_xmlPos] != '\n' && (unsigned char) m_xmlBuff [m_xmlPos] != '\r') ThrowErrorException ("Non-printable character, code %i, not permitted", (int) m_xmlBuff [m_xmlPos]); if (m_xmlBuff [m_xmlPos] == '\n') m_xmlLine++; // count lines m_xmlPos++; // try next character } m_xmlPos += 3; // skip ]]> continue; // back to start of loop } // end of <![CDATA[ section int iLine = m_xmlLine; // line where we expect to see name strName = GetName ("Element"); // check for sequence </blah xxx> if (strPrefix == '/' && m_xmlBuff [m_xmlPos] != '>') if (m_xmlBuff [m_xmlPos] == 0) ThrowErrorException ("Unexpected end-of-file after '</%s'", (LPCTSTR) strName); else ThrowErrorException ("Surplus characters after '</%s'", (LPCTSTR) strName); // check for sequence </blah> if (strPrefix == '/') { if (strName != parent.strName) if (parent.strName.IsEmpty ()) // can't go up a level here :) ThrowErrorException ("Unexpected closing tag </%s> - " "no corresponding opening tag", (LPCTSTR) strName); else ThrowErrorException ("Elements terminated out of sequence, " "expected </%s>, got </%s>", (LPCTSTR) parent.strName, (LPCTSTR) strName); AssembleContent (parent, iFirstLine, iNodeStart); m_xmlPos++; // skip terminating > return; // terminated this node } if (strPrefix == '!') ProcessDeclaration (strName); // process declaration, eg. <!DOCTYPE else { // not a declaration, must be an ordinary element // time to create a new element CXMLelement * pElement = new CXMLelement; if (!pElement) ThrowErrorException ("Could not allocate memory for XML parsing of element %s", (LPCTSTR) strName); // remember its name pElement->strName = strPrefix + strName; pElement->iLine = iLine; parent.ChildrenList.AddTail (pElement); // add to parent's list of children // OK, we have a new sibling for our parent, let's see if it has any attributes ... ProcessAttributes (*pElement); // process its attributes // hmm - we have now got something like <blah> ... // drop down to find children for it - unless 'empty' element if (!pElement->bEmpty) ProcessNode (*pElement); } // end of non-declaration } // end of processing buffer if (!parent.strName.IsEmpty ()) ThrowErrorException ("Unexpected end-of-file while looking for </%s>", (LPCTSTR) parent.strName); } // end of CXMLparser::ProcessNode
OsisData::OsisData(const QMetaObject& _mo, QDomElement& categoryElement, QString& elementName) : mo(_mo) , ElementName(elementName) { ProcessAttributes(categoryElement); }