summaryrefslogtreecommitdiff
path: root/java/openjdk6/files/icedtea/openjdk/8014102-improve_image_conversion.patch
diff options
context:
space:
mode:
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.patch190
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;
+ }
+ }