| 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 29 matching lines...) Expand all Loading... |
| 40 m_transform(transform) {} | 40 m_transform(transform) {} |
| 41 | 41 |
| 42 SVGTransformDistance::SVGTransformDistance(SVGTransform* fromSVGTransform, | 42 SVGTransformDistance::SVGTransformDistance(SVGTransform* fromSVGTransform, |
| 43 SVGTransform* toSVGTransform) | 43 SVGTransform* toSVGTransform) |
| 44 : m_angle(0), m_cx(0), m_cy(0) { | 44 : m_angle(0), m_cx(0), m_cy(0) { |
| 45 m_transformType = fromSVGTransform->transformType(); | 45 m_transformType = fromSVGTransform->transformType(); |
| 46 ASSERT(m_transformType == toSVGTransform->transformType()); | 46 ASSERT(m_transformType == toSVGTransform->transformType()); |
| 47 | 47 |
| 48 switch (m_transformType) { | 48 switch (m_transformType) { |
| 49 case kSvgTransformMatrix: | 49 case kSvgTransformMatrix: |
| 50 ASSERT_NOT_REACHED(); | 50 NOTREACHED(); |
| 51 case kSvgTransformUnknown: | 51 case kSvgTransformUnknown: |
| 52 break; | 52 break; |
| 53 case kSvgTransformRotate: { | 53 case kSvgTransformRotate: { |
| 54 FloatSize centerDistance = | 54 FloatSize centerDistance = |
| 55 toSVGTransform->rotationCenter() - fromSVGTransform->rotationCenter(); | 55 toSVGTransform->rotationCenter() - fromSVGTransform->rotationCenter(); |
| 56 m_angle = toSVGTransform->angle() - fromSVGTransform->angle(); | 56 m_angle = toSVGTransform->angle() - fromSVGTransform->angle(); |
| 57 m_cx = centerDistance.width(); | 57 m_cx = centerDistance.width(); |
| 58 m_cy = centerDistance.height(); | 58 m_cy = centerDistance.height(); |
| 59 break; | 59 break; |
| 60 } | 60 } |
| (...skipping 16 matching lines...) Expand all Loading... |
| 77 case kSvgTransformSkewy: | 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( | 83 SVGTransformDistance SVGTransformDistance::scaledDistance( |
| 84 float scaleFactor) const { | 84 float scaleFactor) const { |
| 85 switch (m_transformType) { | 85 switch (m_transformType) { |
| 86 case kSvgTransformMatrix: | 86 case kSvgTransformMatrix: |
| 87 ASSERT_NOT_REACHED(); | 87 NOTREACHED(); |
| 88 case kSvgTransformUnknown: | 88 case kSvgTransformUnknown: |
| 89 return SVGTransformDistance(); | 89 return SVGTransformDistance(); |
| 90 case kSvgTransformRotate: | 90 case kSvgTransformRotate: |
| 91 return SVGTransformDistance(m_transformType, m_angle * scaleFactor, | 91 return SVGTransformDistance(m_transformType, m_angle * scaleFactor, |
| 92 m_cx * scaleFactor, m_cy * scaleFactor, | 92 m_cx * scaleFactor, m_cy * scaleFactor, |
| 93 AffineTransform()); | 93 AffineTransform()); |
| 94 case kSvgTransformScale: | 94 case kSvgTransformScale: |
| 95 return SVGTransformDistance( | 95 return SVGTransformDistance( |
| 96 m_transformType, m_angle * scaleFactor, m_cx * scaleFactor, | 96 m_transformType, m_angle * scaleFactor, m_cx * scaleFactor, |
| 97 m_cy * scaleFactor, AffineTransform(m_transform).scale(scaleFactor)); | 97 m_cy * scaleFactor, AffineTransform(m_transform).scale(scaleFactor)); |
| 98 case kSvgTransformTranslate: { | 98 case kSvgTransformTranslate: { |
| 99 AffineTransform newTransform(m_transform); | 99 AffineTransform newTransform(m_transform); |
| 100 newTransform.setE(m_transform.e() * scaleFactor); | 100 newTransform.setE(m_transform.e() * scaleFactor); |
| 101 newTransform.setF(m_transform.f() * scaleFactor); | 101 newTransform.setF(m_transform.f() * scaleFactor); |
| 102 return SVGTransformDistance(m_transformType, 0, 0, 0, newTransform); | 102 return SVGTransformDistance(m_transformType, 0, 0, 0, newTransform); |
| 103 } | 103 } |
| 104 case kSvgTransformSkewx: | 104 case kSvgTransformSkewx: |
| 105 case kSvgTransformSkewy: | 105 case kSvgTransformSkewy: |
| 106 return SVGTransformDistance(m_transformType, m_angle * scaleFactor, | 106 return SVGTransformDistance(m_transformType, m_angle * scaleFactor, |
| 107 m_cx * scaleFactor, m_cy * scaleFactor, | 107 m_cx * scaleFactor, m_cy * scaleFactor, |
| 108 AffineTransform()); | 108 AffineTransform()); |
| 109 } | 109 } |
| 110 | 110 |
| 111 ASSERT_NOT_REACHED(); | 111 NOTREACHED(); |
| 112 return SVGTransformDistance(); | 112 return SVGTransformDistance(); |
| 113 } | 113 } |
| 114 | 114 |
| 115 SVGTransform* SVGTransformDistance::addSVGTransforms(SVGTransform* first, | 115 SVGTransform* SVGTransformDistance::addSVGTransforms(SVGTransform* first, |
| 116 SVGTransform* second, | 116 SVGTransform* second, |
| 117 unsigned repeatCount) { | 117 unsigned repeatCount) { |
| 118 ASSERT(first->transformType() == second->transformType()); | 118 ASSERT(first->transformType() == second->transformType()); |
| 119 | 119 |
| 120 SVGTransform* transform = SVGTransform::create(); | 120 SVGTransform* transform = SVGTransform::create(); |
| 121 | 121 |
| 122 switch (first->transformType()) { | 122 switch (first->transformType()) { |
| 123 case kSvgTransformMatrix: | 123 case kSvgTransformMatrix: |
| 124 ASSERT_NOT_REACHED(); | 124 NOTREACHED(); |
| 125 case kSvgTransformUnknown: | 125 case kSvgTransformUnknown: |
| 126 return transform; | 126 return transform; |
| 127 case kSvgTransformRotate: { | 127 case kSvgTransformRotate: { |
| 128 transform->setRotate(first->angle() + second->angle() * repeatCount, | 128 transform->setRotate(first->angle() + second->angle() * repeatCount, |
| 129 first->rotationCenter().x() + | 129 first->rotationCenter().x() + |
| 130 second->rotationCenter().x() * repeatCount, | 130 second->rotationCenter().x() * repeatCount, |
| 131 first->rotationCenter().y() + | 131 first->rotationCenter().y() + |
| 132 second->rotationCenter().y() * repeatCount); | 132 second->rotationCenter().y() * repeatCount); |
| 133 return transform; | 133 return transform; |
| 134 } | 134 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 145 transform->setScale(scale.width(), scale.height()); | 145 transform->setScale(scale.width(), scale.height()); |
| 146 return transform; | 146 return transform; |
| 147 } | 147 } |
| 148 case kSvgTransformSkewx: | 148 case kSvgTransformSkewx: |
| 149 transform->setSkewX(first->angle() + second->angle() * repeatCount); | 149 transform->setSkewX(first->angle() + second->angle() * repeatCount); |
| 150 return transform; | 150 return transform; |
| 151 case kSvgTransformSkewy: | 151 case kSvgTransformSkewy: |
| 152 transform->setSkewY(first->angle() + second->angle() * repeatCount); | 152 transform->setSkewY(first->angle() + second->angle() * repeatCount); |
| 153 return transform; | 153 return transform; |
| 154 } | 154 } |
| 155 ASSERT_NOT_REACHED(); | 155 NOTREACHED(); |
| 156 return transform; | 156 return transform; |
| 157 } | 157 } |
| 158 | 158 |
| 159 SVGTransform* SVGTransformDistance::addToSVGTransform( | 159 SVGTransform* SVGTransformDistance::addToSVGTransform( |
| 160 SVGTransform* transform) const { | 160 SVGTransform* transform) const { |
| 161 DCHECK(m_transformType == transform->transformType() || | 161 DCHECK(m_transformType == transform->transformType() || |
| 162 m_transformType == kSvgTransformUnknown); | 162 m_transformType == kSvgTransformUnknown); |
| 163 | 163 |
| 164 SVGTransform* newTransform = transform->clone(); | 164 SVGTransform* newTransform = transform->clone(); |
| 165 | 165 |
| 166 switch (m_transformType) { | 166 switch (m_transformType) { |
| 167 case kSvgTransformMatrix: | 167 case kSvgTransformMatrix: |
| 168 ASSERT_NOT_REACHED(); | 168 NOTREACHED(); |
| 169 case kSvgTransformUnknown: | 169 case kSvgTransformUnknown: |
| 170 return SVGTransform::create(); | 170 return SVGTransform::create(); |
| 171 case kSvgTransformTranslate: { | 171 case kSvgTransformTranslate: { |
| 172 FloatPoint translation = transform->translate(); | 172 FloatPoint translation = transform->translate(); |
| 173 translation += | 173 translation += |
| 174 FloatSize::narrowPrecision(m_transform.e(), m_transform.f()); | 174 FloatSize::narrowPrecision(m_transform.e(), m_transform.f()); |
| 175 newTransform->setTranslate(translation.x(), translation.y()); | 175 newTransform->setTranslate(translation.x(), translation.y()); |
| 176 return newTransform; | 176 return newTransform; |
| 177 } | 177 } |
| 178 case kSvgTransformScale: { | 178 case kSvgTransformScale: { |
| 179 FloatSize scale = transform->scale(); | 179 FloatSize scale = transform->scale(); |
| 180 scale += FloatSize::narrowPrecision(m_transform.a(), m_transform.d()); | 180 scale += FloatSize::narrowPrecision(m_transform.a(), m_transform.d()); |
| 181 newTransform->setScale(scale.width(), scale.height()); | 181 newTransform->setScale(scale.width(), scale.height()); |
| 182 return newTransform; | 182 return newTransform; |
| 183 } | 183 } |
| 184 case kSvgTransformRotate: { | 184 case kSvgTransformRotate: { |
| 185 FloatPoint center = transform->rotationCenter(); | 185 FloatPoint center = transform->rotationCenter(); |
| 186 newTransform->setRotate(transform->angle() + m_angle, center.x() + m_cx, | 186 newTransform->setRotate(transform->angle() + m_angle, center.x() + m_cx, |
| 187 center.y() + m_cy); | 187 center.y() + m_cy); |
| 188 return newTransform; | 188 return newTransform; |
| 189 } | 189 } |
| 190 case kSvgTransformSkewx: | 190 case kSvgTransformSkewx: |
| 191 newTransform->setSkewX(transform->angle() + m_angle); | 191 newTransform->setSkewX(transform->angle() + m_angle); |
| 192 return newTransform; | 192 return newTransform; |
| 193 case kSvgTransformSkewy: | 193 case kSvgTransformSkewy: |
| 194 newTransform->setSkewY(transform->angle() + m_angle); | 194 newTransform->setSkewY(transform->angle() + m_angle); |
| 195 return newTransform; | 195 return newTransform; |
| 196 } | 196 } |
| 197 | 197 |
| 198 ASSERT_NOT_REACHED(); | 198 NOTREACHED(); |
| 199 return newTransform; | 199 return newTransform; |
| 200 } | 200 } |
| 201 | 201 |
| 202 float SVGTransformDistance::distance() const { | 202 float SVGTransformDistance::distance() const { |
| 203 switch (m_transformType) { | 203 switch (m_transformType) { |
| 204 case kSvgTransformMatrix: | 204 case kSvgTransformMatrix: |
| 205 ASSERT_NOT_REACHED(); | 205 NOTREACHED(); |
| 206 case kSvgTransformUnknown: | 206 case kSvgTransformUnknown: |
| 207 return 0; | 207 return 0; |
| 208 case kSvgTransformRotate: | 208 case kSvgTransformRotate: |
| 209 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); |
| 210 case kSvgTransformScale: | 210 case kSvgTransformScale: |
| 211 return static_cast<float>(sqrt(m_transform.a() * m_transform.a() + | 211 return static_cast<float>(sqrt(m_transform.a() * m_transform.a() + |
| 212 m_transform.d() * m_transform.d())); | 212 m_transform.d() * m_transform.d())); |
| 213 case kSvgTransformTranslate: | 213 case kSvgTransformTranslate: |
| 214 return static_cast<float>(sqrt(m_transform.e() * m_transform.e() + | 214 return static_cast<float>(sqrt(m_transform.e() * m_transform.e() + |
| 215 m_transform.f() * m_transform.f())); | 215 m_transform.f() * m_transform.f())); |
| 216 case kSvgTransformSkewx: | 216 case kSvgTransformSkewx: |
| 217 case kSvgTransformSkewy: | 217 case kSvgTransformSkewy: |
| 218 return m_angle; | 218 return m_angle; |
| 219 } | 219 } |
| 220 ASSERT_NOT_REACHED(); | 220 NOTREACHED(); |
| 221 return 0; | 221 return 0; |
| 222 } | 222 } |
| 223 | 223 |
| 224 } // namespace blink | 224 } // namespace blink |
| OLD | NEW |