public static List getFontFaces(Document doc, BridgeContext ctx) {
    // check fontFamilyMap to see if we have already created an
    // FontFamily that matches
    Map fontFamilyMap = ctx.getFontFamilyMap();
    List ret = (List) fontFamilyMap.get(doc);
    if (ret != null) return ret;

    ret = new LinkedList();

    NodeList fontFaceElements = doc.getElementsByTagNameNS(SVG_NAMESPACE_URI, SVG_FONT_FACE_TAG);

    SVGFontFaceElementBridge fontFaceBridge;
    fontFaceBridge = (SVGFontFaceElementBridge) ctx.getBridge(SVG_NAMESPACE_URI, SVG_FONT_FACE_TAG);

    for (int i = 0; i < fontFaceElements.getLength(); i++) {
      Element fontFaceElement = (Element) fontFaceElements.item(i);
      ret.add(fontFaceBridge.createFontFace(ctx, fontFaceElement));
    }

    CSSEngine engine = ((SVGOMDocument) doc).getCSSEngine();
    List sms = engine.getFontFaces();
    Iterator iter = sms.iterator();
    while (iter.hasNext()) {
      FontFaceRule ffr = (FontFaceRule) iter.next();
      ret.add(CSSFontFace.createCSSFontFace(engine, ffr));
    }
    return ret;
  }
 /** Clears the view CSS. */
 public void clearViewCSS() {
   defaultView = null;
   if (cssEngine != null) {
     cssEngine.dispose();
   }
   cssEngine = null;
 }
 protected void initCSSPropertyIndexes(Element e) {
   CSSEngine eng = CSSUtilities.getCSSEngine(e);
   marginTopIndex = eng.getPropertyIndex(SVG12CSSConstants.CSS_MARGIN_TOP_PROPERTY);
   marginRightIndex = eng.getPropertyIndex(SVG12CSSConstants.CSS_MARGIN_RIGHT_PROPERTY);
   marginBottomIndex = eng.getPropertyIndex(SVG12CSSConstants.CSS_MARGIN_BOTTOM_PROPERTY);
   marginLeftIndex = eng.getPropertyIndex(SVG12CSSConstants.CSS_MARGIN_LEFT_PROPERTY);
   indentIndex = eng.getPropertyIndex(SVG12CSSConstants.CSS_INDENT_PROPERTY);
   textAlignIndex = eng.getPropertyIndex(SVG12CSSConstants.CSS_TEXT_ALIGN_PROPERTY);
   lineHeightIndex = eng.getPropertyIndex(SVG12CSSConstants.CSS_LINE_HEIGHT_PROPERTY);
 }
  /**
   * Implements {@link
   * ValueManager#computeValue(CSSStylableElement,String,CSSEngine,int,StyleMap,Value)}.
   */
  public Value computeValue(
      CSSStylableElement elt, String pseudo, CSSEngine engine, int idx, StyleMap sm, Value value) {
    if (value.getPrimitiveType() == CSSPrimitiveValue.CSS_PERCENTAGE) {
      sm.putLineHeightRelative(idx, true);

      int fsi = engine.getLineHeightIndex();
      CSSStylableElement parent;
      parent = (CSSStylableElement) elt.getParentNode();
      if (parent == null) {
        // Hmmm somthing pretty odd - can't happen accordint to spec,
        // should always have text parent.
        // http://www.w3.org/TR/SVG11/text.html#BaselineShiftProperty
        parent = elt;
      }
      Value fs = engine.getComputedStyle(parent, pseudo, fsi);
      float fsv = fs.getFloatValue();
      float v = value.getFloatValue();
      return new FloatValue(CSSPrimitiveValue.CSS_NUMBER, (fsv * v) / 100f);
    }
    return super.computeValue(elt, pseudo, engine, idx, sm, value);
  }