magick_MagickImage.c
上传用户:qingzhou
上传日期:2013-04-21
资源大小:733k
文件大小:102k
源码类别:

破解

开发平台:

Java

  1. #include <jni.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <time.h>
  6. #include <sys/types.h>
  7. #include <magick/api.h>
  8. #include "magick_MagickImage.h"
  9. #include "jmagick.h"
  10. /*
  11.  * Class:     magick_MagickImage
  12.  * Method:    initMultiImage
  13.  * Signature: ([Lmagick/MagickImage;)V
  14.  */
  15. JNIEXPORT void JNICALL Java_magick_MagickImage_initMultiImage
  16.   (JNIEnv *env, jobject self, jobjectArray images)
  17. {
  18.     Image *image, *newImage, *lastImage, *p;
  19.     jsize arrayLen;
  20.     jobject obj;
  21.     jfieldID fieldID = 0;
  22.     ExceptionInfo exception;
  23.     int i;
  24.     
  25.     arrayLen = (*env)->GetArrayLength(env, images);
  26.     if (arrayLen < 1) {
  27.         throwMagickException(env, "No images specified");
  28.         return;
  29.     }
  30.     /* Get the first element in the array and clone it. */
  31.     obj = (*env)->GetObjectArrayElement(env, images, 0);
  32.     if (obj == NULL) {
  33.         throwMagickException(env, "First image in array null");
  34.         return;
  35.     }
  36.     image = (Image*) getHandle(env, obj, "magickImageHandle", &fieldID);
  37.     if (image == NULL) {
  38.         throwMagickException(env, "Unable to obtain image handle");
  39.         return;
  40.     }
  41.     GetExceptionInfo(&exception);
  42.     newImage = CloneImage(image, 0, 0, 0, &exception);
  43.     if (newImage == NULL) {
  44.         throwMagickApiException(env, "Unable to clone image", &exception);
  45.         DestroyExceptionInfo(&exception);
  46.         return;
  47.     }
  48.     /* Move the lastImage pointer to the last image of the list. */
  49.     for (lastImage = newImage;
  50.          lastImage->next != NULL;
  51.          lastImage = lastImage->next)
  52.         ;
  53.     /* Move the newImage pointer to the head of the list. */
  54.     for (; newImage->previous != NULL; newImage = newImage->previous)
  55.         ;
  56.     /* Clone the other images in the array and append to list */
  57.     for (i = 1; i < arrayLen; i++) {
  58.         /* Get the next image in the array */
  59.         obj = (*env)->GetObjectArrayElement(env, images, i);
  60.         if (obj == NULL) {
  61.             throwMagickException(env, "Image in array index null");
  62.             return;
  63.         }
  64.         image = (Image*) getHandle(env, obj, "magickImageHandle", &fieldID);
  65.         if (image == NULL) {
  66.             throwMagickException(env, "Unable to obtain image handle");
  67.             return;
  68.         }
  69.         /* Clone the image */
  70.         GetExceptionInfo(&exception);
  71.         image = CloneImage(image, 0, 0, 0, &exception);
  72.         if (image == NULL) {
  73.             throwMagickApiException(env, "Unable to clone image", &exception);
  74.             DestroyExceptionInfo(&exception);
  75.             DestroyImages(newImage);
  76.             return;
  77.         }
  78.         /* Find the head of the list */
  79.         for (p = image; p->previous != NULL; p = p->previous)
  80.             ;
  81.         /* Link it up */
  82.         lastImage->next = p;
  83.         p->previous = lastImage;
  84.         /* Move lastImage to the end of the list */
  85.         for (lastImage = image;
  86.              lastImage->next != NULL;
  87.              lastImage = lastImage->next)
  88.             ;
  89.     }
  90.     /* Set the image handle */
  91.     image = (Image*) getHandle(env, self, "magickImageHandle", &fieldID);
  92.     if (image != NULL) {
  93.         DestroyImages(image);
  94.     }
  95.     setHandle(env, self, "magickImageHandle", (void*) newImage, &fieldID);
  96. }
  97. /*
  98.  * Class:     magick_MagickImage
  99.  * Method:    allocateImage
  100.  * Signature: (Lmagick/ImageInfo;)V
  101.  */
  102. JNIEXPORT void JNICALL Java_magick_MagickImage_allocateImage
  103.   (JNIEnv *env, jobject self, jobject imageInfoObj)
  104. {
  105.     ImageInfo *imageInfo = NULL;
  106.     Image *image = NULL, *oldImage = NULL;
  107.     jfieldID fieldID = 0;
  108.     /* Obtain the ImageInfo pointer */
  109.     imageInfo = (ImageInfo*) getHandle(env, imageInfoObj, 
  110.        "imageInfoHandle", NULL);
  111.     if (imageInfo == NULL) {
  112. throwMagickException(env, "Cannot obtain ImageInfo object");
  113. return;
  114.     }
  115.     
  116.     /* Allocate the image object. */
  117.     image = AllocateImage(imageInfo);
  118.     /* Get the old image handle and deallocate it (if required). */
  119.     oldImage = (Image*) getHandle(env, self, "magickImageHandle", &fieldID);
  120.     if (oldImage != NULL) {
  121. DestroyImages(oldImage);
  122.     }
  123.     /* Store the image into the handle. */
  124.     setHandle(env, self, "magickImageHandle", (void*) image, &fieldID);
  125. }
  126. /*
  127.  * Class:     magick_MagickImage
  128.  * Method:    readImage
  129.  * Signature: (Lmagick/ImageInfo;)V
  130.  */
  131. JNIEXPORT void JNICALL Java_magick_MagickImage_readImage
  132.     (JNIEnv *env, jobject self, jobject imageInfoObj)
  133. {
  134.     ImageInfo *imageInfo = NULL;
  135.     Image *image = NULL, *oldImage = NULL;
  136.     jfieldID fieldID = 0;
  137.     ExceptionInfo exception;
  138.     /* Obtain the ImageInfo pointer */
  139.     imageInfo = (ImageInfo*) getHandle(env, imageInfoObj, 
  140.        "imageInfoHandle", NULL);
  141.     if (imageInfo == NULL) {
  142. throwMagickException(env, "Cannot obtain ImageInfo object");
  143. return;
  144.     }
  145.     /* Read the image. */
  146. #ifdef DIAGNOSTIC
  147.     fprintf(stderr, "Attempting to read from file %sn", imageInfo->filename);
  148. #endif
  149.     GetExceptionInfo(&exception);
  150.     image = ReadImage(imageInfo, &exception);
  151.     if (image == NULL) {
  152.         throwMagickApiException(env, "Unable to read image", &exception);
  153. DestroyExceptionInfo(&exception);
  154. return;
  155.     }
  156.     DestroyExceptionInfo(&exception);
  157. #ifdef DIAGNOSTIC
  158.     fprintf(stderr, "ReadImage completedn");
  159. #endif
  160.     /* Get the old image handle and deallocate it (if required). */
  161.     oldImage = (Image*) getHandle(env, self, "magickImageHandle", &fieldID);
  162.     if (oldImage != NULL) {
  163. DestroyImages(oldImage);
  164.     }
  165.     /* Store the image into the handle. */
  166.     setHandle(env, self, "magickImageHandle", (void*) image, &fieldID);
  167. }
  168. /*
  169.  * Class:     magick_MagickImage
  170.  * Method:    pingImage
  171.  * Signature: (Lmagick/ImageInfo;)V
  172.  */
  173. JNIEXPORT void JNICALL Java_magick_MagickImage_pingImage
  174.     (JNIEnv *env, jobject self, jobject imageInfoObj)
  175. {
  176.     ImageInfo *imageInfo = NULL;
  177.     Image *image = NULL, *oldImage = NULL;
  178.     jfieldID fieldID = 0;
  179.     ExceptionInfo exception;
  180.     
  181.     // Obtain the ImageInfo pointer
  182.     imageInfo = (ImageInfo*) getHandle(env, imageInfoObj, 
  183.        "imageInfoHandle", NULL);
  184.     if (imageInfo == NULL) {
  185. throwMagickException(env, "Cannot obtain ImageInfo object");
  186. return;
  187.     }
  188.     // Read the image.
  189. #ifdef DIAGNOSTIC
  190.     fprintf(stderr, "Attempting to read from file %sn", imageInfo->filename);
  191. #endif
  192.     
  193.     GetExceptionInfo(&exception);
  194.     
  195.     image = PingImage(imageInfo, &exception);
  196.     if (image == NULL) {
  197.         throwMagickApiException(env, "Unable to ping image", &exception);
  198. DestroyExceptionInfo(&exception);                        
  199. return;
  200.     }    
  201.     
  202.     DestroyExceptionInfo(&exception);
  203. #ifdef DIAGNOSTIC
  204.     fprintf(stderr, "PingImage completedn");
  205. #endif
  206.     // Get the old image handle and deallocate it (if required).
  207.     oldImage = (Image*) getHandle(env, self, "magickImageHandle", &fieldID);
  208.     if (oldImage != NULL) {
  209. DestroyImages(oldImage);
  210.     }
  211.     // Store the image into the handle.
  212.     setHandle(env, self, "magickImageHandle", (void*) image, &fieldID);
  213. }
  214. /*
  215.  * Class:     magick_MagickImage
  216.  * Method:    writeImage
  217.  * Signature: (Lmagick/ImageInfo;)Z
  218.  */
  219. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_writeImage
  220.     (JNIEnv *env, jobject self, jobject imageInfoObj)
  221. {
  222.     ImageInfo *imageInfo = NULL;
  223.     Image *image = NULL;
  224.     int status;
  225.     /* Obtain the ImageInfo pointer. */
  226.     imageInfo = (ImageInfo*) getHandle(env, imageInfoObj,
  227.        "imageInfoHandle", NULL);
  228.     if (imageInfo == NULL) {
  229. throwMagickException(env, "Cannot obtain ImageInfo object");
  230. return JNI_FALSE;
  231.     }
  232.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  233.     if (image == NULL) {
  234. throwMagickException(env, "No image to write");
  235. return JNI_FALSE;
  236.     }
  237.     /* Write the image. */
  238.     status = WriteImage(imageInfo, image);
  239.     return (status) ? (JNI_TRUE) : (JNI_FALSE);
  240. }
  241. /*
  242.  * Class:     magick_MagickImage
  243.  * Method:    getFileName
  244.  * Signature: ()Ljava/lang/String;
  245.  */
  246. JNIEXPORT jstring JNICALL Java_magick_MagickImage_getFileName
  247.     (JNIEnv *env, jobject self)
  248. {
  249.     Image *image = NULL;
  250.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  251.     if (image == NULL) {
  252. throwMagickException(env, "No image to get file name");
  253. return NULL;
  254.     }
  255.     return (*env)->NewStringUTF(env, image->filename);
  256. }
  257. /*
  258.  * Class:     magick_MagickImage
  259.  * Method:    setFileName
  260.  * Signature: (Ljava/lang/String;)V
  261.  */
  262. JNIEXPORT void JNICALL Java_magick_MagickImage_setFileName
  263.     (JNIEnv *env, jobject self, jstring fileName)
  264. {
  265.     Image *image = NULL;
  266.     const char *cstr;
  267.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  268.     if (image == NULL) {
  269. throwMagickException(env, "No image to set file name");
  270. return;
  271.     }
  272.     cstr = (*env)->GetStringUTFChars(env, fileName, 0);
  273.     strcpy(image->filename, cstr);
  274.     (*env)->ReleaseStringUTFChars(env, fileName, cstr);
  275. }
  276. /*
  277.  * Class:     magick_MagickImage
  278.  * Method:    setFilter
  279.  * Signature: (I)V
  280.  */
  281. JNIEXPORT void JNICALL Java_magick_MagickImage_setFilter
  282.   (JNIEnv *env, jobject self, jint filter)
  283. {
  284.     Image *image = NULL;
  285.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  286.     if (image == NULL) {
  287. throwMagickException(env, "No image to set file name");
  288. return;
  289.     }
  290.     image->filter = filter;
  291. }
  292. /*
  293.  * Class:     magick_MagickImage
  294.  * Method:    getFilter
  295.  * Signature: ()I
  296.  */
  297. JNIEXPORT jint JNICALL Java_magick_MagickImage_getFilter
  298.   (JNIEnv *env, jobject self)
  299. {
  300.     Image *image = NULL;
  301.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  302.     if (image == NULL) {
  303. throwMagickException(env, "Unable to retrieve handle");
  304. return -1;
  305.     }
  306.     return image->filter;
  307. }
  308. /*
  309.  * Class:     magick_MagickImage
  310.  * Method:    getDimension
  311.  * Signature: ()Ljava/awt/Dimension;
  312.  */
  313. JNIEXPORT jobject JNICALL Java_magick_MagickImage_getDimension
  314.     (JNIEnv *env, jobject self)
  315. {
  316.     Image *image = NULL;
  317.     jclass dimensionClass;
  318.     jmethodID consMethodID;
  319.     jobject dimension;
  320.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  321.     if (image == NULL) {
  322. throwMagickException(env, "Unable to retrieve handle");
  323. return NULL;
  324.     }
  325.     dimensionClass = (*env)->FindClass(env, "java/awt/Dimension");
  326.     if (dimensionClass == 0) {
  327. throwMagickException(env, "Unable to locate class java.awt.Dimension");
  328. return NULL;
  329.     }
  330.     consMethodID = (*env)->GetMethodID(env, dimensionClass,
  331.        "<init>", "(II)V");
  332.     if (consMethodID == 0) {
  333. throwMagickException(env, "Unable to construct java.awt.Dimension");
  334. return NULL;
  335.     }
  336.     dimension = (*env)->NewObject(env, dimensionClass, consMethodID,
  337.   image->columns, image->rows);
  338.     if (dimension == NULL) {
  339. throwMagickException(env, "Unable to construct java.awt.Dimension");
  340. return NULL;
  341.     }
  342.     return dimension;
  343. }
  344. /*
  345.  * Class:     magick_MagickImage
  346.  * Method:    addNoiseImage
  347.  * Signature: (I)Lmagick/MagickImage;
  348.  */
  349. JNIEXPORT jobject JNICALL Java_magick_MagickImage_addNoiseImage
  350.     (JNIEnv *env, jobject self, jint noiseType)
  351. {    
  352.     NoiseType noiseEnum;
  353.     jobject newImage;
  354.     Image *noisyImage;
  355.     ExceptionInfo exception;
  356.     Image *image =
  357. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  358.     if (image == NULL) {
  359. throwMagickException(env, "Cannot obtain image handle");
  360. return NULL;
  361.     }
  362.     
  363.     switch (noiseType) {
  364.         default: noiseEnum = UniformNoise;                break;
  365.         case 1:  noiseEnum = GaussianNoise;               break;
  366.         case 2:  noiseEnum = MultiplicativeGaussianNoise; break;
  367.         case 3:  noiseEnum = ImpulseNoise;                break;
  368.         case 4:  noiseEnum = LaplacianNoise;              break;
  369.         case 5:  noiseEnum = PoissonNoise;                break;
  370.     }
  371.     GetExceptionInfo(&exception);
  372.     noisyImage = AddNoiseImage(image, noiseEnum, &exception);
  373.     if (noisyImage == NULL) {
  374. throwMagickApiException(env, "Unable to add noise", &exception);
  375. DestroyExceptionInfo(&exception);
  376. return NULL;
  377.     }
  378.     DestroyExceptionInfo(&exception);
  379.     newImage = newImageObject(env, noisyImage);
  380.     if (newImage == NULL) {
  381. DestroyImages(noisyImage);
  382. throwMagickException(env, "Cannot create new MagickImage object");
  383. return NULL;
  384.     }
  385.     return newImage;
  386. }
  387. /*
  388.  * Class:     magick_MagickImage
  389.  * Method:    getDepth
  390.  * Signature: ()I
  391.  */
  392. JNIEXPORT jint JNICALL Java_magick_MagickImage_getDepth
  393.     (JNIEnv *env, jobject self)
  394. {
  395.     Image *image = NULL;
  396.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  397.     if (image == NULL) {
  398. throwMagickException(env, "Unable to obtain image handle");
  399. return -1;
  400.     }
  401.     return image->depth;
  402. }
  403. /*
  404.  * Class:     magick_MagickImage
  405.  * Method:    blurImage
  406.  * Signature: (DD)Lmagick/MagickImage;
  407.  */
  408. JNIEXPORT jobject JNICALL Java_magick_MagickImage_blurImage
  409.   (JNIEnv *env, jobject self, jdouble radius, jdouble sigma)
  410. {
  411.     Image *image = NULL, *blurredImage = NULL;
  412.     jobject newObj;
  413.     ExceptionInfo exception;
  414.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  415.     if (image == NULL) {
  416. throwMagickException(env, "Cannot retrieve image handle");
  417. return NULL;
  418.     }
  419.     GetExceptionInfo(&exception);
  420.     blurredImage = BlurImage(image, radius, sigma, &exception);
  421.     if (blurredImage == NULL) {
  422. throwMagickApiException(env, "Cannot blur image", &exception);
  423. DestroyExceptionInfo(&exception);
  424. return NULL;
  425.     }
  426.     DestroyExceptionInfo(&exception);
  427.     newObj = newImageObject(env, blurredImage);
  428.     if (newObj == NULL) {
  429. DestroyImages(blurredImage);
  430. throwMagickException(env, "Unable to create new blurred image");
  431. return NULL;
  432.     }
  433.     return newObj;
  434. }
  435. /*
  436.  * Class:     magick_MagickImage
  437.  * Method:    getStorageClass
  438.  * Signature: ()I
  439.  */
  440. JNIEXPORT jint JNICALL Java_magick_MagickImage_getStorageClass
  441.     (JNIEnv *env, jobject self)
  442. {
  443.     Image *image = NULL;
  444.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  445.     if (image == NULL) {
  446. throwMagickException(env, "Unable to obtain image handle");
  447. return -1;
  448.     }
  449.     return image->storage_class;
  450. }
  451. /*
  452.  * Class:     magick_MagickImage
  453.  * Method:    annotateImage
  454.  * Signature: (Lmagick/AnnotateInfo;)V
  455.  */
  456. JNIEXPORT void JNICALL Java_magick_MagickImage_annotateImage
  457.     (JNIEnv *env, jobject self, jobject drawInfo)
  458. {
  459.     Image *image;
  460.     DrawInfo *dInfo;
  461.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  462.     dInfo = (DrawInfo*) getHandle(env, drawInfo,
  463.   "drawInfoHandle", NULL);
  464.     AnnotateImage(image, dInfo);
  465. }
  466. /*
  467.  * Class:     magick_MagickImage
  468.  * Method:    charcoalImage
  469.  * Signature: (DD)Lmagick/MagickImage;
  470.  */
  471. JNIEXPORT jobject JNICALL Java_magick_MagickImage_charcoalImage
  472.   (JNIEnv *env, jobject self, jdouble radius, jdouble sigma)
  473. {
  474.     Image *image = NULL, *charcoalImage = NULL;
  475.     jobject newObj;
  476.     ExceptionInfo exception;
  477.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  478.     if (image == NULL) {
  479. throwMagickException(env, "Cannot retrieve image handle");
  480. return NULL;
  481.     }
  482.     GetExceptionInfo(&exception);
  483.     charcoalImage = CharcoalImage(image, radius, sigma, &exception);
  484.     if (charcoalImage == NULL) {
  485. throwMagickApiException(env, "Cannot charcoal image", &exception);
  486. DestroyExceptionInfo(&exception);
  487. return NULL;
  488.     }
  489.     DestroyExceptionInfo(&exception);
  490.     newObj = newImageObject(env, charcoalImage);
  491.     if (newObj == NULL) {
  492. DestroyImages(charcoalImage);
  493. throwMagickException(env, "Unable to create new charcoal image");
  494. return NULL;
  495.     }
  496.     return newObj;
  497. }
  498. /*
  499.  * Class:     magick_MagickImage
  500.  * Method:    borderImage
  501.  * Signature: (Ljava/awt/Rectangle;)Lmagick/MagickImage;
  502.  */
  503. JNIEXPORT jobject JNICALL Java_magick_MagickImage_borderImage
  504.     (JNIEnv *env, jobject self, jobject jRect)
  505. {
  506.     RectangleInfo iRect;
  507.     Image *image = NULL, *borderedImage = NULL;
  508.     jobject newObj;
  509.     ExceptionInfo exception;
  510.     if (!getRectangle(env, jRect, &iRect)) {
  511. throwMagickException(env, "Cannot retrieve rectangle information");
  512. return NULL;
  513.     }
  514.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  515.     if (image == NULL) {
  516. throwMagickException(env, "Cannot retrieve image handle");
  517. return NULL;
  518.     }
  519.     GetExceptionInfo(&exception);
  520.     borderedImage = BorderImage(image, &iRect, &exception);
  521.     if (borderedImage == NULL) {
  522. throwMagickApiException(env, "Cannot border image", &exception);
  523. DestroyExceptionInfo(&exception);
  524. return NULL;
  525.     }
  526.     DestroyExceptionInfo(&exception);
  527.     newObj = newImageObject(env, borderedImage);
  528.     if (newObj == NULL) {
  529. DestroyImages(borderedImage);
  530. throwMagickException(env, "Unable to create border image");
  531. return NULL;
  532.     }
  533.     return newObj;
  534. }
  535. /*
  536.  * Class:     magick_MagickImage
  537.  * Method:    raiseImage
  538.  * Signature: (Ljava/awt/Rectangle;Z)Z
  539.  */
  540. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_raiseImage
  541.     (JNIEnv *env, jobject self, jobject jRect, jboolean raise)
  542. {
  543.     RectangleInfo iRect;
  544.     Image *image = NULL;
  545.     if (!getRectangle(env, jRect, &iRect)) {
  546. throwMagickException(env, "Cannot retrieve rectangle information");
  547. return JNI_FALSE;
  548.     }
  549.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  550.     if (image == NULL) {
  551. throwMagickException(env, "Cannot retrieve image handle");
  552. return JNI_FALSE;
  553.     }
  554.     return RaiseImage(image, &iRect, raise);
  555. }
  556. /*
  557.  * Class:     magick_MagickImage
  558.  * Method:    chopImage
  559.  * Signature: (Ljava/awt/Rectangle;)Lmagick/MagickImage;
  560.  */
  561. JNIEXPORT jobject JNICALL Java_magick_MagickImage_chopImage
  562.     (JNIEnv *env, jobject self, jobject jRect)
  563. {
  564.     RectangleInfo iRect;
  565.     Image *image = NULL, *choppedImage = NULL;
  566.     jobject newObj;
  567.     ExceptionInfo exception;
  568.     if (!getRectangle(env, jRect, &iRect)) {
  569. throwMagickException(env, "Cannot retrieve rectangle information");
  570. return NULL;
  571.     }
  572.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  573.     if (image == NULL) {
  574. throwMagickException(env, "Cannot retrieve image handle");
  575. return NULL;
  576.     }
  577.     GetExceptionInfo(&exception);
  578.     choppedImage = ChopImage(image, &iRect, &exception);
  579.     if (choppedImage == NULL) {
  580. throwMagickApiException(env, "Cannot chop image", &exception);
  581. DestroyExceptionInfo(&exception);
  582. return NULL;
  583.     }
  584.     DestroyExceptionInfo(&exception);
  585.     newObj = newImageObject(env, choppedImage);
  586.     if (newObj == NULL) {
  587. DestroyImages(choppedImage);
  588. throwMagickException(env, "Unable to chop image");
  589. return NULL;
  590.     }
  591.     return newObj;
  592. }
  593. /*
  594.  * Class:     magick_MagickImage
  595.  * Method:    colorizeImage
  596.  * Signature: (Ljava/lang/String;Lmagick/PixelPacket;)Lmagick/MagickImage;
  597.  */
  598. JNIEXPORT jobject JNICALL Java_magick_MagickImage_colorizeImage
  599.   (JNIEnv *env, jobject self, jstring opacity, jobject target)
  600. {
  601.     Image *image = NULL;
  602.     Image *newImage = NULL;
  603.     const char *cstrOpacity = NULL;
  604.     ExceptionInfo exception;
  605.     PixelPacket pixelPacket;
  606.     jobject newObj;
  607.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  608.     if (image == NULL) {
  609. throwMagickException(env, "Unable to obtain image handle");
  610. return NULL;
  611.     }
  612.     if (!getPixelPacket(env, target, &pixelPacket)) {
  613. throwMagickException(env, "Unable to get PixelPacket values");
  614. return NULL;
  615.     }
  616.     cstrOpacity = (*env)->GetStringUTFChars(env, opacity, 0);
  617.     if (cstrOpacity == NULL) {
  618. throwMagickException(env, "Unable to get opacity value");
  619. return NULL;
  620.     }
  621.     
  622.     GetExceptionInfo(&exception);
  623.     newImage = ColorizeImage(image, cstrOpacity, pixelPacket, &exception);
  624.     (*env)->ReleaseStringUTFChars(env, opacity, cstrOpacity);
  625.     if (newImage == NULL) {
  626. throwMagickApiException(env, "Unable to colorize image", &exception);
  627. DestroyExceptionInfo(&exception);
  628. return NULL;
  629.     }
  630.     DestroyExceptionInfo(&exception);
  631.     newObj = newImageObject(env, newImage);
  632.     if (newObj == NULL) {
  633. DestroyImages(newImage);
  634. throwMagickException(env, "Unable to create colorized image");
  635. return NULL;
  636.     }
  637.     return newObj;
  638. }
  639. /*
  640.  * Class:     magick_MagickImage
  641.  * Method:    compositeImage
  642.  * Signature: (ILmagick/MagickImage;II)Z
  643.  */
  644. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_compositeImage
  645.     (JNIEnv *env, jobject self, jint compOp,
  646.      jobject compImage, jint xOffset, jint yOffset)
  647. {
  648.     Image *image = NULL, *comp = NULL;
  649.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  650.     if (image == NULL) {
  651. throwMagickException(env, "Unable to retrieve image handle");
  652. return JNI_FALSE;
  653.     }
  654.     comp = (Image*) getHandle(env, compImage, "magickImageHandle", NULL);
  655.     if (comp == NULL) {
  656. throwMagickException(env, "Unable to retrieve composite image handle");
  657. return JNI_FALSE;
  658.     }
  659.     return CompositeImage(image, compOp, comp, xOffset, yOffset);
  660. }
  661. /*
  662.  * Class:     magick_MagickImage
  663.  * Method:    contrastImage
  664.  * Signature: (Z)Z
  665.  */
  666. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_contrastImage
  667.     (JNIEnv *env, jobject self, jboolean sharpen)
  668. {
  669.     Image *image = NULL;
  670.     image = getHandle(env, self, "magickImageHandle", NULL);
  671.     if (image == NULL) {
  672. throwMagickException(env, "Unable to obtain image handle");
  673. return JNI_FALSE;
  674.     }
  675.     return ContrastImage(image, sharpen);
  676. }
  677. /*
  678.  * Class:     magick_MagickImage
  679.  * Method:    cloneImage
  680.  * Signature: (IIZ)Lmagick/MagickImage;
  681.  */
  682. JNIEXPORT jobject JNICALL Java_magick_MagickImage_cloneImage
  683.     (JNIEnv *env, jobject self, jint columns, jint rows, jboolean clonePixels)
  684. {
  685.     Image *image = NULL, *clone = NULL;
  686.     jfieldID handleFid = 0;
  687.     jobject clonedImage;
  688.     ExceptionInfo exception;
  689.     image = (Image*) getHandle(env, self, "magickImageHandle", &handleFid);
  690.     if (image == NULL) {
  691. throwMagickException(env, "Unable to retrieve image handle");
  692. return NULL;
  693.     }
  694.     GetExceptionInfo(&exception);
  695.     clone = CloneImage(image, columns, rows, clonePixels, &exception);
  696.     if (clone == NULL) {
  697. throwMagickApiException(env, "Unable to clone image", &exception);
  698. DestroyExceptionInfo(&exception);
  699. return NULL;
  700.     }
  701.     DestroyExceptionInfo(&exception);
  702.     clonedImage = newImageObject(env, clone);
  703.     if (clonedImage == NULL) {
  704. throwMagickException(env, "Unable to create clone image instance");
  705. return NULL;
  706.     }
  707.     return clonedImage;
  708. }
  709. /*
  710.  * Class:     magick_MagickImage
  711.  * Method:    constituteImage
  712.  * Signature: (IILjava/lang/String;[B)V
  713.  */
  714. JNIEXPORT void JNICALL
  715.     Java_magick_MagickImage_constituteImage__IILjava_lang_String_2_3B
  716.     (JNIEnv *env, jobject self,
  717.      jint width, jint height,
  718.      jstring map,
  719.      jbyteArray pixels)
  720. {
  721.     Image *image = NULL, *oldImage = NULL;
  722.     jfieldID fieldID = 0;
  723.     jint arraySize;
  724.     jbyte *pixelArray;
  725.     const char *mapStr;
  726.     ExceptionInfo exception;
  727.     /* Check that we really have the pixels. */
  728.     if (pixels == NULL) {
  729. throwMagickException(env, "Pixels not allocated");
  730. return;
  731.     }
  732.     /* Check the array size. */
  733.     mapStr = (*env)->GetStringUTFChars(env, map, 0);
  734.     arraySize = width * height * strlen(mapStr);
  735.     if ((*env)->GetArrayLength(env, pixels) < arraySize) {
  736. throwMagickException(env, "Pixels size too small");
  737. (*env)->ReleaseStringUTFChars(env, map, mapStr);
  738. return;
  739.     }
  740.     pixelArray = (*env)->GetByteArrayElements(env, pixels, 0);
  741. #ifdef DIAGNOSTIC
  742.     fprintf(stderr, "Image width is %d, height is %dn", width, height);
  743. #endif
  744.     
  745.     /* Create that image. */
  746.     GetExceptionInfo(&exception);
  747.     image = ConstituteImage(width, height, mapStr,
  748.     CharPixel, pixelArray, &exception);
  749.     if (image == NULL) {
  750. throwMagickApiException(env, "Unable to create image", &exception);
  751. (*env)->ReleaseStringUTFChars(env, map, mapStr);
  752. (*env)->ReleaseByteArrayElements(env, pixels, pixelArray, 0);
  753. DestroyExceptionInfo(&exception);
  754. return;
  755.     }
  756.     DestroyExceptionInfo(&exception);
  757.     /* Get the old image handle and deallocate it (if required). */
  758.     oldImage = (Image*) getHandle(env, self, "magickImageHandle", &fieldID);
  759.     if (oldImage != NULL) {
  760. DestroyImages(oldImage);
  761.     }
  762.     /* Store the image into the handle. */
  763.     setHandle(env, self, "magickImageHandle", (void*) image, &fieldID);    
  764.     (*env)->ReleaseStringUTFChars(env, map, mapStr);
  765.     (*env)->ReleaseByteArrayElements(env, pixels, pixelArray, 0);
  766. }
  767. /*
  768.  * Class:     magick_MagickImage
  769.  * Method:    constituteImage
  770.  * Signature: (IILjava/lang/String;[I)V
  771.  */
  772. JNIEXPORT void JNICALL
  773.     Java_magick_MagickImage_constituteImage__IILjava_lang_String_2_3I
  774.     (JNIEnv *env, jobject self,
  775.      jint width, jint height,
  776.      jstring map,
  777.      jintArray pixels)
  778. {
  779.     Image *image = NULL, *oldImage = NULL;
  780.     jfieldID fieldID = 0;
  781.     jint arraySize;
  782.     jint *pixelArray;
  783.     const char *mapStr;
  784.     ExceptionInfo exception;
  785.     /* Check that we really have the pixels. */
  786.     if (pixels == NULL) {
  787. throwMagickException(env, "Pixels not allocated");
  788. return;
  789.     }
  790.     /* Check the array size. */
  791.     mapStr = (*env)->GetStringUTFChars(env, map, 0);
  792.     arraySize = width * height * strlen(mapStr);
  793.     if ((*env)->GetArrayLength(env, pixels) < arraySize) {
  794. throwMagickException(env, "Pixels size too small");
  795. (*env)->ReleaseStringUTFChars(env, map, mapStr);
  796. return;
  797.     }
  798.     pixelArray = (*env)->GetIntArrayElements(env, pixels, 0);
  799.     
  800.     /* Create that image. */
  801.     GetExceptionInfo(&exception);
  802.     image = ConstituteImage(width, height, mapStr, IntegerPixel,
  803.     pixelArray, &exception);
  804.     if (image == NULL) {
  805. throwMagickApiException(env, "Unable to create image", &exception);
  806. (*env)->ReleaseStringUTFChars(env, map, mapStr);
  807. (*env)->ReleaseIntArrayElements(env, pixels, pixelArray, 0);
  808. DestroyExceptionInfo(&exception);
  809. return;
  810.     }
  811.     DestroyExceptionInfo(&exception);
  812.     /* Get the old image handle and deallocate it (if required). */
  813.     oldImage = (Image*) getHandle(env, self, "magickImageHandle", &fieldID);
  814.     if (oldImage != NULL) {
  815. DestroyImages(oldImage);
  816.     }
  817.     /* Store the image into the handle. */
  818.     setHandle(env, self, "magickImageHandle", (void*) image, &fieldID);    
  819.     (*env)->ReleaseStringUTFChars(env, map, mapStr);
  820.     (*env)->ReleaseIntArrayElements(env, pixels, pixelArray, 0);
  821. }
  822. /*
  823.  * Class:     magick_MagickImage
  824.  * Method:    constituteImage
  825.  * Signature: (IILjava/lang/String;[F)V
  826.  */
  827. JNIEXPORT void JNICALL
  828.     Java_magick_MagickImage_constituteImage__IILjava_lang_String_2_3F
  829.     (JNIEnv *env, jobject self,
  830.      jint width, jint height,
  831.      jstring map, jfloatArray pixels)
  832. {
  833.     Image *image = NULL, *oldImage = NULL;
  834.     jfieldID fieldID = 0;
  835.     jint arraySize;
  836.     jfloat *pixelArray;
  837.     const char *mapStr;
  838.     ExceptionInfo exception;
  839.     /* Check that we really have the pixels. */
  840.     if (pixels == NULL) {
  841. throwMagickException(env, "Pixels not allocated");
  842. return;
  843.     }
  844.     /* Check the array size. */
  845.     mapStr = (*env)->GetStringUTFChars(env, map, 0);
  846.     arraySize = width * height * strlen(mapStr);
  847.     if ((*env)->GetArrayLength(env, pixels) < arraySize) {
  848. throwMagickException(env, "Pixels size too small");
  849. (*env)->ReleaseStringUTFChars(env, map, mapStr);
  850. return;
  851.     }
  852.     pixelArray = (*env)->GetFloatArrayElements(env, pixels, 0);
  853.     
  854.     /* Create that image. */
  855.     GetExceptionInfo(&exception);
  856.     image = ConstituteImage(width, height, mapStr,
  857.     FloatPixel, pixelArray, &exception);
  858.     if (image == NULL) {
  859. throwMagickApiException(env, "Unable to create image", &exception);
  860. (*env)->ReleaseStringUTFChars(env, map, mapStr);
  861. (*env)->ReleaseFloatArrayElements(env, pixels, pixelArray, 0);
  862. DestroyExceptionInfo(&exception);
  863. return;
  864.     }
  865.     DestroyExceptionInfo(&exception);
  866.     /* Get the old image handle and deallocate it (if required). */
  867.     oldImage = (Image*) getHandle(env, self, "magickImageHandle", &fieldID);
  868.     if (oldImage != NULL) {
  869. DestroyImages(oldImage);
  870.     }
  871.     /* Store the image into the handle. */
  872.     setHandle(env, self, "magickImageHandle", (void*) image, &fieldID);    
  873.     (*env)->ReleaseStringUTFChars(env, map, mapStr);
  874.     (*env)->ReleaseFloatArrayElements(env, pixels, pixelArray, 0);
  875. }
  876. /*
  877.  * Class:     magick_MagickImage
  878.  * Method:    cropImage
  879.  * Signature: (Ljava/awt/Rectangle;)Lmagick/MagickImage;
  880.  */
  881. JNIEXPORT jobject JNICALL Java_magick_MagickImage_cropImage
  882.     (JNIEnv *env, jobject self, jobject jRect)
  883. {
  884.     RectangleInfo iRect;
  885.     Image *image = NULL, *croppedImage = NULL;
  886.     jobject newObj;
  887.     ExceptionInfo exception;
  888.     if (!getRectangle(env, jRect, &iRect)) {
  889. throwMagickException(env, "Cannot retrieve rectangle information");
  890. return NULL;
  891.     }
  892.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  893.     if (image == NULL) {
  894. throwMagickException(env, "Cannot retrieve image handle");
  895. return NULL;
  896.     }
  897.     GetExceptionInfo(&exception);
  898.     croppedImage = CropImage(image, &iRect, &exception);
  899.     if (croppedImage == NULL) {
  900. throwMagickApiException(env, "Cannot crop image", &exception);
  901. DestroyExceptionInfo(&exception);
  902. return NULL;
  903.     }
  904.     DestroyExceptionInfo(&exception);
  905.     newObj = newImageObject(env, croppedImage);
  906.     if (newObj == NULL) {
  907. DestroyImages(croppedImage);
  908. throwMagickException(env, "Unable to crop image");
  909. return NULL;
  910.     }
  911.     return newObj;
  912. }
  913. /*
  914.  * Class:     magick_MagickImage
  915.  * Method:    cycleColormapImage
  916.  * Signature: ()V
  917.  */
  918. JNIEXPORT void JNICALL Java_magick_MagickImage_cycleColormapImage
  919.     (JNIEnv *env, jobject self, jint amount)
  920. {
  921.     Image *image = NULL;
  922.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  923.     if (image == NULL) {
  924. throwMagickException(env, "Cannot retrieve handle");
  925. return;
  926.     }
  927.     CycleColormapImage(image, amount);
  928. }
  929. /*
  930.  * Class:     magick_MagickImage
  931.  * Method:    edgeImage
  932.  * Signature: (D)Lmagick/MagickImage;
  933.  */
  934. JNIEXPORT jobject JNICALL Java_magick_MagickImage_edgeImage
  935.   (JNIEnv *env, jobject self, jdouble radius)
  936. {
  937.     Image *image = NULL, *edgedImage = NULL;
  938.     jobject newObj;
  939.     ExceptionInfo exception;
  940.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  941.     if (image == NULL) {
  942. throwMagickException(env, "Cannot retrieve image handle");
  943. return NULL;
  944.     }
  945.     GetExceptionInfo(&exception);
  946.     edgedImage = EdgeImage(image, radius, &exception);
  947.     if (edgedImage == NULL) {
  948. throwMagickApiException(env, "Cannot edge image", &exception);
  949. DestroyExceptionInfo(&exception);
  950. return NULL;
  951.     }
  952.     DestroyExceptionInfo(&exception);
  953.     newObj = newImageObject(env, edgedImage);
  954.     if (newObj == NULL) {
  955. DestroyImages(edgedImage);
  956. throwMagickException(env, "Unable to create new edged image");
  957. return NULL;
  958.     }
  959.     return newObj;
  960. }
  961. /*
  962.  * Class:     magick_MagickImage
  963.  * Method:    embossImage
  964.  * Signature: (DD)Lmagick/MagickImage;
  965.  */
  966. JNIEXPORT jobject JNICALL Java_magick_MagickImage_embossImage
  967.   (JNIEnv *env, jobject self, jdouble radius, jdouble sigma)
  968. {
  969.     Image *image = NULL, *embossedImage = NULL;
  970.     jobject newObj;
  971.     ExceptionInfo exception;
  972.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  973.     if (image == NULL) {
  974. throwMagickException(env, "Cannot retrieve image handle");
  975. return NULL;
  976.     }
  977.     GetExceptionInfo(&exception);
  978.     embossedImage = EmbossImage(image, radius, sigma, &exception);
  979.     if (embossedImage == NULL) {
  980. throwMagickApiException(env, "Cannot emboss image", &exception);
  981. DestroyExceptionInfo(&exception);
  982. return NULL;
  983.     }
  984.     DestroyExceptionInfo(&exception);
  985.     newObj = newImageObject(env, embossedImage);
  986.     if (newObj == NULL) {
  987. DestroyImages(embossedImage);
  988. throwMagickException(env, "Unable to create new embossed image");
  989. return NULL;
  990.     }
  991.     return newObj;
  992. }
  993. /*
  994.  * Class:     magick_MagickImage
  995.  * Method:    enhanceImage
  996.  * Signature: ()Lmagick/MagickImage;
  997.  */
  998. JNIEXPORT jobject JNICALL Java_magick_MagickImage_enhanceImage
  999.     (JNIEnv *env, jobject self)
  1000. {
  1001.     jobject newImage;
  1002.     Image *image, *enhancedImage;
  1003.     ExceptionInfo exception;
  1004.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1005.     if (image == NULL) {
  1006. throwMagickException(env, "Cannot obtain image handle");
  1007. return NULL;
  1008.     }
  1009.     GetExceptionInfo(&exception);
  1010.     enhancedImage = EnhanceImage(image, &exception);
  1011.     if (enhancedImage == NULL) {
  1012. throwMagickApiException(env, "Cannot enhance image", &exception);
  1013. DestroyExceptionInfo(&exception);
  1014. return NULL;
  1015.     }
  1016.     DestroyExceptionInfo(&exception);
  1017.     newImage = newImageObject(env, enhancedImage);
  1018.     if (newImage == NULL) {
  1019. DestroyImages(enhancedImage);
  1020. throwMagickException(env, "Cannot create new MagickImage object");
  1021. return NULL;
  1022.     }
  1023.     return newImage;
  1024. }
  1025. /*
  1026.  * Class:     magick_MagickImage
  1027.  * Method:    destroyImages
  1028.  * Signature: ()V
  1029.  */
  1030. JNIEXPORT void JNICALL Java_magick_MagickImage_destroyImages
  1031.     (JNIEnv *env, jobject self)
  1032. {
  1033.     jfieldID handleFid = 0;
  1034.     Image *image = NULL;
  1035.     image = (Image*) getHandle(env, self, "magickImageHandle", &handleFid);
  1036.     if (image != NULL) {
  1037. DestroyImages(image);
  1038.     }
  1039.     setHandle(env, self, "magickImageHandle", NULL, &handleFid);
  1040. }
  1041. /*
  1042.  * Class:     magick_MagickImage
  1043.  * Method:    drawImage
  1044.  * Signature: (Lmagick/DrawInfo;)Z
  1045.  */
  1046. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_drawImage
  1047.     (JNIEnv *env, jobject self, jobject drawInfoObj)
  1048. {
  1049.     DrawInfo *drawInfo;
  1050.     Image *image;
  1051.     drawInfo = (DrawInfo*) getHandle(env, drawInfoObj,
  1052.      "drawInfoHandle", NULL);
  1053.     if (drawInfo == NULL) {
  1054. throwMagickException(env, "Cannot obtain DrawInfo handle");
  1055. return JNI_FALSE;
  1056.     }
  1057.     
  1058.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1059.     if (image == NULL) {
  1060. throwMagickException(env, "Cannot obtain image handle");
  1061. return JNI_FALSE;
  1062.     }
  1063. #ifdef DIAGNOSTIC
  1064.     printf("Primitive: %sn", drawInfo->primitive);
  1065.     printf("Font: %sn", drawInfo->font);
  1066.     printf("encoding: %sn", drawInfo->encoding);
  1067. #endif
  1068.     return DrawImage(image, drawInfo);
  1069. }
  1070. /*
  1071.  * Class:     magick_MagickImage
  1072.  * Method:    equalizeImage
  1073.  * Signature: ()Z
  1074.  */
  1075. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_equalizeImage
  1076.     (JNIEnv *env, jobject self)
  1077. {
  1078.     Image *image =
  1079. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1080.     if (image == NULL) {
  1081. throwMagickException(env, "Cannot obtain image handle");
  1082. return JNI_FALSE;
  1083.     }
  1084.     return EqualizeImage(image);
  1085. }
  1086. /*
  1087.  * Class:     magick_MagickImage
  1088.  * Method:    flipImage
  1089.  * Signature: ()Lmagick/MagickImage;
  1090.  */
  1091. JNIEXPORT jobject JNICALL Java_magick_MagickImage_flipImage
  1092.     (JNIEnv *env, jobject self)
  1093. {
  1094.     jobject newImage;
  1095.     Image *image, *flippedImage;
  1096.     ExceptionInfo exception;
  1097.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1098.     if (image == NULL) {
  1099. throwMagickException(env, "Cannot obtain image handle");
  1100. return NULL;
  1101.     }
  1102.     GetExceptionInfo(&exception);
  1103.     flippedImage = FlipImage(image, &exception);
  1104.     if (flippedImage == NULL) {
  1105. throwMagickApiException(env, "Cannot flip image", &exception);
  1106. DestroyExceptionInfo(&exception);
  1107. return NULL;
  1108.     }
  1109.     DestroyExceptionInfo(&exception);
  1110.     newImage = newImageObject(env, flippedImage);
  1111.     if (newImage == NULL) {
  1112. DestroyImages(flippedImage);
  1113. throwMagickException(env, "Cannot create new MagickImage object");
  1114. return NULL;
  1115.     }
  1116.     return newImage;
  1117. }
  1118. /*
  1119.  * Class:     magick_MagickImage
  1120.  * Method:    flopImage
  1121.  * Signature: ()Lmagick/MagickImage;
  1122.  */
  1123. JNIEXPORT jobject JNICALL Java_magick_MagickImage_flopImage
  1124.     (JNIEnv *env, jobject self)
  1125. {
  1126.     jobject newImage;
  1127.     Image *image, *floppedImage;
  1128.     ExceptionInfo exception;
  1129.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1130.     if (image == NULL) {
  1131. throwMagickException(env, "Cannot obtain image handle");
  1132. return NULL;
  1133.     }
  1134.     GetExceptionInfo(&exception);
  1135.     floppedImage = FlopImage(image, &exception);
  1136.     if (floppedImage == NULL) {
  1137. throwMagickApiException(env, "Cannot flop image", &exception);
  1138. DestroyExceptionInfo(&exception);
  1139. return NULL;
  1140.     }
  1141.     DestroyExceptionInfo(&exception);
  1142.     newImage = newImageObject(env, floppedImage);
  1143.     if (newImage == NULL) {
  1144. DestroyImages(floppedImage);
  1145. throwMagickException(env, "Cannot create new MagickImage object");
  1146. return NULL;
  1147.     }
  1148.     return newImage;
  1149. }
  1150. /*
  1151.  * Class:     magick_MagickImage
  1152.  * Method:    gaussianBlurImage
  1153.  * Signature: (DD)Lmagick/MagickImage;
  1154.  */
  1155. JNIEXPORT jobject JNICALL Java_magick_MagickImage_gaussianBlurImage
  1156.   (JNIEnv *env, jobject self, jdouble radius, jdouble sigma)
  1157. {
  1158.     Image *image = NULL, *blurredImage = NULL;
  1159.     jobject newObj;
  1160.     ExceptionInfo exception;
  1161.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1162.     if (image == NULL) {
  1163. throwMagickException(env, "Cannot retrieve image handle");
  1164. return NULL;
  1165.     }
  1166.     GetExceptionInfo(&exception);
  1167.     blurredImage = GaussianBlurImage(image, radius, sigma, &exception);
  1168.     if (blurredImage == NULL) {
  1169. throwMagickApiException(env, "Cannot blur image", &exception);
  1170. DestroyExceptionInfo(&exception);
  1171. return NULL;
  1172.     }
  1173.     DestroyExceptionInfo(&exception);
  1174.     newObj = newImageObject(env, blurredImage);
  1175.     if (newObj == NULL) {
  1176. DestroyImages(blurredImage);
  1177. throwMagickException(env, "Unable to create Gaussian blurred image");
  1178. return NULL;
  1179.     }
  1180.     return newObj;
  1181. }
  1182. /*
  1183.  * Class:     magick_MagickImage
  1184.  * Method:    implodeImage
  1185.  * Signature: (D)Lmagick/MagickImage;
  1186.  */
  1187. JNIEXPORT jobject JNICALL Java_magick_MagickImage_implodeImage
  1188.   (JNIEnv *env, jobject self, jdouble amount)
  1189. {
  1190.     Image *image = NULL, *implodedImage = NULL;
  1191.     jobject newObj;
  1192.     ExceptionInfo exception;
  1193.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1194.     if (image == NULL) {
  1195. throwMagickException(env, "Cannot retrieve image handle");
  1196. return NULL;
  1197.     }
  1198.     GetExceptionInfo(&exception);
  1199.     implodedImage = ImplodeImage(image, amount, &exception);
  1200.     if (implodedImage == NULL) {
  1201. throwMagickApiException(env, "Cannot implode image", &exception);
  1202. DestroyExceptionInfo(&exception);
  1203. return NULL;
  1204.     }
  1205.     DestroyExceptionInfo(&exception);
  1206.     newObj = newImageObject(env, implodedImage);
  1207.     if (newObj == NULL) {
  1208. DestroyImages(implodedImage);
  1209. throwMagickException(env, "Unable to create imploded image");
  1210. return NULL;
  1211.     }
  1212.     return newObj;
  1213. }
  1214. /*
  1215.  * Class:     magick_MagickImage
  1216.  * Method:    gammaImage
  1217.  * Signature: (Ljava/lang/String;)Z
  1218.  */
  1219. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_gammaImage
  1220.     (JNIEnv *env, jobject self, jstring gamma)
  1221. {
  1222.     const char *cstr;
  1223.     unsigned int result;
  1224.     Image *image =
  1225. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1226.     if (image == NULL) {
  1227. throwMagickException(env, "Cannot obtain image handle");
  1228. return JNI_FALSE;
  1229.     }
  1230.     cstr = (*env)->GetStringUTFChars(env, gamma, 0);
  1231.     result = GammaImage(image, (char*) cstr);
  1232.     (*env)->ReleaseStringUTFChars(env, gamma, cstr);
  1233.     return result;
  1234. }
  1235. /*
  1236.  * Class:     magick_MagickImage
  1237.  * Method:    isGrayImage
  1238.  * Signature: ()Z
  1239.  */
  1240. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_isGrayImage
  1241.     (JNIEnv *env, jobject self)
  1242. {
  1243.     int result;
  1244.     ExceptionInfo exception;
  1245.     Image *image =
  1246. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1247.     if (image == NULL) {
  1248. throwMagickException(env, "Cannot obtain image handle");
  1249. return JNI_FALSE;
  1250.     }
  1251.     GetExceptionInfo(&exception);
  1252.     result = IsGrayImage(image, &exception);
  1253.     DestroyExceptionInfo(&exception);
  1254.     return result;
  1255. }
  1256. /*
  1257.  * Class:     magick_MagickImage
  1258.  * Method:    isMonochromeImage
  1259.  * Signature: ()Z
  1260.  */
  1261. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_isMonochromeImage
  1262.     (JNIEnv *env, jobject self)
  1263. {
  1264.     ExceptionInfo exception;
  1265.     int result;
  1266.     Image *image =
  1267. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1268.     if (image == NULL) {
  1269. throwMagickException(env, "Cannot obtain image handle");
  1270. return JNI_FALSE;
  1271.     }
  1272.     /* Problem here is that although we have an error, how */
  1273.     /* do we know that an error has occur? */
  1274.     GetExceptionInfo(&exception);
  1275.     result = IsMonochromeImage(image, &exception);
  1276.     DestroyExceptionInfo(&exception);
  1277.     return result;
  1278. }
  1279. /*
  1280.  * Class:     magick_MagickImage
  1281.  * Method:    magnifyImage
  1282.  * Signature: ()Lmagick/MagickImage;
  1283.  */
  1284. JNIEXPORT jobject JNICALL Java_magick_MagickImage_magnifyImage
  1285.   (JNIEnv *env, jobject self)
  1286. {
  1287.     jobject newImage;
  1288.     Image *magnifiedImage;
  1289.     ExceptionInfo exception;
  1290.     Image *image =
  1291. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1292.     if (image == NULL) {
  1293. throwMagickException(env, "Cannot obtain image handle");
  1294. return NULL;
  1295.     }
  1296.     GetExceptionInfo(&exception);
  1297.     magnifiedImage = MagnifyImage(image, &exception);
  1298.     if (magnifiedImage == NULL) {
  1299. throwMagickApiException(env, "Unable to magnify image", &exception);
  1300. DestroyExceptionInfo(&exception);
  1301. return NULL;
  1302.     }
  1303.     DestroyExceptionInfo(&exception);
  1304.     newImage = newImageObject(env, magnifiedImage);
  1305.     if (newImage == NULL) {
  1306. DestroyImages(magnifiedImage);
  1307. throwMagickException(env, "Cannot create new MagickImage object");
  1308. return NULL;
  1309.     }
  1310.     return newImage;
  1311. }
  1312. /*
  1313.  * Class:     magick_MagickImage
  1314.  * Method:    matteFloodfillImage
  1315.  * Signature: (Lmagick/RunlengthPacket;IIII)Z
  1316.  */
  1317. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_matteFloodfillImage
  1318.   (JNIEnv *env, jobject self,
  1319.    jobject target, jint matte, jint x, jint y, jint method)
  1320. {
  1321.     PixelPacket pixPack;
  1322.     Image *image =
  1323. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1324.     if (image == NULL) {
  1325. throwMagickException(env, "Cannot obtain image handle");
  1326. return -1;
  1327.     }
  1328.     if (!getPixelPacket(env, target, &pixPack)) {
  1329. throwMagickException(env, "Unable get target PixelPacket");
  1330. return -1;
  1331.     }
  1332.     return MatteFloodfillImage(image, pixPack, matte, x, y, method);
  1333. }
  1334. /*
  1335.  * Class:     magick_MagickImage
  1336.  * Method:    medianFilterImage
  1337.  * Signature: (D)Lmagick/MagickImage;
  1338.  */
  1339. JNIEXPORT jobject JNICALL Java_magick_MagickImage_medianFilterImage
  1340.   (JNIEnv *env, jobject self, jdouble radius)
  1341. {
  1342.     Image *image = NULL, *filteredImage = NULL;
  1343.     jobject newObj;
  1344.     ExceptionInfo exception;
  1345.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1346.     if (image == NULL) {
  1347. throwMagickException(env, "Cannot retrieve image handle");
  1348. return NULL;
  1349.     }
  1350.     GetExceptionInfo(&exception);
  1351.     filteredImage = MedianFilterImage(image, radius, &exception);
  1352.     if (filteredImage == NULL) {
  1353. throwMagickApiException(env, "Cannot median-filter image", &exception);
  1354. DestroyExceptionInfo(&exception);
  1355. return NULL;
  1356.     }
  1357.     DestroyExceptionInfo(&exception);
  1358.     newObj = newImageObject(env, filteredImage);
  1359.     if (newObj == NULL) {
  1360. DestroyImages(filteredImage);
  1361. throwMagickException(env, "Unable to create median-filtered image");
  1362. return NULL;
  1363.     }
  1364.     return newObj;
  1365. }
  1366. /*
  1367.  * Class:     magick_MagickImage
  1368.  * Method:    colorFloodfillImage
  1369.  * Signature: (Lmagick/DrawInfo;Lmagick/PixelPacket;III)Z
  1370.  */
  1371. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_colorFloodfillImage
  1372.   (JNIEnv *env, jobject self, jobject drawInfo, jobject target,
  1373.    jint x, jint y, jint paintMethod)
  1374. {
  1375.     PixelPacket pixPack;
  1376.     Image *image =
  1377.         (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1378.     DrawInfo *dInfo;
  1379.     if (image == NULL) {
  1380. throwMagickException(env, "Cannot obtain image handle");
  1381. return -1;
  1382.     }
  1383.     dInfo = (DrawInfo*) getHandle(env, drawInfo, "drawInfoHandle", NULL);
  1384.     if (dInfo == NULL) {
  1385.         throwMagickException(env, "Cannot obtain DrawInfo handle");
  1386.         return -1;
  1387.     }
  1388.     if (!getPixelPacket(env, target, &pixPack)) {
  1389. throwMagickException(env, "Unable get target PixelPacket");
  1390. return -1;
  1391.     }
  1392.     return ColorFloodfillImage(image, dInfo, pixPack, x, y, paintMethod);
  1393. }
  1394. /*
  1395.  * Class:     magick_MagickImage
  1396.  * Method:    minifyImage
  1397.  * Signature: ()Lmagick/MagickImage;
  1398.  */
  1399. JNIEXPORT jobject JNICALL Java_magick_MagickImage_minifyImage
  1400.     (JNIEnv *env, jobject self)
  1401. {
  1402.     jobject newImage;
  1403.     Image *minifiedImage;
  1404.     ExceptionInfo exception;
  1405.     Image *image =
  1406. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1407.     if (image == NULL) {
  1408. throwMagickException(env, "Cannot obtain image handle");
  1409. return NULL;
  1410.     }
  1411.     GetExceptionInfo(&exception);
  1412.     minifiedImage = MinifyImage(image, &exception);
  1413.     if (minifiedImage == NULL) {
  1414. throwMagickApiException(env, "Unable to minify image", &exception);
  1415. DestroyExceptionInfo(&exception);
  1416. return NULL;
  1417.     }
  1418.     DestroyExceptionInfo(&exception);
  1419.     newImage = newImageObject(env, minifiedImage);
  1420.     if (newImage == NULL) {
  1421. DestroyImages(minifiedImage);
  1422. throwMagickException(env, "Cannot create new MagickImage object");
  1423. return NULL;
  1424.     }
  1425.     return newImage;
  1426. }
  1427. /*
  1428.  * Class:     magick_MagickImage
  1429.  * Method:    modulateImage
  1430.  * Signature: (Ljava/lang/String;)Z
  1431.  */
  1432. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_modulateImage
  1433.     (JNIEnv *env, jobject self, jstring modulate)
  1434. {
  1435.     const char *cstr;
  1436.     int result;
  1437.     Image *image =
  1438. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1439.     if (image == NULL) {
  1440. throwMagickException(env, "Cannot obtain image handle");
  1441. return JNI_FALSE;
  1442.     }
  1443.     cstr = (*env)->GetStringUTFChars(env, modulate, 0);
  1444.     result = ModulateImage(image, (char*) cstr);
  1445.     (*env)->ReleaseStringUTFChars(env, modulate, cstr);
  1446.     return result;
  1447. }
  1448. /*
  1449.  * Class:     magick_MagickImage
  1450.  * Method:    oilPaintImage
  1451.  * Signature: (D)Lmagick/MagickImage;
  1452.  */
  1453. JNIEXPORT jobject JNICALL Java_magick_MagickImage_oilPaintImage
  1454.   (JNIEnv *env, jobject self, jdouble radius)
  1455. {
  1456.     Image *image = NULL, *paintedImage = NULL;
  1457.     jobject newObj;
  1458.     ExceptionInfo exception;
  1459.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1460.     if (image == NULL) {
  1461. throwMagickException(env, "Cannot retrieve image handle");
  1462. return NULL;
  1463.     }
  1464.     GetExceptionInfo(&exception);
  1465.     paintedImage = OilPaintImage(image, radius, &exception);
  1466.     if (paintedImage == NULL) {
  1467. throwMagickApiException(env, "Cannot oil-paint image", &exception);
  1468. DestroyExceptionInfo(&exception);
  1469. return NULL;
  1470.     }
  1471.     DestroyExceptionInfo(&exception);
  1472.     newObj = newImageObject(env, paintedImage);
  1473.     if (newObj == NULL) {
  1474. DestroyImages(paintedImage);
  1475. throwMagickException(env, "Unable to create oil-paint image");
  1476. return NULL;
  1477.     }
  1478.     return newObj;
  1479. }
  1480. /*
  1481.  * Class:     magick_MagickImage
  1482.  * Method:    negateImage
  1483.  * Signature: (I)Z
  1484.  */
  1485. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_negateImage
  1486.     (JNIEnv *env, jobject self, jint grayscale)
  1487. {
  1488.     Image *image =
  1489. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1490.     if (image == NULL) {
  1491. throwMagickException(env, "Cannot obtain image handle");
  1492. return JNI_FALSE;
  1493.     }
  1494.     return NegateImage(image, grayscale);
  1495. }
  1496. /*
  1497.  * Class:     magick_MagickImage
  1498.  * Method:    reduceNoiseImage
  1499.  * Signature: (D)Lmagick/MagickImage;
  1500.  */
  1501. JNIEXPORT jobject JNICALL Java_magick_MagickImage_reduceNoiseImage
  1502.   (JNIEnv *env, jobject self, jdouble radius)
  1503. {
  1504.     Image *image = NULL, *filteredImage = NULL;
  1505.     jobject newObj;
  1506.     ExceptionInfo exception;
  1507.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1508.     if (image == NULL) {
  1509. throwMagickException(env, "Cannot retrieve image handle");
  1510. return NULL;
  1511.     }
  1512.     GetExceptionInfo(&exception);
  1513.     filteredImage = ReduceNoiseImage(image, radius, &exception);
  1514.     if (filteredImage == NULL) {
  1515. throwMagickApiException(env, "Cannot peak-filter image", &exception);
  1516. DestroyExceptionInfo(&exception);
  1517. return NULL;
  1518.     }
  1519.     DestroyExceptionInfo(&exception);
  1520.     newObj = newImageObject(env, filteredImage);
  1521.     if (newObj == NULL) {
  1522. DestroyImages(filteredImage);
  1523. throwMagickException(env, "Unable to create peak-filtered image");
  1524. return NULL;
  1525.     }
  1526.     return newObj;
  1527. }
  1528. /*
  1529.  * Class:     magick_MagickImage
  1530.  * Method:    normalizeImage
  1531.  * Signature: ()Z
  1532.  */
  1533. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_normalizeImage
  1534.     (JNIEnv *env, jobject self)
  1535. {
  1536.     Image *image =
  1537. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1538.     if (image == NULL) {
  1539. throwMagickException(env, "Cannot obtain image handle");
  1540. return JNI_FALSE;
  1541.     }
  1542.     return NormalizeImage(image);
  1543. }
  1544. /*
  1545.  * Class:     magick_MagickImage
  1546.  * Method:    opaqueImage
  1547.  * Signature: (Lmagick/PixelPacket;Lmagick/PixelPacket;)Z
  1548.  */
  1549. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_opaqueImage
  1550.     (JNIEnv *env, jobject self, jobject target, jobject penColor)
  1551. {
  1552.     PixelPacket ppTarget, ppPenColor;
  1553.     Image *image =
  1554. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1555.     if (image == NULL) {
  1556. throwMagickException(env, "Cannot obtain image handle");
  1557. return JNI_FALSE;
  1558.     }
  1559.     
  1560.     if (!getPixelPacket(env, target, &ppTarget) ||
  1561. !getPixelPacket(env, penColor, &ppPenColor)) {
  1562. throwMagickException(env, "Unable to obtain PixelPacket values");
  1563. return JNI_FALSE;
  1564.     }
  1565.     return OpaqueImage(image, ppTarget, ppPenColor);
  1566. }
  1567. /*
  1568.  * Class:     magick_MagickImage
  1569.  * Method:    rgbTransformImage
  1570.  * Signature: (I)Z
  1571.  */
  1572. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_rgbTransformImage
  1573.     (JNIEnv *env, jobject self, jint colorspace)
  1574. {
  1575.     Image *image =
  1576. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1577.     if (image == NULL) {
  1578. throwMagickException(env, "Cannot obtain image handle");
  1579. return JNI_FALSE;
  1580.     }
  1581.     return RGBTransformImage(image, colorspace);
  1582. }
  1583. /*
  1584.  * Class:     magick_MagickImage
  1585.  * Method:    rollImage
  1586.  * Signature: (II)Lmagick/MagickImage;
  1587.  */
  1588. JNIEXPORT jobject JNICALL Java_magick_MagickImage_rollImage
  1589.     (JNIEnv *env, jobject self, jint xOffset, jint yOffset)
  1590. {    
  1591.     jobject newImage;
  1592.     Image *rolledImage;
  1593.     ExceptionInfo exception;
  1594.     Image *image =
  1595. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1596.     if (image == NULL) {
  1597. throwMagickException(env, "Cannot obtain image handle");
  1598. return NULL;
  1599.     }
  1600.     GetExceptionInfo(&exception);
  1601.     rolledImage = RollImage(image, xOffset, yOffset, &exception);
  1602.     if (rolledImage == NULL) {
  1603. throwMagickApiException(env, "Unable to roll image", &exception);
  1604. DestroyExceptionInfo(&exception);
  1605. return NULL;
  1606.     }
  1607.     DestroyExceptionInfo(&exception);
  1608.     newImage = newImageObject(env, rolledImage);
  1609.     if (newImage == NULL) {
  1610. DestroyImages(rolledImage);
  1611. throwMagickException(env, "Cannot create new MagickImage object");
  1612. return NULL;
  1613.     }
  1614.     return newImage;
  1615. }
  1616. /*
  1617.  * Class:     magick_MagickImage
  1618.  * Method:    sampleImage
  1619.  * Signature: (II)Lmagick/MagickImage;
  1620.  */
  1621. JNIEXPORT jobject JNICALL Java_magick_MagickImage_sampleImage
  1622.     (JNIEnv *env, jobject self, jint cols, jint rows)
  1623. {
  1624.     jobject newImage;
  1625.     Image *sampledImage;
  1626.     ExceptionInfo exception;
  1627.     Image *image =
  1628. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1629.     if (image == NULL) {
  1630. throwMagickException(env, "Cannot obtain image handle");
  1631. return NULL;
  1632.     }
  1633.     GetExceptionInfo(&exception);
  1634.     sampledImage = SampleImage(image, cols, rows, &exception);
  1635.     if (sampledImage == NULL) {
  1636. throwMagickApiException(env, "Unable to sample image", &exception);
  1637. DestroyExceptionInfo(&exception);
  1638. return NULL;
  1639.     }
  1640.     DestroyExceptionInfo(&exception);
  1641.     newImage = newImageObject(env, sampledImage);
  1642.     if (newImage == NULL) {
  1643. DestroyImages(sampledImage);
  1644. throwMagickException(env, "Cannot create new MagickImage object");
  1645. return NULL;
  1646.     }
  1647.     return newImage;
  1648. }
  1649. /*
  1650.  * Class:     magick_MagickImage
  1651.  * Method:    segmentImage
  1652.  * Signature: (IDD)I
  1653.  */
  1654. JNIEXPORT jint JNICALL Java_magick_MagickImage_segmentImage
  1655.     (JNIEnv *env, jobject self, jint colorspace, jdouble cluster_threshold,
  1656.                                                  jdouble smoothing_threshold)
  1657. {
  1658.     ColorspaceType colorspaceEnum;
  1659.     Image *image =
  1660. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1661.     if (image == NULL) {
  1662. throwMagickException(env, "Cannot obtain image handle");
  1663. return JNI_FALSE;
  1664.     }
  1665.     switch (colorspace) {
  1666.         case  0: colorspaceEnum = UndefinedColorspace;   break;
  1667.         default: colorspaceEnum = RGBColorspace;         break;
  1668.         case  2: colorspaceEnum = GRAYColorspace;        break;
  1669.         case  3: colorspaceEnum = TransparentColorspace; break;
  1670.         case  4: colorspaceEnum = OHTAColorspace;        break;
  1671.         case  5: colorspaceEnum = XYZColorspace;         break;
  1672.         case  6: colorspaceEnum = YCbCrColorspace;       break;
  1673.         case  7: colorspaceEnum = YCCColorspace;         break;
  1674.         case  8: colorspaceEnum = YIQColorspace;         break;
  1675.         case  9: colorspaceEnum = YPbPrColorspace;       break;
  1676.         case 10: colorspaceEnum = YUVColorspace;         break;
  1677.         case 11: colorspaceEnum = CMYKColorspace;        break;
  1678.         case 12: colorspaceEnum = sRGBColorspace;        break;
  1679.     }
  1680.     return SegmentImage(image, colorspaceEnum, 0, cluster_threshold,
  1681.                                                   smoothing_threshold);
  1682. }
  1683. /*
  1684.  * Class:     magick_MagickImage
  1685.  * Method:    solarizeImage
  1686.  * Signature: (D)V
  1687.  */
  1688. JNIEXPORT void JNICALL Java_magick_MagickImage_solarizeImage
  1689.     (JNIEnv *env, jobject self, jdouble threshold)
  1690. {
  1691.     Image *image =
  1692. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1693.     if (image == NULL) {
  1694. throwMagickException(env, "Cannot obtain image handle");
  1695. return;
  1696.     }
  1697.     SolarizeImage(image, threshold);
  1698. }
  1699. /*
  1700.  * Class:     magick_MagickImage
  1701.  * Method:    scaleImage
  1702.  * Signature: (II)Lmagick/MagickImage;
  1703.  */
  1704. JNIEXPORT jobject JNICALL Java_magick_MagickImage_scaleImage
  1705.     (JNIEnv *env, jobject self, jint cols, jint rows)
  1706. {
  1707.     Image *image = NULL;
  1708.     Image *scaledImage = NULL;
  1709.     jobject returnedImage;
  1710.     jfieldID magickImageHandleFid = NULL;
  1711.     ExceptionInfo exception;
  1712.     image = (Image*) getHandle(env, self, "magickImageHandle",
  1713.        &magickImageHandleFid);
  1714.     if (image == NULL) {
  1715. throwMagickException(env, "No image to scale");
  1716. return NULL;
  1717.     }
  1718.     
  1719.     GetExceptionInfo(&exception);
  1720.     scaledImage = ScaleImage(image,
  1721.      (unsigned int) cols,
  1722.      (unsigned int) rows,
  1723.      &exception);
  1724.     if (scaledImage == NULL) {
  1725. throwMagickApiException(env, "Unable to scale image", &exception);
  1726. DestroyExceptionInfo(&exception);
  1727. return NULL;
  1728.     }
  1729.     DestroyExceptionInfo(&exception);
  1730.     returnedImage = newImageObject(env, scaledImage);
  1731.     if (returnedImage == NULL) {
  1732. DestroyImages(scaledImage);
  1733. throwMagickException(env, "Unable to construct magick.MagickImage");
  1734. return NULL;
  1735.     }
  1736.     setHandle(env, returnedImage, "magickImageHandle",
  1737.       (void*) scaledImage, &magickImageHandleFid);
  1738.     return returnedImage;
  1739. }
  1740. /*
  1741.  * Class:     magick_MagickImage
  1742.  * Method:    spreadImage
  1743.  * Signature: (I)Lmagick/MagickImage;
  1744.  */
  1745. JNIEXPORT jobject JNICALL Java_magick_MagickImage_spreadImage
  1746.   (JNIEnv *env, jobject self, jint radius)
  1747. {
  1748.     Image *image = NULL, *randomizedImage = NULL;
  1749.     jobject newObj;
  1750.     ExceptionInfo exception;
  1751.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1752.     if (image == NULL) {
  1753. throwMagickException(env, "Cannot retrieve image handle");
  1754. return NULL;
  1755.     }
  1756.     GetExceptionInfo(&exception);
  1757.     randomizedImage = SpreadImage(image, radius, &exception);
  1758.     if (randomizedImage == NULL) {
  1759. throwMagickApiException(env, "Cannot spread image", &exception);
  1760. DestroyExceptionInfo(&exception);
  1761. return NULL;
  1762.     }
  1763.     DestroyExceptionInfo(&exception);
  1764.     newObj = newImageObject(env, randomizedImage);
  1765.     if (newObj == NULL) {
  1766. DestroyImages(randomizedImage);
  1767. throwMagickException(env, "Unable to create spread image");
  1768. return NULL;
  1769.     }
  1770.     return newObj;
  1771. }
  1772. /*
  1773.  * Class:     magick_MagickImage
  1774.  * Method:    swirlImage
  1775.  * Signature: (D)Lmagick/MagickImage;
  1776.  */
  1777. JNIEXPORT jobject JNICALL Java_magick_MagickImage_swirlImage
  1778.   (JNIEnv *env, jobject self, jdouble degrees)
  1779. {
  1780.     Image *image = NULL, *swirledImage = NULL;
  1781.     jobject newObj;
  1782.     ExceptionInfo exception;
  1783.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1784.     if (image == NULL) {
  1785. throwMagickException(env, "Cannot retrieve image handle");
  1786. return NULL;
  1787.     }
  1788.     GetExceptionInfo(&exception);
  1789.     swirledImage = SwirlImage(image, degrees, &exception);
  1790.     if (swirledImage == NULL) {
  1791. throwMagickApiException(env, "Cannot swirl image", &exception);
  1792. DestroyExceptionInfo(&exception);
  1793. return NULL;
  1794.     }
  1795.     DestroyExceptionInfo(&exception);
  1796.     newObj = newImageObject(env, swirledImage);
  1797.     if (newObj == NULL) {
  1798. DestroyImages(swirledImage);
  1799. throwMagickException(env, "Unable to create swirled image");
  1800. return NULL;
  1801.     }
  1802.     return newObj;
  1803. }
  1804. /*
  1805.  * Class:     magick_MagickImage
  1806.  * Method:    sortColormapByIntensity
  1807.  * Signature: ()Z
  1808.  */
  1809. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_sortColormapByIntensity
  1810.     (JNIEnv *env, jobject self)
  1811. {
  1812.     Image *image =
  1813. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1814.     if (image == NULL) {
  1815. throwMagickException(env, "Cannot obtain image handle");
  1816. return JNI_FALSE;
  1817.     }
  1818.     return SortColormapByIntensity(image);
  1819. }
  1820. /*
  1821.  * Class:     magick_MagickImage
  1822.  * Method:    syncImage
  1823.  * Signature: ()V
  1824.  */
  1825. JNIEXPORT void JNICALL Java_magick_MagickImage_syncImage
  1826.     (JNIEnv *env, jobject self)
  1827. {
  1828.     Image *image =
  1829. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1830.     if (image == NULL) {
  1831. throwMagickException(env, "Cannot obtain image handle");
  1832. return;
  1833.     }
  1834.     SyncImage(image);
  1835. }
  1836. /*
  1837.  * Class:     magick_MagickImage
  1838.  * Method:    textureImage
  1839.  * Signature: (Lmagick/MagickImage;)V
  1840.  */
  1841. JNIEXPORT void JNICALL Java_magick_MagickImage_textureImage
  1842.   (JNIEnv *env, jobject self, jobject texture)
  1843. {
  1844.     Image *textureImage;
  1845.     Image *image =
  1846. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1847.     if (image == NULL) {
  1848. throwMagickException(env, "Cannot obtain image handle");
  1849. return;
  1850.     }
  1851.     textureImage = (Image*) getHandle(env, texture, "magickImageHandle", NULL);
  1852.     if (textureImage == NULL) {
  1853. throwMagickException(env, "Cannot obtain texture image handle");
  1854. return;
  1855.     }
  1856.     TextureImage(image, textureImage);
  1857. }
  1858. /*
  1859.  * Class:     magick_MagickImage
  1860.  * Method:    thresholdImage
  1861.  * Signature: (D)Z
  1862.  */
  1863. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_thresholdImage
  1864.     (JNIEnv *env, jobject self, jdouble threshold)
  1865. {
  1866.     Image *image =
  1867. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1868.     if (image == NULL) {
  1869. throwMagickException(env, "Cannot obtain image handle");
  1870. return JNI_FALSE;
  1871.     }
  1872.     return ThresholdImage(image, threshold);
  1873. }
  1874. /*
  1875.  * Class:     magick_MagickImage
  1876.  * Method:    transformImage
  1877.  * Signature: (Ljava/lang/String;Ljava/lang/String;)V
  1878.  */
  1879. JNIEXPORT void JNICALL Java_magick_MagickImage_transformImage
  1880.     (JNIEnv *env, jobject self, jstring cropGeometry, jstring imageGeometry)
  1881. {
  1882.     const char *cropStr, *imageStr;
  1883.     jfieldID fieldID = 0;
  1884.     Image *image =
  1885. (Image*) getHandle(env, self, "magickImageHandle", &fieldID);
  1886.     if (image == NULL) {
  1887. throwMagickException(env, "Cannot obtain image handle");
  1888. return;
  1889.     }
  1890.     if (cropGeometry == NULL) {
  1891.         cropStr = NULL;
  1892.     } else {
  1893.         cropStr = (*env)->GetStringUTFChars(env, cropGeometry, 0);
  1894.     }
  1895.     
  1896.     if (imageGeometry == NULL) {
  1897.         imageStr = NULL;
  1898.     } else {
  1899.         imageStr = (*env)->GetStringUTFChars(env, imageGeometry, 0);
  1900.     }
  1901.     
  1902.     TransformImage(&image, cropStr, imageStr);
  1903.     
  1904.     if (imageGeometry != NULL) {
  1905.         (*env)->ReleaseStringUTFChars(env, imageGeometry, imageStr);
  1906.     }
  1907.     if (cropGeometry != NULL) {
  1908.         (*env)->ReleaseStringUTFChars(env, cropGeometry, cropStr);
  1909.     }
  1910.     setHandle(env, self, "magickImageHandle", (void*) image, &fieldID);
  1911. }
  1912.     
  1913. /*
  1914.  * Class:     magick_MagickImage
  1915.  * Method:    unsharpMaskImage
  1916.  * Signature: (DDDD)Lmagick/MagickImage;
  1917.  */
  1918. JNIEXPORT jobject JNICALL Java_magick_MagickImage_unsharpMaskImage
  1919.   (JNIEnv *env, jobject self, jdouble radius, jdouble sigma,
  1920.                               jdouble amount, jdouble threshold)
  1921. {
  1922.     Image *image = NULL, *unsharpedImage = NULL;
  1923.     jobject newObj;
  1924.     ExceptionInfo exception;
  1925.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1926.     if (image == NULL) {
  1927. throwMagickException(env, "Cannot retrieve image handle");
  1928. return NULL;
  1929.     }
  1930.     GetExceptionInfo(&exception);
  1931.     unsharpedImage = UnsharpMaskImage(image, radius, sigma,
  1932.                                              amount, threshold, &exception);
  1933.     if (unsharpedImage == NULL) {
  1934. throwMagickApiException(env, "Cannot unsharp image", &exception);
  1935. DestroyExceptionInfo(&exception);
  1936. return NULL;
  1937.     }
  1938.     DestroyExceptionInfo(&exception);
  1939.     newObj = newImageObject(env, unsharpedImage);
  1940.     if (newObj == NULL) {
  1941. DestroyImages(unsharpedImage);
  1942. throwMagickException(env, "Unable to create unsharped image");
  1943. return NULL;
  1944.     }
  1945.     return newObj;
  1946. }
  1947. /*
  1948.  * Class:     magick_MagickImage
  1949.  * Method:    waveImage
  1950.  * Signature: (DD)Lmagick/MagickImage;
  1951.  */
  1952. JNIEXPORT jobject JNICALL Java_magick_MagickImage_waveImage
  1953.   (JNIEnv *env, jobject self, jdouble amplitude, jdouble wavelength)
  1954. {
  1955.     Image *image = NULL, *wavedImage = NULL;
  1956.     jobject newObj;
  1957.     ExceptionInfo exception;
  1958.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1959.     if (image == NULL) {
  1960. throwMagickException(env, "Cannot retrieve image handle");
  1961. return NULL;
  1962.     }
  1963.     GetExceptionInfo(&exception);
  1964.     wavedImage = WaveImage(image, amplitude, wavelength, &exception);
  1965.     if (wavedImage == NULL) {
  1966. throwMagickApiException(env, "Cannot wave image", &exception);
  1967. DestroyExceptionInfo(&exception);
  1968. return NULL;
  1969.     }
  1970.     DestroyExceptionInfo(&exception);
  1971.     newObj = newImageObject(env, wavedImage);
  1972.     if (newObj == NULL) {
  1973. DestroyImages(wavedImage);
  1974. throwMagickException(env, "Unable to create waved image");
  1975. return NULL;
  1976.     }
  1977.     return newObj;
  1978. }
  1979. /*
  1980.  * Class:     magick_MagickImage
  1981.  * Method:    transformRgbImage
  1982.  * Signature: (I)Z
  1983.  */
  1984. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_transformRgbImage
  1985.     (JNIEnv *env, jobject self, jint colorspace)
  1986. {
  1987.     Image *image =
  1988. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  1989.     if (image == NULL) {
  1990. throwMagickException(env, "Cannot obtain image handle");
  1991. return JNI_FALSE;
  1992.     }
  1993.     return TransformRGBImage(image, colorspace);
  1994. }
  1995. /*
  1996.  * Class:     magick_MagickImage
  1997.  * Method:    transparentImage
  1998.  * Signature: (Lmagick/PixelPacket;I)Z
  1999.  */
  2000. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_transparentImage
  2001.     (JNIEnv *env, jobject self, jobject color, jint opacity)
  2002. {
  2003.     PixelPacket pixelPacket;
  2004.     Image *image =
  2005. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2006.     if (image == NULL) {
  2007. throwMagickException(env, "Cannot obtain image handle");
  2008. return JNI_FALSE;
  2009.     }
  2010.     getPixelPacket(env, color, &pixelPacket);
  2011.     return TransparentImage(image, pixelPacket, (unsigned int) opacity);
  2012. }
  2013. /*
  2014.  * Class:     magick_MagickImage
  2015.  * Method:    zoomImage
  2016.  * Signature: (II)Lmagick/MagickImage;
  2017.  */
  2018. JNIEXPORT jobject JNICALL Java_magick_MagickImage_zoomImage
  2019.     (JNIEnv *env, jobject self, jint cols, jint rows)
  2020. {
  2021.     jobject newObj;
  2022.     Image *newImage;
  2023.     ExceptionInfo exception;
  2024.     Image *image =
  2025. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2026.     if (image == NULL) {
  2027. throwMagickException(env, "Cannot obtain image handle");
  2028. return NULL;
  2029.     }
  2030.     GetExceptionInfo(&exception);
  2031.     newImage = ZoomImage(image, cols, rows, &exception);
  2032.     if (newImage == NULL) {
  2033. throwMagickApiException(env, "Unable to zoom image", &exception);
  2034. DestroyExceptionInfo(&exception);
  2035. return NULL;
  2036.     }
  2037.     DestroyExceptionInfo(&exception);
  2038.     newObj = newImageObject(env, newImage);
  2039.     if (newObj == NULL) {
  2040. DestroyImages(newImage);
  2041. throwMagickException(env, "Unable to create a new MagickImage object");
  2042. return NULL;
  2043.     }
  2044.     return newObj;
  2045. }
  2046. /*
  2047.  * Class:     magick_MagickImage
  2048.  * Method:    dispatchImage
  2049.  * Signature: (IIIILjava/lang/String;[B)Z
  2050.  */
  2051. JNIEXPORT jboolean JNICALL
  2052.     Java_magick_MagickImage_dispatchImage__IIIILjava_lang_String_2_3B
  2053.     (JNIEnv *env, jobject self,
  2054.      jint x, jint y, jint width, jint height,
  2055.      jstring map, jbyteArray pixels)
  2056. {
  2057.     Image *image = NULL;
  2058.     jint arraySize;
  2059.     const char *mapStr;
  2060.     jbyte *pixelArray;
  2061.     int result;
  2062.     ExceptionInfo exception;
  2063.     /* Obtain the minimum pixel array size required and check correctness. */
  2064.     mapStr = (*env)->GetStringUTFChars(env, map, 0);
  2065.     if (mapStr == NULL) {
  2066. throwMagickException(env, "Unable to get component map");
  2067. return JNI_FALSE;
  2068.     }
  2069.     arraySize = width * height * strlen(mapStr);
  2070.     if ((*env)->GetArrayLength(env, pixels) < arraySize) {
  2071. throwMagickException(env, "Pixels size too small");
  2072. (*env)->ReleaseStringUTFChars(env, map, mapStr);
  2073. return JNI_FALSE;
  2074.     }
  2075.     /* Get the image object. */
  2076.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2077.     if (image == NULL) {
  2078. throwMagickException(env, "Cannot obtain image handle");
  2079. (*env)->ReleaseStringUTFChars(env, map, mapStr);
  2080. return JNI_FALSE;
  2081.     }
  2082.     /* Get the pixel storage array and store the pixels. */
  2083.     pixelArray = (*env)->GetByteArrayElements(env, pixels, 0);
  2084.     GetExceptionInfo(&exception);
  2085.     result = DispatchImage(image, x, y, width, height,
  2086.    mapStr, CharPixel, pixelArray, &exception);
  2087.     /* Cleanup. */
  2088.     (*env)->ReleaseStringUTFChars(env, map, mapStr);
  2089.     (*env)->ReleaseByteArrayElements(env, pixels, pixelArray, 0);
  2090.     if (result == JNI_FALSE) {
  2091.         throwMagickApiException(env, "Error dispatching image", &exception);
  2092.     }
  2093.     DestroyExceptionInfo(&exception);
  2094.     return result;
  2095. }
  2096. /*
  2097.  * Class:     magick_MagickImage
  2098.  * Method:    dispatchImage
  2099.  * Signature: (IIIILjava/lang/String;[I)Z
  2100.  */
  2101. JNIEXPORT jboolean JNICALL
  2102.     Java_magick_MagickImage_dispatchImage__IIIILjava_lang_String_2_3I
  2103.     (JNIEnv *env, jobject self,
  2104.      jint x, jint y, jint width, jint height,
  2105.      jstring map, jintArray pixels)
  2106. {
  2107.     Image *image = NULL;
  2108.     jint arraySize;
  2109.     const char *mapStr;
  2110.     jint *pixelArray;
  2111.     int result;
  2112.     ExceptionInfo exception;
  2113.     /* Obtain the minimum pixel array size required and check correctness. */
  2114.     mapStr = (*env)->GetStringUTFChars(env, map, 0);
  2115.     if (mapStr == NULL) {
  2116. throwMagickException(env, "Unable to get component map");
  2117. return JNI_FALSE;
  2118.     }
  2119.     arraySize = width * height * strlen(mapStr);
  2120.     if ((*env)->GetArrayLength(env, pixels) < arraySize) {
  2121. throwMagickException(env, "Pixels size too small");
  2122. (*env)->ReleaseStringUTFChars(env, map, mapStr);
  2123. return JNI_FALSE;
  2124.     }
  2125.     /* Get the image object. */
  2126.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2127.     if (image == NULL) {
  2128. throwMagickException(env, "Cannot obtain image handle");
  2129. (*env)->ReleaseStringUTFChars(env, map, mapStr);
  2130. return JNI_FALSE;
  2131.     }
  2132.     /* Get the pixel storage array and store the pixels. */
  2133.     pixelArray = (*env)->GetIntArrayElements(env, pixels, 0);
  2134.     GetExceptionInfo(&exception);
  2135.     result = DispatchImage(image, x, y, width, height,
  2136.    mapStr, IntegerPixel, pixelArray, &exception);
  2137.     /* Cleanup. */
  2138.     (*env)->ReleaseStringUTFChars(env, map, mapStr);
  2139.     (*env)->ReleaseIntArrayElements(env, pixels, pixelArray, 0);
  2140.     if (result == JNI_FALSE) {
  2141.         throwMagickApiException(env, "Error dispatching image", &exception);
  2142.     }
  2143.     DestroyExceptionInfo(&exception);
  2144.     return result;
  2145. }
  2146. /*
  2147.  * Class:     magick_MagickImage
  2148.  * Method:    dispatchImage
  2149.  * Signature: (IIIILjava/lang/String;[F)Z
  2150.  */
  2151. JNIEXPORT jboolean JNICALL
  2152.     Java_magick_MagickImage_dispatchImage__IIIILjava_lang_String_2_3F
  2153.     (JNIEnv *env, jobject self,
  2154.      jint x, jint y, jint width, jint height,
  2155.      jstring map, jfloatArray pixels)
  2156. {
  2157.     Image *image = NULL;
  2158.     jint arraySize;
  2159.     const char *mapStr;
  2160.     jfloat *pixelArray;
  2161.     int result;
  2162.     ExceptionInfo exception;
  2163.     /* Obtain the minimum pixel array size required and check correctness. */
  2164.     mapStr = (*env)->GetStringUTFChars(env, map, 0);
  2165.     if (mapStr == NULL) {
  2166. throwMagickException(env, "Unable to get component map");
  2167. return JNI_FALSE;
  2168.     }
  2169.     arraySize = width * height * strlen(mapStr);
  2170.     if ((*env)->GetArrayLength(env, pixels) < arraySize) {
  2171. throwMagickException(env, "Pixels size too small");
  2172. (*env)->ReleaseStringUTFChars(env, map, mapStr);
  2173. return JNI_FALSE;
  2174.     }
  2175.     /* Get the image object. */
  2176.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2177.     if (image == NULL) {
  2178. throwMagickException(env, "Cannot obtain image handle");
  2179. (*env)->ReleaseStringUTFChars(env, map, mapStr);
  2180. return JNI_FALSE;
  2181.     }
  2182.     /* Get the pixel storage array and store the pixels. */
  2183.     pixelArray = (*env)->GetFloatArrayElements(env, pixels, 0);
  2184.     GetExceptionInfo(&exception);
  2185.     result = DispatchImage(image, x, y, width, height,
  2186.    mapStr, FloatPixel, pixelArray, &exception);
  2187.     /* Cleanup. */
  2188.     (*env)->ReleaseStringUTFChars(env, map, mapStr);
  2189.     (*env)->ReleaseFloatArrayElements(env, pixels, pixelArray, 0);
  2190.     if (result == JNI_FALSE) {
  2191.         throwMagickApiException(env, "Error dispatching image", &exception);
  2192.     }
  2193.     DestroyExceptionInfo(&exception);
  2194.     return result;
  2195. }
  2196. /*
  2197.  * Class:     magick_MagickImage
  2198.  * Method:    getMagick
  2199.  * Signature: ()Ljava/lang/String;
  2200.  */
  2201. JNIEXPORT jstring JNICALL Java_magick_MagickImage_getMagick
  2202.     (JNIEnv *env, jobject self)
  2203. {
  2204.     Image *image = NULL;
  2205.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2206.     if (image == NULL) {
  2207. throwMagickException(env, "No image to get image format");
  2208. return NULL;
  2209.     }
  2210.     return (*env)->NewStringUTF(env, image->magick);
  2211. }
  2212. /*
  2213.  * Class:     magick_MagickImage
  2214.  * Method:    setMagick
  2215.  * Signature: (Ljava/lang/String;)V
  2216.  *
  2217.  * Contributed by Abdulbaset Gaddah <agaddah@yahoo.com>
  2218.  */
  2219. JNIEXPORT void JNICALL Java_magick_MagickImage_setMagick
  2220.     (JNIEnv *env, jobject self, jstring imageFormat)
  2221. {
  2222.     Image *image = NULL;
  2223.     const char *cstr; 
  2224.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2225.     if (image == NULL) {
  2226. throwMagickException(env, "No image to set image Format");
  2227. return;
  2228.     }
  2229.     cstr = (*env)->GetStringUTFChars(env, imageFormat, 0);
  2230.     strcpy(image->magick, cstr);  
  2231.     (*env)->ReleaseStringUTFChars(env, imageFormat, cstr);
  2232. }
  2233. /*
  2234.  * Class:     magick_MagickImage
  2235.  * Method:    getNumberColors
  2236.  * Signature: ()Ljava/lang/int;
  2237.  *
  2238.  * Contributed by Abdulbaset Gaddah <agaddah@yahoo.com>
  2239.  */
  2240. JNIEXPORT jint JNICALL Java_magick_MagickImage_getNumberColors
  2241.     (JNIEnv *env, jobject self)
  2242. {
  2243.     Image *image = NULL;
  2244.     jint numberColors=0;
  2245.     ExceptionInfo exception;
  2246.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2247.     if (image == NULL) {
  2248. throwMagickException(env, "No image to get the number of unique colors");
  2249. return -1;
  2250.     }
  2251.     GetExceptionInfo(&exception);
  2252.     numberColors=GetNumberColors(image, (FILE *) NULL, &exception);
  2253.     if (numberColors == 0) {
  2254.         throwMagickApiException(env, "Error in GetNumberColors", &exception);
  2255.     }
  2256.     DestroyExceptionInfo(&exception);
  2257.     return numberColors;  
  2258. }
  2259. /*
  2260.  * Class:     magick_MagickImage
  2261.  * Method:    setNumberColors
  2262.  * Signature: (()Ljava/lang/int)V;
  2263.  *
  2264.  * Contributed by Abdulbaset Gaddah <agaddah@yahoo.com>
  2265.  */
  2266. JNIEXPORT void JNICALL Java_magick_MagickImage_setNumberColors
  2267.     (JNIEnv *env, jobject self, jint numberColors)
  2268. {
  2269.     Image *image = NULL;
  2270.     QuantizeInfo quantize_info;
  2271.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2272.     if (image == NULL) {
  2273. throwMagickException(env,
  2274.                              "No image to set the number of unique colors");
  2275. return;
  2276.     }
  2277.   GetQuantizeInfo(&quantize_info);
  2278.   quantize_info.number_colors=numberColors;
  2279.   (void) QuantizeImage(&quantize_info,image);
  2280. }
  2281. /*
  2282.  * Class:     magick_MagickImage
  2283.  * Method:    isAnimatedImage
  2284.  * Signature: ()Z
  2285.  *
  2286.  * Contributed by Abdulbaset Gaddah <agaddah@yahoo.com>
  2287.  */
  2288. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_isAnimatedImage
  2289.     (JNIEnv *env, jobject self)
  2290. {
  2291.     Image *image =
  2292. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2293.     if (image == NULL) {
  2294. throwMagickException(env, "Cannot obtain image handle");
  2295. return JNI_FALSE;
  2296.     }
  2297.     return (image->next != (Image *) NULL) ? (JNI_TRUE) : (JNI_FALSE);
  2298. }
  2299. /*
  2300.  * Class:     magick_MagickImage
  2301.  * Method:    rotateImage
  2302.  * Signature: (D)Lmagick/MagickImage;
  2303.  */
  2304. JNIEXPORT jobject JNICALL Java_magick_MagickImage_rotateImage
  2305.   (JNIEnv *env, jobject self, jdouble degrees)
  2306. {
  2307.     jobject newObj;
  2308.     Image *newImage;
  2309.     ExceptionInfo exception;
  2310.     Image *image =
  2311. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2312.     if (image == NULL) {
  2313. throwMagickException(env, "Cannot obtain image handle");
  2314. return NULL;
  2315.     }
  2316.     GetExceptionInfo(&exception);
  2317.     newImage = RotateImage(image, degrees, &exception);
  2318.     if (newImage == NULL) {
  2319. throwMagickApiException(env, "Unable to rotate image", &exception);
  2320. DestroyExceptionInfo(&exception);
  2321. return NULL;
  2322.     }
  2323.     DestroyExceptionInfo(&exception);
  2324.     newObj = newImageObject(env, newImage);
  2325.     if (newObj == NULL) {
  2326. DestroyImages(newImage);
  2327. throwMagickException(env, "Unable to create a new MagickImage object");
  2328. return NULL;
  2329.     }
  2330.     return newObj;
  2331. }
  2332. /*
  2333.  * Class:     magick_MagickImage
  2334.  * Method:    shearImage
  2335.  * Signature: (DD)Lmagick/MagickImage;
  2336.  */
  2337. JNIEXPORT jobject JNICALL Java_magick_MagickImage_shearImage
  2338.   (JNIEnv *env, jobject self, jdouble x_shear, jdouble y_shear)
  2339. {
  2340.     jobject newObj;
  2341.     Image *newImage;
  2342.     ExceptionInfo exception;
  2343.     Image *image =
  2344. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2345.     if (image == NULL) {
  2346. throwMagickException(env, "Cannot obtain image handle");
  2347. return NULL;
  2348.     }
  2349.     GetExceptionInfo(&exception);
  2350.     newImage = ShearImage(image, x_shear, y_shear, &exception);
  2351.     if (newImage == NULL) {
  2352. throwMagickApiException(env, "Unable to shear image", &exception);
  2353. DestroyExceptionInfo(&exception);
  2354. return NULL;
  2355.     }
  2356.     DestroyExceptionInfo(&exception);
  2357.     newObj = newImageObject(env, newImage);
  2358.     if (newObj == NULL) {
  2359. DestroyImages(newImage);
  2360. throwMagickException(env, "Unable to create a new MagickImage object");
  2361. return NULL;
  2362.     }
  2363.     return newObj;
  2364. }
  2365. /*
  2366.  * Class:     magick_MagickImage
  2367.  * Method:    quantizeImage
  2368.  * Signature: (Lmagick/QuantizeInfo;)Z
  2369.  */
  2370. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_quantizeImage
  2371.   (JNIEnv *env, jobject self, jobject quantizeInfo)
  2372. {
  2373.     QuantizeInfo *qInfo;
  2374.     Image *image =
  2375. (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2376.     if (image == NULL) {
  2377. throwMagickException(env, "Cannot obtain image handle");
  2378. return JNI_FALSE;
  2379.     }
  2380.     qInfo = (QuantizeInfo*) getHandle(env, quantizeInfo,
  2381.      "quantizeInfoHandle", NULL);
  2382.     if (qInfo == NULL) {
  2383. throwMagickException(env, "Cannot obtain QuantizeInfo handle");
  2384. return JNI_FALSE;
  2385.     }
  2386. #ifdef DIAGNOSTIC
  2387.     fprintf(stderr, "qInfo.number_colors = %un", qInfo->number_colors);
  2388.     fprintf(stderr, "qInfo.tree_depth = %un", qInfo->tree_depth);
  2389.     fprintf(stderr, "qInfo.dither = %un", qInfo->dither);
  2390.     fprintf(stderr, "qInfo.colorspace = %un", qInfo->colorspace);
  2391.     fprintf(stderr, "qInfo.measure_error = %un", qInfo->measure_error);
  2392. #endif
  2393.     return QuantizeImage(qInfo, image);
  2394. }
  2395. /*
  2396.  * Class:     magick_MagickImage
  2397.  * Method:    getColorspace
  2398.  * Signature: ()I
  2399.  */
  2400. getIntMethod(Java_magick_MagickImage_getColorspace,
  2401.      colorspace,
  2402.      "magickImageHandle",
  2403.      Image)
  2404. /*
  2405.  * Class:     magick_MagickImage
  2406.  * Method:    sharpenImage
  2407.  * Signature: (DD)Lmagick/MagickImage;
  2408.  */
  2409. JNIEXPORT jobject JNICALL Java_magick_MagickImage_sharpenImage
  2410.   (JNIEnv *env, jobject self, jdouble radius, jdouble sigma)
  2411. {
  2412.     Image *image = NULL, *sharpenedImage = NULL;
  2413.     jobject newObj;
  2414.     ExceptionInfo exception;
  2415.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2416.     if (image == NULL) {
  2417. throwMagickException(env, "Cannot retrieve image handle");
  2418. return NULL;
  2419.     }
  2420.     GetExceptionInfo(&exception);
  2421.     sharpenedImage = SharpenImage(image, radius, sigma, &exception);
  2422.     if (sharpenedImage == NULL) {
  2423. throwMagickApiException(env, "Cannot sharpen image", &exception);
  2424. DestroyExceptionInfo(&exception);
  2425. return NULL;
  2426.     }
  2427.     DestroyExceptionInfo(&exception);
  2428.     newObj = newImageObject(env, sharpenedImage);
  2429.     if (newObj == NULL) {
  2430. DestroyImages(sharpenedImage);
  2431. throwMagickException(env, "Unable to create sharpened image");
  2432. return NULL;
  2433.     }
  2434.     return newObj;
  2435. }
  2436. /*
  2437.  * Class:     magick_MagickImage
  2438.  * Method:    despeckleImage
  2439.  * Signature: ()Lmagick/MagickImage;
  2440.  */
  2441. JNIEXPORT jobject JNICALL Java_magick_MagickImage_despeckleImage
  2442.     (JNIEnv *env, jobject self)
  2443. {
  2444.     Image *image = NULL, *despeckledImage = NULL;
  2445.     jobject newObj;
  2446.     ExceptionInfo exception;
  2447.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2448.     if (image == NULL) {
  2449. throwMagickException(env, "Cannot retrieve image handle");
  2450. return NULL;
  2451.     }
  2452.     GetExceptionInfo(&exception);
  2453.     despeckledImage = DespeckleImage(image, &exception);
  2454.     if (despeckledImage == NULL) {
  2455. throwMagickApiException(env, "Cannot despeckle image", &exception);
  2456. DestroyExceptionInfo(&exception);
  2457. return NULL;
  2458.     }
  2459.     DestroyExceptionInfo(&exception);
  2460.     newObj = newImageObject(env, despeckledImage);
  2461.     if (newObj == NULL) {
  2462. DestroyImages(despeckledImage);
  2463. throwMagickException(env, "Unable to create despeckle image");
  2464. return NULL;
  2465.     }
  2466.     return newObj;
  2467. }
  2468. /*
  2469.  * Class:     magick_MagickImage
  2470.  * Method:    convolveImage
  2471.  * Signature: (I[D)Lmagick/MagickImage;
  2472.  */
  2473. JNIEXPORT jobject JNICALL Java_magick_MagickImage_convolveImage
  2474.   (JNIEnv *env, jobject self, jint order, jdoubleArray kernel)
  2475. {
  2476.     Image *image = NULL, *convolvedImage = NULL;
  2477.     jobject newObj;
  2478.     ExceptionInfo exception;
  2479.     double *karray;
  2480.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2481.     if (image == NULL) {
  2482. throwMagickException(env, "Cannot retrieve image handle");
  2483. return NULL;
  2484.     }
  2485.     karray = (*env)->GetDoubleArrayElements(env, kernel, NULL);
  2486.     GetExceptionInfo(&exception);
  2487.     convolvedImage = ConvolveImage(image, order, karray, &exception);
  2488.     (*env)->ReleaseDoubleArrayElements(env, kernel, karray, JNI_ABORT);
  2489.     if (convolvedImage == NULL) {
  2490. throwMagickApiException(env, "Cannot convolve image", &exception);
  2491. DestroyExceptionInfo(&exception);
  2492. return NULL;
  2493.     }
  2494.     DestroyExceptionInfo(&exception);
  2495.     newObj = newImageObject(env, convolvedImage);
  2496.     if (newObj == NULL) {
  2497. DestroyImages(convolvedImage);
  2498. throwMagickException(env, "Unable to create convolved image");
  2499. return NULL;
  2500.     }
  2501.     return newObj;
  2502. }
  2503. /*
  2504.  * Class:     magick_MagickImage
  2505.  * Method:    getImageAttribute
  2506.  * Signature: (Ljava/lang/String;)Ljava/lang/String;
  2507.  */
  2508. JNIEXPORT jstring JNICALL Java_magick_MagickImage_getImageAttribute
  2509.     (JNIEnv *env, jobject self, jstring key)
  2510. {
  2511.     Image *image;
  2512.     const char *iKey;
  2513.     const ImageAttribute *attrib;
  2514.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2515.     if (image == NULL) {
  2516. throwMagickException(env, "Cannot retrieve image handle");
  2517. return NULL;
  2518.     }
  2519.     iKey = (*env)->GetStringUTFChars(env, key, 0);
  2520.     attrib = GetImageAttribute(image, iKey);
  2521.     (*env)->ReleaseStringUTFChars(env, key, iKey);
  2522.     if (attrib == NULL || attrib->value == NULL) {
  2523. return NULL;
  2524.     }
  2525.     return (*env)->NewStringUTF(env, attrib->value);
  2526. }
  2527. /*
  2528.  * Class:     magick_MagickImage
  2529.  * Method:    setImageAttribute
  2530.  * Signature: (Ljava/lang/String;Ljava/lang/String;)Z
  2531.  */
  2532. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_setImageAttribute
  2533.     (JNIEnv *env, jobject self, jstring key, jstring value)
  2534. {
  2535.     Image *image;
  2536.     const char *iKey, *iValue;
  2537.     jboolean result;
  2538.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2539.     if (image == NULL) {
  2540. throwMagickException(env, "Cannot retrieve image handle");
  2541. return JNI_FALSE;
  2542.     }
  2543.     if (key == NULL) {
  2544.         throwMagickException(env, "Image attribute key is null");
  2545.         return JNI_FALSE;
  2546.     }
  2547.     iKey = (*env)->GetStringUTFChars(env, key, 0);
  2548.     iValue = (value == NULL) ? NULL : (*env)->GetStringUTFChars(env, value, 0);
  2549.     result = SetImageAttribute(image, iKey, iValue);
  2550.     if (iValue != NULL) {
  2551. (*env)->ReleaseStringUTFChars(env, value, iValue);
  2552.     }
  2553.     (*env)->ReleaseStringUTFChars(env, key, iKey);
  2554.     return result;
  2555. }
  2556. /*
  2557.  * Class:     magick_MagickImage
  2558.  * Method:    blobToImage
  2559.  * Signature: (Lmagick/ImageInfo;[B)V
  2560.  */
  2561. JNIEXPORT void JNICALL Java_magick_MagickImage_blobToImage
  2562.     (JNIEnv *env, jobject self, jobject imageInfoObj, jbyteArray blob)
  2563. {
  2564.     size_t blobSiz;
  2565.     jbyte *blobMem;
  2566.     ExceptionInfo exception;
  2567.     Image *image, *oldImage;
  2568.     jfieldID fieldID = 0;
  2569.     ImageInfo *imageInfo;
  2570.   
  2571.     /* Obtain the ImageInfo pointer */
  2572.     imageInfo = (ImageInfo*) getHandle(env, imageInfoObj, 
  2573.                                        "imageInfoHandle", NULL);
  2574.     if (imageInfo == NULL) {
  2575.         throwMagickException(env, "Cannot obtain ImageInfo object");
  2576.         return;
  2577.     }
  2578.     /* Check that we do have a blob */
  2579.     if (blob == NULL) {
  2580.         throwMagickException(env, "Blob is null");
  2581.         return;
  2582.     }
  2583.     /* Get the array size and array elements */
  2584.     blobSiz = (*env)->GetArrayLength(env, blob);
  2585.     blobMem = (*env)->GetByteArrayElements(env, blob, 0);
  2586.     /* Create that image. */
  2587.     GetExceptionInfo(&exception);
  2588.     image = BlobToImage(imageInfo, blobMem, blobSiz, &exception);
  2589.     (*env)->ReleaseByteArrayElements(env, blob, blobMem, 0);
  2590.     if (image == NULL) {
  2591.         throwMagickApiException(env, "Unable to convert blob to image",
  2592.                                 &exception);
  2593.         DestroyExceptionInfo(&exception);
  2594.         return;
  2595.     }
  2596.   
  2597.     /* Get the old image handle and deallocate it (if required). */
  2598.     oldImage = (Image*) getHandle(env, self, "magickImageHandle", &fieldID);
  2599.     if (oldImage != NULL) {
  2600.         DestroyImages(oldImage);
  2601.     }
  2602.   
  2603.     /* Store the image into the handle. */
  2604.     setHandle(env, self, "magickImageHandle", (void*) image, &fieldID);
  2605. }
  2606. /*
  2607.  * Class:     magick_MagickImage
  2608.  * Method:    imageToBlob
  2609.  * Signature: (Lmagick/ImageInfo;)[B
  2610.  */
  2611. JNIEXPORT jbyteArray JNICALL Java_magick_MagickImage_imageToBlob
  2612.  (JNIEnv *env, jobject self, jobject imageInfoObj)
  2613. {
  2614.   ImageInfo *imageInfo;
  2615.   Image *image;
  2616.   size_t blobSiz = 0;
  2617.   ExceptionInfo exception;
  2618.   void *blobMem = NULL;
  2619.   jbyteArray blob;
  2620.   /* Obtain the ImageInfo pointer */
  2621.   if (imageInfoObj != NULL) {
  2622.     imageInfo = (ImageInfo*) getHandle(env, imageInfoObj, 
  2623.                                        "imageInfoHandle", NULL);
  2624.     if (imageInfo == NULL) {
  2625.       throwMagickException(env, "Cannot obtain ImageInfo object");
  2626.       return NULL;
  2627.     }
  2628.   }
  2629.   else {
  2630.     imageInfo = NULL;
  2631.   }
  2632.   /* Get the Image pointer */
  2633.   image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2634.   if (image == NULL) {
  2635.     throwMagickException(env, "No image to get file name");
  2636.     return NULL;
  2637.   }
  2638.   /* Do the conversion */
  2639.   GetExceptionInfo(&exception);
  2640.   blobMem = ImageToBlob(imageInfo, image, &blobSiz, &exception);
  2641.   if (blobMem == NULL) {
  2642.     throwMagickApiException(env, "Unable to convert image to blob", &exception);
  2643.     DestroyExceptionInfo(&exception);
  2644.     return NULL;
  2645.   }
  2646.   DestroyExceptionInfo(&exception);
  2647.   /* Create a new Java array. */
  2648.   blob = (*env)->NewByteArray(env, blobSiz);
  2649.   if (blob == NULL) {
  2650.     throwMagickException(env, "Unable to allocate array");
  2651.     return NULL;
  2652.   }
  2653.   (*env)->SetByteArrayRegion(env, blob, 0, blobSiz, blobMem);
  2654.   LiberateMemory((void**) &blobMem);
  2655.   return blob;
  2656. }
  2657. JNIEXPORT jobject JNICALL Java_magick_MagickImage_nextImage
  2658.   (JNIEnv *env, jobject self)
  2659. {
  2660.     jobject newObj;
  2661.     Image *nextImage;
  2662.     Image *image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2663.     if (image == NULL) {
  2664.        throwMagickException(env, "Cannot obtain image handle");
  2665.        return NULL;
  2666.     }
  2667.     if (image->next == NULL) {
  2668.         return NULL;
  2669.     }
  2670.     nextImage = image->next;
  2671.     /* unlink image from sequence */
  2672.     image->next = NULL;
  2673.     nextImage->previous = NULL;
  2674.     newObj = newImageObject(env, nextImage);
  2675.     if (newObj == NULL) {
  2676.        throwMagickException(env, "Unable to create a new MagickImage object");
  2677.        return NULL;
  2678.     }
  2679.     return newObj;
  2680. }
  2681. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_hasFrames
  2682.   (JNIEnv *env, jobject self)
  2683. {
  2684.     Image *image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2685.     if (image == NULL) {
  2686.        throwMagickException(env, "Cannot obtain image handle");
  2687.        return JNI_FALSE;
  2688.     }
  2689.     if (image->next == NULL) {
  2690.         return JNI_FALSE;
  2691.     } else {
  2692.         return JNI_TRUE;
  2693.     }
  2694. }
  2695. JNIEXPORT jint JNICALL Java_magick_MagickImage_getNumFrames
  2696.   (JNIEnv *env, jobject self)
  2697. {
  2698.     int count = 0;
  2699.     Image *image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2700.     if (image == NULL) {
  2701.        throwMagickException(env, "Cannot obtain image handle");
  2702.        return 0;
  2703.     }
  2704.     while (image != NULL) {
  2705.         count++;
  2706.         image = image->next;
  2707.     }
  2708.     return count;
  2709. }
  2710. /*
  2711.  * Class:     magick_MagickImage
  2712.  * Method:    setUnits
  2713.  * Signature: (I)V
  2714.  */
  2715. setIntMethod(Java_magick_MagickImage_setUnits,
  2716.      units,
  2717.      "magickImageHandle",
  2718.      Image)
  2719. /*
  2720.  * Class:     magick_MagickImage
  2721.  * Method:    getUnits
  2722.  * Signature: ()I
  2723.  */
  2724. getIntMethod(Java_magick_MagickImage_getUnits,
  2725.      units,
  2726.      "magickImageHandle",
  2727.      Image)
  2728. /*
  2729.  * Class:     magick_MagickImage
  2730.  * Method:    setXResolution
  2731.  * Signature: (D)V
  2732.  */
  2733. setDoubleMethod(Java_magick_MagickImage_setXResolution,
  2734.                 x_resolution,
  2735.                 "magickImageHandle",
  2736.                 Image)
  2737. /*
  2738.  * Class:     magick_MagickImage
  2739.  * Method:    setYResolution
  2740.  * Signature: (D)V
  2741.  */
  2742. setDoubleMethod(Java_magick_MagickImage_setYResolution,
  2743.                 y_resolution,
  2744.                 "magickImageHandle",
  2745.                 Image)
  2746. /*
  2747.  * Class:     magick_MagickImage
  2748.  * Method:    getXResolution
  2749.  * Signature: ()D
  2750.  */
  2751. getDoubleMethod(Java_magick_MagickImage_getXResolution,
  2752.                 x_resolution,
  2753.                 "magickImageHandle",
  2754.                 Image)
  2755. /*
  2756.  * Class:     magick_MagickImage
  2757.  * Method:    getYResolution
  2758.  * Signature: ()D
  2759.  */
  2760. getDoubleMethod(Java_magick_MagickImage_getYResolution,
  2761.                 y_resolution,
  2762.                 "magickImageHandle",
  2763.                 Image)
  2764. /*
  2765.  * Class:     magick_MagickImage
  2766.  * Method:    setColorProfile
  2767.  * Signature: (Lmagick/ProfileInfo;)V
  2768.  */
  2769. JNIEXPORT void JNICALL Java_magick_MagickImage_setColorProfile
  2770.   (JNIEnv *env, jobject self, jobject profile)
  2771. {
  2772.     Image *image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2773.     if (image == NULL) {
  2774.        throwMagickException(env, "Cannot obtain image handle");
  2775.        return;
  2776.     }
  2777.     setProfileInfo(env, &image->color_profile, profile);
  2778. }
  2779. /*
  2780.  * Class:     magick_MagickImage
  2781.  * Method:    getColorProfile
  2782.  * Signature: ()Lmagick/ProfileInfo;
  2783.  */
  2784. JNIEXPORT jobject JNICALL Java_magick_MagickImage_getColorProfile
  2785.   (JNIEnv *env, jobject self)
  2786. {
  2787.     Image *image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2788.     if (image == NULL) {
  2789.        throwMagickException(env, "Cannot obtain image handle");
  2790.        return NULL;
  2791.     }
  2792.     return getProfileInfo(env, &image->color_profile);
  2793. }
  2794. /*
  2795.  * Class:     magick_MagickImage
  2796.  * Method:    setIptcProfile
  2797.  * Signature: (Lmagick/ProfileInfo;)V
  2798.  */
  2799. JNIEXPORT void JNICALL Java_magick_MagickImage_setIptcProfile
  2800.   (JNIEnv *env, jobject self, jobject profile)
  2801. {
  2802.     Image *image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2803.     if (image == NULL) {
  2804.        throwMagickException(env, "Cannot obtain image handle");
  2805.        return;
  2806.     }
  2807.     setProfileInfo(env, &image->iptc_profile, profile);
  2808. }
  2809. /*
  2810.  * Class:     magick_MagickImage
  2811.  * Method:    getGenericProfileCount
  2812.  * Signature: ()I
  2813.  */
  2814. JNIEXPORT jint JNICALL Java_magick_MagickImage_getGenericProfileCount
  2815.   (JNIEnv *env, jobject self)
  2816. {
  2817.     Image *image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2818.     if (image == NULL) {
  2819.        throwMagickException(env, "Cannot obtain image handle");
  2820.        return -1;
  2821.     }
  2822.     return image->generic_profiles;
  2823. }
  2824. /*
  2825.  * Class:     magick_MagickImage
  2826.  * Method:    getGenericProfile
  2827.  * Signature: (I)Lmagick/ProfileInfo;
  2828.  */
  2829. JNIEXPORT jobject JNICALL Java_magick_MagickImage_getGenericProfile
  2830.   (JNIEnv *env, jobject self, jint index)
  2831. {
  2832.     Image *image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2833.     if (image == NULL) {
  2834.        throwMagickException(env, "Cannot obtain image handle");
  2835.        return NULL;
  2836.     }
  2837.     if (image->generic_profiles >= index) {
  2838.         return NULL;
  2839.     }
  2840.     return getProfileInfo(env, &image->generic_profile[index]);
  2841. }
  2842. /*
  2843.  * Class:     magick_MagickImage
  2844.  * Method:    getIptcProfile
  2845.  * Signature: ()Lmagick/ProfileInfo;
  2846.  */
  2847. JNIEXPORT jobject JNICALL Java_magick_MagickImage_getIptcProfile
  2848.   (JNIEnv *env, jobject self)
  2849. {
  2850.     Image *image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2851.     if (image == NULL) {
  2852.        throwMagickException(env, "Cannot obtain image handle");
  2853.        return NULL;
  2854.     }
  2855.     return getProfileInfo(env, &image->iptc_profile);
  2856. }
  2857. /*
  2858.  * Class:     magick_MagickImage
  2859.  * Method:    profileImage
  2860.  * Signature: (Ljava/lang/String;[B)Z
  2861.  */
  2862. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_profileImage
  2863.   (JNIEnv *env, jobject self, jstring profileName, jbyteArray profileData)
  2864. {
  2865.     Image *image = NULL;
  2866.     const char *cstrProfileName;
  2867.     unsigned char *cProfileData;
  2868.     size_t cProfileSize;
  2869.     unsigned int retVal;
  2870.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2871.     if (image == NULL) {
  2872. throwMagickException(env, "No image to set file name");
  2873. return JNI_FALSE;
  2874.     }
  2875.     if (profileName == NULL) {
  2876.         cstrProfileName = NULL;
  2877.     }
  2878.     else {
  2879.         cstrProfileName = (*env)->GetStringUTFChars(env, profileName, 0);
  2880.     }
  2881.     if (profileData == NULL) {
  2882.         cProfileData = NULL;
  2883.         cProfileSize = 0;
  2884.     }
  2885.     else {
  2886.         cProfileSize = (*env)->GetArrayLength(env, profileData);
  2887.         cProfileData = (*env)->GetByteArrayElements(env, profileData, 0);
  2888.     }
  2889.     /* Note that the clone parameter in ProfileImage is always true
  2890.      * for JMagick because once the byte array is released, the memory
  2891.      * is recovered by the JVM.
  2892.      */
  2893.     retVal =
  2894.       ProfileImage(image, cstrProfileName, cProfileData, cProfileSize, 1);
  2895.     if (profileData != NULL) {
  2896.         (*env)->ReleaseByteArrayElements(env, profileData, cProfileData, 0);
  2897.     }
  2898.     if (profileName != NULL) {
  2899.         (*env)->ReleaseStringUTFChars(env, profileName, cstrProfileName);
  2900.     }
  2901.     return (retVal ? JNI_TRUE : JNI_FALSE);
  2902. }
  2903. /*
  2904.  * Class:     magick_MagickImage
  2905.  * Method:    montageImages
  2906.  * Signature: (Lmagick/MontageInfo;)Lmagick/MagickImage;
  2907.  */
  2908. JNIEXPORT jobject JNICALL Java_magick_MagickImage_montageImages
  2909.   (JNIEnv *env, jobject self, jobject montageInfo)
  2910. {
  2911.     Image *image, *montage;
  2912.     MontageInfo *info;
  2913.     ExceptionInfo exception;
  2914.     jobject newObj;
  2915.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2916.     if (image == NULL) {
  2917. throwMagickException(env, "Cannot retrieve image handle");
  2918. return NULL;
  2919.     }
  2920.     info = (MontageInfo*)
  2921.         getHandle(env, montageInfo, "montageInfoHandle", NULL);
  2922.     if (info == NULL) {
  2923.         throwMagickException(env, "Unable to retrieve MontageInfo handle");
  2924.         return NULL;
  2925.     }
  2926.     GetExceptionInfo(&exception);
  2927.     montage = MontageImages(image, info, &exception);
  2928.     if (montage == NULL) {
  2929.         throwMagickApiException(env, "Failed to create montage", &exception);
  2930.         DestroyExceptionInfo(&exception);
  2931.         return NULL;
  2932.     }
  2933.     DestroyExceptionInfo(&exception);
  2934.     newObj = newImageObject(env, montage);
  2935.     if (newObj == NULL) {
  2936.         DestroyImages(montage);
  2937.         throwMagickException(env, "Unable to create montage");
  2938.         return NULL;
  2939.     }
  2940.     return newObj;
  2941. }
  2942. /*
  2943.  * Class:     magick_MagickImage
  2944.  * Method:    averageImages
  2945.  * Signature: ()Lmagick/MagickImage;
  2946.  */
  2947. JNIEXPORT jobject JNICALL Java_magick_MagickImage_averageImages
  2948.   (JNIEnv *env, jobject self)
  2949. {
  2950.     Image *image, *average;
  2951.     ExceptionInfo exception;
  2952.     jobject newObj;
  2953.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  2954.     if (image == NULL) {
  2955. throwMagickException(env, "Cannot retrieve image handle");
  2956. return NULL;
  2957.     }
  2958.     GetExceptionInfo(&exception);
  2959.     average = AverageImages(image, &exception);
  2960.     if (average == NULL) {
  2961.         throwMagickApiException(env, "Failed to create average image",
  2962.                                 &exception);
  2963.         DestroyExceptionInfo(&exception);
  2964.         return NULL;
  2965.     }
  2966.     DestroyExceptionInfo(&exception);
  2967.     newObj = newImageObject(env, average);
  2968.     if (newObj == NULL) {
  2969.         DestroyImages(average);
  2970.         throwMagickException(env, "Unable to create average image");
  2971.         return NULL;
  2972.     }
  2973.     return newObj;
  2974. }
  2975. /*
  2976.  * Class:     magick_MagickImage
  2977.  * Method:    levelImage
  2978.  * Signature: (Ljava/lang/String;)Z
  2979.  */
  2980. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_levelImage
  2981.   (JNIEnv *env, jobject self, jstring levels)
  2982. {
  2983.     Image *image = NULL;
  2984.     const char *cstr;
  2985.     jboolean retVal;
  2986.     /* Obtain the Image handle */
  2987.     image = (Image*) getHandle(env, self, 
  2988.                                "magickImageHandle", NULL);
  2989.     if (image == NULL) {
  2990. throwMagickException(env, "Cannot obtain Image handle");
  2991. return JNI_FALSE;
  2992.     }
  2993.     cstr = (*env)->GetStringUTFChars(env, levels, 0);
  2994.     retVal = LevelImage(image, cstr);
  2995.     (*env)->ReleaseStringUTFChars(env, levels, cstr);
  2996.     return retVal;
  2997. }
  2998. /*
  2999.  * Class:     magick_MagickImage
  3000.  * Method:    sizeBlob
  3001.  * Signature: ()I
  3002.  */
  3003. JNIEXPORT jint JNICALL Java_magick_MagickImage_sizeBlob
  3004.   (JNIEnv *env, jobject self)
  3005. {
  3006.     Image *image = NULL;
  3007.     /* Obtain the Image handle */
  3008.     image = (Image*) getHandle(env, self, 
  3009.                                "magickImageHandle", NULL);
  3010.     if (image == NULL) {
  3011. throwMagickException(env, "Cannot obtain Image handle");
  3012. return -1;
  3013.     }
  3014.     return SizeBlob(image);
  3015. }
  3016. /*
  3017.  * Class:     magick_MagickImage
  3018.  * Method:    setCompression
  3019.  * Signature: (I)V
  3020.  */
  3021. setIntMethod(Java_magick_MagickImage_setCompression,
  3022.              compression,
  3023.              "magickImageHandle",
  3024.              Image)
  3025. /*
  3026.  * Class:     magick_MagickImage
  3027.  * Method:    getCompression
  3028.  * Signature: ()I
  3029.  */
  3030. getIntMethod(Java_magick_MagickImage_getCompression,
  3031.              compression,
  3032.              "magickImageHandle",
  3033.              Image)
  3034. /*
  3035.  * Class:     magick_MagickImage
  3036.  * Method:    getImageType
  3037.  * Signature: ()I
  3038.  */
  3039. JNIEXPORT jint JNICALL Java_magick_MagickImage_getImageType
  3040.   (JNIEnv *env, jobject self)
  3041. {
  3042.     jint imageType;
  3043.     ExceptionInfo exception;
  3044.     Image *image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  3045.     if (image == NULL) {
  3046.        throwMagickException(env, "Cannot obtain image handle");
  3047.        return -1;
  3048.     }
  3049.     GetExceptionInfo(&exception);
  3050.     imageType = GetImageType( image, &exception);
  3051.     DestroyExceptionInfo(&exception);
  3052.     return imageType;
  3053. }
  3054. /*
  3055.  * Class:     magick_MagickImage
  3056.  * Method:    getOnePixel
  3057.  * Signature: (II)Lmagick/PixelPacket;
  3058.  */
  3059. JNIEXPORT jobject JNICALL Java_magick_MagickImage_getOnePixel
  3060.     (JNIEnv *env, jobject self, jint xPos, jint yPos)
  3061. {
  3062.     Image *image = NULL;
  3063.     jobject jPixelPacket = NULL;
  3064.     PixelPacket pixel;
  3065.     jclass pixelPacketClass;
  3066.     jmethodID consMethodID;
  3067.     image = (Image *) getHandle(env, self, "magickImageHandle", NULL);
  3068.     if (image == NULL) {
  3069.         throwMagickException(env, "Unable to retrieve image");
  3070.         return NULL;
  3071.     }
  3072.     pixel = GetOnePixel(image, xPos, yPos);
  3073.     if (&pixel == NULL) {
  3074.         throwMagickException(env, "Unable to retrieve pixel");
  3075.     }
  3076.     pixelPacketClass = (*env)->FindClass(env, "magick/PixelPacket");
  3077.     if (pixelPacketClass == 0) {
  3078.         throwMagickException(env,
  3079.                              "Unable to locate class magick.PixelPacket");
  3080.         return NULL;
  3081.     }
  3082.     consMethodID = (*env)->GetMethodID(env, pixelPacketClass,
  3083.                                        "<init>", "(IIII)V");
  3084.     if (consMethodID == 0) {
  3085.         throwMagickException(env, "Unable to construct magick.PixelPacket");
  3086.         return NULL;
  3087.     }
  3088.     jPixelPacket = (*env)->NewObject(env, pixelPacketClass, consMethodID,
  3089.                                      (jint) pixel.red,
  3090.                                      (jint) pixel.green,
  3091.                                      (jint) pixel.blue,
  3092.                                      (jint) pixel.opacity);
  3093.     if (jPixelPacket == NULL) {
  3094.         throwMagickException(env, "Unable to construct magick.PixelPacket");
  3095.         return NULL;
  3096.     }
  3097.     return jPixelPacket;
  3098. }
  3099. /*
  3100.  * Class:     magick_MagickImage
  3101.  * Method:    setBorderColor
  3102.  * Signature: (Lmagick/PixelPacket;)V
  3103.  */
  3104. setPixelPacketMethod(Java_magick_MagickImage_setBorderColor,
  3105.                      border_color,
  3106.                      "magickImageHandle",
  3107.                      Image)
  3108. /*
  3109.  * Class:     magick_MagickImage
  3110.  * Method:    getBorderColor
  3111.  * Signature: ()Lmagick/PixelPacket;
  3112.  */
  3113. getPixelPacketMethod(Java_magick_MagickImage_getBorderColor,
  3114.                      border_color,
  3115.                      "magickImageHandle",
  3116.                      Image)
  3117. /*
  3118.  * Class:     magick_MagickImage
  3119.  * Method:    setBackgroundColor
  3120.  * Signature: (Lmagick/PixelPacket;)V
  3121.  */
  3122. setPixelPacketMethod(Java_magick_MagickImage_setBackgroundColor,
  3123.                      background_color,
  3124.                      "magickImageHandle",
  3125.                      Image)
  3126. /*
  3127.  * Class:     magick_MagickImage
  3128.  * Method:    getBackgroundColor
  3129.  * Signature: ()Lmagick/PixelPacket;
  3130.  */
  3131. getPixelPacketMethod(Java_magick_MagickImage_getBackgroundColor,
  3132.                      background_color,
  3133.                      "magickImageHandle",
  3134.                      Image)
  3135. /*
  3136.  * Class:     magick_MagickImage
  3137.  * Method:    setDelay
  3138.  * Signature: (I)V
  3139.  */
  3140. setIntMethod(Java_magick_MagickImage_setDelay,
  3141.      delay,
  3142.      "magickImageHandle",
  3143.      Image)
  3144. /*
  3145.  * Class:     magick_MagickImage
  3146.  * Method:    getDelay
  3147.  * Signature: ()I
  3148.  */
  3149. getIntMethod(Java_magick_MagickImage_getDelay,
  3150.      delay,
  3151.      "magickImageHandle",
  3152.      Image)
  3153. /*
  3154.  * Class:     magick_MagickImage
  3155.  * Method:    setDispose
  3156.  * Signature: (I)V
  3157.  */
  3158. setIntMethod(Java_magick_MagickImage_setDispose,
  3159.      dispose,
  3160.      "magickImageHandle",
  3161.      Image)
  3162. /*
  3163.  * Class:     magick_MagickImage
  3164.  * Method:    getDispose
  3165.  * Signature: ()I
  3166.  */
  3167. getIntMethod(Java_magick_MagickImage_getDispose,
  3168.      dispose,
  3169.      "magickImageHandle",
  3170.      Image)
  3171. /*
  3172.  * Class:     magick_MagickImage
  3173.  * Method:    setIterations
  3174.  * Signature: (I)V
  3175.  */
  3176. setIntMethod(Java_magick_MagickImage_setIterations,
  3177.      iterations,
  3178.      "magickImageHandle",
  3179.      Image)
  3180. /*
  3181.  * Class:     magick_MagickImage
  3182.  * Method:    getIterations
  3183.  * Signature: ()I
  3184.  */
  3185. getIntMethod(Java_magick_MagickImage_getIterations,
  3186.      iterations,
  3187.      "magickImageHandle",
  3188.      Image)
  3189. /*
  3190.  * Class:     magick_MagickImage
  3191.  * Method:    setColors
  3192.  * Signature: (I)V
  3193.  */
  3194. setIntMethod(Java_magick_MagickImage_setColors,
  3195.      colors,
  3196.      "magickImageHandle",
  3197.      Image)
  3198. /*
  3199.  * Class:     magick_MagickImage
  3200.  * Method:    getColors
  3201.  * Signature: ()I
  3202.  */
  3203. getIntMethod(Java_magick_MagickImage_getColors,
  3204.      colors,
  3205.      "magickImageHandle",
  3206.      Image)
  3207. /*
  3208.  * Class:     magick_MagickImage
  3209.  * Method:    getTotalColors
  3210.  * Signature: ()I
  3211.  */
  3212. getIntMethod(Java_magick_MagickImage_getTotalColors,
  3213.      total_colors,
  3214.      "magickImageHandle",
  3215.      Image)
  3216. /*
  3217.  * Class:     magick_MagickImage
  3218.  * Method:    getColormap
  3219.  * Signature: (I)Lmagick/PixelPacket;
  3220.  */
  3221. JNIEXPORT jobject JNICALL Java_magick_MagickImage_getColormap__I
  3222.   (JNIEnv *env, jobject self, jint index)
  3223. {
  3224.     Image *image;
  3225.     jobject jPixelPacket = NULL;
  3226.     jclass pixelPacketClass;
  3227.     jmethodID consMethodID;
  3228.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  3229.     if (image == NULL) {
  3230.         throwMagickException(env, "Unable to obtain image handle");
  3231.         return NULL;
  3232.     }
  3233.     if (index >= image->colors) {
  3234.         throwMagickException(env, "Index out of range");
  3235.         return NULL;
  3236.     }
  3237.     pixelPacketClass = (*env)->FindClass(env, "magick/PixelPacket");
  3238.     if (pixelPacketClass == 0) {
  3239. throwMagickException(env,
  3240.      "Unable to locate class magick.PixelPacket");
  3241. return NULL;
  3242.     }
  3243.     consMethodID = (*env)->GetMethodID(env, pixelPacketClass,
  3244.        "<init>", "(IIII)V");
  3245.     if (consMethodID == 0) {
  3246. throwMagickException(env, "Unable to construct magick.PixelPacket");
  3247. return NULL;
  3248.     }
  3249.     jPixelPacket = (*env)->NewObject(env, pixelPacketClass, consMethodID,
  3250.                      (jint) image->colormap[index].red,
  3251.                      (jint) image->colormap[index].green,
  3252.                      (jint) image->colormap[index].blue,
  3253.                      (jint) image->colormap[index].opacity);
  3254.     if (jPixelPacket == NULL) {
  3255. throwMagickException(env, "Unable to construct magick.PixelPacket");
  3256. return NULL;
  3257.     }
  3258.     return jPixelPacket;
  3259. }
  3260. /*
  3261.  * Class:     magick_MagickImage
  3262.  * Method:    getColormap
  3263.  * Signature: ()[Lmagick/PixelPacket;
  3264.  */
  3265. JNIEXPORT jobjectArray JNICALL Java_magick_MagickImage_getColormap__
  3266.   (JNIEnv *env, jobject self)
  3267. {
  3268.     Image *image;
  3269.     jobject jPixelPacket = NULL;
  3270.     jclass pixelPacketClass;
  3271.     jmethodID consMethodID;
  3272.     jobjectArray jPPArray;
  3273.     int i;
  3274.     /* Get the image handle */
  3275.     image = (Image*) getHandle(env, self, "magickImageHandle", NULL);
  3276.     if (image == NULL) {
  3277.         throwMagickException(env, "Unable to obtain image handle");
  3278.         return NULL;
  3279.     }
  3280.     /* Sanity check */
  3281.     if (image->colors <= 0 || image->colormap == NULL) {
  3282.         throwMagickException(env, "Image does not have a colourmap");
  3283.         return NULL;
  3284.     }
  3285.     /* Get the PixelPacket object class */
  3286.     pixelPacketClass = (*env)->FindClass(env, "magick/PixelPacket");
  3287.     if (pixelPacketClass == 0) {
  3288. throwMagickException(env,
  3289.      "Unable to locate class magick.PixelPacket");
  3290. return NULL;
  3291.     }
  3292.     /* Get the constructor ID for PixelPacket */
  3293.     consMethodID = (*env)->GetMethodID(env, pixelPacketClass,
  3294.        "<init>", "(IIII)V");
  3295.     if (consMethodID == 0) {
  3296. throwMagickException(env, "Unable to construct magick.PixelPacket");
  3297. return NULL;
  3298.     }
  3299.     /* Create the PixelPacket array */
  3300.     jPPArray =
  3301.         (*env)->NewObjectArray(env, image->colors, pixelPacketClass, NULL);
  3302.     if (jPPArray == NULL) {
  3303.         throwMagickException(env, "Unable to construct PixelPacket[]");
  3304.         return NULL;
  3305.     }
  3306.     /* Construct a PixelPacket for each item in the colourmap */
  3307.     for (i = 0; i < image->colors; i++) {
  3308.         /* Create the PixelPacket */
  3309.         jPixelPacket =
  3310.             (*env)->NewObject(env, pixelPacketClass, consMethodID,
  3311.                               (jint) image->colormap[i].red,
  3312.                               (jint) image->colormap[i].green,
  3313.                               (jint) image->colormap[i].blue,
  3314.                               (jint) image->colormap[i].opacity);
  3315.         if (jPixelPacket == NULL) {
  3316.             throwMagickException(env, "Unable to construct magick.PixelPacket");
  3317.             return NULL;
  3318.         }
  3319.         /* Set the PixelPacket in the array */
  3320.         (*env)->SetObjectArrayElement(env, jPPArray, i, jPixelPacket);
  3321.     }
  3322.     return jPPArray;
  3323. }
  3324. /*
  3325.  * Class:     magick_MagickImage
  3326.  * Method:    signatureImage
  3327.  * Signature: ()Z
  3328.  */
  3329. JNIEXPORT jboolean JNICALL Java_magick_MagickImage_signatureImage
  3330.     (JNIEnv *env, jobject self)
  3331. {
  3332.     Image *image = NULL;
  3333.     jboolean retVal;
  3334.     /* Obtain the Image handle */
  3335.     image = (Image*) getHandle(env, self, 
  3336.                                "magickImageHandle", NULL);
  3337.     if (image == NULL) {
  3338.       throwMagickException(env, "Cannot obtain Image handle");
  3339.       return JNI_FALSE;
  3340.     }
  3341.     retVal = SignatureImage(image);
  3342.     return(retVal);
  3343. }
  3344. /*
  3345.  * Class:     magick_MagickImage
  3346.  * Method:    getQuality
  3347.  * Signature: ()I
  3348.  */
  3349. getIntMethod(Java_magick_MagickImage_getQuality,
  3350.      quality,
  3351.      "magickImageHandle",
  3352.      Image)