diff --git a/src/windows/native/sun/java2d/windows/GDIBlitLoops.cpp b/src/windows/native/sun/java2d/windows/GDIBlitLoops.cpp index d9d2a000b96ab1be8fe48091a5b8b86fb6dc28b0..d3dc21dae146533964006b41f974c4143b6ee90b 100644 --- a/src/windows/native/sun/java2d/windows/GDIBlitLoops.cpp +++ b/src/windows/native/sun/java2d/windows/GDIBlitLoops.cpp @@ -107,8 +107,16 @@ Java_sun_java2d_windows_GDIBlitLoops_nativeBlit // could retain their own DIB info and we would not need to // recreate it every time. + // GetRasInfo implicitly calls GetPrimitiveArrayCritical + // and since GetDC uses JNI it needs to be called first. + HDC hDC = dstOps->GetDC(env, dstOps, 0, NULL, clip, NULL, 0); + if (hDC == NULL) { + SurfaceData_InvokeUnlock(env, srcOps, &srcInfo); + return; + } srcOps->GetRasInfo(env, srcOps, &srcInfo); if (srcInfo.rasBase == NULL) { + dstOps->ReleaseDC(env, dstOps, hDC); SurfaceData_InvokeUnlock(env, srcOps, &srcInfo); return; } @@ -174,13 +182,6 @@ Java_sun_java2d_windows_GDIBlitLoops_nativeBlit bmi.colors.dwMasks[2] = bmask; } - HDC hDC = dstOps->GetDC(env, dstOps, 0, NULL, clip, NULL, 0); - if (hDC == NULL) { - SurfaceData_InvokeRelease(env, srcOps, &srcInfo); - SurfaceData_InvokeUnlock(env, srcOps, &srcInfo); - return; - } - if (fastBlt) { // Window could go away at any time, leaving bits on the screen // from this GDI call, so make sure window still exists