107 lines
4.1 KiB
C++
107 lines
4.1 KiB
C++
/*
|
|
* Copyright (C) 2018 Apple Inc. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
|
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
|
|
* THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
|
|
|
|
#include "LayoutUnit.h"
|
|
#include <optional>
|
|
|
|
namespace WebCore {
|
|
namespace Layout {
|
|
|
|
struct ComputedVerticalMargin {
|
|
std::optional<LayoutUnit> before;
|
|
std::optional<LayoutUnit> after;
|
|
};
|
|
|
|
struct UsedVerticalMargin {
|
|
struct NonCollapsedValues {
|
|
LayoutUnit before;
|
|
LayoutUnit after;
|
|
};
|
|
NonCollapsedValues nonCollapsedValues;
|
|
|
|
struct CollapsedValues {
|
|
std::optional<LayoutUnit> before;
|
|
std::optional<LayoutUnit> after;
|
|
bool isCollapsedThrough { false };
|
|
};
|
|
CollapsedValues collapsedValues;
|
|
|
|
// FIXME: This structure might need to change to indicate that the cached value is not necessarily the same as the box's computed margin value.
|
|
// This only matters in case of collapse through margins when they collapse into another sibling box.
|
|
// <div style="margin: 1px"></div><div style="margin: 10px"></div> <- the second div's before/after marings collapse through and the same time they collapse into
|
|
// the first div. When the parent computes its before margin, it should see the second div's collapsed through margin as the value to collapse width (adjoining margin value).
|
|
// So while the first div's before margin is not 10px, the cached value is 10px so that when we compute the parent's margin we just need to check the first
|
|
// inflow child's cached margin values.
|
|
struct PositiveAndNegativePair {
|
|
struct Values {
|
|
bool isNonZero() const { return positive.value_or(0) || negative.value_or(0); }
|
|
|
|
std::optional<LayoutUnit> positive;
|
|
std::optional<LayoutUnit> negative;
|
|
bool isQuirk { false };
|
|
};
|
|
Values before;
|
|
Values after;
|
|
};
|
|
PositiveAndNegativePair positiveAndNegativeValues;
|
|
};
|
|
|
|
static inline LayoutUnit marginBefore(const UsedVerticalMargin& usedVerticalMargin)
|
|
{
|
|
return usedVerticalMargin.collapsedValues.before.value_or(usedVerticalMargin.nonCollapsedValues.before);
|
|
}
|
|
|
|
static inline LayoutUnit marginAfter(const UsedVerticalMargin& usedVerticalMargin)
|
|
{
|
|
if (usedVerticalMargin.collapsedValues.isCollapsedThrough)
|
|
return 0_lu;
|
|
return usedVerticalMargin.collapsedValues.after.value_or(usedVerticalMargin.nonCollapsedValues.after);
|
|
}
|
|
|
|
struct ComputedHorizontalMargin {
|
|
std::optional<LayoutUnit> start;
|
|
std::optional<LayoutUnit> end;
|
|
};
|
|
|
|
struct UsedHorizontalMargin {
|
|
LayoutUnit start;
|
|
LayoutUnit end;
|
|
};
|
|
|
|
struct PrecomputedMarginBefore {
|
|
LayoutUnit usedValue() const { return collapsedValue.value_or(nonCollapsedValue); }
|
|
LayoutUnit nonCollapsedValue;
|
|
std::optional<LayoutUnit> collapsedValue;
|
|
UsedVerticalMargin::PositiveAndNegativePair::Values positiveAndNegativeMarginBefore;
|
|
};
|
|
|
|
}
|
|
}
|
|
#endif
|