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

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

Issue 539833004: [SVG2] Add support for marker orient="auto-start-reverse". (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: add dump-render-tree output + fix nit and test Created 6 years, 3 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
« no previous file with comments | « Source/core/svg/SVGAngle.h ('k') | no next file » | 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) 2004, 2005, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> 2 * Copyright (C) 2004, 2005, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
3 * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org> 3 * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
4 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 4 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 20 matching lines...) Expand all
31 #include "wtf/text/WTFString.h" 31 #include "wtf/text/WTFString.h"
32 32
33 namespace blink { 33 namespace blink {
34 34
35 template<> const SVGEnumerationStringEntries& getStaticStringEntries<SVGMarkerOr ientType>() 35 template<> const SVGEnumerationStringEntries& getStaticStringEntries<SVGMarkerOr ientType>()
36 { 36 {
37 DEFINE_STATIC_LOCAL(SVGEnumerationStringEntries, entries, ()); 37 DEFINE_STATIC_LOCAL(SVGEnumerationStringEntries, entries, ());
38 if (entries.isEmpty()) { 38 if (entries.isEmpty()) {
39 entries.append(std::make_pair(SVGMarkerOrientAuto, "auto")); 39 entries.append(std::make_pair(SVGMarkerOrientAuto, "auto"));
40 entries.append(std::make_pair(SVGMarkerOrientAngle, "angle")); 40 entries.append(std::make_pair(SVGMarkerOrientAngle, "angle"));
41 entries.append(std::make_pair(SVGMarkerOrientAutoStartReverse, "auto-sta rt-reverse"));
41 } 42 }
42 return entries; 43 return entries;
43 } 44 }
44 45
46 template<> unsigned short getMaxExposedEnumValue<SVGMarkerOrientType>()
47 {
48 return SVGMarkerOrientAngle;
49 }
50
45 SVGMarkerOrientEnumeration::SVGMarkerOrientEnumeration(SVGAngle* angle) 51 SVGMarkerOrientEnumeration::SVGMarkerOrientEnumeration(SVGAngle* angle)
46 : SVGEnumeration<SVGMarkerOrientType>(SVGMarkerOrientAngle) 52 : SVGEnumeration<SVGMarkerOrientType>(SVGMarkerOrientAngle)
47 , m_angle(angle) 53 , m_angle(angle)
48 { 54 {
49 } 55 }
50 56
51 SVGMarkerOrientEnumeration::~SVGMarkerOrientEnumeration() 57 SVGMarkerOrientEnumeration::~SVGMarkerOrientEnumeration()
52 { 58 {
53 } 59 }
54 60
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 if (value.isEmpty()) { 230 if (value.isEmpty()) {
225 newValueSpecifiedUnits(SVG_ANGLETYPE_UNSPECIFIED, 0); 231 newValueSpecifiedUnits(SVG_ANGLETYPE_UNSPECIFIED, 0);
226 return; 232 return;
227 } 233 }
228 234
229 if (value == "auto") { 235 if (value == "auto") {
230 newValueSpecifiedUnits(SVG_ANGLETYPE_UNSPECIFIED, 0); 236 newValueSpecifiedUnits(SVG_ANGLETYPE_UNSPECIFIED, 0);
231 m_orientType->setEnumValue(SVGMarkerOrientAuto); 237 m_orientType->setEnumValue(SVGMarkerOrientAuto);
232 return; 238 return;
233 } 239 }
240 if (value == "auto-start-reverse") {
241 newValueSpecifiedUnits(SVG_ANGLETYPE_UNSPECIFIED, 0);
242 m_orientType->setEnumValue(SVGMarkerOrientAutoStartReverse);
243 return;
244 }
234 245
235 float valueInSpecifiedUnits = 0; 246 float valueInSpecifiedUnits = 0;
236 SVGAngleType unitType = SVG_ANGLETYPE_UNKNOWN; 247 SVGAngleType unitType = SVG_ANGLETYPE_UNKNOWN;
237 248
238 bool success = value.is8Bit() ? parseValue<LChar>(value, valueInSpecifiedUni ts, unitType) 249 bool success = value.is8Bit() ? parseValue<LChar>(value, valueInSpecifiedUni ts, unitType)
239 : parseValue<UChar>(value, valueInSpecifiedUni ts, unitType); 250 : parseValue<UChar>(value, valueInSpecifiedUni ts, unitType);
240 if (!success) { 251 if (!success) {
241 exceptionState.throwDOMException(SyntaxError, "The value provided ('" + value + "') is invalid."); 252 exceptionState.throwDOMException(SyntaxError, "The value provided ('" + value + "') is invalid.");
242 return; 253 return;
243 } 254 }
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 bool isToAnimation = animationElement->animationMode() == ToAnimation; 377 bool isToAnimation = animationElement->animationMode() == ToAnimation;
367 378
368 RefPtr<SVGAngle> fromAngle = isToAnimation ? this : toSVGAngle(from); 379 RefPtr<SVGAngle> fromAngle = isToAnimation ? this : toSVGAngle(from);
369 RefPtr<SVGAngle> toAngle = toSVGAngle(to); 380 RefPtr<SVGAngle> toAngle = toSVGAngle(to);
370 RefPtr<SVGAngle> toAtEndOfDurationAngle = toSVGAngle(toAtEndOfDuration); 381 RefPtr<SVGAngle> toAtEndOfDurationAngle = toSVGAngle(toAtEndOfDuration);
371 382
372 SVGMarkerOrientType fromOrientType = fromAngle->orientType()->enumValue(); 383 SVGMarkerOrientType fromOrientType = fromAngle->orientType()->enumValue();
373 SVGMarkerOrientType toOrientType = toAngle->orientType()->enumValue(); 384 SVGMarkerOrientType toOrientType = toAngle->orientType()->enumValue();
374 385
375 if (fromOrientType != toOrientType) { 386 if (fromOrientType != toOrientType) {
376 // Animating from eg. auto to 90deg, or auto to 90deg. 387 // Animating from eg. 90deg to auto.
377 if (fromOrientType == SVGMarkerOrientAngle) { 388 if (fromOrientType == SVGMarkerOrientAngle) {
378 // Animating from an angle value to eg. 'auto' - this disabled addit ive as 'auto' is a keyword.. 389 // Animating from an angle value to eg. 'auto' - this disabled addit ive as 'auto' is a keyword..
379 if (toOrientType == SVGMarkerOrientAuto) { 390 if (toOrientType == SVGMarkerOrientAuto || toOrientType == SVGMarker OrientAutoStartReverse) {
380 if (percentage < 0.5f) { 391 if (percentage < 0.5f) {
381 newValueSpecifiedUnits(fromAngle->unitType(), fromAngle->val ueInSpecifiedUnits()); 392 newValueSpecifiedUnits(fromAngle->unitType(), fromAngle->val ueInSpecifiedUnits());
382 return; 393 return;
383 } 394 }
384 orientType()->setEnumValue(SVGMarkerOrientAuto); 395 orientType()->setEnumValue(toOrientType);
385 return; 396 return;
386 } 397 }
387 m_valueInSpecifiedUnits = 0; 398 m_valueInSpecifiedUnits = 0;
388 orientType()->setEnumValue(SVGMarkerOrientUnknown); 399 orientType()->setEnumValue(SVGMarkerOrientUnknown);
389 return; 400 return;
401 } else if (toOrientType == SVGMarkerOrientAuto || toOrientType == SVGMar kerOrientAutoStartReverse) {
402 // Animating from e.g 'auto' to 'auto-start-reverse'
403 if (percentage >= 0.5f) {
404 m_valueInSpecifiedUnits = 0;
405 orientType()->setEnumValue(toOrientType);
406 return;
407 }
390 } 408 }
391 } 409 }
392 410
393 // From 'auto' to 'auto'. 411 // From 'auto' to 'auto', or 'auto-start-reverse' to 'auto-start-reverse'
394 if (fromOrientType == SVGMarkerOrientAuto) { 412 if (fromOrientType == SVGMarkerOrientAuto || fromOrientType == SVGMarkerOrie ntAutoStartReverse) {
395 m_valueInSpecifiedUnits = 0; 413 m_valueInSpecifiedUnits = 0;
396 orientType()->setEnumValue(SVGMarkerOrientAuto); 414 orientType()->setEnumValue(fromOrientType);
397 return; 415 return;
398 } 416 }
399 417
400 // If the enumeration value is not angle or auto, its unknown. 418 // If the enumeration value is not angle or auto, its unknown.
401 if (fromOrientType != SVGMarkerOrientAngle) { 419 if (fromOrientType != SVGMarkerOrientAngle) {
402 m_valueInSpecifiedUnits = 0; 420 m_valueInSpecifiedUnits = 0;
403 orientType()->setEnumValue(SVGMarkerOrientUnknown); 421 orientType()->setEnumValue(SVGMarkerOrientUnknown);
404 return; 422 return;
405 } 423 }
406 424
407 // Regular from angle to angle animation, with all features like additive et c. 425 // Regular from angle to angle animation, with all features like additive et c.
408 float animatedValue = value(); 426 float animatedValue = value();
409 animationElement->animateAdditiveNumber(percentage, repeatCount, fromAngle-> value(), toAngle->value(), toAtEndOfDurationAngle->value(), animatedValue); 427 animationElement->animateAdditiveNumber(percentage, repeatCount, fromAngle-> value(), toAngle->value(), toAtEndOfDurationAngle->value(), animatedValue);
410 orientType()->setEnumValue(SVGMarkerOrientAngle); 428 orientType()->setEnumValue(SVGMarkerOrientAngle);
411 setValue(animatedValue); 429 setValue(animatedValue);
412 } 430 }
413 431
414 float SVGAngle::calculateDistance(PassRefPtr<SVGPropertyBase> other, SVGElement* ) 432 float SVGAngle::calculateDistance(PassRefPtr<SVGPropertyBase> other, SVGElement* )
415 { 433 {
416 return fabsf(value() - toSVGAngle(other)->value()); 434 return fabsf(value() - toSVGAngle(other)->value());
417 } 435 }
418 436
419 void SVGAngle::orientTypeChanged() 437 void SVGAngle::orientTypeChanged()
420 { 438 {
421 if (orientType()->enumValue() == SVGMarkerOrientAuto) { 439 if (orientType()->enumValue() == SVGMarkerOrientAuto || orientType()->enumVa lue() == SVGMarkerOrientAutoStartReverse) {
422 m_unitType = SVG_ANGLETYPE_UNSPECIFIED; 440 m_unitType = SVG_ANGLETYPE_UNSPECIFIED;
423 m_valueInSpecifiedUnits = 0; 441 m_valueInSpecifiedUnits = 0;
424 } 442 }
425 } 443 }
426 444
427 } 445 }
OLDNEW
« no previous file with comments | « Source/core/svg/SVGAngle.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698