/* * Class: magick_Magick * Method: parseImageGeometry * Signature: (Ljava/lang/String;Ljava/awt/Rectangle;)I */ JNIEXPORT jint JNICALL Java_magick_Magick_parseImageGeometry (JNIEnv *env, jclass magickClass, jstring geometry, jobject rect) { unsigned long x, y, width, height; jint flags; const char *cstr; if (!getIntFieldValue(env, rect, "width", NULL, (jint *) &width) || !getIntFieldValue(env, rect, "height", NULL, (jint *) &height) || !getIntFieldValue(env, rect, "x", NULL, (jint *) &x) || !getIntFieldValue(env, rect, "y", NULL, (jint *) &y)) { throwMagickException(env, "Unable to obtain Rectangle values"); return 0; } cstr = (const char *) (*env)->GetStringUTFChars(env, geometry, 0); flags = ParseImageGeometry(cstr, &x, &y, &width, &height); (*env)->ReleaseStringUTFChars(env, geometry, cstr); if (!setIntFieldValue(env, rect, "width", NULL, width) || !setIntFieldValue(env, rect, "height", NULL, height) || !setIntFieldValue(env, rect, "x", NULL, x) || !setIntFieldValue(env, rect, "y", NULL, y)) { throwMagickException(env, "Unable to set Rectangle values"); return 0; } return flags; }
Export Image *MontageImages(const Image *images,const MontageInfo *montage_info) { #define MontageImageText " Creating visual image directory... " #define TileImageText " Creating image tiles... " AnnotateInfo *annotate_info; char geometry[MaxTextExtent]; FrameInfo frame_info; Image *image, **image_list, **master_list, *montage_image, *texture, *tiled_image; ImageInfo *local_info; int x, x_offset, y, y_offset; MonitorHandler handler; register int i; register PixelPacket *q; RectangleInfo bounding_box, tile_info; unsigned int border_width, bevel_width, concatenate, count, font_height, height, images_per_page, max_height, number_images, number_lines, tile, tiles, tiles_per_column, tiles_per_row, tiles_per_page, title_offset, total_tiles, width; assert(images != (Image *) NULL); assert(montage_info != (MontageInfo *) NULL); /* Convert image list to an image group. */ image_list=ListToGroupImage(images,&number_images); if (image_list == (Image **) NULL) { MagickWarning(ResourceLimitWarning,"Unable to montage image_list", "Memory allocation failed"); return((Image *) NULL); } master_list=image_list; /* Create image tiles. */ for (tile=0; tile < number_images; tile++) { handler=SetMonitorHandler((MonitorHandler) NULL); width=image_list[tile]->columns; height=image_list[tile]->rows; x=0; y=0; (void) ParseImageGeometry(montage_info->geometry,&x,&y,&width,&height); image_list[tile]->orphan=True; tiled_image=ZoomImage(image_list[tile],width,height); if (tiled_image == (Image *) NULL) { for (i=0; i < (int) tile; i++) DestroyImage(image_list[i]); (void) SetMonitorHandler(handler); return((Image *) NULL); } image_list[tile]=tiled_image; (void) SetMonitorHandler(handler); ProgressMonitor(TileImageText,tile,number_images); } /* Sort image_list by increasing tile number. */ for (tile=0; tile < number_images; tile++) if (image_list[tile]->scene == 0) break; if (tile == number_images) qsort((void *) image_list,number_images,sizeof(Image *), (int (*)(const void *, const void *)) SceneCompare); /* Determine tiles per row and column. */ tiles_per_row=1; tiles_per_column=1; while ((tiles_per_row*tiles_per_column) < number_images) { tiles_per_row++; tiles_per_column++; } if (montage_info->tile != (char *) NULL) { tiles_per_column=number_images; x=0; y=0; (void) ParseGeometry(montage_info->tile,&x,&y,&tiles_per_row, &tiles_per_column); } /* Determine tile sizes. */ border_width=montage_info->border_width; bevel_width=0; if (montage_info->frame != (char *) NULL) { int flags; frame_info.width=0; frame_info.height=0; frame_info.outer_bevel=0; frame_info.inner_bevel=0; flags=ParseGeometry(montage_info->frame,&frame_info.outer_bevel, &frame_info.inner_bevel,&frame_info.width,&frame_info.height); if ((flags & HeightValue) == 0) frame_info.height=frame_info.width; if ((flags & XValue) == 0) frame_info.outer_bevel=(frame_info.width >> 2)+1; if ((flags & YValue) == 0) frame_info.inner_bevel=frame_info.outer_bevel; frame_info.x=frame_info.width; frame_info.y=frame_info.height; bevel_width=Max(frame_info.inner_bevel,frame_info.outer_bevel); border_width=Max(frame_info.width,frame_info.height); }