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( ...@@ -160,8 +160,7 @@ SVGTransformChange LayoutSVGResourceMarker::CalculateLocalTransform(
viewport_size_ = FloatSize(width, height); viewport_size_ = FloatSize(width, height);
SVGTransformChangeDetector change_detector(local_to_parent_transform_); SVGTransformChangeDetector change_detector(local_to_parent_transform_);
local_to_parent_transform_ = marker->ViewBoxToViewTransform( local_to_parent_transform_ = marker->ViewBoxToViewTransform(viewport_size_);
viewport_size_.Width(), viewport_size_.Height());
needs_transform_update_ = false; needs_transform_update_ = false;
return change_detector.ComputeChange(local_to_parent_transform_); return change_detector.ComputeChange(local_to_parent_transform_);
......
...@@ -115,7 +115,7 @@ std::unique_ptr<PatternData> LayoutSVGResourcePattern::BuildPatternData( ...@@ -115,7 +115,7 @@ std::unique_ptr<PatternData> LayoutSVGResourcePattern::BuildPatternData(
return pattern_data; return pattern_data;
tile_transform = SVGFitToViewBox::ViewBoxToViewTransform( tile_transform = SVGFitToViewBox::ViewBoxToViewTransform(
attributes.ViewBox(), attributes.PreserveAspectRatio(), attributes.ViewBox(), attributes.PreserveAspectRatio(),
tile_bounds.Width(), tile_bounds.Height()); tile_bounds.Size());
} else { } else {
// A viewBox overrides patternContentUnits, per spec. // A viewBox overrides patternContentUnits, per spec.
if (attributes.PatternContentUnits() == if (attributes.PatternContentUnits() ==
......
...@@ -481,8 +481,8 @@ SVGTransformChange LayoutSVGRoot::BuildLocalToBorderBoxTransform() { ...@@ -481,8 +481,8 @@ SVGTransformChange LayoutSVGRoot::BuildLocalToBorderBoxTransform() {
auto* svg = To<SVGSVGElement>(GetNode()); auto* svg = To<SVGSVGElement>(GetNode());
DCHECK(svg); DCHECK(svg);
float scale = StyleRef().EffectiveZoom(); float scale = StyleRef().EffectiveZoom();
local_to_border_box_transform_ = svg->ViewBoxToViewTransform( FloatSize content_size(ContentWidth() / scale, ContentHeight() / scale);
ContentWidth() / scale, ContentHeight() / scale); local_to_border_box_transform_ = svg->ViewBoxToViewTransform(content_size);
FloatPoint translate = svg->CurrentTranslate(); FloatPoint translate = svg->CurrentTranslate();
LayoutSize border_and_padding(BorderLeft() + PaddingLeft(), LayoutSize border_and_padding(BorderLeft() + PaddingLeft(),
......
...@@ -77,7 +77,7 @@ SVGTransformChange LayoutSVGViewportContainer::CalculateLocalTransform( ...@@ -77,7 +77,7 @@ SVGTransformChange LayoutSVGViewportContainer::CalculateLocalTransform(
SVGTransformChangeDetector change_detector(local_to_parent_transform_); SVGTransformChangeDetector change_detector(local_to_parent_transform_);
local_to_parent_transform_ = local_to_parent_transform_ =
AffineTransform::Translation(viewport_.X(), viewport_.Y()) * AffineTransform::Translation(viewport_.X(), viewport_.Y()) *
svg->ViewBoxToViewTransform(viewport_.Width(), viewport_.Height()); svg->ViewBoxToViewTransform(viewport_.Size());
needs_transform_update_ = false; needs_transform_update_ = false;
return change_detector.ComputeChange(local_to_parent_transform_); return change_detector.ComputeChange(local_to_parent_transform_);
} }
......
...@@ -81,15 +81,10 @@ void SVGFitToViewBox::Trace(Visitor* visitor) const { ...@@ -81,15 +81,10 @@ void SVGFitToViewBox::Trace(Visitor* visitor) const {
AffineTransform SVGFitToViewBox::ViewBoxToViewTransform( AffineTransform SVGFitToViewBox::ViewBoxToViewTransform(
const FloatRect& view_box_rect, const FloatRect& view_box_rect,
const SVGPreserveAspectRatio* preserve_aspect_ratio, const SVGPreserveAspectRatio* preserve_aspect_ratio,
float view_width, const FloatSize& viewport_size) {
float view_height) { if (view_box_rect.IsEmpty() || viewport_size.IsEmpty())
if (!view_box_rect.Width() || !view_box_rect.Height() || !view_width ||
!view_height)
return AffineTransform(); return AffineTransform();
return preserve_aspect_ratio->ComputeTransform(view_box_rect, viewport_size);
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);
} }
bool SVGFitToViewBox::IsKnownAttribute(const QualifiedName& attr_name) { bool SVGFitToViewBox::IsKnownAttribute(const QualifiedName& attr_name) {
......
...@@ -28,6 +28,7 @@ namespace blink { ...@@ -28,6 +28,7 @@ namespace blink {
class AffineTransform; class AffineTransform;
class FloatRect; class FloatRect;
class FloatSize;
class QualifiedName; class QualifiedName;
class SVGAnimatedPreserveAspectRatio; class SVGAnimatedPreserveAspectRatio;
class SVGAnimatedRect; class SVGAnimatedRect;
...@@ -38,8 +39,7 @@ class SVGFitToViewBox : public GarbageCollectedMixin { ...@@ -38,8 +39,7 @@ class SVGFitToViewBox : public GarbageCollectedMixin {
public: public:
static AffineTransform ViewBoxToViewTransform(const FloatRect& view_box_rect, static AffineTransform ViewBoxToViewTransform(const FloatRect& view_box_rect,
const SVGPreserveAspectRatio*, const SVGPreserveAspectRatio*,
float view_width, const FloatSize& viewport_size);
float view_height);
static bool IsKnownAttribute(const QualifiedName&); static bool IsKnownAttribute(const QualifiedName&);
......
...@@ -99,11 +99,10 @@ void SVGMarkerElement::Trace(Visitor* visitor) const { ...@@ -99,11 +99,10 @@ void SVGMarkerElement::Trace(Visitor* visitor) const {
} }
AffineTransform SVGMarkerElement::ViewBoxToViewTransform( AffineTransform SVGMarkerElement::ViewBoxToViewTransform(
float view_width, const FloatSize& viewport_size) const {
float view_height) const {
return SVGFitToViewBox::ViewBoxToViewTransform( return SVGFitToViewBox::ViewBoxToViewTransform(
viewBox()->CurrentValue()->Value(), preserveAspectRatio()->CurrentValue(), viewBox()->CurrentValue()->Value(), preserveAspectRatio()->CurrentValue(),
view_width, view_height); viewport_size);
} }
void SVGMarkerElement::SvgAttributeChanged(const QualifiedName& attr_name) { void SVGMarkerElement::SvgAttributeChanged(const QualifiedName& attr_name) {
......
...@@ -59,8 +59,7 @@ class SVGMarkerElement final : public SVGElement, public SVGFitToViewBox { ...@@ -59,8 +59,7 @@ class SVGMarkerElement final : public SVGElement, public SVGFitToViewBox {
explicit SVGMarkerElement(Document&); explicit SVGMarkerElement(Document&);
AffineTransform ViewBoxToViewTransform(float view_width, AffineTransform ViewBoxToViewTransform(const FloatSize& viewport_size) const;
float view_height) const;
void setOrientToAuto(); void setOrientToAuto();
void setOrientToAngle(SVGAngleTearOff*); void setOrientToAngle(SVGAngleTearOff*);
......
...@@ -284,30 +284,20 @@ void SVGPreserveAspectRatio::TransformRect(FloatRect& dest_rect, ...@@ -284,30 +284,20 @@ void SVGPreserveAspectRatio::TransformRect(FloatRect& dest_rect,
} }
AffineTransform SVGPreserveAspectRatio::ComputeTransform( AffineTransform SVGPreserveAspectRatio::ComputeTransform(
float logical_x, const FloatRect& view_box,
float logical_y, const FloatSize& viewport_size) const {
float logical_width, DCHECK(!view_box.IsEmpty());
float logical_height, DCHECK(!viewport_size.IsEmpty());
float physical_width, DCHECK_NE(align_, kSvgPreserveaspectratioUnknown);
float physical_height) const {
DCHECK(logical_width); double extended_logical_x = view_box.X();
DCHECK(logical_height); double extended_logical_y = view_box.Y();
DCHECK(physical_width); double extended_logical_width = view_box.Width();
DCHECK(physical_height); double extended_logical_height = view_box.Height();
double extended_physical_width = viewport_size.Width();
double extended_physical_height = viewport_size.Height();
AffineTransform transform; 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) { if (align_ == kSvgPreserveaspectratioNone) {
transform.ScaleNonUniform( transform.ScaleNonUniform(
extended_physical_width / extended_logical_width, extended_physical_width / extended_logical_width,
...@@ -316,6 +306,8 @@ AffineTransform SVGPreserveAspectRatio::ComputeTransform( ...@@ -316,6 +306,8 @@ AffineTransform SVGPreserveAspectRatio::ComputeTransform(
return transform; 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 && if ((logical_ratio < physical_ratio &&
(meet_or_slice_ == kSvgMeetorsliceMeet)) || (meet_or_slice_ == kSvgMeetorsliceMeet)) ||
(logical_ratio >= physical_ratio && (logical_ratio >= physical_ratio &&
......
...@@ -28,6 +28,7 @@ namespace blink { ...@@ -28,6 +28,7 @@ namespace blink {
class AffineTransform; class AffineTransform;
class FloatRect; class FloatRect;
class FloatSize;
class SVGPreserveAspectRatioTearOff; class SVGPreserveAspectRatioTearOff;
class SVGPreserveAspectRatio final class SVGPreserveAspectRatio final
...@@ -74,12 +75,8 @@ class SVGPreserveAspectRatio final ...@@ -74,12 +75,8 @@ class SVGPreserveAspectRatio final
void TransformRect(FloatRect& dest_rect, FloatRect& src_rect) const; void TransformRect(FloatRect& dest_rect, FloatRect& src_rect) const;
AffineTransform ComputeTransform(float logical_x, AffineTransform ComputeTransform(const FloatRect& view_box,
float logical_y, const FloatSize& viewport_size) const;
float logical_width,
float logical_height,
float physical_width,
float physical_height) const;
String ValueAsString() const override; String ValueAsString() const override;
SVGParsingError SetValueAsString(const String&); SVGParsingError SetValueAsString(const String&);
......
...@@ -483,10 +483,8 @@ AffineTransform SVGSVGElement::LocalCoordinateSpaceTransform( ...@@ -483,10 +483,8 @@ AffineTransform SVGSVGElement::LocalCoordinateSpaceTransform(
return matrix.ToAffineTransform(); return matrix.ToAffineTransform();
} }
} }
if (!HasEmptyViewBox()) { if (!HasEmptyViewBox())
FloatSize size = CurrentViewportSize(); transform.Multiply(ViewBoxToViewTransform(CurrentViewportSize()));
transform.Multiply(ViewBoxToViewTransform(size.Width(), size.Height()));
}
return transform; return transform;
} }
...@@ -669,11 +667,10 @@ float SVGSVGElement::IntrinsicHeight() const { ...@@ -669,11 +667,10 @@ float SVGSVGElement::IntrinsicHeight() const {
return height()->CurrentValue()->Value(length_context); return height()->CurrentValue()->Value(length_context);
} }
AffineTransform SVGSVGElement::ViewBoxToViewTransform(float view_width, AffineTransform SVGSVGElement::ViewBoxToViewTransform(
float view_height) const { const FloatSize& viewport_size) const {
AffineTransform ctm = SVGFitToViewBox::ViewBoxToViewTransform( AffineTransform ctm = SVGFitToViewBox::ViewBoxToViewTransform(
CurrentViewBoxRect(), CurrentPreserveAspectRatio(), view_width, CurrentViewBoxRect(), CurrentPreserveAspectRatio(), viewport_size);
view_height);
if (!view_spec_ || !view_spec_->Transform()) if (!view_spec_ || !view_spec_->Transform())
return ctm; return ctm;
const SVGTransformList* transform_list = view_spec_->Transform(); const SVGTransformList* transform_list = view_spec_->Transform();
......
...@@ -93,8 +93,7 @@ class SVGSVGElement final : public SVGGraphicsElement, ...@@ -93,8 +93,7 @@ class SVGSVGElement final : public SVGGraphicsElement,
static SVGTransformTearOff* createSVGTransform(); static SVGTransformTearOff* createSVGTransform();
static SVGTransformTearOff* createSVGTransformFromMatrix(SVGMatrixTearOff*); static SVGTransformTearOff* createSVGTransformFromMatrix(SVGMatrixTearOff*);
AffineTransform ViewBoxToViewTransform(float view_width, AffineTransform ViewBoxToViewTransform(const FloatSize& viewport_size) const;
float view_height) const;
void SetupInitialView(const String& fragment_identifier, void SetupInitialView(const String& fragment_identifier,
Element* anchor_node); 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