]> source.dussan.org Git - xmlgraphics-fop.git/commitdiff
Fix for border painting in "quality" mode. Some borders were swallowed.
authorJeremias Maerki <jeremias@apache.org>
Wed, 31 May 2006 13:36:18 +0000 (13:36 +0000)
committerJeremias Maerki <jeremias@apache.org>
Wed, 31 May 2006 13:36:18 +0000 (13:36 +0000)
Added an additional parameter to distinguish between painting bitmap with source transparency (bitmapped text and borders) and without (images).

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@410521 13f79535-47bb-0310-9956-ffa450edef68

src/sandbox/org/apache/fop/render/pcl/PCLGenerator.java
src/sandbox/org/apache/fop/render/pcl/PCLGraphics2DAdapter.java
src/sandbox/org/apache/fop/render/pcl/PCLRenderer.java
src/sandbox/org/apache/fop/render/pcl/PCLRendererContext.java

index 373a70794fecaf7ed5b30930a3cdaf7cac03c2b9..8612a51e6b9488bac42d3652f2a7cb7833fa2688 100644 (file)
@@ -578,9 +578,11 @@ public class PCLGenerator {
      * (1-bit) bitmap image.
      * @param img the bitmap image
      * @param targetDim the target Dimention (in mpt)
+     * @param sourceTransparency true if the background should not be erased
      * @throws IOException In case of an I/O error
      */
-    public void paintBitmap(RenderedImage img, Dimension targetDim) throws IOException {
+    public void paintBitmap(RenderedImage img, Dimension targetDim, boolean sourceTransparency) 
+                throws IOException {
         double targetResolution = img.getWidth() / UnitConv.mpt2in(targetDim.width);
         int resolution = (int)Math.round(targetResolution);
         int effResolution = calculatePCLResolution(resolution, true);
@@ -634,7 +636,7 @@ public class PCLGenerator {
             
             RenderedImage red = buf;
             selectCurrentPattern(0, 0); //Solid black
-            setTransparencyMode(mask != null, true);
+            setTransparencyMode(sourceTransparency || mask != null, true);
             paintMonochromeBitmap(red, effResolution);
         } else {
             //TODO untested!
@@ -654,7 +656,7 @@ public class PCLGenerator {
                 }
                 effImg = buf;
             }
-            setSourceTransparencyMode(false);
+            setSourceTransparencyMode(sourceTransparency);
             selectCurrentPattern(0, 0); //Solid black
             paintMonochromeBitmap(effImg, effResolution);
         }
index 4d2e950ab7e524560c536148a89d5a4d9e339c63..d2e91f8e6247c9a728414d98a745c25ba46bbecf 100644 (file)
@@ -112,7 +112,7 @@ public class PCLGraphics2DAdapter extends AbstractGraphics2DAdapter {
             BufferedImage bi = paintToBufferedImage(painter, pclContext, resolution, true, false);
 
             pcl.setCursorPos(x, y);
-            gen.paintBitmap(bi, new Dimension(width, height));
+            gen.paintBitmap(bi, new Dimension(width, height), pclContext.isSourceTransparency());
         }
     }
 
index d20b45a6979d515826ea54c25a0afa9742fa178f..71780448c595facdd9a2736d76e1c72ebe39a3c0 100644 (file)
@@ -101,6 +101,11 @@ public class PCLRenderer extends PrintRenderer {
     /** The MIME type for PCL */
     public static final String MIME_TYPE = MimeConstants.MIME_PCL_ALT;
 
+    private static final QName CONV_MODE 
+            = new QName(ExtensionElementMapping.URI, null, "conversion-mode");
+    private static final QName SRC_TRANSPARENCY 
+            = new QName(ExtensionElementMapping.URI, null, "source-transparency");
+    
     /** The OutputStream to write the PCL stream to */
     protected OutputStream out;
     
@@ -580,7 +585,8 @@ public class PCLRenderer extends PrintRenderer {
                 RendererContext rc = createRendererContext(paintRect.x, paintRect.y, 
                         paintRect.width, paintRect.height, null);
                 Map atts = new java.util.HashMap();
-                atts.put(new QName(ExtensionElementMapping.URI, null, "conversion-mode"), "bitmap");
+                atts.put(CONV_MODE, "bitmap");
+                atts.put(SRC_TRANSPARENCY, "true");
                 rc.setProperty(RendererContextConstants.FOREIGN_ATTRIBUTES, atts);
                 
                 Graphics2DImagePainter painter = new Graphics2DImagePainter() {
@@ -959,7 +965,9 @@ public class PCLRenderer extends PrintRenderer {
             try {
                 setCursorPos(this.currentIPPosition + (int)pos.getX(),
                         this.currentBPPosition + (int)pos.getY());
-                gen.paintBitmap(img, new Dimension((int)pos.getWidth(), (int)pos.getHeight()));
+                gen.paintBitmap(img, 
+                        new Dimension((int)pos.getWidth(), (int)pos.getHeight()), 
+                        false);
             } catch (IOException ioe) {
                 handleIOTrouble(ioe);
             }
@@ -1177,29 +1185,33 @@ public class PCLRenderer extends PrintRenderer {
         final Rectangle.Float effBorderRect = new Rectangle2D.Float(
                  borderRect.x - (currentIPPosition / 1000f),
                  borderRect.y - (currentBPPosition / 1000f),
-                 borderRect.width, borderRect.height);
+                 borderRect.width,
+                 borderRect.height);
         final Rectangle paintRect = new Rectangle(
-                (int)Math.round(borderRect.x * 1000),
-                (int)Math.round(borderRect.y * 1000), 
-                (int)Math.floor(borderRect.width * 1000) + 1,
-                (int)Math.floor(borderRect.height * 1000) + 1);
-        int xoffset = (bpsStart != null ? bpsStart.width : 0);
+                (int)Math.round(borderRect.x * 1000f),
+                (int)Math.round(borderRect.y * 1000f), 
+                (int)Math.floor(borderRect.width * 1000f) + 1,
+                (int)Math.floor(borderRect.height * 1000f) + 1);
+        //Add one pixel wide safety margin around the paint area
+        int pixelWidth = (int)Math.round(UnitConv.in2mpt(1) / userAgent.getTargetResolution());
+        final int xoffset = (bpsStart != null ? bpsStart.width : 0) + pixelWidth;
+        final int yoffset = pixelWidth;
         paintRect.x += xoffset;
-        paintRect.width += xoffset;
-        paintRect.width += (bpsEnd != null ? bpsEnd.width : 0);
+        paintRect.y += yoffset;
+        paintRect.width += 2 * pixelWidth;
+        paintRect.height += 2 * pixelWidth;
         
         RendererContext rc = createRendererContext(paintRect.x, paintRect.y, 
                 paintRect.width, paintRect.height, null);
-        if (false) {
-            Map atts = new java.util.HashMap();
-            atts.put(new QName(ExtensionElementMapping.URI, null, "conversion-mode"), "bitmap");
-            rc.setProperty(RendererContextConstants.FOREIGN_ATTRIBUTES, atts);
-        }
+        Map atts = new java.util.HashMap();
+        atts.put(CONV_MODE, "bitmap");
+        atts.put(SRC_TRANSPARENCY, "true");
+        rc.setProperty(RendererContextConstants.FOREIGN_ATTRIBUTES, atts);
         
         Graphics2DImagePainter painter = new Graphics2DImagePainter() {
 
             public void paint(Graphics2D g2d, Rectangle2D area) {
-                g2d.translate((bpsStart != null ? bpsStart.width : 0), 0);
+                g2d.translate(xoffset, yoffset);
                 g2d.scale(1000, 1000);
                 float startx = effBorderRect.x;
                 float starty = effBorderRect.y;
index 462abfa487405aa50db78cd8a0e1ff4b53d0d63d..ae5646db8a6988b4db74c951973adb0654123d32 100644 (file)
@@ -60,6 +60,12 @@ public class PCLRendererContext extends RendererContext.RendererContextWrapper {
         return getForeignAttributes() != null 
              && "true".equalsIgnoreCase((String)getForeignAttributes().get(qName));
     }
+
+    public boolean isSourceTransparency() {
+        QName qName = new QName(ExtensionElementMapping.URI, null, "source-transparency");
+        return getForeignAttributes() != null 
+             && "true".equalsIgnoreCase((String)getForeignAttributes().get(qName));
+    }
     
 
 }
\ No newline at end of file