提交 07c61882 编写于 作者: B bae

8014102: Improve image conversion

Reviewed-by: mschoene, prr, jgodinez
上级 72de5c13
...@@ -1985,21 +1985,25 @@ expandPacked(JNIEnv *env, BufImageS_t *img, ColorModelS_t *cmP, ...@@ -1985,21 +1985,25 @@ expandPacked(JNIEnv *env, BufImageS_t *img, ColorModelS_t *cmP,
return 0; return 0;
} }
#define NUM_LINES 10
static int static int
cvtCustomToDefault(JNIEnv *env, BufImageS_t *imageP, int component, cvtCustomToDefault(JNIEnv *env, BufImageS_t *imageP, int component,
unsigned char *dataP) { unsigned char *dataP) {
ColorModelS_t *cmP = &imageP->cmodel; const RasterS_t *rasterP = &imageP->raster;
RasterS_t *rasterP = &imageP->raster; const int w = rasterP->width;
const int h = rasterP->height;
int y; int y;
jobject jpixels = NULL; jintArray jpixels = NULL;
jint *pixels; jint *pixels;
unsigned char *dP = dataP; unsigned char *dP = dataP;
#define NUM_LINES 10 int numLines = h > NUM_LINES ? NUM_LINES : h;
int numLines = NUM_LINES;
/* it is safe to calculate the scan length, because width has been verified /* it is safe to calculate the scan length, because width has been verified
* on creation of the mlib image * on creation of the mlib image
*/ */
int scanLength = rasterP->width * 4; const int scanLength = w * 4;
int nbytes = 0; int nbytes = 0;
if (!SAFE_TO_MULT(numLines, scanLength)) { if (!SAFE_TO_MULT(numLines, scanLength)) {
...@@ -2008,42 +2012,70 @@ cvtCustomToDefault(JNIEnv *env, BufImageS_t *imageP, int component, ...@@ -2008,42 +2012,70 @@ cvtCustomToDefault(JNIEnv *env, BufImageS_t *imageP, int component,
nbytes = numLines * scanLength; nbytes = numLines * scanLength;
for (y=0; y < rasterP->height; y+=numLines) { jpixels = (*env)->NewIntArray(env, nbytes);
/* getData, one scanline at a time */ if (JNU_IsNull(env, jpixels)) {
if (y+numLines > rasterP->height) { JNU_ThrowOutOfMemoryError(env, "Out of Memory");
numLines = rasterP->height - y; return -1;
}
for (y = 0; y < h; y += numLines) {
if (y + numLines > h) {
numLines = h - y;
nbytes = numLines * scanLength; nbytes = numLines * scanLength;
} }
jpixels = (*env)->CallObjectMethod(env, imageP->jimage,
g_BImgGetRGBMID, 0, y, (*env)->CallObjectMethod(env, imageP->jimage,
rasterP->width, numLines, g_BImgGetRGBMID, 0, y,
jpixels,0, rasterP->width); w, numLines,
if (jpixels == NULL) { jpixels, 0, w);
JNU_ThrowInternalError(env, "Can't retrieve pixels."); if ((*env)->ExceptionOccurred(env)) {
(*env)->DeleteLocalRef(env, jpixels);
return -1; return -1;
} }
pixels = (*env)->GetPrimitiveArrayCritical(env, jpixels, NULL); pixels = (*env)->GetPrimitiveArrayCritical(env, jpixels, NULL);
if (pixels == NULL) {
(*env)->DeleteLocalRef(env, jpixels);
return -1;
}
memcpy(dP, pixels, nbytes); memcpy(dP, pixels, nbytes);
dP += nbytes; dP += nbytes;
(*env)->ReleasePrimitiveArrayCritical(env, jpixels, pixels, (*env)->ReleasePrimitiveArrayCritical(env, jpixels, pixels,
JNI_ABORT); JNI_ABORT);
} }
/* Need to release the array */
(*env)->DeleteLocalRef(env, jpixels);
return 0; return 0;
} }
static int static int
cvtDefaultToCustom(JNIEnv *env, BufImageS_t *imageP, int component, cvtDefaultToCustom(JNIEnv *env, BufImageS_t *imageP, int component,
unsigned char *dataP) { unsigned char *dataP) {
ColorModelS_t *cmP = &imageP->cmodel; const RasterS_t *rasterP = &imageP->raster;
RasterS_t *rasterP = &imageP->raster; const int w = rasterP->width;
const int h = rasterP->height;
int y; int y;
jintArray jpixels = NULL;
jint *pixels; jint *pixels;
unsigned char *dP = dataP; unsigned char *dP = dataP;
#define NUM_LINES 10 int numLines = h > NUM_LINES ? NUM_LINES : h;
int numLines = NUM_LINES;
int nbytes = rasterP->width*4*NUM_LINES; /* it is safe to calculate the scan length, because width has been verified
jintArray jpixels; * 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); jpixels = (*env)->NewIntArray(env, nbytes);
if (JNU_IsNull(env, jpixels)) { if (JNU_IsNull(env, jpixels)) {
...@@ -2051,14 +2083,15 @@ cvtDefaultToCustom(JNIEnv *env, BufImageS_t *imageP, int component, ...@@ -2051,14 +2083,15 @@ cvtDefaultToCustom(JNIEnv *env, BufImageS_t *imageP, int component,
return -1; return -1;
} }
for (y=0; y < rasterP->height; y+=NUM_LINES) { for (y = 0; y < h; y += numLines) {
if (y+numLines > rasterP->height) { if (y + numLines > h) {
numLines = rasterP->height - y; numLines = h - y;
nbytes = rasterP->width*4*numLines; nbytes = numLines * scanLength;
} }
pixels = (*env)->GetPrimitiveArrayCritical(env, jpixels, NULL); pixels = (*env)->GetPrimitiveArrayCritical(env, jpixels, NULL);
if (pixels == NULL) { if (pixels == NULL) {
/* JNI error */ (*env)->DeleteLocalRef(env, jpixels);
return -1; return -1;
} }
...@@ -2067,12 +2100,11 @@ cvtDefaultToCustom(JNIEnv *env, BufImageS_t *imageP, int component, ...@@ -2067,12 +2100,11 @@ cvtDefaultToCustom(JNIEnv *env, BufImageS_t *imageP, int component,
(*env)->ReleasePrimitiveArrayCritical(env, jpixels, pixels, 0); (*env)->ReleasePrimitiveArrayCritical(env, jpixels, pixels, 0);
/* setData, one scanline at a time */
/* Fix 4223648, 4184283 */
(*env)->CallVoidMethod(env, imageP->jimage, g_BImgSetRGBMID, 0, y, (*env)->CallVoidMethod(env, imageP->jimage, g_BImgSetRGBMID, 0, y,
rasterP->width, numLines, jpixels, 0, w, numLines, jpixels,
rasterP->width); 0, w);
if ((*env)->ExceptionOccurred(env)) { if ((*env)->ExceptionOccurred(env)) {
(*env)->DeleteLocalRef(env, jpixels);
return -1; return -1;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册