| /* |
| * Copyright (C) 1999 Lars Knoll ([email protected]) |
| * (C) 1999 Antti Koivisto ([email protected]) |
| * Copyright (C) 2003-2025 Apple Inc. All rights reserved. |
| * Copyright (C) 2010-2018 Google Inc. All rights reserved. |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Library General Public |
| * License as published by the Free Software Foundation; either |
| * version 2 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Library General Public License for more details. |
| * |
| * You should have received a copy of the GNU Library General Public License |
| * along with this library; see the file COPYING.LIB. If not, write to |
| * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| * Boston, MA 02110-1301, USA. |
| * |
| */ |
| |
| #pragma once |
| |
| #include <WebCore/FontBaseline.h> |
| #include <WebCore/LayoutRect.h> |
| #include <WebCore/RectEdges.h> |
| #include <WebCore/RenderLayerModelObject.h> |
| |
| namespace WebCore { |
| |
| // Modes for some of the line-related functions. |
| enum class LineDirection : bool { Horizontal, Vertical }; |
| |
| enum class BleedAvoidance : uint8_t { |
| None, |
| ShrinkBackground, |
| UseTransparencyLayer, |
| BackgroundOverBorder |
| }; |
| |
| enum class ContentChangeType : uint8_t { |
| Image, |
| HDRImage, |
| MaskImage, |
| BackgroundImage, |
| Canvas, |
| CanvasPixels, |
| Video, |
| FullScreen, |
| Model |
| }; |
| |
| class BorderEdge; |
| class BorderShape; |
| class GraphicsContext; |
| class Image; |
| class ImageBuffer; |
| class RenderTextFragment; |
| class StickyPositionViewportConstraints; |
| class StyleImage; |
| class TransformationMatrix; |
| |
| namespace InlineIterator { |
| class InlineBoxIterator; |
| }; |
| |
| enum class BoxSide : uint8_t; |
| enum class DecodingMode : uint8_t; |
| enum class InterpolationQuality : uint8_t; |
| |
| using BoxSideSet = EnumSet<BoxSide>; |
| using BorderEdges = RectEdges<BorderEdge>; |
| |
| // This class is the base for all objects that adhere to the CSS box model as described |
| // at http://www.w3.org/TR/CSS21/box.html |
| |
| class RenderBoxModelObject : public RenderLayerModelObject { |
| WTF_MAKE_TZONE_ALLOCATED(RenderBoxModelObject); |
| WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(RenderBoxModelObject); |
| public: |
| virtual ~RenderBoxModelObject(); |
| |
| LayoutSize relativePositionOffset() const; |
| |
| FloatRect constrainingRectForStickyPosition() const; |
| std::pair<const RenderBox&, const RenderLayer*> enclosingClippingBoxForStickyPosition() const; |
| void computeStickyPositionConstraints(StickyPositionViewportConstraints&, const FloatRect& constrainingRect) const; |
| LayoutSize stickyPositionOffset() const; |
| |
| LayoutSize offsetForInFlowPosition() const; |
| |
| // IE extensions. Used to calculate offsetWidth/Height. Overridden by inlines (RenderFlow) |
| // to return the remaining width on a given line (and the height of a single line). |
| virtual LayoutUnit offsetLeft() const; |
| virtual LayoutUnit offsetTop() const; |
| virtual LayoutUnit offsetWidth() const = 0; |
| virtual LayoutUnit offsetHeight() const = 0; |
| |
| void updateFromStyle() override; |
| |
| bool requiresLayer() const override; |
| |
| // This will work on inlines to return the bounding box of all of the lines' border boxes. |
| virtual LayoutRect borderBoundingBox() const = 0; |
| |
| // These return the CSS computed padding values. |
| inline LayoutUnit computedCSSPaddingTop() const; |
| inline LayoutUnit computedCSSPaddingBottom() const; |
| inline LayoutUnit computedCSSPaddingLeft() const; |
| inline LayoutUnit computedCSSPaddingRight() const; |
| inline LayoutUnit computedCSSPaddingBefore() const; |
| inline LayoutUnit computedCSSPaddingAfter() const; |
| inline LayoutUnit computedCSSPaddingStart() const; |
| inline LayoutUnit computedCSSPaddingEnd() const; |
| |
| // These functions are used during layout. Table cells and the MathML |
| // code override them to include some extra intrinsic padding. |
| virtual inline RectEdges<LayoutUnit> padding() const; |
| virtual inline LayoutUnit paddingTop() const; |
| virtual inline LayoutUnit paddingBottom() const; |
| virtual inline LayoutUnit paddingLeft() const; |
| virtual inline LayoutUnit paddingRight() const; |
| virtual inline LayoutUnit paddingBefore() const; |
| virtual inline LayoutUnit paddingAfter() const; |
| virtual inline LayoutUnit paddingStart() const; |
| virtual inline LayoutUnit paddingEnd() const; |
| |
| virtual inline RectEdges<LayoutUnit> borderWidths() const; |
| virtual inline LayoutUnit borderTop() const; |
| virtual inline LayoutUnit borderBottom() const; |
| virtual inline LayoutUnit borderLeft() const; |
| virtual inline LayoutUnit borderRight() const; |
| |
| virtual inline LayoutUnit horizontalBorderExtent() const; |
| virtual inline LayoutUnit verticalBorderExtent() const; |
| |
| virtual inline LayoutUnit borderBefore() const; |
| virtual inline LayoutUnit borderAfter() const; |
| virtual inline LayoutUnit borderStart() const; |
| virtual inline LayoutUnit borderEnd() const; |
| |
| inline LayoutUnit borderAndPaddingStart() const; |
| inline LayoutUnit borderAndPaddingEnd() const; |
| inline LayoutUnit borderAndPaddingBefore() const; |
| inline LayoutUnit borderAndPaddingAfter() const; |
| |
| inline LayoutUnit marginAndBorderAndPaddingStart() const; |
| inline LayoutUnit marginAndBorderAndPaddingEnd() const; |
| inline LayoutUnit marginAndBorderAndPaddingBefore() const; |
| inline LayoutUnit marginAndBorderAndPaddingAfter() const; |
| |
| inline LayoutUnit verticalBorderAndPaddingExtent() const; |
| inline LayoutUnit horizontalBorderAndPaddingExtent() const; |
| inline LayoutUnit borderAndPaddingLogicalHeight() const; |
| inline LayoutUnit borderAndPaddingLogicalWidth() const; |
| inline LayoutUnit borderAndPaddingLogicalLeft() const; |
| inline LayoutUnit borderAndPaddingLogicalRight() const; |
| |
| inline LayoutUnit borderLogicalLeft() const; |
| inline LayoutUnit borderLogicalRight() const; |
| inline LayoutUnit borderLogicalWidth() const; |
| inline LayoutUnit borderLogicalHeight() const; |
| |
| inline LayoutUnit paddingLogicalLeft() const; |
| inline LayoutUnit paddingLogicalRight() const; |
| inline LayoutUnit paddingLogicalWidth() const; |
| inline LayoutUnit paddingLogicalHeight() const; |
| |
| virtual LayoutUnit marginTop() const = 0; |
| virtual LayoutUnit marginBottom() const = 0; |
| virtual LayoutUnit marginLeft() const = 0; |
| virtual LayoutUnit marginRight() const = 0; |
| virtual LayoutUnit marginBefore(const WritingMode) const = 0; |
| virtual LayoutUnit marginAfter(const WritingMode) const = 0; |
| virtual LayoutUnit marginStart(const WritingMode) const = 0; |
| virtual LayoutUnit marginEnd(const WritingMode) const = 0; |
| inline LayoutUnit marginBefore() const; |
| inline LayoutUnit marginAfter() const; |
| inline LayoutUnit marginStart() const; |
| inline LayoutUnit marginEnd() const; |
| inline LayoutUnit verticalMarginExtent() const; |
| inline LayoutUnit horizontalMarginExtent() const; |
| inline LayoutUnit marginLogicalHeight() const; |
| inline LayoutUnit marginLogicalWidth() const; |
| |
| BorderShape borderShapeForContentClipping(const LayoutRect& borderBoxRect, RectEdges<bool> closedEdges = { true }) const; |
| |
| inline bool hasInlineDirectionBordersPaddingOrMargin() const; |
| inline bool hasInlineDirectionBordersOrPadding() const; |
| |
| virtual LayoutUnit containingBlockLogicalWidthForContent() const; |
| |
| void mapAbsoluteToLocalPoint(OptionSet<MapCoordinatesMode>, TransformState&) const override; |
| |
| void setSelectionState(HighlightState) override; |
| |
| bool canHaveBoxInfoInFragment() const { return !isFloating() && !isBlockLevelReplacedOrAtomicInline() && !isInline() && !isRenderTableCell() && isRenderBlock() && !isRenderSVGBlock(); } |
| |
| void contentChanged(ContentChangeType, const std::optional<FloatRect>& = std::nullopt); |
| bool hasAcceleratedCompositing() const; |
| |
| RenderBoxModelObject* continuation() const; |
| WEBCORE_EXPORT RenderInline* inlineContinuation() const; |
| |
| static void forRendererAndContinuations(RenderBoxModelObject&, const std::function<void(RenderBoxModelObject&)>&); |
| |
| void insertIntoContinuationChainAfter(RenderBoxModelObject&); |
| void removeFromContinuationChain(); |
| |
| bool hasRunningAcceleratedAnimations() const; |
| |
| void applyTransform(TransformationMatrix&, const RenderStyle&, const FloatRect& boundingBox, OptionSet<Style::TransformResolverOption>) const override; |
| |
| protected: |
| RenderBoxModelObject(Type, Element&, RenderStyle&&, OptionSet<TypeFlag>, TypeSpecificFlags); |
| RenderBoxModelObject(Type, Document&, RenderStyle&&, OptionSet<TypeFlag>, TypeSpecificFlags); |
| |
| void willBeDestroyed() override; |
| |
| void styleWillChange(Style::Difference, const RenderStyle& newStyle) override; |
| |
| LayoutPoint adjustedPositionRelativeToOffsetParent(const LayoutPoint&) const; |
| |
| bool hasVisibleBoxDecorationStyle() const; |
| bool borderObscuresBackgroundEdge(const FloatSize& contextScale) const; |
| bool borderObscuresBackground() const; |
| |
| public: |
| bool fixedBackgroundPaintsInLocalCoordinates() const; |
| InterpolationQuality chooseInterpolationQuality(GraphicsContext&, Image&, const void*, const LayoutSize&) const; |
| DecodingMode decodingModeForImageDraw(const Image&, const PaintInfo&) const; |
| |
| void paintMaskForTextFillBox(GraphicsContext&, const FloatRect&, const InlineIterator::InlineBoxIterator&, const LayoutRect&); |
| |
| // For RenderBlocks and RenderInlines with m_style->pseudoElementType() == PseudoElementType::FirstLetter, this tracks their remaining text fragments |
| RenderTextFragment* firstLetterRemainingText() const; |
| void setFirstLetterRemainingText(RenderTextFragment&); |
| void clearFirstLetterRemainingText(); |
| |
| enum class ScaleByUsedZoom : bool { No, Yes }; |
| LayoutSize calculateImageIntrinsicDimensions(StyleImage*, const LayoutSize& scaledPositioningAreaSize, ScaleByUsedZoom) const; |
| |
| RenderBlock* containingBlockForAutoHeightDetection(const Style::PreferredSize& logicalHeight) const; |
| RenderBlock* containingBlockForAutoHeightDetection(const Style::MinimumSize& logicalHeight) const; |
| RenderBlock* containingBlockForAutoHeightDetection(const Style::MaximumSize& logicalHeight) const; |
| |
| void removeOutOfFlowBoxesIfNeededOnStyleChange(RenderBlock& delegateBlock, const RenderStyle& oldStyle, const RenderStyle& newStyle); |
| |
| struct ContinuationChainNode { |
| WTF_DEPRECATED_MAKE_STRUCT_FAST_ALLOCATED(ContinuationChainNode); |
| |
| SingleThreadWeakPtr<RenderBoxModelObject> renderer; |
| ContinuationChainNode* previous { nullptr }; |
| ContinuationChainNode* next { nullptr }; |
| |
| ContinuationChainNode(RenderBoxModelObject&); |
| ~ContinuationChainNode(); |
| |
| void insertAfter(ContinuationChainNode&); |
| }; |
| |
| ContinuationChainNode* continuationChainNode() const; |
| |
| protected: |
| LayoutUnit resolveLengthPercentageUsingContainerLogicalWidth(const auto&) const; |
| LayoutUnit resolveLengthPercentageUsingContainerLogicalWidth(const auto&, const Style::ZoomFactor&) const; |
| |
| virtual void absoluteQuadsIgnoringContinuation(const FloatRect&, Vector<FloatQuad>&, bool* /*wasFixed*/) const { ASSERT_NOT_REACHED(); } |
| void collectAbsoluteQuadsForContinuation(Vector<FloatQuad>& quads, bool* wasFixed) const; |
| |
| private: |
| ContinuationChainNode& ensureContinuationChainNode(); |
| |
| virtual LayoutRect frameRectForStickyPositioning() const = 0; |
| |
| RenderBlock* containingBlockForAutoHeightDetectionGeneric(const auto& logicalHeight) const; |
| }; |
| |
| } // namespace WebCore |
| |
| SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderBoxModelObject, isRenderBoxModelObject()) |