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(),