static void InitializeTrackSize(nscoord aPercentageBasis, const nsStyleCoord& aMinCoord, const nsStyleCoord& aMaxCoord, TrackSize* aTrackSize) { // http://dev.w3.org/csswg/css-grid/#algo-init nscoord& base = aTrackSize->mBase; switch (aMaxCoord.GetUnit()) { case eStyleUnit_Enumerated: case eStyleUnit_FlexFraction: base = 0; break; default: base = nsRuleNode::ComputeCoordPercentCalc(aMinCoord, aPercentageBasis); } nscoord& limit = aTrackSize->mLimit; switch (aMaxCoord.GetUnit()) { case eStyleUnit_Enumerated: limit = NS_UNCONSTRAINEDSIZE; break; case eStyleUnit_FlexFraction: limit = base; break; default: limit = nsRuleNode::ComputeCoordPercentCalc(aMaxCoord, aPercentageBasis); if (limit < base) { limit = base; } } }
static inline PRBool IsMarginZero(nsStyleUnit aUnit, const nsStyleCoord &aCoord) { return (aUnit == eStyleUnit_Auto || (aUnit == eStyleUnit_Coord && aCoord.GetCoordValue() == 0) || (aUnit == eStyleUnit_Percent && aCoord.GetPercentValue() == 0.0)); }
PRBool nsIBox::AddCSSMaxSize(nsIBox* aBox, nsSize& aSize, PRBool &aWidthSet, PRBool &aHeightSet) { aWidthSet = PR_FALSE; aHeightSet = PR_FALSE; // add in the css min, max, pref const nsStylePosition* position = aBox->GetStylePosition(); // and max // see if the width or height was specifically set // XXX Handle eStyleUnit_Enumerated? // (Handling the eStyleUnit_Enumerated types requires // GetPrefSize/GetMinSize methods that don't consider // (min-/max-/)(width/height) properties.) const nsStyleCoord maxWidth = position->mMaxWidth; if (maxWidth.ConvertsToLength()) { aSize.width = nsRuleNode::ComputeCoordPercentCalc(maxWidth, 0); aWidthSet = PR_TRUE; } // percentages and calc() with percentages are treated like 'none' const nsStyleCoord &maxHeight = position->mMaxHeight; if (maxHeight.ConvertsToLength()) { aSize.height = nsRuleNode::ComputeCoordPercentCalc(maxHeight, 0); aHeightSet = PR_TRUE; } // percentages and calc() with percentages are treated like 'none' nsIContent* content = aBox->GetContent(); if (content) { nsAutoString value; PRInt32 error; content->GetAttr(kNameSpaceID_None, nsGkAtoms::maxwidth, value); if (!value.IsEmpty()) { value.Trim("%"); nscoord val = nsPresContext::CSSPixelsToAppUnits(value.ToInteger(&error)); aSize.width = val; aWidthSet = PR_TRUE; } content->GetAttr(kNameSpaceID_None, nsGkAtoms::maxheight, value); if (!value.IsEmpty()) { value.Trim("%"); nscoord val = nsPresContext::CSSPixelsToAppUnits(value.ToInteger(&error)); aSize.height = val; aHeightSet = PR_TRUE; } } return (aWidthSet || aHeightSet); }
bool nsStyleCoord::operator==(const nsStyleCoord& aOther) const { if (mUnit != aOther.mUnit) { return false; } switch (mUnit) { case eStyleUnit_Null: case eStyleUnit_Normal: case eStyleUnit_Auto: case eStyleUnit_None: return true; case eStyleUnit_Percent: case eStyleUnit_Factor: case eStyleUnit_Degree: case eStyleUnit_Grad: case eStyleUnit_Radian: case eStyleUnit_Turn: return mValue.mFloat == aOther.mValue.mFloat; case eStyleUnit_Coord: case eStyleUnit_Integer: case eStyleUnit_Enumerated: return mValue.mInt == aOther.mValue.mInt; case eStyleUnit_Calc: return *this->GetCalcValue() == *aOther.GetCalcValue(); } NS_ABORT_IF_FALSE(false, "unexpected unit"); return false; }
float SVGContentUtils::CoordToFloat(nsSVGElement *aContent, const nsStyleCoord &aCoord) { switch (aCoord.GetUnit()) { case eStyleUnit_Factor: // user units return aCoord.GetFactorValue(); case eStyleUnit_Coord: return nsPresContext::AppUnitsToFloatCSSPixels(aCoord.GetCoordValue()); case eStyleUnit_Percent: { SVGSVGElement* ctx = aContent->GetCtx(); return ctx ? aCoord.GetPercentValue() * ctx->GetLength(SVGContentUtils::XY) : 0.0f; } default: return 0.0f; } }
static inline bool IsFixedOffset(const nsStyleCoord& aCoord) { return aCoord.ConvertsToLength(); }
static inline bool IsFixedMarginSize(const nsStyleCoord& aCoord) { return aCoord.ConvertsToLength(); }
static inline bool IsMarginZero(const nsStyleCoord &aCoord) { return aCoord.GetUnit() == eStyleUnit_Auto || nsLayoutUtils::IsMarginZero(aCoord); }