Author: lehmi
Date: Wed Nov  2 08:54:30 2022
New Revision: 1904994

URL: http://svn.apache.org/viewvc?rev=1904994&view=rev
Log:
PDFBOX-5526: add region and subsampling to masks as proposed by Velislava 
Yanchina

Modified:
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
    
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java
    
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java
    
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java?rev=1904994&r1=1904993&r2=1904994&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
 Wed Nov  2 08:54:30 2022
@@ -462,13 +462,14 @@ public final class PDImageXObject extend
         if (softMask != null)
         {
             image = applyMask(SampledImageReader.getRGBImage(this, region, 
subsampling, getColorKeyMask()),
-                    softMask.getOpaqueImage(), softMask.getInterpolate(), 
true, extractMatte(softMask));
+                    softMask.getOpaqueImage(region, subsampling), 
softMask.getInterpolate(), true,
+                    extractMatte(softMask));
         }
         // explicit mask - to be applied only if /ImageMask true
         else if (mask != null && mask.isStencil())
         {
             image = applyMask(SampledImageReader.getRGBImage(this, region, 
subsampling, getColorKeyMask()),
-                    mask.getOpaqueImage(), mask.getInterpolate(), false, null);
+                    mask.getOpaqueImage(region, subsampling), 
mask.getInterpolate(), false, null);
         }
         else
         {
@@ -540,14 +541,33 @@ public final class PDImageXObject extend
     }
 
     /**
-     * Returns an RGB buffered image containing the opaque image stream 
without any masks applied.
-     * If this Image XObject is a mask then the buffered image will contain 
the raw mask.
+     * Returns an RGB buffered image containing the opaque image stream 
without any masks applied. If this Image XObject
+     * is a mask then the buffered image will contain the raw mask.
+     * 
      * @return the image without any masks applied
      * @throws IOException if the image cannot be read
      */
     public BufferedImage getOpaqueImage() throws IOException
     {
-        return SampledImageReader.getRGBImage(this, null);
+        return getOpaqueImage(null, 1);
+    }
+
+    /**
+     * Returns an RGB buffered image containing the opaque image stream 
without any masks applied. If this Image XObject
+     * is a mask then the buffered image will contain the raw mask.
+     * 
+     * @param region The region of the source image to get, or null if the 
entire image is needed. The actual region
+     * will be clipped to the dimensions of the source image.
+     * 
+     * @param subsampling The amount of rows and columns to advance for every 
output pixel, a value of 1 meaning every
+     * pixel will be read. It must not be larger than the image width or 
height.
+     * 
+     * @return the image without any masks applied
+     * @throws IOException if the image cannot be read
+     */
+    public BufferedImage getOpaqueImage(Rectangle region, int subsampling) 
throws IOException
+    {
+        return SampledImageReader.getRGBImage(this, region, subsampling, null);
     }
 
     /**

Modified: 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java?rev=1904994&r1=1904993&r2=1904994&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java
 Wed Nov  2 08:54:30 2022
@@ -78,7 +78,7 @@ class CCITTFactoryTest
             PDImageXObject ximage3 = CCITTFactory.createFromFile(document, new 
File(tiffG3Path));
             validate(ximage3, 1, 344, 287, "tiff", 
PDDeviceGray.INSTANCE.getName());
             BufferedImage bim3 = ImageIO.read(new File(tiffG3Path));
-            checkIdent(bim3, ximage3.getOpaqueImage());
+            checkIdent(bim3, ximage3.getOpaqueImage(null, 1));
             PDPage page = new PDPage(PDRectangle.A4);
             document.addPage(page);
             try (PDPageContentStream contentStream = new 
PDPageContentStream(document, page, AppendMode.APPEND, false))
@@ -89,7 +89,7 @@ class CCITTFactoryTest
             PDImageXObject ximage4 = CCITTFactory.createFromFile(document, new 
File(tiffG4Path));
             validate(ximage4, 1, 344, 287, "tiff", 
PDDeviceGray.INSTANCE.getName());
             BufferedImage bim4 = ImageIO.read(new File(tiffG3Path));
-            checkIdent(bim4, ximage4.getOpaqueImage());
+            checkIdent(bim4, ximage4.getOpaqueImage(null, 1));
             page = new PDPage(PDRectangle.A4);
             document.addPage(page);
             try (PDPageContentStream contentStream = new 
PDPageContentStream(document, page, AppendMode.APPEND, false))
@@ -133,7 +133,7 @@ class CCITTFactoryTest
                 }
                 BufferedImage bim = imageReader.read(pdfPageNum);
                 validate(ximage, 1, bim.getWidth(), bim.getHeight(), "tiff", 
PDDeviceGray.INSTANCE.getName());
-                checkIdent(bim, ximage.getOpaqueImage());
+                checkIdent(bim, ximage.getOpaqueImage(null, 1));
                 PDPage page = new PDPage(PDRectangle.A4);
                 float fX = ximage.getWidth() / page.getMediaBox().getWidth();
                 float fY = ximage.getHeight() / page.getMediaBox().getHeight();
@@ -168,7 +168,7 @@ class CCITTFactoryTest
             BufferedImage bim = ImageIO.read(new File(tiffG4Path));
             PDImageXObject ximage3 = CCITTFactory.createFromImage(document, 
bim);
             validate(ximage3, 1, 344, 287, "tiff", 
PDDeviceGray.INSTANCE.getName());
-            checkIdent(bim, ximage3.getOpaqueImage());
+            checkIdent(bim, ximage3.getOpaqueImage(null, 1));
 
             PDPage page = new PDPage(PDRectangle.A4);
             document.addPage(page);
@@ -205,7 +205,7 @@ class CCITTFactoryTest
             
             PDImageXObject ximage3 = CCITTFactory.createFromImage(document, 
bim);
             validate(ximage3, 1, 343, 287, "tiff", 
PDDeviceGray.INSTANCE.getName());
-            checkIdent(bim, ximage3.getOpaqueImage());
+            checkIdent(bim, ximage3.getOpaqueImage(null, 1));
             
             PDPage page = new PDPage(PDRectangle.A4);
             document.addPage(page);

Modified: 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java?rev=1904994&r1=1904993&r2=1904994&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java
 Wed Nov  2 08:54:30 2022
@@ -165,7 +165,7 @@ class LosslessFactoryTest
         PDImageXObject ximage = LosslessFactory.createFromImage(document, 
argbImage);
         validate(ximage, 8, argbImage.getWidth(), argbImage.getHeight(), 
"png", PDDeviceRGB.INSTANCE.getName());
         checkIdent(argbImage, ximage.getImage());
-        checkIdentRGB(argbImage, ximage.getOpaqueImage());
+        checkIdentRGB(argbImage, ximage.getOpaqueImage(null, 1));
 
         assertNotNull(ximage.getSoftMask());
         validate(ximage.getSoftMask(), 8, argbImage.getWidth(), 
argbImage.getHeight(), "png", PDDeviceGray.INSTANCE.getName());
@@ -239,7 +239,7 @@ class LosslessFactoryTest
 
         validate(ximage, 8, w, h, "png", PDDeviceRGB.INSTANCE.getName());
         checkIdent(argbImage, ximage.getImage());
-        checkIdentRGB(argbImage, ximage.getOpaqueImage());
+        checkIdentRGB(argbImage, ximage.getOpaqueImage(null, 1));
 
         assertNotNull(ximage.getSoftMask());
         validate(ximage.getSoftMask(), 8, w, h, "png", 
PDDeviceGray.INSTANCE.getName());
@@ -281,7 +281,7 @@ class LosslessFactoryTest
 
         validate(ximage, 8, w, h, "png", PDDeviceRGB.INSTANCE.getName());
         checkIdent(rgbImage, ximage.getImage());
-        checkIdentRGB(rgbImage, ximage.getOpaqueImage());
+        checkIdentRGB(rgbImage, ximage.getOpaqueImage(null, 1));
 
         assertNull(ximage.getSoftMask());
 
@@ -308,7 +308,7 @@ class LosslessFactoryTest
         int h = image.getHeight();
         validate(ximage, 8, w, h, "png", PDDeviceRGB.INSTANCE.getName());
         checkIdent(image, ximage.getImage());
-        checkIdentRGB(image, ximage.getOpaqueImage());
+        checkIdentRGB(image, ximage.getOpaqueImage(null, 1));
 
         assertNotNull(ximage.getSoftMask());
         validate(ximage.getSoftMask(), 1, w, h, "png", 
PDDeviceGray.INSTANCE.getName());
@@ -339,7 +339,7 @@ class LosslessFactoryTest
         int h = image.getHeight();
         validate(ximage, 8, w, h, "png", PDDeviceRGB.INSTANCE.getName());
         checkIdent(image, ximage.getImage());
-        checkIdentRGB(image, ximage.getOpaqueImage());
+        checkIdentRGB(image, ximage.getOpaqueImage(null, 1));
 
         assertNotNull(ximage.getSoftMask());
         validate(ximage.getSoftMask(), 1, w, h, "png", 
PDDeviceGray.INSTANCE.getName());
@@ -501,7 +501,7 @@ class LosslessFactoryTest
         PDImageXObject ximage = LosslessFactory.createFromImage(document, 
argbImage);
         validate(ximage, 8, width, height, "png", 
PDDeviceRGB.INSTANCE.getName());
         checkIdent(argbImage, ximage.getImage());
-        checkIdentRGB(argbImage, ximage.getOpaqueImage());
+        checkIdentRGB(argbImage, ximage.getOpaqueImage(null, 1));
 
         assertNotNull(ximage.getSoftMask());
         validate(ximage.getSoftMask(), 1, width, height, "png", 
PDDeviceGray.INSTANCE.getName());
@@ -662,7 +662,7 @@ class LosslessFactoryTest
         int h = image.getHeight();
         validate(ximage, 16, w, h, "png", PDDeviceRGB.INSTANCE.getName());
         checkIdent(image, ximage.getImage());
-        checkIdentRGB(image, ximage.getOpaqueImage());
+        checkIdentRGB(image, ximage.getOpaqueImage(null, 1));
         checkIdentRaw(image, ximage);
 
         assertNotNull(ximage.getSoftMask());

Modified: 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java?rev=1904994&r1=1904993&r2=1904994&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/ValidateXImage.java
 Wed Nov  2 08:54:30 2022
@@ -100,7 +100,7 @@ public class ValidateXImage
             writeOk = ImageIO.write(ximage.getImage(), format, new 
NullOutputStream());
             assertTrue(writeOk);
         }
-        writeOk = ImageIO.write(ximage.getOpaqueImage(), format, new 
NullOutputStream());
+        writeOk = ImageIO.write(ximage.getOpaqueImage(null, 1), format, new 
NullOutputStream());
         assertTrue(writeOk);
     }
     


Reply via email to