| 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 |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 12 * Library General Public License for more details. | 12 * Library General Public License for more details. |
| 13 * | 13 * |
| 14 * You should have received a copy of the GNU Library General Public License | 14 * You should have received a copy of the GNU Library General Public License |
| 15 * along with this library; see the file COPYING.LIB. If not, write to | 15 * along with this library; see the file COPYING.LIB. If not, write to |
| 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
| 17 * Boston, MA 02110-1301, USA. | 17 * Boston, MA 02110-1301, USA. |
| 18 */ | 18 */ |
| 19 | 19 |
| 20 #include "core/svg/SVGTransformDistance.h" | 20 #include "core/svg/SVGTransformDistance.h" |
| 21 | 21 |
| 22 #include "platform/geometry/FloatPoint.h" | 22 #include "platform/geometry/FloatPoint.h" |
| 23 #include "platform/geometry/FloatSize.h" | 23 #include "platform/geometry/FloatSize.h" |
| 24 #include <math.h> | 24 #include <math.h> |
| 25 | 25 |
| 26 namespace blink { | 26 namespace blink { |
| 27 | 27 |
| 28 SVGTransformDistance::SVGTransformDistance() | 28 SVGTransformDistance::SVGTransformDistance() |
| 29 : m_transformType(SVG_TRANSFORM_UNKNOWN) | 29 : m_transformType(kSvgTransformUnknown) |
| 30 , m_angle(0) | 30 , m_angle(0) |
| 31 , m_cx(0) | 31 , m_cx(0) |
| 32 , m_cy(0) | 32 , m_cy(0) |
| 33 { | 33 { |
| 34 } | 34 } |
| 35 | 35 |
| 36 SVGTransformDistance::SVGTransformDistance(SVGTransformType transformType, float
angle, float cx, float cy, const AffineTransform& transform) | 36 SVGTransformDistance::SVGTransformDistance(SVGTransformType transformType, float
angle, float cx, float cy, const AffineTransform& transform) |
| 37 : m_transformType(transformType) | 37 : m_transformType(transformType) |
| 38 , m_angle(angle) | 38 , m_angle(angle) |
| 39 , m_cx(cx) | 39 , m_cx(cx) |
| 40 , m_cy(cy) | 40 , m_cy(cy) |
| 41 , m_transform(transform) | 41 , m_transform(transform) |
| 42 { | 42 { |
| 43 } | 43 } |
| 44 | 44 |
| 45 SVGTransformDistance::SVGTransformDistance(SVGTransform* fromSVGTransform, SVGTr
ansform* toSVGTransform) | 45 SVGTransformDistance::SVGTransformDistance(SVGTransform* fromSVGTransform, SVGTr
ansform* toSVGTransform) |
| 46 : m_angle(0) | 46 : m_angle(0) |
| 47 , m_cx(0) | 47 , m_cx(0) |
| 48 , m_cy(0) | 48 , m_cy(0) |
| 49 { | 49 { |
| 50 m_transformType = fromSVGTransform->transformType(); | 50 m_transformType = fromSVGTransform->transformType(); |
| 51 ASSERT(m_transformType == toSVGTransform->transformType()); | 51 ASSERT(m_transformType == toSVGTransform->transformType()); |
| 52 | 52 |
| 53 switch (m_transformType) { | 53 switch (m_transformType) { |
| 54 case SVG_TRANSFORM_MATRIX: | 54 case kSvgTransformMatrix: |
| 55 ASSERT_NOT_REACHED(); | 55 ASSERT_NOT_REACHED(); |
| 56 case SVG_TRANSFORM_UNKNOWN: | 56 case kSvgTransformUnknown: |
| 57 break; | 57 break; |
| 58 case SVG_TRANSFORM_ROTATE: { | 58 case kSvgTransformRotate: { |
| 59 FloatSize centerDistance = toSVGTransform->rotationCenter() - fromSVGTra
nsform->rotationCenter(); | 59 FloatSize centerDistance = toSVGTransform->rotationCenter() - fromSVGTra
nsform->rotationCenter(); |
| 60 m_angle = toSVGTransform->angle() - fromSVGTransform->angle(); | 60 m_angle = toSVGTransform->angle() - fromSVGTransform->angle(); |
| 61 m_cx = centerDistance.width(); | 61 m_cx = centerDistance.width(); |
| 62 m_cy = centerDistance.height(); | 62 m_cy = centerDistance.height(); |
| 63 break; | 63 break; |
| 64 } | 64 } |
| 65 case SVG_TRANSFORM_TRANSLATE: { | 65 case kSvgTransformTranslate: { |
| 66 FloatSize translationDistance = toSVGTransform->translate() - fromSVGTra
nsform->translate(); | 66 FloatSize translationDistance = toSVGTransform->translate() - fromSVGTra
nsform->translate(); |
| 67 m_transform.translate(translationDistance.width(), translationDistance.h
eight()); | 67 m_transform.translate(translationDistance.width(), translationDistance.h
eight()); |
| 68 break; | 68 break; |
| 69 } | 69 } |
| 70 case SVG_TRANSFORM_SCALE: { | 70 case kSvgTransformScale: { |
| 71 float scaleX = toSVGTransform->scale().width() - fromSVGTransform->scale
().width(); | 71 float scaleX = toSVGTransform->scale().width() - fromSVGTransform->scale
().width(); |
| 72 float scaleY = toSVGTransform->scale().height() - fromSVGTransform->scal
e().height(); | 72 float scaleY = toSVGTransform->scale().height() - fromSVGTransform->scal
e().height(); |
| 73 m_transform.scaleNonUniform(scaleX, scaleY); | 73 m_transform.scaleNonUniform(scaleX, scaleY); |
| 74 break; | 74 break; |
| 75 } | 75 } |
| 76 case SVG_TRANSFORM_SKEWX: | 76 case kSvgTransformSkewx: |
| 77 case SVG_TRANSFORM_SKEWY: | 77 case kSvgTransformSkewy: |
| 78 m_angle = toSVGTransform->angle() - fromSVGTransform->angle(); | 78 m_angle = toSVGTransform->angle() - fromSVGTransform->angle(); |
| 79 break; | 79 break; |
| 80 } | 80 } |
| 81 } | 81 } |
| 82 | 82 |
| 83 SVGTransformDistance SVGTransformDistance::scaledDistance(float scaleFactor) con
st | 83 SVGTransformDistance SVGTransformDistance::scaledDistance(float scaleFactor) con
st |
| 84 { | 84 { |
| 85 switch (m_transformType) { | 85 switch (m_transformType) { |
| 86 case SVG_TRANSFORM_MATRIX: | 86 case kSvgTransformMatrix: |
| 87 ASSERT_NOT_REACHED(); | 87 ASSERT_NOT_REACHED(); |
| 88 case SVG_TRANSFORM_UNKNOWN: | 88 case kSvgTransformUnknown: |
| 89 return SVGTransformDistance(); | 89 return SVGTransformDistance(); |
| 90 case SVG_TRANSFORM_ROTATE: | 90 case kSvgTransformRotate: |
| 91 return SVGTransformDistance(m_transformType, m_angle * scaleFactor, m_cx
* scaleFactor, m_cy * scaleFactor, AffineTransform()); | 91 return SVGTransformDistance(m_transformType, m_angle * scaleFactor, m_cx
* scaleFactor, m_cy * scaleFactor, AffineTransform()); |
| 92 case SVG_TRANSFORM_SCALE: | 92 case kSvgTransformScale: |
| 93 return SVGTransformDistance(m_transformType, m_angle * scaleFactor, m_cx
* scaleFactor, m_cy * scaleFactor, AffineTransform(m_transform).scale(scaleFact
or)); | 93 return SVGTransformDistance(m_transformType, m_angle * scaleFactor, m_cx
* scaleFactor, m_cy * scaleFactor, AffineTransform(m_transform).scale(scaleFact
or)); |
| 94 case SVG_TRANSFORM_TRANSLATE: { | 94 case kSvgTransformTranslate: { |
| 95 AffineTransform newTransform(m_transform); | 95 AffineTransform newTransform(m_transform); |
| 96 newTransform.setE(m_transform.e() * scaleFactor); | 96 newTransform.setE(m_transform.e() * scaleFactor); |
| 97 newTransform.setF(m_transform.f() * scaleFactor); | 97 newTransform.setF(m_transform.f() * scaleFactor); |
| 98 return SVGTransformDistance(m_transformType, 0, 0, 0, newTransform); | 98 return SVGTransformDistance(m_transformType, 0, 0, 0, newTransform); |
| 99 } | 99 } |
| 100 case SVG_TRANSFORM_SKEWX: | 100 case kSvgTransformSkewx: |
| 101 case SVG_TRANSFORM_SKEWY: | 101 case kSvgTransformSkewy: |
| 102 return SVGTransformDistance(m_transformType, m_angle * scaleFactor, m_cx
* scaleFactor, m_cy * scaleFactor, AffineTransform()); | 102 return SVGTransformDistance(m_transformType, m_angle * scaleFactor, m_cx
* scaleFactor, m_cy * scaleFactor, AffineTransform()); |
| 103 } | 103 } |
| 104 | 104 |
| 105 ASSERT_NOT_REACHED(); | 105 ASSERT_NOT_REACHED(); |
| 106 return SVGTransformDistance(); | 106 return SVGTransformDistance(); |
| 107 } | 107 } |
| 108 | 108 |
| 109 SVGTransform* SVGTransformDistance::addSVGTransforms(SVGTransform* first, SVGTra
nsform* second, unsigned repeatCount) | 109 SVGTransform* SVGTransformDistance::addSVGTransforms(SVGTransform* first, SVGTra
nsform* second, unsigned repeatCount) |
| 110 { | 110 { |
| 111 ASSERT(first->transformType() == second->transformType()); | 111 ASSERT(first->transformType() == second->transformType()); |
| 112 | 112 |
| 113 SVGTransform* transform = SVGTransform::create(); | 113 SVGTransform* transform = SVGTransform::create(); |
| 114 | 114 |
| 115 switch (first->transformType()) { | 115 switch (first->transformType()) { |
| 116 case SVG_TRANSFORM_MATRIX: | 116 case kSvgTransformMatrix: |
| 117 ASSERT_NOT_REACHED(); | 117 ASSERT_NOT_REACHED(); |
| 118 case SVG_TRANSFORM_UNKNOWN: | 118 case kSvgTransformUnknown: |
| 119 return transform; | 119 return transform; |
| 120 case SVG_TRANSFORM_ROTATE: { | 120 case kSvgTransformRotate: { |
| 121 transform->setRotate(first->angle() + second->angle() * repeatCount, fir
st->rotationCenter().x() + second->rotationCenter().x() * repeatCount, first->ro
tationCenter().y() + second->rotationCenter().y() * repeatCount); | 121 transform->setRotate(first->angle() + second->angle() * repeatCount, fir
st->rotationCenter().x() + second->rotationCenter().x() * repeatCount, first->ro
tationCenter().y() + second->rotationCenter().y() * repeatCount); |
| 122 return transform; | 122 return transform; |
| 123 } | 123 } |
| 124 case SVG_TRANSFORM_TRANSLATE: { | 124 case kSvgTransformTranslate: { |
| 125 float dx = first->translate().x() + second->translate().x() * repeatCoun
t; | 125 float dx = first->translate().x() + second->translate().x() * repeatCoun
t; |
| 126 float dy = first->translate().y() + second->translate().y() * repeatCoun
t; | 126 float dy = first->translate().y() + second->translate().y() * repeatCoun
t; |
| 127 transform->setTranslate(dx, dy); | 127 transform->setTranslate(dx, dy); |
| 128 return transform; | 128 return transform; |
| 129 } | 129 } |
| 130 case SVG_TRANSFORM_SCALE: { | 130 case kSvgTransformScale: { |
| 131 FloatSize scale = second->scale(); | 131 FloatSize scale = second->scale(); |
| 132 scale.scale(repeatCount); | 132 scale.scale(repeatCount); |
| 133 scale += first->scale(); | 133 scale += first->scale(); |
| 134 transform->setScale(scale.width(), scale.height()); | 134 transform->setScale(scale.width(), scale.height()); |
| 135 return transform; | 135 return transform; |
| 136 } | 136 } |
| 137 case SVG_TRANSFORM_SKEWX: | 137 case kSvgTransformSkewx: |
| 138 transform->setSkewX(first->angle() + second->angle() * repeatCount); | 138 transform->setSkewX(first->angle() + second->angle() * repeatCount); |
| 139 return transform; | 139 return transform; |
| 140 case SVG_TRANSFORM_SKEWY: | 140 case kSvgTransformSkewy: |
| 141 transform->setSkewY(first->angle() + second->angle() * repeatCount); | 141 transform->setSkewY(first->angle() + second->angle() * repeatCount); |
| 142 return transform; | 142 return transform; |
| 143 } | 143 } |
| 144 ASSERT_NOT_REACHED(); | 144 ASSERT_NOT_REACHED(); |
| 145 return transform; | 145 return transform; |
| 146 } | 146 } |
| 147 | 147 |
| 148 SVGTransform* SVGTransformDistance::addToSVGTransform(SVGTransform* transform) c
onst | 148 SVGTransform* SVGTransformDistance::addToSVGTransform(SVGTransform* transform) c
onst |
| 149 { | 149 { |
| 150 ASSERT(m_transformType == transform->transformType() || m_transformType == S
VG_TRANSFORM_UNKNOWN); | 150 DCHECK(m_transformType == transform->transformType() || m_transformType == k
SvgTransformUnknown); |
| 151 | 151 |
| 152 SVGTransform* newTransform = transform->clone(); | 152 SVGTransform* newTransform = transform->clone(); |
| 153 | 153 |
| 154 switch (m_transformType) { | 154 switch (m_transformType) { |
| 155 case SVG_TRANSFORM_MATRIX: | 155 case kSvgTransformMatrix: |
| 156 ASSERT_NOT_REACHED(); | 156 ASSERT_NOT_REACHED(); |
| 157 case SVG_TRANSFORM_UNKNOWN: | 157 case kSvgTransformUnknown: |
| 158 return SVGTransform::create(); | 158 return SVGTransform::create(); |
| 159 case SVG_TRANSFORM_TRANSLATE: { | 159 case kSvgTransformTranslate: { |
| 160 FloatPoint translation = transform->translate(); | 160 FloatPoint translation = transform->translate(); |
| 161 translation += FloatSize::narrowPrecision(m_transform.e(), m_transform.f
()); | 161 translation += FloatSize::narrowPrecision(m_transform.e(), m_transform.f
()); |
| 162 newTransform->setTranslate(translation.x(), translation.y()); | 162 newTransform->setTranslate(translation.x(), translation.y()); |
| 163 return newTransform; | 163 return newTransform; |
| 164 } | 164 } |
| 165 case SVG_TRANSFORM_SCALE: { | 165 case kSvgTransformScale: { |
| 166 FloatSize scale = transform->scale(); | 166 FloatSize scale = transform->scale(); |
| 167 scale += FloatSize::narrowPrecision(m_transform.a(), m_transform.d()); | 167 scale += FloatSize::narrowPrecision(m_transform.a(), m_transform.d()); |
| 168 newTransform->setScale(scale.width(), scale.height()); | 168 newTransform->setScale(scale.width(), scale.height()); |
| 169 return newTransform; | 169 return newTransform; |
| 170 } | 170 } |
| 171 case SVG_TRANSFORM_ROTATE: { | 171 case kSvgTransformRotate: { |
| 172 FloatPoint center = transform->rotationCenter(); | 172 FloatPoint center = transform->rotationCenter(); |
| 173 newTransform->setRotate(transform->angle() + m_angle, center.x() + m_cx,
center.y() + m_cy); | 173 newTransform->setRotate(transform->angle() + m_angle, center.x() + m_cx,
center.y() + m_cy); |
| 174 return newTransform; | 174 return newTransform; |
| 175 } | 175 } |
| 176 case SVG_TRANSFORM_SKEWX: | 176 case kSvgTransformSkewx: |
| 177 newTransform->setSkewX(transform->angle() + m_angle); | 177 newTransform->setSkewX(transform->angle() + m_angle); |
| 178 return newTransform; | 178 return newTransform; |
| 179 case SVG_TRANSFORM_SKEWY: | 179 case kSvgTransformSkewy: |
| 180 newTransform->setSkewY(transform->angle() + m_angle); | 180 newTransform->setSkewY(transform->angle() + m_angle); |
| 181 return newTransform; | 181 return newTransform; |
| 182 } | 182 } |
| 183 | 183 |
| 184 ASSERT_NOT_REACHED(); | 184 ASSERT_NOT_REACHED(); |
| 185 return newTransform; | 185 return newTransform; |
| 186 } | 186 } |
| 187 | 187 |
| 188 float SVGTransformDistance::distance() const | 188 float SVGTransformDistance::distance() const |
| 189 { | 189 { |
| 190 switch (m_transformType) { | 190 switch (m_transformType) { |
| 191 case SVG_TRANSFORM_MATRIX: | 191 case kSvgTransformMatrix: |
| 192 ASSERT_NOT_REACHED(); | 192 ASSERT_NOT_REACHED(); |
| 193 case SVG_TRANSFORM_UNKNOWN: | 193 case kSvgTransformUnknown: |
| 194 return 0; | 194 return 0; |
| 195 case SVG_TRANSFORM_ROTATE: | 195 case kSvgTransformRotate: |
| 196 return sqrtf(m_angle * m_angle + m_cx * m_cx + m_cy * m_cy); | 196 return sqrtf(m_angle * m_angle + m_cx * m_cx + m_cy * m_cy); |
| 197 case SVG_TRANSFORM_SCALE: | 197 case kSvgTransformScale: |
| 198 return static_cast<float>(sqrt(m_transform.a() * m_transform.a() + m_tra
nsform.d() * m_transform.d())); | 198 return static_cast<float>(sqrt(m_transform.a() * m_transform.a() + m_tra
nsform.d() * m_transform.d())); |
| 199 case SVG_TRANSFORM_TRANSLATE: | 199 case kSvgTransformTranslate: |
| 200 return static_cast<float>(sqrt(m_transform.e() * m_transform.e() + m_tra
nsform.f() * m_transform.f())); | 200 return static_cast<float>(sqrt(m_transform.e() * m_transform.e() + m_tra
nsform.f() * m_transform.f())); |
| 201 case SVG_TRANSFORM_SKEWX: | 201 case kSvgTransformSkewx: |
| 202 case SVG_TRANSFORM_SKEWY: | 202 case kSvgTransformSkewy: |
| 203 return m_angle; | 203 return m_angle; |
| 204 } | 204 } |
| 205 ASSERT_NOT_REACHED(); | 205 ASSERT_NOT_REACHED(); |
| 206 return 0; | 206 return 0; |
| 207 } | 207 } |
| 208 | 208 |
| 209 } // namespace blink | 209 } // namespace blink |
| OLD | NEW |