]> source.dussan.org Git - poi.git/commitdiff
Reduce allocations and copying when extracting PNGs created by Mac
authorMarius Volkhart <mariusvolkhart@apache.org>
Fri, 1 Oct 2021 12:07:10 +0000 (12:07 +0000)
committerMarius Volkhart <mariusvolkhart@apache.org>
Fri, 1 Oct 2021 12:07:10 +0000 (12:07 +0000)
This logic is covered by the TestHSSFPictureData#testMacPicture() test.

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

poi/src/main/java/org/apache/poi/sl/image/ImageHeaderPNG.java

index 4a6b728fd372ff09b83a5ae60cd89a1d5073c237..d3ed5a0f0eda414600081dc59a66a7670672f401 100644 (file)
 package org.apache.poi.sl.image;
 
 
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.apache.commons.io.input.UnsynchronizedByteArrayInputStream;
 import org.apache.poi.poifs.filesystem.FileMagic;
-import org.apache.poi.util.IOUtils;
-import org.apache.poi.util.RecordFormatException;
+
+import java.util.Arrays;
 
 public final class ImageHeaderPNG {
 
     private static final int MAGIC_OFFSET = 16;
 
-    private byte[] data;
+    private final byte[] data;
 
     /**
      * @param data The raw image data
@@ -46,12 +42,11 @@ public final class ImageHeaderPNG {
     public byte[] extractPNG() {
         //
         //Just cut it off!.
-        try (InputStream is = new UnsynchronizedByteArrayInputStream(data)) {
-            if (is.skip(MAGIC_OFFSET) == MAGIC_OFFSET && FileMagic.valueOf(is) == FileMagic.PNG) {
-                return IOUtils.toByteArray(is);
+        if (data.length >= MAGIC_OFFSET) {
+            byte[] newData = Arrays.copyOfRange(data, MAGIC_OFFSET, data.length);
+            if (FileMagic.valueOf(newData) == FileMagic.PNG) {
+                return newData;
             }
-        } catch (IOException e) {
-            throw new RecordFormatException("Unable to parse PNG header", e);
         }
 
         return data;