114 if (montage_info->
geometry != (
char *) NULL)
116 if (montage_info->
tile != (
char *) NULL)
118 if (montage_info->
title != (
char *) NULL)
120 if (montage_info->
frame != (
char *) NULL)
122 if (montage_info->
texture != (
char *) NULL)
124 if (montage_info->
font != (
char *) NULL)
129 clone_info->
fill=montage_info->
fill;
170 if (montage_info->
geometry != (
char *) NULL)
173 if (montage_info->
tile != (
char *) NULL)
175 if (montage_info->
title != (
char *) NULL)
177 if (montage_info->
frame != (
char *) NULL)
179 if (montage_info->
texture != (
char *) NULL)
182 if (montage_info->
font != (
char *) NULL)
186 return(montage_info);
217 assert(image_info != (
const ImageInfo *) NULL);
223 (void) memset(montage_info,0,
sizeof(*montage_info));
227 if (image_info->
font != (
char *) NULL)
273 ssize_t *x_offset,ssize_t *y_offset,
size_t *tiles_per_column,
274 size_t *tiles_per_row)
278 (void)
GetGeometry(geometry,x_offset,y_offset,tiles_per_row,tiles_per_column);
279 if ((*tiles_per_column == 0) && (*tiles_per_row == 0))
280 *tiles_per_column=(size_t) sqrt((
double) number_images);
281 if ((*tiles_per_column == 0) && (*tiles_per_row != 0))
282 *tiles_per_column=(size_t) ceil((
double) number_images/(*tiles_per_row));
283 if ((*tiles_per_row == 0) && (*tiles_per_column != 0))
284 *tiles_per_row=(size_t) ceil((
double) number_images/(*tiles_per_column));
287 #if defined(__cplusplus) || defined(c_plusplus) 297 image_1=(
Image **) x;
298 image_2=(
Image **) y;
299 return((
int) ((*image_1)->scene-(*image_2)->scene));
302 #if defined(__cplusplus) || defined(c_plusplus) 318 return(montage_image);
324 #define MontageImageTag "Montage/Image" 325 #define TileImageTag "Tile/Image" 404 assert(images != (
Image *) NULL);
414 if (primary_list == (
Image **) NULL)
415 return((
Image *) NULL);
416 image_list=primary_list;
419 for (i=0; i < (ssize_t) number_images; i++)
422 if (image == (
Image *) NULL)
429 if (thumbnail == (
Image *) NULL)
431 image_list[i]=thumbnail;
439 if (i < (ssize_t) number_images)
441 if (image != (
Image *) NULL)
443 if (thumbnail == (
Image *) NULL)
445 for (tile=0; (ssize_t) tile <= i; tile++)
446 if (image_list[tile] != (
Image *) NULL)
449 return((
Image *) NULL);
454 for (i=0; i < (ssize_t) number_images; i++)
455 if (image_list[i]->scene == 0)
457 if (i == (ssize_t) number_images)
458 qsort((
void *) image_list,(size_t) number_images,
sizeof(*image_list),
463 tiles_per_column=(size_t) sqrt((
double) number_images);
464 tiles_per_row=(size_t) ceil((
double) number_images/tiles_per_column);
467 if (montage_info->
tile != (
char *) NULL)
469 &tiles_per_column,&tiles_per_row);
477 if (montage_info->
geometry != (
char *) NULL)
489 (void) memset(&frame_info,0,
sizeof(frame_info));
490 if (montage_info->
frame != (
char *) NULL)
498 montage_info->
frame);
507 frame_info.
x=(ssize_t) frame_info.
width;
508 frame_info.
y=(ssize_t) frame_info.
height;
512 (ssize_t) frame_info.
height);
514 for (i=0; i < (ssize_t) number_images; i++)
516 if (image_list[i]->columns > extract_info.
width)
518 if (image_list[i]->rows > extract_info.
height)
528 if (montage_info->
font != (
char *) NULL)
536 (void)
GetTypeMetrics(image_list[0],draw_info,&metrics,exception);
538 if (montage_info->
texture != (
char *) NULL)
550 if (montage_info->
title != (
char *) NULL)
554 for (i=0; i < (ssize_t) number_images; i++)
557 if (value == (
const char *) NULL)
569 images_per_page=(number_images-1)/(tiles_per_row*tiles_per_column)+1;
571 total_tiles=(size_t) number_images;
572 for (i=0; i < (ssize_t) images_per_page; i++)
577 tiles_per_page=tiles_per_row*tiles_per_column;
580 if (montage_info->
tile != (
char *) NULL)
583 tiles_per_page=tiles_per_row*tiles_per_column;
584 y_offset+=(ssize_t) title_offset;
589 for (tile=0; tile < (ssize_t) tiles_per_page; tile++)
591 if (tile < (ssize_t) number_images)
595 if (image_list[tile]->rows > max_height)
596 max_height=image_list[tile]->
rows;
598 x_offset+=(ssize_t) (width+2*(extract_info.
x+border_width));
599 if (x_offset > (ssize_t) bounds.
width)
600 bounds.
width=(
size_t) x_offset;
601 if (((tile+1) == (ssize_t) tiles_per_page) ||
602 (((tile+1) % tiles_per_row) == 0))
605 if (montage_info->
tile != (
char *) NULL)
609 y_offset+=(ssize_t) (height+(extract_info.
y+(ssize_t) border_width)*2+
612 if (y_offset > (ssize_t) bounds.
height)
613 bounds.
height=(
size_t) y_offset;
633 while (tile <
MagickMin((ssize_t) tiles_per_page,(ssize_t) number_images))
635 extent+=strlen(image_list[tile]->filename)+1;
640 if ((montage->
montage == (
char *) NULL) ||
643 if (montage->
montage != (
char *) NULL)
652 if (montage_info->
tile != (
char *) NULL)
655 y_offset+=(ssize_t) title_offset;
657 "%.20gx%.20g%+.20g%+.20g",(
double) (extract_info.
width+
658 (extract_info.
x+border_width)*2),(double) (extract_info.
height+
659 (extract_info.
y+border_width)*2+(double) ((metrics.
ascent-
661 0))),(
double) x_offset,(double) y_offset);
664 while (tile <
MagickMin((ssize_t) tiles_per_page,(ssize_t) number_images))
666 if (strchr(image_list[tile]->filename,
'\xff') == (
char *) NULL)
671 "InvalidArgument",
"'%s'",image_list[tile]->filename);
677 if (texture != (
Image *) NULL)
679 if (montage_info->
title != (
char *) NULL)
693 (void)
GetTypeMetrics(image_list[0],draw_clone_info,&tile_metrics,
696 "%.20gx%.20g%+.20g%+.20g",(
double) montage->
columns,(double)
698 (double) extract_info.
y+4);
711 if (montage_info->
tile != (
char *) NULL)
714 x_offset+=extract_info.
x;
715 y_offset+=(ssize_t) title_offset+extract_info.
y;
718 for (tile=0; tile <
MagickMin((ssize_t) tiles_per_page,(ssize_t) number_images); tile++)
724 if (image == (
Image *) NULL)
729 if (image->
rows > max_height)
730 max_height=image->
rows;
732 if (border_width != 0)
743 border_info.
width=border_width;
744 border_info.
height=border_width;
745 if (montage_info->
frame != (
char *) NULL)
751 if (border_image != (
Image *) NULL)
756 if ((montage_info->
frame != (
char *) NULL) &&
768 tile_image->
rows=height;
773 "%.20gx%.20g+0+0",(
double) image->
columns,(double) image->
rows);
775 x=(ssize_t) (geometry.
x+border_width);
776 y=(ssize_t) (geometry.
y+border_width);
777 if ((montage_info->
frame != (
char *) NULL) && (bevel_width > 0))
788 frame_clone=frame_info;
792 if (value != (
const char *) NULL)
796 if (frame_image != (
Image *) NULL)
819 shadow_image=
ShadowImage(image,80.0,2.0,5,5,exception);
820 if (shadow_image != (
Image *) NULL)
829 x_offset+x,y_offset+y,exception);
831 if (value != (
const char *) NULL)
837 "%.20gx%.20g%+.20g%+.20g",(
double) ((montage_info->
frame ?
838 image->
columns : width)-2*border_width),(double)
840 (double) (x_offset+border_width),(double)
841 ((montage_info->
frame ? y_offset+height+border_width+4 :
842 y_offset+extract_info.
height+border_width+
849 x_offset+=(ssize_t) (width+2*(extract_info.
x+border_width));
850 if (((tile+1) == (ssize_t) tiles_per_page) ||
851 (((tile+1) % tiles_per_row) == 0))
853 x_offset=extract_info.
x;
854 y_offset+=(ssize_t) (height+(extract_info.
y+border_width)*2+
870 if ((i+1) < (ssize_t) images_per_page)
879 return((
Image *) NULL);
883 image_list+=tiles_per_page;
884 number_images-=tiles_per_page;
888 if (texture != (
Image *) NULL)
MagickExport MagickBooleanType TextureImage(Image *image, const Image *texture, ExceptionInfo *exception)
MagickDoubleType MagickRealType
MagickExport MagickBooleanType NegateImage(Image *image, const MagickBooleanType grayscale, ExceptionInfo *exception)
MagickExport ImageInfo * AcquireImageInfo(void)
MagickExport Image * FrameImage(const Image *image, const FrameInfo *frame_info, const CompositeOperator compose, ExceptionInfo *exception)
MagickExport Image * MontageImages(const Image *images, const MontageInfo *montage_info, ExceptionInfo *exception)
MagickProgressMonitor progress_monitor
MagickExport size_t ConcatenateMagickString(char *magick_restrict destination, const char *magick_restrict source, const size_t length)
MagickExport MagickStatusType ParseAbsoluteGeometry(const char *geometry, RectangleInfo *region_info)
MagickExport MagickStatusType ParseMetaGeometry(const char *geometry, ssize_t *x, ssize_t *y, size_t *width, size_t *height)
MagickExport ssize_t FormatLocaleString(char *magick_restrict string, const size_t length, const char *magick_restrict format,...)
MagickExport size_t CopyMagickString(char *magick_restrict destination, const char *magick_restrict source, const size_t length)
MagickExport void GetMontageInfo(const ImageInfo *image_info, MontageInfo *montage_info)
char magick[MagickPathExtent]
MagickExport MagickBooleanType CompositeImage(Image *image, const Image *composite, const CompositeOperator compose, const MagickBooleanType clip_to_self, const ssize_t x_offset, const ssize_t y_offset, ExceptionInfo *exception)
PixelInfo background_color
MagickExport Image * ThumbnailImage(const Image *image, const size_t columns, const size_t rows, ExceptionInfo *exception)
static void GetMontageGeometry(char *geometry, const size_t number_images, ssize_t *x_offset, ssize_t *y_offset, size_t *tiles_per_column, size_t *tiles_per_row)
#define MagickCoreSignature
MagickExport Image * GetFirstImageInList(const Image *images)
MagickExport size_t MultilineCensus(const char *label)
MagickExport Image * MontageImageList(const ImageInfo *image_info, const MontageInfo *montage_info, const Image *images, ExceptionInfo *exception)
#define DefaultTileGeometry
MagickExport Image * NewImageList(void)
unsigned int MagickStatusType
MagickExport char * AcquireString(const char *source)
MagickExport MagickBooleanType AnnotateImage(Image *image, const DrawInfo *draw_info, ExceptionInfo *exception)
MagickExport void * AcquireCriticalMemory(const size_t size)
char filename[MagickPathExtent]
MagickExport void * AcquireQuantumMemory(const size_t count, const size_t quantum)
char filename[MagickPathExtent]
MagickExport Image * ShadowImage(const Image *image, const double alpha, const double sigma, const ssize_t x_offset, const ssize_t y_offset, ExceptionInfo *exception)
MagickExport MagickBooleanType IsEventLogging(void)
MagickExport void AcquireNextImage(const ImageInfo *image_info, Image *image, ExceptionInfo *exception)
MagickExport ChannelType SetPixelChannelMask(Image *image, const ChannelType channel_mask)
MagickExport Image * ReadImage(const ImageInfo *image_info, ExceptionInfo *exception)
MagickExport MagickBooleanType ThrowMagickException(ExceptionInfo *exception, const char *module, const char *function, const size_t line, const ExceptionType severity, const char *tag, const char *format,...)
MagickExport MagickBooleanType LogMagickEvent(const LogEventType type, const char *module, const char *function, const size_t line, const char *format,...)
MagickExport MagickBooleanType SetImageBackgroundColor(Image *image, ExceptionInfo *exception)
MagickExport Image * AcquireImage(const ImageInfo *image_info, ExceptionInfo *exception)
MagickBooleanType(* MagickProgressMonitor)(const char *, const MagickOffsetType, const MagickSizeType, void *)
MagickExport DrawInfo * CloneDrawInfo(const ImageInfo *image_info, const DrawInfo *draw_info)
MagickExport MontageInfo * DestroyMontageInfo(MontageInfo *montage_info)
MagickExport MagickBooleanType QueryColorCompliance(const char *name, const ComplianceType compliance, PixelInfo *color, ExceptionInfo *exception)
MagickExport MagickProgressMonitor SetImageProgressMonitor(Image *image, const MagickProgressMonitor progress_monitor, void *client_data)
MagickExport Image * DestroyImageList(Image *images)
static int SceneCompare(const void *x, const void *y)
MagickExport int LocaleCompare(const char *p, const char *q)
char filename[MagickPathExtent]
#define GetMagickModule()
#define ThrowImageException(severity, tag)
MagickExport Image ** ImageListToArray(const Image *images, ExceptionInfo *exception)
MagickExport char * InterpretImageProperties(ImageInfo *image_info, Image *image, const char *embed_text, ExceptionInfo *exception)
MagickExport ImageInfo * DestroyImageInfo(ImageInfo *image_info)
MagickExport MagickBooleanType GetTypeMetrics(Image *image, const DrawInfo *draw_info, TypeMetric *metrics, ExceptionInfo *exception)
MagickExport MagickStatusType GetGeometry(const char *geometry, ssize_t *x, ssize_t *y, size_t *width, size_t *height)
MagickExport Image * BorderImage(const Image *image, const RectangleInfo *border_info, const CompositeOperator compose, ExceptionInfo *exception)
MagickExport DrawInfo * DestroyDrawInfo(DrawInfo *draw_info)
MagickExport MagickStatusType ParseGravityGeometry(const Image *image, const char *geometry, RectangleInfo *region_info, ExceptionInfo *exception)
MagickExport Image * GetNextImageInList(const Image *images)
MagickExport char * DestroyString(char *string)
MagickExport const char * GetImageProperty(const Image *image, const char *property, ExceptionInfo *exception)
MagickExport ImageInfo * CloneImageInfo(const ImageInfo *image_info)
MagickExport void SetGeometry(const Image *image, RectangleInfo *geometry)
MagickExport void * RelinquishMagickMemory(void *memory)
MagickExport char * CloneString(char **destination, const char *source)
CompositeOperator compose
PixelInfo background_color
MagickExport size_t GetImageListLength(const Image *images)
MagickExport MontageInfo * CloneMontageInfo(const ImageInfo *image_info, const MontageInfo *montage_info)
MagickExport Image * DestroyImage(Image *image)
MagickExport Image * CloneImage(const Image *image, const size_t columns, const size_t rows, const MagickBooleanType detach, ExceptionInfo *exception)
PixelInfo background_color
MagickExport MagickStatusType ParseRegionGeometry(const Image *image, const char *geometry, RectangleInfo *region_info, ExceptionInfo *exception)
MagickExport MagickBooleanType SetImageProgress(const Image *image, const char *tag, const MagickOffsetType offset, const MagickSizeType extent)