📄 gxpportqt_immutableimage.cpp
字号:
/* * * * Copyright 1990-2007 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. * * This source file is specific for Qt-based configurations. */#include <stddef.h>#include <qpixmap.h>#include <qimage.h>#include <qteapp_export.h>#include <midpMalloc.h>#include <midpResourceLimit.h>#include <imgdcd_image_util.h>#include <img_errorcodes.h>#include <gxpport_immutableimage.h>#include <gxpportqt_image.h>#include "gxpportqt_intern_graphics_util.h"/** * Structure for ImmutableImage data. */typedef struct { /** Which routine allocated this image. */ int marker; /** The platform version of Immutable Image */ QImage* qimage; /** Cached pixmap used by UI */ QPixmap* qpixmap;} _Platform_ImmutableImage ;staticbool load_raw(QImage** qimage, imgdcd_image_buffer_raw* rawImageBuffer, unsigned int length, jboolean isStatic, int* ret_Width, int* ret_Height);/** * Calculate image resource size that should be used for resource limit * checking. Image color depth is hard-coded to 32 as it was found that * color depth of resulting image was changed to 32-bit(from 16 or lower size) * in most of the cases. */ #define ImgRscSize(img) (((img)->width()*(img)->height()*32)>>3)/** * Calculate image region resource size that should be used for resource limit * checking. Image color depth is hard-coded to 32 as it was found that * color depth of resulting image was changed to 32-bit(from 16 or lower size) * in most of the cases. */ #define ImgRegionRscSize(img, width, height) ((width*height*32)>>3)extern "C" void gxpport_createimmutable_from_mutable(gxpport_mutableimage_native_handle srcMutableImagePtr, gxpport_image_native_handle *newImmutableImagePtr, img_native_error_codes* creationErrorPtr) { /* Convert from source QPixmap to destination QImage */ QPixmap* srcPixmap = gxpportqt_get_mutableimage_pixmap(srcMutableImagePtr); int rscSize = ImgRscSize(srcPixmap); /* new img is the same size */ /* Check resource limit before copying */ if (midpCheckResourceLimit(RSC_TYPE_IMAGE_IMMUT, rscSize) == 0) { /* Exceeds resource limit */ *creationErrorPtr = IMG_NATIVE_IMAGE_RESOURCE_LIMIT; return; } _Platform_ImmutableImage* immutableImage = (_Platform_ImmutableImage*)midpMalloc(sizeof(_Platform_ImmutableImage)); if (immutableImage == NULL) { *creationErrorPtr = IMG_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } immutableImage->qimage = new QImage(srcPixmap->convertToImage()); if (NULL == immutableImage->qimage) { midpFree(immutableImage); *creationErrorPtr = IMG_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } if (immutableImage->qimage->isNull()) { delete immutableImage->qimage; midpFree(immutableImage); *creationErrorPtr = IMG_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } /* Copying succeeds */ if (midpIncResourceCount(RSC_TYPE_IMAGE_IMMUT, rscSize) == 0) { REPORT_ERROR(LC_LOWUI, "Error in updating resource limit" " for Immutable image"); } immutableImage->marker = 1; immutableImage->qpixmap = NULL; *newImmutableImagePtr = immutableImage; *creationErrorPtr = IMG_NATIVE_IMAGE_NO_ERROR;}extern "C" void gxpport_createimmutable_from_immutableregion(gxpport_image_native_handle srcImmutableImagePtr, int src_x, int src_y, int src_width, int src_height, int transform, gxpport_image_native_handle *newImmutableImagePtr, img_native_error_codes* creationErrorPtr) { _Platform_ImmutableImage* srcImmutableImage = (_Platform_ImmutableImage*)srcImmutableImagePtr; int rscSize = ImgRegionRscSize(srcImmutableImage->qimage, src_width, src_height); /* Check with resource limit */ if (midpCheckResourceLimit(RSC_TYPE_IMAGE_IMMUT, rscSize) == 0) { /* Exceed Resource limit */ *creationErrorPtr = IMG_NATIVE_IMAGE_RESOURCE_LIMIT; return; } _Platform_ImmutableImage* immutableImage = (_Platform_ImmutableImage*)midpMalloc(sizeof(_Platform_ImmutableImage)); if (immutableImage == NULL) { *creationErrorPtr = IMG_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } immutableImage->qimage = new QImage(srcImmutableImage->qimage->copy(src_x, src_y, src_width, src_height)); if (NULL == immutableImage->qimage) { midpFree(immutableImage); *creationErrorPtr = IMG_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } if (immutableImage->qimage->isNull()) { delete immutableImage->qimage; midpFree(immutableImage); *creationErrorPtr = IMG_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 =2; immutableImage->qpixmap = NULL; *newImmutableImagePtr = immutableImage; *creationErrorPtr = IMG_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, img_native_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 = IMG_NATIVE_IMAGE_RESOURCE_LIMIT; return; } QImage srcQImage = srcqpixmap->convertToImage(); if (srcQImage.isNull()) { *creationErrorPtr = IMG_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } _Platform_ImmutableImage* immutableImage = (_Platform_ImmutableImage*)midpMalloc(sizeof(_Platform_ImmutableImage)); if (immutableImage == NULL) { *creationErrorPtr = IMG_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 = IMG_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } if (immutableImage->qimage->isNull()) { delete immutableImage->qimage; midpFree(immutableImage); *creationErrorPtr = IMG_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 = IMG_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, img_native_error_codes* creationErrorPtr) { MIDP_ERROR err; imgdcd_image_format format; unsigned int w, h; err = imgdcd_image_get_info(srcBuffer, (unsigned int)length, &format, &w, &h); if (err != MIDP_ERROR_NONE || format == IMGDCD_IMAGE_FORMAT_UNSUPPORTED) { *creationErrorPtr = IMG_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 = IMG_NATIVE_IMAGE_RESOURCE_LIMIT; return; } bool loadResult = FALSE; _Platform_ImmutableImage* immutableImage = (_Platform_ImmutableImage*)midpMalloc(sizeof(_Platform_ImmutableImage)); if (immutableImage == NULL) { *creationErrorPtr = IMG_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } switch(format) { case IMGDCD_IMAGE_FORMAT_JPEG: case IMGDCD_IMAGE_FORMAT_PNG: immutableImage->qimage = new QImage(); if (NULL == immutableImage->qimage) { *creationErrorPtr = IMG_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 IMGDCD_IMAGE_FORMAT_RAW: loadResult = load_raw(&immutableImage->qimage, (imgdcd_image_buffer_raw*)srcBuffer, (unsigned int)length, KNI_FALSE, imgWidth, imgHeight); immutableImage->marker = 5; break; default: /* Shouldn't be here */ *creationErrorPtr = IMG_NATIVE_IMAGE_UNSUPPORTED_FORMAT_ERROR; return; } if (!loadResult) { midpFree(immutableImage); *creationErrorPtr = IMG_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 = IMG_NATIVE_IMAGE_NO_ERROR;}extern "C" void gxpport_decodeimmutable_from_argb(jint* srcBuffer, int width, int height, jboolean processAlpha, gxpport_image_native_handle* newImmutableImagePtr, img_native_error_codes* creationErrorPtr) { // use bytes as is, QT images have the same binary data layout QImage qimage = QImage((unsigned char*)srcBuffer, width, height, IMAGE_DEPTH, NULL, 0, QImage::IgnoreEndian); if (qimage.isNull()) { *creationErrorPtr = IMG_NATIVE_IMAGE_DECODING_ERROR; return; } /* Check Resource limit */ int rscSize = ImgRscSize(&qimage); if (midpCheckResourceLimit(RSC_TYPE_IMAGE_IMMUT, rscSize) == 0) { /* Exceed Resource limit */ *creationErrorPtr = IMG_NATIVE_IMAGE_RESOURCE_LIMIT; return; } qimage.setAlphaBuffer(processAlpha == KNI_TRUE?TRUE:FALSE); _Platform_ImmutableImage* immutableImage = (_Platform_ImmutableImage*)midpMalloc(sizeof(_Platform_ImmutableImage)); if (immutableImage == NULL) { *creationErrorPtr = IMG_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } // make a deep copy of the image immutableImage->qimage = new QImage(qimage.copy()); if (NULL == immutableImage->qimage) { midpFree(immutableImage); *creationErrorPtr = IMG_NATIVE_IMAGE_OUT_OF_MEMORY_ERROR; return; } if (immutableImage->qimage->isNull()) { delete immutableImage->qimage; midpFree(immutableImage); *creationErrorPtr = IMG_NATIVE_IMAGE_OUT_OF_MEMORY_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 = 6;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -