Author: tilman
Date: Mon Sep  7 08:13:52 2026
New Revision: 1937949

Log:
PDFBOX-5876: add test for PDFBOX-5657

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/PDImageXObjectTest.java

Modified: 
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/PDImageXObject.java
      Mon Sep  7 08:05:49 2026        (r1937948)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObject.java
      Mon Sep  7 08:13:52 2026        (r1937949)
@@ -84,6 +84,9 @@ public final class PDImageXObject extend
     private boolean jpxValuesInitialized = false;
     private BufferedImage jpxSMask = null;
 
+    // PDFBOX-5876: upper bound for the subsampling used by initJPXValues 
method.
+    private static final int JPX_METADATA_SUBSAMPLING = 8;
+
     /**
      * current resource dictionary (has color spaces)
      */
@@ -1067,4 +1070,14 @@ public final class PDImageXObject extend
     {
         getCOSObject().setItem(COSName.OC, oc);
     }
+
+    /**
+     * Use for tests only.
+     *
+     * @return 
+     */
+    BufferedImage getJpxSMask()
+    {
+        return jpxSMask;
+    }    
 }

Modified: 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObjectTest.java
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObjectTest.java
  Mon Sep  7 08:05:49 2026        (r1937948)
+++ 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/PDImageXObjectTest.java
  Mon Sep  7 08:13:52 2026        (r1937949)
@@ -24,6 +24,8 @@ import java.awt.image.ColorModel;
 import java.awt.image.WritableRaster;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
@@ -34,6 +36,9 @@ import java.net.URISyntaxException;
 import javax.imageio.ImageIO;
 
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.Loader;
+import org.apache.pdfbox.cos.COSName;
+
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.parallel.Execution;
 import org.junit.jupiter.api.parallel.ExecutionMode;
@@ -257,6 +262,26 @@ class PDImageXObjectTest
         }
     }
 
+    /**
+     * PDFBOX-5657: test SMaskInData feature.
+     *
+     * @throws IOException 
+     */
+    @Test
+    void testJPXSMaskInData() throws IOException
+    {
+        PDDocument doc = Loader.loadPDF(new 
File("target/pdfs","PDFBOX-5657-PDFJS-16782-SMaskInData.pdf"));
+        PDImageXObject img = (PDImageXObject) 
doc.getPage(0).getResources().getXObject(COSName.getPDFName("image"));
+        assertTrue(img.getCOSObject().getInt(COSName.SMASK_IN_DATA) > 0);
+        assertNull(img.getMask());
+        assertNull(img.getSoftMask());
+        assertEquals(3, 
img.getOpaqueImage().getColorModel().getNumComponents());
+        assertEquals(4, img.getImage().getColorModel().getNumComponents());
+        BufferedImage jpxSMask = img.getJpxSMask();
+        assertEquals(1258, jpxSMask.getWidth());
+        assertEquals(711, jpxSMask.getHeight());
+    }
+
     private void testCompareCreateByContentWithCreatedByCCITTFactory(String 
filename)
             throws IOException, URISyntaxException
     {

Reply via email to