Author: jeremias
Date: Thu Jan 15 08:54:45 2009
New Revision: 734754

URL: http://svn.apache.org/viewvc?rev=734754&view=rev
Log:
Added in support for subtractive mode in 1-bit images. This should further 
reduce AFP file sizes for certain images.
We need to change the way the AFP library works in the long term. Adding one 
boolean flag causes changes in 5 different classes. That can't be it.

Modified:
    xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/AFPDataObjectFactory.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/AFPImageObjectInfo.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/ioca/ImageContent.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/ioca/ImageSegment.java
    xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/modca/ImageObject.java
    
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/AFPDataObjectFactory.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/AFPDataObjectFactory.java?rev=734754&r1=734753&r2=734754&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/AFPDataObjectFactory.java 
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/AFPDataObjectFactory.java 
Thu Jan 15 08:54:45 2009
@@ -21,6 +21,9 @@
 
 import java.awt.geom.Rectangle2D;
 
+import org.apache.xmlgraphics.image.codec.tiff.TIFFImage;
+import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;
+
 import org.apache.fop.afp.ioca.ImageContent;
 import org.apache.fop.afp.modca.AbstractDataObject;
 import org.apache.fop.afp.modca.AbstractNamedAFPObject;
@@ -35,8 +38,6 @@
 import org.apache.fop.afp.modca.ResourceObject;
 import org.apache.fop.afp.modca.triplets.MappingOptionTriplet;
 import org.apache.fop.afp.modca.triplets.ObjectClassificationTriplet;
-import org.apache.xmlgraphics.image.codec.tiff.TIFFImage;
-import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;
 
 /**
  * Factory for high level data objects (Image/Graphics etc)
@@ -117,6 +118,7 @@
         } else {
             imageObj.setIDESize((byte) imageObjectInfo.getBitsPerPixel());
         }
+        imageObj.setSubtractive(imageObjectInfo.isSubtractive());
 
         imageObj.setData(imageObjectInfo.getData());
 

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/AFPImageObjectInfo.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/AFPImageObjectInfo.java?rev=734754&r1=734753&r2=734754&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/AFPImageObjectInfo.java 
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/AFPImageObjectInfo.java 
Thu Jan 15 08:54:45 2009
@@ -34,6 +34,8 @@
     /** compression type if any */
     private int compression = -1;
 
+    private boolean subtractive;
+
     /**
      * Default constructor
      */
@@ -104,12 +106,29 @@
         this.compression = compression;
     }
 
+    /**
+     * Set either additive or subtractive mode (used for ASFLAG).
+     * @param subtractive true for subtractive mode, false for additive mode
+     */
+    public void setSubtractive(boolean subtractive) {
+        this.subtractive = subtractive;
+    }
+
+    /**
+     * Indicates whether additive or subtractive mode is set.
+     * @return true for subtractive mode, false for additive mode
+     */
+    public boolean isSubtractive() {
+        return subtractive;
+    }
+
     /** {...@inheritdoc} */
     public String toString() {
         return "AFPImageObjectInfo{" + super.toString()
             + ", compression=" + compression
             + ", color=" + color
             + ", bitsPerPixel=" + bitsPerPixel
+            + ", " + (isSubtractive() ? "subtractive" : "additive")
             + "}";
     }
 }
\ No newline at end of file

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/ioca/ImageContent.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/ioca/ImageContent.java?rev=734754&r1=734753&r2=734754&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/ioca/ImageContent.java 
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/ioca/ImageContent.java 
Thu Jan 15 08:54:45 2009
@@ -68,6 +68,9 @@
     /** the image color model */
     private byte colorModel = (byte)0x01;
 
+    /** additive/subtractive setting for ASFLAG */
+    private boolean subtractive = false;
+
     /** the image data */
     private byte[] data;
 
@@ -123,6 +126,14 @@
     }
 
     /**
+     * Set either additive or subtractive mode (used for ASFLAG).
+     * @param subtractive true for subtractive mode, false for additive mode
+     */
+    public void setSubtractive(boolean subtractive) {
+        this.subtractive = subtractive;
+    }
+
+    /**
      * Set the image data (can be byte array or inputstream)
      *
      * @param imageData the image data
@@ -243,12 +254,16 @@
      * @return byte[] The data stream.
      */
     private byte[] getIDEStructureParameter() {
+        byte flags = 0x00;
+        if (subtractive) {
+            flags |= 1 << 7;
+        }
         if (colorModel != 0 && size == 24) {
             final byte bits = (byte)(size / 3);
             final byte[] ideStructData = new byte[] {
                 (byte)0x9B, // ID
                 0x00, // Length
-                0x00, // FLAGS
+                flags, // FLAGS
                 0x00, // Reserved
                 colorModel, // COLOR MODEL
                 0x00, // Reserved
@@ -260,6 +275,20 @@
             };
             ideStructData[1] = (byte)(ideStructData.length - 2);
             return ideStructData;
+        } else if (size == 1) {
+            final byte[] ideStructData = new byte[] {
+                    (byte)0x9B, // ID
+                    0x00, // Length
+                    flags, // FLAGS
+                    0x00, // Reserved
+                    colorModel, // COLOR MODEL
+                    0x00, // Reserved
+                    0x00, // Reserved
+                    0x00, // Reserved
+                    1
+                };
+                ideStructData[1] = (byte)(ideStructData.length - 2);
+                return ideStructData;
         }
         return new byte[0];
     }

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/ioca/ImageSegment.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/ioca/ImageSegment.java?rev=734754&r1=734753&r2=734754&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/ioca/ImageSegment.java 
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/ioca/ImageSegment.java 
Thu Jan 15 08:54:45 2009
@@ -114,6 +114,14 @@
     }
 
     /**
+     * Set either additive or subtractive mode (used for ASFLAG).
+     * @param subtractive true for subtractive mode, false for additive mode
+     */
+    public void setSubtractive(boolean subtractive) {
+        getImageContent().setSubtractive(subtractive);
+    }
+
+    /**
      * Set the data image data.
      *
      * @param data the image data

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/modca/ImageObject.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/modca/ImageObject.java?rev=734754&r1=734753&r2=734754&view=diff
==============================================================================
--- xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/modca/ImageObject.java 
(original)
+++ xmlgraphics/fop/trunk/src/java/org/apache/fop/afp/modca/ImageObject.java 
Thu Jan 15 08:54:45 2009
@@ -23,6 +23,7 @@
 import java.io.OutputStream;
 
 import org.apache.commons.io.output.ByteArrayOutputStream;
+
 import org.apache.fop.afp.AFPDataObjectInfo;
 import org.apache.fop.afp.AFPImageObjectInfo;
 import org.apache.fop.afp.Factory;
@@ -114,9 +115,17 @@
     }
 
     /**
+     * Set either additive or subtractive mode (used for ASFLAG).
+     * @param subtractive true for subtractive mode, false for additive mode
+     */
+    public void setSubtractive(boolean subtractive) {
+        getImageSegment().setSubtractive(subtractive);
+    }
+
+    /**
      * Set the data of the image.
      *
-     * @param data the image data
+     * @param imageData the image data
      */
     public void setData(byte[] imageData) {
         getImageSegment().setData(imageData);

Modified: 
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java?rev=734754&r1=734753&r2=734754&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java
 (original)
+++ 
xmlgraphics/fop/trunk/src/java/org/apache/fop/render/afp/AFPImageHandlerRenderedImage.java
 Thu Jan 15 08:54:45 2009
@@ -105,13 +105,15 @@
             if (BitmapImageUtil.getColorIndexSize(renderedImage) > 2) {
                 directEncode = false; //Lookup tables are not implemented, yet
             }
-            if (BitmapImageUtil.isMonochromeImage(renderedImage)
-                    && BitmapImageUtil.isZeroBlack(renderedImage)) {
-                directEncode = false; //Passing additive/subtractive info not 
implemented, yet
-            }
             if (directEncode) {
                 log.debug("Encoding image directly...");
                 
imageObjectInfo.setBitsPerPixel(encodedColorModel.getPixelSize());
+                if (BitmapImageUtil.isMonochromeImage(renderedImage)
+                        && !BitmapImageUtil.isZeroBlack(renderedImage)) {
+                    log.trace("set subtractive mode");
+                    imageObjectInfo.setSubtractive(true);
+                }
+
                 helper.encode(baos);
                 imageData = baos.toByteArray();
             }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to