/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* 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/. */
NS_IMETHODIMP
nsMathMLmpaddedFrame::InheritAutomaticData(nsIFrame* aParent) { // let the base class get the default from our parent
nsMathMLContainerFrame::InheritAutomaticData(aParent);
// get the number bool gotDot = false, gotPercent = false; for (; i < stringLength; i++) {
char16_t c = aString[i]; if (gotDot && c == '.') { // error - two dots encountered returnfalse;
}
// catch error if we didn't enter the loop above... we could simply initialize // floatValue = 1, to cater for cases such as width="height", but that // wouldn't be in line with the spec which requires an explicit number if (number.IsEmpty()) { returnfalse;
}
// see if this is a percentage-based value if (i < stringLength && aString[i] == '%') {
i++;
gotPercent = true;
}
// the remainder now should be a css-unit, or a pseudo-unit, or a named-space
aString.Right(unit, stringLength - i);
if (unit.IsEmpty()) { if (gotPercent) { // case ["+"|"-"] unsigned-number "%"
aAttribute.mValue.SetPercentValue(floatValue / 100.0f);
aAttribute.mPseudoUnit = Attribute::PseudoUnit::ItSelf;
aAttribute.mState = Attribute::ParsingState::Valid; returntrue;
} else { // case ["+"|"-"] unsigned-number // XXXfredw: should we allow non-zero unitless values? See bug 757703. if (!floatValue) {
aAttribute.mValue.SetFloatValue(floatValue, eCSSUnit_Number);
aAttribute.mPseudoUnit = Attribute::PseudoUnit::ItSelf;
aAttribute.mState = Attribute::ParsingState::Valid; returntrue;
}
}
} elseif (unit.EqualsLiteral("width")) {
aAttribute.mPseudoUnit = Attribute::PseudoUnit::Width;
} elseif (unit.EqualsLiteral("height")) {
aAttribute.mPseudoUnit = Attribute::PseudoUnit::Height;
} elseif (unit.EqualsLiteral("depth")) {
aAttribute.mPseudoUnit = Attribute::PseudoUnit::Depth;
} elseif (!gotPercent) { // percentage can only apply to a pseudo-unit
// see if the unit is a named-space if (dom::MathMLElement::ParseNamedSpaceValue(
unit, aAttribute.mValue, dom::MathMLElement::PARSE_ALLOW_NEGATIVE,
*mContent->OwnerDoc())) { // re-scale properly, and we know that the unit of the named-space is 'em'
floatValue *= aAttribute.mValue.GetFloatValue();
aAttribute.mValue.SetFloatValue(floatValue, eCSSUnit_EM);
aAttribute.mPseudoUnit = Attribute::PseudoUnit::NamedSpace;
aAttribute.mState = Attribute::ParsingState::Valid; returntrue;
}
// see if the input was just a CSS value // We are not supposed to have a unitless, percent, negative or namedspace // value here.
number.Append(unit); // leave the sign out if it was there if (dom::MathMLElement::ParseNumericValue(
number, aAttribute.mValue,
dom::MathMLElement::PARSE_SUPPRESS_WARNINGS, nullptr)) {
aAttribute.mState = Attribute::ParsingState::Valid; returntrue;
}
}
// if we enter here, we have a number that will act as a multiplier on a // pseudo-unit if (aAttribute.mPseudoUnit != Attribute::PseudoUnit::Unspecified) { if (gotPercent) {
aAttribute.mValue.SetPercentValue(floatValue / 100.0f);
} else {
aAttribute.mValue.SetFloatValue(floatValue, eCSSUnit_Number);
}
#ifdef DEBUG
printf("mpadded: attribute with bad numeric value: %s\n",
NS_LossyConvertUTF16toASCII(aString).get()); #endif // if we reach here, it means we encounter an unexpected input returnfalse;
}
if (eCSSUnit_Percent == unit || eCSSUnit_Number == unit) { auto pseudoUnit = aAttribute.mPseudoUnit; if (pseudoUnit == Attribute::PseudoUnit::ItSelf) {
pseudoUnit = aSelfUnit;
} switch (pseudoUnit) { case Attribute::PseudoUnit::Width:
scaler = aDesiredSize.Width(); break;
case Attribute::PseudoUnit::Height:
scaler = aDesiredSize.BlockStartAscent(); break;
case Attribute::PseudoUnit::Depth:
scaler = aDesiredSize.Height() - aDesiredSize.BlockStartAscent(); break;
default: // if we ever reach here, it would mean something is wrong // somewhere with the setup and/or the caller
NS_ERROR("Unexpected Pseudo Unit"); return;
}
}
nscoord height = aDesiredSize.BlockStartAscent();
nscoord depth = aDesiredSize.Height() - aDesiredSize.BlockStartAscent(); // The REC says: // // "The lspace attribute ('leading' space) specifies the horizontal location // of the positioning point of the child content with respect to the // positioning point of the mpadded element. By default they coincide, and // therefore absolute values for lspace have the same effect as relative // values." // // "MathML renderers should ensure that, except for the effects of the // attributes, the relative spacing between the contents of the mpadded // element and surrounding MathML elements would not be modified by replacing // an mpadded element with an mrow element with the same content, even if // linebreaking occurs within the mpadded element." // // (http://www.w3.org/TR/MathML/chapter3.html#presm.mpadded) // // "In those discussions, the terms leading and trailing are used to specify // a side of an object when which side to use depends on the directionality; // ie. leading means left in LTR but right in RTL." // (http://www.w3.org/TR/MathML/chapter3.html#presm.bidi.math)
nscoord lspace = 0; // In MathML3, "width" will be the bounding box width and "advancewidth" will // refer "to the horizontal distance between the positioning point of the // mpadded and the positioning point for the following content". MathML2 // doesn't make the distinction.
nscoord width = aDesiredSize.Width();
nscoord voffset = 0;
// update "height" (this is the ascent in the terminology of the REC)
ParseAttribute(nsGkAtoms::height, mHeight);
UpdateValue(mHeight, Attribute::PseudoUnit::Height, aDesiredSize, height,
fontSizeInflation);
height = std::max(0, height);
// update "depth" (this is the descent in the terminology of the REC)
ParseAttribute(nsGkAtoms::depth_, mDepth);
UpdateValue(mDepth, Attribute::PseudoUnit::Depth, aDesiredSize, depth,
fontSizeInflation);
depth = std::max(0, depth);
// do the padding now that we have everything // The idea here is to maintain the invariant that <mpadded>...</mpadded> // (i.e., with no attributes) looks the same as <mrow>...</mrow>. But when // there are attributes, tweak our metrics and move children to achieve the // desired visual effects.
constbool isRTL = StyleVisibility()->mDirection == StyleDirection::Rtl; if (isRTL ? mWidth.IsValid() : mLeadingSpace.IsValid()) { // there was padding on the left. dismiss the left italic correction now // (so that our parent won't correct us)
mBoundingMetrics.leftBearing = 0;
}
if (isRTL ? mLeadingSpace.IsValid() : mWidth.IsValid()) { // there was padding on the right. dismiss the right italic correction now // (so that our parent won't correct us)
mBoundingMetrics.width = width;
mBoundingMetrics.rightBearing = mBoundingMetrics.width;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.