This is an automated email from the ASF dual-hosted git repository.

jiayu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sedona.git


The following commit(s) were added to refs/heads/master by this push:
     new af3aac6f [SEDONA-318] Avoid creating an unnecessary copy of raster 
data when serializing rasters backed by BufferedImage (#906)
af3aac6f is described below

commit af3aac6f613561fd7502edef7ad1b2eb3fe155b8
Author: Kristin Cowalcijk <[email protected]>
AuthorDate: Mon Jul 17 21:32:37 2023 +0800

    [SEDONA-318] Avoid creating an unnecessary copy of raster data when 
serializing rasters backed by BufferedImage (#906)
---
 .../sedona/common/raster/DeepCopiedRenderedImage.java    | 16 +++++++++++++++-
 .../main/java/org/apache/sedona/common/raster/Serde.java |  2 +-
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git 
a/common/src/main/java/org/apache/sedona/common/raster/DeepCopiedRenderedImage.java
 
b/common/src/main/java/org/apache/sedona/common/raster/DeepCopiedRenderedImage.java
index baf62a86..e4ba2141 100644
--- 
a/common/src/main/java/org/apache/sedona/common/raster/DeepCopiedRenderedImage.java
+++ 
b/common/src/main/java/org/apache/sedona/common/raster/DeepCopiedRenderedImage.java
@@ -20,12 +20,14 @@ import javax.media.jai.PlanarImage;
 import javax.media.jai.RasterAccessor;
 import javax.media.jai.RasterFormatTag;
 import javax.media.jai.RemoteImage;
+import javax.media.jai.RenderedImageAdapter;
 import javax.media.jai.TileCache;
 import javax.media.jai.remote.SerializableState;
 import javax.media.jai.remote.SerializerFactory;
 import java.awt.Image;
 import java.awt.Point;
 import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
 import java.awt.image.ColorModel;
 import java.awt.image.DataBuffer;
 import java.awt.image.Raster;
@@ -346,7 +348,19 @@ public final class DeepCopiedRenderedImage implements 
RenderedImage, Serializabl
         out.writeObject(SerializerFactory.getState(this.colorModel, null));
         out.writeObject(propertyTable);
         if (this.source != null) {
-            out.writeObject(SerializerFactory.getState(this.source.getData(), 
null));
+            Raster serializedRaster = null;
+            RenderedImage serializedImage = this.source;
+            while (serializedImage instanceof RenderedImageAdapter) {
+                serializedImage = ((RenderedImageAdapter) 
serializedImage).getWrappedImage();
+            }
+            if (serializedImage instanceof BufferedImage) {
+                // This is a fast path for BufferedImage. If we call getData() 
directly, it will make a
+                // hard copy of the raster. We can avoid this overhead by 
calling getRaster().
+                serializedRaster = ((BufferedImage) 
serializedImage).getRaster();
+            } else {
+                serializedRaster = serializedImage.getData();
+            }
+            out.writeObject(SerializerFactory.getState(serializedRaster, 
null));
         } else {
             out.writeObject(SerializerFactory.getState(imageRaster, null));
         }
diff --git a/common/src/main/java/org/apache/sedona/common/raster/Serde.java 
b/common/src/main/java/org/apache/sedona/common/raster/Serde.java
index 9ca3959d..10483b65 100644
--- a/common/src/main/java/org/apache/sedona/common/raster/Serde.java
+++ b/common/src/main/java/org/apache/sedona/common/raster/Serde.java
@@ -50,7 +50,7 @@ public class Serde {
         if (renderedImage instanceof DeepCopiedRenderedImage) {
             deepCopiedRenderedImage = renderedImage;
         } else {
-            deepCopiedRenderedImage = new 
DeepCopiedRenderedImage(raster.getRenderedImage());
+            deepCopiedRenderedImage = new 
DeepCopiedRenderedImage(renderedImage);
         }
         raster = new GridCoverageFactory().create(
                 raster.getName(),

Reply via email to