blob: 654252bca6e4170021f49f918ad0da7054ccf87d [file] [log] [blame]
/*
* Copyright (C) 1999 Lars Knoll ([email protected])
* (C) 1999 Antti Koivisto ([email protected])
* Copyright (C) 2003, 2006, 2007, 2009 Apple Inc. All rights reserved.
* Copyright (C) 2010, 2012 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/PaintPhase.h>
#include <WebCore/RenderElement.h>
#include <wtf/OptionSet.h>
#include <wtf/UniquelyOwned.h>
namespace WebCore {
class BlendingKeyframes;
class GraphicsLayerAnimation;
class LegacyRenderSVGResourceClipper;
class RenderLayer;
class RenderSVGResourceClipper;
class RenderSVGResourceFilter;
class RenderSVGResourceMarker;
class RenderSVGResourceMasker;
class RenderSVGResourcePaintServer;
class SVGGraphicsElement;
namespace Style {
struct SVGMarkerResource;
enum class TransformResolverOption : uint8_t;
}
class RenderLayerModelObject : public RenderElement {
WTF_MAKE_TZONE_ALLOCATED(RenderLayerModelObject);
WTF_OVERRIDE_DELETE_FOR_CHECKED_PTR(RenderLayerModelObject);
public:
virtual ~RenderLayerModelObject();
void destroyLayer();
bool hasSelfPaintingLayer() const;
RenderLayer* layer() const { return m_layer.get(); }
CheckedPtr<RenderLayer> checkedLayer() const;
void styleWillChange(Style::Difference, const RenderStyle& newStyle) override;
void styleDidChange(Style::Difference, const RenderStyle* oldStyle) override;
virtual bool requiresLayer() const = 0;
// Returns true if the background is painted opaque in the given rect.
// The query rect is given in local coordinate system.
virtual bool backgroundIsKnownToBeOpaqueInRect(const LayoutRect&) const { return false; }
// Returns false if the rect has no intersection with the applied clip rect. When the context specifies edge-inclusive
// intersection, this return value allows distinguishing between no intersection and zero-area intersection.
virtual bool applyCachedClipAndScrollPosition(RepaintRects&, const RenderLayerModelObject*, VisibleRectContext) const;
virtual bool isScrollableOrRubberbandableBox() const { return false; }
bool shouldPlaceVerticalScrollbarOnLeft() const;
std::optional<LayoutRect> cachedLayerClippedOverflowRect() const;
bool startAnimation(double timeOffset, const GraphicsLayerAnimation&, const BlendingKeyframes&) override;
void animationPaused(double timeOffset, const BlendingKeyframes&) override;
void animationFinished(const BlendingKeyframes&) override;
void transformRelatedPropertyDidChange() override;
void suspendAnimations(MonotonicTime = MonotonicTime()) override;
// Single source of truth deciding if a SVG renderer should be painted. All SVG renderers
// use this method to test if they should continue processing in the paint() function or stop.
bool shouldPaintSVGRenderer(const PaintInfo&, const OptionSet<PaintPhase> relevantPaintPhases = OptionSet<PaintPhase>()) const;
// Provides the SVG implementation for computeVisibleRectsInContainer().
// This lives in RenderLayerModelObject, which is the common base-class for all SVG renderers.
std::optional<RepaintRects> computeVisibleRectsInSVGContainer(const RepaintRects&, const RenderLayerModelObject* container, VisibleRectContext) const;
// Provides the SVG implementation for mapLocalToContainer().
// This lives in RenderLayerModelObject, which is the common base-class for all SVG renderers.
void mapLocalToSVGContainer(const RenderLayerModelObject* ancestorContainer, TransformState&, OptionSet<MapCoordinatesMode>, bool* wasFixed) const;
void applySVGTransform(TransformationMatrix&, const SVGGraphicsElement&, const RenderStyle&, const FloatRect& boundingBox, const std::optional<AffineTransform>& preApplySVGTransformMatrix, const std::optional<AffineTransform>& postApplySVGTransformMatrix, OptionSet<Style::TransformResolverOption>) const;
void updateHasSVGTransformFlags();
virtual bool needsHasSVGTransformFlags() const { ASSERT_NOT_REACHED(); return false; }
void repaintOrRelayoutAfterSVGTransformChange();
LayoutPoint nominalSVGLayoutLocation() const { return flooredLayoutPoint(objectBoundingBoxWithoutTransformations().minXMinYCorner()); }
virtual LayoutPoint currentSVGLayoutLocation() const { ASSERT_NOT_REACHED(); return { }; }
virtual void setCurrentSVGLayoutLocation(const LayoutPoint&) { ASSERT_NOT_REACHED(); }
RenderSVGResourcePaintServer* svgFillPaintServerResourceFromStyle(const RenderStyle&) const;
RenderSVGResourcePaintServer* svgStrokePaintServerResourceFromStyle(const RenderStyle&) const;
RenderSVGResourceClipper* svgClipperResourceFromStyle() const;
RenderSVGResourceFilter* svgFilterResourceFromStyle() const;
RenderSVGResourceMasker* svgMaskerResourceFromStyle() const;
RenderSVGResourceMarker* svgMarkerStartResourceFromStyle() const;
RenderSVGResourceMarker* svgMarkerMidResourceFromStyle() const;
RenderSVGResourceMarker* svgMarkerEndResourceFromStyle() const;
LegacyRenderSVGResourceClipper* legacySVGClipperResourceFromStyle() const;
bool pointInSVGClippingArea(const FloatPoint&) const;
void paintSVGClippingMask(PaintInfo&, const FloatRect& objectBoundingBox) const;
void paintSVGMask(PaintInfo&, const LayoutPoint& adjustedPaintOffset) const;
TransformationMatrix* layerTransform() const;
virtual void updateLayerTransform();
virtual void applyTransform(TransformationMatrix&, const RenderStyle&, const FloatRect& boundingBox, OptionSet<Style::TransformResolverOption>) const = 0;
void applyTransform(TransformationMatrix&, const RenderStyle&, const FloatRect& boundingBox) const;
inline bool shouldUsePositionedClipping() const;
protected:
RenderLayerModelObject(Type, Element&, RenderStyle&&, OptionSet<TypeFlag>, TypeSpecificFlags);
RenderLayerModelObject(Type, Document&, RenderStyle&&, OptionSet<TypeFlag>, TypeSpecificFlags);
void createLayer();
void willBeDestroyed() override;
virtual void updateFromStyle() { }
private:
RenderSVGResourceMarker* svgMarkerResourceFromStyle(const Style::SVGMarkerResource&) const;
UniquelyOwnedPtr<RenderLayer> m_layer;
// Used to store state between styleWillChange and styleDidChange
static bool s_wasFloating;
static bool s_hadLayer;
static bool s_wasTransformed;
static bool s_layerWasSelfPainting;
};
// Pixel-snapping (== 'device pixel alignment') helpers.
bool rendererNeedsPixelSnapping(const RenderLayerModelObject&);
FloatRect snapRectToDevicePixelsIfNeeded(const LayoutRect&, const RenderLayerModelObject&);
FloatRect snapRectToDevicePixelsIfNeeded(const FloatRect&, const RenderLayerModelObject&);
} // namespace WebCore
SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderLayerModelObject, isRenderLayerModelObject())