ExceptionInfo exceptionInfo;
GetExceptionInfo( &exceptionInfo );
CompositeImage( image(),
- compose_,
compositeImage_.constImage(),
+ compose_, MagickFalse,
xOffset_,
yOffset_, &exceptionInfo );
throwException( exceptionInfo );
ExceptionInfo exceptionInfo;
GetExceptionInfo( &exceptionInfo );
CompositeImage( image(),
- compose_,
compositeImage_.constImage(),
+ compose_, MagickFalse,
x, y, &exceptionInfo );
throwException( exceptionInfo );
(void) DestroyExceptionInfo( &exceptionInfo );
ExceptionInfo exceptionInfo;
GetExceptionInfo( &exceptionInfo );
CompositeImage( image(),
- compose_,
compositeImage_.constImage(),
+ compose_, MagickFalse,
geometry.x, geometry.y, &exceptionInfo );
throwException( exceptionInfo );
(void) DestroyExceptionInfo( &exceptionInfo );
ChannelType channel_mask = SetPixelChannelMask( image(), channel_);
EvaluateImage( crop_image, operator_, rvalue_, &exceptionInfo );
(void) SetPixelChannelMapMask( image(), channel_mask );
- (void) CompositeImage( image(), image()->matte != MagickFalse ?
- OverCompositeOp : CopyCompositeOp, crop_image, geometry.x, geometry.y,
+ (void) CompositeImage( image(), crop_image, image()->matte != MagickFalse ?
+ OverCompositeOp : CopyCompositeOp, MagickFalse, geometry.x, geometry.y,
&exceptionInfo );
crop_image = DestroyImageList(crop_image);
throwException( exceptionInfo );
break;
}
annotate_view=DestroyCacheView(annotate_view);
- (void) CompositeImage(image,OverCompositeOp,annotate_image,
+ (void) CompositeImage(image,annotate_image,OverCompositeOp,MagickFalse,
(ssize_t) ceil(offset->x-0.5),(ssize_t) ceil(offset->y-(metrics->ascent+
metrics->descent)-0.5),exception);
}
highlight_view=DestroyCacheView(highlight_view);
reconstruct_view=DestroyCacheView(reconstruct_view);
image_view=DestroyCacheView(image_view);
- (void) CompositeImage(difference_image,image->compose,highlight_image,0,0,
- exception);
+ (void) CompositeImage(difference_image,highlight_image,image->compose,
+ MagickFalse,0,0,exception);
highlight_image=DestroyImage(highlight_image);
if (status == MagickFalse)
difference_image=DestroyImage(difference_image);
% The format of the CompositeImage method is:
%
% MagickBooleanType CompositeImage(Image *image,
-% const CompositeOperator compose,Image *composite_image,
-% const ssize_t x_offset,const ssize_t y_offset,ExceptionInfo *exception)
+% const Image *composite_image,const CompositeOperator compose,
+% const MagickBooleanType clip_to_self,const ssize_t x_offset,
+% const ssize_t y_offset,ExceptionInfo *exception)
%
% A description of each parameter follows:
%
% o image: the destination image, modified by he composition
%
+% o composite_image: the composite (source) image.
+%
% o compose: This operator affects how the composite is applied to
% the image. The operators and how they are utilized are listed here
% http://www.w3.org/TR/SVG12/#compositing.
%
-% o composite_image: the composite (source) image.
+% o clip_to_self: set to MagickTrue to limit composition to area composed.
%
% o x_offset: the column offset of the composited image.
%
}
static MagickBooleanType CompositeOverImage(Image *image,
- const Image *composite_image,const ssize_t x_offset,const ssize_t y_offset,
- ExceptionInfo *exception)
+ const Image *composite_image,const MagickBooleanType clip_to_self,
+ const ssize_t x_offset,const ssize_t y_offset,ExceptionInfo *exception)
{
#define CompositeImageTag "Composite/Image"
*composite_view,
*image_view;
- const char
- *value;
-
MagickBooleanType
- clip_to_self,
status;
MagickOffsetType
ssize_t
y;
- /*
- Prepare composite image.
- */
- clip_to_self=MagickTrue;
- value=GetImageArtifact(composite_image,"compose:outside-overlay");
- if (value != (const char *) NULL)
- clip_to_self=IsMagickTrue(value) == MagickFalse ? MagickTrue : MagickFalse;
/*
Composite image.
*/
if (status == MagickFalse)
continue;
- if (clip_to_self == MagickTrue)
+ if (clip_to_self != MagickFalse)
{
if (y < y_offset)
continue;
register ssize_t
i;
- if (clip_to_self == MagickTrue)
+ if (clip_to_self != MagickFalse)
{
if (x < x_offset)
{
}
MagickExport MagickBooleanType CompositeImage(Image *image,
- const CompositeOperator compose,const Image *composite_image,
- const ssize_t x_offset,const ssize_t y_offset,ExceptionInfo *exception)
+ const Image *composite_image,const CompositeOperator compose,
+ const MagickBooleanType clip_to_self,const ssize_t x_offset,const ssize_t y_offset,ExceptionInfo *exception)
{
#define CompositeImageTag "Composite/Image"
*composite_view,
*image_view;
- const char
- *value;
-
GeometryInfo
geometry_info;
*destination_image;
MagickBooleanType
- clip_to_self,
status;
MagickOffsetType
return(MagickFalse);
if ((compose == OverCompositeOp) || (compose == SrcOverCompositeOp))
{
- status=CompositeOverImage(image,composite_image,x_offset,y_offset,
- exception);
+ status=CompositeOverImage(image,composite_image,clip_to_self,x_offset,
+ y_offset,exception);
return(status);
}
destination_image=(Image *) NULL;
amount=0.5;
destination_dissolve=1.0;
- clip_to_self=MagickFalse;
percent_brightness=100.0;
percent_saturation=100.0;
source_dissolve=1.0;
threshold=0.05f;
switch (compose)
{
- case ClearCompositeOp:
- case DstAtopCompositeOp:
- case DstInCompositeOp:
- case InCompositeOp:
- case OutCompositeOp:
- case SrcCompositeOp:
- case SrcInCompositeOp:
- case SrcOutCompositeOp:
- {
- /*
- Modify destination outside the overlaid region.
- */
- clip_to_self=MagickTrue;
- break;
- }
case CopyCompositeOp:
{
if ((x_offset < 0) || (y_offset < 0))
*/
if (image->matte == MagickFalse)
(void) SetImageAlphaChannel(image,OpaqueAlphaChannel,exception);
- clip_to_self=MagickTrue;
break;
}
case BlurCompositeOp:
*composite_view,
*destination_view;
+ const char
+ *value;
+
PixelInfo
pixel;
*destination_view,
*image_view;
+ const char
+ *value;
+
PixelInfo
pixel;
}
case DissolveCompositeOp:
{
+ const char
+ *value;
+
/*
Geometry arguments to dissolve factors.
*/
destination_dissolve=geometry_info.sigma/100.0;
if ((destination_dissolve-MagickEpsilon) < 0.0)
destination_dissolve=0.0;
- clip_to_self=MagickTrue;
- if ((destination_dissolve+MagickEpsilon) > 1.0 )
- {
- destination_dissolve=1.0;
- clip_to_self=MagickFalse;
- }
}
break;
}
case BlendCompositeOp:
{
+ const char
+ *value;
+
value=GetImageArtifact(composite_image,"compose:args");
if (value != (char *) NULL)
{
destination_dissolve=1.0-source_dissolve;
if ((flags & SigmaValue) != 0)
destination_dissolve=geometry_info.sigma/100.0;
- clip_to_self=MagickTrue;
- if ((destination_dissolve+MagickEpsilon) > 1.0)
- clip_to_self=MagickFalse;
}
break;
}
case MathematicsCompositeOp:
{
+ const char
+ *value;
+
/*
Just collect the values from "compose:args", setting.
Unused values are set to zero automagically.
}
case ModulateCompositeOp:
{
+ const char
+ *value;
+
/*
Determine the brightness and saturation scale.
*/
}
case ThresholdCompositeOp:
{
+ const char
+ *value;
+
/*
Determine the amount and threshold.
*/
default:
break;
}
- value=GetImageArtifact(composite_image,"compose:outside-overlay");
- if (value != (const char *) NULL)
- clip_to_self=IsMagickTrue(value);
/*
Composite image.
*/
if (status == MagickFalse)
continue;
- if (clip_to_self == MagickFalse)
+ if (clip_to_self != MagickFalse)
{
if (y < y_offset)
continue;
size_t
channels;
- if (clip_to_self == MagickFalse)
+ if (clip_to_self != MagickFalse)
{
if (x < x_offset)
{
MagickBooleanType
thread_status;
- thread_status=CompositeImage(image,image->compose,texture_image,x+
- texture_image->tile_offset.x,y+texture_image->tile_offset.y,
- exception);
+ thread_status=CompositeImage(image,texture_image,image->compose,
+ MagickFalse,x+texture_image->tile_offset.x,y+
+ texture_image->tile_offset.y,exception);
if (thread_status == MagickFalse)
{
status=thread_status;
} CompositeOperator;
extern MagickExport MagickBooleanType
- CompositeImage(Image *,const CompositeOperator,const Image *,const ssize_t,
- const ssize_t,ExceptionInfo *),
+ CompositeImage(Image *,const Image *,const CompositeOperator,
+ const MagickBooleanType,const ssize_t,const ssize_t,ExceptionInfo *),
TextureImage(Image *,const Image *,ExceptionInfo *);
#if defined(__cplusplus) || defined(c_plusplus)
frame_info->inner_bevel);
y=(ssize_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
frame_info->inner_bevel);
- (void) CompositeImage(frame_image,compose,image,x,y,exception);
+ (void) CompositeImage(frame_image,image,compose,MagickFalse,x,y,
+ exception);
}
return(frame_image);
}
/*
Composite image with X Image window.
*/
- (void) CompositeImage(image,compose,composite_image,composite_info.x,
- composite_info.y,exception);
+ (void) CompositeImage(image,composite_image,compose,MagickFalse,
+ composite_info.x,composite_info.y,exception);
composite_image=DestroyImage(composite_image);
XSetCursorState(display,windows,MagickFalse);
/*
/*
Paste image with X Image window.
*/
- (void) CompositeImage(image,compose,paste_image,paste_info.x,paste_info.y,
- exception);
+ (void) CompositeImage(image,paste_image,compose,MagickFalse,paste_info.x,
+ paste_info.y,exception);
paste_image=DestroyImage(paste_image);
XSetCursorState(display,windows,MagickFalse);
/*
(void) XMagickCommand(display,resource_info,windows,
SaveToUndoBufferCommand,image,exception);
windows->image.orphan=MagickFalse;
- (void) CompositeImage(*image,CopyCompositeOp,roi_image,
- crop_info.x,crop_info.y,exception);
+ (void) CompositeImage(*image,roi_image,CopyCompositeOp,
+ MagickFalse,crop_info.x,crop_info.y,exception);
roi_image=DestroyImage(roi_image);
(void) SetImageProgressMonitor(*image,progress_monitor,
(*image)->client_data);
exception);
(void) SetImageAlphaChannel(resize_alpha,DeactivateAlphaChannel,
exception);
- (void) CompositeImage(resize_image,CopyAlphaCompositeOp,resize_alpha,
- 0,0,exception);
+ (void) CompositeImage(resize_image,resize_alpha,CopyAlphaCompositeOp,
+ MagickFalse,0,0,exception);
resize_alpha=DestroyImage(resize_alpha);
}
(void) SetImageVirtualPixelMethod(resize_image,vp_save,exception);
if (draw_info->compose == OverCompositeOp)
(void) DrawAffineImage(image,composite_image,&affine,exception);
else
- (void) CompositeImage(image,draw_info->compose,composite_image,
- geometry.x,geometry.y,exception);
+ (void) CompositeImage(image,composite_image,draw_info->compose,
+ MagickFalse,geometry.x,geometry.y,exception);
composite_image=DestroyImage(composite_image);
break;
}
}
picture_image->background_color=image->border_color;
(void) SetImageBackgroundColor(picture_image,exception);
- (void) CompositeImage(picture_image,OverCompositeOp,image,quantum,quantum,
- exception);
+ (void) CompositeImage(picture_image,image,OverCompositeOp,MagickFalse,quantum,
+ quantum,exception);
if (caption_image != (Image *) NULL)
{
- (void) CompositeImage(picture_image,OverCompositeOp,caption_image,quantum,
- (ssize_t) (image->rows+3*quantum/2),exception);
+ (void) CompositeImage(picture_image,caption_image,OverCompositeOp,
+ MagickFalse,quantum,(ssize_t) (image->rows+3*quantum/2),exception);
caption_image=DestroyImage(caption_image);
}
(void) QueryColorCompliance("none",AllCompliance,
return(picture_image);
}
polaroid_image=flop_image;
- (void) CompositeImage(polaroid_image,OverCompositeOp,picture_image,(ssize_t)
- (-0.01*picture_image->columns/2.0),0L,exception);
+ (void) CompositeImage(polaroid_image,picture_image,OverCompositeOp,
+ MagickFalse,(ssize_t) (-0.01*picture_image->columns/2.0),0L,exception);
picture_image=DestroyImage(picture_image);
(void) QueryColorCompliance("none",AllCompliance,
&polaroid_image->background_color,exception);
dodge_image=DestroyImage(dodge_image);
return((Image *) NULL);
}
- (void) CompositeImage(sketch_image,ColorDodgeCompositeOp,dodge_image,0,0,
- exception);
+ (void) CompositeImage(sketch_image,dodge_image,ColorDodgeCompositeOp,
+ MagickFalse,0,0,exception);
dodge_image=DestroyImage(dodge_image);
blend_image=CloneImage(image,0,0,MagickTrue,exception);
if (blend_image == (Image *) NULL)
return((Image *) NULL);
}
(void) SetImageArtifact(blend_image,"compose:args","20x80");
- (void) CompositeImage(sketch_image,BlendCompositeOp,blend_image,0,0,
- exception);
+ (void) CompositeImage(sketch_image,blend_image,BlendCompositeOp,MagickFalse,
+ 0,0,exception);
blend_image=DestroyImage(blend_image);
return(sketch_image);
}
return((Image *) NULL);
}
blur_image->matte=MagickFalse;
- (void) CompositeImage(canvas_image,IntensityCompositeOp,blur_image,0,0,
- exception);
+ (void) CompositeImage(canvas_image,blur_image,IntensityCompositeOp,
+ MagickFalse,0,0,exception);
blur_image=DestroyImage(blur_image);
vignette_image=MergeImageLayers(canvas_image,FlattenLayer,exception);
canvas_image=DestroyImage(canvas_image);
/*
Copy pixel intensity to the alpha channel.
*/
- status=CompositeImage(image,IntensityCompositeOp,image,0,0,exception);
+ status=CompositeImage(image,image,IntensityCompositeOp,MagickFalse,0,0,
+ exception);
if (alpha_type == ShapeAlphaChannel)
(void) LevelImageColors(image,&image->background_color,
&image->background_color,MagickTrue,exception);
}
case ExtractAlphaChannel:
{
- status=CompositeImage(image,AlphaCompositeOp,image,0,0,exception);
+ status=CompositeImage(image,image,AlphaCompositeOp,MagickFalse,0,0,
+ exception);
image->matte=MagickFalse;
break;
}
x_offset-=SmushXGap(smush_image,image,offset,exception);
y_offset-=geometry.y;
}
- status=CompositeImage(smush_image,OverCompositeOp,image,x_offset,y_offset,
- exception);
+ status=CompositeImage(smush_image,image,OverCompositeOp,MagickFalse,
+ x_offset,y_offset,exception);
proceed=SetImageProgress(image,SmushImageTag,n,number_images);
if (proceed == MagickFalse)
break;
Coalesce rest of the images.
*/
dispose_image=CloneImage(coalesce_image,0,0,MagickTrue,exception);
- (void) CompositeImage(coalesce_image,CopyCompositeOp,next,next->page.x,
- next->page.y,exception);
+ (void) CompositeImage(coalesce_image,next,CopyCompositeOp,MagickFalse,
+ next->page.x,next->page.y,exception);
next=GetNextImageInList(next);
for ( ; next != (Image *) NULL; next=GetNextImageInList(next))
{
coalesce_image->next->previous=coalesce_image;
previous=coalesce_image;
coalesce_image=GetNextImageInList(coalesce_image);
- (void) CompositeImage(coalesce_image,next->matte != MagickFalse ?
- OverCompositeOp : CopyCompositeOp,next,next->page.x,next->page.y,
+ (void) CompositeImage(coalesce_image,next,next->matte != MagickFalse ?
+ OverCompositeOp : CopyCompositeOp,MagickFalse,next->page.x,next->page.y,
exception);
(void) CloneImageProfiles(coalesce_image,next);
(void) CloneImageProperties(coalesce_image,next);
%
% A description of each parameter follows:
%
-% o image: the image sequence.
+% o images: the image sequence.
%
% o exception: return any errors or warnings in this structure.
%
*/
-MagickExport Image *DisposeImages(const Image *image,ExceptionInfo *exception)
+MagickExport Image *DisposeImages(const Image *images,ExceptionInfo *exception)
{
Image
*dispose_image,
*dispose_images;
register Image
- *curr;
+ *image,
+ *next;
RectangleInfo
bounds;
/*
Run the image through the animation sequence
*/
- assert(image != (Image *) NULL);
- assert(image->signature == MagickSignature);
- if (image->debug != MagickFalse)
- (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
+ assert(images != (Image *) NULL);
+ assert(images->signature == MagickSignature);
+ if (images->debug != MagickFalse)
+ (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",images->filename);
assert(exception != (ExceptionInfo *) NULL);
assert(exception->signature == MagickSignature);
- curr=GetFirstImageInList(image);
- dispose_image=CloneImage(curr,curr->page.width,curr->page.height,MagickTrue,
- exception);
+ image=GetFirstImageInList(images);
+ dispose_image=CloneImage(image,image->page.width,image->page.height,
+ MagickTrue,exception);
if (dispose_image == (Image *) NULL)
return((Image *) NULL);
- dispose_image->page=curr->page;
+ dispose_image->page=image->page;
dispose_image->page.x=0;
dispose_image->page.y=0;
dispose_image->dispose=NoneDispose;
dispose_image->background_color.alpha=(Quantum) TransparentAlpha;
(void) SetImageBackgroundColor(dispose_image,exception);
dispose_images=NewImageList();
- for ( ; curr != (Image *) NULL; curr=GetNextImageInList(curr))
+ for (next=image; image != (Image *) NULL; image=GetNextImageInList(image))
{
Image
*current_image;
dispose_image=DestroyImage(dispose_image);
return((Image *) NULL);
}
- (void) CompositeImage(current_image,curr->matte != MagickFalse ?
- OverCompositeOp : CopyCompositeOp,curr,curr->page.x,curr->page.y,
+ (void) CompositeImage(current_image,next,next->matte != MagickFalse ?
+ OverCompositeOp : CopyCompositeOp,MagickFalse,next->page.x,next->page.y,
exception);
/*
Handle Background dispose: image is displayed for the delay period.
*/
- if (curr->dispose == BackgroundDispose)
+ if (next->dispose == BackgroundDispose)
{
- bounds=curr->page;
- bounds.width=curr->columns;
- bounds.height=curr->rows;
+ bounds=next->page;
+ bounds.width=next->columns;
+ bounds.height=next->rows;
if (bounds.x < 0)
{
bounds.width+=bounds.x;
/*
Select the appropriate previous/disposed image.
*/
- if (curr->dispose == PreviousDispose)
+ if (next->dispose == PreviousDispose)
current_image=DestroyImage(current_image);
else
{
dispose_image=DestroyImage(dispose_image);
return((Image *) NULL);
}
- (void) CloneImageProfiles(dispose,curr);
- (void) CloneImageProperties(dispose,curr);
- (void) CloneImageArtifacts(dispose,curr);
+ (void) CloneImageProfiles(dispose,next);
+ (void) CloneImageProperties(dispose,next);
+ (void) CloneImageArtifacts(dispose,next);
dispose->page.x=0;
dispose->page.y=0;
- dispose->dispose=curr->dispose;
+ dispose->dispose=next->dispose;
AppendImageToList(&dispose_images,dispose);
}
}
image_a->page=next->page;
image_a->page.x=0;
image_a->page.y=0;
- (void) CompositeImage(image_a,CopyCompositeOp,next,next->page.x,next->page.y,
- exception);
+ (void) CompositeImage(image_a,next,CopyCompositeOp,MagickFalse,next->page.x,
+ next->page.y,exception);
/*
Compute the bounding box of changes for the later images
*/
bounds=(RectangleInfo *) RelinquishMagickMemory(bounds);
return((Image *) NULL);
}
- (void) CompositeImage(image_a,CopyCompositeOp,next,next->page.x,
+ (void) CompositeImage(image_a,next,CopyCompositeOp,MagickFalse,next->page.x,
next->page.y,exception);
bounds[i]=CompareImagesBounds(image_b,image_a,method,exception);
dispose_image=DestroyImage(dispose_image);
return;
}
- (void) CompositeImage(current_image,next->matte != MagickFalse ?
- OverCompositeOp : CopyCompositeOp, next,next->page.x,next->page.y,
+ (void) CompositeImage(current_image,next,next->matte != MagickFalse ?
+ OverCompositeOp : CopyCompositeOp,MagickFalse,next->page.x,next->page.y,
exception);
/*
At this point the image would be displayed, for the delay period
Optimize Transparency of the next frame (if present)
*/
next=GetNextImageInList(next);
- if ( next != (Image *) NULL ) {
- (void) CompositeImage(next, ChangeMaskCompositeOp,
- dispose_image, -(next->page.x), -(next->page.y), exception );
+ if (next != (Image *) NULL) {
+ (void) CompositeImage(next,dispose_image,ChangeMaskCompositeOp,
+ MagickFalse,-(next->page.x),-(next->page.y),exception);
}
}
dispose_image=DestroyImage(dispose_image);
{
x_offset+=source->page.x-destination->page.x;
y_offset+=source->page.y-destination->page.y;
- (void) CompositeImage(destination,compose,source,x_offset,y_offset,
- exception);
+ (void) CompositeImage(destination,source,compose,MagickFalse,x_offset,
+ y_offset,exception);
}
MagickExport void CompositeLayers(Image *destination,
number_images=GetImageListLength(image);
for (scene=0; scene < (ssize_t) number_images; scene++)
{
- (void) CompositeImage(canvas,image->compose,image,image->page.x-
+ (void) CompositeImage(canvas,image,image->compose,MagickFalse,image->page.x-
canvas->page.x,image->page.y-canvas->page.y,exception);
proceed=SetImageProgress(image,MergeLayersTag,(MagickOffsetType) scene,
number_images);
shadow_image=ShadowImage(image,80.0,2.0,5,5,exception);
if (shadow_image != (Image *) NULL)
{
- (void) CompositeImage(shadow_image,OverCompositeOp,image,0,0,
- exception);
+ (void) CompositeImage(shadow_image,image,OverCompositeOp,
+ MagickFalse,0,0,exception);
image=DestroyImage(image);
image=shadow_image;
}
}
- (void) CompositeImage(montage,image->compose,image,x_offset+x,
- y_offset+y,exception);
+ (void) CompositeImage(montage,image,image->compose,MagickFalse,
+ x_offset+x,y_offset+y,exception);
value=GetImageProperty(image,"label",exception);
if (value != (const char *) NULL)
{
/* Preserve the alpha channel of input image - but turned off */
(void) SetImageAlphaChannel(rslt_image, DeactivateAlphaChannel,
exception);
- (void) CompositeImage(rslt_image, CopyAlphaCompositeOp, image, 0, 0,
- exception);
+ (void) CompositeImage(rslt_image,image,CopyAlphaCompositeOp,
+ MagickFalse,0,0,exception);
(void) SetImageAlphaChannel(rslt_image, DeactivateAlphaChannel,
exception);
}
(void) FormatLocaleFile(stderr,
"\n%s: Difference with original image",CommandOptionToMnemonic(
MagickMorphologyOptions, method) );
- (void) CompositeImage(curr_image,DifferenceCompositeOp,image,0,0,
- exception);
+ (void) CompositeImage(curr_image,image,DifferenceCompositeOp,
+ MagickFalse,0,0,exception);
break;
case EdgeMorphology:
if ( verbose == MagickTrue )
(void) FormatLocaleFile(stderr,
"\n%s: Difference of Dilate and Erode",CommandOptionToMnemonic(
MagickMorphologyOptions, method) );
- (void) CompositeImage(curr_image,DifferenceCompositeOp,save_image,0,
- 0,exception);
+ (void) CompositeImage(curr_image,save_image,DifferenceCompositeOp,
+ MagickFalse,0,0,exception);
save_image = DestroyImage(save_image); /* finished with save image */
break;
default:
*/
if ( verbose == MagickTrue )
(void) FormatLocaleFile(stderr, " (compose \"%s\")",
- CommandOptionToMnemonic(MagickComposeOptions, rslt_compose) );
- (void) CompositeImage(rslt_image, rslt_compose, curr_image, 0, 0,
- exception);
+ CommandOptionToMnemonic(MagickComposeOptions, rslt_compose) );
+ (void) CompositeImage(rslt_image,curr_image,rslt_compose,MagickFalse,
+ 0,0,exception);
curr_image = DestroyImage(curr_image);
curr_image = (Image *) image; /* continue with original image */
}
if (extent_image->background_color.alpha != OpaqueAlpha)
extent_image->matte=MagickTrue;
(void) SetImageBackgroundColor(extent_image,exception);
- (void) CompositeImage(extent_image,image->compose,image,-geometry->x,
- -geometry->y,exception);
+ (void) CompositeImage(extent_image,image,image->compose,MagickFalse,
+ -geometry->x,-geometry->y,exception);
return(extent_image);
}
\f
*/
(void) XParseGeometry(annotate_info->geometry,&x,&y,&width,&height);
matte=image->matte;
- (void) CompositeImage(image,annotate_image->matte != MagickFalse ?
- OverCompositeOp : CopyCompositeOp,annotate_image,(ssize_t) x,(ssize_t) y,
- exception);
+ (void) CompositeImage(image,annotate_image,
+ annotate_image->matte != MagickFalse ? OverCompositeOp : CopyCompositeOp,
+ MagickFalse,(ssize_t) x,(ssize_t) y,exception);
image->matte=matte;
annotate_image=DestroyImage(annotate_image);
return(MagickTrue);
draw_view=DestroyCacheView(draw_view);
(void) XParseGeometry(draw_info->geometry,&x,&y,&width,&height);
if (draw_info->stencil == TransparentStencil)
- (void) CompositeImage(image,CopyAlphaCompositeOp,draw_image,(ssize_t) x,
- (ssize_t) y,exception);
+ (void) CompositeImage(image,draw_image,CopyAlphaCompositeOp,MagickFalse,
+ (ssize_t) x,(ssize_t) y,exception);
else
{
matte=image->matte;
- (void) CompositeImage(image,OverCompositeOp,draw_image,(ssize_t) x,
- (ssize_t) y,exception);
+ (void) CompositeImage(image,draw_image,OverCompositeOp,MagickFalse,
+ (ssize_t) x,(ssize_t) y,exception);
image->matte=matte;
}
draw_image=DestroyImage(draw_image);
y_offset-=(int) crop_info.y;
if (y_offset < 0)
y_offset=0;
- (void) CompositeImage(image,CopyCompositeOp,composite_image,(ssize_t)
- x_offset,(ssize_t) y_offset,exception);
+ (void) CompositeImage(image,composite_image,CopyCompositeOp,MagickFalse,
+ (ssize_t) x_offset,(ssize_t) y_offset,exception);
composite_image=DestroyImage(composite_image);
}
/*
{
canvas=CloneImage(image,0,0,MagickTrue,exception);
if (canvas != (Image *) NULL)
- (void) CompositeImage(canvas,DstOverCompositeOp,pattern,0,0,
- exception);
+ (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickFalse,
+ 0,0,exception);
pattern=DestroyImage(pattern);
}
}
{
canvas=CloneImage(image,0,0,MagickTrue,exception);
if (canvas != (Image *) NULL)
- (void) CompositeImage(canvas,DstOverCompositeOp,pattern,0,0,
- exception);
+ (void) CompositeImage(canvas,pattern,DstOverCompositeOp,MagickFalse,
+ 0,0,exception);
pattern=DestroyImage(pattern);
}
}
&distortion,exception);
else
{
- (void) CompositeImage(composite_image,CopyCompositeOp,
- reconstruct_image,offset.x,offset.y,exception);
+ (void) CompositeImage(composite_image,reconstruct_image,
+ CopyCompositeOp,MagickFalse,offset.x,offset.y,exception);
difference_image=CompareImages(image,composite_image,metric,
&distortion,exception);
if (difference_image != (Image *) NULL)
columns=composite_image->columns;
for (y=0; y < (ssize_t) (*image)->rows; y+=(ssize_t) composite_image->rows)
for (x=0; x < (ssize_t) (*image)->columns; x+=(ssize_t) columns)
- status&=CompositeImage(*image,composite_options->compose,
- composite_image,x,y,exception);
+ status&=CompositeImage(*image,composite_image,
+ composite_options->compose,MagickFalse,x,y,exception);
}
else
{
/*
Digitally composite image.
*/
- status&=CompositeImage(*image,composite_options->compose,
- composite_image,geometry.x,geometry.y,exception);
+ status&=CompositeImage(*image,composite_image,
+ composite_options->compose,MagickFalse,geometry.x,geometry.y,
+ exception);
}
}
(void) SetPixelChannelMapMask(composite_image,channel_mask);
/*
Merge Y displacement into X displacement image.
*/
- (void) CompositeImage(composite_image,CopyGreenCompositeOp,mask_image,
- 0,0,exception);
+ (void) CompositeImage(composite_image,mask_image,CopyGreenCompositeOp,
+ MagickFalse,0,0,exception);
mask_image=DestroyImage(mask_image);
}
else
%
% MagickBooleanType MagickCompositeImage(MagickWand *wand,
% const MagickWand *source_wand,const CompositeOperator compose,
-% const ssize_t x,const ssize_t y)
+% const MagickBooleanType clip_to_self,const ssize_t x,const ssize_t y)
%
% A description of each parameter follows:
%
% DifferenceCompositeOp BumpmapCompositeOp CopyCompositeOp
% DisplaceCompositeOp
%
+% o clip_to_self: set to MagickTrue to limit composition to area composed.
+%
% o x: the column offset of the composited image.
%
% o y: the row offset of the composited image.
*/
WandExport MagickBooleanType MagickCompositeImage(MagickWand *wand,
const MagickWand *source_wand,const CompositeOperator compose,
- const ssize_t x,const ssize_t y)
+ const MagickBooleanType clip_to_self,const ssize_t x,const ssize_t y)
{
MagickBooleanType
status;
if ((wand->images == (Image *) NULL) ||
(source_wand->images == (Image *) NULL))
ThrowWandException(WandError,"ContainsNoImages",wand->name);
- status=CompositeImage(wand->images,compose,source_wand->images,x,y,
- wand->exception);
+ status=CompositeImage(wand->images,source_wand->images,compose,clip_to_self,
+ x,y,wand->exception);
return(status);
}
\f
MagickColorMatrixImage(MagickWand *,const KernelInfo *),
MagickCommentImage(MagickWand *,const char *),
MagickCompositeImage(MagickWand *,const MagickWand *,const CompositeOperator,
- const ssize_t,const ssize_t),
+ const MagickBooleanType,const ssize_t,const ssize_t),
MagickCompositeLayers(MagickWand *,const MagickWand *,const CompositeOperator,
const ssize_t,const ssize_t),
MagickConstituteImage(MagickWand *,const size_t,const size_t,const char *,
/*
Composite region.
*/
- (void) CompositeImage(region_image,region_image->matte !=
- MagickFalse ? CopyCompositeOp : OverCompositeOp,*image,
+ (void) CompositeImage(region_image,*image,region_image->matte !=
+ MagickFalse ? CopyCompositeOp : OverCompositeOp,MagickFalse,
region_geometry.x,region_geometry.y,exception);
*image=DestroyImage(*image);
*image=region_image;
Composite transformed region onto image.
*/
(void) SyncImageSettings(mogrify_info,*image,exception);
- (void) CompositeImage(region_image,region_image->matte !=
- MagickFalse ? CopyCompositeOp : OverCompositeOp,*image,
+ (void) CompositeImage(region_image,*image,region_image->matte !=
+ MagickFalse ? CopyCompositeOp : OverCompositeOp,MagickFalse,
region_geometry.x,region_geometry.y,exception);
*image=DestroyImage(*image);
*image=region_image;
}
if (LocaleCompare("composite",option+1) == 0)
{
+ const char
+ *value;
+
Image
*mask_image,
*composite_image,
*image;
+ MagickBooleanType
+ clip_to_self;
+
RectangleInfo
geometry;
/*
Merge Y displacement into X displacement image.
*/
- (void) CompositeImage(composite_image,CopyGreenCompositeOp,
- mask_image,0,0,exception);
+ (void) CompositeImage(composite_image,mask_image,
+ CopyGreenCompositeOp,MagickFalse,0,0,exception);
mask_image=DestroyImage(mask_image);
}
else
mask_image=DestroyImage(mask_image);
}
}
- (void) CompositeImage(image,image->compose,composite_image,
- geometry.x,geometry.y,exception);
+ clip_to_self=MagickFalse;
+ value=GetImageArtifact(composite_image,"compose:outside-overlay");
+ if (value != (const char *) NULL)
+ clip_to_self=IsMagickTrue(value) == MagickFalse ? MagickTrue :
+ MagickFalse;
+ (void) CompositeImage(image,composite_image,image->compose,
+ clip_to_self,geometry.x,geometry.y,exception);
(void) SetImageMask(image,(Image *) NULL,exception);
composite_image=DestroyImage(composite_image);
*images=DestroyImageList(*images);
}
if (LocaleCompare("composite",option+1) == 0)
{
+ CompositeOperator
+ compose;
+
+ const char*
+ value;
+
+ MagickBooleanType
+ clip_to_self;
+
Image
*mask_image,
*source_image;
RectangleInfo
geometry;
- CompositeOperator
- compose;
-
- const char*
- value;
-
value=GetImageOption(_image_info,"compose");
if (value != (const char *) NULL)
compose=(CompositeOperator) ParseCommandOption(
if ((compose == DisplaceCompositeOp) ||
(compose == DistortCompositeOp))
{ /* Merge Y displacement into X displace/distort map. */
- (void) CompositeImage(source_image,CopyGreenCompositeOp,
- mask_image,0,0,_exception);
+ (void) CompositeImage(source_image,mask_image,
+ CopyGreenCompositeOp,MagickFalse,0,0,_exception);
mask_image=DestroyImage(mask_image);
}
else
mask_image=DestroyImage(mask_image);
}
}
- (void) CompositeImage(new_images,compose,source_image,geometry.x,
- geometry.y,_exception);
+ clip_to_self=MagickFalse;
+ value=GetImageArtifact(source_image,"compose:outside-overlay");
+ if (value != (const char *) NULL)
+ clip_to_self=IsMagickTrue(value) == MagickFalse ? MagickTrue :
+ MagickFalse;
+ (void) CompositeImage(new_images,source_image,compose,clip_to_self,
+ geometry.x,geometry.y,_exception);
(void) SetImageMask(new_images,(Image *) NULL,_exception);
source_image=DestroyImage(source_image);
break;
{"color", StringReference}, {"mask", ImageReference},
{"channel", MagickChannelOptions},
{"interpolate", MagickInterpolateOptions}, {"args", StringReference},
- {"blend", StringReference} } },
+ {"blend", StringReference}, {"crop-to-self", MagickBooleanOptions} } },
{ "Contrast", { {"sharpen", MagickBooleanOptions} } },
{ "CycleColormap", { {"display", IntegerReference} } },
{ "Draw", { {"primitive", MagickPrimitiveOptions},
*composite_image,
*rotate_image;
+ MagickBooleanType
+ clip_to_self;
+
compose=OverCompositeOp;
if (attribute_flag[0] != 0)
composite_image=argument_list[0].image_reference;
if (attribute_flag[14] != 0) /* "blend=>" depreciated */
(void) SetImageArtifact(composite_image,"compose:args",
argument_list[14].string_reference);
+ clip_to_self=MagickFalse;
+ if (attribute_flag[15] != 0)
+ clip_to_self=(MagickBooleanType)
+ argument_list[15].integer_reference;
/*
Tiling Composition (with orthogonal rotate).
*/
for (x=0; x < (ssize_t) image->columns; x+=(ssize_t) composite_image->columns)
{
if (attribute_flag[8] != 0) /* rotate */
- (void) CompositeImage(image,compose,rotate_image,x,y,
- exception);
+ (void) CompositeImage(image,rotate_image,compose,
+ MagickFalse,x,y,exception);
else
- (void) CompositeImage(image,compose,composite_image,x,y,
- exception);
+ (void) CompositeImage(image,composite_image,compose,
+ MagickFalse,x,y,exception);
}
if (attribute_flag[8] != 0) /* rotate */
rotate_image=DestroyImage(rotate_image);
*/
composite_image=CloneImage(composite_image,0,0,MagickTrue,
exception);
- (void) CompositeImage(composite_image,CopyGreenCompositeOp,
- argument_list[10].image_reference,0,0,exception);
+ (void) CompositeImage(composite_image,
+ argument_list[10].image_reference,CopyGreenCompositeOp,
+ MagickFalse,0,0,exception);
}
else
{
exception);
channel_mask=SetPixelChannelMask(image,channel);
if (attribute_flag[8] == 0) /* no rotate */
- CompositeImage(image,compose,composite_image,geometry.x,geometry.y,
- exception);
+ CompositeImage(image,composite_image,compose,clip_to_self,
+ geometry.x,geometry.y,exception);
else
{
/*
composite_image->columns)/2;
geometry.y-=(ssize_t) (rotate_image->rows-
composite_image->rows)/2;
- CompositeImage(image,compose,rotate_image,geometry.x,geometry.y,
- exception);
+ CompositeImage(image,rotate_image,compose,clip_to_self,geometry.x,
+ geometry.y,exception);
rotate_image=DestroyImage(rotate_image);
}
if (attribute_flag[10] != 0) /* mask */
/*
Composite region.
*/
- status=CompositeImage(region_image,CopyCompositeOp,image,
+ status=CompositeImage(region_image,image,CopyCompositeOp,MagickFalse,
region_info.x,region_info.y,exception);
(void) status;
(void) CatchImageException(region_image);
SetImageType(composite_image,TrueColorMatteType,
&exception);
(void) CompositeImage(composite_image,
- CopyAlphaCompositeOp,msl_info->image[j],0,0,
- &exception);
+ msl_info->image[j],CopyAlphaCompositeOp,MagickFalse,
+ 0,0,&exception);
break;
}
}
for (x=0; x < (ssize_t) image->columns; x+=(ssize_t) width)
{
if (rotate_image != (Image *) NULL)
- (void) CompositeImage(image,compose,rotate_image,
- x,y,&exception);
+ (void) CompositeImage(image,rotate_image,compose,
+ MagickFalse,x,y,&exception);
else
- (void) CompositeImage(image,compose,
- composite_image,x,y,&exception);
+ (void) CompositeImage(image,composite_image,
+ compose,MagickFalse,x,y,&exception);
}
if (rotate_image != (Image *) NULL)
rotate_image=DestroyImage(rotate_image);
&exception);
channel_mask=SetPixelChannelMask(image,channel);
if (rotate_image == (Image *) NULL)
- CompositeImage(image,compose,composite_image,geometry.x,geometry.y,
- &exception);
+ CompositeImage(image,composite_image,compose,MagickFalse,geometry.x,
+ geometry.y,&exception);
else
{
/*
composite_image->columns)/2;
geometry.y-=(ssize_t) (rotate_image->rows-
composite_image->rows)/2;
- CompositeImage(image,compose,rotate_image,geometry.x,geometry.y,
- &exception);
+ CompositeImage(image,rotate_image,compose,MagickFalse,geometry.x,
+ geometry.y,&exception);
rotate_image=DestroyImage(rotate_image);
}
(void) SetPixelChannelMask(image,channel_mask);
if (jpeg == MagickFalse)
if ((code == 0x9a) || (code == 0x9b) ||
((bytes_per_line & 0x8000) != 0))
- (void) CompositeImage(image,CopyCompositeOp,tile_image,
- destination.left,destination.top,exception);
+ (void) CompositeImage(image,tile_image,CopyCompositeOp,
+ MagickFalse,destination.left,destination.top,exception);
tile_image=DestroyImage(tile_image);
break;
}
if (IsRGBColorspace(image->colorspace) == MagickFalse)
(void) TransformImageColorspace(image,tile_image->colorspace,
exception);
- (void) CompositeImage(image,CopyCompositeOp,tile_image,frame.left,
- frame.right,exception);
+ (void) CompositeImage(image,tile_image,CopyCompositeOp,MagickFalse,
+ frame.left,frame.right,exception);
image->compression=tile_image->compression;
tile_image=DestroyImage(tile_image);
continue;
}
/* composite the tile onto the layer's image, and then destroy it */
- (void) CompositeImage(inLayerInfo->image,CopyCompositeOp,tile_image,
- destLeft * TILE_WIDTH,destTop*TILE_HEIGHT,exception);
+ (void) CompositeImage(inLayerInfo->image,tile_image,CopyCompositeOp,
+ MagickFalse,destLeft*TILE_WIDTH,destTop*TILE_HEIGHT,exception);
tile_image=DestroyImage(tile_image);
/* adjust tile position */
/*
Composite the layer data onto the main image, dispose the layer.
*/
- (void) CompositeImage(image,OverCompositeOp,layer_info[0].image,
- layer_info[0].offset_x,layer_info[0].offset_y,exception);
+ (void) CompositeImage(image,layer_info[0].image,OverCompositeOp,
+ MagickFalse,layer_info[0].offset_x,layer_info[0].offset_y,exception);
layer_info[0].image =DestroyImage( layer_info[0].image);
}
else
signed int j;
/* first we copy the last layer on top of the main image */
- (void) CompositeImage(image,CopyCompositeOp,
- layer_info[number_layers-1].image,
- layer_info[number_layers-1].offset_x,
+ (void) CompositeImage(image,layer_info[number_layers-1].image,
+ CopyCompositeOp,MagickFalse,layer_info[number_layers-1].offset_x,
layer_info[number_layers-1].offset_y,exception);
- layer_info[number_layers-1].image=DestroyImage(
- layer_info[number_layers-1].image);
+ layer_info[number_layers-1].image=DestroyImage(
+ layer_info[number_layers-1].image);
/* now reverse the order of the layers as they are put
into subimages