aboutsummaryrefslogtreecommitdiff
path: root/src/share/native/sun/java2d/pipe/BufferedMaskBlit.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/share/native/sun/java2d/pipe/BufferedMaskBlit.c')
-rw-r--r--src/share/native/sun/java2d/pipe/BufferedMaskBlit.c89
1 files changed, 46 insertions, 43 deletions
diff --git a/src/share/native/sun/java2d/pipe/BufferedMaskBlit.c b/src/share/native/sun/java2d/pipe/BufferedMaskBlit.c
index 42933cd06..c11172bc6 100644
--- a/src/share/native/sun/java2d/pipe/BufferedMaskBlit.c
+++ b/src/share/native/sun/java2d/pipe/BufferedMaskBlit.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2007 Sun Microsystems, Inc. All Rights Reserved.
+ * Copyright 2007-2008 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -59,7 +59,6 @@ Java_sun_java2d_pipe_BufferedMaskBlit_enqueueTile
{
SurfaceDataOps *srcOps = (SurfaceDataOps *)jlong_to_ptr(pSrcOps);
SurfaceDataRasInfo srcInfo;
- unsigned char *pMask;
unsigned char *bbuf;
jint *pBuf;
@@ -97,13 +96,6 @@ Java_sun_java2d_pipe_BufferedMaskBlit_enqueueTile
return bpos;
}
- pMask = (*env)->GetPrimitiveArrayCritical(env, maskArray, 0);
- if (pMask == NULL) {
- J2dRlsTraceLn(J2D_TRACE_ERROR,
- "BufferedMaskBlit_enqueueTile: cannot lock mask array");
- return bpos;
- }
-
srcInfo.bounds.x1 = srcx;
srcInfo.bounds.y1 = srcy;
srcInfo.bounds.x2 = srcx + width;
@@ -112,8 +104,6 @@ Java_sun_java2d_pipe_BufferedMaskBlit_enqueueTile
if (srcOps->Lock(env, srcOps, &srcInfo, SD_LOCK_READ) != SD_SUCCESS) {
J2dRlsTraceLn(J2D_TRACE_WARNING,
"BufferedMaskBlit_enqueueTile: could not acquire lock");
- (*env)->ReleasePrimitiveArrayCritical(env, maskArray,
- pMask, JNI_ABORT);
return bpos;
}
@@ -129,6 +119,15 @@ Java_sun_java2d_pipe_BufferedMaskBlit_enqueueTile
PtrCoord(srcInfo.rasBase,
srcInfo.bounds.x1, srcInfo.pixelStride,
srcInfo.bounds.y1, srcInfo.scanStride);
+ unsigned char *pMask =
+ (*env)->GetPrimitiveArrayCritical(env, maskArray, 0);
+ if (pMask == NULL) {
+ J2dRlsTraceLn(J2D_TRACE_ERROR,
+ "BufferedMaskBlit_enqueueTile: cannot lock mask array");
+ SurfaceData_InvokeRelease(env, srcOps, &srcInfo);
+ SurfaceData_InvokeUnlock(env, srcOps, &srcInfo);
+ return bpos;
+ }
width = srcInfo.bounds.x2 - srcInfo.bounds.x1;
height = srcInfo.bounds.y2 - srcInfo.bounds.y1;
@@ -166,18 +165,22 @@ Java_sun_java2d_pipe_BufferedMaskBlit_enqueueTile
do {
jint w = width;
do {
- jubyte pathA = *pMask++;
+ jint pathA = *pMask++;
if (!pathA) {
pBuf[0] = 0;
} else {
- jint cr, cg, cb, ca;
- jubyte r, g, b, a;
- LoadIntArgbTo4ByteArgb(pSrc, c, 0, ca, cr, cg, cb);
- a = MUL8(ca, pathA);
- r = MUL8(cr, a);
- g = MUL8(cg, a);
- b = MUL8(cb, a);
- pBuf[0] = (a << 24) | (r << 16) | (g << 8) | b;
+ jint pixel = pSrc[0];
+ if (pathA == 0xff && (pixel >> 24) + 1 == 0) {
+ pBuf[0] = pixel;
+ } else {
+ jint r, g, b, a;
+ ExtractIntDcmComponents1234(pixel, a, r, g, b);
+ a = MUL8(pathA, a);
+ r = MUL8(a, r);
+ g = MUL8(a, g);
+ b = MUL8(a, b);
+ pBuf[0] = (a << 24) | (r << 16) | (g << 8) | b;
+ }
}
pSrc = PtrAddBytes(pSrc, srcPixelStride);
pBuf++;
@@ -191,17 +194,17 @@ Java_sun_java2d_pipe_BufferedMaskBlit_enqueueTile
do {
jint w = width;
do {
- jubyte pathA = *pMask++;
+ jint pathA = *pMask++;
if (!pathA) {
pBuf[0] = 0;
} else if (pathA == 0xff) {
pBuf[0] = pSrc[0];
} else {
- jubyte r, g, b, a;
- a = MUL8((pSrc[0] >> 24) & 0xff, pathA);
- r = MUL8((pSrc[0] >> 16) & 0xff, pathA);
- g = MUL8((pSrc[0] >> 8) & 0xff, pathA);
- b = MUL8((pSrc[0] >> 0) & 0xff, pathA);
+ jint r, g, b, a;
+ a = MUL8(pathA, (pSrc[0] >> 24) & 0xff);
+ r = MUL8(pathA, (pSrc[0] >> 16) & 0xff);
+ g = MUL8(pathA, (pSrc[0] >> 8) & 0xff);
+ b = MUL8(pathA, (pSrc[0] >> 0) & 0xff);
pBuf[0] = (a << 24) | (r << 16) | (g << 8) | b;
}
pSrc = PtrAddBytes(pSrc, srcPixelStride);
@@ -216,17 +219,18 @@ Java_sun_java2d_pipe_BufferedMaskBlit_enqueueTile
do {
jint w = width;
do {
- jubyte pathA = *pMask++;
+ jint pathA = *pMask++;
if (!pathA) {
pBuf[0] = 0;
+ } else if (pathA == 0xff) {
+ pBuf[0] = pSrc[0] | 0xff000000;
} else {
- jint cr, cg, cb;
- jubyte r, g, b, a;
- LoadIntRgbTo3ByteRgb(pSrc, c, 0, cr, cg, cb);
+ jint r, g, b, a;
+ LoadIntRgbTo3ByteRgb(pSrc, c, 0, r, g, b);
a = pathA;
- r = MUL8(cr, a);
- g = MUL8(cg, a);
- b = MUL8(cb, a);
+ r = MUL8(a, r);
+ g = MUL8(a, g);
+ b = MUL8(a, b);
pBuf[0] = (a << 24) | (r << 16) | (g << 8) | b;
}
pSrc = PtrAddBytes(pSrc, srcPixelStride);
@@ -241,17 +245,16 @@ Java_sun_java2d_pipe_BufferedMaskBlit_enqueueTile
do {
jint w = width;
do {
- jubyte pathA = *pMask++;
+ jint pathA = *pMask++;
if (!pathA) {
pBuf[0] = 0;
} else {
- jint cr, cg, cb;
- jubyte r, g, b, a;
- LoadIntBgrTo3ByteRgb(pSrc, c, 0, cr, cg, cb);
+ jint r, g, b, a;
+ LoadIntBgrTo3ByteRgb(pSrc, c, 0, r, g, b);
a = pathA;
- r = MUL8(cr, a);
- g = MUL8(cg, a);
- b = MUL8(cb, a);
+ r = MUL8(a, r);
+ g = MUL8(a, g);
+ b = MUL8(a, b);
pBuf[0] = (a << 24) | (r << 16) | (g << 8) | b;
}
pSrc = PtrAddBytes(pSrc, srcPixelStride);
@@ -269,14 +272,14 @@ Java_sun_java2d_pipe_BufferedMaskBlit_enqueueTile
// increment current byte position
bpos += width * height * sizeof(jint);
+
+ (*env)->ReleasePrimitiveArrayCritical(env, maskArray,
+ pMask, JNI_ABORT);
}
SurfaceData_InvokeRelease(env, srcOps, &srcInfo);
}
SurfaceData_InvokeUnlock(env, srcOps, &srcInfo);
- (*env)->ReleasePrimitiveArrayCritical(env, maskArray,
- pMask, JNI_ABORT);
-
// return the current byte position
return bpos;
}