Mercurial > hg > icedtea7-forest > jdk
changeset 9213:d76d9a9720ef
8169209: Improved image post-processing steps
Reviewed-by: serb, vadim, mschoene
author | prr |
---|---|
date | Fri, 17 Mar 2017 16:41:06 -0700 |
parents | 4f11e3edecf9 |
children | acd986bf1ba5 |
files | src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java src/share/native/sun/awt/image/jpeg/imageioJPEG.c |
diffstat | 2 files changed, 37 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java Fri Jul 14 15:42:34 2017 +0100 +++ b/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java Fri Mar 17 16:41:06 2017 -0700 @@ -387,6 +387,17 @@ } } + private void skipPastImage(int imageIndex) { + cbLock.lock(); + try { + gotoImage(imageIndex); + skipImage(); + } catch (IOException | IndexOutOfBoundsException e) { + } finally { + cbLock.unlock(); + } + } + private int getNumImagesOnThread(boolean allowSearch) throws IOException { if (numImages != 0) { @@ -1228,7 +1239,8 @@ // Note that getData disables acceleration on buffer, but it is // just a 1-line intermediate data transfer buffer that will not // affect the acceleration of the resulting image. - aborted = readImage(structPointer, + aborted = readImage(imageIndex, + structPointer, buffer.getData(), numRasterBands, srcBands, @@ -1390,7 +1402,8 @@ /** * Returns <code>true</code> if the read was aborted. */ - private native boolean readImage(long structPointer, + private native boolean readImage(int imageIndex, + long structPointer, byte [] buffer, int numRasterBands, int [] srcBands,
--- a/src/share/native/sun/awt/image/jpeg/imageioJPEG.c Fri Jul 14 15:42:34 2017 +0100 +++ b/src/share/native/sun/awt/image/jpeg/imageioJPEG.c Fri Mar 17 16:41:06 2017 -0700 @@ -66,6 +66,7 @@ static jmethodID JPEGImageReader_pushBackID; static jmethodID JPEGImageReader_passStartedID; static jmethodID JPEGImageReader_passCompleteID; +static jmethodID JPEGImageReader_skipPastImageID; static jmethodID JPEGImageWriter_writeOutputDataID; static jmethodID JPEGImageWriter_warningOccurredID; static jmethodID JPEGImageWriter_warningWithMessageID; @@ -1466,6 +1467,10 @@ cls, "pushBack", "(I)V")); + CHECK_NULL(JPEGImageReader_skipPastImageID = (*env)->GetMethodID(env, + cls, + "skipPastImage", + "(I)V")); CHECK_NULL(JPEGQTable_tableID = (*env)->GetFieldID(env, qTableClass, "qTable", @@ -1843,6 +1848,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_readImage (JNIEnv *env, jobject this, + jint imageIndex, jlong ptr, jbyteArray buffer, jint numBands, @@ -2172,12 +2178,23 @@ * We are done, but we might not have read all the lines, or all * the passes, so use jpeg_abort instead of jpeg_finish_decompress. */ - if (cinfo->output_scanline == cinfo->output_height) { - // if ((cinfo->output_scanline == cinfo->output_height) && - //(jpeg_input_complete(cinfo))) { // We read the whole file + if ((cinfo->output_scanline != cinfo->output_height) || + data->abortFlag == JNI_TRUE) + { + jpeg_abort_decompress(cinfo); + } else if ((!jpeg_input_complete(cinfo)) && + (progressive && + (cinfo->input_scan_number > maxProgressivePass))) { + /* We haven't reached EOI, but we need to skip to there */ + (*cinfo->src->term_source) (cinfo); + /* We can use jpeg_abort to release memory and reset global_state */ + jpeg_abort((j_common_ptr) cinfo); + (*env)->CallVoidMethod(env, + this, + JPEGImageReader_skipPastImageID, + imageIndex); + } else { jpeg_finish_decompress(cinfo); - } else { - jpeg_abort_decompress(cinfo); } free(scanLinePtr);