#include "third_party/blink/renderer/core/paint/box_painter_base.h"
#include <optional>
#include "base/containers/adapters.h"
#include "third_party/blink/renderer/core/animation/element_animations.h"
#include "third_party/blink/renderer/core/css/background_color_paint_image_generator.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/dom/node_computed_style.h"
#include "third_party/blink/renderer/core/frame/settings.h"
#include "third_party/blink/renderer/core/inspector/inspector_trace_events.h"
#include "third_party/blink/renderer/core/layout/layout_progress.h"
#include "third_party/blink/renderer/core/paint/background_image_geometry.h"
#include "third_party/blink/renderer/core/paint/box_background_paint_context.h"
#include "third_party/blink/renderer/core/paint/box_border_painter.h"
#include "third_party/blink/renderer/core/paint/nine_piece_image_painter.h"
#include "third_party/blink/renderer/core/paint/paint_auto_dark_mode.h"
#include "third_party/blink/renderer/core/paint/paint_info.h"
#include "third_party/blink/renderer/core/paint/paint_layer.h"
#include "third_party/blink/renderer/core/paint/rounded_border_geometry.h"
#include "third_party/blink/renderer/core/paint/rounded_inner_rect_clipper.h"
#include "third_party/blink/renderer/core/paint/svg_mask_painter.h"
#include "third_party/blink/renderer/core/paint/timing/image_element_timing.h"
#include "third_party/blink/renderer/core/paint/timing/paint_timing_detector.h"
#include "third_party/blink/renderer/core/style/border_edge.h"
#include "third_party/blink/renderer/core/style/computed_style.h"
#include "third_party/blink/renderer/core/style/shadow_list.h"
#include "third_party/blink/renderer/core/style/style_fetched_image.h"
#include "third_party/blink/renderer/core/style/style_mask_source_image.h"
#include "third_party/blink/renderer/platform/graphics/bitmap_image.h"
#include "third_party/blink/renderer/platform/graphics/draw_looper_builder.h"
#include "third_party/blink/renderer/platform/graphics/graphics_context.h"
#include "third_party/blink/renderer/platform/graphics/graphics_context_state_saver.h"
#include "third_party/blink/renderer/platform/graphics/paint/paint_controller.h"
#include "third_party/blink/renderer/platform/graphics/paint_generated_image.h"
#include "third_party/blink/renderer/platform/graphics/scoped_image_rendering_settings.h"
#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
#include "ui/gfx/geometry/rect_conversions.h"
namespace blink {
CompositedPaintStatus;
void BoxPainterBase::PaintFillLayers(
const PaintInfo& paint_info,
const Color& c,
const FillLayer& fill_layer,
const PhysicalRect& rect,
const BoxBackgroundPaintContext& bg_paint_context,
BackgroundBleedAvoidance bleed) { … }
namespace {
void ApplySpreadToShadowShape(FloatRoundedRect& shadow_shape, float spread) { … }
Node* GeneratingNode(Node* node) { … }
BackgroundColorPaintImageGenerator* GetBackgroundColorPaintImageGenerator(
const Document& document) { … }
void SetHasNativeBackgroundPainter(Node* node, bool state) { … }
bool CanCompositeBackgroundColorAnimation(Node* node) { … }
CompositedPaintStatus CompositedBackgroundColorStatus(Node* node) { … }
void ClipToBorderEdge(GraphicsContext& context,
const FloatRoundedRect& border,
bool has_border_radius,
bool has_opaque_background) { … }
void ClipToSides(GraphicsContext& context,
const FloatRoundedRect& border,
const ShadowData& shadow,
PhysicalBoxSides sides_to_include) { … }
void AdjustRectForSideClipping(gfx::RectF& rect,
const ShadowData& shadow,
PhysicalBoxSides sides_to_include) { … }
bool ShadowIsFullyObscured(const ShadowData& shadow) { … }
}
void BoxPainterBase::PaintNormalBoxShadow(const PaintInfo& info,
const PhysicalRect& paint_rect,
const ComputedStyle& style,
PhysicalBoxSides sides_to_include,
bool background_is_skipped) { … }
void BoxPainterBase::PaintInsetBoxShadowWithBorderRect(
const PaintInfo& info,
const PhysicalRect& border_rect,
const ComputedStyle& style,
PhysicalBoxSides sides_to_include) { … }
void BoxPainterBase::PaintInsetBoxShadowWithInnerRect(
const PaintInfo& info,
const PhysicalRect& inner_rect,
const ComputedStyle& style) { … }
namespace {
inline gfx::RectF AreaCastingShadowInHole(const gfx::RectF& hole_rect,
const ShadowData& shadow) { … }
}
void BoxPainterBase::PaintInsetBoxShadow(const PaintInfo& info,
const FloatRoundedRect& bounds,
const ComputedStyle& style,
PhysicalBoxSides sides_to_include) { … }
bool BoxPainterBase::ShouldForceWhiteBackgroundForPrintEconomy(
const Document& document,
const ComputedStyle& style) { … }
bool BoxPainterBase::CalculateFillLayerOcclusionCulling(
FillLayerOcclusionOutputList& reversed_paint_list,
const FillLayer& fill_layer) { … }
BoxPainterBase::FillLayerInfo::FillLayerInfo(
const Document& doc,
const ComputedStyle& style,
bool is_scroll_container,
Color bg_color,
const FillLayer& layer,
BackgroundBleedAvoidance bleed_avoidance,
PhysicalBoxSides sides_to_include,
bool is_inline,
bool is_painting_background_in_contents_space)
: … { … }
namespace {
gfx::RectF SnapSourceRectIfNearIntegral(const gfx::RectF src_rect) { … }
std::optional<gfx::RectF> OptimizeToSingleTileDraw(
const BackgroundImageGeometry& geometry,
const PhysicalRect& dest_rect,
Image& image,
RespectImageOrientationEnum respect_orientation) { … }
PhysicalRect GetSubsetDestRectForImage(const BackgroundImageGeometry& geometry,
const Image& image) { … }
void DrawTiledBackground(LocalFrame* frame,
GraphicsContext& context,
const ComputedStyle& style,
Image& image,
const BackgroundImageGeometry& geometry,
SkBlendMode op,
RespectImageOrientationEnum respect_orientation,
ImagePaintTimingInfo paint_timing_info) { … }
scoped_refptr<Image> GetBGColorPaintWorkletImage(const Document& document,
Node* node,
const gfx::SizeF& image_size) { … }
bool PaintBGColorWithPaintWorklet(const Document& document,
const BoxPainterBase::FillLayerInfo& info,
Node* node,
const ComputedStyle& style,
const FloatRoundedRect& dest_rect,
GraphicsContext& context) { … }
bool WillDrawImage(
Node* node,
const Image& image,
const StyleImage& style_image,
const PropertyTreeStateOrAlias& current_paint_chunk_properties,
const gfx::RectF& image_rect) { … }
ImagePaintTimingInfo ComputeImagePaintTimingInfo(Node* node,
const Image& image,
const StyleImage& style_image,
const GraphicsContext& context,
const gfx::RectF& rect) { … }
inline bool CanUseBottomLayerFastPath(
const BoxPainterBase::FillLayerInfo& info,
const BoxBackgroundPaintContext& bg_paint_context,
BackgroundBleedAvoidance bleed_avoidance,
bool did_adjust_paint_rect) { … }
inline bool PaintFastBottomLayer(const Document& document,
Node* node,
const ComputedStyle& style,
GraphicsContext& context,
const BoxPainterBase::FillLayerInfo& info,
const PhysicalRect& rect,
const FloatRoundedRect& border_rect,
const BackgroundImageGeometry& geometry,
Image* image,
SkBlendMode composite_op) { … }
FloatRoundedRect BackgroundRoundedRectAdjustedForBleedAvoidance(
const ComputedStyle& style,
const PhysicalRect& border_rect,
bool object_has_multiple_boxes,
PhysicalBoxSides sides_to_include,
const FloatRoundedRect& background_rounded_rect) { … }
FloatRoundedRect RoundedBorderRectForClip(
const ComputedStyle& style,
const BoxPainterBase::FillLayerInfo& info,
const FillLayer& bg_layer,
const PhysicalRect& rect,
bool object_has_multiple_boxes,
const PhysicalSize& flow_box_size,
BackgroundBleedAvoidance bleed_avoidance,
const PhysicalBoxStrut& border_padding_insets) { … }
void PaintFillLayerBackground(const Document& document,
GraphicsContext& context,
const BoxPainterBase::FillLayerInfo& info,
Node* node,
const ComputedStyle& style,
Image* image,
SkBlendMode composite_op,
const BackgroundImageGeometry& geometry,
const PhysicalRect& scrolled_paint_rect) { … }
bool ShouldApplyBlendOperation(const BoxPainterBase::FillLayerInfo& info,
const FillLayer& layer) { … }
bool NeedsMaskLuminanceLayer(const FillLayer& layer) { … }
const StyleMaskSourceImage* ToMaskSourceIfSVGMask(
const StyleImage& style_image) { … }
class ScopedMaskLuminanceLayer { … };
PhysicalBoxStrut ComputeSnappedBorders(
const BoxBackgroundPaintContext& bg_paint_context) { … }
}
void BoxPainterBase::PaintFillLayer(
const PaintInfo& paint_info,
const Color& color,
const FillLayer& bg_layer,
const PhysicalRect& rect,
BackgroundBleedAvoidance bleed_avoidance,
const BoxBackgroundPaintContext& bg_paint_context,
bool object_has_multiple_boxes,
const PhysicalSize& flow_box_size) { … }
void BoxPainterBase::PaintFillLayerTextFillBox(
const PaintInfo& paint_info,
const BoxPainterBase::FillLayerInfo& info,
Image* image,
SkBlendMode composite_op,
const BackgroundImageGeometry& geometry,
const PhysicalRect& rect,
const PhysicalRect& scrolled_paint_rect,
bool object_has_multiple_boxes) { … }
void BoxPainterBase::PaintBorder(const ImageResourceObserver& obj,
const Document& document,
Node* node,
const PaintInfo& info,
const PhysicalRect& rect,
const ComputedStyle& style,
BackgroundBleedAvoidance bleed_avoidance,
PhysicalBoxSides sides_to_include) { … }
void BoxPainterBase::PaintMaskImages(
const PaintInfo& paint_info,
const PhysicalRect& paint_rect,
const ImageResourceObserver& obj,
const BoxBackgroundPaintContext& bg_paint_context,
PhysicalBoxSides sides_to_include) { … }
bool BoxPainterBase::ShouldSkipPaintUnderInvalidationChecking(
const LayoutBox& box) { … }
}