extern "C" void gxpport_loadimmutable_from_platformbuffer (unsigned char* srcBuffer, int length, jboolean isStatic, int* ret_imgWidth, int* ret_imgHeight, gxpport_image_native_handle *newImmutableImagePtr, gxutl_native_image_error_codes* creationErrorPtr) { int rscSize; gxutl_image_buffer_raw* dataBuffer = (gxutl_image_buffer_raw*)srcBuffer; /* Check resource limit */ rscSize = ImgRegionRscSize(NULL, dataBuffer->width, dataBuffer->height); if (midpCheckResourceLimit(RSC_TYPE_IMAGE_IMMUT, rscSize) == 0) { /* Exceed Resource limit */ *creationErrorPtr = GXUTL_NATIVE_IMAGE_RESOURCE_LIMIT; return; } _Platform_ImmutableImage* immutableImage = (_Platform_ImmutableImage*)midpMalloc(sizeof(_Platform_ImmutableImage)); if (immutableImage == NULL) { *creationErrorPtr = GXUTL_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } if (!load_raw(&immutableImage->qimage, dataBuffer, length, isStatic, ret_imgWidth, ret_imgHeight)) { midpFree(immutableImage); *creationErrorPtr = GXUTL_NATIVE_IMAGE_DECODING_ERROR; return; } /* Image creation succeeds */ if (midpIncResourceCount(RSC_TYPE_IMAGE_IMMUT, rscSize) == 0) { REPORT_ERROR(LC_LOWUI, "Error in updating resource limit" " for Immutable image"); } immutableImage->marker = 7; immutableImage->qpixmap = NULL; *newImmutableImagePtr = immutableImage; *creationErrorPtr = GXUTL_NATIVE_IMAGE_NO_ERROR; }
extern "C" void gxpport_create_mutable(gxpport_mutableimage_native_handle *newImagePtr, int width, int height, gxutl_native_image_error_codes* creationErrorPtr) { /* set optimization for all QPixmaps move this to startup/initialization code. */ QPixmap::setDefaultOptimization(QPixmap::BestOptim); /* * Populate Java data pointer before calling checkResourceLimit * because it might trigger GC and makes the Java pointer invalid. */ QPixmap* qpixmap = new QPixmap(); /* Start with a NULL image object */ if (NULL == qpixmap) { *creationErrorPtr = GXUTL_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } /* Check resource limit before really creating image memory */ if (midpCheckResourceLimit(RSC_TYPE_IMAGE_MUT, ImgRegionRscSize(width, height)) == 0) { *creationErrorPtr = GXUTL_NATIVE_IMAGE_RESOURCE_LIMIT; delete qpixmap; return; } /* ALLOCATE MEMORY FOR QT IMAGE DATA */ qpixmap->resize(width, height); /* INITIALIZE CONTENTS TO WHITE */ qpixmap->fill(); /* Update the resource count */ if (midpIncResourceCount(RSC_TYPE_IMAGE_MUT, ImgRscSize(qpixmap)) == 0) { REPORT_INFO(LC_LOWUI,"Error in updating resource" " limit for Mutable image"); } /* return the qpixmap pointer */ *newImagePtr = qpixmap; *creationErrorPtr = GXUTL_NATIVE_IMAGE_NO_ERROR; }
extern "C" void gxpport_decodeimmutable_from_selfidentifying (unsigned char* srcBuffer, int length, int* imgWidth, int* imgHeight, gxpport_image_native_handle *newImmutableImagePtr, gxutl_native_image_error_codes* creationErrorPtr) { MIDP_ERROR err; gxutl_image_format format; unsigned int w, h; err = gxutl_image_get_info(srcBuffer, (unsigned int)length, &format, &w, &h); if (err != MIDP_ERROR_NONE || format == GXUTL_IMAGE_FORMAT_UNSUPPORTED) { *creationErrorPtr = GXUTL_NATIVE_IMAGE_UNSUPPORTED_FORMAT_ERROR; return; } /* Check resource limit */ int rscSize = ImgRegionRscSize(NULL, w, h); if (midpCheckResourceLimit(RSC_TYPE_IMAGE_IMMUT, rscSize) == 0) { /* Exceed Resource limit */ *creationErrorPtr = GXUTL_NATIVE_IMAGE_RESOURCE_LIMIT; return; } bool loadResult = FALSE; _Platform_ImmutableImage* immutableImage = (_Platform_ImmutableImage*)midpMalloc(sizeof(_Platform_ImmutableImage)); if (immutableImage == NULL) { *creationErrorPtr = GXUTL_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } switch(format) { case GXUTL_IMAGE_FORMAT_JPEG: case GXUTL_IMAGE_FORMAT_PNG: immutableImage->qimage = new QImage(); if (NULL == immutableImage->qimage) { *creationErrorPtr = GXUTL_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } if (immutableImage->qimage->loadFromData((uchar*)srcBuffer, (unsigned int)length)) { *imgWidth = immutableImage->qimage->width(); *imgHeight = immutableImage->qimage->height(); if ((0 == *imgWidth) || (0 == *imgHeight)) { delete immutableImage->qimage; } else { immutableImage->marker = 4; loadResult = TRUE; } } else { delete immutableImage->qimage; immutableImage->qimage = NULL; } break; case GXUTL_IMAGE_FORMAT_RAW: loadResult = load_raw(&immutableImage->qimage, (gxutl_image_buffer_raw*)srcBuffer, (unsigned int)length, KNI_FALSE, imgWidth, imgHeight); immutableImage->marker = 5; break; default: /* Shouldn't be here */ *creationErrorPtr = GXUTL_NATIVE_IMAGE_UNSUPPORTED_FORMAT_ERROR; return; } if (!loadResult) { midpFree(immutableImage); *creationErrorPtr = GXUTL_NATIVE_IMAGE_DECODING_ERROR; return; } /* Image creation succeeds */ if (midpIncResourceCount(RSC_TYPE_IMAGE_IMMUT, rscSize) == 0) { REPORT_ERROR(LC_LOWUI, "Error in updating resource limit" " for Immutable image"); } immutableImage->qpixmap = NULL; *newImmutableImagePtr = immutableImage; *creationErrorPtr = GXUTL_NATIVE_IMAGE_NO_ERROR; }
extern "C" void gxpport_createimmutable_from_mutableregion (gxpport_mutableimage_native_handle srcMutableImagePtr, int src_x, int src_y, int src_width, int src_height, int transform, gxpport_image_native_handle* newImmutableImagePtr, gxutl_native_image_error_codes* creationErrorPtr) { QPixmap *srcqpixmap = gxpportqt_get_mutableimage_pixmap(srcMutableImagePtr); int rscSize = ImgRegionRscSize(srcqpixmap, src_width, src_height); /* Check resource limit */ if (midpCheckResourceLimit(RSC_TYPE_IMAGE_IMMUT, rscSize) == 0) { /* Exceed Resource limit */ *creationErrorPtr = GXUTL_NATIVE_IMAGE_RESOURCE_LIMIT; return; } QImage srcQImage = srcqpixmap->convertToImage(); if (srcQImage.isNull()) { *creationErrorPtr = GXUTL_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } _Platform_ImmutableImage* immutableImage = (_Platform_ImmutableImage*)midpMalloc(sizeof(_Platform_ImmutableImage)); if (immutableImage == NULL) { *creationErrorPtr = GXUTL_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } immutableImage->qimage = new QImage(srcQImage.copy(src_x, src_y, src_width, src_height)); if (NULL == immutableImage->qimage) { midpFree(immutableImage); *creationErrorPtr = GXUTL_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } if (immutableImage->qimage->isNull()) { delete immutableImage->qimage; midpFree(immutableImage); *creationErrorPtr = GXUTL_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } if (transform != 0) { transform_image(immutableImage->qimage, transform); } /* Copy succeeds */ if (midpIncResourceCount(RSC_TYPE_IMAGE_IMMUT, rscSize) == 0) { REPORT_ERROR(LC_LOWUI, "Error in updating resource limit" " for Immutable image"); } immutableImage->marker = 3; immutableImage->qpixmap = NULL; *newImmutableImagePtr = immutableImage; *creationErrorPtr = GXUTL_NATIVE_IMAGE_NO_ERROR; }