⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gxpportqt_immutableimage.cpp

📁 This is a resource based on j2me embedded,if you dont understand,you can connection with me .
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* *    * * 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 + -