⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 285956 in webkit


Ignore:
Timestamp:
Nov 17, 2021, 2:55:08 PM (5 years ago)
Author:
Alan Bujtas
Message:

[LFC][IFC] Introduce enum class IntrinsicWidthMode
https://bugs.webkit.org/show_bug.cgi?id=233277

Reviewed by Antti Koivisto.

This is in preparation for being able to apply different glyph hanging behavior for min and max intrinsic width computation.

  • layout/formattingContexts/FormattingConstraints.h:
  • layout/formattingContexts/inline/InlineContentBreaker.cpp:

(WebCore::Layout::InlineContentBreaker::InlineContentBreaker):

  • layout/formattingContexts/inline/InlineContentBreaker.h:

(WebCore::Layout::InlineContentBreaker::isInIntrinsicWidthMode const):

  • layout/formattingContexts/inline/InlineFormattingContext.cpp:

(WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthConstraints):
(WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthForConstraint const):

  • layout/formattingContexts/inline/InlineFormattingContext.h:
  • layout/formattingContexts/inline/InlineLineBuilder.cpp:

(WebCore::Layout::LineBuilder::LineBuilder):
(WebCore::Layout::LineBuilder::computedIntrinsicWidth):
(WebCore::Layout::LineBuilder::placeInlineContent):

  • layout/formattingContexts/inline/InlineLineBuilder.h:

(WebCore::Layout::LineBuilder::intrinsicWidthMode const):
(WebCore::Layout::LineBuilder::isInIntrinsicWidthMode const):

Location:
trunk/Source/WebCore
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r285954 r285956  
     12021-11-17  Alan Bujtas  <zalan@apple.com>
     2
     3        [LFC][IFC] Introduce enum class IntrinsicWidthMode
     4        https://bugs.webkit.org/show_bug.cgi?id=233277
     5
     6        Reviewed by Antti Koivisto.
     7
     8        This is in preparation for being able to apply different glyph hanging behavior for min and max intrinsic width computation.
     9
     10        * layout/formattingContexts/FormattingConstraints.h:
     11        * layout/formattingContexts/inline/InlineContentBreaker.cpp:
     12        (WebCore::Layout::InlineContentBreaker::InlineContentBreaker):
     13        * layout/formattingContexts/inline/InlineContentBreaker.h:
     14        (WebCore::Layout::InlineContentBreaker::isInIntrinsicWidthMode const):
     15        * layout/formattingContexts/inline/InlineFormattingContext.cpp:
     16        (WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthConstraints):
     17        (WebCore::Layout::InlineFormattingContext::computedIntrinsicWidthForConstraint const):
     18        * layout/formattingContexts/inline/InlineFormattingContext.h:
     19        * layout/formattingContexts/inline/InlineLineBuilder.cpp:
     20        (WebCore::Layout::LineBuilder::LineBuilder):
     21        (WebCore::Layout::LineBuilder::computedIntrinsicWidth):
     22        (WebCore::Layout::LineBuilder::placeInlineContent):
     23        * layout/formattingContexts/inline/InlineLineBuilder.h:
     24        (WebCore::Layout::LineBuilder::intrinsicWidthMode const):
     25        (WebCore::Layout::LineBuilder::isInIntrinsicWidthMode const):
     26
    1272021-11-17  Chris Dumez  <cdumez@apple.com>
    228
  • trunk/Source/WebCore/layout/formattingContexts/FormattingConstraints.h

    r278292 r285956  
    8888}
    8989
     90enum class IntrinsicWidthMode {
     91    Minimum,
     92    Maximum
     93};
     94
    9095struct IntrinsicWidthConstraints {
    9196    void expand(LayoutUnit horizontalValue);
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.cpp

    r285933 r285956  
    126126}
    127127
    128 InlineContentBreaker::InlineContentBreaker(bool isInIntrinsicWidthMode)
    129     : m_isInIntrinsicWidthMode(isInIntrinsicWidthMode)
     128InlineContentBreaker::InlineContentBreaker(std::optional<IntrinsicWidthMode> intrinsicWidthMode)
     129    : m_intrinsicWidthMode(intrinsicWidthMode)
    130130{
    131131}
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineContentBreaker.h

    r285930 r285956  
    2828#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
    2929
     30#include "FormattingConstraints.h"
    3031#include "LayoutUnits.h"
    3132#include "RenderStyle.h"
     
    3940class InlineContentBreaker {
    4041public:
    41     InlineContentBreaker(bool isInIntrinsicWidthMode);
     42    InlineContentBreaker(std::optional<IntrinsicWidthMode>);
    4243
    4344    struct PartialRun {
     
    151152    OptionSet<WordBreakRule> wordBreakBehavior(const RenderStyle&, bool hasWrapOpportunityAtPreviousPosition) const;
    152153    bool shouldKeepEndOfLineWhitespace(const ContinuousContent&) const;
    153     bool isInIntrinsicWidthMode() const { return m_isInIntrinsicWidthMode; }
     154    bool isInIntrinsicWidthMode() const { return !!m_intrinsicWidthMode; }
    154155
    155     bool m_isInIntrinsicWidthMode { false };
     156    std::optional<IntrinsicWidthMode> m_intrinsicWidthMode;
    156157    bool n_hyphenationIsDisabled { false };
    157158};
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.cpp

    r285806 r285956  
    398398    collectContentIfNeeded();
    399399
    400     auto maximumLineWidth = [&](auto availableWidth) {
     400    auto maximumLineWidth = [&](auto intrinsicWidthMode) {
    401401        // Switch to the min/max formatting root width values before formatting the lines.
    402402        for (auto* formattingRoot : formattingContextRootList) {
    403403            auto intrinsicWidths = layoutState.formattingStateForBox(*formattingRoot).intrinsicWidthConstraintsForBox(*formattingRoot);
    404404            auto& boxGeometry = formattingState().boxGeometry(*formattingRoot);
    405             auto contentWidth = (availableWidth ? intrinsicWidths->maximum : intrinsicWidths->minimum) - boxGeometry.horizontalMarginBorderAndPadding();
     405            auto contentWidth = (intrinsicWidthMode == IntrinsicWidthMode::Maximum ? intrinsicWidths->maximum : intrinsicWidths->minimum) - boxGeometry.horizontalMarginBorderAndPadding();
    406406            boxGeometry.setContentBoxWidth(contentWidth);
    407407        }
    408         return computedIntrinsicWidthForConstraint(availableWidth);
     408        return computedIntrinsicWidthForConstraint(intrinsicWidthMode);
    409409    };
    410410
    411     auto minimumContentWidth = ceiledLayoutUnit(maximumLineWidth(0));
    412     auto maximumContentWidth = ceiledLayoutUnit(maximumLineWidth(maxInlineLayoutUnit()));
     411    auto minimumContentWidth = ceiledLayoutUnit(maximumLineWidth(IntrinsicWidthMode::Minimum));
     412    auto maximumContentWidth = ceiledLayoutUnit(maximumLineWidth(IntrinsicWidthMode::Maximum));
    413413    auto constraints = formattingGeometry().constrainByMinMaxWidth(root(), { minimumContentWidth, maximumContentWidth });
    414414    formattingState().setIntrinsicWidthConstraints(constraints);
     
    416416}
    417417
    418 InlineLayoutUnit InlineFormattingContext::computedIntrinsicWidthForConstraint(InlineLayoutUnit availableWidth) const
     418InlineLayoutUnit InlineFormattingContext::computedIntrinsicWidthForConstraint(IntrinsicWidthMode intrinsicWidthMode) const
    419419{
    420420    auto& inlineItems = formattingState().inlineItems();
    421     auto lineBuilder = LineBuilder { *this, inlineItems };
     421    auto lineBuilder = LineBuilder { *this, inlineItems, intrinsicWidthMode };
    422422    auto layoutRange = LineBuilder::InlineItemRange { 0 , inlineItems.size() };
    423423    auto maximumLineWidth = InlineLayoutUnit { };
     
    425425    auto isFirstLine = true;
    426426    while (!layoutRange.isEmpty()) {
    427         auto intrinsicContent = lineBuilder.computedIntrinsicWidth(layoutRange, availableWidth, isFirstLine);
     427        auto intrinsicContent = lineBuilder.computedIntrinsicWidth(layoutRange, isFirstLine);
    428428        layoutRange.start = intrinsicContent.inlineItemRange.end;
    429429        maximumLineWidth = std::max(maximumLineWidth, intrinsicContent.logicalWidth);
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineFormattingContext.h

    r285162 r285956  
    6666
    6767    void computeIntrinsicWidthForFormattingRoot(const Box&);
    68     InlineLayoutUnit computedIntrinsicWidthForConstraint(InlineLayoutUnit availableWidth) const;
     68    InlineLayoutUnit computedIntrinsicWidthForConstraint(IntrinsicWidthMode) const;
    6969
    7070    void computeHorizontalMargin(const Box&, const HorizontalConstraints&);
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.cpp

    r285948 r285956  
    270270}
    271271
    272 LineBuilder::LineBuilder(InlineFormattingContext& inlineFormattingContext, FloatingState& floatingState, HorizontalConstraints rootHorizontalConstraints, const InlineItems& inlineItems, IsInIntrinsicWidthMode isInIntrinsicWidthMode)
    273     : m_isInIntrinsicWidthMode(isInIntrinsicWidthMode == IsInIntrinsicWidthMode::Yes)
     272LineBuilder::LineBuilder(InlineFormattingContext& inlineFormattingContext, FloatingState& floatingState, HorizontalConstraints rootHorizontalConstraints, const InlineItems& inlineItems, std::optional<IntrinsicWidthMode> intrinsicWidthMode)
     273    : m_intrinsicWidthMode(intrinsicWidthMode)
    274274    , m_inlineFormattingContext(inlineFormattingContext)
    275275    , m_inlineFormattingState(&inlineFormattingContext.formattingState())
     
    281281}
    282282
    283 LineBuilder::LineBuilder(const InlineFormattingContext& inlineFormattingContext, const InlineItems& inlineItems, IsInIntrinsicWidthMode isInIntrinsicWidthMode)
    284     : m_isInIntrinsicWidthMode(isInIntrinsicWidthMode == IsInIntrinsicWidthMode::Yes)
     283LineBuilder::LineBuilder(const InlineFormattingContext& inlineFormattingContext, const InlineItems& inlineItems, std::optional<IntrinsicWidthMode> intrinsicWidthMode)
     284    : m_intrinsicWidthMode(intrinsicWidthMode)
    285285    , m_inlineFormattingContext(inlineFormattingContext)
    286286    , m_line(inlineFormattingContext)
     
    327327}
    328328
    329 LineBuilder::IntrinsicContent LineBuilder::computedIntrinsicWidth(const InlineItemRange& needsLayoutRange, InlineLayoutUnit availableWidth, bool isFirstLine)
    330 {
    331     auto lineConstraints = initialConstraintsForLine({ 0, 0, availableWidth, 0 }, isFirstLine);
     329LineBuilder::IntrinsicContent LineBuilder::computedIntrinsicWidth(const InlineItemRange& needsLayoutRange, bool isFirstLine)
     330{
     331    ASSERT(isInIntrinsicWidthMode());
     332    auto lineLogicalWidth = *intrinsicWidthMode() == IntrinsicWidthMode::Maximum ? maxInlineLayoutUnit() : 0.f;
     333    auto lineConstraints = initialConstraintsForLine({ 0, 0, lineLogicalWidth, 0 }, isFirstLine);
    332334    initialize(lineConstraints, isFirstLine, needsLayoutRange.start, { }, { });
    333335
     
    394396{
    395397    auto lineCandidate = LineCandidate { layoutState().shouldIgnoreTrailingLetterSpacing() };
    396     auto inlineContentBreaker = InlineContentBreaker { isInIntrinsicWidthMode() };
     398    auto inlineContentBreaker = InlineContentBreaker { intrinsicWidthMode() };
    397399
    398400    auto currentItemIndex = needsLayoutRange.start;
  • trunk/Source/WebCore/layout/formattingContexts/inline/InlineLineBuilder.h

    r285930 r285956  
    2828#if ENABLE(LAYOUT_FORMATTING_CONTEXT)
    2929
     30#include "FormattingConstraints.h"
    3031#include "InlineContentBreaker.h"
    3132#include "InlineFormattingState.h"
     
    4041class LineBuilder {
    4142public:
    42     enum class IsInIntrinsicWidthMode { No, Yes };
    43     LineBuilder(InlineFormattingContext&, FloatingState&, HorizontalConstraints rootHorizontalConstraints, const InlineItems&, IsInIntrinsicWidthMode = IsInIntrinsicWidthMode::No);
    44     LineBuilder(const InlineFormattingContext&, const InlineItems&, IsInIntrinsicWidthMode = IsInIntrinsicWidthMode::Yes);
     43    LineBuilder(InlineFormattingContext&, FloatingState&, HorizontalConstraints rootHorizontalConstraints, const InlineItems&, std::optional<IntrinsicWidthMode> = std::nullopt);
     44    LineBuilder(const InlineFormattingContext&, const InlineItems&, std::optional<IntrinsicWidthMode>);
    4545
    4646    struct InlineItemRange {
     
    7373        const FloatList& floats;
    7474    };
    75     IntrinsicContent computedIntrinsicWidth(const InlineItemRange&, InlineLayoutUnit availableWidth, bool isFirstLine);
     75    IntrinsicContent computedIntrinsicWidth(const InlineItemRange&, bool isFirstLine);
    7676
    7777private:
     
    113113    bool isLastLineWithInlineContent(const InlineItemRange& lineRange, size_t lastInlineItemIndex, bool hasPartialTrailingContent) const;
    114114
    115     bool isInIntrinsicWidthMode() const { return m_isInIntrinsicWidthMode; }
     115    std::optional<IntrinsicWidthMode> intrinsicWidthMode() const { return m_intrinsicWidthMode; }
     116    bool isInIntrinsicWidthMode() const { return !!intrinsicWidthMode(); }
    116117
    117118    const InlineFormattingContext& formattingContext() const { return m_inlineFormattingContext; }
     
    124125private:
    125126    bool m_isFirstLine { false };
    126     bool m_isInIntrinsicWidthMode { false };
     127    std::optional<IntrinsicWidthMode> m_intrinsicWidthMode;
    127128    const InlineFormattingContext& m_inlineFormattingContext;
    128129    InlineFormattingState* m_inlineFormattingState { nullptr };
Note: See TracChangeset for help on using the changeset viewer.