diff --git a/src/share/native/sun/java2d/loops/Blit.c b/src/share/native/sun/java2d/loops/Blit.c index 58f2b9462a5b22f52b58c5ed4f3364f7252c6919..d6302b319c52dbed763d05632a7061aba71b91b7 100644 --- a/src/share/native/sun/java2d/loops/Blit.c +++ b/src/share/native/sun/java2d/loops/Blit.c @@ -60,8 +60,11 @@ Java_sun_java2d_loops_Blit_Blit } srcOps = SurfaceData_GetOps(env, srcData); + if (srcOps == 0) { + return; + } dstOps = SurfaceData_GetOps(env, dstData); - if (srcOps == 0 || dstOps == 0) { + if (dstOps == 0) { return; } diff --git a/src/share/native/sun/java2d/loops/BlitBg.c b/src/share/native/sun/java2d/loops/BlitBg.c index 9738bec7984341bb04bdb0b7fe531aad74bae766..fe3ba39e0e02523da8727c320b3851103ccb256d 100644 --- a/src/share/native/sun/java2d/loops/BlitBg.c +++ b/src/share/native/sun/java2d/loops/BlitBg.c @@ -60,8 +60,11 @@ JNIEXPORT void JNICALL Java_sun_java2d_loops_BlitBg_BlitBg } srcOps = SurfaceData_GetOps(env, srcData); + if (srcOps == 0) { + return; + } dstOps = SurfaceData_GetOps(env, dstData); - if (srcOps == 0 || dstOps == 0) { + if (dstOps == 0) { return; } diff --git a/src/share/native/sun/java2d/loops/DrawPath.c b/src/share/native/sun/java2d/loops/DrawPath.c index 6b51eeedb62fb20ef7cf3b2498145ce1aa941a8b..d96c7f8f1bf2ff04265575b8bc17c8fa4d76e871 100644 --- a/src/share/native/sun/java2d/loops/DrawPath.c +++ b/src/share/native/sun/java2d/loops/DrawPath.c @@ -75,7 +75,8 @@ JNIEXPORT void JNICALL Java_sun_java2d_loops_DrawPath_DrawPath CompositeInfo compInfo; jint ret; NativePrimitive *pPrim = GetNativePrim(env, self); - jint stroke = (*env)->GetIntField(env, sg2d, sg2dStrokeHintID); + jint stroke; + jboolean throwExc = JNI_FALSE; if (pPrim == NULL) { return; @@ -84,6 +85,8 @@ JNIEXPORT void JNICALL Java_sun_java2d_loops_DrawPath_DrawPath GrPrim_Sg2dGetCompInfo(env, sg2d, pPrim, &compInfo); } + stroke = (*env)->GetIntField(env, sg2d, sg2dStrokeHintID); + sdOps = SurfaceData_GetOps(env, sData); if (sdOps == 0) { return; @@ -112,6 +115,10 @@ JNIEXPORT void JNICALL Java_sun_java2d_loops_DrawPath_DrawPath maxCoords = (*env)->GetArrayLength(env, coordsArray); coords = (jfloat*)(*env)->GetPrimitiveArrayCritical( env, coordsArray, NULL); + if (coords == NULL) { + SurfaceData_InvokeUnlock(env, sdOps, &rasInfo); + return; + } if (ret == SD_SLOWLOCK) { GrPrim_RefineBounds(&rasInfo.bounds, transX, transY, @@ -157,22 +164,29 @@ JNIEXPORT void JNICALL Java_sun_java2d_loops_DrawPath_DrawPath drawHandler.yMax = rasInfo.bounds.y2; drawHandler.pData = &dHData; - if (!doDrawPath(&drawHandler, NULL, transX, transY, - coords, maxCoords, types, numTypes, - (stroke == sunHints_INTVAL_STROKE_PURE)? - PH_STROKE_PURE : PH_STROKE_DEFAULT)) - { - JNU_ThrowArrayIndexOutOfBoundsException(env, - "coords array"); + if (types != NULL) { + if (!doDrawPath(&drawHandler, NULL, transX, transY, + coords, maxCoords, types, numTypes, + (stroke == sunHints_INTVAL_STROKE_PURE)? + PH_STROKE_PURE : PH_STROKE_DEFAULT)) + { + throwExc = JNI_TRUE; + } + + (*env)->ReleasePrimitiveArrayCritical(env, typesArray, types, + JNI_ABORT); } - - (*env)->ReleasePrimitiveArrayCritical(env, typesArray, types, - JNI_ABORT); } } SurfaceData_InvokeRelease(env, sdOps, &rasInfo); } (*env)->ReleasePrimitiveArrayCritical(env, coordsArray, coords, JNI_ABORT); + + if (throwExc) { + JNU_ThrowArrayIndexOutOfBoundsException(env, + "coords array"); + } + SurfaceData_InvokeUnlock(env, sdOps, &rasInfo); } diff --git a/src/share/native/sun/java2d/loops/DrawPolygons.c b/src/share/native/sun/java2d/loops/DrawPolygons.c index e7ab0a06f01d8957f2a9790f191ceba98e522ac4..5cec234620cda083ddadeb60a35410c51700fdd6 100644 --- a/src/share/native/sun/java2d/loops/DrawPolygons.c +++ b/src/share/native/sun/java2d/loops/DrawPolygons.c @@ -186,10 +186,15 @@ Java_sun_java2d_loops_DrawPolygons_DrawPolygons } xPointsPtr = (*env)->GetPrimitiveArrayCritical(env, xPointsArray, NULL); - yPointsPtr = (*env)->GetPrimitiveArrayCritical(env, yPointsArray, NULL); - if (!xPointsPtr || !yPointsPtr) { + if (!xPointsPtr) { ok = JNI_FALSE; } + if (ok) { + yPointsPtr = (*env)->GetPrimitiveArrayCritical(env, yPointsArray, NULL); + if (!yPointsPtr) { + ok = JNI_FALSE; + } + } } if (ok) { diff --git a/src/share/native/sun/java2d/loops/FillPath.c b/src/share/native/sun/java2d/loops/FillPath.c index 3411c579aa67e55745d6565b3149ef592ad03436..a7b77c09782205e0d5f3fcafc8e181de49650030 100644 --- a/src/share/native/sun/java2d/loops/FillPath.c +++ b/src/share/native/sun/java2d/loops/FillPath.c @@ -64,7 +64,8 @@ JNIEXPORT void JNICALL Java_sun_java2d_loops_FillPath_FillPath CompositeInfo compInfo; jint ret; NativePrimitive *pPrim = GetNativePrim(env, self); - jint stroke = (*env)->GetIntField(env, sg2d, sg2dStrokeHintID); + jint stroke; + jboolean throwExc = JNI_FALSE; if (pPrim == NULL) { return; @@ -73,6 +74,8 @@ JNIEXPORT void JNICALL Java_sun_java2d_loops_FillPath_FillPath GrPrim_Sg2dGetCompInfo(env, sg2d, pPrim, &compInfo); } + stroke = (*env)->GetIntField(env, sg2d, sg2dStrokeHintID); + sdOps = SurfaceData_GetOps(env, sData); if (sdOps == 0) { return; @@ -102,6 +105,10 @@ JNIEXPORT void JNICALL Java_sun_java2d_loops_FillPath_FillPath maxCoords = (*env)->GetArrayLength(env, coordsArray); coords = (jfloat*)(*env)->GetPrimitiveArrayCritical( env, coordsArray, NULL); + if (coords == NULL) { + SurfaceData_InvokeUnlock(env, sdOps, &rasInfo); + return; + } if (ret == SD_SLOWLOCK) { GrPrim_RefineBounds(&rasInfo.bounds, transX, transY, @@ -146,24 +153,31 @@ JNIEXPORT void JNICALL Java_sun_java2d_loops_FillPath_FillPath drawHandler.yMax = rasInfo.bounds.y2; drawHandler.pData = &dHData; - if (!doFillPath(&drawHandler, - transX, transY, coords, - maxCoords, types, numTypes, - (stroke == sunHints_INTVAL_STROKE_PURE)? - PH_STROKE_PURE : PH_STROKE_DEFAULT, - fillRule)) - { - JNU_ThrowArrayIndexOutOfBoundsException(env, - "coords array"); - } - - (*env)->ReleasePrimitiveArrayCritical(env, typesArray, types, + if (types != NULL) { + if (!doFillPath(&drawHandler, + transX, transY, coords, + maxCoords, types, numTypes, + (stroke == sunHints_INTVAL_STROKE_PURE)? + PH_STROKE_PURE : PH_STROKE_DEFAULT, + fillRule)) + { + throwExc = JNI_TRUE; + } + + (*env)->ReleasePrimitiveArrayCritical(env, typesArray, types, JNI_ABORT); + } } } SurfaceData_InvokeRelease(env, sdOps, &rasInfo); } (*env)->ReleasePrimitiveArrayCritical(env, coordsArray, coords, JNI_ABORT); + + if (throwExc) { + JNU_ThrowArrayIndexOutOfBoundsException(env, + "coords array"); + } + SurfaceData_InvokeUnlock(env, sdOps, &rasInfo); } diff --git a/src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.c b/src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.c index 7e323086c1acfb0f5ae365b0c19f03f7b938dc63..352a5ebeeca66d055c981cc98b5f84ab1b1a2c57 100644 --- a/src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.c +++ b/src/share/native/sun/java2d/loops/GraphicsPrimitiveMgr.c @@ -205,33 +205,36 @@ Java_sun_java2d_loops_GraphicsPrimitiveMgr_registerNativeLoops RegisterFunc RegisterFourByteAbgr; RegisterFunc RegisterFourByteAbgrPre; - RegisterAnyByte(env); - RegisterByteBinary1Bit(env); - RegisterByteBinary2Bit(env); - RegisterByteBinary4Bit(env); - RegisterByteIndexed(env); - RegisterByteGray(env); - RegisterIndex8Gray(env); - RegisterIndex12Gray(env); - RegisterAnyShort(env); - RegisterUshort555Rgb(env); - RegisterUshort565Rgb(env); - RegisterUshort4444Argb(env); - RegisterUshort555Rgbx(env); - RegisterUshortGray(env); - RegisterUshortIndexed(env); - RegisterAny3Byte(env); - RegisterThreeByteBgr(env); - RegisterAnyInt(env); - RegisterIntArgb(env); - RegisterIntArgbPre(env); - RegisterIntArgbBm(env); - RegisterIntRgb(env); - RegisterIntBgr(env); - RegisterIntRgbx(env); - RegisterAny4Byte(env); - RegisterFourByteAbgr(env); - RegisterFourByteAbgrPre(env); + if (!RegisterAnyByte(env) || + !RegisterByteBinary1Bit(env) || + !RegisterByteBinary2Bit(env) || + !RegisterByteBinary4Bit(env) || + !RegisterByteIndexed(env) || + !RegisterByteGray(env) || + !RegisterIndex8Gray(env) || + !RegisterIndex12Gray(env) || + !RegisterAnyShort(env) || + !RegisterUshort555Rgb(env) || + !RegisterUshort565Rgb(env) || + !RegisterUshort4444Argb(env) || + !RegisterUshort555Rgbx(env) || + !RegisterUshortGray(env) || + !RegisterUshortIndexed(env) || + !RegisterAny3Byte(env) || + !RegisterThreeByteBgr(env) || + !RegisterAnyInt(env) || + !RegisterIntArgb(env) || + !RegisterIntArgbPre(env) || + !RegisterIntArgbBm(env) || + !RegisterIntRgb(env) || + !RegisterIntBgr(env) || + !RegisterIntRgbx(env) || + !RegisterAny4Byte(env) || + !RegisterFourByteAbgr(env) || + !RegisterFourByteAbgrPre(env)) + { + return; + } } #define _StartOf(T) ((T *) (&T##s)) diff --git a/src/share/native/sun/java2d/loops/MaskBlit.c b/src/share/native/sun/java2d/loops/MaskBlit.c index 2c0234118030a5af0191cbc074dbfa3763f2a4f9..3463315bcf6cf74fb89a16b8766308c9e7aab0b7 100644 --- a/src/share/native/sun/java2d/loops/MaskBlit.c +++ b/src/share/native/sun/java2d/loops/MaskBlit.c @@ -60,8 +60,11 @@ Java_sun_java2d_loops_MaskBlit_MaskBlit } srcOps = SurfaceData_GetOps(env, srcData); + if (srcOps == 0) { + return; + } dstOps = SurfaceData_GetOps(env, dstData); - if (srcOps == 0 || dstOps == 0) { + if (dstOps == 0) { return; } @@ -96,6 +99,13 @@ Java_sun_java2d_loops_MaskBlit_MaskBlit (maskArray ? (*env)->GetPrimitiveArrayCritical(env, maskArray, 0) : 0); + if (maskArray != NULL && pMask == NULL) { + SurfaceData_InvokeRelease(env, dstOps, &dstInfo); + SurfaceData_InvokeRelease(env, srcOps, &srcInfo); + SurfaceData_InvokeUnlock(env, dstOps, &dstInfo); + SurfaceData_InvokeUnlock(env, srcOps, &srcInfo); + return; + } jint savesx = srcInfo.bounds.x1; jint savedx = dstInfo.bounds.x1; Region_StartIteration(env, &clipInfo); diff --git a/src/share/native/sun/java2d/loops/MaskFill.c b/src/share/native/sun/java2d/loops/MaskFill.c index 0003675d43cad2143a688dd013be063ac88f5558..2e5d3ed4e122a99951b82b168bc5e5ce9a0cc095 100644 --- a/src/share/native/sun/java2d/loops/MaskFill.c +++ b/src/share/native/sun/java2d/loops/MaskFill.c @@ -84,6 +84,11 @@ Java_sun_java2d_loops_MaskFill_MaskFill (maskArray ? (*env)->GetPrimitiveArrayCritical(env, maskArray, 0) : 0); + if (maskArray != NULL && pMask == NULL) { + SurfaceData_InvokeRelease(env, sdOps, &rasInfo); + SurfaceData_InvokeUnlock(env, sdOps, &rasInfo); + return; + } maskoff += ((rasInfo.bounds.y1 - y) * maskscan + (rasInfo.bounds.x1 - x)); (*pPrim->funcs.maskfill)(pDst, diff --git a/src/share/native/sun/java2d/loops/ScaledBlit.c b/src/share/native/sun/java2d/loops/ScaledBlit.c index 625c3662f3c2be767ad721d42e70df0ea6fa2df1..486a9842b607ac4847f7d63e347eb98dda8be2ec 100644 --- a/src/share/native/sun/java2d/loops/ScaledBlit.c +++ b/src/share/native/sun/java2d/loops/ScaledBlit.c @@ -296,8 +296,11 @@ Java_sun_java2d_loops_ScaledBlit_Scale } srcOps = SurfaceData_GetOps(env, srcData); + if (srcOps == 0) { + return; + } dstOps = SurfaceData_GetOps(env, dstData); - if (srcOps == 0 || dstOps == 0) { + if (dstOps == 0) { return; } diff --git a/src/share/native/sun/java2d/loops/TransformHelper.c b/src/share/native/sun/java2d/loops/TransformHelper.c index 7233455025088a5c6ce600d2da668c8754183926..6d53054ab9c2ac693119eaf09321bc50333d1cc8 100644 --- a/src/share/native/sun/java2d/loops/TransformHelper.c +++ b/src/share/native/sun/java2d/loops/TransformHelper.c @@ -326,8 +326,11 @@ Java_sun_java2d_loops_TransformHelper_Transform } srcOps = SurfaceData_GetOps(env, srcData); + if (srcOps == 0) { + return; + } dstOps = SurfaceData_GetOps(env, dstData); - if (srcOps == 0 || dstOps == 0) { + if (dstOps == 0) { return; } @@ -411,7 +414,7 @@ Java_sun_java2d_loops_TransformHelper_Transform } if (pEdges == NULL) { - if (numedges > 0) { + if (!(*env)->ExceptionCheck(env) && numedges > 0) { JNU_ThrowInternalError(env, "Unable to allocate edge list"); } SurfaceData_InvokeUnlock(env, dstOps, &dstInfo);