diff options
Diffstat (limited to 'src/codegen/t1font-file.xsl')
-rw-r--r-- | src/codegen/t1font-file.xsl | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/codegen/t1font-file.xsl b/src/codegen/t1font-file.xsl index 3e7eed0e8..27896d898 100644 --- a/src/codegen/t1font-file.xsl +++ b/src/codegen/t1font-file.xsl @@ -21,6 +21,13 @@ package org.apache.fop.render.pdf.fonts; import org.apache.fop.render.pdf.Font; import org.apache.fop.layout.FontDescriptor; +import org.apache.fop.fonts.Glyphs; +import org.apache.fop.pdf.PDFStream; +import org.apache.fop.pdf.PDFT1Stream; +import java.io.InputStream; +import java.io.FileInputStream; +import java.io.BufferedInputStream; +import java.util.Hashtable; public class <xsl:value-of select="class-name"/> extends Font implements FontDescriptor { private final static String fontName = "<xsl:value-of select="font-name"/>"; @@ -35,17 +42,93 @@ public class <xsl:value-of select="class-name"/> extends Font implements FontDes <xsl:value-of select="bbox/right"/>, <xsl:value-of select="bbox/top"/> }; + private final static String embedFileName = <xsl:value-of select="embedFile"/>; + private final static String embedResourceName = <xsl:value-of select="embedResource"/>; + private static PDFT1Stream embeddedFont=null; private final static int flags = <xsl:value-of select="flags"/>; private final static int stemV = <xsl:value-of select="stemv"/>; private final static int italicAngle = <xsl:value-of select="italicangle"/>; private final static int firstChar = <xsl:value-of select="first-char"/>; private final static int lastChar = <xsl:value-of select="last-char"/>; private final static int[] width; + private final static Hashtable kerning=new Hashtable(); static { width = new int[256]; <xsl:for-each select="widths/char"><xsl:variable name="char-name" select="@name"/><xsl:variable name="char-num" select="document('charlist.xml')/font-mappings/map[@adobe-name=$char-name]/@win-ansi"/><xsl:if test="$char-num!='-1'"> width[<xsl:value-of select="$char-num"/>] = <xsl:value-of select="@width"/>; </xsl:if></xsl:for-each> + + Hashtable tmptable; +<xsl:for-each select="kerning"> +<xsl:variable name="kpx1-name" select="@kpx1"/> + tmptable=new Hashtable();<xsl:for-each select="pair"><xsl:variable name="kpx2-name" select="@kpx2"/><xsl:variable name="kern-name" select="@kern"/> + tmptable.put(Glyphs.glyphToString("<xsl:value-of select="$kpx2-name"/>"), new Integer(<xsl:value-of select="$kern-name"/>));</xsl:for-each> + kerning.put(Glyphs.glyphToString("<xsl:value-of select="$kpx1-name"/>"), tmptable); +</xsl:for-each> + } + + public final boolean hasKerningInfo() {return kerning.isEmpty();} + public final java.util.Hashtable getKerningInfo() {return kerning;} + public byte getSubType() {return org.apache.fop.pdf.PDFFont.TYPE1;} + + public boolean isEmbeddable() { + return (embedFileName==null && embedResourceName==null) ? false : true; + } + + public PDFStream getFontFile(int i) { + InputStream instream=null; + + // Get file first + if (embedFileName!=null) + try { + instream=new FileInputStream(embedFileName); + } catch (Exception e) { + System.out.println("Failed to embed fontfile: "+embedFileName); + } + + // Get resource + if (instream==null && embedResourceName!=null) + try { + instream=new BufferedInputStream(this.getClass().getResourceAsStream(embedResourceName)); + } catch (Exception e) { + System.out.println("Failed to embed fontresource: "+embedResourceName); + } + + if (instream==null) + return (PDFStream)null; + + // Read fontdata + byte[] file = new byte[128000]; + int fsize = 0; + + try { + int l = instream.read(file, 0, 128000); + fsize += l; + + if (l==128000) { + // More to read - needs to extend + byte[] tmpbuf; + + while (l > 0) { + tmpbuf = new byte[file.length + 64000]; + System.arraycopy(file, 0, tmpbuf, 0, file.length); + l=instream.read(tmpbuf, file.length, 64000); + fsize += l; + file = tmpbuf; + + if (l < 64000) // whole file read. No need to loop again + l=0; + } + } + + embeddedFont=new PDFT1Stream(i, fsize); + embeddedFont.addFilter("flate"); + embeddedFont.addFilter("ascii-85"); + embeddedFont.setData(file, fsize); + instream.close(); + } catch (Exception e) {} + + return (PDFStream) embeddedFont; } public String encoding() { @@ -56,6 +139,18 @@ public class <xsl:value-of select="class-name"/> extends Font implements FontDes return fontName; } + public int getAscender() { + return ascender; + } + + public int getCapHeight() { + return capHeight; + } + + public int getDescender() { + return descender; + } + public int getAscender(int size) { return size * ascender; } |