123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- /* -*- 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;
- }
|