void SVGFontFaceElement::rebuildFontFace() { ASSERT(inDocument()); // we currently ignore all but the first src element, alternatively we could concat them SVGFontFaceSrcElement* srcElement = 0; SVGDefinitionSrcElement* definitionSrc = 0; for (Node* child = firstChild(); child; child = child->nextSibling()) { if (child->hasTagName(font_face_srcTag) && !srcElement) srcElement = static_cast<SVGFontFaceSrcElement*>(child); else if (child->hasTagName(definition_srcTag) && !definitionSrc) definitionSrc = static_cast<SVGDefinitionSrcElement*>(child); } #if 0 // @font-face (CSSFontFace) does not yet support definition-src, as soon as it does this code should do the trick! if (definitionSrc) m_styleDeclaration->setProperty(CSSPropertyDefinitionSrc, definitionSrc->getAttribute(XLinkNames::hrefAttr), false); #endif bool describesParentFont = parentNode()->hasTagName(fontTag); RefPtr<CSSValueList> list; if (describesParentFont) { m_fontElement = static_cast<SVGFontElement*>(parentNode()); list = CSSValueList::createCommaSeparated(); list->append(CSSFontFaceSrcValue::createLocal(fontFamily())); } else { m_fontElement = 0; if (srcElement) list = srcElement->srcValue(); } if (!list) return; // Parse in-memory CSS rules CSSProperty srcProperty(CSSPropertySrc, list); const CSSProperty* srcPropertyRef = &srcProperty; m_styleDeclaration->addParsedProperties(&srcPropertyRef, 1); if (describesParentFont) { // Traverse parsed CSS values and associate CSSFontFaceSrcValue elements with ourselves. RefPtr<CSSValue> src = m_styleDeclaration->getPropertyCSSValue(CSSPropertySrc); CSSValueList* srcList = static_cast<CSSValueList*>(src.get()); unsigned srcLength = srcList ? srcList->length() : 0; for (unsigned i = 0; i < srcLength; i++) { if (CSSFontFaceSrcValue* item = static_cast<CSSFontFaceSrcValue*>(srcList->itemWithoutBoundsCheck(i))) item->setSVGFontFaceElement(this); } } document()->updateStyleSelector(); }
void SVGFontFaceElement::rebuildFontFace() { if (!inDocument()) { ASSERT(!m_fontElement); return; } // we currently ignore all but the first src element, alternatively we could concat them SVGFontFaceSrcElement* srcElement = 0; for (Node* child = firstChild(); child && !srcElement; child = child->nextSibling()) { if (child->hasTagName(font_face_srcTag)) srcElement = static_cast<SVGFontFaceSrcElement*>(child); } bool describesParentFont = parentNode()->hasTagName(SVGNames::fontTag); RefPtr<CSSValueList> list; if (describesParentFont) { m_fontElement = static_cast<SVGFontElement*>(parentNode()); list = CSSValueList::createCommaSeparated(); list->append(CSSFontFaceSrcValue::createLocal(fontFamily())); } else { m_fontElement = 0; if (srcElement) list = srcElement->srcValue(); } if (!list || !list->length()) return; // Parse in-memory CSS rules m_fontFaceRule->mutableProperties()->addParsedProperty(CSSProperty(CSSPropertySrc, list)); if (describesParentFont) { // Traverse parsed CSS values and associate CSSFontFaceSrcValue elements with ourselves. RefPtr<CSSValue> src = m_fontFaceRule->properties()->getPropertyCSSValue(CSSPropertySrc); CSSValueList* srcList = static_cast<CSSValueList*>(src.get()); unsigned srcLength = srcList ? srcList->length() : 0; for (unsigned i = 0; i < srcLength; i++) { if (CSSFontFaceSrcValue* item = static_cast<CSSFontFaceSrcValue*>(srcList->itemWithoutBoundsCheck(i))) item->setSVGFontFaceElement(this); } } document()->styleResolverChanged(DeferRecalcStyle); }