// Copyright 2001-2005 freehep package org.xmind.org.freehep.graphicsio.pdf; import java.awt.Shape; import java.awt.font.FontRenderContext; import java.awt.font.GlyphMetrics; import java.awt.geom.Rectangle2D; import java.io.IOException; /** * @author Simon Fischer * @author Jason Wong */ @SuppressWarnings("nls") public class PDFFontEmbedderType3 extends PDFFontEmbedder { public PDFFontEmbedderType3(FontRenderContext context, PDFWriter pdf, String reference, PDFRedundanceTracker tracker) { super(context, pdf, reference, tracker); } protected String getSubtype() { return "Type3"; } protected void addAdditionalEntries(PDFDictionary fontDict) throws IOException { Rectangle2D boundingBox = getFontBBox(); double llx = boundingBox.getX(); double lly = boundingBox.getY(); double urx = boundingBox.getX() + boundingBox.getWidth(); double ury = boundingBox.getY() + boundingBox.getHeight(); fontDict.entry("FontBBox", new double[] { llx, lly, urx, ury }); fontDict.entry("FontMatrix", new double[] { 1 / FONT_SIZE, 0, 0, 1 / FONT_SIZE, 0, 0 }); fontDict.entry("CharProcs", pdf.ref(getReference() + "CharProcs")); PDFDictionary resources = fontDict.openDictionary("Resources"); resources.entry("ProcSet", new Object[] { pdf.name("PDF") }); fontDict.close(resources); } protected void addAdditionalInitDicts() throws IOException { // CharProcs PDFDictionary charProcs = pdf.openDictionary(getReference() + "CharProcs"); // boolean undefined = false; for (int i = 0; i < 256; i++) { String charName = getEncodingTable().toName(i); if (charName != null) { charProcs.entry(charName, pdf.ref(createCharacterReference(charName))); } else { // undefined = true; } } // if (undefined) charProcs.entry(NOTDEF, pdf.ref(createCharacterReference(NOTDEF))); pdf.close(charProcs); } protected void writeGlyph(String characterName, Shape glyph, GlyphMetrics glyphMetrics) throws IOException { PDFStream glyphStream = pdf.openStream( createCharacterReference(characterName), new String[] { "Flate", "ASCII85" }); Rectangle2D bounds = glyphMetrics != null ? glyphMetrics.getBounds2D() : glyph.getBounds2D(); double advance = glyphMetrics != null ? glyphMetrics.getAdvance() : getUndefinedWidth(); glyphStream.glyph(advance, 0, bounds.getX(), bounds.getY(), bounds.getX() + bounds.getWidth(), bounds.getY() + bounds.getHeight()); boolean windingRule = glyphStream.drawPath(glyph); if (windingRule) { glyphStream.fillEvenOdd(); } else { glyphStream.fill(); } pdf.close(glyphStream); } }