/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.bridge; import org.apache.batik.gvt.text.ArabicTextHandler; import org.apache.batik.gvt.font.GVTFontFace; import org.w3c.dom.Element; import org.w3c.dom.NodeList; /** * Bridge class for the <font> element. * * @author <a href="mailto:bella.robinson@cmis.csiro.au">Bella Robinson</a> * @version $Id$ */ public class SVGFontElementBridge extends AbstractSVGBridge { /** * Constructs a new bridge for the <font> element. */ public SVGFontElementBridge() { } /** * Returns 'font'. */ public String getLocalName() { return SVG_FONT_TAG; } /** * Constructs a new SVGGVTFont that represents the specified <font> element * at the requested size. * * @param ctx The current bridge context. * @param fontElement The font element to base the SVGGVTFont construction on. * @param textElement The text element that will use the new font. * @param size The size of the new font. * @param fontFace The font face object that contains the font attributes. * * @return The new SVGGVTFont. */ public SVGGVTFont createFont(BridgeContext ctx, Element fontElement, Element textElement, float size, GVTFontFace fontFace) { // construct a list of glyph codes that this font can display and // a list of the glyph elements NodeList glyphElements = fontElement.getElementsByTagNameNS (SVG_NAMESPACE_URI, SVG_GLYPH_TAG); int numGlyphs = glyphElements.getLength(); String[] glyphCodes = new String[numGlyphs]; String[] glyphNames = new String[numGlyphs]; String[] glyphLangs = new String[numGlyphs]; String[] glyphOrientations = new String[numGlyphs]; String[] glyphForms = new String[numGlyphs]; Element[] glyphElementArray = new Element[numGlyphs]; for (int i = 0; i < numGlyphs; i++) { Element glyphElement = (Element)glyphElements.item(i); glyphCodes[i] = glyphElement.getAttributeNS(null, SVG_UNICODE_ATTRIBUTE); if (glyphCodes[i].length() > 1) { // ligature, may need to reverse if arabic so that it is in visual order if (ArabicTextHandler.arabicChar(glyphCodes[i].charAt(0))) { glyphCodes[i] = (new StringBuffer(glyphCodes[i])).reverse().toString(); } } glyphNames[i] = glyphElement.getAttributeNS(null, SVG_GLYPH_NAME_ATTRIBUTE); glyphLangs[i] = glyphElement.getAttributeNS(null, SVG_LANG_ATTRIBUTE); glyphOrientations[i] = glyphElement.getAttributeNS(null, SVG_ORIENTATION_ATTRIBUTE); glyphForms[i] = glyphElement.getAttributeNS(null, SVG_ARABIC_FORM_ATTRIBUTE); glyphElementArray[i] = glyphElement; } // get the missing glyph element NodeList missingGlyphElements = fontElement.getElementsByTagNameNS (SVG_NAMESPACE_URI, SVG_MISSING_GLYPH_TAG); Element missingGlyphElement = null; if (missingGlyphElements.getLength() > 0) { missingGlyphElement = (Element)missingGlyphElements.item(0); } // get the hkern elements NodeList hkernElements = fontElement.getElementsByTagNameNS (SVG_NAMESPACE_URI, SVG_HKERN_TAG); Element[] hkernElementArray = new Element[hkernElements.getLength()]; for (int i = 0; i < hkernElementArray.length; i++) { Element hkernElement = (Element)hkernElements.item(i); hkernElementArray[i] = hkernElement; } // get the vkern elements NodeList vkernElements = fontElement.getElementsByTagNameNS (SVG_NAMESPACE_URI, SVG_VKERN_TAG); Element[] vkernElementArray = new Element[vkernElements.getLength()]; for (int i = 0; i < vkernElementArray.length; i++) { Element vkernElement = (Element)vkernElements.item(i); vkernElementArray[i] = vkernElement; } // return the new SVGGVTFont return new SVGGVTFont (size, fontFace, glyphCodes, glyphNames, glyphLangs, glyphOrientations, glyphForms, ctx, glyphElementArray, missingGlyphElement, hkernElementArray, vkernElementArray, textElement); } }