From db29271a5a528371816f99f9d06e0cebd16f0e20 Mon Sep 17 00:00:00 2001 From: benfry Date: Fri, 25 Jun 2010 11:53:00 +0000 Subject: [PATCH] more Linux PDF fixes from Matthias Breuer --- pdf/src/processing/pdf/PGraphicsPDF.java | 85 +++++++++++++----------- 1 file changed, 46 insertions(+), 39 deletions(-) diff --git a/pdf/src/processing/pdf/PGraphicsPDF.java b/pdf/src/processing/pdf/PGraphicsPDF.java index 25c238eb1..c91eba581 100644 --- a/pdf/src/processing/pdf/PGraphicsPDF.java +++ b/pdf/src/processing/pdf/PGraphicsPDF.java @@ -27,7 +27,7 @@ import java.util.*; import com.lowagie.text.*; import com.lowagie.text.pdf.*; -// Tried iText 5, but it was too slow +// Tried iText 5, but it was too slow //import com.itextpdf.text.*; //import com.itextpdf.text.pdf.*; @@ -36,15 +36,15 @@ import processing.core.*; /** * Thin wrapper for the iText PDF library, that handles writing PDF files. - * The majority of the work in this library is done by + * The majority of the work in this library is done by * iText. *

* This is currently using iText 2.1.7. *

- * The issue is that versions from the 5.x series were slow to handle lots of - * fonts with the DefaultFontMapper. 2.x seemed a little slower than 1.x, - * but 5.x took up to 10 times the time to load, meaning a lag of several - * seconds when starting sketches on a machine that had a good handful of + * The issue is that versions from the 5.x series were slow to handle lots of + * fonts with the DefaultFontMapper. 2.x seemed a little slower than 1.x, + * but 5.x took up to 10 times the time to load, meaning a lag of several + * seconds when starting sketches on a machine that had a good handful of * fonts installed. (Like, say, anyone in our target audience. Or me.) */ public class PGraphicsPDF extends PGraphicsJava2D { @@ -52,7 +52,7 @@ public class PGraphicsPDF extends PGraphicsJava2D { protected File file; /** OutputStream being written to, if using an OutputStream. */ protected OutputStream output; - + protected Document document; protected PdfWriter writer; protected PdfContentByte content; @@ -61,7 +61,7 @@ public class PGraphicsPDF extends PGraphicsJava2D { static protected DefaultFontMapper mapper; static protected String fontList[]; - + public PGraphicsPDF() { } @@ -76,16 +76,16 @@ public class PGraphicsPDF extends PGraphicsJava2D { "for the location of the output file."); } } - - + + /** * Set the library to write to an output stream instead of a file. */ public void setOutput(OutputStream output) { this.output = output; } - - + + /** * all the init stuff happens in here, in case someone calls size() * along the way and wants to hork things up. @@ -127,13 +127,13 @@ public class PGraphicsPDF extends PGraphicsJava2D { } // System.out.println("beginDraw " + (System.currentTimeMillis() - t0)); super.beginDraw(); - + // Also need to push the matrix since the matrix doesn't reset on each run // http://dev.processing.org/bugs/show_bug.cgi?id=1227 pushMatrix(); } - - + + static protected DefaultFontMapper getMapper() { if (mapper == null) { // long t = System.currentTimeMillis(); @@ -184,41 +184,48 @@ public class PGraphicsPDF extends PGraphicsJava2D { break; } } - - } else if (PApplet.platform == PConstants.WINDOWS) { - File folder = new File("/usr/share/fonts/"); - if (folder.exists()) { - mapper.insertDirectory("/usr/share/fonts"); - traverseDir(mapper, folder); - } + + } else if (PApplet.platform == PConstants.LINUX) { + checkDir("/usr/share/fonts/", mapper); + checkDir("/usr/local/share/fonts/", mapper); + checkDir(System.getProperty("user.home") + "/.fonts", mapper); } // System.out.println("mapping " + (System.currentTimeMillis() - t)); } return mapper; } + + + static protected void checkDir(String path, DefaultFontMapper mapper) { + File folder = new File(path); + if (folder.exists()) { + mapper.insertDirectory(path); + traverseDir(folder, mapper); + } + } /** - * Recursive walk to get all subdirectories for font fun. + * Recursive walk to get all subdirectories for font fun. * Patch submitted by Matthias Breuer. * (Bug 1566) */ - static protected void traverseDir(DefaultFontMapper mapper, File folder) { + static protected void traverseDir(File folder, DefaultFontMapper mapper) { File[] files = folder.listFiles(); for (int i = 0; i < files.length; i++) { if (files[i].isDirectory()) { mapper.insertDirectory(files[i].getPath()); - traverseDir(mapper, new File(files[i].getPath())); + traverseDir(new File(files[i].getPath()), mapper); } } } - - + + public void endDraw() { // Also need to pop the matrix since the matrix doesn't reset on each run // http://dev.processing.org/bugs/show_bug.cgi?id=1227 popMatrix(); - + // This needs to be overridden so that the endDraw() from PGraphicsJava2D // is not inherited (it calls loadPixels). // http://dev.processing.org/bugs/show_bug.cgi?id=1169 @@ -391,9 +398,9 @@ public class PGraphicsPDF extends PGraphicsJava2D { public void textFont(PFont which) { super.textFont(which); checkFont(); - // Make sure a native version of the font is available. + // Make sure a native version of the font is available. // if (textFont.getFont() == null) { -// throw new RuntimeException("Use createFont() instead of loadFont() " + +// throw new RuntimeException("Use createFont() instead of loadFont() " + // "when drawing text using the PDF library."); // } // Make sure that this is a font that the PDF library can deal with. @@ -402,8 +409,8 @@ public class PGraphicsPDF extends PGraphicsJava2D { // throw new RuntimeException("The font “" + which.getName() + "” cannot be used with PDF Export."); // } } - - + + /** * Change the textMode() to either SHAPE or MODEL. *
@@ -431,17 +438,17 @@ public class PGraphicsPDF extends PGraphicsJava2D { } } - + protected void textLineImpl(char buffer[], int start, int stop, float x, float y) { checkFont(); super.textLineImpl(buffer, start, stop, x, y); } - + ////////////////////////////////////////////////////////////// - + public void loadPixels() { nope("loadPixels"); } @@ -573,17 +580,17 @@ public class PGraphicsPDF extends PGraphicsJava2D { protected void checkFont() { Font awtFont = textFont.getFont(); if (awtFont == null) { // always need a native font or reference to it - throw new RuntimeException("Use createFont() instead of loadFont() " + + throw new RuntimeException("Use createFont() instead of loadFont() " + "when drawing text using the PDF library."); } else if (textMode != SHAPE) { - if (textFont.isStream()) { + if (textFont.isStream()) { throw new RuntimeException("Use textMode(SHAPE) with when loading " + ".ttf and .otf files with createFont()."); } else if (mapper.getAliases().get(textFont.getName()) == null) { //System.out.println("alias for " + name + " = " + mapper.getAliases().get(name)); System.err.println("Use PGraphicsPDF.listFonts() to get a list of " + "fonts that can be used with PDF."); - throw new RuntimeException("The font “" + textFont.getName() + "” " + + throw new RuntimeException("The font “" + textFont.getName() + "” " + "cannot be used with PDF Export."); } } @@ -613,7 +620,7 @@ public class PGraphicsPDF extends PGraphicsJava2D { // fontList[count++] = (String) entry.getKey(); // } fontList = PApplet.sort(fontList); - } + } return fontList; }