| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> | 2 * Copyright (C) 2007 Eric Seidel <eric@webkit.org> |
| 3 * | 3 * |
| 4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
| 6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
| 7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 10 matching lines...) Expand all Loading... |
| 21 | 21 |
| 22 #include "core/svg/SVGTransformDistance.h" | 22 #include "core/svg/SVGTransformDistance.h" |
| 23 | 23 |
| 24 #include "platform/geometry/FloatPoint.h" | 24 #include "platform/geometry/FloatPoint.h" |
| 25 #include "platform/geometry/FloatSize.h" | 25 #include "platform/geometry/FloatSize.h" |
| 26 #include <math.h> | 26 #include <math.h> |
| 27 | 27 |
| 28 namespace WebCore { | 28 namespace WebCore { |
| 29 | 29 |
| 30 SVGTransformDistance::SVGTransformDistance() | 30 SVGTransformDistance::SVGTransformDistance() |
| 31 : m_type(SVGTransform::SVG_TRANSFORM_UNKNOWN) | 31 : m_transformType(SVG_TRANSFORM_UNKNOWN) |
| 32 , m_angle(0) | 32 , m_angle(0) |
| 33 , m_cx(0) | 33 , m_cx(0) |
| 34 , m_cy(0) | 34 , m_cy(0) |
| 35 { | 35 { |
| 36 } | 36 } |
| 37 | 37 |
| 38 SVGTransformDistance::SVGTransformDistance(SVGTransform::SVGTransformType type,
float angle, float cx, float cy, const AffineTransform& transform) | 38 SVGTransformDistance::SVGTransformDistance(SVGTransformType transformType, float
angle, float cx, float cy, const AffineTransform& transform) |
| 39 : m_type(type) | 39 : m_transformType(transformType) |
| 40 , m_angle(angle) | 40 , m_angle(angle) |
| 41 , m_cx(cx) | 41 , m_cx(cx) |
| 42 , m_cy(cy) | 42 , m_cy(cy) |
| 43 , m_transform(transform) | 43 , m_transform(transform) |
| 44 { | 44 { |
| 45 } | 45 } |
| 46 | 46 |
| 47 SVGTransformDistance::SVGTransformDistance(const SVGTransform& fromSVGTransform,
const SVGTransform& toSVGTransform) | 47 SVGTransformDistance::SVGTransformDistance(PassRefPtr<SVGTransform> passFromSVGT
ransform, PassRefPtr<SVGTransform> passToSVGTransform) |
| 48 : m_type(fromSVGTransform.type()) | 48 : m_angle(0) |
| 49 , m_angle(0) | |
| 50 , m_cx(0) | 49 , m_cx(0) |
| 51 , m_cy(0) | 50 , m_cy(0) |
| 52 { | 51 { |
| 53 ASSERT(m_type == toSVGTransform.type()); | 52 RefPtr<SVGTransform> fromSVGTransform = passFromSVGTransform; |
| 53 RefPtr<SVGTransform> toSVGTransform = passToSVGTransform; |
| 54 | 54 |
| 55 switch (m_type) { | 55 m_transformType = fromSVGTransform->transformType(); |
| 56 case SVGTransform::SVG_TRANSFORM_MATRIX: | 56 ASSERT(m_transformType == toSVGTransform->transformType()); |
| 57 |
| 58 switch (m_transformType) { |
| 59 case SVG_TRANSFORM_MATRIX: |
| 57 ASSERT_NOT_REACHED(); | 60 ASSERT_NOT_REACHED(); |
| 58 case SVGTransform::SVG_TRANSFORM_UNKNOWN: | 61 case SVG_TRANSFORM_UNKNOWN: |
| 59 break; | 62 break; |
| 60 case SVGTransform::SVG_TRANSFORM_ROTATE: { | 63 case SVG_TRANSFORM_ROTATE: { |
| 61 FloatSize centerDistance = toSVGTransform.rotationCenter() - fromSVGTran
sform.rotationCenter(); | 64 FloatSize centerDistance = toSVGTransform->rotationCenter() - fromSVGTra
nsform->rotationCenter(); |
| 62 m_angle = toSVGTransform.angle() - fromSVGTransform.angle(); | 65 m_angle = toSVGTransform->angle() - fromSVGTransform->angle(); |
| 63 m_cx = centerDistance.width(); | 66 m_cx = centerDistance.width(); |
| 64 m_cy = centerDistance.height(); | 67 m_cy = centerDistance.height(); |
| 65 break; | 68 break; |
| 66 } | 69 } |
| 67 case SVGTransform::SVG_TRANSFORM_TRANSLATE: { | 70 case SVG_TRANSFORM_TRANSLATE: { |
| 68 FloatSize translationDistance = toSVGTransform.translate() - fromSVGTran
sform.translate(); | 71 FloatSize translationDistance = toSVGTransform->translate() - fromSVGTra
nsform->translate(); |
| 69 m_transform.translate(translationDistance.width(), translationDistance.h
eight()); | 72 m_transform.translate(translationDistance.width(), translationDistance.h
eight()); |
| 70 break; | 73 break; |
| 71 } | 74 } |
| 72 case SVGTransform::SVG_TRANSFORM_SCALE: { | 75 case SVG_TRANSFORM_SCALE: { |
| 73 float scaleX = toSVGTransform.scale().width() - fromSVGTransform.scale()
.width(); | 76 float scaleX = toSVGTransform->scale().width() - fromSVGTransform->scale
().width(); |
| 74 float scaleY = toSVGTransform.scale().height() - fromSVGTransform.scale(
).height(); | 77 float scaleY = toSVGTransform->scale().height() - fromSVGTransform->scal
e().height(); |
| 75 m_transform.scaleNonUniform(scaleX, scaleY); | 78 m_transform.scaleNonUniform(scaleX, scaleY); |
| 76 break; | 79 break; |
| 77 } | 80 } |
| 78 case SVGTransform::SVG_TRANSFORM_SKEWX: | 81 case SVG_TRANSFORM_SKEWX: |
| 79 case SVGTransform::SVG_TRANSFORM_SKEWY: | 82 case SVG_TRANSFORM_SKEWY: |
| 80 m_angle = toSVGTransform.angle() - fromSVGTransform.angle(); | 83 m_angle = toSVGTransform->angle() - fromSVGTransform->angle(); |
| 81 break; | 84 break; |
| 82 } | 85 } |
| 83 } | 86 } |
| 84 | 87 |
| 85 SVGTransformDistance SVGTransformDistance::scaledDistance(float scaleFactor) con
st | 88 SVGTransformDistance SVGTransformDistance::scaledDistance(float scaleFactor) con
st |
| 86 { | 89 { |
| 87 switch (m_type) { | 90 switch (m_transformType) { |
| 88 case SVGTransform::SVG_TRANSFORM_MATRIX: | 91 case SVG_TRANSFORM_MATRIX: |
| 89 ASSERT_NOT_REACHED(); | 92 ASSERT_NOT_REACHED(); |
| 90 case SVGTransform::SVG_TRANSFORM_UNKNOWN: | 93 case SVG_TRANSFORM_UNKNOWN: |
| 91 return SVGTransformDistance(); | 94 return SVGTransformDistance(); |
| 92 case SVGTransform::SVG_TRANSFORM_ROTATE: | 95 case SVG_TRANSFORM_ROTATE: |
| 93 return SVGTransformDistance(m_type, m_angle * scaleFactor, m_cx * scaleF
actor, m_cy * scaleFactor, AffineTransform()); | 96 return SVGTransformDistance(m_transformType, m_angle * scaleFactor, m_cx
* scaleFactor, m_cy * scaleFactor, AffineTransform()); |
| 94 case SVGTransform::SVG_TRANSFORM_SCALE: | 97 case SVG_TRANSFORM_SCALE: |
| 95 return SVGTransformDistance(m_type, m_angle * scaleFactor, m_cx * scaleF
actor, m_cy * scaleFactor, AffineTransform(m_transform).scale(scaleFactor)); | 98 return SVGTransformDistance(m_transformType, m_angle * scaleFactor, m_cx
* scaleFactor, m_cy * scaleFactor, AffineTransform(m_transform).scale(scaleFact
or)); |
| 96 case SVGTransform::SVG_TRANSFORM_TRANSLATE: { | 99 case SVG_TRANSFORM_TRANSLATE: { |
| 97 AffineTransform newTransform(m_transform); | 100 AffineTransform newTransform(m_transform); |
| 98 newTransform.setE(m_transform.e() * scaleFactor); | 101 newTransform.setE(m_transform.e() * scaleFactor); |
| 99 newTransform.setF(m_transform.f() * scaleFactor); | 102 newTransform.setF(m_transform.f() * scaleFactor); |
| 100 return SVGTransformDistance(m_type, 0, 0, 0, newTransform); | 103 return SVGTransformDistance(m_transformType, 0, 0, 0, newTransform); |
| 101 } | 104 } |
| 102 case SVGTransform::SVG_TRANSFORM_SKEWX: | 105 case SVG_TRANSFORM_SKEWX: |
| 103 case SVGTransform::SVG_TRANSFORM_SKEWY: | 106 case SVG_TRANSFORM_SKEWY: |
| 104 return SVGTransformDistance(m_type, m_angle * scaleFactor, m_cx * scaleF
actor, m_cy * scaleFactor, AffineTransform()); | 107 return SVGTransformDistance(m_transformType, m_angle * scaleFactor, m_cx
* scaleFactor, m_cy * scaleFactor, AffineTransform()); |
| 105 } | 108 } |
| 106 | 109 |
| 107 ASSERT_NOT_REACHED(); | 110 ASSERT_NOT_REACHED(); |
| 108 return SVGTransformDistance(); | 111 return SVGTransformDistance(); |
| 109 } | 112 } |
| 110 | 113 |
| 111 SVGTransform SVGTransformDistance::addSVGTransforms(const SVGTransform& first, c
onst SVGTransform& second, unsigned repeatCount) | 114 PassRefPtr<SVGTransform> SVGTransformDistance::addSVGTransforms(PassRefPtr<SVGTr
ansform> passFirst, PassRefPtr<SVGTransform> passSecond, unsigned repeatCount) |
| 112 { | 115 { |
| 113 ASSERT(first.type() == second.type()); | 116 RefPtr<SVGTransform> first = passFirst; |
| 117 RefPtr<SVGTransform> second = passSecond; |
| 118 ASSERT(first->transformType() == second->transformType()); |
| 114 | 119 |
| 115 SVGTransform transform; | 120 RefPtr<SVGTransform> transform = SVGTransform::create(); |
| 116 | 121 |
| 117 switch (first.type()) { | 122 switch (first->transformType()) { |
| 118 case SVGTransform::SVG_TRANSFORM_MATRIX: | 123 case SVG_TRANSFORM_MATRIX: |
| 119 ASSERT_NOT_REACHED(); | 124 ASSERT_NOT_REACHED(); |
| 120 case SVGTransform::SVG_TRANSFORM_UNKNOWN: | 125 case SVG_TRANSFORM_UNKNOWN: |
| 121 return SVGTransform(); | 126 return transform.release(); |
| 122 case SVGTransform::SVG_TRANSFORM_ROTATE: { | 127 case SVG_TRANSFORM_ROTATE: { |
| 123 transform.setRotate(first.angle() + second.angle() * repeatCount, first.
rotationCenter().x() + second.rotationCenter().x() * repeatCount, first.rotation
Center().y() + second.rotationCenter().y() * repeatCount); | 128 transform->setRotate(first->angle() + second->angle() * repeatCount, fir
st->rotationCenter().x() + second->rotationCenter().x() * repeatCount, first->ro
tationCenter().y() + second->rotationCenter().y() * repeatCount); |
| 124 return transform; | 129 return transform.release(); |
| 125 } | 130 } |
| 126 case SVGTransform::SVG_TRANSFORM_TRANSLATE: { | 131 case SVG_TRANSFORM_TRANSLATE: { |
| 127 float dx = first.translate().x() + second.translate().x() * repeatCount; | 132 float dx = first->translate().x() + second->translate().x() * repeatCoun
t; |
| 128 float dy = first.translate().y() + second.translate().y() * repeatCount; | 133 float dy = first->translate().y() + second->translate().y() * repeatCoun
t; |
| 129 transform.setTranslate(dx, dy); | 134 transform->setTranslate(dx, dy); |
| 130 return transform; | 135 return transform.release(); |
| 131 } | 136 } |
| 132 case SVGTransform::SVG_TRANSFORM_SCALE: { | 137 case SVG_TRANSFORM_SCALE: { |
| 133 FloatSize scale = second.scale(); | 138 FloatSize scale = second->scale(); |
| 134 scale.scale(repeatCount); | 139 scale.scale(repeatCount); |
| 135 scale += first.scale(); | 140 scale += first->scale(); |
| 136 transform.setScale(scale.width(), scale.height()); | 141 transform->setScale(scale.width(), scale.height()); |
| 137 return transform; | 142 return transform.release(); |
| 138 } | 143 } |
| 139 case SVGTransform::SVG_TRANSFORM_SKEWX: | 144 case SVG_TRANSFORM_SKEWX: |
| 140 transform.setSkewX(first.angle() + second.angle() * repeatCount); | 145 transform->setSkewX(first->angle() + second->angle() * repeatCount); |
| 141 return transform; | 146 return transform.release(); |
| 142 case SVGTransform::SVG_TRANSFORM_SKEWY: | 147 case SVG_TRANSFORM_SKEWY: |
| 143 transform.setSkewY(first.angle() + second.angle() * repeatCount); | 148 transform->setSkewY(first->angle() + second->angle() * repeatCount); |
| 144 return transform; | 149 return transform.release(); |
| 145 } | 150 } |
| 146 ASSERT_NOT_REACHED(); | 151 ASSERT_NOT_REACHED(); |
| 147 return SVGTransform(); | 152 return transform.release(); |
| 148 } | 153 } |
| 149 | 154 |
| 150 SVGTransform SVGTransformDistance::addToSVGTransform(const SVGTransform& transfo
rm) const | 155 PassRefPtr<SVGTransform> SVGTransformDistance::addToSVGTransform(PassRefPtr<SVGT
ransform> passTransform) const |
| 151 { | 156 { |
| 152 ASSERT(m_type == transform.type() || transform == SVGTransform()); | 157 RefPtr<SVGTransform> transform = passTransform; |
| 158 ASSERT(m_transformType == transform->transformType() || m_transformType == S
VG_TRANSFORM_UNKNOWN); |
| 153 | 159 |
| 154 SVGTransform newTransform(transform); | 160 RefPtr<SVGTransform> newTransform = transform->clone(); |
| 155 | 161 |
| 156 switch (m_type) { | 162 switch (m_transformType) { |
| 157 case SVGTransform::SVG_TRANSFORM_MATRIX: | 163 case SVG_TRANSFORM_MATRIX: |
| 158 ASSERT_NOT_REACHED(); | 164 ASSERT_NOT_REACHED(); |
| 159 case SVGTransform::SVG_TRANSFORM_UNKNOWN: | 165 case SVG_TRANSFORM_UNKNOWN: |
| 160 return SVGTransform(); | 166 return SVGTransform::create(); |
| 161 case SVGTransform::SVG_TRANSFORM_TRANSLATE: { | 167 case SVG_TRANSFORM_TRANSLATE: { |
| 162 FloatPoint translation = transform.translate(); | 168 FloatPoint translation = transform->translate(); |
| 163 translation += FloatSize::narrowPrecision(m_transform.e(), m_transform.f
()); | 169 translation += FloatSize::narrowPrecision(m_transform.e(), m_transform.f
()); |
| 164 newTransform.setTranslate(translation.x(), translation.y()); | 170 newTransform->setTranslate(translation.x(), translation.y()); |
| 165 return newTransform; | 171 return newTransform.release(); |
| 166 } | 172 } |
| 167 case SVGTransform::SVG_TRANSFORM_SCALE: { | 173 case SVG_TRANSFORM_SCALE: { |
| 168 FloatSize scale = transform.scale(); | 174 FloatSize scale = transform->scale(); |
| 169 scale += FloatSize::narrowPrecision(m_transform.a(), m_transform.d()); | 175 scale += FloatSize::narrowPrecision(m_transform.a(), m_transform.d()); |
| 170 newTransform.setScale(scale.width(), scale.height()); | 176 newTransform->setScale(scale.width(), scale.height()); |
| 171 return newTransform; | 177 return newTransform.release(); |
| 172 } | 178 } |
| 173 case SVGTransform::SVG_TRANSFORM_ROTATE: { | 179 case SVG_TRANSFORM_ROTATE: { |
| 174 FloatPoint center = transform.rotationCenter(); | 180 FloatPoint center = transform->rotationCenter(); |
| 175 newTransform.setRotate(transform.angle() + m_angle, center.x() + m_cx, c
enter.y() + m_cy); | 181 newTransform->setRotate(transform->angle() + m_angle, center.x() + m_cx,
center.y() + m_cy); |
| 176 return newTransform; | 182 return newTransform.release(); |
| 177 } | 183 } |
| 178 case SVGTransform::SVG_TRANSFORM_SKEWX: | 184 case SVG_TRANSFORM_SKEWX: |
| 179 newTransform.setSkewX(transform.angle() + m_angle); | 185 newTransform->setSkewX(transform->angle() + m_angle); |
| 180 return newTransform; | 186 return newTransform.release(); |
| 181 case SVGTransform::SVG_TRANSFORM_SKEWY: | 187 case SVG_TRANSFORM_SKEWY: |
| 182 newTransform.setSkewY(transform.angle() + m_angle); | 188 newTransform->setSkewY(transform->angle() + m_angle); |
| 183 return newTransform; | 189 return newTransform.release(); |
| 184 } | 190 } |
| 185 | 191 |
| 186 ASSERT_NOT_REACHED(); | 192 ASSERT_NOT_REACHED(); |
| 187 return SVGTransform(); | 193 return newTransform.release(); |
| 188 } | 194 } |
| 189 | 195 |
| 190 bool SVGTransformDistance::isZero() const | 196 bool SVGTransformDistance::isZero() const |
| 191 { | 197 { |
| 192 return m_transform.isIdentity() && !m_angle; | 198 return m_transform.isIdentity() && !m_angle; |
| 193 } | 199 } |
| 194 | 200 |
| 195 float SVGTransformDistance::distance() const | 201 float SVGTransformDistance::distance() const |
| 196 { | 202 { |
| 197 switch (m_type) { | 203 switch (m_transformType) { |
| 198 case SVGTransform::SVG_TRANSFORM_MATRIX: | 204 case SVG_TRANSFORM_MATRIX: |
| 199 ASSERT_NOT_REACHED(); | 205 ASSERT_NOT_REACHED(); |
| 200 case SVGTransform::SVG_TRANSFORM_UNKNOWN: | 206 case SVG_TRANSFORM_UNKNOWN: |
| 201 return 0; | 207 return 0; |
| 202 case SVGTransform::SVG_TRANSFORM_ROTATE: | 208 case SVG_TRANSFORM_ROTATE: |
| 203 return sqrtf(m_angle * m_angle + m_cx * m_cx + m_cy * m_cy); | 209 return sqrtf(m_angle * m_angle + m_cx * m_cx + m_cy * m_cy); |
| 204 case SVGTransform::SVG_TRANSFORM_SCALE: | 210 case SVG_TRANSFORM_SCALE: |
| 205 return static_cast<float>(sqrt(m_transform.a() * m_transform.a() + m_tra
nsform.d() * m_transform.d())); | 211 return static_cast<float>(sqrt(m_transform.a() * m_transform.a() + m_tra
nsform.d() * m_transform.d())); |
| 206 case SVGTransform::SVG_TRANSFORM_TRANSLATE: | 212 case SVG_TRANSFORM_TRANSLATE: |
| 207 return static_cast<float>(sqrt(m_transform.e() * m_transform.e() + m_tra
nsform.f() * m_transform.f())); | 213 return static_cast<float>(sqrt(m_transform.e() * m_transform.e() + m_tra
nsform.f() * m_transform.f())); |
| 208 case SVGTransform::SVG_TRANSFORM_SKEWX: | 214 case SVG_TRANSFORM_SKEWX: |
| 209 case SVGTransform::SVG_TRANSFORM_SKEWY: | 215 case SVG_TRANSFORM_SKEWY: |
| 210 return m_angle; | 216 return m_angle; |
| 211 } | 217 } |
| 212 ASSERT_NOT_REACHED(); | 218 ASSERT_NOT_REACHED(); |
| 213 return 0; | 219 return 0; |
| 214 } | 220 } |
| 215 | 221 |
| 216 } | 222 } |
| OLD | NEW |