Bug 1030952 part 1: Save each flex item's intrinsic ratio during reflow, for easy reuse. r=mats

MozReview-Commit-ID: 84dtBQUJZP7
This commit is contained in:
Daniel Holbert 2016-04-28 20:16:58 -07:00
Родитель 25bc4aacc1
Коммит 7800939204
1 изменённых файлов: 14 добавлений и 13 удалений

Просмотреть файл

@ -554,6 +554,9 @@ public:
return mFlexShrink * mFlexBaseSize;
}
const nsSize& IntrinsicRatio() const { return mIntrinsicRatio; }
bool HasIntrinsicRatio() const { return mIntrinsicRatio != nsSize(); }
// Getters for margin:
// ===================
const nsMargin& GetMargin() const { return mMargin; }
@ -750,6 +753,8 @@ protected:
const float mFlexGrow;
const float mFlexShrink;
const nsSize mIntrinsicRatio;
const nsMargin mBorderPadding;
nsMargin mMargin; // non-const because we need to resolve auto margins
@ -1393,7 +1398,6 @@ MainSizeFromAspectRatio(nscoord aCrossSize,
static nscoord
PartiallyResolveAutoMinSize(const FlexItem& aFlexItem,
const nsHTMLReflowState& aItemReflowState,
const nsSize& aIntrinsicRatio,
const FlexboxAxisTracker& aAxisTracker)
{
MOZ_ASSERT(aFlexItem.NeedsMinSizeAutoResolution(),
@ -1430,7 +1434,7 @@ PartiallyResolveAutoMinSize(const FlexItem& aFlexItem,
// * if the item has an intrinsic aspect ratio, the width (height) calculated
// from the aspect ratio and any definite size constraints in the opposite
// dimension.
if (aAxisTracker.GetCrossComponent(aIntrinsicRatio) != 0) {
if (aAxisTracker.GetCrossComponent(aFlexItem.IntrinsicRatio()) != 0) {
// We have a usable aspect ratio. (not going to divide by 0)
const bool useMinSizeIfCrossSizeIsIndefinite = true;
nscoord crossSizeToUseWithRatio =
@ -1439,7 +1443,7 @@ PartiallyResolveAutoMinSize(const FlexItem& aFlexItem,
aAxisTracker);
nscoord minMainSizeFromRatio =
MainSizeFromAspectRatio(crossSizeToUseWithRatio,
aIntrinsicRatio, aAxisTracker);
aFlexItem.IntrinsicRatio(), aAxisTracker);
minMainSize = std::min(minMainSize, minMainSizeFromRatio);
}
@ -1453,7 +1457,6 @@ PartiallyResolveAutoMinSize(const FlexItem& aFlexItem,
static bool
ResolveAutoFlexBasisFromRatio(FlexItem& aFlexItem,
const nsHTMLReflowState& aItemReflowState,
const nsSize& aIntrinsicRatio,
const FlexboxAxisTracker& aAxisTracker)
{
MOZ_ASSERT(NS_AUTOHEIGHT == aFlexItem.GetFlexBaseSize(),
@ -1464,7 +1467,7 @@ ResolveAutoFlexBasisFromRatio(FlexItem& aFlexItem,
// - a definite cross size
// then the flex base size is calculated from its inner cross size and the
// flex items intrinsic aspect ratio.
if (aAxisTracker.GetCrossComponent(aIntrinsicRatio) != 0) {
if (aAxisTracker.GetCrossComponent(aFlexItem.IntrinsicRatio()) != 0) {
// We have a usable aspect ratio. (not going to divide by 0)
const bool useMinSizeIfCrossSizeIsIndefinite = false;
nscoord crossSizeToUseWithRatio =
@ -1475,7 +1478,7 @@ ResolveAutoFlexBasisFromRatio(FlexItem& aFlexItem,
// We have a definite cross-size
nscoord mainSizeFromRatio =
MainSizeFromAspectRatio(crossSizeToUseWithRatio,
aIntrinsicRatio, aAxisTracker);
aFlexItem.IntrinsicRatio(), aAxisTracker);
aFlexItem.SetFlexBaseSizeAndMainSize(mainSizeFromRatio);
return true;
}
@ -1533,19 +1536,15 @@ nsFlexContainerFrame::
}
}
// We'll need the intrinsic ratio (if there is one), regardless of whether
// we're resolving min-[width|height]:auto or flex-basis:auto.
const nsSize ratio = aFlexItem.Frame()->GetIntrinsicRatio();
nscoord resolvedMinSize; // (only set/used if isMainMinSizeAuto==true)
bool minSizeNeedsToMeasureContent = false; // assume the best
if (isMainMinSizeAuto) {
// Resolve the min-size, except for considering the min-content size.
// (We'll consider that later, if we need to.)
resolvedMinSize = PartiallyResolveAutoMinSize(aFlexItem, aItemReflowState,
ratio, aAxisTracker);
aAxisTracker);
if (resolvedMinSize > 0 &&
aAxisTracker.GetCrossComponent(ratio) == 0) {
aAxisTracker.GetCrossComponent(aFlexItem.IntrinsicRatio()) == 0) {
// We don't have a usable aspect ratio, so we need to consider our
// min-content size as another candidate min-size, which we'll have to
// min() with the current resolvedMinSize.
@ -1558,7 +1557,7 @@ nsFlexContainerFrame::
bool flexBasisNeedsToMeasureContent = false; // assume the best
if (isMainSizeAuto) {
if (!ResolveAutoFlexBasisFromRatio(aFlexItem, aItemReflowState,
ratio, aAxisTracker)) {
aAxisTracker)) {
flexBasisNeedsToMeasureContent = true;
}
}
@ -1678,6 +1677,7 @@ FlexItem::FlexItem(nsHTMLReflowState& aFlexItemReflowState,
: mFrame(aFlexItemReflowState.frame),
mFlexGrow(aFlexGrow),
mFlexShrink(aFlexShrink),
mIntrinsicRatio(mFrame->GetIntrinsicRatio()),
mBorderPadding(aFlexItemReflowState.ComputedPhysicalBorderPadding()),
mMargin(aFlexItemReflowState.ComputedPhysicalMargin()),
mMainMinSize(aMainMinSize),
@ -1770,6 +1770,7 @@ FlexItem::FlexItem(nsIFrame* aChildFrame, nscoord aCrossSize,
: mFrame(aChildFrame),
mFlexGrow(0.0f),
mFlexShrink(0.0f),
mIntrinsicRatio(),
// mBorderPadding uses default constructor,
// mMargin uses default constructor,
mFlexBaseSize(0),