diff options
Diffstat (limited to 'java/openjdk6/files/icedtea/openjdk/8014102-improve_image_conversion.patch')
-rw-r--r-- | java/openjdk6/files/icedtea/openjdk/8014102-improve_image_conversion.patch | 190 |
1 files changed, 190 insertions, 0 deletions
diff --git a/java/openjdk6/files/icedtea/openjdk/8014102-improve_image_conversion.patch b/java/openjdk6/files/icedtea/openjdk/8014102-improve_image_conversion.patch new file mode 100644 index 000000000000..d49c301836ea --- /dev/null +++ b/java/openjdk6/files/icedtea/openjdk/8014102-improve_image_conversion.patch @@ -0,0 +1,190 @@ +# HG changeset patch +# User bae +# Date 1369130199 -14400 +# Tue May 21 13:56:39 2013 +0400 +# Node ID d55d40616754cd93aa396719ddfd81bae584d4f0 +# Parent 5405d79569f76d1285fd3c840489477a81bd9eff +8014102: Improve image conversion +Reviewed-by: prr + +diff -r 5405d79569f7 -r d55d40616754 src/share/native/sun/awt/medialib/awt_ImagingLib.c +--- jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Fri May 17 16:47:51 2013 +0400 ++++ jdk/src/share/native/sun/awt/medialib/awt_ImagingLib.c Tue May 21 13:56:39 2013 +0400 +@@ -1986,21 +1986,25 @@ + return 0; + } + ++#define NUM_LINES 10 ++ + static int + cvtCustomToDefault(JNIEnv *env, BufImageS_t *imageP, int component, + unsigned char *dataP) { +- ColorModelS_t *cmP = &imageP->cmodel; +- RasterS_t *rasterP = &imageP->raster; ++ const RasterS_t *rasterP = &imageP->raster; ++ const int w = rasterP->width; ++ const int h = rasterP->height; ++ + int y; +- jobject jpixels = NULL; ++ jintArray jpixels = NULL; + jint *pixels; + unsigned char *dP = dataP; +-#define NUM_LINES 10 +- int numLines = NUM_LINES; ++ int numLines = h > NUM_LINES ? NUM_LINES : h; ++ + /* it is safe to calculate the scan length, because width has been verified + * on creation of the mlib image + */ +- int scanLength = rasterP->width * 4; ++ const int scanLength = w * 4; + + int nbytes = 0; + if (!SAFE_TO_MULT(numLines, scanLength)) { +@@ -2009,71 +2013,99 @@ + + nbytes = numLines * scanLength; + +- for (y=0; y < rasterP->height; y+=numLines) { +- /* getData, one scanline at a time */ +- if (y+numLines > rasterP->height) { +- numLines = rasterP->height - y; +- nbytes = numLines * scanLength; +- } +- jpixels = (*env)->CallObjectMethod(env, imageP->jimage, +- g_BImgGetRGBMID, 0, y, +- rasterP->width, numLines, +- jpixels,0, rasterP->width); +- if (jpixels == NULL) { +- JNU_ThrowInternalError(env, "Can't retrieve pixels."); +- return -1; +- } +- +- pixels = (*env)->GetPrimitiveArrayCritical(env, jpixels, NULL); +- memcpy(dP, pixels, nbytes); +- dP += nbytes; +- (*env)->ReleasePrimitiveArrayCritical(env, jpixels, pixels, +- JNI_ABORT); +- } +- return 0; +-} +- +-static int +-cvtDefaultToCustom(JNIEnv *env, BufImageS_t *imageP, int component, +- unsigned char *dataP) { +- ColorModelS_t *cmP = &imageP->cmodel; +- RasterS_t *rasterP = &imageP->raster; +- int y; +- jint *pixels; +- unsigned char *dP = dataP; +-#define NUM_LINES 10 +- int numLines = NUM_LINES; +- int nbytes = rasterP->width*4*NUM_LINES; +- jintArray jpixels; +- + jpixels = (*env)->NewIntArray(env, nbytes); + if (JNU_IsNull(env, jpixels)) { + JNU_ThrowOutOfMemoryError(env, "Out of Memory"); + return -1; + } + +- for (y=0; y < rasterP->height; y+=NUM_LINES) { +- if (y+numLines > rasterP->height) { +- numLines = rasterP->height - y; +- nbytes = rasterP->width*4*numLines; ++ for (y = 0; y < h; y += numLines) { ++ if (y + numLines > h) { ++ numLines = h - y; ++ nbytes = numLines * scanLength; + } ++ ++ (*env)->CallObjectMethod(env, imageP->jimage, ++ g_BImgGetRGBMID, 0, y, ++ w, numLines, ++ jpixels, 0, w); ++ if ((*env)->ExceptionOccurred(env)) { ++ (*env)->DeleteLocalRef(env, jpixels); ++ return -1; ++ } ++ + pixels = (*env)->GetPrimitiveArrayCritical(env, jpixels, NULL); + if (pixels == NULL) { +- /* JNI error */ ++ (*env)->DeleteLocalRef(env, jpixels); + return -1; + } + ++ memcpy(dP, pixels, nbytes); ++ dP += nbytes; ++ ++ (*env)->ReleasePrimitiveArrayCritical(env, jpixels, pixels, ++ JNI_ABORT); ++ } ++ ++ /* Need to release the array */ ++ (*env)->DeleteLocalRef(env, jpixels); ++ ++ return 0; ++} ++ ++static int ++cvtDefaultToCustom(JNIEnv *env, BufImageS_t *imageP, int component, ++ unsigned char *dataP) { ++ const RasterS_t *rasterP = &imageP->raster; ++ const int w = rasterP->width; ++ const int h = rasterP->height; ++ ++ int y; ++ jintArray jpixels = NULL; ++ jint *pixels; ++ unsigned char *dP = dataP; ++ int numLines = h > NUM_LINES ? NUM_LINES : h; ++ ++ /* it is safe to calculate the scan length, because width has been verified ++ * on creation of the mlib image ++ */ ++ const int scanLength = w * 4; ++ ++ int nbytes = 0; ++ if (!SAFE_TO_MULT(numLines, scanLength)) { ++ return -1; ++ } ++ ++ nbytes = numLines * scanLength; ++ ++ jpixels = (*env)->NewIntArray(env, nbytes); ++ if (JNU_IsNull(env, jpixels)) { ++ JNU_ThrowOutOfMemoryError(env, "Out of Memory"); ++ return -1; ++ } ++ ++ for (y = 0; y < h; y += numLines) { ++ if (y + numLines > h) { ++ numLines = h - y; ++ nbytes = numLines * scanLength; ++ } ++ ++ pixels = (*env)->GetPrimitiveArrayCritical(env, jpixels, NULL); ++ if (pixels == NULL) { ++ (*env)->DeleteLocalRef(env, jpixels); ++ return -1; ++ } ++ + memcpy(pixels, dP, nbytes); + dP += nbytes; + + (*env)->ReleasePrimitiveArrayCritical(env, jpixels, pixels, 0); + +- /* setData, one scanline at a time */ +- /* Fix 4223648, 4184283 */ + (*env)->CallVoidMethod(env, imageP->jimage, g_BImgSetRGBMID, 0, y, +- rasterP->width, numLines, jpixels, 0, +- rasterP->width); ++ w, numLines, jpixels, ++ 0, w); + if ((*env)->ExceptionOccurred(env)) { ++ (*env)->DeleteLocalRef(env, jpixels); + return -1; + } + } |