You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2014/08/31 23:11:10 UTC

svn commit: r1621640 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: cos/COSName.java pdmodel/graphics/image/PDImage.java pdmodel/graphics/image/PDImageXObject.java pdmodel/graphics/image/PDInlineImage.java rendering/PageDrawer.java

Author: jahewson
Date: Sun Aug 31 21:11:10 2014
New Revision: 1621640

URL: http://svn.apache.org/r1621640
Log:
PDFBOX-2302: Make better use of RenderingHints

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImage.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImage.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java?rev=1621640&r1=1621639&r2=1621640&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java Sun Aug 31 21:11:10 2014
@@ -260,6 +260,7 @@ public final class COSName extends COSBa
     public static final COSName INDEX = new COSName("Index");
     public static final COSName INDEXED = new COSName("Indexed");
     public static final COSName INFO = new COSName("Info");
+    public static final COSName INTERPOLATE = new COSName("Interpolate");
     public static final COSName ITALIC_ANGLE = new COSName("ItalicAngle");
     // J
     public static final COSName JAVA_SCRIPT = new COSName("JavaScript");

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImage.java?rev=1621640&r1=1621639&r2=1621640&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImage.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImage.java Sun Aug 31 21:11:10 2014
@@ -27,6 +27,7 @@ import org.apache.pdfbox.pdmodel.graphic
 
 /**
  * An image in a PDF document.
+ *
  * @author John Hewson
  */
 public interface PDImage extends COSObjectable
@@ -49,14 +50,12 @@ public interface PDImage extends COSObje
 
     /**
      * Returns a stream containing this image's data.
-     * @return stream containing the image data
      * @throws IOException if the
      */
     public PDStream getStream() throws IOException;
 
     /**
      * Returns true if the image is a stencil mask.
-     * @return true if the image is a stencil mask.
      */
     public boolean isStencil();
 
@@ -69,7 +68,6 @@ public interface PDImage extends COSObje
 
     /**
      * Returns bits per component of this image, or -1 if one has not been set.
-     * @return The number of bits per component.
      */
     public int getBitsPerComponent();
 
@@ -80,8 +78,7 @@ public interface PDImage extends COSObje
     public void setBitsPerComponent(int bitsPerComponent);
 
     /**
-     * Returns the image's color space
-     * @return The color space for this image.
+     * Returns the image's color space.
      * @throws IOException If there is an error getting the color space.
      */
     public PDColorSpace getColorSpace() throws IOException;
@@ -94,7 +91,6 @@ public interface PDImage extends COSObje
 
     /**
      * Returns height of this image, or -1 if one has not been set.
-     * @return The height.
      */
     public int getHeight();
 
@@ -106,7 +102,6 @@ public interface PDImage extends COSObje
 
     /**
      * Returns the width of this image, or -1 if one has not been set.
-     * @return The width.
      */
     public int getWidth();
 
@@ -124,7 +119,17 @@ public interface PDImage extends COSObje
 
     /**
      * Returns the decode array.
-     * @return the decode array.
      */
     public COSArray getDecode();
+
+    /**
+     * Returns true if the image should be interpolated when rendered.
+     */
+    public boolean getInterpolate();
+
+
+    /**
+     * Sets the Interpolate flag, true for high-quality image scaling.
+     */
+    public void setInterpolate(boolean value);
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java?rev=1621640&r1=1621639&r2=1621640&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java Sun Aug 31 21:11:10 2014
@@ -423,6 +423,18 @@ public final class PDImageXObject extend
     }
 
     @Override
+    public boolean getInterpolate()
+    {
+        return getCOSStream().getBoolean(COSName.INTERPOLATE, false);
+    }
+
+    @Override
+    public void setInterpolate(boolean value)
+    {
+        getCOSStream().setBoolean(COSName.INTERPOLATE, value);
+    }
+
+    @Override
     public void setDecode(COSArray decode)
     {
         getCOSStream().setItem(COSName.DECODE, decode);

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImage.java?rev=1621640&r1=1621639&r2=1621640&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImage.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImage.java Sun Aug 31 21:11:10 2014
@@ -183,6 +183,18 @@ public final class PDInlineImage impleme
         parameters.setInt(COSName.W, width);
     }
 
+    @Override
+    public boolean getInterpolate()
+    {
+        return parameters.getBoolean(COSName.I, COSName.INTERPOLATE, false);
+    }
+
+    @Override
+    public void setInterpolate(boolean value)
+    {
+        parameters.setBoolean(COSName.I, value);
+    }
+
     /**
      * Returns a list of filters applied to this stream, or null if there are
      * none.

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1621640&r1=1621639&r2=1621640&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java Sun Aug 31 21:11:10 2014
@@ -138,6 +138,19 @@ public class PageDrawer extends PDFGraph
     }
 
     /**
+     * Sets high-quality rendering hints on the current Graphics2D.
+     */
+    private void setRenderingHints()
+    {
+        graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+                                  RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+        graphics.setRenderingHint(RenderingHints.KEY_RENDERING,
+                                  RenderingHints.VALUE_RENDER_QUALITY);
+        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
+                                  RenderingHints.VALUE_ANTIALIAS_ON);
+    }
+
+    /**
      * This will draw the page to the requested context.
      * 
      * @param g The graphics context to draw onto.
@@ -149,14 +162,15 @@ public class PageDrawer extends PDFGraph
     {
         graphics = (Graphics2D) g;
         xform = graphics.getTransform();
-        this.pageSize = pageSize;
-        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-        graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+        setRenderingHints();
+
         graphics.translate(0, (int) pageSize.getHeight());
         graphics.scale(1, -1);
         // TODO use getStroke() to set the initial stroke
         graphics.setStroke(new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
 
+        this.pageSize = pageSize;
+
         // Only if there is some content, we have to process it.
         // Otherwise we are done here and we will produce an empty page
         PDPage page = getPage();
@@ -280,8 +294,7 @@ public class PageDrawer extends PDFGraph
     {
         pageSize = pageDimension;
         graphics = g;
-        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-        graphics.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
+        setRenderingHints();
 
         initStream(pageDimension);
 
@@ -371,8 +384,6 @@ public class PageDrawer extends PDFGraph
      */
     private void drawGlyph2D(Glyph2D glyph2D, int code, AffineTransform at) throws IOException
     {
-        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
-
         PDGraphicsState state = getGraphicsState();
         RenderingMode renderingMode = state.getTextState().getRenderingMode();
 
@@ -628,7 +639,6 @@ public class PageDrawer extends PDFGraph
         }
         graphics.setPaint(strokingPaint);
         graphics.setStroke(getStroke());
-        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
         setClip();
         graphics.draw(linePath);
         linePath.reset();
@@ -647,7 +657,6 @@ public class PageDrawer extends PDFGraph
         }
         graphics.setPaint(nonStrokingPaint);
         linePath.setWindingRule(windingRule);
-        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
         setClip();
         graphics.fill(linePath);
         linePath.reset();
@@ -740,8 +749,20 @@ public class PageDrawer extends PDFGraph
         }
         else
         {
+            if (!pdImage.getInterpolate())
+            {
+                graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+                                          RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
+            }
+
             // draw the image
             drawBufferedImage(pdImage.getImage(), at);
+
+            if (!pdImage.getInterpolate())
+            {
+                graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
+                                          RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+            }
         }
     }
 
@@ -760,8 +781,6 @@ public class PageDrawer extends PDFGraph
                             imageTransform.getScaleX(), imageTransform.getScaleY()));
             awtPaint = applySoftMaskToPaint(awtPaint, softMask);
             graphics.setPaint(awtPaint);
-            graphics.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
-                    RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
             Rectangle2D unitRect = new Rectangle2D.Float(0, 0, 1, 1);
             graphics.fill(at.createTransformedShape(unitRect));
         }
@@ -785,7 +804,6 @@ public class PageDrawer extends PDFGraph
 
         graphics.setComposite(getGraphicsState().getNonStrokingJavaComposite());
         graphics.setPaint(paint);
-        graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_OFF);
         graphics.setClip(null);
         lastClip = null;
         graphics.fill(getGraphicsState().getCurrentClippingPath());