Skip to content

Commit

Permalink
[SEDONA-318] Avoid creating an unnecessary copy of raster data when s…
Browse files Browse the repository at this point in the history
…erializing rasters backed by BufferedImage (#906)
  • Loading branch information
Kontinuation committed Jul 17, 2023
1 parent 348a102 commit af3aac6
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,14 @@
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;
Expand Down Expand Up @@ -346,7 +348,19 @@ private void writeObject(ObjectOutputStream out) throws IOException {
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));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ public static byte[] serialize(GridCoverage2D raster) throws IOException {
if (renderedImage instanceof DeepCopiedRenderedImage) {
deepCopiedRenderedImage = renderedImage;
} else {
deepCopiedRenderedImage = new DeepCopiedRenderedImage(raster.getRenderedImage());
deepCopiedRenderedImage = new DeepCopiedRenderedImage(renderedImage);
}
raster = new GridCoverageFactory().create(
raster.getName(),
Expand Down

0 comments on commit af3aac6

Please sign in to comment.