Commit 242f5b07 authored by Fredrik Söderqvist's avatar Fredrik Söderqvist Committed by Commit Bot

Use FloatRect/FloatSize for conveying viewBox/viewport

Rather than passing a pile of floats, pass FloatRect or FloatSize as
appropriate. This better matches the values that are actually passed and
doesn't require expanding earlier than necessary.

Turn the align_ == kSvgPreserveaspectratioUnknown check in
SVGPreserveAspectRatio::ComputeTransform(...) into a DCHECK since this
is not a value that should ever be set.

Change-Id: I84c1fd5dc6509abb60595479dfa5fb2e96175d95
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2490004
Auto-Submit: Fredrik Söderquist <fs@opera.com>
Commit-Queue: Stephen Chenney <schenney@chromium.org>
Reviewed-by: default avatarStephen Chenney <schenney@chromium.org>
Cr-Commit-Position: refs/heads/master@{#819507}
parent 50d1c1ea
......@@ -160,8 +160,7 @@ SVGTransformChange LayoutSVGResourceMarker::CalculateLocalTransform(
viewport_size_ = FloatSize(width, height);
SVGTransformChangeDetector change_detector(local_to_parent_transform_);
local_to_parent_transform_ = marker->ViewBoxToViewTransform(
viewport_size_.Width(), viewport_size_.Height());
local_to_parent_transform_ = marker->ViewBoxToViewTransform(viewport_size_);
needs_transform_update_ = false;
return change_detector.ComputeChange(local_to_parent_transform_);
......
......@@ -115,7 +115,7 @@ std::unique_ptr<PatternData> LayoutSVGResourcePattern::BuildPatternData(
return pattern_data;
tile_transform = SVGFitToViewBox::ViewBoxToViewTransform(
attributes.ViewBox(), attributes.PreserveAspectRatio(),
tile_bounds.Width(), tile_bounds.Height());
tile_bounds.Size());
} else {
// A viewBox overrides patternContentUnits, per spec.
if (attributes.PatternContentUnits() ==
......
......@@ -481,8 +481,8 @@ SVGTransformChange LayoutSVGRoot::BuildLocalToBorderBoxTransform() {
auto* svg = To<SVGSVGElement>(GetNode());
DCHECK(svg);
float scale = StyleRef().EffectiveZoom();
local_to_border_box_transform_ = svg->ViewBoxToViewTransform(
ContentWidth() / scale, ContentHeight() / scale);
FloatSize content_size(ContentWidth() / scale, ContentHeight() / scale);
local_to_border_box_transform_ = svg->ViewBoxToViewTransform(content_size);
FloatPoint translate = svg->CurrentTranslate();
LayoutSize border_and_padding(BorderLeft() + PaddingLeft(),
......
......@@ -77,7 +77,7 @@ SVGTransformChange LayoutSVGViewportContainer::CalculateLocalTransform(
SVGTransformChangeDetector change_detector(local_to_parent_transform_);
local_to_parent_transform_ =
AffineTransform::Translation(viewport_.X(), viewport_.Y()) *
svg->ViewBoxToViewTransform(viewport_.Width(), viewport_.Height());
svg->ViewBoxToViewTransform(viewport_.Size());
needs_transform_update_ = false;
return change_detector.ComputeChange(local_to_parent_transform_);
}
......
......@@ -81,15 +81,10 @@ void SVGFitToViewBox::Trace(Visitor* visitor) const {
AffineTransform SVGFitToViewBox::ViewBoxToViewTransform(
const FloatRect& view_box_rect,
const SVGPreserveAspectRatio* preserve_aspect_ratio,
float view_width,
float view_height) {
if (!view_box_rect.Width() || !view_box_rect.Height() || !view_width ||
!view_height)
const FloatSize& viewport_size) {
if (view_box_rect.IsEmpty() || viewport_size.IsEmpty())
return AffineTransform();
return preserve_aspect_ratio->ComputeTransform(
view_box_rect.X(), view_box_rect.Y(), view_box_rect.Width(),
view_box_rect.Height(), view_width, view_height);
return preserve_aspect_ratio->ComputeTransform(view_box_rect, viewport_size);
}
bool SVGFitToViewBox::IsKnownAttribute(const QualifiedName& attr_name) {
......
......@@ -28,6 +28,7 @@ namespace blink {
class AffineTransform;
class FloatRect;
class FloatSize;
class QualifiedName;
class SVGAnimatedPreserveAspectRatio;
class SVGAnimatedRect;
......@@ -38,8 +39,7 @@ class SVGFitToViewBox : public GarbageCollectedMixin {
public:
static AffineTransform ViewBoxToViewTransform(const FloatRect& view_box_rect,
const SVGPreserveAspectRatio*,
float view_width,
float view_height);
const FloatSize& viewport_size);
static bool IsKnownAttribute(const QualifiedName&);
......
......@@ -99,11 +99,10 @@ void SVGMarkerElement::Trace(Visitor* visitor) const {
}
AffineTransform SVGMarkerElement::ViewBoxToViewTransform(
float view_width,
float view_height) const {
const FloatSize& viewport_size) const {
return SVGFitToViewBox::ViewBoxToViewTransform(
viewBox()->CurrentValue()->Value(), preserveAspectRatio()->CurrentValue(),
view_width, view_height);
viewport_size);
}
void SVGMarkerElement::SvgAttributeChanged(const QualifiedName& attr_name) {
......
......@@ -59,8 +59,7 @@ class SVGMarkerElement final : public SVGElement, public SVGFitToViewBox {
explicit SVGMarkerElement(Document&);
AffineTransform ViewBoxToViewTransform(float view_width,
float view_height) const;
AffineTransform ViewBoxToViewTransform(const FloatSize& viewport_size) const;
void setOrientToAuto();
void setOrientToAngle(SVGAngleTearOff*);
......
......@@ -284,30 +284,20 @@ void SVGPreserveAspectRatio::TransformRect(FloatRect& dest_rect,
}
AffineTransform SVGPreserveAspectRatio::ComputeTransform(
float logical_x,
float logical_y,
float logical_width,
float logical_height,
float physical_width,
float physical_height) const {
DCHECK(logical_width);
DCHECK(logical_height);
DCHECK(physical_width);
DCHECK(physical_height);
const FloatRect& view_box,
const FloatSize& viewport_size) const {
DCHECK(!view_box.IsEmpty());
DCHECK(!viewport_size.IsEmpty());
DCHECK_NE(align_, kSvgPreserveaspectratioUnknown);
double extended_logical_x = view_box.X();
double extended_logical_y = view_box.Y();
double extended_logical_width = view_box.Width();
double extended_logical_height = view_box.Height();
double extended_physical_width = viewport_size.Width();
double extended_physical_height = viewport_size.Height();
AffineTransform transform;
if (align_ == kSvgPreserveaspectratioUnknown)
return transform;
double extended_logical_x = logical_x;
double extended_logical_y = logical_y;
double extended_logical_width = logical_width;
double extended_logical_height = logical_height;
double extended_physical_width = physical_width;
double extended_physical_height = physical_height;
double logical_ratio = extended_logical_width / extended_logical_height;
double physical_ratio = extended_physical_width / extended_physical_height;
if (align_ == kSvgPreserveaspectratioNone) {
transform.ScaleNonUniform(
extended_physical_width / extended_logical_width,
......@@ -316,6 +306,8 @@ AffineTransform SVGPreserveAspectRatio::ComputeTransform(
return transform;
}
double logical_ratio = extended_logical_width / extended_logical_height;
double physical_ratio = extended_physical_width / extended_physical_height;
if ((logical_ratio < physical_ratio &&
(meet_or_slice_ == kSvgMeetorsliceMeet)) ||
(logical_ratio >= physical_ratio &&
......
......@@ -28,6 +28,7 @@ namespace blink {
class AffineTransform;
class FloatRect;
class FloatSize;
class SVGPreserveAspectRatioTearOff;
class SVGPreserveAspectRatio final
......@@ -74,12 +75,8 @@ class SVGPreserveAspectRatio final
void TransformRect(FloatRect& dest_rect, FloatRect& src_rect) const;
AffineTransform ComputeTransform(float logical_x,
float logical_y,
float logical_width,
float logical_height,
float physical_width,
float physical_height) const;
AffineTransform ComputeTransform(const FloatRect& view_box,
const FloatSize& viewport_size) const;
String ValueAsString() const override;
SVGParsingError SetValueAsString(const String&);
......
......@@ -483,10 +483,8 @@ AffineTransform SVGSVGElement::LocalCoordinateSpaceTransform(
return matrix.ToAffineTransform();
}
}
if (!HasEmptyViewBox()) {
FloatSize size = CurrentViewportSize();
transform.Multiply(ViewBoxToViewTransform(size.Width(), size.Height()));
}
if (!HasEmptyViewBox())
transform.Multiply(ViewBoxToViewTransform(CurrentViewportSize()));
return transform;
}
......@@ -669,11 +667,10 @@ float SVGSVGElement::IntrinsicHeight() const {
return height()->CurrentValue()->Value(length_context);
}
AffineTransform SVGSVGElement::ViewBoxToViewTransform(float view_width,
float view_height) const {
AffineTransform SVGSVGElement::ViewBoxToViewTransform(
const FloatSize& viewport_size) const {
AffineTransform ctm = SVGFitToViewBox::ViewBoxToViewTransform(
CurrentViewBoxRect(), CurrentPreserveAspectRatio(), view_width,
view_height);
CurrentViewBoxRect(), CurrentPreserveAspectRatio(), viewport_size);
if (!view_spec_ || !view_spec_->Transform())
return ctm;
const SVGTransformList* transform_list = view_spec_->Transform();
......
......@@ -93,8 +93,7 @@ class SVGSVGElement final : public SVGGraphicsElement,
static SVGTransformTearOff* createSVGTransform();
static SVGTransformTearOff* createSVGTransformFromMatrix(SVGMatrixTearOff*);
AffineTransform ViewBoxToViewTransform(float view_width,
float view_height) const;
AffineTransform ViewBoxToViewTransform(const FloatSize& viewport_size) const;
void SetupInitialView(const String& fragment_identifier,
Element* anchor_node);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment