42#include "magick/studio.h"
43#include "magick/attribute.h"
44#include "magick/cache.h"
45#include "magick/cache-view.h"
46#include "magick/color.h"
47#include "magick/color-private.h"
48#include "magick/colorspace-private.h"
49#include "magick/composite.h"
50#include "magick/distort.h"
51#include "magick/draw.h"
52#include "magick/effect.h"
53#include "magick/exception.h"
54#include "magick/exception-private.h"
55#include "magick/geometry.h"
56#include "magick/image.h"
57#include "magick/memory_.h"
58#include "magick/layer.h"
59#include "magick/list.h"
60#include "magick/monitor.h"
61#include "magick/monitor-private.h"
62#include "magick/pixel-private.h"
63#include "magick/property.h"
64#include "magick/resource_.h"
65#include "magick/resize.h"
66#include "magick/statistic.h"
67#include "magick/string_.h"
68#include "magick/thread-private.h"
69#include "magick/transform.h"
99MagickExport
Image *AutoOrientImage(
const Image *image,
105 assert(image != (
const Image *) NULL);
106 assert(image->signature == MagickCoreSignature);
108 assert(exception->signature == MagickCoreSignature);
109 orient_image=(
Image *) NULL;
112 case UndefinedOrientation:
113 case TopLeftOrientation:
116 orient_image=CloneImage(image,0,0,MagickTrue,exception);
119 case TopRightOrientation:
121 orient_image=FlopImage(image,exception);
124 case BottomRightOrientation:
126 orient_image=RotateImage(image,180.0,exception);
129 case BottomLeftOrientation:
131 orient_image=FlipImage(image,exception);
134 case LeftTopOrientation:
136 orient_image=TransposeImage(image,exception);
139 case RightTopOrientation:
141 orient_image=RotateImage(image,90.0,exception);
144 case RightBottomOrientation:
146 orient_image=TransverseImage(image,exception);
149 case LeftBottomOrientation:
151 orient_image=RotateImage(image,270.0,exception);
155 if (orient_image != (
Image *) NULL)
156 orient_image->orientation=TopLeftOrientation;
157 return(orient_image);
191#define ChopImageTag "Chop/Image"
215 assert(image != (
const Image *) NULL);
216 assert(image->signature == MagickCoreSignature);
218 assert(exception->signature == MagickCoreSignature);
220 if (IsEventLogging() != MagickFalse)
221 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
222 if (((chop_info->x+(ssize_t) chop_info->width) < 0) ||
223 ((chop_info->y+(ssize_t) chop_info->height) < 0) ||
224 (chop_info->x > (ssize_t) image->columns) ||
225 (chop_info->y > (ssize_t) image->rows))
226 ThrowImageException(OptionWarning,
"GeometryDoesNotContainImage");
228 if ((extent.x+(ssize_t) extent.width) > (ssize_t) image->columns)
229 extent.width=(size_t) ((ssize_t) image->columns-extent.x);
230 if ((extent.y+(ssize_t) extent.height) > (ssize_t) image->rows)
231 extent.height=(size_t) ((ssize_t) image->rows-extent.y);
234 extent.width-=(size_t) (-extent.x);
239 extent.height-=(size_t) (-extent.y);
242 if ((extent.width >= image->columns) || (extent.height >= image->rows))
243 ThrowImageException(OptionWarning,
"GeometryDoesNotContainImage");
244 chop_image=CloneImage(image,image->columns-extent.width,image->rows-
245 extent.height,MagickTrue,exception);
246 if (chop_image == (
Image *) NULL)
247 return((
Image *) NULL);
253 image_view=AcquireVirtualCacheView(image,exception);
254 chop_view=AcquireAuthenticCacheView(chop_image,exception);
255#if defined(MAGICKCORE_OPENMP_SUPPORT)
256 #pragma omp parallel for schedule(static) shared(status) \
257 magick_number_threads(image,chop_image,extent.y,2)
259 for (y=0; y < (ssize_t) extent.y; y++)
265 *magick_restrict chop_indexes,
266 *magick_restrict indexes;
274 if (status == MagickFalse)
276 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
277 q=QueueCacheViewAuthenticPixels(chop_view,0,y,chop_image->columns,1,
284 indexes=GetCacheViewAuthenticIndexQueue(image_view);
285 chop_indexes=GetCacheViewAuthenticIndexQueue(chop_view);
286 for (x=0; x < (ssize_t) image->columns; x++)
288 if ((x < extent.x) || (x >= (ssize_t) (extent.x+extent.width)))
291 if (indexes != (IndexPacket *) NULL)
293 if (chop_indexes != (IndexPacket *) NULL)
294 *chop_indexes++=GetPixelIndex(indexes+x);
300 if (SyncCacheViewAuthenticPixels(chop_view,exception) == MagickFalse)
302 if (image->progress_monitor != (MagickProgressMonitor) NULL)
307#if defined(MAGICKCORE_OPENMP_SUPPORT)
311 proceed=SetImageProgress(image,ChopImageTag,progress,image->rows);
312 if (proceed == MagickFalse)
319#if defined(MAGICKCORE_OPENMP_SUPPORT)
320 #pragma omp parallel for schedule(static) shared(status) \
321 magick_number_threads(image,image,image->rows,2)
323 for (y=0; y < (ssize_t) (image->rows-(extent.y+extent.height)); y++)
329 *magick_restrict chop_indexes,
330 *magick_restrict indexes;
338 if (status == MagickFalse)
340 p=GetCacheViewVirtualPixels(image_view,0,extent.y+extent.height+y,
341 image->columns,1,exception);
342 q=QueueCacheViewAuthenticPixels(chop_view,0,extent.y+y,chop_image->columns,
349 indexes=GetCacheViewAuthenticIndexQueue(image_view);
350 chop_indexes=GetCacheViewAuthenticIndexQueue(chop_view);
351 for (x=0; x < (ssize_t) image->columns; x++)
353 if ((x < extent.x) || (x >= (ssize_t) (extent.x+extent.width)))
356 if (indexes != (IndexPacket *) NULL)
358 if (chop_indexes != (IndexPacket *) NULL)
359 *chop_indexes++=GetPixelIndex(indexes+x);
365 if (SyncCacheViewAuthenticPixels(chop_view,exception) == MagickFalse)
367 if (image->progress_monitor != (MagickProgressMonitor) NULL)
372#if defined(MAGICKCORE_OPENMP_SUPPORT)
376 proceed=SetImageProgress(image,ChopImageTag,progress,image->rows);
377 if (proceed == MagickFalse)
381 chop_view=DestroyCacheView(chop_view);
382 image_view=DestroyCacheView(image_view);
383 chop_image->type=image->type;
384 if (status == MagickFalse)
385 chop_image=DestroyImage(chop_image);
414MagickExport
Image *ConsolidateCMYKImages(
const Image *images,
434 assert(images != (
Image *) NULL);
435 assert(images->signature == MagickCoreSignature);
437 assert(exception->signature == MagickCoreSignature);
438 if (IsEventLogging() != MagickFalse)
439 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",images->filename);
440 cmyk_images=NewImageList();
441 for (i=0; i < (ssize_t) GetImageListLength(images); i+=4)
443 cmyk_image=CloneImage(images,0,0,MagickTrue,exception);
444 if (cmyk_image == (
Image *) NULL)
446 if (SetImageStorageClass(cmyk_image,DirectClass) == MagickFalse)
448 (void) SetImageColorspace(cmyk_image,CMYKColorspace);
449 image_view=AcquireVirtualCacheView(images,exception);
450 cmyk_view=AcquireAuthenticCacheView(cmyk_image,exception);
451 for (y=0; y < (ssize_t) images->rows; y++)
462 p=GetCacheViewVirtualPixels(image_view,0,y,images->columns,1,exception);
463 q=QueueCacheViewAuthenticPixels(cmyk_view,0,y,cmyk_image->columns,1,
467 for (x=0; x < (ssize_t) images->columns; x++)
469 SetPixelRed(q,ClampToQuantum((MagickRealType) QuantumRange-
470 GetPixelIntensity(images,p)));
474 if (SyncCacheViewAuthenticPixels(cmyk_view,exception) == MagickFalse)
477 cmyk_view=DestroyCacheView(cmyk_view);
478 image_view=DestroyCacheView(image_view);
479 images=GetNextImageInList(images);
480 if (images == (
Image *) NULL)
482 image_view=AcquireVirtualCacheView(images,exception);
483 cmyk_view=AcquireAuthenticCacheView(cmyk_image,exception);
484 for (y=0; y < (ssize_t) images->rows; y++)
495 p=GetCacheViewVirtualPixels(image_view,0,y,images->columns,1,exception);
496 q=GetCacheViewAuthenticPixels(cmyk_view,0,y,cmyk_image->columns,1,
500 for (x=0; x < (ssize_t) images->columns; x++)
502 q->green=ClampToQuantum((MagickRealType) QuantumRange-(MagickRealType)
503 GetPixelIntensity(images,p));
507 if (SyncCacheViewAuthenticPixels(cmyk_view,exception) == MagickFalse)
510 cmyk_view=DestroyCacheView(cmyk_view);
511 image_view=DestroyCacheView(image_view);
512 images=GetNextImageInList(images);
513 if (images == (
Image *) NULL)
515 image_view=AcquireVirtualCacheView(images,exception);
516 cmyk_view=AcquireAuthenticCacheView(cmyk_image,exception);
517 for (y=0; y < (ssize_t) images->rows; y++)
528 p=GetCacheViewVirtualPixels(image_view,0,y,images->columns,1,exception);
529 q=GetCacheViewAuthenticPixels(cmyk_view,0,y,cmyk_image->columns,1,
533 for (x=0; x < (ssize_t) images->columns; x++)
535 q->blue=ClampToQuantum((MagickRealType) QuantumRange-(MagickRealType)
536 GetPixelIntensity(images,p));
540 if (SyncCacheViewAuthenticPixels(cmyk_view,exception) == MagickFalse)
543 cmyk_view=DestroyCacheView(cmyk_view);
544 image_view=DestroyCacheView(image_view);
545 images=GetNextImageInList(images);
546 if (images == (
Image *) NULL)
548 image_view=AcquireVirtualCacheView(images,exception);
549 cmyk_view=AcquireAuthenticCacheView(cmyk_image,exception);
550 for (y=0; y < (ssize_t) images->rows; y++)
556 *magick_restrict indexes;
564 p=GetCacheViewVirtualPixels(image_view,0,y,images->columns,1,exception);
565 q=GetCacheViewAuthenticPixels(cmyk_view,0,y,cmyk_image->columns,1,
569 indexes=GetCacheViewAuthenticIndexQueue(cmyk_view);
570 for (x=0; x < (ssize_t) images->columns; x++)
572 SetPixelIndex(indexes+x,ClampToQuantum((MagickRealType) QuantumRange-
573 GetPixelIntensity(images,p)));
576 if (SyncCacheViewAuthenticPixels(cmyk_view,exception) == MagickFalse)
579 cmyk_view=DestroyCacheView(cmyk_view);
580 image_view=DestroyCacheView(image_view);
581 AppendImageToList(&cmyk_images,cmyk_image);
582 images=GetNextImageInList(images);
583 if (images == (
Image *) NULL)
622#define CropImageTag "Crop/Image"
647 assert(image != (
const Image *) NULL);
648 assert(image->signature == MagickCoreSignature);
651 assert(exception->signature == MagickCoreSignature);
652 if (IsEventLogging() != MagickFalse)
653 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
654 bounding_box=image->page;
655 if ((bounding_box.width == 0) || (bounding_box.height == 0))
657 bounding_box.width=image->columns;
658 bounding_box.height=image->rows;
662 page.width=bounding_box.width;
663 if (page.height == 0)
664 page.height=bounding_box.height;
665 if ((((
double) bounding_box.x-page.x) >= (
double) page.width) ||
666 (((
double) bounding_box.y-page.y) >= (
double) page.height) ||
667 (((
double) page.x-bounding_box.x) > (
double) image->columns) ||
668 (((
double) page.y-bounding_box.y) > (
double) image->rows))
673 (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning,
674 "GeometryDoesNotContainImage",
"`%s'",image->filename);
675 crop_image=CloneImage(image,1,1,MagickTrue,exception);
676 if (crop_image == (
Image *) NULL)
677 return((
Image *) NULL);
678 crop_image->background_color.opacity=(Quantum) TransparentOpacity;
679 (void) SetImageBackgroundColor(crop_image);
680 crop_image->page=bounding_box;
681 crop_image->page.x=(-1);
682 crop_image->page.y=(-1);
683 if (crop_image->dispose == BackgroundDispose)
684 crop_image->dispose=NoneDispose;
687 if ((page.x < 0) && (bounding_box.x >= 0))
689 page.width=CastDoubleToUnsigned((
double) page.width+page.x-
695 page.width=CastDoubleToUnsigned((
double) page.width-(bounding_box.x-
697 page.x-=bounding_box.x;
701 if ((page.y < 0) && (bounding_box.y >= 0))
703 page.height=CastDoubleToUnsigned((
double) page.height+page.y-
709 page.height=CastDoubleToUnsigned((
double) page.height-(bounding_box.y-
711 page.y-=bounding_box.y;
715 if ((page.x+(ssize_t) page.width) > (ssize_t) image->columns)
716 page.width=image->columns-page.x;
717 if ((geometry->width != 0) && (page.width > geometry->width))
718 page.width=geometry->width;
719 if ((page.y+(ssize_t) page.height) > (ssize_t) image->rows)
720 page.height=image->rows-page.y;
721 if ((geometry->height != 0) && (page.height > geometry->height))
722 page.height=geometry->height;
723 bounding_box.x+=page.x;
724 bounding_box.y+=page.y;
725 if ((page.width == 0) || (page.height == 0))
727 (void) ThrowMagickException(exception,GetMagickModule(),OptionWarning,
728 "GeometryDoesNotContainImage",
"`%s'",image->filename);
729 return((
Image *) NULL);
734 crop_image=CloneImage(image,page.width,page.height,MagickTrue,exception);
735 if (crop_image == (
Image *) NULL)
736 return((
Image *) NULL);
737 crop_image->page.width=image->page.width;
738 crop_image->page.height=image->page.height;
739 if (((ssize_t) (bounding_box.x+bounding_box.width) > (ssize_t) image->page.width) ||
740 ((ssize_t) (bounding_box.y+bounding_box.height) > (ssize_t) image->page.height))
742 crop_image->page.width=bounding_box.width;
743 crop_image->page.height=bounding_box.height;
745 crop_image->page.x=bounding_box.x;
746 crop_image->page.y=bounding_box.y;
752 image_view=AcquireVirtualCacheView(image,exception);
753 crop_view=AcquireAuthenticCacheView(crop_image,exception);
754#if defined(MAGICKCORE_OPENMP_SUPPORT)
755 #pragma omp parallel for schedule(static) shared(status) \
756 magick_number_threads(image,crop_image,crop_image->rows,2)
758 for (y=0; y < (ssize_t) crop_image->rows; y++)
761 *magick_restrict indexes;
767 *magick_restrict crop_indexes;
772 if (status == MagickFalse)
774 p=GetCacheViewVirtualPixels(image_view,page.x,page.y+y,crop_image->columns,
776 q=QueueCacheViewAuthenticPixels(crop_view,0,y,crop_image->columns,1,
783 indexes=GetCacheViewVirtualIndexQueue(image_view);
784 crop_indexes=GetCacheViewAuthenticIndexQueue(crop_view);
785 (void) memcpy(q,p,(
size_t) crop_image->columns*
sizeof(*p));
786 if ((indexes != (IndexPacket *) NULL) &&
787 (crop_indexes != (IndexPacket *) NULL))
788 (void) memcpy(crop_indexes,indexes,(
size_t) crop_image->columns*
789 sizeof(*crop_indexes));
790 if (SyncCacheViewAuthenticPixels(crop_view,exception) == MagickFalse)
792 if (image->progress_monitor != (MagickProgressMonitor) NULL)
797#if defined(MAGICKCORE_OPENMP_SUPPORT)
801 proceed=SetImageProgress(image,CropImageTag,progress,image->rows);
802 if (proceed == MagickFalse)
806 crop_view=DestroyCacheView(crop_view);
807 image_view=DestroyCacheView(image_view);
808 crop_image->type=image->type;
809 if (status == MagickFalse)
810 crop_image=DestroyImage(crop_image);
842static inline ssize_t PixelRoundOffset(
double x)
847 if ((x-floor(x)) < (ceil(x)-x))
848 return(CastDoubleToLong(floor(x)));
849 return(CastDoubleToLong(ceil(x)));
852MagickExport
Image *CropImageToTiles(
const Image *image,
865 assert(image != (
Image *) NULL);
866 assert(image->signature == MagickCoreSignature);
867 if (IsEventLogging() != MagickFalse)
868 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
869 flags=ParseGravityGeometry(image,crop_geometry,&geometry,exception);
870 if ((flags & AreaValue) != 0)
886 crop_image=NewImageList();
887 width=image->columns;
889 if (geometry.width == 0)
891 if (geometry.height == 0)
893 if ((flags & AspectValue) == 0)
895 width-=(geometry.x < 0 ? -1 : 1)*geometry.x;
896 height-=(geometry.y < 0 ? -1 : 1)*geometry.y;
900 width+=(geometry.x < 0 ? -1 : 1)*geometry.x;
901 height+=(geometry.y < 0 ? -1 : 1)*geometry.y;
903 delta.x=(double) width/geometry.width;
904 delta.y=(double) height/geometry.height;
909 for (offset.y=0; offset.y < (
double) height; )
911 if ((flags & AspectValue) == 0)
913 crop.y=PixelRoundOffset((MagickRealType) (offset.y-
914 (geometry.y > 0 ? 0 : geometry.y)));
916 crop.height=(size_t) PixelRoundOffset((MagickRealType) (offset.y+
917 (geometry.y < 0 ? 0 : geometry.y)));
921 crop.y=PixelRoundOffset((MagickRealType) (offset.y-
922 (geometry.y > 0 ? geometry.y : 0)));
924 crop.height=(size_t) PixelRoundOffset((MagickRealType) (offset.y+
925 (geometry.y < 0 ? geometry.y : 0)));
928 crop.y+=image->page.y;
929 for (offset.x=0; offset.x < (
double) width; )
931 if ((flags & AspectValue) == 0)
933 crop.x=PixelRoundOffset((MagickRealType) (offset.x-
934 (geometry.x > 0 ? 0 : geometry.x)));
936 crop.width=(size_t) PixelRoundOffset((MagickRealType) (offset.x+
937 (geometry.x < 0 ? 0 : geometry.x)));
941 crop.x=PixelRoundOffset((MagickRealType) (offset.x-
942 (geometry.x > 0 ? geometry.x : 0)));
944 crop.width=(size_t) PixelRoundOffset((MagickRealType) (offset.x+
945 (geometry.x < 0 ? geometry.x : 0)));
948 crop.x+=image->page.x;
949 next=CropImage(image,&crop,exception);
950 if (next != (
Image *) NULL)
951 AppendImageToList(&crop_image,next);
954 ClearMagickException(exception);
957 if (((geometry.width == 0) && (geometry.height == 0)) ||
958 ((flags & XValue) != 0) || ((flags & YValue) != 0))
963 crop_image=CropImage(image,&geometry,exception);
964 if ((crop_image != (
Image *) NULL) && ((flags & AspectValue) != 0))
966 crop_image->page.width=geometry.width;
967 crop_image->page.height=geometry.height;
968 crop_image->page.x-=geometry.x;
969 crop_image->page.y-=geometry.y;
973 if ((image->columns > geometry.width) || (image->rows > geometry.height))
991 page.width=image->columns;
992 if (page.height == 0)
993 page.height=image->rows;
994 width=geometry.width;
997 height=geometry.height;
1000 crop_image=NewImageList();
1001 next=(
Image *) NULL;
1002 for (y=0; y < (ssize_t) page.height; y+=(ssize_t) height)
1004 for (x=0; x < (ssize_t) page.width; x+=(ssize_t) width)
1006 geometry.width=width;
1007 geometry.height=height;
1010 next=CropImage(image,&geometry,exception);
1011 if (next == (
Image *) NULL)
1013 AppendImageToList(&crop_image,next);
1015 if (next == (
Image *) NULL)
1020 return(CloneImage(image,0,0,MagickTrue,exception));
1051MagickExport
Image *ExcerptImage(
const Image *image,
1054#define ExcerptImageTag "Excerpt/Image"
1075 assert(image != (
const Image *) NULL);
1076 assert(image->signature == MagickCoreSignature);
1079 assert(exception->signature == MagickCoreSignature);
1080 if (IsEventLogging() != MagickFalse)
1081 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1082 excerpt_image=CloneImage(image,geometry->width,geometry->height,MagickTrue,
1084 if (excerpt_image == (
Image *) NULL)
1085 return((
Image *) NULL);
1091 image_view=AcquireVirtualCacheView(image,exception);
1092 excerpt_view=AcquireAuthenticCacheView(excerpt_image,exception);
1093#if defined(MAGICKCORE_OPENMP_SUPPORT)
1094 #pragma omp parallel for schedule(static) shared(progress,status) \
1095 magick_number_threads(image,excerpt_image,excerpt_image->rows,2)
1097 for (y=0; y < (ssize_t) excerpt_image->rows; y++)
1103 *magick_restrict excerpt_indexes,
1104 *magick_restrict indexes;
1109 if (status == MagickFalse)
1111 p=GetCacheViewVirtualPixels(image_view,geometry->x,geometry->y+y,
1112 geometry->width,1,exception);
1113 q=GetCacheViewAuthenticPixels(excerpt_view,0,y,excerpt_image->columns,1,
1120 (void) memcpy(q,p,(
size_t) excerpt_image->columns*
sizeof(*q));
1121 indexes=GetCacheViewAuthenticIndexQueue(image_view);
1122 if (indexes != (IndexPacket *) NULL)
1124 excerpt_indexes=GetCacheViewAuthenticIndexQueue(excerpt_view);
1125 if (excerpt_indexes != (IndexPacket *) NULL)
1126 (void) memcpy(excerpt_indexes,indexes,(
size_t)
1127 excerpt_image->columns*
sizeof(*excerpt_indexes));
1129 if (SyncCacheViewAuthenticPixels(excerpt_view,exception) == MagickFalse)
1131 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1136#if defined(MAGICKCORE_OPENMP_SUPPORT)
1140 proceed=SetImageProgress(image,ExcerptImageTag,progress,image->rows);
1141 if (proceed == MagickFalse)
1145 excerpt_view=DestroyCacheView(excerpt_view);
1146 image_view=DestroyCacheView(image_view);
1147 excerpt_image->type=image->type;
1148 if (status == MagickFalse)
1149 excerpt_image=DestroyImage(excerpt_image);
1150 return(excerpt_image);
1183MagickExport
Image *ExtentImage(
const Image *image,
1195 assert(image != (
const Image *) NULL);
1196 assert(image->signature == MagickCoreSignature);
1199 assert(exception->signature == MagickCoreSignature);
1200 if (IsEventLogging() != MagickFalse)
1201 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1202 extent_image=CloneImage(image,geometry->width,geometry->height,MagickTrue,
1204 if (extent_image == (
Image *) NULL)
1205 return((
Image *) NULL);
1206 (void) DeleteImageProfile(extent_image,
"8bim");
1207 status=SetImageBackgroundColor(extent_image);
1208 if (status == MagickFalse)
1210 InheritException(exception,&extent_image->exception);
1211 extent_image=DestroyImage(extent_image);
1212 return((
Image *) NULL);
1214 status=CompositeImage(extent_image,image->compose,image,-geometry->x,
1216 if (status == MagickFalse)
1218 InheritException(exception,&extent_image->exception);
1219 extent_image=DestroyImage(extent_image);
1220 return((
Image *) NULL);
1222 return(extent_image);
1252#define FlipImageTag "Flip/Image"
1273 assert(image != (
const Image *) NULL);
1274 assert(image->signature == MagickCoreSignature);
1276 assert(exception->signature == MagickCoreSignature);
1277 if (IsEventLogging() != MagickFalse)
1278 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1279 flip_image=CloneImage(image,0,0,MagickTrue,exception);
1280 if (flip_image == (
Image *) NULL)
1281 return((
Image *) NULL);
1288 image_view=AcquireVirtualCacheView(image,exception);
1289 flip_view=AcquireAuthenticCacheView(flip_image,exception);
1290#if defined(MAGICKCORE_OPENMP_SUPPORT)
1291 #pragma omp parallel for schedule(static) shared(status) \
1292 magick_number_threads(image,flip_image,flip_image->rows,2)
1294 for (y=0; y < (ssize_t) flip_image->rows; y++)
1297 *magick_restrict indexes;
1303 *magick_restrict flip_indexes;
1308 if (status == MagickFalse)
1310 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
1311 q=QueueCacheViewAuthenticPixels(flip_view,0,(ssize_t) (flip_image->rows-y-
1312 1),flip_image->columns,1,exception);
1318 (void) memcpy(q,p,(
size_t) image->columns*
sizeof(*q));
1319 indexes=GetCacheViewVirtualIndexQueue(image_view);
1320 if (indexes != (
const IndexPacket *) NULL)
1322 flip_indexes=GetCacheViewAuthenticIndexQueue(flip_view);
1323 if (flip_indexes != (IndexPacket *) NULL)
1324 (void) memcpy(flip_indexes,indexes,(
size_t) image->columns*
1325 sizeof(*flip_indexes));
1327 if (SyncCacheViewAuthenticPixels(flip_view,exception) == MagickFalse)
1329 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1334#if defined(MAGICKCORE_OPENMP_SUPPORT)
1338 proceed=SetImageProgress(image,FlipImageTag,progress,image->rows);
1339 if (proceed == MagickFalse)
1343 flip_view=DestroyCacheView(flip_view);
1344 image_view=DestroyCacheView(image_view);
1345 flip_image->type=image->type;
1346 if (page.height != 0)
1347 page.y=(ssize_t) (page.height-flip_image->rows-page.y);
1348 flip_image->page=page;
1349 if (status == MagickFalse)
1350 flip_image=DestroyImage(flip_image);
1381#define FlopImageTag "Flop/Image"
1402 assert(image != (
const Image *) NULL);
1403 assert(image->signature == MagickCoreSignature);
1405 assert(exception->signature == MagickCoreSignature);
1406 if (IsEventLogging() != MagickFalse)
1407 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1408 flop_image=CloneImage(image,0,0,MagickTrue,exception);
1409 if (flop_image == (
Image *) NULL)
1410 return((
Image *) NULL);
1417 image_view=AcquireVirtualCacheView(image,exception);
1418 flop_view=AcquireAuthenticCacheView(flop_image,exception);
1419#if defined(MAGICKCORE_OPENMP_SUPPORT)
1420 #pragma omp parallel for schedule(static) shared(status) \
1421 magick_number_threads(image,flop_image,flop_image->rows,2)
1423 for (y=0; y < (ssize_t) flop_image->rows; y++)
1426 *magick_restrict indexes;
1432 *magick_restrict flop_indexes;
1440 if (status == MagickFalse)
1442 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
1443 q=QueueCacheViewAuthenticPixels(flop_view,0,y,flop_image->columns,1,
1450 q+=(ptrdiff_t) flop_image->columns;
1451 indexes=GetCacheViewVirtualIndexQueue(image_view);
1452 flop_indexes=GetCacheViewAuthenticIndexQueue(flop_view);
1453 for (x=0; x < (ssize_t) flop_image->columns; x++)
1456 if ((indexes != (
const IndexPacket *) NULL) &&
1457 (flop_indexes != (IndexPacket *) NULL))
1458 SetPixelIndex(flop_indexes+flop_image->columns-x-1,
1459 GetPixelIndex(indexes+x));
1461 if (SyncCacheViewAuthenticPixels(flop_view,exception) == MagickFalse)
1463 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1468#if defined(MAGICKCORE_OPENMP_SUPPORT)
1472 proceed=SetImageProgress(image,FlopImageTag,progress,image->rows);
1473 if (proceed == MagickFalse)
1477 flop_view=DestroyCacheView(flop_view);
1478 image_view=DestroyCacheView(image_view);
1479 flop_image->type=image->type;
1480 if (page.width != 0)
1481 page.x=(ssize_t) (page.width-flop_image->columns-page.x);
1482 flop_image->page=page;
1483 if (status == MagickFalse)
1484 flop_image=DestroyImage(flop_image);
1518static MagickBooleanType CopyImageRegion(
Image *destination,
const Image *source,
const size_t columns,
const size_t rows,
const ssize_t sx,
const ssize_t sy,
1534 source_view=AcquireVirtualCacheView(source,exception);
1535 destination_view=AcquireAuthenticCacheView(destination,exception);
1536#if defined(MAGICKCORE_OPENMP_SUPPORT)
1537 #pragma omp parallel for schedule(static) shared(status) \
1538 magick_number_threads(source,destination,rows,2)
1540 for (y=0; y < (ssize_t) rows; y++)
1546 *magick_restrict indexes;
1552 *magick_restrict destination_indexes;
1560 if (status == MagickFalse)
1562 p=GetCacheViewVirtualPixels(source_view,sx,sy+y,columns,1,exception);
1563 q=GetCacheViewAuthenticPixels(destination_view,dx,dy+y,columns,1,exception);
1569 indexes=GetCacheViewVirtualIndexQueue(source_view);
1570 (void) memcpy(q,p,(
size_t) columns*
sizeof(*p));
1571 if (indexes != (IndexPacket *) NULL)
1573 destination_indexes=GetCacheViewAuthenticIndexQueue(destination_view);
1574 if (destination_indexes != (IndexPacket *) NULL)
1575 (void) memcpy(destination_indexes,indexes,(
size_t)
1576 columns*
sizeof(*indexes));
1578 sync=SyncCacheViewAuthenticPixels(destination_view,exception);
1579 if (sync == MagickFalse)
1582 destination_view=DestroyCacheView(destination_view);
1583 source_view=DestroyCacheView(source_view);
1587MagickExport
Image *RollImage(
const Image *image,
const ssize_t x_offset,
1590#define RollImageTag "Roll/Image"
1604 assert(image != (
const Image *) NULL);
1605 assert(image->signature == MagickCoreSignature);
1607 assert(exception->signature == MagickCoreSignature);
1608 if (IsEventLogging() != MagickFalse)
1609 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1610 roll_image=CloneImage(image,0,0,MagickTrue,exception);
1611 if (roll_image == (
Image *) NULL)
1612 return((
Image *) NULL);
1615 while (offset.x < 0)
1616 offset.x+=(ssize_t) image->columns;
1617 while (offset.x >= (ssize_t) image->columns)
1618 offset.x-=(ssize_t) image->columns;
1619 while (offset.y < 0)
1620 offset.y+=(ssize_t) image->rows;
1621 while (offset.y >= (ssize_t) image->rows)
1622 offset.y-=(ssize_t) image->rows;
1626 status=CopyImageRegion(roll_image,image,(
size_t) offset.x,
1627 (
size_t) offset.y,(ssize_t) image->columns-offset.x,(ssize_t) image->rows-
1628 offset.y,0,0,exception);
1629 (void) SetImageProgress(image,RollImageTag,0,3);
1630 status&=CopyImageRegion(roll_image,image,image->columns-offset.x,
1631 (
size_t) offset.y,0,(ssize_t) image->rows-offset.y,offset.x,0,
1633 (void) SetImageProgress(image,RollImageTag,1,3);
1634 status&=CopyImageRegion(roll_image,image,(
size_t) offset.x,image->rows-
1635 offset.y,(ssize_t) image->columns-offset.x,0,0,offset.y,exception);
1636 (void) SetImageProgress(image,RollImageTag,2,3);
1637 status&=CopyImageRegion(roll_image,image,image->columns-offset.x,image->rows-
1638 offset.y,0,0,offset.x,offset.y,exception);
1639 (void) SetImageProgress(image,RollImageTag,3,3);
1640 roll_image->type=image->type;
1641 if (status == MagickFalse)
1642 roll_image=DestroyImage(roll_image);
1680MagickExport
Image *ShaveImage(
const Image *image,
1689 assert(image != (
const Image *) NULL);
1690 assert(image->signature == MagickCoreSignature);
1691 if (IsEventLogging() != MagickFalse)
1692 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1693 if (((2*shave_info->width) >= image->columns) ||
1694 ((2*shave_info->height) >= image->rows))
1695 ThrowImageException(OptionWarning,
"GeometryDoesNotContainImage");
1696 SetGeometry(image,&geometry);
1697 geometry.width-=2*shave_info->width;
1698 geometry.height-=2*shave_info->height;
1699 geometry.x=(ssize_t) shave_info->width+image->page.x;
1700 geometry.y=(ssize_t) shave_info->height+image->page.y;
1701 shave_image=CropImage(image,&geometry,exception);
1702 if (shave_image == (
Image *) NULL)
1703 return((
Image *) NULL);
1704 shave_image->page.width-=2*shave_info->width;
1705 shave_image->page.height-=2*shave_info->height;
1706 shave_image->page.x-=(ssize_t) shave_info->width;
1707 shave_image->page.y-=(ssize_t) shave_info->height;
1708 return(shave_image);
1740MagickExport
Image *SpliceImage(
const Image *image,
1743#define SpliceImageTag "Splice/Image"
1768 assert(image != (
const Image *) NULL);
1769 assert(image->signature == MagickCoreSignature);
1772 assert(exception->signature == MagickCoreSignature);
1773 if (IsEventLogging() != MagickFalse)
1774 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
1775 splice_geometry=(*geometry);
1776 splice_image=CloneImage(image,image->columns+splice_geometry.width,
1777 image->rows+splice_geometry.height,MagickTrue,exception);
1778 if (splice_image == (
Image *) NULL)
1779 return((
Image *) NULL);
1780 if (SetImageStorageClass(splice_image,DirectClass) == MagickFalse)
1782 InheritException(exception,&splice_image->exception);
1783 splice_image=DestroyImage(splice_image);
1784 return((
Image *) NULL);
1786 (void) SetImageBackgroundColor(splice_image);
1790 switch (image->gravity)
1793 case UndefinedGravity:
1794 case NorthWestGravity:
1798 splice_geometry.x+=(ssize_t) splice_geometry.width/2;
1801 case NorthEastGravity:
1803 splice_geometry.x+=(ssize_t) splice_geometry.width;
1808 splice_geometry.y+=(ssize_t) splice_geometry.width/2;
1814 splice_geometry.x+=(ssize_t) splice_geometry.width/2;
1815 splice_geometry.y+=(ssize_t) splice_geometry.height/2;
1820 splice_geometry.x+=(ssize_t) splice_geometry.width;
1821 splice_geometry.y+=(ssize_t) splice_geometry.height/2;
1824 case SouthWestGravity:
1826 splice_geometry.y+=(ssize_t) splice_geometry.height;
1831 splice_geometry.x+=(ssize_t) splice_geometry.width/2;
1832 splice_geometry.y+=(ssize_t) splice_geometry.height;
1835 case SouthEastGravity:
1837 splice_geometry.x+=(ssize_t) splice_geometry.width;
1838 splice_geometry.y+=(ssize_t) splice_geometry.height;
1847 columns=MagickMin(splice_geometry.x,(ssize_t) splice_image->columns);
1848 image_view=AcquireVirtualCacheView(image,exception);
1849 splice_view=AcquireAuthenticCacheView(splice_image,exception);
1850#if defined(MAGICKCORE_OPENMP_SUPPORT)
1851 #pragma omp parallel for schedule(static) shared(progress,status) \
1852 magick_number_threads(image,splice_image,splice_geometry.y,2)
1854 for (y=0; y < (ssize_t) splice_geometry.y; y++)
1860 *magick_restrict indexes,
1861 *magick_restrict splice_indexes;
1869 if (status == MagickFalse)
1871 p=GetCacheViewVirtualPixels(image_view,0,y,splice_image->columns,1,
1873 q=QueueCacheViewAuthenticPixels(splice_view,0,y,splice_image->columns,1,
1880 indexes=GetCacheViewAuthenticIndexQueue(image_view);
1881 splice_indexes=GetCacheViewAuthenticIndexQueue(splice_view);
1882 for (x=0; x < columns; x++)
1884 SetPixelRed(q,GetPixelRed(p));
1885 SetPixelGreen(q,GetPixelGreen(p));
1886 SetPixelBlue(q,GetPixelBlue(p));
1887 SetPixelOpacity(q,OpaqueOpacity);
1888 if (image->matte != MagickFalse)
1889 SetPixelOpacity(q,GetPixelOpacity(p));
1890 if (image->colorspace == CMYKColorspace)
1891 SetPixelIndex(splice_indexes+x,GetPixelIndex(indexes));
1896 for ( ; x < (ssize_t) (splice_geometry.x+splice_geometry.width); x++)
1898 for ( ; x < (ssize_t) splice_image->columns; x++)
1900 SetPixelRed(q,GetPixelRed(p));
1901 SetPixelGreen(q,GetPixelGreen(p));
1902 SetPixelBlue(q,GetPixelBlue(p));
1903 SetPixelOpacity(q,OpaqueOpacity);
1904 if (image->matte != MagickFalse)
1905 SetPixelOpacity(q,GetPixelOpacity(p));
1906 if (image->colorspace == CMYKColorspace)
1907 SetPixelIndex(splice_indexes+x,GetPixelIndex(indexes));
1912 if (SyncCacheViewAuthenticPixels(splice_view,exception) == MagickFalse)
1914 if (image->progress_monitor != (MagickProgressMonitor) NULL)
1919#if defined(MAGICKCORE_OPENMP_SUPPORT)
1923 proceed=SetImageProgress(image,SpliceImageTag,progress,
1924 splice_image->rows);
1925 if (proceed == MagickFalse)
1929#if defined(MAGICKCORE_OPENMP_SUPPORT)
1930 #pragma omp parallel for schedule(static) shared(progress,status) \
1931 magick_number_threads(image,splice_image,splice_image->rows,2)
1933 for (y=(ssize_t) (splice_geometry.y+splice_geometry.height);
1934 y < (ssize_t) splice_image->rows; y++)
1940 *magick_restrict indexes,
1941 *magick_restrict splice_indexes;
1949 if (status == MagickFalse)
1951 if ((y < 0) || (y >= (ssize_t)splice_image->rows))
1953 p=GetCacheViewVirtualPixels(image_view,0,y-(ssize_t) splice_geometry.height,
1954 splice_image->columns,1,exception);
1955 q=QueueCacheViewAuthenticPixels(splice_view,0,y,splice_image->columns,1,
1962 indexes=GetCacheViewAuthenticIndexQueue(image_view);
1963 splice_indexes=GetCacheViewAuthenticIndexQueue(splice_view);
1964 for (x=0; x < columns; x++)
1966 SetPixelRed(q,GetPixelRed(p));
1967 SetPixelGreen(q,GetPixelGreen(p));
1968 SetPixelBlue(q,GetPixelBlue(p));
1969 SetPixelOpacity(q,OpaqueOpacity);
1970 if (image->matte != MagickFalse)
1971 SetPixelOpacity(q,GetPixelOpacity(p));
1972 if (image->colorspace == CMYKColorspace)
1973 SetPixelIndex(splice_indexes+x,GetPixelIndex(indexes));
1978 for ( ; x < (ssize_t) (splice_geometry.x+splice_geometry.width); x++)
1980 for ( ; x < (ssize_t) splice_image->columns; x++)
1982 SetPixelRed(q,GetPixelRed(p));
1983 SetPixelGreen(q,GetPixelGreen(p));
1984 SetPixelBlue(q,GetPixelBlue(p));
1985 SetPixelOpacity(q,OpaqueOpacity);
1986 if (image->matte != MagickFalse)
1987 SetPixelOpacity(q,GetPixelOpacity(p));
1988 if (image->colorspace == CMYKColorspace)
1989 SetPixelIndex(splice_indexes+x,GetPixelIndex(indexes));
1994 if (SyncCacheViewAuthenticPixels(splice_view,exception) == MagickFalse)
1996 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2001#if defined(MAGICKCORE_OPENMP_SUPPORT)
2005 proceed=SetImageProgress(image,SpliceImageTag,progress,
2006 splice_image->rows);
2007 if (proceed == MagickFalse)
2011 splice_view=DestroyCacheView(splice_view);
2012 image_view=DestroyCacheView(image_view);
2013 if (status == MagickFalse)
2014 splice_image=DestroyImage(splice_image);
2015 return(splice_image);
2065MagickExport MagickBooleanType TransformImage(
Image **image,
2066 const char *crop_geometry,
const char *image_geometry)
2078 assert(image != (
Image **) NULL);
2079 assert((*image)->signature == MagickCoreSignature);
2080 if (IsEventLogging() != MagickFalse)
2081 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",(*image)->filename);
2082 transform_image=(*image);
2083 if (crop_geometry != (
const char *) NULL)
2091 crop_image=CropImageToTiles(*image,crop_geometry,&(*image)->exception);
2092 if (crop_image == (
Image *) NULL)
2093 transform_image=CloneImage(*image,0,0,MagickTrue,&(*image)->exception);
2096 transform_image=DestroyImage(transform_image);
2097 transform_image=GetFirstImageInList(crop_image);
2099 *image=transform_image;
2101 if (image_geometry == (
const char *) NULL)
2107 flags=ParseRegionGeometry(transform_image,image_geometry,&geometry,
2108 &(*image)->exception);
2110 if ((transform_image->columns == geometry.width) &&
2111 (transform_image->rows == geometry.height))
2113 resize_image=ResizeImage(transform_image,geometry.width,geometry.height,
2114 transform_image->filter,transform_image->blur,&(*image)->exception);
2115 if (resize_image == (
Image *) NULL)
2116 return(MagickFalse);
2117 transform_image=DestroyImage(transform_image);
2118 transform_image=resize_image;
2119 *image=transform_image;
2152MagickExport MagickBooleanType TransformImages(
Image **images,
2153 const char *crop_geometry,
const char *image_geometry)
2166 assert(images != (
Image **) NULL);
2167 assert((*images)->signature == MagickCoreSignature);
2168 if (IsEventLogging() != MagickFalse)
2169 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",
2170 (*images)->filename);
2171 image_list=ImageListToArray(*images,&(*images)->exception);
2172 if (image_list == (
Image **) NULL)
2173 return(MagickFalse);
2175 transform_images=NewImageList();
2176 for (i=0; image_list[i] != (
Image *) NULL; i++)
2178 image=image_list[i];
2179 status&=TransformImage(&image,crop_geometry,image_geometry);
2180 AppendImageToList(&transform_images,image);
2182 *images=transform_images;
2183 image_list=(
Image **) RelinquishMagickMemory(image_list);
2184 return(status != 0 ? MagickTrue : MagickFalse);
2214#define TransposeImageTag "Transpose/Image"
2235 assert(image != (
const Image *) NULL);
2236 assert(image->signature == MagickCoreSignature);
2237 if (IsEventLogging() != MagickFalse)
2238 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2240 assert(exception->signature == MagickCoreSignature);
2241 transpose_image=CloneImage(image,image->rows,image->columns,MagickTrue,
2243 if (transpose_image == (
Image *) NULL)
2244 return((
Image *) NULL);
2250 image_view=AcquireVirtualCacheView(image,exception);
2251 transpose_view=AcquireAuthenticCacheView(transpose_image,exception);
2252#if defined(MAGICKCORE_OPENMP_SUPPORT)
2253 #pragma omp parallel for schedule(static) shared(progress,status) \
2254 magick_number_threads(image,transpose_image,image->rows,2)
2256 for (y=0; y < (ssize_t) image->rows; y++)
2262 *magick_restrict transpose_indexes,
2263 *magick_restrict indexes;
2268 if (status == MagickFalse)
2270 p=GetCacheViewVirtualPixels(image_view,0,(ssize_t) image->rows-y-1,
2271 image->columns,1,exception);
2272 q=QueueCacheViewAuthenticPixels(transpose_view,(ssize_t) (image->rows-y-1),
2273 0,1,transpose_image->rows,exception);
2279 (void) memcpy(q,p,(
size_t) image->columns*
sizeof(*q));
2280 indexes=GetCacheViewAuthenticIndexQueue(image_view);
2281 if (indexes != (IndexPacket *) NULL)
2283 transpose_indexes=GetCacheViewAuthenticIndexQueue(transpose_view);
2284 if (transpose_indexes != (IndexPacket *) NULL)
2285 (void) memcpy(transpose_indexes,indexes,(
size_t)
2286 image->columns*
sizeof(*transpose_indexes));
2288 if (SyncCacheViewAuthenticPixels(transpose_view,exception) == MagickFalse)
2290 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2295#if defined(MAGICKCORE_OPENMP_SUPPORT)
2299 proceed=SetImageProgress(image,TransposeImageTag,progress,
2301 if (proceed == MagickFalse)
2305 transpose_view=DestroyCacheView(transpose_view);
2306 image_view=DestroyCacheView(image_view);
2307 transpose_image->type=image->type;
2308 page=transpose_image->page;
2309 Swap(page.width,page.height);
2310 Swap(page.x,page.y);
2311 transpose_image->page=page;
2312 if (status == MagickFalse)
2313 transpose_image=DestroyImage(transpose_image);
2314 return(transpose_image);
2344#define TransverseImageTag "Transverse/Image"
2365 assert(image != (
const Image *) NULL);
2366 assert(image->signature == MagickCoreSignature);
2367 if (IsEventLogging() != MagickFalse)
2368 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2370 assert(exception->signature == MagickCoreSignature);
2371 transverse_image=CloneImage(image,image->rows,image->columns,MagickTrue,
2373 if (transverse_image == (
Image *) NULL)
2374 return((
Image *) NULL);
2380 image_view=AcquireVirtualCacheView(image,exception);
2381 transverse_view=AcquireAuthenticCacheView(transverse_image,exception);
2382#if defined(MAGICKCORE_OPENMP_SUPPORT)
2383 #pragma omp parallel for schedule(static) shared(progress,status) \
2384 magick_number_threads(image,transverse_image,image->rows,2)
2386 for (y=0; y < (ssize_t) image->rows; y++)
2395 *magick_restrict transverse_indexes,
2396 *magick_restrict indexes;
2404 if (status == MagickFalse)
2406 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
2407 q=QueueCacheViewAuthenticPixels(transverse_view,(ssize_t) (image->rows-y-
2408 1),0,1,transverse_image->rows,exception);
2414 q+=(ptrdiff_t) image->columns;
2415 for (x=0; x < (ssize_t) image->columns; x++)
2417 indexes=GetCacheViewAuthenticIndexQueue(image_view);
2418 if (indexes != (IndexPacket *) NULL)
2420 transverse_indexes=GetCacheViewAuthenticIndexQueue(transverse_view);
2421 if (transverse_indexes != (IndexPacket *) NULL)
2422 for (x=0; x < (ssize_t) image->columns; x++)
2423 SetPixelIndex(transverse_indexes+image->columns-x-1,
2424 GetPixelIndex(indexes+x));
2426 sync=SyncCacheViewAuthenticPixels(transverse_view,exception);
2427 if (sync == MagickFalse)
2429 if (image->progress_monitor != (MagickProgressMonitor) NULL)
2434#if defined(MAGICKCORE_OPENMP_SUPPORT)
2438 proceed=SetImageProgress(image,TransverseImageTag,progress,image->rows);
2439 if (proceed == MagickFalse)
2443 transverse_view=DestroyCacheView(transverse_view);
2444 image_view=DestroyCacheView(image_view);
2445 transverse_image->type=image->type;
2446 page=transverse_image->page;
2447 Swap(page.width,page.height);
2448 Swap(page.x,page.y);
2449 if (page.width != 0)
2450 page.x=(ssize_t) (page.width-transverse_image->columns-page.x);
2451 if (page.height != 0)
2452 page.y=(ssize_t) (page.height-transverse_image->rows-page.y);
2453 transverse_image->page=page;
2454 if (status == MagickFalse)
2455 transverse_image=DestroyImage(transverse_image);
2456 return(transverse_image);
2490 assert(image != (
const Image *) NULL);
2491 assert(image->signature == MagickCoreSignature);
2492 if (IsEventLogging() != MagickFalse)
2493 (void) LogMagickEvent(TraceEvent,GetMagickModule(),
"%s",image->filename);
2494 geometry=GetImageBoundingBox(image,exception);
2495 if ((geometry.width == 0) || (geometry.height == 0))
2500 crop_image=CloneImage(image,1,1,MagickTrue,exception);
2501 if (crop_image == (
Image *) NULL)
2502 return((
Image *) NULL);
2503 crop_image->background_color.opacity=(Quantum) TransparentOpacity;
2504 (void) SetImageBackgroundColor(crop_image);
2505 crop_image->page=image->page;
2506 crop_image->page.x=(-1);
2507 crop_image->page.y=(-1);
2510 geometry.x+=image->page.x;
2511 geometry.y+=image->page.y;
2512 return(CropImage(image,&geometry,exception));