Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(15)

Side by Side Diff: Source/core/svg/SVGTransformDistance.cpp

Issue 153883003: [SVG] SVGAnimatedTransform{,List} migration to new SVG property impl. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: remove m_zoomAndPan Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/svg/SVGTransformDistance.h ('k') | Source/core/svg/SVGTransformList.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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 }
OLDNEW
« no previous file with comments | « Source/core/svg/SVGTransformDistance.h ('k') | Source/core/svg/SVGTransformList.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698