Some more TIFF performance enhancements. Make getSamplesAsBytes()
use a preallocated array instead of allocating a new one on each
pixel. Also simplifies an if statement so there's less work done
per pixel. This reduces the running time by about 20%, and shortens
the total time taken by tests run by "mvn package" by about 5%.
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/sanselan/trunk@1293744 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/datareaders/DataReader.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/datareaders/DataReader.java
index f715d5e..7e1c0b3 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/datareaders/DataReader.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/datareaders/DataReader.java
@@ -64,10 +64,15 @@
public abstract void readImageData(ImageBuilder imageBuilder)
throws ImageReadException, IOException;
- protected int[] getSamplesAsBytes(BitInputStream bis)
+ /**
+ * Reads samples and returns them in an int array.
+ * @param bis the stream to read from
+ * @param result the samples array to populate, must be the same length as bitsPerSample.length
+ * @throws IOException
+ */
+ protected void getSamplesAsBytes(BitInputStream bis, int[] result)
throws IOException
{
- int result[] = new int[bitsPerSample.length];
for (int i = 0; i < bitsPerSample.length; i++)
{
int bits = bitsPerSample[i];
@@ -85,8 +90,6 @@
}
result[i] = sample;
}
-
- return result;
}
protected int[] applyPredictor(int samples[], int x)
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/datareaders/DataReaderStrips.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/datareaders/DataReaderStrips.java
index d72ad51..4b8a9a7 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/datareaders/DataReaderStrips.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/datareaders/DataReaderStrips.java
@@ -55,11 +55,15 @@
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
BitInputStream bis = new BitInputStream(bais);
+ if (y >= height) {
+ return;
+ }
+ int[] samples = new int[bitsPerSample.length];
for (int i = 0; i < pixels_per_strip; i++)
{
- int samples[] = getSamplesAsBytes(bis);
+ getSamplesAsBytes(bis, samples);
- if ((x < width) && (y < height))
+ if (x < width)
{
samples = applyPredictor(samples, x);
diff --git a/src/main/java/org/apache/commons/sanselan/formats/tiff/datareaders/DataReaderTiled.java b/src/main/java/org/apache/commons/sanselan/formats/tiff/datareaders/DataReaderTiled.java
index 0b4a075..55f416b 100644
--- a/src/main/java/org/apache/commons/sanselan/formats/tiff/datareaders/DataReaderTiled.java
+++ b/src/main/java/org/apache/commons/sanselan/formats/tiff/datareaders/DataReaderTiled.java
@@ -65,13 +65,14 @@
int tileX = 0, tileY = 0;
+ int[] samples = new int[bitsPerSample.length];
for (int i = 0; i < pixelsPerTile; i++)
{
int x = tileX + startX;
int y = tileY + startY;
- int samples[] = getSamplesAsBytes(bis);
+ getSamplesAsBytes(bis, samples);
if ((x < width) && (y < height))
{