mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
a3ae69617c
Backed out changeset e2ab653f688a (bug 1008917) Backed out changeset b52154d8d900 (bug 1008917) Backed out changeset 2ab5b01da4de (bug 1008917) Backed out changeset f7a38df1d44f (bug 1008917) Backed out changeset 80304bb9a572 (bug 1008917) Backed out changeset 10ed89a302e9 (bug 1008917) Backed out changeset 161c41991d46 (bug 1008917) Backed out changeset 25b2475d2368 (bug 1008917) Backed out changeset b8000b31277c (bug 1008917) Backed out changeset 9afa5e7715e1 (bug 1008917) Backed out changeset 5c380c21351f (bug 1008917)
131 lines
3.7 KiB
C++
131 lines
3.7 KiB
C++
/* -*- 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;
|
|
|
|
// 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);
|
|
}
|
|
|
|
// 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);
|
|
}
|
|
|
|
// 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);
|
|
}
|
|
}
|
|
|
|
nsresult
|
|
nsMathMLmspaceFrame::Reflow(nsPresContext* aPresContext,
|
|
nsHTMLReflowMetrics& aDesiredSize,
|
|
const nsHTMLReflowState& aReflowState,
|
|
nsReflowStatus& aStatus)
|
|
{
|
|
ProcessAttributes(aPresContext);
|
|
|
|
mBoundingMetrics = nsBoundingMetrics();
|
|
mBoundingMetrics.width = mWidth;
|
|
mBoundingMetrics.ascent = mHeight;
|
|
mBoundingMetrics.descent = mDepth;
|
|
mBoundingMetrics.leftBearing = 0;
|
|
mBoundingMetrics.rightBearing = mBoundingMetrics.width;
|
|
|
|
aDesiredSize.SetTopAscent(mHeight);
|
|
aDesiredSize.Width() = std::max(0, mBoundingMetrics.width);
|
|
aDesiredSize.Height() = aDesiredSize.TopAscent() + mDepth;
|
|
// Also return our bounding metrics
|
|
aDesiredSize.mBoundingMetrics = mBoundingMetrics;
|
|
|
|
aStatus = NS_FRAME_COMPLETE;
|
|
NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize);
|
|
return NS_OK;
|
|
}
|
|
|
|
/* 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;
|
|
}
|