diff options
Diffstat (limited to 'layout/mathml/nsMathMLmspaceFrame.cpp')
-rw-r--r-- | layout/mathml/nsMathMLmspaceFrame.cpp | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/layout/mathml/nsMathMLmspaceFrame.cpp b/layout/mathml/nsMathMLmspaceFrame.cpp new file mode 100644 index 000000000..54f2f325a --- /dev/null +++ b/layout/mathml/nsMathMLmspaceFrame.cpp @@ -0,0 +1,132 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "nsMathMLmspaceFrame.h" +#include "nsMathMLElement.h" +#include "mozilla/gfx/2D.h" +#include <algorithm> + + +// +// <mspace> -- space - implementation +// + +nsIFrame* +NS_NewMathMLmspaceFrame(nsIPresShell* aPresShell, nsStyleContext* aContext) +{ + return new (aPresShell) nsMathMLmspaceFrame(aContext); +} + +NS_IMPL_FRAMEARENA_HELPERS(nsMathMLmspaceFrame) + +nsMathMLmspaceFrame::~nsMathMLmspaceFrame() +{ +} + +bool +nsMathMLmspaceFrame::IsLeaf() const +{ + return true; +} + +void +nsMathMLmspaceFrame::ProcessAttributes(nsPresContext* aPresContext) +{ + nsAutoString value; + float fontSizeInflation = nsLayoutUtils::FontSizeInflationFor(this); + + // width + // + // "Specifies the desired width of the space." + // + // values: length + // default: 0em + // + // The default value is "0em", so unitless values can be ignored. + // <mspace/> is listed among MathML elements allowing negative spacing and + // the MathML test suite contains "Presentation/TokenElements/mspace/mspace2" + // as an example. Hence we allow negative values. + // + mWidth = 0; + mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::width, value); + if (!value.IsEmpty()) { + ParseNumericValue(value, &mWidth, + nsMathMLElement::PARSE_ALLOW_NEGATIVE, + aPresContext, mStyleContext, fontSizeInflation); + } + + // height + // + // "Specifies the desired height (above the baseline) of the space." + // + // values: length + // default: 0ex + // + // The default value is "0ex", so unitless values can be ignored. + // We do not allow negative values. See bug 716349. + // + mHeight = 0; + mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::height, value); + if (!value.IsEmpty()) { + ParseNumericValue(value, &mHeight, 0, + aPresContext, mStyleContext, fontSizeInflation); + } + + // depth + // + // "Specifies the desired depth (below the baseline) of the space." + // + // values: length + // default: 0ex + // + // The default value is "0ex", so unitless values can be ignored. + // We do not allow negative values. See bug 716349. + // + mDepth = 0; + mContent->GetAttr(kNameSpaceID_None, nsGkAtoms::depth_, value); + if (!value.IsEmpty()) { + ParseNumericValue(value, &mDepth, 0, + aPresContext, mStyleContext, fontSizeInflation); + } +} + +void +nsMathMLmspaceFrame::Reflow(nsPresContext* aPresContext, + ReflowOutput& aDesiredSize, + const ReflowInput& aReflowInput, + 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, aReflowInput, aDesiredSize); +} + +/* virtual */ nsresult +nsMathMLmspaceFrame::MeasureForWidth(DrawTarget* aDrawTarget, + ReflowOutput& aDesiredSize) +{ + ProcessAttributes(PresContext()); + mBoundingMetrics = nsBoundingMetrics(); + mBoundingMetrics.width = mWidth; + aDesiredSize.Width() = std::max(0, mBoundingMetrics.width); + aDesiredSize.mBoundingMetrics = mBoundingMetrics; + return NS_OK; +} |