summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/WebKit/Source/core/svg/SVGTransformDistance.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/WebKit/Source/core/svg/SVGTransformDistance.cpp')
-rw-r--r--chromium/third_party/WebKit/Source/core/svg/SVGTransformDistance.cpp199
1 files changed, 100 insertions, 99 deletions
diff --git a/chromium/third_party/WebKit/Source/core/svg/SVGTransformDistance.cpp b/chromium/third_party/WebKit/Source/core/svg/SVGTransformDistance.cpp
index 1108f322039..a4f860b1986 100644
--- a/chromium/third_party/WebKit/Source/core/svg/SVGTransformDistance.cpp
+++ b/chromium/third_party/WebKit/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,169 +44,170 @@ 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();
-}
-
-bool SVGTransformDistance::isZero() const
-{
- return m_transform.isIdentity() && !m_angle;
+ return newTransform.release();
}
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();