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/02/20 07:31:05 UTC

svn commit: r1570086 [1/7] - in /pdfbox/trunk: examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ examples/src/main/java/org/apache/pdfbox/examples/util/ pdfbox/src/main/java/org/apache/pdfbox/cos/ pdfbox/src/main/java/org/apache/pdfbox/filter/...

Author: jahewson
Date: Thu Feb 20 06:31:01 2014
New Revision: 1570086

URL: http://svn.apache.org/r1570086
Log:
PDFBOX-1893: Refactor color spaces

Added:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/UnmodifiableCOSDictionary.java   (with props)
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxFilter.java
      - copied, changed from r1563990, pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxDecodeFilter.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/MissingImageReaderException.java   (with props)
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/PDPostScriptXObject.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/PDXObject.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDCIEBasedColorSpace.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceColorSpace.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceNProcess.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDJPXColorSpace.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDSpecialColorSpace.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/PDFormXObject.java
      - copied, changed from r1568222, pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDXObjectForm.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/form/package.html
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactory.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/ImageFactory.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactory.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/pdmodel/graphics/image/SampledImageReader.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/TIFFInputStream.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/package.html
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingDeviceCMYKColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingDeviceGrayColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingDeviceRGBColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingDeviceCMYKColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingDeviceGrayColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingDeviceRGBColor.java
Removed:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxDecodeFilter.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/ColorSpaceCalRGB.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/ColorSpaceLab.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpaceFactory.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorState.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageParameters.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingCMYKColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingCalRGBColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingDeviceN.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingGrayColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingICCBasedColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingIndexed.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingLabColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingPattern.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingRGBColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingSeparation.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingCMYKColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingCalRGBColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingDeviceN.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingGrayColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingICCBasedColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingIndexed.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingLabColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingPattern.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingRGBColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingSeparation.java
    pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/PDDeviceCMYK.properties
    pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/icc/
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/color/
Modified:
    pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/AddImageToPDF.java
    pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ExtractTTFFonts.java
    pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ImageToPDF.java
    pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStampWithImage.java
    pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDictionary.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSName.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/FilterManager.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFStreamParser.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/ContentStreamWriter.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunction.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType2.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType3.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunctionType4.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/documentinterchange/logicalstructure/PDObjectReference.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/documentinterchange/logicalstructure/PDStructureNode.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/documentinterchange/markedcontent/PDMarkedContent.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/documentinterchange/prepress/PDBoxStyle.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/edit/PDPageContentStream.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/PDGraphicsState.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/PDShading.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDCalGray.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDCalRGB.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDColorSpace.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceCMYK.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceGray.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceN.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceNAttributes.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDDeviceRGB.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDGamma.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDICCBased.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDIndexed.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDLab.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDOutputIntent.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDPattern.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDSeparation.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/color/PDTristimulus.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDPatternResources.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDShadingPatternResources.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/pattern/PDTilingPatternResources.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingContext.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/AxialShadingPaint.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/GouraudShadingContext.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/PDShadingResources.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingContext.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/RadialShadingPaint.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingContext.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type1ShadingPaint.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type4ShadingPaint.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/shading/Type5ShadingPaint.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/annotation/PDAppearanceCharacteristicsDictionary.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDFTemplateBuilder.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDFTemplateCreator.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDFTemplateStructure.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDVisibleSigBuilder.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/digitalsignature/visible/PDVisibleSignDesigner.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/interactive/documentnavigation/outline/PDOutlineItem.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/LayerUtility.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFMarkedContentExtractor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFOperator.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFStreamEngine.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/RenderUtil.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/Invoke.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetNonStrokingColorSpace.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingColor.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/SetStrokingColorSpace.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/BeginInlineImage.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/Invoke.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/SetLineDashPattern.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/operator/pagedrawer/StrokePath.java
    pdfbox/trunk/pdfbox/src/main/resources/org/apache/pdfbox/resources/PageDrawer.properties
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/filter/TestFilters.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/common/function/TestPDFunctionType4.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/edit/TestPDPageContentStream.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/util/TestImageIOUtils.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/util/TestLayerUtility.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/annotation/AnnotationValidator.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamEngine.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/content/ContentStreamWrapper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/font/util/PDFAType3StreamParser.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/DeviceColorSpaceHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/graphic/StandardColorSpaceHelper.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/GraphicObjectPageValidationProcess.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/ResourcesValidationProcess.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/process/reflect/SinglePageValidationProcess.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/xobject/XObjFormValidator.java
    pdfbox/trunk/preflight/src/main/java/org/apache/pdfbox/preflight/xobject/XObjImageValidator.java
    pdfbox/trunk/tools/src/main/java/org/apache/pdfbox/ExtractImages.java

Modified: pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/AddImageToPDF.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/AddImageToPDF.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/AddImageToPDF.java (original)
+++ pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/AddImageToPDF.java Thu Feb 20 06:31:01 2014
@@ -28,10 +28,9 @@ import org.apache.pdfbox.pdmodel.PDPage;
 
 import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
 
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDCcitt;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
-
+import org.apache.pdfbox.pdmodel.graphics.image.CCITTFactory;
+import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory;
+import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
 
 /**
  * This is an example that creates a reads a document and adds an image to it..
@@ -43,7 +42,6 @@ import org.apache.pdfbox.pdmodel.graphic
  */
 public class AddImageToPDF
 {
-
     /**
      * Add an image to an existing PDF document.
      *
@@ -66,14 +64,14 @@ public class AddImageToPDF
             //we will add the image to the first page.
             PDPage page = (PDPage)doc.getDocumentCatalog().getAllPages().get( 0 );
 
-            PDXObjectImage ximage = null;
+            PDImageXObject ximage;
             if( image.toLowerCase().endsWith( ".jpg" ) )
             {
-                ximage = new PDJpeg(doc, new FileInputStream( image ) );
+                ximage = JPEGFactory.createFromStream(doc, new FileInputStream(image));
             }
             else if (image.toLowerCase().endsWith(".tif") || image.toLowerCase().endsWith(".tiff"))
             {
-                ximage = new PDCcitt(doc, new RandomAccessFile(new File(image),"r"));
+                ximage = CCITTFactory.createFromRandomAccess(doc, new RandomAccessFile(new File(image),"r"));
             }
             else
             {

Modified: pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ExtractTTFFonts.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ExtractTTFFonts.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ExtractTTFFonts.java (original)
+++ pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ExtractTTFFonts.java Thu Feb 20 06:31:01 2014
@@ -32,8 +32,8 @@ import org.apache.pdfbox.pdmodel.font.PD
 import org.apache.pdfbox.pdmodel.font.PDFontDescriptorDictionary;
 import org.apache.pdfbox.pdmodel.font.PDTrueTypeFont;
 import org.apache.pdfbox.pdmodel.font.PDType0Font;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm;
+import org.apache.pdfbox.pdmodel.graphics.PDXObject;
+import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
 
 /**
  * This will extract all true type-fonts of a pdf.
@@ -204,9 +204,9 @@ public class ExtractTTFFonts
             {
                 String key = xobjectIter.next();
                 PDXObject xobject = xobjects.get(key);
-                if (xobject instanceof PDXObjectForm)
+                if (xobject instanceof PDFormXObject)
                 {
-                    PDXObjectForm xObjectForm = (PDXObjectForm) xobject;
+                    PDFormXObject xObjectForm = (PDFormXObject) xobject;
                     PDResources formResources = xObjectForm.getResources();
                     processResources(formResources, prefix, addKey);
                 }

Modified: pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ImageToPDF.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ImageToPDF.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ImageToPDF.java (original)
+++ pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/ImageToPDF.java Thu Feb 20 06:31:01 2014
@@ -28,10 +28,9 @@ import org.apache.pdfbox.pdmodel.PDPage;
 
 import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
 
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDCcitt;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
-
+import org.apache.pdfbox.pdmodel.graphics.image.CCITTFactory;
+import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory;
+import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
 
 /**
  * This is an example that creates a simple document.
@@ -43,7 +42,6 @@ import org.apache.pdfbox.pdmodel.graphic
  */
 public class ImageToPDF
 {
-
     /**
      * create the second sample document from the PDF file format specification.
      *
@@ -64,14 +62,14 @@ public class ImageToPDF
             PDPage page = new PDPage();
             doc.addPage( page );
 
-            PDXObjectImage ximage = null;
+            PDImageXObject pdImage;
             if( image.toLowerCase().endsWith( ".jpg" ) )
             {
-                ximage = new PDJpeg(doc, new FileInputStream( image ) );
+                pdImage = JPEGFactory.createFromStream(doc, new FileInputStream(image));
             }
             else if (image.toLowerCase().endsWith(".tif") || image.toLowerCase().endsWith(".tiff"))
             {
-                ximage = new PDCcitt(doc, new RandomAccessFile(new File(image),"r"));
+                pdImage = CCITTFactory.createFromRandomAccess(doc, new RandomAccessFile(new File(image),"r"));
             }
             else
             {
@@ -81,7 +79,7 @@ public class ImageToPDF
             }
             PDPageContentStream contentStream = new PDPageContentStream(doc, page);
 
-            contentStream.drawImage( ximage, 20, 20 );
+            contentStream.drawImage( pdImage, 20, 20 );
 
             contentStream.close();
             doc.save( file );

Modified: pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStampWithImage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStampWithImage.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStampWithImage.java (original)
+++ pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/pdmodel/RubberStampWithImage.java Thu Feb 20 06:31:01 2014
@@ -23,9 +23,9 @@ import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDResources;
 import org.apache.pdfbox.pdmodel.common.PDRectangle;
 import org.apache.pdfbox.pdmodel.common.PDStream;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpeg;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
+import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
+import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory;
+import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationRubberStamp;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceDictionary;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAppearanceStream;
@@ -91,7 +91,7 @@ public class RubberStampWithImage
 
                     // Create a PDXObjectImage with the given jpg
                     FileInputStream fin = new FileInputStream( args[2] );
-                    PDJpeg mypic = new PDJpeg(document,fin);
+                    PDImageXObject mypic = JPEGFactory.createFromStream(document, fin);
                     
                     //Define and set the target rectangle
                     PDRectangle myrect = new PDRectangle();
@@ -100,10 +100,10 @@ public class RubberStampWithImage
                     myrect.setLowerLeftX(250);
                     myrect.setLowerLeftY(550);
 
-                    // Create a PDXObjectForm
+                    // Create a PDFormXObject
                     PDStream formstream = new PDStream(document);
                     OutputStream os = formstream.createOutputStream();
-                    PDXObjectForm form = new PDXObjectForm(formstream);
+                    PDFormXObject form = new PDFormXObject(formstream);
                     form.setResources(new PDResources());
                     form.setBBox(myrect);
                     form.setFormType(1);
@@ -138,7 +138,7 @@ public class RubberStampWithImage
         }        
     }
     
-    private void drawXObject( PDXObjectImage xobject, PDResources resources, OutputStream os, 
+    private void drawXObject( PDImageXObject xobject, PDResources resources, OutputStream os,
             float x, float y, float width, float height ) throws IOException
     {
         // This is similar to PDPageContentStream.drawXObject()

Modified: pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java (original)
+++ pdfbox/trunk/examples/src/main/java/org/apache/pdfbox/examples/util/PrintImageLocations.java Thu Feb 20 06:31:01 2014
@@ -24,9 +24,9 @@ import org.apache.pdfbox.pdmodel.PDDocum
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.pdmodel.PDResources;
 import org.apache.pdfbox.pdmodel.graphics.PDGraphicsState;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectForm;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
+import org.apache.pdfbox.pdmodel.graphics.PDXObject;
+import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
+import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
 import org.apache.pdfbox.util.Matrix;
 import org.apache.pdfbox.util.PDFOperator;
 import org.apache.pdfbox.util.PDFStreamEngine;
@@ -128,9 +128,9 @@ public class PrintImageLocations extends
             COSName objectName = (COSName)arguments.get( 0 );
             Map<String, PDXObject> xobjects = getResources().getXObjects();
             PDXObject xobject = (PDXObject)xobjects.get( objectName.getName() );
-            if( xobject instanceof PDXObjectImage )
+            if( xobject instanceof PDImageXObject)
             {
-                PDXObjectImage image = (PDXObjectImage)xobject;
+                PDImageXObject image = (PDImageXObject)xobject;
                 int imageWidth = image.getWidth();
                 int imageHeight = image.getHeight();
                 System.out.println("*******************************************************************");
@@ -159,12 +159,12 @@ public class PrintImageLocations extends
                 System.out.println("size = " + imageXScale + "mm, " + imageYScale + "mm");
                 System.out.println();
             }
-            else if(xobject instanceof PDXObjectForm)
+            else if(xobject instanceof PDFormXObject)
             {
                 // save the graphics state
                 getGraphicsStack().push( (PDGraphicsState)getGraphicsState().clone() );
                 
-                PDXObjectForm form = (PDXObjectForm)xobject;
+                PDFormXObject form = (PDFormXObject)xobject;
                 COSStream invoke = (COSStream)form.getCOSObject();
                 PDResources pdResources = form.getResources();
                 // if there is an optional form matrix, we have to map the form space to the user space

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDictionary.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDictionary.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDictionary.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDictionary.java Thu Feb 20 06:31:01 2014
@@ -43,8 +43,7 @@ public class COSDictionary extends COSBa
 	 * The name-value pairs of this dictionary. The pairs are kept in the
 	 * order they were added to the dictionary.
 	 */
-	protected final Map<COSName, COSBase> items =
-			new LinkedHashMap<COSName, COSBase>();
+	protected Map<COSName, COSBase> items = new LinkedHashMap<COSName, COSBase>();
 
 	/**
 	 * Constructor.
@@ -1434,6 +1433,15 @@ public class COSDictionary extends COSBa
 		return retval;
 	}
 
+    /**
+     * Returns an unmodifiable view of this dictionary.
+     * @return
+     */
+    public COSDictionary asUnmodifiableDictionary()
+    {
+        return new UnmodifiableCOSDictionary(this);
+    }
+
 	/**
 	 * {@inheritDoc}
 	 */

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=1570086&r1=1570085&r2=1570086&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 Thu Feb 20 06:31:01 2014
@@ -292,6 +292,10 @@ public final class COSName extends COSBa
     /**
      * A common COSName value.
      */
+    public static final COSName PROCESS = new COSName("Process");
+    /**
+     * A common COSName value.
+     */
     public static final COSName COLORS = new COSName("Colors");
     /**
      * A common COSName value.
@@ -312,6 +316,10 @@ public final class COSName extends COSBa
     /**
      * A common COSName value.
      */
+    public static final COSName COMPONENTS = new COSName("Components");
+    /**
+     * A common COSName value.
+     */
     public static final COSName COORDS = new COSName("Coords");
     /**
      * A common COSName value.
@@ -328,6 +336,10 @@ public final class COSName extends COSBa
     /**
      * A common COSName value.
      */
+    public static final COSName CMYK = new COSName("CMYK");
+    /**
+     * A common COSName value.
+     */
     public static final COSName CREATION_DATE = new COSName("CreationDate");
     /**
      * A common COSName value.
@@ -710,13 +722,18 @@ public final class COSName extends COSBa
     /**
      * A common COSName value.
      */
+    public static final COSName G = new COSName("G");
+    /**
+     * A common COSName value.
+     */
     public static final COSName GAMMA = new COSName("Gamma");
-
     /**
      * A common COSName value.
      */
     public static final COSName GTS_PDFA1 = new COSName("GTS_PDFA1");
-
+    /**
+     * A common COSName value.
+     */
     public static final COSName H = new COSName("H");
     /**
      * A common COSName value.
@@ -766,6 +783,12 @@ public final class COSName extends COSBa
      * A common COSName value.
      */
     public static final COSName IMAGE = new COSName("Image");
+
+    /**
+     * A common COSName value.
+     */
+    public static final COSName IM = new COSName("IM");
+
     /**
      * A common COSName value.
      */
@@ -968,12 +991,10 @@ public final class COSName extends COSBa
      * A common COSName value.
      */
     public static final COSName NAME = new COSName("Name");
-
     /**
      * A common COSName value.
      */
     public static final COSName NAMES = new COSName("Names");
-
     /**
      * A common COSName value.
      */
@@ -1148,6 +1169,10 @@ public final class COSName extends COSBa
     /**
      * A common COSName value.
      */
+    public static final COSName PS = new COSName("PS");
+    /**
+     * A common COSName value.
+     */
     public static final COSName PREDICTOR = new COSName("Predictor");
     /**
      * A common COSName value.
@@ -1219,7 +1244,6 @@ public final class COSName extends COSBa
      * A common COSName value.
      */
     public static final COSName REGISTRY_NAME = new COSName("RegistryName");
-
     /**
      * A common COSName value.
      */
@@ -1227,6 +1251,10 @@ public final class COSName extends COSBa
     /**
      * A common COSName value.
      */
+    public static final COSName RGB = new COSName("RGB");
+    /**
+     * A common COSName value.
+     */
     public static final COSName RI = new COSName("RI");
     /**
      * A common COSName value.

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSStream.java Thu Feb 20 06:31:01 2014
@@ -175,7 +175,7 @@ public class COSStream extends COSDictio
      *
      * @throws IOException when encoding/decoding causes an exception
      */
-    public InputStream getUnfilteredStream() throws IOException
+    public InputStream  getUnfilteredStream() throws IOException
     {
         InputStream retval = null;
         if( unFilteredStream == null )
@@ -305,7 +305,8 @@ public class COSStream extends COSDictio
                         new RandomAccessFileInputStream( file, position, length ), BUFFER_SIZE );
                 	IOUtils.closeQuietly(unFilteredStream);
                     unFilteredStream = new RandomAccessFileOutputStream( file );
-                    filter.decode( input, unFilteredStream, this, filterIndex );
+                    filter.decode( input, unFilteredStream, this.asUnmodifiableDictionary(),
+                                   filterIndex );
                     done = true;
                 }
                 catch( IOException io )
@@ -333,7 +334,8 @@ public class COSStream extends COSDictio
                             new RandomAccessFileInputStream( file, position, length ), BUFFER_SIZE );
                     	IOUtils.closeQuietly(unFilteredStream);
                         unFilteredStream = new RandomAccessFileOutputStream( file );
-                        filter.decode( input, unFilteredStream, this, filterIndex );
+                        filter.decode( input, unFilteredStream, this.asUnmodifiableDictionary(),
+                                       filterIndex );
                         done = true;
                     }
                     catch( IOException io )

Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/UnmodifiableCOSDictionary.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/UnmodifiableCOSDictionary.java?rev=1570086&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/UnmodifiableCOSDictionary.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/UnmodifiableCOSDictionary.java Thu Feb 20 06:31:01 2014
@@ -0,0 +1,262 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.cos;
+
+import java.util.Calendar;
+
+import org.apache.pdfbox.pdmodel.common.COSObjectable;
+
+/**
+ * An unmodifiable COSDictionary.
+ *
+ * @author John Hewson
+ */
+final class UnmodifiableCOSDictionary extends COSDictionary
+{
+    /**
+     * @inheritDoc
+     */
+    public UnmodifiableCOSDictionary(COSDictionary dict)
+    {
+        super();
+        items = dict.items;
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void clear()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setItem(COSName key, COSBase value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setItem(COSName key, COSObjectable value)
+    {
+       throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setItem(String key, COSObjectable value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setBoolean(String key, boolean value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setBoolean(COSName key, boolean value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setItem(String key, COSBase value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setName(String key, String value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setName(COSName key, String value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setDate(String key, Calendar date)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setDate(COSName key, Calendar date)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setEmbeddedDate(String embedded, String key, Calendar date)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setEmbeddedDate(String embedded, COSName key, Calendar date)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setString(String key, String value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setString(COSName key, String value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setEmbeddedString(String embedded, String key, String value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setEmbeddedString(String embedded, COSName key, String value)
+    {
+       throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setInt(String key, int value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setInt(COSName key, int value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setLong(String key, long value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setLong(COSName key, long value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setEmbeddedInt(String embeddedDictionary, String key, int value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setEmbeddedInt(String embeddedDictionary, COSName key, int value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setFloat(String key, float value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void setFloat(COSName key, float value)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void removeItem(COSName key)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void addAll(COSDictionary dic)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    /**
+     * @inheritDoc
+     */
+    public void mergeInto(COSDictionary dic)
+    {
+        throw new UnsupportedOperationException();
+    }
+}

Propchange: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/UnmodifiableCOSDictionary.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxFilter.java (from r1563990, pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxDecodeFilter.java)
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxFilter.java?p2=pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxFilter.java&p1=pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxDecodeFilter.java&r1=1563990&r2=1570086&rev=1570086&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxDecodeFilter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/CCITTFaxFilter.java Thu Feb 20 06:31:01 2014
@@ -16,6 +16,7 @@
  */
 package org.apache.pdfbox.filter;
 
+import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -31,34 +32,31 @@ import org.apache.pdfbox.io.ccitt.CCITTF
 import org.apache.pdfbox.io.ccitt.FillOrderChangeInputStream;
 
 /**
- * This is a filter for the CCITTFax Decoder.
+ * Decodes image data that has been encoded using either Group 3 or Group 4
+ * CCITT facsimile (fax) encoding.
  *
- * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
+ * @author Ben Litchfield
  * @author Marcel Kammer
  * @author Paul King
- * @version $Revision: 1.13 $
  */
-public class CCITTFaxDecodeFilter implements Filter
+public final class CCITTFaxFilter implements Filter
 {
-    /**
-     * Log instance.
-     */
-    private static final Log log = LogFactory.getLog(CCITTFaxDecodeFilter.class);
+    private static final Log log = LogFactory.getLog(CCITTFaxFilter.class);
 
     /**
      * Constructor.
      */
-    public CCITTFaxDecodeFilter()
+    public CCITTFaxFilter()
     {
     }
 
     /**
      * {@inheritDoc}
      */
-    public void decode(InputStream compressedData, OutputStream result, COSDictionary options, int filterIndex)
-    throws IOException
+    public void decode(InputStream compressedData, OutputStream result, COSDictionary options,
+                       int filterIndex) throws IOException
     {
-
+        // get decode parameters
         COSBase decodeP = options.getDictionaryObject(COSName.DECODE_PARMS, COSName.DP);
         COSDictionary decodeParms = null;
         if (decodeP instanceof COSDictionary)
@@ -69,6 +67,8 @@ public class CCITTFaxDecodeFilter implem
         {
             decodeParms =  (COSDictionary)((COSArray)decodeP).getObject(filterIndex);
         }
+
+        // get compressed data
         int length = options.getInt(COSName.LENGTH, -1);
         byte[] compressed = null;
         if (length != -1)
@@ -88,6 +88,8 @@ public class CCITTFaxDecodeFilter implem
             // the streams inline images are stored in are mostly small ones
             compressed = IOUtils.toByteArray(compressedData);
         }
+
+        // parse dimensions
         int cols = decodeParms.getInt(COSName.COLUMNS, 1728);
         int rows = decodeParms.getInt(COSName.ROWS, 0);
         int height = options.getInt(COSName.HEIGHT, COSName.H, 0);
@@ -101,38 +103,60 @@ public class CCITTFaxDecodeFilter implem
             // at least one of the values has to have a valid value
             rows = Math.max(rows, height);
         }
+
+        // decompress data
         int k = decodeParms.getInt(COSName.K, 0);
         int arraySize = (cols + 7) / 8 * rows;
         TIFFFaxDecoder faxDecoder = new TIFFFaxDecoder(1, cols, rows);
         // TODO possible options??
         long tiffOptions = 0;
+        byte[] decompressed = null;
         if (k == 0)
         {
             InputStream in = new CCITTFaxG31DDecodeInputStream(
-                    new java.io.ByteArrayInputStream(compressed), cols);
+                    new ByteArrayInputStream(compressed), cols);
             in = new FillOrderChangeInputStream(in); //Decorate to change fill order
-            IOUtils.copy(in, result);
+            decompressed = IOUtils.toByteArray(in);
             in.close();
         }
         else if (k > 0)
         {
-            byte[] decompressed = new byte[arraySize];
+            decompressed = new byte[arraySize];
             faxDecoder.decode2D(decompressed, compressed, 0, rows, tiffOptions);
-            result.write(decompressed);
         }
         else if (k < 0)
         {
-            byte[] decompressed = new byte[arraySize];
+            decompressed = new byte[arraySize];
             faxDecoder.decodeT6(decompressed, compressed, 0, rows, tiffOptions);
-            result.write(decompressed);
+        }
+
+        // invert bitmap
+        boolean blackIsOne = decodeParms.getBoolean(COSName.BLACK_IS_1, false);
+        if (!blackIsOne)
+        {
+            // Inverting the bitmap
+            // Note the previous approach with starting from an IndexColorModel didn't work
+            // reliably. In some cases the image wouldn't be painted for some reason.
+            // So a safe but slower approach was taken.
+            invertBitmap(decompressed);
+        }
+
+        result.write(decompressed);
+    }
+
+    private void invertBitmap(byte[] bufferData)
+    {
+        for (int i = 0, c = bufferData.length; i < c; i++)
+        {
+            bufferData[i] = (byte) (~bufferData[i] & 0xFF);
         }
     }
 
     /**
      * {@inheritDoc}
      */
-    public void encode(InputStream rawData, OutputStream result, COSDictionary options, int filterIndex )
-        throws IOException
+    public void encode(InputStream rawData, OutputStream result, COSDictionary options,
+                       int filterIndex) throws IOException
     {
         log.warn("CCITTFaxDecode.encode is not implemented yet, skipping this stream.");
     }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/DCTFilter.java Thu Feb 20 06:31:01 2014
@@ -16,43 +16,156 @@
  */
 package org.apache.pdfbox.filter;
 
+import java.awt.image.DataBufferByte;
+import java.awt.image.Raster;
+import java.awt.image.WritableRaster;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.Iterator;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.cos.COSDictionary;
+import org.w3c.dom.Element;
+
+import javax.imageio.IIOException;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.stream.ImageInputStream;
 
 /**
- * This is the used for the DCTDecode filter.
+ * Decompresses data encoded using a DCT (discrete cosine transform)
+ * technique based on the JPEG standard.
+ *
+ * This filter is called {@code DCTDecode} in the PDF Reference.
  *
- * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
- * @version $Revision: 1.10 $
+ * @author John Hewson
  */
-public class DCTFilter implements Filter
+public final class DCTFilter implements Filter
 {
+    private static final Log LOG = LogFactory.getLog(DCTFilter.class);
+
+    public void decode(InputStream input, OutputStream output,
+                       COSDictionary options, int filterIndex) throws IOException
+    {
+        // find suitable image reader
+        Iterator readers = ImageIO.getImageReadersByFormatName("JPEG");
+        ImageReader reader = null;
+        while(readers.hasNext()) {
+            reader = (ImageReader)readers.next();
+            if(reader.canReadRaster()) {
+                break;
+            }
+        }
+
+        if (reader == null)
+        {
+            throw new MissingImageReaderException("Cannot read JPEG image: " +
+                    "a suitable JAI I/O image filter is not installed");
+        }
+
+        ImageInputStream iis = ImageIO.createImageInputStream(input);
+        reader.setInput(iis);
+        Raster raster = reader.readRaster(0, null);
+
+        // special handling for 4-component images
+        if (raster.getNumBands() == 4)
+        {
+            // get APP14 marker
+            Integer transform;
+            try
+            {
+                transform = getAdobeTransform(reader.getImageMetadata(0));
+            }
+            catch (IIOException e)
+            {
+                // catches the error "Inconsistent metadata read from stream"
+                // which seems to be present indicate a YCCK image, but who knows?
+                LOG.warn("Inconsistent metadata read from JPEG stream");
+                transform = 2; // YCCK
+            }
+            int colorTransform = transform != null ? transform : 0;
+
+            // 0 = Unknown (RGB or CMYK), 1 = YCbCr, 2 = YCCK
+            switch (colorTransform)
+            {
+                case 0: break; // already CMYK
+                case 1: LOG.warn("YCbCr JPEGs not implemented"); break; // TODO YCbCr
+                case 2: raster = fromYCCKtoCMYK(raster); break;
+            }
+        }
+
+        DataBufferByte dataBuffer = (DataBufferByte)raster.getDataBuffer();
+        output.write(dataBuffer.getData());
+    }
+
+    public void encode(InputStream rawData, OutputStream result,
+                       COSDictionary options, int filterIndex) throws IOException
+    {
+        LOG.warn("DCTFilter#encode is not implemented yet, skipping this stream.");
+    }
 
-    /**
-     * Log instance.
-     */
-    private static final Log log = LogFactory.getLog(DCTFilter.class);
-
-    /**
-     * {@inheritDoc}
-     */
-    public void decode( InputStream compressedData, OutputStream result, COSDictionary options, int filterIndex ) 
-        throws IOException
+    // reads the APP14 Adobe transform tag
+    private Integer getAdobeTransform(IIOMetadata metadata)
     {
-        log.warn( "DCTFilter.decode is not implemented yet, skipping this stream." );
+        Element tree = (Element)metadata.getAsTree("javax_imageio_jpeg_image_1.0");
+        Element markerSequence = (Element)tree.getElementsByTagName("markerSequence").item(0);
+
+        if (markerSequence.getElementsByTagName("app14Adobe") != null)
+        {
+            Element adobe = (Element)markerSequence.getElementsByTagName("app14Adobe").item(0);
+            return Integer.parseInt(adobe.getAttribute("transform"));
+        }
+        return 0; // Unknown
+    }
+
+    // converts YCCK image to CMYK. YCCK is an equivalent encoding for
+    // CMYK data, so no color management code is needed here, nor does the
+    // PDF color space have to be consulted
+    private WritableRaster fromYCCKtoCMYK(Raster raster) throws IOException
+    {
+        WritableRaster writableRaster = raster.createCompatibleWritableRaster();
+        writableRaster.setRect(raster);
+
+        int[] value = new int[4];
+        for (int y = 0, height = raster.getHeight(); y < height; y++)
+        {
+            for (int x = 0, width = raster.getWidth(); x < width; x++)
+            {
+                raster.getPixel(x, y, value);
+
+                // 4-channels 0..255
+                float Y = value[0];
+                float Cb = value[1];
+                float Cr = value[2];
+                float K = value[3];
+
+                // YCCK to RGB, see http://software.intel.com/en-us/node/442744
+                int r = clamp(Y + 1.402f * Cr - 179.456f);
+                int g = clamp(Y - 0.34414f * Cb - 0.71414f * Cr + 135.45984f);
+                int b = clamp(Y + 1.772f * Cb - 226.816f);
+
+                // naive RGB to CMYK
+                int cyan = 255 - r;
+                int magenta = 255 - g;
+                int yellow = 255 - b;
+
+                // update raster in-place
+                value[0] = cyan;
+                value[1] = magenta;
+                value[2] = yellow;
+                value[3] = (int)K;
+                writableRaster.setPixel(x, y, value);
+            }
+        }
+        return writableRaster;
     }
 
-     /**
-     * {@inheritDoc}
-     */
-    public void encode( InputStream rawData, OutputStream result, COSDictionary options, int filterIndex ) 
-        throws IOException
+    // clamps value to 0-255 range
+    private int clamp(float value)
     {
-        log.warn( "DCTFilter.encode is not implemented yet, skipping this stream." );
+        return (int)((value < 0) ? 0 : ((value > 255) ? 255 : value));
     }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/FilterManager.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/FilterManager.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/FilterManager.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/FilterManager.java Thu Feb 20 06:31:01 2014
@@ -41,7 +41,7 @@ public class FilterManager
     {
         Filter flateFilter = new FlateFilter();
         Filter dctFilter = new DCTFilter();
-        Filter ccittFaxFilter = new CCITTFaxDecodeFilter();
+        Filter ccittFaxFilter = new CCITTFaxFilter();
         Filter lzwFilter = new LZWFilter();
         Filter asciiHexFilter = new ASCIIHexFilter();
         Filter ascii85Filter = new ASCII85Filter();

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JBIG2Filter.java Thu Feb 20 06:31:01 2014
@@ -28,7 +28,6 @@ import java.util.Iterator;
 
 import javax.imageio.ImageIO;
 import javax.imageio.ImageReader;
-import javax.imageio.stream.ImageInputStream;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -38,87 +37,78 @@ import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSStream;
 
 /**
- * Modeled on the JBIG2Decode filter.
+ * Decompresses data encoded using the JBIG2 standard, reproducing the original
+ * monochrome (1 bit per pixel)  image data (or an approximation of that data).
  *
- * thanks to Timo Boehme <ti...@ontochem.com>
+ * Requires a JBIG2 plugin for Java Image I/O to be installed. A known working
+ * plug-in is <a href="http://code.google.com/p/jbig2-imageio/">jbig2-imageio</a>
+ * which is available under the GPL v3 license.
+ *
+ * @author Timo Boehme
  */
-
 public class JBIG2Filter implements Filter
 {
-
-    /** Log instance. */
     private static final Log LOG = LogFactory.getLog(JBIG2Filter.class);
 
     /**
      * Decode JBIG2 data using Java ImageIO library.
      *
      * {@inheritDoc}
-     *
      */
     @Override
-    public void decode(InputStream compressedData, OutputStream result, COSDictionary options, int filterIndex)
-            throws IOException
+    public void decode(InputStream compressedData, OutputStream result, COSDictionary options,
+                       int filterIndex) throws IOException
     {
-        /**
-         *  A working JBIG2 ImageIO plugin is needed to decode JBIG2 encoded streams.
-         *  The following is known to be working. It can't be bundled with PDFBox because of an incompatible license.
-         *  http://code.google.com/p/jbig2-imageio/ 
-         */
-        Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("JBIG2");
-        if (!readers.hasNext())
+        COSInteger bits = (COSInteger) options.getDictionaryObject(COSName.BITS_PER_COMPONENT);
+        COSDictionary params = (COSDictionary) options.getDictionaryObject(COSName.DECODE_PARMS);
+
+        COSStream globals = null;
+        if (params != null)
         {
-            LOG.error("Can't find an ImageIO plugin to decode the JBIG2 encoded datastream.");
-            return;
+            globals = (COSStream) params.getDictionaryObject(COSName.JBIG2_GLOBALS);
         }
-        ImageReader reader = readers.next();
-        COSDictionary decodeP = (COSDictionary) options.getDictionaryObject(COSName.DECODE_PARMS);
-        COSInteger bits = (COSInteger) options.getDictionaryObject(COSName.BITS_PER_COMPONENT);
-        COSStream st = null;
-        if (decodeP != null)
+
+        BufferedImage image;
+        if (globals != null)
         {
-            st = (COSStream) decodeP.getDictionaryObject(COSName.JBIG2_GLOBALS);
+            image = ImageIO.read(new SequenceInputStream(globals.getFilteredStream(),
+                    compressedData));
         }
-        if (st != null)
+        else
         {
-            compressedData = new SequenceInputStream(st.getFilteredStream(),
-                    compressedData);
-        }
-        ImageInputStream iis = ImageIO.createImageInputStream(compressedData);
-        reader.setInput(iis);
-        BufferedImage bi = reader.read(0);
-        iis.close();
-        reader.dispose();
-        if (bi != null)
-        {
-            // I am assuming since JBIG2 is always black and white
-            // depending on your renderer this might or might be needed
-            if (bi.getColorModel().getPixelSize() != bits.intValue())
-            {
-                if (bits.intValue() != 1)
-                {
-                    LOG.error("Do not know how to deal with JBIG2 with more than 1 bit");
-                    return;
-                }
-                BufferedImage packedImage = new BufferedImage(bi.getWidth(), bi.getHeight(),
-                        BufferedImage.TYPE_BYTE_BINARY);
-                Graphics graphics = packedImage.getGraphics();
-                graphics.drawImage(bi, 0, 0, null);
-                graphics.dispose();
-                bi = packedImage;
-            }
-            DataBuffer dBuf = bi.getData().getDataBuffer();
-            if (dBuf.getDataType() == DataBuffer.TYPE_BYTE)
-            {
-                result.write(((DataBufferByte) dBuf).getData());
-            }
-            else
+            image = ImageIO.read(compressedData);
+        }
+
+        if (image == null)
+        {
+            throw new MissingImageReaderException("Cannot read JBIG2 image: " +
+                    "jbig2-imageio is not installed");
+        }
+
+        // I am assuming since JBIG2 is always black and white
+        // depending on your renderer this might or might be needed
+        if (image.getColorModel().getPixelSize() != bits.intValue())
+        {
+            if (bits.intValue() != 1)
             {
-                LOG.error("Image data buffer not of type byte but type " + dBuf.getDataType());
+                LOG.warn("Attempting to handle a JBIG2 with more than 1-bit depth");
             }
+            BufferedImage packedImage = new BufferedImage(image.getWidth(), image.getHeight(),
+                    BufferedImage.TYPE_BYTE_BINARY);
+            Graphics graphics = packedImage.getGraphics();
+            graphics.drawImage(image, 0, 0, null);
+            graphics.dispose();
+            image = packedImage;
+        }
+
+        DataBuffer dBuf = image.getData().getDataBuffer();
+        if (dBuf.getDataType() == DataBuffer.TYPE_BYTE)
+        {
+            result.write(((DataBufferByte) dBuf).getData());
         }
         else
         {
-            LOG.error("Something went wrong when decoding the JBIG2 encoded datastream.");
+            throw new IOException("Unexpected image buffer type");
         }
     }
 
@@ -126,10 +116,9 @@ public class JBIG2Filter implements Filt
      * {@inheritDoc}
      */
     @Override
-    public void encode(InputStream rawData, OutputStream result, COSDictionary options, int filterIndex)
-            throws IOException
+    public void encode(InputStream rawData, OutputStream result, COSDictionary options,
+                       int filterIndex) throws IOException
     {
-        System.err.println("Warning: JBIG2.encode is not implemented yet, skipping this stream.");
+        throw new UnsupportedOperationException("JBIG2 encoding not implemented");
     }
-
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/JPXFilter.java Thu Feb 20 06:31:01 2014
@@ -17,73 +17,87 @@
 package org.apache.pdfbox.filter;
 
 import java.awt.image.BufferedImage;
-import java.awt.image.ColorModel;
 import java.awt.image.DataBuffer;
 import java.awt.image.DataBufferByte;
+import java.awt.image.WritableRaster;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
 import javax.imageio.ImageIO;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.cos.COSDictionary;
-import org.apache.pdfbox.cos.COSName;
-import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpaceFactory;
+import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.apache.pdfbox.pdmodel.graphics.color.PDJPXColorSpace;
 
 /**
- * This is used for the JPXDecode filter.
+ * Decompress data encoded using the wavelet-based JPEG 2000 standard,
+ * reproducing the original data.
  *
- * @author <a href="mailto:timo.boehme@ontochem.com">Timo Boehme</a>
+ * Requires the Java Advanced Imaging (JAI) Image I/O Tools to be installed from java.net, see
+ * <a href="http://download.java.net/media/jai-imageio/builds/release/1.1/">jai-imageio</a>.
+ * Alternatively you can build from the source available in the
+ * <a href="https://java.net/projects/jai-imageio-core/">jai-imageio-core svn repo</a>.
  *
+ * Mac OS X users should download the tar.gz file for linux and unpack it to obtain the
+ * required jar files. The .so file can be safely ignored.
+ *
+ * @author John Hewson
+ * @author Timo Boehme
  */
 public class JPXFilter implements Filter
 {
-
-    /** Log instance. */
-    private static final Log LOG = LogFactory.getLog(JPXFilter.class);
-
     /**
-     * Decode JPEG2000 data using Java ImageIO library.
+     * Decode JPEG 2000 data using Java ImageIO library.
      *
      * {@inheritDoc}
-     *
      */
-    public void decode(InputStream compressedData, OutputStream result, COSDictionary options, int filterIndex)
-            throws IOException
+    public void decode(InputStream compressedData, OutputStream result, COSDictionary options,
+                       int filterIndex) throws IOException
     {
-        BufferedImage bi = ImageIO.read(compressedData);
-        if (bi != null)
+        BufferedImage image = readJPX(compressedData);
+
+        WritableRaster raster = image.getRaster();
+        if (raster.getDataBuffer().getDataType() != DataBuffer.TYPE_BYTE)
         {
-            DataBuffer dBuf = bi.getData().getDataBuffer();
-            if (dBuf.getDataType() == DataBuffer.TYPE_BYTE)
-            {
-                // maybe some wrong/missing values have to be revised/added
-                ColorModel colorModel = bi.getColorModel();
-                if (options.getItem(COSName.COLORSPACE) == null)
-                {
-                    options.setItem(COSName.COLORSPACE,
-                            PDColorSpaceFactory.createColorSpace(null, colorModel.getColorSpace()));
-                }
-                options.setInt(COSName.BITS_PER_COMPONENT, colorModel.getPixelSize() / colorModel.getNumComponents());
-                options.setInt(COSName.HEIGHT, bi.getHeight());
-                options.setInt(COSName.WIDTH, bi.getWidth());
-                result.write(((DataBufferByte) dBuf).getData());
-            }
-            else
-            {
-                LOG.error("Image data buffer not of type byte but type " + dBuf.getDataType());
-            }
+            throw new IOException("Not implemented: greater than 8-bit depth");
         }
+        DataBufferByte buffer = (DataBufferByte)raster.getDataBuffer();
+        result.write(buffer.getData());
+    }
+
+    private static BufferedImage readJPX(InputStream input) throws IOException
+    {
+        // try to read using JAI Image I/O
+        ImageIO.setUseCache(false);
+        BufferedImage image = ImageIO.read(input);
+
+        if (image == null)
+        {
+            throw new MissingImageReaderException("Cannot read JPEG 2000 (JPX) image: " +
+                    "Java Advanced Imaging (JAI) Image I/O Tools are not installed");
+        }
+
+        return image;
+    }
+
+    /**
+     * Returns the embedded color space from a JPX file.
+     * @param input The JPX input stream
+     */
+    // TODO this method is something of a hack, we'd rather be able to return info from decode(...)
+    public static PDColorSpace getColorSpace(InputStream input) throws IOException
+    {
+        BufferedImage image = readJPX(input);
+        return new PDJPXColorSpace(image.getColorModel().getColorSpace());
     }
 
     /**
      * {@inheritDoc}
      */
-    public void encode(InputStream rawData, OutputStream result, COSDictionary options, int filterIndex)
-            throws IOException
+    public void encode(InputStream rawData, OutputStream result, COSDictionary options,
+                       int filterIndex) throws IOException
     {
-        LOG.error("Warning: JPXFilter.encode is not implemented yet, skipping this stream.");
+        throw new UnsupportedOperationException("JPX encoding not implemented");
     }
 }

Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/MissingImageReaderException.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/MissingImageReaderException.java?rev=1570086&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/MissingImageReaderException.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/MissingImageReaderException.java Thu Feb 20 06:31:01 2014
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.pdfbox.filter;
+
+import java.io.IOException;
+
+/**
+ * Thrown when a required JAI ImageReader is missing.
+ *
+ * @author John Hewson
+ */
+public class MissingImageReaderException extends IOException
+{
+    public MissingImageReaderException(String message)
+    {
+        super(message);
+    }
+}

Propchange: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/filter/MissingImageReaderException.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFStreamParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFStreamParser.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFStreamParser.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFStreamParser.java Thu Feb 20 06:31:01 2014
@@ -34,7 +34,6 @@ import org.apache.pdfbox.cos.COSObject;
 import org.apache.pdfbox.cos.COSStream;
 import org.apache.pdfbox.io.RandomAccess;
 import org.apache.pdfbox.pdmodel.common.PDStream;
-import org.apache.pdfbox.util.ImageParameters;
 import org.apache.pdfbox.util.PDFOperator;
 
 /**
@@ -360,7 +359,7 @@ public class PDFStreamParser extends Bas
                 {
                 	PDFOperator beginImageOP = (PDFOperator)retval;
                     COSDictionary imageParams = new COSDictionary();
-                    beginImageOP.setImageParameters( new ImageParameters( imageParams ) );
+                    beginImageOP.setImageParameters( imageParams );
                     Object nextToken = null;
                     while( (nextToken = parseNextToken()) instanceof COSName )
                     {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfviewer/PageDrawer.java Thu Feb 20 06:31:01 2014
@@ -66,6 +66,8 @@ import org.apache.pdfbox.pdmodel.font.PD
 import org.apache.pdfbox.pdmodel.font.PDType3Font;
 import org.apache.pdfbox.pdmodel.graphics.PDGraphicsState;
 import org.apache.pdfbox.pdmodel.graphics.PDShading;
+import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
+import org.apache.pdfbox.pdmodel.graphics.color.PDPattern;
 import org.apache.pdfbox.pdmodel.graphics.shading.AxialShadingPaint;
 import org.apache.pdfbox.pdmodel.graphics.shading.PDShadingResources;
 import org.apache.pdfbox.pdmodel.graphics.shading.PDShadingType2;
@@ -82,9 +84,9 @@ import org.apache.pdfbox.util.TextPositi
 
 /**
  * This will paint a page in a PDF document to a graphics context.
- *
+ * 
  * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
- *
+ * 
  */
 public class PageDrawer extends PDFStreamEngine
 {
@@ -183,12 +185,12 @@ public class PageDrawer extends PDFStrea
 
     /**
      * This will draw the page to the requested context.
-     * 
+     *
      * @param g The graphics context to draw onto.
      * @param stream The stream to be used.
      * @param resources resources to be used when drawing the stream
      * @param pageDimension The size of the page to draw.
-     * 
+     *
      * @throws IOException If there is an IO error while drawing the page.
      */
     public void drawStream(Graphics g, COSStream stream, PDResources resources, PDRectangle pageDimension)
@@ -240,25 +242,16 @@ public class PageDrawer extends PDFStrea
             {
             case PDTextState.RENDERING_MODE_FILL_TEXT:
                 composite = graphicsState.getNonStrokeJavaComposite();
-                paint = graphicsState.getNonStrokingColor().getJavaColor();
-                if (paint == null)
-                {
-                    paint = graphicsState.getNonStrokingColor().getPaint(pageHeight);
-                }
+                paint = getNonStrokingPaint();
                 break;
             case PDTextState.RENDERING_MODE_STROKE_TEXT:
                 composite = graphicsState.getStrokeJavaComposite();
-                paint = graphicsState.getStrokingColor().getJavaColor();
-                if (paint == null)
-                {
-                    paint = graphicsState.getStrokingColor().getPaint(pageHeight);
-                }
+                paint = getStrokingPaint();
                 break;
             case PDTextState.RENDERING_MODE_NEITHER_FILL_NOR_STROKE_TEXT:
                 // basic support for text rendering mode "invisible"
-                Color nsc = graphicsState.getStrokingColor().getJavaColor();
-                float[] components = { Color.black.getRed(), Color.black.getGreen(), Color.black.getBlue() };
-                paint = new Color(nsc.getColorSpace(), components, 0f);
+                // TODO why are we drawing anything at all?
+                paint = Color.BLACK;
                 composite = graphicsState.getStrokeJavaComposite();
                 break;
             default:
@@ -267,7 +260,7 @@ public class PageDrawer extends PDFStrea
                         + " in PageDrawer.processTextPosition()." + " Using RenderingMode "
                         + PDTextState.RENDERING_MODE_FILL_TEXT + " instead");
                 composite = graphicsState.getNonStrokeJavaComposite();
-                paint = graphicsState.getNonStrokingColor().getJavaColor();
+                paint = getNonStrokingPaint();
             }
             graphics.setComposite(composite);
             graphics.setPaint(paint);
@@ -378,8 +371,9 @@ public class PageDrawer extends PDFStrea
                 ctm.setFromAffineTransform(at);
                 getGraphicsState().setCurrentTransformationMatrix(ctm);
                 processSubStream(font.getType3Resources(), stream);
+
                 // restore the saved graphics state
-                setGraphicsState((PDGraphicsState) getGraphicsStack().pop());
+                setGraphicsState(getGraphicsStack().pop());
             }
             else
             {
@@ -431,7 +425,6 @@ public class PageDrawer extends PDFStrea
      * @return the corresponding AWT font
      * @throws IOException if something went wrong
      */
-
     private Font createAWTFont(PDSimpleFont font) throws IOException
     {
         Font awtFont = null;
@@ -482,7 +475,7 @@ public class PageDrawer extends PDFStrea
             {
                 // Fallback: we can't find anything, so we have to use the standard font
                 awtFont = FontManager.getStandardFont();
-                LOG.info("Using font " + awtFont.getName() + " instead");
+                LOG.info("Using font " + awtFont.getName() + " instead of " + font.getBaseFont());
                 font.setIsFontSubstituted(true);
             }
             awtFonts.put(font, awtFont);
@@ -627,15 +620,11 @@ public class PageDrawer extends PDFStrea
     public void fillPath(int windingRule) throws IOException
     {
         graphics.setComposite(getGraphicsState().getNonStrokeJavaComposite());
-        Paint nonStrokingPaint = getGraphicsState().getNonStrokingColor().getJavaColor();
+        Paint nonStrokingPaint = getNonStrokingPaint();
         if (nonStrokingPaint == null)
         {
-            nonStrokingPaint = getGraphicsState().getNonStrokingColor().getPaint(pageHeight);
-        }
-        if (nonStrokingPaint == null)
-        {
-            LOG.info("ColorSpace " + getGraphicsState().getNonStrokingColor().getColorSpace().getName()
-                    + " doesn't provide a non-stroking color, using white instead!");
+            LOG.info("ColorSpace " + getGraphicsState().getNonStrokingColorSpace().getName() +
+                     " doesn't provide a non-stroking color, using white instead!");
             nonStrokingPaint = Color.WHITE;
         }
         graphics.setPaint(nonStrokingPaint);
@@ -646,6 +635,20 @@ public class PageDrawer extends PDFStrea
         getLinePath().reset();
     }
 
+    // returns the stroking AWT Paint.
+    private Paint getStrokingPaint() throws IOException
+    {
+        return getGraphicsState().getStrokingColorSpace()
+                .toPaint(getGraphicsState().getStrokingColor(), pageHeight);
+    }
+
+    // returns the non-stroking AWT Paint.
+    private Paint getNonStrokingPaint() throws IOException
+    {
+        return getGraphicsState().getNonStrokingColorSpace()
+                .toPaint(getGraphicsState().getNonStrokingColor(), pageHeight);
+    }
+
     /**
      * This will set the current stroke.
      * 
@@ -676,15 +679,11 @@ public class PageDrawer extends PDFStrea
     public void strokePath() throws IOException
     {
         graphics.setComposite(getGraphicsState().getStrokeJavaComposite());
-        Paint strokingPaint = getGraphicsState().getStrokingColor().getJavaColor();
-        if (strokingPaint == null)
-        {
-            strokingPaint = getGraphicsState().getStrokingColor().getPaint(pageHeight);
-        }
+        Paint strokingPaint = getStrokingPaint();
         if (strokingPaint == null)
         {
-            LOG.info("ColorSpace " + getGraphicsState().getStrokingColor().getColorSpace().getName()
-                    + " doesn't provide a stroking color, using white instead!");
+            LOG.info("ColorSpace " + getGraphicsState().getStrokingColorSpace().getName() +
+                     " doesn't provide a stroking color, using white instead!");
             strokingPaint = Color.WHITE;
         }
         graphics.setPaint(strokingPaint);
@@ -695,22 +694,10 @@ public class PageDrawer extends PDFStrea
         path.reset();
     }
 
-    /**
-     * Called when the color changed.
-     * 
-     * @param bStroking true for the stroking color, false for the non-stroking color
-     * @throws IOException if an I/O error occurs
-     */
-    @Deprecated
-    public void colorChanged(boolean bStroking) throws IOException
-    {
-        // logger().info("changing " + (bStroking ? "" : "non") + "stroking color");
-    }
-
     // This code generalizes the code Jim Lynch wrote for AppendRectangleToPath
     /**
      * use the current transformation matrix to transform a single point.
-     * 
+     *
      * @param x x-coordinate of the point to be transform
      * @param y y-coordinate of the point to be transform
      * @return the transformed coordinates as Point2D.Double
@@ -798,24 +785,11 @@ public class PageDrawer extends PDFStrea
     /**
      * Fill with Shading. Called by SHFill operator.
      * 
-     * @param ShadingName The name of the Shading Dictionary to use for this fill instruction.
-     * 
-     * @throws IOException If there is an IO error while shade-filling the path/clipping area.
-     * 
-     * @deprecated use {@link #shFill(COSName)} instead.
-     */
-    public void SHFill(COSName ShadingName) throws IOException
-    {
-        shFill(ShadingName);
-    }
-
-    /**
-     * Fill with Shading. Called by SHFill operator.
-     * 
      * @param shadingName The name of the Shading Dictionary to use for this fill instruction.
      * 
      * @throws IOException If there is an IO error while shade-filling the clipping area.
      */
+    // TODO would this now be better off using PDPattern?
     public void shFill(COSName shadingName) throws IOException
     {
         PDShadingResources shading = getResources().getShadings().get(shadingName.getName());

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/ContentStreamWriter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/ContentStreamWriter.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/ContentStreamWriter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/ContentStreamWriter.java Thu Feb 20 06:31:01 2014
@@ -19,7 +19,6 @@ package org.apache.pdfbox.pdfwriter;
 import java.io.IOException;
 import java.io.OutputStream;
 
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -32,7 +31,6 @@ import org.apache.pdfbox.cos.COSInteger;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.cos.COSString;
 
-import org.apache.pdfbox.util.ImageParameters;
 import org.apache.pdfbox.util.PDFOperator;
 
 /**
@@ -141,8 +139,7 @@ public class ContentStreamWriter
             if( op.getOperation().equals( "BI" ) )
             {
                 output.write( "BI".getBytes("ISO-8859-1") );
-                ImageParameters params = op.getImageParameters();
-                COSDictionary dic = params.getDictionary();
+                COSDictionary dic = op.getImageParameters();
                 for( COSName key : dic.keySet() )
                 {
                     Object value = dic.getDictionaryObject( key );

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDResources.java Thu Feb 20 06:31:01 2014
@@ -32,11 +32,10 @@ import org.apache.pdfbox.pdmodel.font.PD
 import org.apache.pdfbox.pdmodel.font.PDFontFactory;
 import org.apache.pdfbox.pdmodel.graphics.PDExtendedGraphicsState;
 import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpace;
-import org.apache.pdfbox.pdmodel.graphics.color.PDColorSpaceFactory;
 import org.apache.pdfbox.pdmodel.graphics.pattern.PDPatternResources;
 import org.apache.pdfbox.pdmodel.graphics.shading.PDShadingResources;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObject;
-import org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage;
+import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
+import org.apache.pdfbox.pdmodel.graphics.PDXObject;
 import org.apache.pdfbox.pdmodel.markedcontent.PDPropertyList;
 import org.apache.pdfbox.util.MapUtil;
 
@@ -44,7 +43,6 @@ import org.apache.pdfbox.util.MapUtil;
  * This represents a set of resources available at the page/pages/stream level.
  * 
  * @author <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
- * @author By BM
  * 
  */
 public class PDResources implements COSObjectable
@@ -55,7 +53,7 @@ public class PDResources implements COSO
     private Map<String, PDColorSpace> colorspaces = null;
     private Map<String, PDXObject> xobjects = null;
     private Map<PDXObject, String> xobjectMappings = null;
-    private HashMap<String, PDXObjectImage> images = null;
+    private HashMap<String, PDImageXObject> images = null;
     private Map<String, PDExtendedGraphicsState> graphicsStates = null;
     private Map<String, PDPatternResources> patterns = null;
     private Map<String, PDShadingResources> shadings = null;
@@ -232,21 +230,24 @@ public class PDResources implements COSO
             // at least an empty map will be returned
             // TODO we should return null instead of an empty map
             xobjects = new HashMap<String, PDXObject>();
-            COSDictionary xobjectsDictionary = (COSDictionary) resources.getDictionaryObject(COSName.XOBJECT);
-            if (xobjectsDictionary == null)
+
+            COSDictionary dict = (COSDictionary) resources.getDictionaryObject(COSName.XOBJECT);
+
+            if (dict == null)
             {
-                xobjectsDictionary = new COSDictionary();
-                resources.setItem(COSName.XOBJECT, xobjectsDictionary);
+                dict = new COSDictionary();
+                resources.setItem(COSName.XOBJECT, dict);
             }
             else
             {
                 xobjects = new HashMap<String, PDXObject>();
-                for (COSName objName : xobjectsDictionary.keySet())
+                for (COSName objName : dict.keySet())
                 {
                     PDXObject xobject = null;
                     try
                     {
-                        xobject = PDXObject.createXObject(xobjectsDictionary.getDictionaryObject(objName));
+                        xobject = PDXObject.createXObject(dict.getDictionaryObject(objName),
+                                                          objName.getName(), this);
                     }
                     catch (IOException exception)
                     {
@@ -266,24 +267,24 @@ public class PDResources implements COSO
     /**
      * This will get the map of images. An empty map will be returned if there are no underlying images. So far the keys
      * are COSName of the image and the value is the corresponding PDXObjectImage.
-     * 
+     *
      * @return The map of images.
      * @throws IOException If there is an error writing the picture.
      * 
      * @deprecated use {@link #getXObjects()} instead, as the images map isn't synchronized with the XObjects map.
      */
-    public Map<String, PDXObjectImage> getImages() throws IOException
+    public Map<String, PDImageXObject> getImages() throws IOException
     {
         if (images == null)
         {
             Map<String, PDXObject> allXObjects = getXObjects();
-            images = new HashMap<String, PDXObjectImage>();
+            images = new HashMap<String, PDImageXObject>();
             for (Map.Entry<String, PDXObject> entry : allXObjects.entrySet())
             {
                 PDXObject xobject = entry.getValue();
-                if (xobject instanceof PDXObjectImage)
+                if (xobject instanceof PDImageXObject)
                 {
-                    images.put(entry.getKey(), (PDXObjectImage) xobject);
+                    images.put(entry.getKey(), (PDImageXObject) xobject);
                 }
             }
         }
@@ -350,7 +351,7 @@ public class PDResources implements COSO
                     PDColorSpace colorspace = null;
                     try
                     {
-                        colorspace = PDColorSpaceFactory.createColorSpace(cs);
+                        colorspace = PDColorSpace.create(cs, null, getPatterns());
                     }
                     catch (IOException exception)
                     {

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunction.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunction.java?rev=1570086&r1=1570085&r2=1570086&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunction.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/common/function/PDFunction.java Thu Feb 20 06:31:01 2014
@@ -248,23 +248,11 @@ public abstract class PDFunction impleme
         getDictionary().setItem(COSName.DOMAIN, domainValues);
     }
 
-
     /**
-     * Evaluates the function at the given input.
-     * ReturnValue = f(input)
-     *
-     * @param input The COSArray of input values for the function. 
-     * In many cases will be an array of a single value, but not always.
-     * 
-     * @return The of outputs the function returns based on those inputs. 
-     * In many cases will be an COSArray of a single value, but not always.
-     * 
-     * @throws IOException an IOExcpetion is thrown if something went wrong processing the function.
-     * 
+     * @deprecated Replaced by {@link #eval(float[] input)}
      */
     public COSArray eval(COSArray input) throws IOException
     {
-        // TODO should we mark this method as deprecated? 
         float[] outputValues = eval(input.toFloatArray());
         COSArray array = new COSArray();
         array.setFloatArray(outputValues);
@@ -371,4 +359,11 @@ public abstract class PDFunction impleme
         return yRangeMin + ((x - xRangeMin) * (yRangeMax - yRangeMin)/(xRangeMax - xRangeMin));
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    public String toString()
+    {
+        return "FunctionType" + getFunctionType();
+    }
 }