Index: Source/core/svg/SVGTransformDistance.cpp |
diff --git a/Source/core/svg/SVGTransformDistance.cpp b/Source/core/svg/SVGTransformDistance.cpp |
index 1108f32203902499c219c90ff09f88619c38d771..5c8c7bd12c92f0c415b2333c15eae034a3a135d9 100644 |
--- a/Source/core/svg/SVGTransformDistance.cpp |
+++ b/Source/core/svg/SVGTransformDistance.cpp |
@@ -28,15 +28,15 @@ |
namespace WebCore { |
SVGTransformDistance::SVGTransformDistance() |
- : m_type(SVGTransform::SVG_TRANSFORM_UNKNOWN) |
+ : m_transformType(SVG_TRANSFORM_UNKNOWN) |
, m_angle(0) |
, m_cx(0) |
, m_cy(0) |
{ |
} |
-SVGTransformDistance::SVGTransformDistance(SVGTransform::SVGTransformType type, float angle, float cx, float cy, const AffineTransform& transform) |
- : m_type(type) |
+SVGTransformDistance::SVGTransformDistance(SVGTransformType transformType, float angle, float cx, float cy, const AffineTransform& transform) |
+ : m_transformType(transformType) |
, m_angle(angle) |
, m_cx(cx) |
, m_cy(cy) |
@@ -44,147 +44,153 @@ SVGTransformDistance::SVGTransformDistance(SVGTransform::SVGTransformType type, |
{ |
} |
-SVGTransformDistance::SVGTransformDistance(const SVGTransform& fromSVGTransform, const SVGTransform& toSVGTransform) |
- : m_type(fromSVGTransform.type()) |
- , m_angle(0) |
+SVGTransformDistance::SVGTransformDistance(PassRefPtr<SVGTransform> passFromSVGTransform, PassRefPtr<SVGTransform> passToSVGTransform) |
+ : m_angle(0) |
, m_cx(0) |
, m_cy(0) |
{ |
- ASSERT(m_type == toSVGTransform.type()); |
+ RefPtr<SVGTransform> fromSVGTransform = passFromSVGTransform; |
+ RefPtr<SVGTransform> toSVGTransform = passToSVGTransform; |
+ |
+ m_transformType = fromSVGTransform->transformType(); |
+ ASSERT(m_transformType == toSVGTransform->transformType()); |
- switch (m_type) { |
- case SVGTransform::SVG_TRANSFORM_MATRIX: |
+ switch (m_transformType) { |
+ case SVG_TRANSFORM_MATRIX: |
ASSERT_NOT_REACHED(); |
- case SVGTransform::SVG_TRANSFORM_UNKNOWN: |
+ case SVG_TRANSFORM_UNKNOWN: |
break; |
- case SVGTransform::SVG_TRANSFORM_ROTATE: { |
- FloatSize centerDistance = toSVGTransform.rotationCenter() - fromSVGTransform.rotationCenter(); |
- m_angle = toSVGTransform.angle() - fromSVGTransform.angle(); |
+ case SVG_TRANSFORM_ROTATE: { |
+ FloatSize centerDistance = toSVGTransform->rotationCenter() - fromSVGTransform->rotationCenter(); |
+ m_angle = toSVGTransform->angle() - fromSVGTransform->angle(); |
m_cx = centerDistance.width(); |
m_cy = centerDistance.height(); |
break; |
} |
- case SVGTransform::SVG_TRANSFORM_TRANSLATE: { |
- FloatSize translationDistance = toSVGTransform.translate() - fromSVGTransform.translate(); |
+ case SVG_TRANSFORM_TRANSLATE: { |
+ FloatSize translationDistance = toSVGTransform->translate() - fromSVGTransform->translate(); |
m_transform.translate(translationDistance.width(), translationDistance.height()); |
break; |
} |
- case SVGTransform::SVG_TRANSFORM_SCALE: { |
- float scaleX = toSVGTransform.scale().width() - fromSVGTransform.scale().width(); |
- float scaleY = toSVGTransform.scale().height() - fromSVGTransform.scale().height(); |
+ case SVG_TRANSFORM_SCALE: { |
+ float scaleX = toSVGTransform->scale().width() - fromSVGTransform->scale().width(); |
+ float scaleY = toSVGTransform->scale().height() - fromSVGTransform->scale().height(); |
m_transform.scaleNonUniform(scaleX, scaleY); |
break; |
} |
- case SVGTransform::SVG_TRANSFORM_SKEWX: |
- case SVGTransform::SVG_TRANSFORM_SKEWY: |
- m_angle = toSVGTransform.angle() - fromSVGTransform.angle(); |
+ case SVG_TRANSFORM_SKEWX: |
+ case SVG_TRANSFORM_SKEWY: |
+ m_angle = toSVGTransform->angle() - fromSVGTransform->angle(); |
break; |
} |
} |
SVGTransformDistance SVGTransformDistance::scaledDistance(float scaleFactor) const |
{ |
- switch (m_type) { |
- case SVGTransform::SVG_TRANSFORM_MATRIX: |
+ switch (m_transformType) { |
+ case SVG_TRANSFORM_MATRIX: |
ASSERT_NOT_REACHED(); |
- case SVGTransform::SVG_TRANSFORM_UNKNOWN: |
+ case SVG_TRANSFORM_UNKNOWN: |
return SVGTransformDistance(); |
- case SVGTransform::SVG_TRANSFORM_ROTATE: |
- return SVGTransformDistance(m_type, m_angle * scaleFactor, m_cx * scaleFactor, m_cy * scaleFactor, AffineTransform()); |
- case SVGTransform::SVG_TRANSFORM_SCALE: |
- return SVGTransformDistance(m_type, m_angle * scaleFactor, m_cx * scaleFactor, m_cy * scaleFactor, AffineTransform(m_transform).scale(scaleFactor)); |
- case SVGTransform::SVG_TRANSFORM_TRANSLATE: { |
+ case SVG_TRANSFORM_ROTATE: |
+ return SVGTransformDistance(m_transformType, m_angle * scaleFactor, m_cx * scaleFactor, m_cy * scaleFactor, AffineTransform()); |
+ case SVG_TRANSFORM_SCALE: |
+ return SVGTransformDistance(m_transformType, m_angle * scaleFactor, m_cx * scaleFactor, m_cy * scaleFactor, AffineTransform(m_transform).scale(scaleFactor)); |
+ case SVG_TRANSFORM_TRANSLATE: { |
AffineTransform newTransform(m_transform); |
newTransform.setE(m_transform.e() * scaleFactor); |
newTransform.setF(m_transform.f() * scaleFactor); |
- return SVGTransformDistance(m_type, 0, 0, 0, newTransform); |
+ return SVGTransformDistance(m_transformType, 0, 0, 0, newTransform); |
} |
- case SVGTransform::SVG_TRANSFORM_SKEWX: |
- case SVGTransform::SVG_TRANSFORM_SKEWY: |
- return SVGTransformDistance(m_type, m_angle * scaleFactor, m_cx * scaleFactor, m_cy * scaleFactor, AffineTransform()); |
+ case SVG_TRANSFORM_SKEWX: |
+ case SVG_TRANSFORM_SKEWY: |
+ return SVGTransformDistance(m_transformType, m_angle * scaleFactor, m_cx * scaleFactor, m_cy * scaleFactor, AffineTransform()); |
} |
ASSERT_NOT_REACHED(); |
return SVGTransformDistance(); |
} |
-SVGTransform SVGTransformDistance::addSVGTransforms(const SVGTransform& first, const SVGTransform& second, unsigned repeatCount) |
+PassRefPtr<SVGTransform> SVGTransformDistance::addSVGTransforms(PassRefPtr<SVGTransform> passFirst, PassRefPtr<SVGTransform> passSecond, unsigned repeatCount) |
{ |
- ASSERT(first.type() == second.type()); |
+ RefPtr<SVGTransform> first = passFirst; |
+ RefPtr<SVGTransform> second = passSecond; |
+ ASSERT(first->transformType() == second->transformType()); |
- SVGTransform transform; |
+ RefPtr<SVGTransform> transform = SVGTransform::create(); |
- switch (first.type()) { |
- case SVGTransform::SVG_TRANSFORM_MATRIX: |
+ switch (first->transformType()) { |
+ case SVG_TRANSFORM_MATRIX: |
ASSERT_NOT_REACHED(); |
- case SVGTransform::SVG_TRANSFORM_UNKNOWN: |
- return SVGTransform(); |
- case SVGTransform::SVG_TRANSFORM_ROTATE: { |
- transform.setRotate(first.angle() + second.angle() * repeatCount, first.rotationCenter().x() + second.rotationCenter().x() * repeatCount, first.rotationCenter().y() + second.rotationCenter().y() * repeatCount); |
- return transform; |
+ case SVG_TRANSFORM_UNKNOWN: |
+ return transform.release(); |
+ case SVG_TRANSFORM_ROTATE: { |
+ transform->setRotate(first->angle() + second->angle() * repeatCount, first->rotationCenter().x() + second->rotationCenter().x() * repeatCount, first->rotationCenter().y() + second->rotationCenter().y() * repeatCount); |
+ return transform.release(); |
} |
- case SVGTransform::SVG_TRANSFORM_TRANSLATE: { |
- float dx = first.translate().x() + second.translate().x() * repeatCount; |
- float dy = first.translate().y() + second.translate().y() * repeatCount; |
- transform.setTranslate(dx, dy); |
- return transform; |
+ case SVG_TRANSFORM_TRANSLATE: { |
+ float dx = first->translate().x() + second->translate().x() * repeatCount; |
+ float dy = first->translate().y() + second->translate().y() * repeatCount; |
+ transform->setTranslate(dx, dy); |
+ return transform.release(); |
} |
- case SVGTransform::SVG_TRANSFORM_SCALE: { |
- FloatSize scale = second.scale(); |
+ case SVG_TRANSFORM_SCALE: { |
+ FloatSize scale = second->scale(); |
scale.scale(repeatCount); |
- scale += first.scale(); |
- transform.setScale(scale.width(), scale.height()); |
- return transform; |
+ scale += first->scale(); |
+ transform->setScale(scale.width(), scale.height()); |
+ return transform.release(); |
} |
- case SVGTransform::SVG_TRANSFORM_SKEWX: |
- transform.setSkewX(first.angle() + second.angle() * repeatCount); |
- return transform; |
- case SVGTransform::SVG_TRANSFORM_SKEWY: |
- transform.setSkewY(first.angle() + second.angle() * repeatCount); |
- return transform; |
+ case SVG_TRANSFORM_SKEWX: |
+ transform->setSkewX(first->angle() + second->angle() * repeatCount); |
+ return transform.release(); |
+ case SVG_TRANSFORM_SKEWY: |
+ transform->setSkewY(first->angle() + second->angle() * repeatCount); |
+ return transform.release(); |
} |
ASSERT_NOT_REACHED(); |
- return SVGTransform(); |
+ return transform.release(); |
} |
-SVGTransform SVGTransformDistance::addToSVGTransform(const SVGTransform& transform) const |
+PassRefPtr<SVGTransform> SVGTransformDistance::addToSVGTransform(PassRefPtr<SVGTransform> passTransform) const |
{ |
- ASSERT(m_type == transform.type() || transform == SVGTransform()); |
+ RefPtr<SVGTransform> transform = passTransform; |
+ ASSERT(m_transformType == transform->transformType() || m_transformType == SVG_TRANSFORM_UNKNOWN); |
- SVGTransform newTransform(transform); |
+ RefPtr<SVGTransform> newTransform = transform->clone(); |
- switch (m_type) { |
- case SVGTransform::SVG_TRANSFORM_MATRIX: |
+ switch (m_transformType) { |
+ case SVG_TRANSFORM_MATRIX: |
ASSERT_NOT_REACHED(); |
- case SVGTransform::SVG_TRANSFORM_UNKNOWN: |
- return SVGTransform(); |
- case SVGTransform::SVG_TRANSFORM_TRANSLATE: { |
- FloatPoint translation = transform.translate(); |
+ case SVG_TRANSFORM_UNKNOWN: |
+ return SVGTransform::create(); |
+ case SVG_TRANSFORM_TRANSLATE: { |
+ FloatPoint translation = transform->translate(); |
translation += FloatSize::narrowPrecision(m_transform.e(), m_transform.f()); |
- newTransform.setTranslate(translation.x(), translation.y()); |
- return newTransform; |
+ newTransform->setTranslate(translation.x(), translation.y()); |
+ return newTransform.release(); |
} |
- case SVGTransform::SVG_TRANSFORM_SCALE: { |
- FloatSize scale = transform.scale(); |
+ case SVG_TRANSFORM_SCALE: { |
+ FloatSize scale = transform->scale(); |
scale += FloatSize::narrowPrecision(m_transform.a(), m_transform.d()); |
- newTransform.setScale(scale.width(), scale.height()); |
- return newTransform; |
+ newTransform->setScale(scale.width(), scale.height()); |
+ return newTransform.release(); |
} |
- case SVGTransform::SVG_TRANSFORM_ROTATE: { |
- FloatPoint center = transform.rotationCenter(); |
- newTransform.setRotate(transform.angle() + m_angle, center.x() + m_cx, center.y() + m_cy); |
- return newTransform; |
+ case SVG_TRANSFORM_ROTATE: { |
+ FloatPoint center = transform->rotationCenter(); |
+ newTransform->setRotate(transform->angle() + m_angle, center.x() + m_cx, center.y() + m_cy); |
+ return newTransform.release(); |
} |
- case SVGTransform::SVG_TRANSFORM_SKEWX: |
- newTransform.setSkewX(transform.angle() + m_angle); |
- return newTransform; |
- case SVGTransform::SVG_TRANSFORM_SKEWY: |
- newTransform.setSkewY(transform.angle() + m_angle); |
- return newTransform; |
+ case SVG_TRANSFORM_SKEWX: |
+ newTransform->setSkewX(transform->angle() + m_angle); |
+ return newTransform.release(); |
+ case SVG_TRANSFORM_SKEWY: |
+ newTransform->setSkewY(transform->angle() + m_angle); |
+ return newTransform.release(); |
} |
ASSERT_NOT_REACHED(); |
- return SVGTransform(); |
+ return newTransform.release(); |
} |
bool SVGTransformDistance::isZero() const |
@@ -194,19 +200,19 @@ bool SVGTransformDistance::isZero() const |
float SVGTransformDistance::distance() const |
{ |
- switch (m_type) { |
- case SVGTransform::SVG_TRANSFORM_MATRIX: |
+ switch (m_transformType) { |
+ case SVG_TRANSFORM_MATRIX: |
ASSERT_NOT_REACHED(); |
- case SVGTransform::SVG_TRANSFORM_UNKNOWN: |
+ case SVG_TRANSFORM_UNKNOWN: |
return 0; |
- case SVGTransform::SVG_TRANSFORM_ROTATE: |
+ case SVG_TRANSFORM_ROTATE: |
return sqrtf(m_angle * m_angle + m_cx * m_cx + m_cy * m_cy); |
- case SVGTransform::SVG_TRANSFORM_SCALE: |
+ case SVG_TRANSFORM_SCALE: |
return static_cast<float>(sqrt(m_transform.a() * m_transform.a() + m_transform.d() * m_transform.d())); |
- case SVGTransform::SVG_TRANSFORM_TRANSLATE: |
+ case SVG_TRANSFORM_TRANSLATE: |
return static_cast<float>(sqrt(m_transform.e() * m_transform.e() + m_transform.f() * m_transform.f())); |
- case SVGTransform::SVG_TRANSFORM_SKEWX: |
- case SVGTransform::SVG_TRANSFORM_SKEWY: |
+ case SVG_TRANSFORM_SKEWX: |
+ case SVG_TRANSFORM_SKEWY: |
return m_angle; |
} |
ASSERT_NOT_REACHED(); |