void writeRenderResources(TextStream& ts, Node* parent) { ASSERT(parent); Node* node = parent; do { if (!node->isSVGElement()) continue; SVGElement* svgElement = static_cast<SVGElement*>(node); if (!svgElement->isStyled()) continue; SVGStyledElement* styled = static_cast<SVGStyledElement*>(svgElement); RefPtr<SVGResource> resource(styled->canvasResource()); if (!resource) continue; String elementId = svgElement->getAttribute(svgElement->idAttributeName()); // FIXME: These names are lies! if (resource->isPaintServer()) { RefPtr<SVGPaintServer> paintServer = WTF::static_pointer_cast<SVGPaintServer>(resource); ts << "KRenderingPaintServer {id=\"" << elementId << "\" " << *paintServer << "}" << "\n"; } else ts << "KCanvasResource {id=\"" << elementId << "\" " << *resource << "}" << "\n"; } while ((node = node->traverseNextNode(parent))); }
static void transferUseWidthAndHeightIfNeeded( const SVGUseElement& use, SVGElement& shadowElement, const SVGElement& originalElement) { DEFINE_STATIC_LOCAL(const AtomicString, hundredPercentString, ("100%")); // Use |originalElement| for checking the element type, because we will // have replaced a <symbol> with an <svg> in the instance tree. if (isSVGSymbolElement(originalElement)) { // Spec (<use> on <symbol>): This generated 'svg' will always have // explicit values for attributes width and height. If attributes // width and/or height are provided on the 'use' element, then these // attributes will be transferred to the generated 'svg'. If attributes // width and/or height are not specified, the generated 'svg' element // will use values of 100% for these attributes. shadowElement.setAttribute( SVGNames::widthAttr, use.width()->isSpecified() ? AtomicString(use.width()->currentValue()->valueAsString()) : hundredPercentString); shadowElement.setAttribute( SVGNames::heightAttr, use.height()->isSpecified() ? AtomicString(use.height()->currentValue()->valueAsString()) : hundredPercentString); } else if (isSVGSVGElement(originalElement)) { // Spec (<use> on <svg>): If attributes width and/or height are // provided on the 'use' element, then these values will override the // corresponding attributes on the 'svg' in the generated tree. shadowElement.setAttribute( SVGNames::widthAttr, use.width()->isSpecified() ? AtomicString(use.width()->currentValue()->valueAsString()) : originalElement.getAttribute(SVGNames::widthAttr)); shadowElement.setAttribute( SVGNames::heightAttr, use.height()->isSpecified() ? AtomicString(use.height()->currentValue()->valueAsString()) : originalElement.getAttribute(SVGNames::heightAttr)); } }
void transferUseWidthAndHeightIfNeeded(const SVGUseElement& use, SVGElement* shadowElement, const SVGElement& originalElement) { DEFINE_STATIC_LOCAL(const AtomicString, hundredPercentString, ("100%", AtomicString::ConstructFromLiteral)); ASSERT(shadowElement); if (isSVGSymbolElement(*shadowElement)) { // Spec (<use> on <symbol>): This generated 'svg' will always have explicit values for attributes width and height. // If attributes width and/or height are provided on the 'use' element, then these attributes // will be transferred to the generated 'svg'. If attributes width and/or height are not specified, // the generated 'svg' element will use values of 100% for these attributes. shadowElement->setAttribute(SVGNames::widthAttr, use.width()->isSpecified() ? AtomicString(use.width()->currentValue()->valueAsString()) : hundredPercentString); shadowElement->setAttribute(SVGNames::heightAttr, use.height()->isSpecified() ? AtomicString(use.height()->currentValue()->valueAsString()) : hundredPercentString); } else if (isSVGSVGElement(*shadowElement)) { // Spec (<use> on <svg>): If attributes width and/or height are provided on the 'use' element, then these // values will override the corresponding attributes on the 'svg' in the generated tree. if (use.width()->isSpecified()) shadowElement->setAttribute(SVGNames::widthAttr, AtomicString(use.width()->currentValue()->valueAsString())); else shadowElement->setAttribute(SVGNames::widthAttr, originalElement.getAttribute(SVGNames::widthAttr)); if (use.height()->isSpecified()) shadowElement->setAttribute(SVGNames::heightAttr, AtomicString(use.height()->currentValue()->valueAsString())); else shadowElement->setAttribute(SVGNames::heightAttr, originalElement.getAttribute(SVGNames::heightAttr)); } }
String SMILTimeContainer::baseValueFor(ElementAttributePair key) { // FIXME: We wouldn't need to do this if we were keeping base values around properly in DOM. // Currently animation overwrites them so we need to save them somewhere. BaseValueMap::iterator it = m_savedBaseValues.find(key); if (it != m_savedBaseValues.end()) return it->second; SVGElement* targetElement = key.first; QualifiedName attributeName = key.second; ASSERT(targetElement); ASSERT(attributeName != anyQName()); String baseValue; if (SVGAnimationElement::isTargetAttributeCSSProperty(targetElement, attributeName)) baseValue = computedStyle(targetElement)->getPropertyValue(cssPropertyID(attributeName.localName())); else baseValue = targetElement->getAttribute(attributeName); m_savedBaseValues.add(key, baseValue); return baseValue; }
void writeRenderResources(TextStream &ts, Node *parent) { ASSERT(parent); Node *node = parent; do { if (!node->isSVGElement()) continue; SVGElement *svgElement = static_cast<SVGElement *>(node); if (!svgElement->isStyled()) continue; SVGStyledElement *styled = static_cast<SVGStyledElement *>(svgElement); KCanvasResource *resource = styled->canvasResource(); if (!resource) continue; DeprecatedString elementId = svgElement->getAttribute(HTMLNames::idAttr).deprecatedString(); if (resource->isPaintServer()) ts << "KRenderingPaintServer {id=\"" << elementId << "\" " << *static_cast<KRenderingPaintServer *>(resource) << "}" << endl; else ts << "KCanvasResource {id=\"" << elementId << "\" " << *resource << "}" << endl; } while ((node = node->traverseNextNode(parent))); }
void SVGUseElement::transferSizeAttributesToTargetClone(SVGElement& shadowElement) const { // FIXME: The check for valueInSpecifiedUnits being non-zero below is a workaround for the fact // that we currently have no good way to tell whether a particular animatable attribute is a value // indicating it was unspecified, or specified but could not be parsed. Would be nice to fix that some day. if (is<SVGSymbolElement>(shadowElement)) { // Spec (<use> on <symbol>): This generated 'svg' will always have explicit values for attributes width and height. // If attributes width and/or height are provided on the 'use' element, then these attributes // will be transferred to the generated 'svg'. If attributes width and/or height are not specified, // the generated 'svg' element will use values of 100% for these attributes. shadowElement.setAttribute(SVGNames::widthAttr, (widthIsValid() && width().valueInSpecifiedUnits()) ? AtomicString(width().valueAsString()) : "100%"); shadowElement.setAttribute(SVGNames::heightAttr, (heightIsValid() && height().valueInSpecifiedUnits()) ? AtomicString(height().valueAsString()) : "100%"); } else if (is<SVGSVGElement>(shadowElement)) { // Spec (<use> on <svg>): If attributes width and/or height are provided on the 'use' element, then these // values will override the corresponding attributes on the 'svg' in the generated tree. SVGElement* correspondingElement = shadowElement.correspondingElement(); shadowElement.setAttribute(SVGNames::widthAttr, (widthIsValid() && width().valueInSpecifiedUnits()) ? AtomicString(width().valueAsString()) : (correspondingElement ? correspondingElement->getAttribute(SVGNames::widthAttr) : nullAtom)); shadowElement.setAttribute(SVGNames::heightAttr, (heightIsValid() && height().valueInSpecifiedUnits()) ? AtomicString(height().valueAsString()) : (correspondingElement ? correspondingElement->getAttribute(SVGNames::heightAttr) : nullAtom)); } }