blob: 9bae85fbe59a6a09b0cb1e6f44e2b35d24a386c6 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_BACKGROUND_IMAGE_GEOMETRY_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_BACKGROUND_IMAGE_GEOMETRY_H_
#include "third_party/blink/renderer/core/layout/geometry/physical_rect.h"
#include "third_party/blink/renderer/core/paint/paint_phase.h"
#include "third_party/blink/renderer/platform/graphics/graphics_types.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
namespace blink {
class FillLayer;
class LayoutBox;
class LayoutBoxModelObject;
class LayoutObject;
class LayoutTableCell;
class LayoutView;
class Document;
class ComputedStyle;
class ImageResourceObserver;
class LayoutNGTableCell;
class BackgroundImageGeometry {
DISALLOW_NEW();
public:
// Constructor for LayoutView where the coordinate space is different.
BackgroundImageGeometry(
const LayoutView&,
const PhysicalOffset& element_positioning_area_offset);
// Constructor for table cells where background_object may be the row or
// column the background image is attached to.
BackgroundImageGeometry(const LayoutTableCell&,
const LayoutObject* background_object);
// Generic constructor for all other elements.
BackgroundImageGeometry(const LayoutBoxModelObject&);
// Constructor for TablesNG table parts.
BackgroundImageGeometry(const LayoutNGTableCell& cell,
PhysicalOffset cell_offset,
const LayoutBox& table_part,
PhysicalSize table_part_size);
void Calculate(const LayoutBoxModelObject* container,
PaintPhase,
GlobalPaintFlags,
const FillLayer&,
const PhysicalRect& paint_rect);
// Destination rects define the area into which the image will paint.
// For cases where no explicit background size is requested, the destination
// also defines the subset of the image to be drawn. Both border-snapped
// and unsnapped rectangles are available. The snapped rectangle matches the
// inner border of the box when such information is available. This may
// may differ from the PixelSnappedIntRect of the unsnapped rectangle
// because both border widths and border locations are snapped. The
// unsnapped rectangle is the size and location intended by the content
// author, and is needed to correctly subset images when no background-size
// size is given.
const PhysicalRect& UnsnappedDestRect() const { return unsnapped_dest_rect_; }
const PhysicalRect& SnappedDestRect() const { return snapped_dest_rect_; }
// Tile size is the area into which to draw one copy of the image. It
// need not be the same as the intrinsic size of the image; if not,
// the image will be resized (via an image filter) when painted into
// that tile region. This may happen because of CSS background-size and
// background-repeat requirements.
const PhysicalSize& TileSize() const { return tile_size_; }
// Phase() represents the point in the image that will appear at (0,0) in the
// destination space. The point is defined in TileSize() coordinates, that is,
// in the scaled image.
const FloatPoint& Phase() const { return phase_; }
// SpaceSize() represents extra width and height that may be added to
// the image if used as a pattern with background-repeat: space.
const PhysicalSize& SpaceSize() const { return repeat_spacing_; }
// Has background-attachment: fixed. Implies that we can't always cheaply
// compute the destination rects.
bool HasNonLocalGeometry() const { return has_non_local_geometry_; }
// Whether the background needs to be positioned relative to a container
// element. Only used for tables.
bool CellUsingContainerBackground() const {
return cell_using_container_background_;
}
const ImageResourceObserver& ImageClient() const;
const Document& ImageDocument() const;
const ComputedStyle& ImageStyle() const;
InterpolationQuality ImageInterpolationQuality() const;
private:
static bool ShouldUseFixedAttachment(const FillLayer&);
void SetSpaceSize(const PhysicalSize& repeat_spacing) {
repeat_spacing_ = repeat_spacing;
}
void SetPhaseX(float x) { phase_.SetX(x); }
void SetPhaseY(float y) { phase_.SetY(y); }
void SetNoRepeatX(const FillLayer&,
LayoutUnit x_offset,
LayoutUnit snapped_x_offset);
void SetNoRepeatY(const FillLayer&,
LayoutUnit y_offset,
LayoutUnit snapped_y_offset);
void SetRepeatX(const FillLayer&,
LayoutUnit available_width,
LayoutUnit extra_offset);
void SetRepeatY(const FillLayer&,
LayoutUnit available_height,
LayoutUnit extra_offset);
void SetSpaceX(LayoutUnit space, LayoutUnit extra_offset);
void SetSpaceY(LayoutUnit space, LayoutUnit extra_offset);
void UseFixedAttachment(const PhysicalOffset& attachment_point);
void SetHasNonLocalGeometry() { has_non_local_geometry_ = true; }
PhysicalOffset GetPositioningOffsetForCell(const LayoutTableCell&,
const LayoutBox&);
PhysicalSize GetBackgroundObjectDimensions(const LayoutTableCell&,
const LayoutBox&);
// Compute adjustments for the destination rects. Adjustments
// both optimize painting when the background is obscured by a
// border, and snap the dest rect to the border. They also
// account for the background-clip property.
void ComputeDestRectAdjustments(const FillLayer&,
const PhysicalRect&,
bool,
LayoutRectOutsets&,
LayoutRectOutsets&) const;
// Positioning area adjustments modify the size of the
// positioning area to snap values and apply the
// background-origin property.
void ComputePositioningAreaAdjustments(const FillLayer&,
const PhysicalRect&,
bool,
LayoutRectOutsets&,
LayoutRectOutsets&) const;
void ComputePositioningArea(const LayoutBoxModelObject*,
PaintPhase,
GlobalPaintFlags,
const FillLayer&,
const PhysicalRect&,
PhysicalRect&,
PhysicalRect&,
PhysicalOffset&,
PhysicalOffset&);
void CalculateFillTileSize(const FillLayer&,
const PhysicalSize&,
const PhysicalSize&);
// The offset of the background image within the background positioning area.
PhysicalOffset OffsetInBackground(const FillLayer&) const;
// |box_| is the source for the Document. In most cases it also provides the
// background properties (see |positioning_box_| for exceptions.) It's also
// the image client unless painting the view background.
const LayoutBoxModelObject* const box_;
// The positioning box is the source of geometric information for positioning
// and sizing the background. It also provides the background properties if
// painting the view background or a table-cell using its container's
// (row's/column's) background.
const LayoutBoxModelObject* positioning_box_;
// When painting table cells or the view, the positioning area
// differs from the requested paint rect.
PhysicalSize positioning_size_override_;
// The background image offset from within the background positioning area for
// non-fixed background attachment. Used for table cells and the view.
PhysicalOffset element_positioning_area_offset_;
PhysicalRect unsnapped_dest_rect_;
PhysicalRect snapped_dest_rect_;
FloatPoint phase_;
PhysicalSize tile_size_;
PhysicalSize repeat_spacing_;
bool has_non_local_geometry_ = false;
bool painting_view_ = false;
bool painting_table_cell_ = false;
bool cell_using_container_background_ = false;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAINT_BACKGROUND_IMAGE_GEOMETRY_H_