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

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

Issue 678163002: Oilpan: move SVG property hierarchy to the heap. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased upto r185213 Created 6 years, 1 month 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/SVGAngle.h ('k') | Source/core/svg/SVGAngle.idl » ('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) 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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 SVGMarkerOrientEnumeration::SVGMarkerOrientEnumeration(SVGAngle* angle) 51 SVGMarkerOrientEnumeration::SVGMarkerOrientEnumeration(SVGAngle* angle)
52 : SVGEnumeration<SVGMarkerOrientType>(SVGMarkerOrientAngle) 52 : SVGEnumeration<SVGMarkerOrientType>(SVGMarkerOrientAngle)
53 , m_angle(angle) 53 , m_angle(angle)
54 { 54 {
55 } 55 }
56 56
57 SVGMarkerOrientEnumeration::~SVGMarkerOrientEnumeration() 57 SVGMarkerOrientEnumeration::~SVGMarkerOrientEnumeration()
58 { 58 {
59 } 59 }
60 60
61 void SVGMarkerOrientEnumeration::trace(Visitor* visitor)
62 {
63 visitor->trace(m_angle);
64 SVGEnumeration<SVGMarkerOrientType>::trace(visitor);
65 }
66
61 void SVGMarkerOrientEnumeration::notifyChange() 67 void SVGMarkerOrientEnumeration::notifyChange()
62 { 68 {
63 ASSERT(m_angle); 69 ASSERT(m_angle);
64 m_angle->orientTypeChanged(); 70 m_angle->orientTypeChanged();
65 } 71 }
66 72
67 void SVGMarkerOrientEnumeration::add(PassRefPtrWillBeRawPtr<SVGPropertyBase>, SV GElement*) 73 void SVGMarkerOrientEnumeration::add(PassRefPtrWillBeRawPtr<SVGPropertyBase>, SV GElement*)
68 { 74 {
69 // SVGMarkerOrientEnumeration is only animated via SVGAngle 75 // SVGMarkerOrientEnumeration is only animated via SVGAngle
70 ASSERT_NOT_REACHED(); 76 ASSERT_NOT_REACHED();
71 } 77 }
72 78
73 void SVGMarkerOrientEnumeration::calculateAnimatedValue(SVGAnimationElement*, fl oat percentage, unsigned repeatCount, PassRefPtr<SVGPropertyBase> from, PassRefP tr<SVGPropertyBase> to, PassRefPtr<SVGPropertyBase> toAtEndOfDurationValue, SVGE lement* contextElement) 79 void SVGMarkerOrientEnumeration::calculateAnimatedValue(SVGAnimationElement*, fl oat percentage, unsigned repeatCount, PassRefPtrWillBeRawPtr<SVGPropertyBase> fr om, PassRefPtrWillBeRawPtr<SVGPropertyBase> to, PassRefPtrWillBeRawPtr<SVGProper tyBase> toAtEndOfDurationValue, SVGElement* contextElement)
74 { 80 {
75 // SVGMarkerOrientEnumeration is only animated via SVGAngle 81 // SVGMarkerOrientEnumeration is only animated via SVGAngle
76 ASSERT_NOT_REACHED(); 82 ASSERT_NOT_REACHED();
77 } 83 }
78 84
79 float SVGMarkerOrientEnumeration::calculateDistance(PassRefPtr<SVGPropertyBase> to, SVGElement* contextElement) 85 float SVGMarkerOrientEnumeration::calculateDistance(PassRefPtrWillBeRawPtr<SVGPr opertyBase> to, SVGElement* contextElement)
80 { 86 {
81 // SVGMarkerOrientEnumeration is only animated via SVGAngle 87 // SVGMarkerOrientEnumeration is only animated via SVGAngle
82 ASSERT_NOT_REACHED(); 88 ASSERT_NOT_REACHED();
83 return -1.0; 89 return -1.0;
84 } 90 }
85 91
86 SVGAngle::SVGAngle() 92 SVGAngle::SVGAngle()
87 : m_unitType(SVG_ANGLETYPE_UNSPECIFIED) 93 : m_unitType(SVG_ANGLETYPE_UNSPECIFIED)
88 , m_valueInSpecifiedUnits(0) 94 , m_valueInSpecifiedUnits(0)
89 , m_orientType(SVGMarkerOrientEnumeration::create(this)) 95 , m_orientType(SVGMarkerOrientEnumeration::create(this))
90 { 96 {
91 } 97 }
92 98
93 SVGAngle::SVGAngle(SVGAngleType unitType, float valueInSpecifiedUnits, SVGMarker OrientType orientType) 99 SVGAngle::SVGAngle(SVGAngleType unitType, float valueInSpecifiedUnits, SVGMarker OrientType orientType)
94 : m_unitType(unitType) 100 : m_unitType(unitType)
95 , m_valueInSpecifiedUnits(valueInSpecifiedUnits) 101 , m_valueInSpecifiedUnits(valueInSpecifiedUnits)
96 , m_orientType(SVGMarkerOrientEnumeration::create(this)) 102 , m_orientType(SVGMarkerOrientEnumeration::create(this))
97 { 103 {
98 m_orientType->setEnumValue(orientType); 104 m_orientType->setEnumValue(orientType);
99 } 105 }
100 106
101 SVGAngle::~SVGAngle() 107 SVGAngle::~SVGAngle()
102 { 108 {
103 } 109 }
104 110
105 PassRefPtr<SVGAngle> SVGAngle::clone() const 111 void SVGAngle::trace(Visitor* visitor)
106 { 112 {
107 return adoptRef(new SVGAngle(m_unitType, m_valueInSpecifiedUnits, m_orientTy pe->enumValue())); 113 visitor->trace(m_orientType);
114 SVGPropertyHelper<SVGAngle>::trace(visitor);
115 }
116
117 PassRefPtrWillBeRawPtr<SVGAngle> SVGAngle::clone() const
118 {
119 return adoptRefWillBeNoop(new SVGAngle(m_unitType, m_valueInSpecifiedUnits, m_orientType->enumValue()));
108 } 120 }
109 121
110 float SVGAngle::value() const 122 float SVGAngle::value() const
111 { 123 {
112 switch (m_unitType) { 124 switch (m_unitType) {
113 case SVG_ANGLETYPE_GRAD: 125 case SVG_ANGLETYPE_GRAD:
114 return grad2deg(m_valueInSpecifiedUnits); 126 return grad2deg(m_valueInSpecifiedUnits);
115 case SVG_ANGLETYPE_RAD: 127 case SVG_ANGLETYPE_RAD:
116 return rad2deg(m_valueInSpecifiedUnits); 128 return rad2deg(m_valueInSpecifiedUnits);
117 case SVG_ANGLETYPE_TURN: 129 case SVG_ANGLETYPE_TURN:
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 ASSERT_NOT_REACHED(); 367 ASSERT_NOT_REACHED();
356 break; 368 break;
357 } 369 }
358 370
359 m_unitType = unitType; 371 m_unitType = unitType;
360 m_orientType->setEnumValue(SVGMarkerOrientAngle); 372 m_orientType->setEnumValue(SVGMarkerOrientAngle);
361 } 373 }
362 374
363 void SVGAngle::add(PassRefPtrWillBeRawPtr<SVGPropertyBase> other, SVGElement*) 375 void SVGAngle::add(PassRefPtrWillBeRawPtr<SVGPropertyBase> other, SVGElement*)
364 { 376 {
365 RefPtr<SVGAngle> otherAngle = toSVGAngle(other); 377 RefPtrWillBeRawPtr<SVGAngle> otherAngle = toSVGAngle(other);
366 378
367 // Only respect by animations, if from and by are both specified in angles ( and not eg. 'auto'). 379 // Only respect by animations, if from and by are both specified in angles ( and not eg. 'auto').
368 if (orientType()->enumValue() != SVGMarkerOrientAngle || otherAngle->orientT ype()->enumValue() != SVGMarkerOrientAngle) 380 if (orientType()->enumValue() != SVGMarkerOrientAngle || otherAngle->orientT ype()->enumValue() != SVGMarkerOrientAngle)
369 return; 381 return;
370 382
371 setValue(value() + otherAngle->value()); 383 setValue(value() + otherAngle->value());
372 } 384 }
373 385
374 void SVGAngle::assign(const SVGAngle& other) 386 void SVGAngle::assign(const SVGAngle& other)
375 { 387 {
376 SVGMarkerOrientType otherOrientType = other.orientType()->enumValue(); 388 SVGMarkerOrientType otherOrientType = other.orientType()->enumValue();
377 if (otherOrientType == SVGMarkerOrientAngle) 389 if (otherOrientType == SVGMarkerOrientAngle)
378 newValueSpecifiedUnits(other.unitType(), other.valueInSpecifiedUnits()); 390 newValueSpecifiedUnits(other.unitType(), other.valueInSpecifiedUnits());
379 else 391 else
380 m_orientType->setEnumValue(otherOrientType); 392 m_orientType->setEnumValue(otherOrientType);
381 } 393 }
382 394
383 void SVGAngle::calculateAnimatedValue(SVGAnimationElement* animationElement, flo at percentage, unsigned repeatCount, PassRefPtr<SVGPropertyBase> from, PassRefPt r<SVGPropertyBase> to, PassRefPtr<SVGPropertyBase> toAtEndOfDuration, SVGElement *) 395 void SVGAngle::calculateAnimatedValue(SVGAnimationElement* animationElement, flo at percentage, unsigned repeatCount, PassRefPtrWillBeRawPtr<SVGPropertyBase> fro m, PassRefPtrWillBeRawPtr<SVGPropertyBase> to, PassRefPtrWillBeRawPtr<SVGPropert yBase> toAtEndOfDuration, SVGElement*)
384 { 396 {
385 ASSERT(animationElement); 397 ASSERT(animationElement);
386 bool isToAnimation = animationElement->animationMode() == ToAnimation; 398 bool isToAnimation = animationElement->animationMode() == ToAnimation;
387 399
388 RefPtr<SVGAngle> fromAngle = isToAnimation ? this : toSVGAngle(from); 400 RefPtrWillBeRawPtr<SVGAngle> fromAngle = isToAnimation ? PassRefPtrWillBeRaw Ptr<SVGAngle>(this) : toSVGAngle(from);
389 RefPtr<SVGAngle> toAngle = toSVGAngle(to); 401 RefPtrWillBeRawPtr<SVGAngle> toAngle = toSVGAngle(to);
390 SVGMarkerOrientType fromOrientType = fromAngle->orientType()->enumValue(); 402 SVGMarkerOrientType fromOrientType = fromAngle->orientType()->enumValue();
391 SVGMarkerOrientType toOrientType = toAngle->orientType()->enumValue(); 403 SVGMarkerOrientType toOrientType = toAngle->orientType()->enumValue();
392 404
393 if (fromOrientType != toOrientType) { 405 if (fromOrientType != toOrientType) {
394 // Fall back to discrete animation. 406 // Fall back to discrete animation.
395 assign(percentage < 0.5f ? *fromAngle : *toAngle); 407 assign(percentage < 0.5f ? *fromAngle : *toAngle);
396 return; 408 return;
397 } 409 }
398 410
399 switch (fromOrientType) { 411 switch (fromOrientType) {
400 // From 'auto' to 'auto', or 'auto-start-reverse' to 'auto-start-reverse' 412 // From 'auto' to 'auto', or 'auto-start-reverse' to 'auto-start-reverse'
401 case SVGMarkerOrientAuto: 413 case SVGMarkerOrientAuto:
402 case SVGMarkerOrientAutoStartReverse: 414 case SVGMarkerOrientAutoStartReverse:
403 orientType()->setEnumValue(fromOrientType); 415 orientType()->setEnumValue(fromOrientType);
404 return; 416 return;
405 417
406 // Regular from angle to angle animation, with all features like additive et c. 418 // Regular from angle to angle animation, with all features like additive et c.
407 case SVGMarkerOrientAngle: 419 case SVGMarkerOrientAngle:
408 { 420 {
409 float animatedValue = value(); 421 float animatedValue = value();
410 RefPtr<SVGAngle> toAtEndOfDurationAngle = toSVGAngle(toAtEndOfDurati on); 422 RefPtrWillBeRawPtr<SVGAngle> toAtEndOfDurationAngle = toSVGAngle(toA tEndOfDuration);
411 423
412 animationElement->animateAdditiveNumber(percentage, repeatCount, fro mAngle->value(), toAngle->value(), toAtEndOfDurationAngle->value(), animatedValu e); 424 animationElement->animateAdditiveNumber(percentage, repeatCount, fro mAngle->value(), toAngle->value(), toAtEndOfDurationAngle->value(), animatedValu e);
413 orientType()->setEnumValue(SVGMarkerOrientAngle); 425 orientType()->setEnumValue(SVGMarkerOrientAngle);
414 setValue(animatedValue); 426 setValue(animatedValue);
415 } 427 }
416 return; 428 return;
417 429
418 // If the enumeration value is not angle or auto, its unknown. 430 // If the enumeration value is not angle or auto, its unknown.
419 default: 431 default:
420 m_valueInSpecifiedUnits = 0; 432 m_valueInSpecifiedUnits = 0;
421 orientType()->setEnumValue(SVGMarkerOrientUnknown); 433 orientType()->setEnumValue(SVGMarkerOrientUnknown);
422 return; 434 return;
423 } 435 }
424 } 436 }
425 437
426 float SVGAngle::calculateDistance(PassRefPtr<SVGPropertyBase> other, SVGElement* ) 438 float SVGAngle::calculateDistance(PassRefPtrWillBeRawPtr<SVGPropertyBase> other, SVGElement*)
427 { 439 {
428 return fabsf(value() - toSVGAngle(other)->value()); 440 return fabsf(value() - toSVGAngle(other)->value());
429 } 441 }
430 442
431 void SVGAngle::orientTypeChanged() 443 void SVGAngle::orientTypeChanged()
432 { 444 {
433 if (orientType()->enumValue() == SVGMarkerOrientAuto || orientType()->enumVa lue() == SVGMarkerOrientAutoStartReverse) { 445 if (orientType()->enumValue() == SVGMarkerOrientAuto || orientType()->enumVa lue() == SVGMarkerOrientAutoStartReverse) {
434 m_unitType = SVG_ANGLETYPE_UNSPECIFIED; 446 m_unitType = SVG_ANGLETYPE_UNSPECIFIED;
435 m_valueInSpecifiedUnits = 0; 447 m_valueInSpecifiedUnits = 0;
436 } 448 }
437 } 449 }
438 450
439 } 451 }
OLDNEW
« no previous file with comments | « Source/core/svg/SVGAngle.h ('k') | Source/core/svg/SVGAngle.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698