Changeset 19202 in webkit
- Timestamp:
- Jan 28, 2007 4:03:01 PM (17 years ago)
- Location:
- trunk/WebCore
- Files:
-
- 2 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/WebCore/ChangeLog
r19197 r19202 1 2007-01-28 Charles Ying <charles_ying@yahoo.com> 2 3 Reviewed by eseidel. Landed by eseidel. 4 5 Fix http://bugs.webkit.org/show_bug.cgi?id=12429 6 animateTransform rotate, with cx/cy is broken 7 8 SVGTransform now contains a float point to store the rotation center, needed 9 to track rotation center for interpolation by animateTransform. 10 11 SVGTransform now has an additional constructor: 12 SVGTransform(type) to make empty base value transforms that match their 13 distanced values. 14 15 Removed m_colorDistance and m_transformDistance from their respective classes 16 as they are now computed at update time. 17 18 Fix a case where animateTransform did not parse transform values correctly 19 according to BNF in W3C spec: 20 21 Test case in: 22 * manual-tests/animation/animateTransform-toanimation.svg: Added. 23 24 Fix a case where animateTransform only specified a to animation only. 25 26 Test case in: 27 * manual-tests/animation/animateTransform-parser.svg: Added. 28 29 * ksvg2/svg/SVGAnimateColorElement.cpp: 30 (WebCore::SVGAnimateColorElement::updateAnimationBaseValueFromElement): 31 (WebCore::SVGAnimateColorElement::updateAnimatedValue): 32 (WebCore::SVGAnimateColorElement::calculateFromAndToValues): 33 * ksvg2/svg/SVGAnimateColorElement.h: 34 * ksvg2/svg/SVGAnimateTransformElement.cpp: 35 (WebCore::SVGAnimateTransformElement::updateAnimatedValue): 36 (WebCore::SVGAnimateTransformElement::updateAnimationBaseValueFromElement): 37 (WebCore::SVGAnimateTransformElement::calculateFromAndToValues): 38 (WebCore::SVGAnimateTransformElement::parseTransformValue): 39 * ksvg2/svg/SVGAnimateTransformElement.h: 40 * ksvg2/svg/SVGTransform.cpp: 41 (SVGTransform::SVGTransform): 42 (SVGTransform::angle): 43 (SVGTransform::rotationCenter): 44 (SVGTransform::setTranslate): 45 (SVGTransform::setScale): 46 (SVGTransform::setRotate): 47 (SVGTransform::setSkewX): 48 (SVGTransform::setSkewY): 49 * ksvg2/svg/SVGTransform.h: 50 * ksvg2/svg/SVGTransformDistance.cpp: 51 (WebCore::SVGTransformDistance::SVGTransformDistance): 52 (WebCore::SVGTransformDistance::scaledDistance): 53 (WebCore::SVGTransformDistance::addSVGTransforms): 54 (WebCore::SVGTransformDistance::addSVGTransform): 55 (WebCore::SVGTransformDistance::addToSVGTransform): 56 (WebCore::SVGTransformDistance::distance): 57 * ksvg2/svg/SVGTransformDistance.h: 58 * manual-tests/animation/animateTransform-parser.svg: Added. 59 * manual-tests/animation/animateTransform-toanimation.svg: Added. 60 1 61 2007-01-27 Adam Roben <aroben@apple.com> 2 62 -
trunk/WebCore/ksvg2/svg/SVGAnimateColorElement.cpp
r19168 r19202 48 48 { 49 49 m_baseColor = SVGColor::colorFromRGBColorString(targetAttributeAnimatedValue()); 50 m_colorDistance = ColorDistance();51 50 m_fromColor = Color(); 52 51 m_toColor = Color(); … … 68 67 m_animatedColor = ColorDistance(m_baseColor, m_toColor).scaledDistance(timePercentage).addToColorAndClamp(m_baseColor); 69 68 else 70 m_animatedColor = m_colorDistance.scaledDistance(percentagePast).addToColorAndClamp(m_fromColor);69 m_animatedColor = ColorDistance(m_fromColor, m_toColor).scaledDistance(percentagePast).addToColorAndClamp(m_fromColor); 71 70 return (m_animatedColor != m_baseColor); 72 71 } … … 97 96 } 98 97 99 m_colorDistance = ColorDistance(m_fromColor, m_toColor); 100 return !m_colorDistance.isZero(); 98 return true; 101 99 } 102 100 -
trunk/WebCore/ksvg2/svg/SVGAnimateColorElement.h
r19168 r19202 54 54 Color m_toColor; 55 55 Color m_fromColor; 56 57 ColorDistance m_colorDistance;58 56 }; 59 57 -
trunk/WebCore/ksvg2/svg/SVGAnimateTransformElement.cpp
r19168 r19202 33 33 #include "SVGTransform.h" 34 34 #include "SVGTransformList.h" 35 #include "SVGParserUtilities.h" 35 36 #include <math.h> 36 37 #include <wtf/MathExtras.h> … … 79 80 m_animatedTransform = SVGTransformDistance(m_baseTransform, m_toTransform).scaledDistance(timePercentage).addToSVGTransform(m_baseTransform); 80 81 else 81 m_animatedTransform = m_transformDistance.scaledDistance(percentagePast).addToSVGTransform(m_fromTransform);82 m_animatedTransform = SVGTransformDistance(m_fromTransform, m_toTransform).scaledDistance(percentagePast).addToSVGTransform(m_fromTransform); 82 83 return (m_animatedTransform != m_baseTransform); 83 84 } … … 99 100 100 101 m_baseTransform = transformList->concatenateForType(m_type); 102 103 // If a base value is empty, its type should match m_type instead of being unknown. 104 // It's not certain whether this should be part of SVGTransformList or not -- cying 105 if (m_baseTransform.type() == SVGTransform::SVG_TRANSFORM_UNKNOWN) 106 m_baseTransform = SVGTransform(m_type); 101 107 102 108 return true; … … 123 129 bool SVGAnimateTransformElement::calculateFromAndToValues(EAnimationMode animationMode, unsigned valueIndex) 124 130 { 125 switch ( detectAnimationMode()) {131 switch (animationMode) { 126 132 case FROM_TO_ANIMATION: 127 133 m_fromTransform = parseTransformValue(m_from); … … 145 151 ASSERT_NOT_REACHED(); 146 152 } 147 m_transformDistance = SVGTransformDistance(m_fromTransform, m_toTransform);148 return !m_transformDistance.isZero();153 154 return true; 149 155 } 150 156 … … 156 162 if (parse.isEmpty()) 157 163 return SVGTransform(); 158 159 int commaPos = parse.find(','); // In case two values are passed... 160 164 165 // Careful, cur changes as parseNumber is called. 166 const UChar* cur = parse.characters(); 167 const UChar* end = cur + parse.length(); 168 161 169 SVGTransform parsedTransform; 162 170 … … 165 173 { 166 174 double tx = 0.0, ty = 0.0; 167 if (commaPos != - 1) { 168 tx = parse.substring(0, commaPos).toDouble(); 169 ty = parse.substring(commaPos + 1).toDouble(); 170 } else 171 tx = parse.toDouble(); 175 176 if (!parseNumber(cur, end, tx)) 177 tx = 0.0; 178 179 if (!parseNumber(cur, end, ty)) 180 ty = 0.0; 172 181 173 182 parsedTransform.setTranslate(tx, ty); … … 177 186 { 178 187 double sx = 1.0, sy = 1.0; 179 if (commaPos != - 1) { 180 sx = parse.substring(0, commaPos).toDouble();181 s y = parse.substring(commaPos + 1).toDouble();182 } else {183 sx = parse.toDouble();188 189 if (!parseNumber(cur, end, sx)) 190 sx = 1.0; 191 192 if (!parseNumber(cur, end, sy)) 184 193 sy = sx; 185 } 186 194 187 195 parsedTransform.setScale(sx, sy); 188 196 break; … … 191 199 { 192 200 double angle = 0, cx = 0, cy = 0; 193 if (commaPos != - 1) { 194 angle = parse.substring(0, commaPos).toDouble(); // TODO: probably needs it's own 'angle' parser 195 196 int commaPosTwo = parse.find(',', commaPos + 1); // In case three values are passed... 197 if (commaPosTwo != -1) { 198 cx = parse.substring(commaPos + 1, commaPosTwo - commaPos - 1).toDouble(); 199 cy = parse.substring(commaPosTwo + 1).toDouble(); 201 202 if (parseNumber(cur, end, angle)) { 203 // Successful, try to read cx and cy. It's either both cx and cy or none 204 if (!parseNumber(cur, end, cx) || !parseNumber(cur, end, cy)) { 205 cx = 0; 206 cy = 0; 200 207 } 201 208 } 202 else203 angle = parse.toDouble();204 209 205 210 parsedTransform.setRotate(angle, cx, cy); … … 209 214 case SVGTransform::SVG_TRANSFORM_SKEWY: 210 215 { 211 double angle = parse.toDouble(); // TODO: probably needs it's own 'angle' parser 216 double angle = 0; 217 218 if (!parseNumber(cur, end, angle)) 219 angle = 0; 212 220 213 221 if (m_type == SVGTransform::SVG_TRANSFORM_SKEWX) -
trunk/WebCore/ksvg2/svg/SVGAnimateTransformElement.h
r19168 r19202 64 64 SVGTransform m_baseTransform; 65 65 SVGTransform m_animatedTransform; 66 67 SVGTransformDistance m_transformDistance;68 66 }; 69 67 -
trunk/WebCore/ksvg2/svg/SVGTransform.cpp
r19168 r19202 38 38 } 39 39 40 SVGTransform::SVGTransform(SVGTransformType type) 41 : m_type(type) 42 , m_angle(0) 43 , m_center(FloatPoint()) 44 , m_matrix(AffineTransform()) 45 { 46 } 47 40 48 SVGTransform::SVGTransform(const AffineTransform& matrix) 41 49 : m_type(SVG_TRANSFORM_MATRIX) … … 64 72 } 65 73 66 doubleSVGTransform::angle() const74 float SVGTransform::angle() const 67 75 { 68 76 return m_angle; 77 } 78 79 FloatPoint SVGTransform::rotationCenter() const 80 { 81 return m_center; 69 82 } 70 83 … … 77 90 } 78 91 79 void SVGTransform::setTranslate( double tx, doublety)92 void SVGTransform::setTranslate(float tx, float ty) 80 93 { 81 94 m_type = SVG_TRANSFORM_TRANSLATE; … … 91 104 } 92 105 93 void SVGTransform::setScale( double sx, doublesy)106 void SVGTransform::setScale(float sx, float sy) 94 107 { 95 108 m_type = SVG_TRANSFORM_SCALE; 96 109 m_angle = 0; 110 m_center = FloatPoint(); 97 111 98 112 m_matrix.reset(); … … 105 119 } 106 120 107 void SVGTransform::setRotate( double angle, double cx, doublecy)121 void SVGTransform::setRotate(float angle, float cx, float cy) 108 122 { 109 123 m_type = SVG_TRANSFORM_ROTATE; 110 124 m_angle = angle; 125 m_center = FloatPoint(cx, cy); 111 126 112 127 // TODO: toString() implementation, which can show cx, cy (need to be stored?) … … 117 132 } 118 133 119 void SVGTransform::setSkewX( doubleangle)134 void SVGTransform::setSkewX(float angle) 120 135 { 121 136 m_type = SVG_TRANSFORM_SKEWX; … … 126 141 } 127 142 128 void SVGTransform::setSkewY( doubleangle)143 void SVGTransform::setSkewY(float angle) 129 144 { 130 145 m_type = SVG_TRANSFORM_SKEWY; -
trunk/WebCore/ksvg2/svg/SVGTransform.h
r19168 r19202 26 26 27 27 #include "AffineTransform.h" 28 #include "FloatPoint.h" 28 29 #include "Shared.h" 29 30 #include <wtf/RefPtr.h> … … 31 32 namespace WebCore { 32 33 33 class FloatPoint;34 34 class FloatSize; 35 35 … … 47 47 48 48 SVGTransform(); 49 SVGTransform(SVGTransformType type); 49 50 explicit SVGTransform(const AffineTransform&); 50 51 virtual ~SVGTransform(); … … 54 55 AffineTransform matrix() const; 55 56 56 double angle() const; 57 float angle() const; 58 FloatPoint rotationCenter() const; 57 59 58 60 void setMatrix(const AffineTransform&); 59 void setTranslate( double tx, doublety);60 void setScale( double sx, doublesy);61 void setRotate( double angle, double cx, doublecy);62 void setSkewX( doubleangle);63 void setSkewY( doubleangle);61 void setTranslate(float tx, float ty); 62 void setScale(float sx, float sy); 63 void setRotate(float angle, float cx, float cy); 64 void setSkewX(float angle); 65 void setSkewY(float angle); 64 66 65 67 // Internal use only (animation system) … … 71 73 private: 72 74 SVGTransformType m_type; 73 double m_angle; 75 float m_angle; 76 FloatPoint m_center; 74 77 AffineTransform m_matrix; 75 78 }; -
trunk/WebCore/ksvg2/svg/SVGTransformDistance.cpp
r19190 r19202 38 38 } 39 39 40 SVGTransformDistance::SVGTransformDistance(SVGTransform::SVGTransformType type, double angle, const AffineTransform& transform)40 SVGTransformDistance::SVGTransformDistance(SVGTransform::SVGTransformType type, double angle, double cx, double cy, const AffineTransform& transform) 41 41 : m_type(type) 42 42 , m_angle(angle) 43 , m_cx(cx) 44 , m_cy(cy) 43 45 , m_transform(transform) 44 46 { … … 48 50 : m_type(fromSVGTransform.type()) 49 51 , m_angle(0) 52 , m_cx(0) 53 , m_cy(0) 50 54 { 51 55 ASSERT(m_type == toSVGTransform.type()); … … 58 62 return; 59 63 case SVGTransform::SVG_TRANSFORM_ROTATE: 64 { 65 FloatSize centerDistance = toSVGTransform.rotationCenter() - fromSVGTransform.rotationCenter(); 60 66 m_angle = toSVGTransform.angle() - fromSVGTransform.angle(); 61 // fall through 67 m_cx = centerDistance.width(); 68 m_cy = centerDistance.height(); 69 return; 70 } 62 71 case SVGTransform::SVG_TRANSFORM_TRANSLATE: 63 72 { … … 86 95 return SVGTransformDistance(); 87 96 case SVGTransform::SVG_TRANSFORM_ROTATE: 88 return SVGTransformDistance(m_type, m_angle * scaleFactor, AffineTransform());89 case SVGTransform::SVG_TRANSFORM_SCALE: 90 case SVGTransform::SVG_TRANSFORM_MATRIX: 91 return SVGTransformDistance(m_type, m_angle * scaleFactor, AffineTransform(m_transform).scale(scaleFactor));97 return SVGTransformDistance(m_type, m_angle * scaleFactor, m_cx * scaleFactor, m_cy * scaleFactor, AffineTransform()); 98 case SVGTransform::SVG_TRANSFORM_SCALE: 99 case SVGTransform::SVG_TRANSFORM_MATRIX: 100 return SVGTransformDistance(m_type, m_angle * scaleFactor, m_cx * scaleFactor, m_cy * scaleFactor, AffineTransform(m_transform).scale(scaleFactor)); 92 101 case SVGTransform::SVG_TRANSFORM_TRANSLATE: 93 102 { … … 95 104 newTransform.setE(m_transform.e() * scaleFactor); 96 105 newTransform.setF(m_transform.f() * scaleFactor); 97 return SVGTransformDistance(m_type, 0, newTransform);98 } 99 case SVGTransform::SVG_TRANSFORM_SKEWX: 100 case SVGTransform::SVG_TRANSFORM_SKEWY: 101 return SVGTransformDistance(m_type, m_angle * scaleFactor, AffineTransform());106 return SVGTransformDistance(m_type, 0, 0, 0, newTransform); 107 } 108 case SVGTransform::SVG_TRANSFORM_SKEWX: 109 case SVGTransform::SVG_TRANSFORM_SKEWY: 110 return SVGTransformDistance(m_type, m_angle * scaleFactor, m_cx * scaleFactor, m_cy * scaleFactor, AffineTransform()); 102 111 } 103 112 … … 117 126 case SVGTransform::SVG_TRANSFORM_ROTATE: 118 127 { 119 // FIXME: I'm not sure that the translation is correct here 120 float dx = first.translate().x() + second.translate().x(); 121 float dy = first.translate().y() + second.translate().y(); 122 transform.setRotate(first.angle() + second.angle(), dx, dy); 128 transform.setRotate(first.angle() + second.angle(), first.rotationCenter().x() + second.rotationCenter().x(), 129 first.rotationCenter().y() + second.rotationCenter().y()); 123 130 return transform; 124 131 } … … 167 174 case SVGTransform::SVG_TRANSFORM_ROTATE: 168 175 m_angle += absoluteValue ? fabsf(transform.angle()) : transform.angle(); 176 m_cx += absoluteValue ? fabsf(transform.rotationCenter().x()) : transform.rotationCenter().x(); 177 m_cy += absoluteValue ? fabsf(transform.rotationCenter().y()) : transform.rotationCenter().y(); 169 178 // fall through 170 179 case SVGTransform::SVG_TRANSFORM_TRANSLATE: … … 220 229 { 221 230 // FIXME: I'm not certain the translation is calculated correctly here 222 FloatPoint translation = transform.translate(); 223 translation += FloatSize(m_transform.e(), m_transform.f()); 224 newTransform.setRotate(transform.angle() + m_angle, translation.x(), translation.y()); 231 FloatPoint center = transform.rotationCenter(); 232 newTransform.setRotate(transform.angle() + m_angle, center.x() + m_cx, center.y() + m_cy); 225 233 return newTransform; 226 234 } … … 248 256 return 0; 249 257 case SVGTransform::SVG_TRANSFORM_ROTATE: 250 return sqrtf(m_angle * m_angle + m_ transform.e() * m_transform.e() + m_transform.f() * m_transform.f());258 return sqrtf(m_angle * m_angle + m_cx * m_cx + m_cy * m_cy); 251 259 case SVGTransform::SVG_TRANSFORM_MATRIX: 252 260 return 0; // I'm not quite sure yet what distance between two matrices means. -
trunk/WebCore/ksvg2/svg/SVGTransformDistance.h
r19168 r19202 45 45 float distance() const; 46 46 private: 47 SVGTransformDistance(SVGTransform::SVGTransformType, double angle, const AffineTransform&);47 SVGTransformDistance(SVGTransform::SVGTransformType, double angle, double cx, double cy, const AffineTransform&); 48 48 49 49 SVGTransform::SVGTransformType m_type; 50 50 double m_angle; 51 double m_cx; 52 double m_cy; 51 53 AffineTransform m_transform; // for storing scale, translation or matrix transforms 52 54 };
Note: See TracChangeset
for help on using the changeset viewer.