| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org> |
| 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Rob Buis <buis@kde.org> |
| 4 * Copyright (C) 2007 Apple Inc. All rights reserved. | 4 * Copyright (C) 2007 Apple Inc. 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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 #include "core/svg/animation/SMILTimeContainer.h" | 54 #include "core/svg/animation/SMILTimeContainer.h" |
| 55 #include "platform/FloatConversion.h" | 55 #include "platform/FloatConversion.h" |
| 56 #include "platform/LengthFunctions.h" | 56 #include "platform/LengthFunctions.h" |
| 57 #include "platform/geometry/FloatRect.h" | 57 #include "platform/geometry/FloatRect.h" |
| 58 #include "platform/transforms/AffineTransform.h" | 58 #include "platform/transforms/AffineTransform.h" |
| 59 #include "wtf/StdLibExtras.h" | 59 #include "wtf/StdLibExtras.h" |
| 60 | 60 |
| 61 namespace WebCore { | 61 namespace WebCore { |
| 62 | 62 |
| 63 // Animated property definitions | 63 // Animated property definitions |
| 64 DEFINE_ANIMATED_LENGTH(SVGSVGElement, SVGNames::xAttr, X, x) | |
| 65 DEFINE_ANIMATED_LENGTH(SVGSVGElement, SVGNames::yAttr, Y, y) | |
| 66 DEFINE_ANIMATED_LENGTH(SVGSVGElement, SVGNames::widthAttr, Width, width) | |
| 67 DEFINE_ANIMATED_LENGTH(SVGSVGElement, SVGNames::heightAttr, Height, height) | |
| 68 DEFINE_ANIMATED_PRESERVEASPECTRATIO(SVGSVGElement, SVGNames::preserveAspectRatio
Attr, PreserveAspectRatio, preserveAspectRatio) | 64 DEFINE_ANIMATED_PRESERVEASPECTRATIO(SVGSVGElement, SVGNames::preserveAspectRatio
Attr, PreserveAspectRatio, preserveAspectRatio) |
| 69 DEFINE_ANIMATED_RECT(SVGSVGElement, SVGNames::viewBoxAttr, ViewBox, viewBox) | 65 DEFINE_ANIMATED_RECT(SVGSVGElement, SVGNames::viewBoxAttr, ViewBox, viewBox) |
| 70 | 66 |
| 71 BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGSVGElement) | 67 BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGSVGElement) |
| 72 REGISTER_LOCAL_ANIMATED_PROPERTY(x) | |
| 73 REGISTER_LOCAL_ANIMATED_PROPERTY(y) | |
| 74 REGISTER_LOCAL_ANIMATED_PROPERTY(width) | |
| 75 REGISTER_LOCAL_ANIMATED_PROPERTY(height) | |
| 76 REGISTER_LOCAL_ANIMATED_PROPERTY(viewBox) | 68 REGISTER_LOCAL_ANIMATED_PROPERTY(viewBox) |
| 77 REGISTER_LOCAL_ANIMATED_PROPERTY(preserveAspectRatio) | 69 REGISTER_LOCAL_ANIMATED_PROPERTY(preserveAspectRatio) |
| 78 REGISTER_PARENT_ANIMATED_PROPERTIES(SVGGraphicsElement) | 70 REGISTER_PARENT_ANIMATED_PROPERTIES(SVGGraphicsElement) |
| 79 END_REGISTER_ANIMATED_PROPERTIES | 71 END_REGISTER_ANIMATED_PROPERTIES |
| 80 | 72 |
| 81 inline SVGSVGElement::SVGSVGElement(Document& doc) | 73 inline SVGSVGElement::SVGSVGElement(Document& doc) |
| 82 : SVGGraphicsElement(SVGNames::svgTag, doc) | 74 : SVGGraphicsElement(SVGNames::svgTag, doc) |
| 83 , m_x(LengthModeWidth) | 75 , m_x(SVGAnimatedLength::create(this, SVGNames::xAttr, SVGLength::create(Len
gthModeWidth))) |
| 84 , m_y(LengthModeHeight) | 76 , m_y(SVGAnimatedLength::create(this, SVGNames::yAttr, SVGLength::create(Len
gthModeHeight))) |
| 85 , m_width(LengthModeWidth, "100%") | 77 , m_width(SVGAnimatedLength::create(this, SVGNames::widthAttr, SVGLength::cr
eate(LengthModeWidth))) |
| 86 , m_height(LengthModeHeight, "100%") | 78 , m_height(SVGAnimatedLength::create(this, SVGNames::heightAttr, SVGLength::
create(LengthModeHeight))) |
| 87 , m_useCurrentView(false) | 79 , m_useCurrentView(false) |
| 88 , m_zoomAndPan(SVGZoomAndPanMagnify) | 80 , m_zoomAndPan(SVGZoomAndPanMagnify) |
| 89 , m_timeContainer(SMILTimeContainer::create(this)) | 81 , m_timeContainer(SMILTimeContainer::create(this)) |
| 90 , m_weakFactory(this) | 82 , m_weakFactory(this) |
| 91 { | 83 { |
| 92 ScriptWrappable::init(this); | 84 ScriptWrappable::init(this); |
| 85 |
| 86 m_width->setDefaultValueAsString("100%"); |
| 87 m_height->setDefaultValueAsString("100%"); |
| 88 |
| 89 addToPropertyMap(m_x); |
| 90 addToPropertyMap(m_y); |
| 91 addToPropertyMap(m_width); |
| 92 addToPropertyMap(m_height); |
| 93 registerAnimatedPropertiesForSVGSVGElement(); | 93 registerAnimatedPropertiesForSVGSVGElement(); |
| 94 | 94 |
| 95 UseCounter::count(doc, UseCounter::SVGSVGElement); | 95 UseCounter::count(doc, UseCounter::SVGSVGElement); |
| 96 } | 96 } |
| 97 | 97 |
| 98 PassRefPtr<SVGSVGElement> SVGSVGElement::create(Document& document) | 98 PassRefPtr<SVGSVGElement> SVGSVGElement::create(Document& document) |
| 99 { | 99 { |
| 100 return adoptRef(new SVGSVGElement(document)); | 100 return adoptRef(new SVGSVGElement(document)); |
| 101 } | 101 } |
| 102 | 102 |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 240 | 240 |
| 241 if (setListener) | 241 if (setListener) |
| 242 return; | 242 return; |
| 243 } | 243 } |
| 244 | 244 |
| 245 if (name == HTMLNames::onabortAttr) | 245 if (name == HTMLNames::onabortAttr) |
| 246 document().setWindowAttributeEventListener(EventTypeNames::abort, create
AttributeEventListener(document().frame(), name, value)); | 246 document().setWindowAttributeEventListener(EventTypeNames::abort, create
AttributeEventListener(document().frame(), name, value)); |
| 247 else if (name == HTMLNames::onerrorAttr) | 247 else if (name == HTMLNames::onerrorAttr) |
| 248 document().setWindowAttributeEventListener(EventTypeNames::error, create
AttributeEventListener(document().frame(), name, value)); | 248 document().setWindowAttributeEventListener(EventTypeNames::error, create
AttributeEventListener(document().frame(), name, value)); |
| 249 else if (name == SVGNames::xAttr) | 249 else if (name == SVGNames::xAttr) |
| 250 setXBaseValue(SVGLength::construct(LengthModeWidth, value, parseError)); | 250 m_x->setBaseValueAsString(value, AllowNegativeLengths, parseError); |
| 251 else if (name == SVGNames::yAttr) | 251 else if (name == SVGNames::yAttr) |
| 252 setYBaseValue(SVGLength::construct(LengthModeHeight, value, parseError))
; | 252 m_y->setBaseValueAsString(value, AllowNegativeLengths, parseError); |
| 253 else if (name == SVGNames::widthAttr) | 253 else if (name == SVGNames::widthAttr) |
| 254 setWidthBaseValue(SVGLength::construct(LengthModeWidth, value, parseErro
r, ForbidNegativeLengths)); | 254 m_width->setBaseValueAsString(value, ForbidNegativeLengths, parseError); |
| 255 else if (name == SVGNames::heightAttr) | 255 else if (name == SVGNames::heightAttr) |
| 256 setHeightBaseValue(SVGLength::construct(LengthModeHeight, value, parseEr
ror, ForbidNegativeLengths)); | 256 m_height->setBaseValueAsString(value, ForbidNegativeLengths, parseError)
; |
| 257 else if (SVGFitToViewBox::parseAttribute(this, name, value) | 257 else if (SVGFitToViewBox::parseAttribute(this, name, value) |
| 258 || SVGZoomAndPan::parseAttribute(this, name, value)) { | 258 || SVGZoomAndPan::parseAttribute(this, name, value)) { |
| 259 } else | 259 } else |
| 260 SVGGraphicsElement::parseAttribute(name, value); | 260 SVGGraphicsElement::parseAttribute(name, value); |
| 261 | 261 |
| 262 reportAttributeParsingError(parseError, name, value); | 262 reportAttributeParsingError(parseError, name, value); |
| 263 } | 263 } |
| 264 | 264 |
| 265 void SVGSVGElement::svgAttributeChanged(const QualifiedName& attrName) | 265 void SVGSVGElement::svgAttributeChanged(const QualifiedName& attrName) |
| 266 { | 266 { |
| 267 bool updateRelativeLengthsOrViewBox = false; | 267 bool updateRelativeLengthsOrViewBox = false; |
| 268 bool widthChanged = attrName == SVGNames::widthAttr; | 268 bool widthChanged = attrName == SVGNames::widthAttr; |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 { | 371 { |
| 372 if (Frame* frame = document().frame()) | 372 if (Frame* frame = document().frame()) |
| 373 frame->selection().clear(); | 373 frame->selection().clear(); |
| 374 } | 374 } |
| 375 | 375 |
| 376 float SVGSVGElement::createSVGNumber() | 376 float SVGSVGElement::createSVGNumber() |
| 377 { | 377 { |
| 378 return 0.0f; | 378 return 0.0f; |
| 379 } | 379 } |
| 380 | 380 |
| 381 SVGLength SVGSVGElement::createSVGLength() | 381 PassRefPtr<SVGLengthTearOff> SVGSVGElement::createSVGLength() |
| 382 { | 382 { |
| 383 return SVGLength(); | 383 return SVGLengthTearOff::create(SVGLength::create(), 0, PropertyIsNotAnimVal
); |
| 384 } | 384 } |
| 385 | 385 |
| 386 SVGAngle SVGSVGElement::createSVGAngle() | 386 SVGAngle SVGSVGElement::createSVGAngle() |
| 387 { | 387 { |
| 388 return SVGAngle(); | 388 return SVGAngle(); |
| 389 } | 389 } |
| 390 | 390 |
| 391 SVGPoint SVGSVGElement::createSVGPoint() | 391 SVGPoint SVGSVGElement::createSVGPoint() |
| 392 { | 392 { |
| 393 return SVGPoint(); | 393 return SVGPoint(); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 417 { | 417 { |
| 418 AffineTransform viewBoxTransform; | 418 AffineTransform viewBoxTransform; |
| 419 if (!hasEmptyViewBox()) { | 419 if (!hasEmptyViewBox()) { |
| 420 FloatSize size = currentViewportSize(); | 420 FloatSize size = currentViewportSize(); |
| 421 viewBoxTransform = viewBoxToViewTransform(size.width(), size.height()); | 421 viewBoxTransform = viewBoxToViewTransform(size.width(), size.height()); |
| 422 } | 422 } |
| 423 | 423 |
| 424 AffineTransform transform; | 424 AffineTransform transform; |
| 425 if (!isOutermostSVGSVGElement()) { | 425 if (!isOutermostSVGSVGElement()) { |
| 426 SVGLengthContext lengthContext(this); | 426 SVGLengthContext lengthContext(this); |
| 427 transform.translate(xCurrentValue().value(lengthContext), yCurrentValue(
).value(lengthContext)); | 427 transform.translate(m_x->currentValue()->value(lengthContext), m_y->curr
entValue()->value(lengthContext)); |
| 428 } else if (mode == SVGElement::ScreenScope) { | 428 } else if (mode == SVGElement::ScreenScope) { |
| 429 if (RenderObject* renderer = this->renderer()) { | 429 if (RenderObject* renderer = this->renderer()) { |
| 430 FloatPoint location; | 430 FloatPoint location; |
| 431 float zoomFactor = 1; | 431 float zoomFactor = 1; |
| 432 | 432 |
| 433 // At the SVG/HTML boundary (aka RenderSVGRoot), we apply the localT
oBorderBoxTransform | 433 // At the SVG/HTML boundary (aka RenderSVGRoot), we apply the localT
oBorderBoxTransform |
| 434 // to map an element from SVG viewport coordinates to CSS box coordi
nates. | 434 // to map an element from SVG viewport coordinates to CSS box coordi
nates. |
| 435 // RenderSVGRoot's localToAbsolute method expects CSS box coordinate
s. | 435 // RenderSVGRoot's localToAbsolute method expects CSS box coordinate
s. |
| 436 // We also need to adjust for the zoom level factored into CSS coord
inates (bug #96361). | 436 // We also need to adjust for the zoom level factored into CSS coord
inates (bug #96361). |
| 437 if (renderer->isSVGRoot()) { | 437 if (renderer->isSVGRoot()) { |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 void SVGSVGElement::setCurrentTime(float seconds) | 529 void SVGSVGElement::setCurrentTime(float seconds) |
| 530 { | 530 { |
| 531 if (std::isnan(seconds)) | 531 if (std::isnan(seconds)) |
| 532 return; | 532 return; |
| 533 seconds = max(seconds, 0.0f); | 533 seconds = max(seconds, 0.0f); |
| 534 m_timeContainer->setElapsed(seconds); | 534 m_timeContainer->setElapsed(seconds); |
| 535 } | 535 } |
| 536 | 536 |
| 537 bool SVGSVGElement::selfHasRelativeLengths() const | 537 bool SVGSVGElement::selfHasRelativeLengths() const |
| 538 { | 538 { |
| 539 return xCurrentValue().isRelative() | 539 return m_x->currentValue()->isRelative() |
| 540 || yCurrentValue().isRelative() | 540 || m_y->currentValue()->isRelative() |
| 541 || widthCurrentValue().isRelative() | 541 || m_width->currentValue()->isRelative() |
| 542 || heightCurrentValue().isRelative() | 542 || m_height->currentValue()->isRelative() |
| 543 || hasAttribute(SVGNames::viewBoxAttr); | 543 || hasAttribute(SVGNames::viewBoxAttr); |
| 544 } | 544 } |
| 545 | 545 |
| 546 SVGRect SVGSVGElement::currentViewBoxRect() const | 546 SVGRect SVGSVGElement::currentViewBoxRect() const |
| 547 { | 547 { |
| 548 if (m_useCurrentView) | 548 if (m_useCurrentView) |
| 549 return m_viewSpec ? m_viewSpec->viewBoxCurrentValue() : SVGRect(); | 549 return m_viewSpec ? m_viewSpec->viewBoxCurrentValue() : SVGRect(); |
| 550 | 550 |
| 551 FloatRect useViewBox = viewBoxCurrentValue(); | 551 FloatRect useViewBox = viewBoxCurrentValue(); |
| 552 if (!useViewBox.isEmpty()) | 552 if (!useViewBox.isEmpty()) |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 629 // SVG embedded via SVGImage (background-image/border-image/etc) / Inline SV
G. | 629 // SVG embedded via SVGImage (background-image/border-image/etc) / Inline SV
G. |
| 630 if (root->isEmbeddedThroughSVGImage() || document().documentElement() != thi
s) | 630 if (root->isEmbeddedThroughSVGImage() || document().documentElement() != thi
s) |
| 631 return !root->hasReplacedLogicalHeight(); | 631 return !root->hasReplacedLogicalHeight(); |
| 632 | 632 |
| 633 return true; | 633 return true; |
| 634 } | 634 } |
| 635 | 635 |
| 636 Length SVGSVGElement::intrinsicWidth(ConsiderCSSMode mode) const | 636 Length SVGSVGElement::intrinsicWidth(ConsiderCSSMode mode) const |
| 637 { | 637 { |
| 638 if (widthAttributeEstablishesViewport() || mode == IgnoreCSSProperties) { | 638 if (widthAttributeEstablishesViewport() || mode == IgnoreCSSProperties) { |
| 639 if (widthCurrentValue().unitType() == LengthTypePercentage) | 639 if (m_width->currentValue()->unitType() == LengthTypePercentage) |
| 640 return Length(widthCurrentValue().valueAsPercentage() * 100, Percent
); | 640 return Length(m_width->currentValue()->valueAsPercentage() * 100, Pe
rcent); |
| 641 | 641 |
| 642 SVGLengthContext lengthContext(this); | 642 SVGLengthContext lengthContext(this); |
| 643 return Length(widthCurrentValue().value(lengthContext), Fixed); | 643 return Length(m_width->currentValue()->value(lengthContext), Fixed); |
| 644 } | 644 } |
| 645 | 645 |
| 646 ASSERT(renderer()); | 646 ASSERT(renderer()); |
| 647 return renderer()->style()->width(); | 647 return renderer()->style()->width(); |
| 648 } | 648 } |
| 649 | 649 |
| 650 Length SVGSVGElement::intrinsicHeight(ConsiderCSSMode mode) const | 650 Length SVGSVGElement::intrinsicHeight(ConsiderCSSMode mode) const |
| 651 { | 651 { |
| 652 if (heightAttributeEstablishesViewport() || mode == IgnoreCSSProperties) { | 652 if (heightAttributeEstablishesViewport() || mode == IgnoreCSSProperties) { |
| 653 if (heightCurrentValue().unitType() == LengthTypePercentage) | 653 if (m_height->currentValue()->unitType() == LengthTypePercentage) |
| 654 return Length(heightCurrentValue().valueAsPercentage() * 100, Percen
t); | 654 return Length(m_height->currentValue()->valueAsPercentage() * 100, P
ercent); |
| 655 | 655 |
| 656 SVGLengthContext lengthContext(this); | 656 SVGLengthContext lengthContext(this); |
| 657 return Length(heightCurrentValue().value(lengthContext), Fixed); | 657 return Length(m_height->currentValue()->value(lengthContext), Fixed); |
| 658 } | 658 } |
| 659 | 659 |
| 660 ASSERT(renderer()); | 660 ASSERT(renderer()); |
| 661 return renderer()->style()->height(); | 661 return renderer()->style()->height(); |
| 662 } | 662 } |
| 663 | 663 |
| 664 AffineTransform SVGSVGElement::viewBoxToViewTransform(float viewWidth, float vie
wHeight) const | 664 AffineTransform SVGSVGElement::viewBoxToViewTransform(float viewWidth, float vie
wHeight) const |
| 665 { | 665 { |
| 666 if (!m_useCurrentView || !m_viewSpec) | 666 if (!m_useCurrentView || !m_viewSpec) |
| 667 return SVGFitToViewBox::viewBoxToViewTransform(currentViewBoxRect(), pre
serveAspectRatioCurrentValue(), viewWidth, viewHeight); | 667 return SVGFitToViewBox::viewBoxToViewTransform(currentViewBoxRect(), pre
serveAspectRatioCurrentValue(), viewWidth, viewHeight); |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 766 continue; | 766 continue; |
| 767 | 767 |
| 768 Element* element = toElement(node); | 768 Element* element = toElement(node); |
| 769 if (element->getIdAttribute() == id) | 769 if (element->getIdAttribute() == id) |
| 770 return element; | 770 return element; |
| 771 } | 771 } |
| 772 return 0; | 772 return 0; |
| 773 } | 773 } |
| 774 | 774 |
| 775 } | 775 } |
| OLD | NEW |