Mercurial > hg > openjdk > jdk6 > jdk
changeset 1691:313efadc3fd0
8169209: Improved image post-processing steps
Reviewed-by: serb, vadim, mschoene
author | prr |
---|---|
date | Fri, 17 Mar 2017 16:41:06 -0700 |
parents | 1b1639972b4d |
children | 8de5ec810a96 |
files | src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java src/share/native/sun/awt/image/jpeg/imageioJPEG.c |
diffstat | 2 files changed, 38 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java Thu Oct 06 09:19:32 2016 -0700 +++ b/src/share/classes/com/sun/imageio/plugins/jpeg/JPEGImageReader.java Fri Mar 17 16:41:06 2017 -0700 @@ -386,6 +386,18 @@ } } + private void skipPastImage(int imageIndex) { + cbLock.lock(); + try { + gotoImage(imageIndex); + skipImage(); + } catch (IOException e) { + } catch (IndexOutOfBoundsException e) { + } finally { + cbLock.unlock(); + } + } + private int getNumImagesOnThread(boolean allowSearch) throws IOException { if (numImages != 0) { @@ -1216,7 +1228,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, @@ -1378,7 +1391,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 Thu Oct 06 09:19:32 2016 -0700 +++ b/src/share/native/sun/awt/image/jpeg/imageioJPEG.c Fri Mar 17 16:41:06 2017 -0700 @@ -67,6 +67,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; @@ -1444,6 +1445,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", @@ -1821,6 +1826,7 @@ Java_com_sun_imageio_plugins_jpeg_JPEGImageReader_readImage (JNIEnv *env, jobject this, + jint imageIndex, jlong ptr, jbyteArray buffer, jint numBands, @@ -2152,12 +2158,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);