imggci_imagedatafactory_kni.c
来自「This is a resource based on j2me embedde」· C语言 代码 · 共 918 行 · 第 1/2 页
C
918 行
KNI_DeclareHandle(alphaData); KNI_DeclareHandle(pixelData); KNI_DeclareHandle(pngData); KNI_DeclareHandle(imageData); KNI_GetParameterAsObject(2, pngData); KNI_GetParameterAsObject(1, imageData); midpImageData = IMGAPI_GET_IMAGEDATA_PTR(imageData); /* assert * (KNI_IsNullHandle(pngData)) */ srcBuffer = (unsigned char *)JavaByteArray(pngData); /* * JAVA_TRACE("loadPNG pngData length=%d %x\n", * JavaByteArray(pngData)->length, srcBuffer); */ unhand(jbyte_array, pixelData) = midpImageData->pixelData; if (!KNI_IsNullHandle(pixelData)) { imgPixelData = (PIXEL *)JavaByteArray(pixelData); /* * JAVA_TRACE("loadPNG pixelData length=%d\n", * JavaByteArray(pixelData)->length); */ } else { imgPixelData = NULL; } unhand(jbyte_array, alphaData) = midpImageData->alphaData; if (!KNI_IsNullHandle(alphaData)) { imgAlphaData = (ALPHA *)JavaByteArray(alphaData); /* * JAVA_TRACE("decodePNG alphaData length=%d\n", * JavaByteArray(alphaData)->length); */ } else { imgAlphaData = NULL; } /* assert * (imagedata.pixelData != NULL && imagedata.alphaData != NULL) */ status = imgdcd_decode_png((srcBuffer + offset), length, midpImageData->width, midpImageData->height, imgPixelData, imgAlphaData, &creationError); if (IMG_NATIVE_IMAGE_NO_ERROR != creationError) { KNI_ThrowNew(midpIllegalArgumentException, NULL); } KNI_EndHandles(); KNI_ReturnBoolean(status);}/** * Decodes the given byte array into the <tt>ImageData</tt>. * <p> * Java declaration: * <pre> * loadJPG(Ljavax/microedition/lcdui/ImageData;[BII)V * </pre> * * @param imageData the ImageData to load to * @param imageBytes A byte array containing the encoded JPEG image data * @param imageOffset The start of the image data within the byte array * @param imageLength The length of the image data in the byte array */KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(javax_microedition_lcdui_ImageDataFactory_loadJPEG) { int length = KNI_GetParameterAsInt(4); int offset = KNI_GetParameterAsInt(3); unsigned char* srcBuffer = NULL; PIXEL *imgPixelData = NULL; ALPHA *imgAlphaData = NULL; java_imagedata * midpImageData = NULL; /* variable to hold error codes */ img_native_error_codes creationError = IMG_NATIVE_IMAGE_NO_ERROR; KNI_StartHandles(3); /* KNI_DeclareHandle(alphaData); */ KNI_DeclareHandle(pixelData); KNI_DeclareHandle(jpegData); KNI_DeclareHandle(imageData); KNI_GetParameterAsObject(2, jpegData); KNI_GetParameterAsObject(1, imageData); midpImageData = IMGAPI_GET_IMAGEDATA_PTR(imageData); /* assert * (KNI_IsNullHandle(jpegData)) */ srcBuffer = (unsigned char *)JavaByteArray(jpegData); /* * JAVA_TRACE("loadJPEG jpegData length=%d %x\n", * JavaByteArray(jpegData)->length, srcBuffer); */ unhand(jbyte_array, pixelData) = midpImageData->pixelData; if (!KNI_IsNullHandle(pixelData)) { imgPixelData = (PIXEL *)JavaByteArray(pixelData); /* * JAVA_TRACE("loadJPEG pixelData length=%d\n", * JavaByteArray(pixelData)->length); */ } /* assert * (imgPixelData != NULL) */ imgdcd_decode_jpeg((srcBuffer + offset), length, midpImageData->width, midpImageData->height, imgPixelData, imgAlphaData, &creationError); if (IMG_NATIVE_IMAGE_NO_ERROR != creationError) { KNI_ThrowNew(midpIllegalArgumentException, NULL); } KNI_EndHandles(); KNI_ReturnVoid();}/** * Initializes an <tt>ImageData</tt> from a romized pixel data * <p> * Java declaration: * <pre> * loadRomizedImage(Ljavax/microedition/lcdui/ImageData;I)V * </pre> * * @param imageData The ImageData to load to * @param imageDataPtr native pointer to image data as Java int * @param imageDataLength length of image data array */KNIEXPORT KNI_RETURNTYPE_BOOLEANKNIDECL(javax_microedition_lcdui_ImageDataFactory_loadRomizedImage) { int imageDataPtr = KNI_GetParameterAsInt(2); int imageDataLength = KNI_GetParameterAsInt(3); int alphaSize; int pixelSize; int imageSize; int expectedLength; imgdcd_image_buffer_raw *rawBuffer; java_imagedata *midpImageData; jboolean status = KNI_FALSE; KNI_StartHandles(1); KNI_DeclareHandle(imageData); KNI_GetParameterAsObject(1, imageData); rawBuffer = (imgdcd_image_buffer_raw*)imageDataPtr; do { if (rawBuffer == NULL) { REPORT_ERROR(LC_LOWUI, "Romized image data is null"); status = KNI_FALSE; break; } /** Check header */ if (memcmp(rawBuffer->header, imgdcd_raw_header, 4) != 0) { REPORT_ERROR(LC_LOWUI, "Unexpected romized image type"); status = KNI_FALSE; break; } imageSize = rawBuffer->width * rawBuffer->height; pixelSize = sizeof(PIXEL) * imageSize; alphaSize = 0; if (rawBuffer->hasAlpha) { alphaSize = sizeof(ALPHA) * imageSize; } /** Check data array length */ expectedLength = offsetof(imgdcd_image_buffer_raw, data) + pixelSize + alphaSize; if (imageDataLength != expectedLength) { REPORT_ERROR(LC_LOWUI, "Unexpected romized image data array length"); status = KNI_FALSE; break; } midpImageData = IMGAPI_GET_IMAGEDATA_PTR(imageData); midpImageData->width = (jint)rawBuffer->width; midpImageData->height = (jint)rawBuffer->height; midpImageData->nativePixelData = (jint)rawBuffer->data; if (rawBuffer->hasAlpha) { midpImageData->nativeAlphaData = (jint)(rawBuffer->data + pixelSize); } status = KNI_TRUE; } while (0); KNI_EndHandles(); KNI_ReturnBoolean(status);}/** * Loads the <tt>ImageData</tt> with the given ARGB integer * array. The array consists of values in the form of 0xAARRGGBB. * <p> * Java declaration: * <pre> * loadRGB(Ljavax/microedition/lcdui/ImageData;[I)V * </pre> * * @param rgbData The array of argb image data */KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(javax_microedition_lcdui_ImageDataFactory_loadRGB) { /* jboolean processAlpha = KNI_GetParameterAsBoolean(2); */ int height; int width; int *rgbBuffer; PIXEL *pixelData; ALPHA *alphaData; KNI_StartHandles(2); KNI_DeclareHandle(rgbData); KNI_DeclareHandle(imageData); KNI_GetParameterAsObject(2, rgbData); KNI_GetParameterAsObject(1, imageData); rgbBuffer = JavaIntArray(rgbData); if (getImageData(imageData, &width, &height, &pixelData, &alphaData) == KNI_TRUE) { int i; int len = KNI_GetArrayLength(rgbData); int data_length = width * height; if (len > data_length) { len = data_length; } /* if (len != width*height) { * JAVA_TRACE("len mismatch %d != %d\n", len, width*height); * } */ if (alphaData != NULL) { for (i = 0; i < len; i++) { pixelData[i] = RGB24TORGB16(rgbBuffer[i]); alphaData[i] = (rgbBuffer[i] >> 24) & 0x00ff; } } else { for (i = 0; i < len; i++) { pixelData[i] = RGB24TORGB16(rgbBuffer[i]); } } } KNI_EndHandles(); KNI_ReturnVoid();}static void pixelCopy(PIXEL *src, const int srcLineW, const int srcXInc, const int srcYInc, const int srcXStart, PIXEL *dst, const int w, const int h) { int x, srcX; PIXEL *dstPtrEnd = dst + (h * w ); (void)srcLineW; /* Surpress unused warning */ for (; dst < dstPtrEnd; dst += w, src += srcYInc) { for (x = 0, srcX = srcXStart; x < w; srcX += srcXInc) { // printf("%d = %d\n", ((dst+x)-dstData), (src+srcX)-srcData); dst[x++] = src[srcX]; } }}static void pixelAndAlphaCopy(PIXEL *src, const int srcLineW, const int srcXInc, const int srcYInc, const int srcXStart, PIXEL *dst, const int w, const int h, const ALPHA *srcAlpha, ALPHA *dstAlpha) { int x, srcX; PIXEL *dstPtrEnd = dst + (h * w ); (void)srcLineW; /* Surpress unused warning */ for (; dst < dstPtrEnd; dst += w, src += srcYInc, dstAlpha += w, srcAlpha += srcYInc) { for (x = 0, srcX = srcXStart; x < w; srcX += srcXInc) { // printf("%d = %d\n", ((dst+x)-dstData), (src+srcX)-srcData); dstAlpha[x] = srcAlpha[srcX]; dst[x++] = src[srcX]; } }}static void blit(int srcWidth, int srcHeight, PIXEL *srcPixelData, ALPHA *srcAlphaData, int xSrc, int ySrc, int width, int height, PIXEL *dstPixelData, ALPHA *dstAlphaData, int transform) { PIXEL *srcPtr = NULL; int srcXInc=0, srcYInc=0, srcXStart=0; switch (transform) { case TRANS_NONE: srcPtr = srcPixelData + (ySrc * srcWidth + xSrc); srcYInc = srcWidth; srcXStart = 0; srcXInc = 1; break; case TRANS_MIRROR_ROT180: srcPtr = srcPixelData + ((ySrc + height - 1) * srcWidth + xSrc); srcYInc = -srcWidth; srcXStart = 0; srcXInc = 1; break; case TRANS_MIRROR: srcPtr = srcPixelData + (ySrc * srcWidth + xSrc); srcYInc = srcWidth; srcXStart = width - 1; srcXInc = -1; break; case TRANS_ROT180: srcPtr = srcPixelData + ((ySrc + height - 1) * srcWidth + xSrc); srcYInc = -srcWidth; srcXStart = width - 1; srcXInc = -1; break; case TRANS_MIRROR_ROT270: srcPtr = srcPixelData + (ySrc * srcWidth + xSrc); srcYInc = 1; srcXStart = 0; srcXInc = srcWidth; break; case TRANS_ROT90: srcPtr = srcPixelData + ((ySrc + height - 1) * srcWidth + xSrc); srcYInc = 1; srcXStart = 0; srcXInc = -srcWidth; break; case TRANS_ROT270: srcPtr = srcPixelData + (ySrc * srcWidth + xSrc + width - 1); srcYInc = -1; srcXStart = 0; srcXInc = srcWidth; break; case TRANS_MIRROR_ROT90: srcPtr = srcPixelData + ((ySrc + height - 1) * srcWidth + xSrc); srcYInc = -1; srcXStart = width - 1; srcXInc = -srcWidth; break; } if (transform & TRANSFORM_INVERTED_AXES) { if (srcAlphaData == NULL) { pixelCopy(srcPtr, srcWidth, srcXInc, srcYInc, srcXStart, dstPixelData, height, width); } else { ALPHA *srcAlpha = srcAlphaData + (srcPtr - srcPixelData); pixelAndAlphaCopy(srcPtr, srcWidth, srcXInc, srcYInc, srcXStart, dstPixelData, height, width, srcAlpha, dstAlphaData); } } else { if (srcAlphaData == NULL) { pixelCopy(srcPtr, srcWidth, srcXInc, srcYInc, srcXStart, dstPixelData, width, height); } else { ALPHA *srcAlpha = srcAlphaData + (srcPtr - srcPixelData); pixelAndAlphaCopy(srcPtr, srcWidth, srcXInc, srcYInc, srcXStart, dstPixelData, width, height, srcAlpha, dstAlphaData); } }}/** * Copies the region of the specified <tt>ImageData</tt> to * the specified <tt>ImageData</tt> object. * <p> * Java declaration: * <pre> * loadRegion(Ljavax/microedition/lcdui/ImageData; * Ljavax/microedition/lcdui/ImageData;IIIII)V * </pre> * * @param dest the ImageData to copy to * @param source the source image to be copied from * @param x The x coordinate of the upper left corner of the * region to copy * @param y The y coordinate of the upper left corner of the * region to copy * @param width The width of the region to copy * @param height The height of the region to copy * @param transform The transform to apply to the selected region. */KNIEXPORT KNI_RETURNTYPE_VOIDKNIDECL(javax_microedition_lcdui_ImageDataFactory_loadRegion) { int transform = KNI_GetParameterAsInt(7); int height = KNI_GetParameterAsInt(6); int width = KNI_GetParameterAsInt(5); int y = KNI_GetParameterAsInt(4); int x = KNI_GetParameterAsInt(3); int srcWidth, srcHeight; PIXEL *srcPixelData; ALPHA *srcAlphaData; int dstWidth, dstHeight; PIXEL *dstPixelData; ALPHA *dstAlphaData; KNI_StartHandles(2); KNI_DeclareHandle(srcImg); KNI_DeclareHandle(destImg); KNI_GetParameterAsObject(2, srcImg); KNI_GetParameterAsObject(1, destImg); if ((getImageData(destImg, &dstWidth, &dstHeight, &dstPixelData, &dstAlphaData) == KNI_TRUE) && (getImageData(srcImg, &srcWidth, &srcHeight, &srcPixelData, &srcAlphaData) == KNI_TRUE)) { blit(srcWidth, srcHeight, srcPixelData, srcAlphaData, x, y, width, height, dstPixelData, dstAlphaData, transform); } KNI_EndHandles(); KNI_ReturnVoid();}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?