2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6 % DDDD EEEEE CCCC OOO RRRR AAA TTTTT EEEEE %
7 % D D E C O O R R A A T E %
8 % D D EEE C O O RRRR AAAAA T EEE %
9 % D D E C O O R R A A T E %
10 % DDDD EEEEE CCCC OOO R R A A T EEEEE %
13 % MagickCore Image Decoration Methods %
20 % Copyright 1999-2019 ImageMagick Studio LLC, a non-profit organization %
21 % dedicated to making software imaging solutions freely available. %
23 % You may not use this file except in compliance with the License. You may %
24 % obtain a copy of the License at %
26 % https://imagemagick.org/script/license.php %
28 % Unless required by applicable law or agreed to in writing, software %
29 % distributed under the License is distributed on an "AS IS" BASIS, %
30 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
31 % See the License for the specific language governing permissions and %
32 % limitations under the License. %
34 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
43 #include "MagickCore/studio.h"
44 #include "MagickCore/cache-view.h"
45 #include "MagickCore/color-private.h"
46 #include "MagickCore/colorspace-private.h"
47 #include "MagickCore/composite.h"
48 #include "MagickCore/decorate.h"
49 #include "MagickCore/exception.h"
50 #include "MagickCore/exception-private.h"
51 #include "MagickCore/image.h"
52 #include "MagickCore/memory_.h"
53 #include "MagickCore/monitor.h"
54 #include "MagickCore/monitor-private.h"
55 #include "MagickCore/pixel-accessor.h"
56 #include "MagickCore/quantum.h"
57 #include "MagickCore/quantum-private.h"
58 #include "MagickCore/resource_.h"
59 #include "MagickCore/thread-private.h"
60 #include "MagickCore/transform.h"
65 #define AccentuateModulate ScaleCharToQuantum(80)
66 #define HighlightModulate ScaleCharToQuantum(125)
67 #define ShadowModulate ScaleCharToQuantum(135)
68 #define DepthModulate ScaleCharToQuantum(185)
69 #define TroughModulate ScaleCharToQuantum(110)
72 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
76 % B o r d e r I m a g e %
80 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
82 % BorderImage() surrounds the image with a border of the color defined by
83 % the bordercolor member of the image structure. The width and height
84 % of the border are defined by the corresponding members of the border_info
87 % The format of the BorderImage method is:
89 % Image *BorderImage(const Image *image,const RectangleInfo *border_info,
90 % const CompositeOperator compose,ExceptionInfo *exception)
92 % A description of each parameter follows:
96 % o border_info: define the width and height of the border.
98 % o compose: the composite operator.
100 % o exception: return any errors or warnings in this structure.
103 MagickExport Image *BorderImage(const Image *image,
104 const RectangleInfo *border_info,const CompositeOperator compose,
105 ExceptionInfo *exception)
114 assert(image != (const Image *) NULL);
115 assert(image->signature == MagickCoreSignature);
116 if (image->debug != MagickFalse)
117 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
118 assert(border_info != (RectangleInfo *) NULL);
119 frame_info.width=image->columns+(border_info->width << 1);
120 frame_info.height=image->rows+(border_info->height << 1);
121 frame_info.x=(ssize_t) border_info->width;
122 frame_info.y=(ssize_t) border_info->height;
123 frame_info.inner_bevel=0;
124 frame_info.outer_bevel=0;
125 clone_image=CloneImage(image,0,0,MagickTrue,exception);
126 if (clone_image == (Image *) NULL)
127 return((Image *) NULL);
128 clone_image->matte_color=image->border_color;
129 border_image=FrameImage(clone_image,&frame_info,compose,exception);
130 clone_image=DestroyImage(clone_image);
131 if (border_image != (Image *) NULL)
132 border_image->matte_color=image->matte_color;
133 return(border_image);
137 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
141 % F r a m e I m a g e %
145 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
147 % FrameImage() adds a simulated three-dimensional border around the image.
148 % The color of the border is defined by the matte_color member of image.
149 % Members width and height of frame_info specify the border width of the
150 % vertical and horizontal sides of the frame. Members inner and outer
151 % indicate the width of the inner and outer shadows of the frame.
153 % The format of the FrameImage method is:
155 % Image *FrameImage(const Image *image,const FrameInfo *frame_info,
156 % const CompositeOperator compose,ExceptionInfo *exception)
158 % A description of each parameter follows:
160 % o image: the image.
162 % o frame_info: Define the width and height of the frame and its bevels.
164 % o compose: the composite operator.
166 % o exception: return any errors or warnings in this structure.
169 MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
170 const CompositeOperator compose,ExceptionInfo *exception)
172 #define FrameImageTag "Frame/Image"
206 Check frame geometry.
208 assert(image != (Image *) NULL);
209 assert(image->signature == MagickCoreSignature);
210 if (image->debug != MagickFalse)
211 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
212 assert(frame_info != (FrameInfo *) NULL);
213 if ((frame_info->outer_bevel < 0) || (frame_info->inner_bevel < 0))
214 ThrowImageException(OptionError,"FrameIsLessThanImageSize");
215 bevel_width=(size_t) (frame_info->outer_bevel+frame_info->inner_bevel);
216 x=(ssize_t) frame_info->width-frame_info->x-bevel_width;
217 y=(ssize_t) frame_info->height-frame_info->y-bevel_width;
218 if ((x < (ssize_t) image->columns) || (y < (ssize_t) image->rows))
219 ThrowImageException(OptionError,"FrameIsLessThanImageSize");
221 Initialize framed image attributes.
223 frame_image=CloneImage(image,frame_info->width,frame_info->height,MagickTrue,
225 if (frame_image == (Image *) NULL)
226 return((Image *) NULL);
227 if (SetImageStorageClass(frame_image,DirectClass,exception) == MagickFalse)
229 frame_image=DestroyImage(frame_image);
230 return((Image *) NULL);
232 if ((IsPixelInfoGray(&frame_image->border_color) == MagickFalse) &&
233 (IsGrayColorspace(frame_image->colorspace) != MagickFalse))
234 (void) SetImageColorspace(frame_image,sRGBColorspace,exception);
235 if ((frame_image->matte_color.alpha_trait != UndefinedPixelTrait) &&
236 (frame_image->alpha_trait == UndefinedPixelTrait))
237 (void) SetImageAlpha(frame_image,OpaqueAlpha,exception);
238 frame_image->page=image->page;
239 if ((image->page.width != 0) && (image->page.height != 0))
241 frame_image->page.width+=frame_image->columns-image->columns;
242 frame_image->page.height+=frame_image->rows-image->rows;
245 Initialize 3D effects color.
247 matte=image->matte_color;
249 accentuate.red=(double) (QuantumScale*((QuantumRange-
250 AccentuateModulate)*matte.red+(QuantumRange*AccentuateModulate)));
251 accentuate.green=(double) (QuantumScale*((QuantumRange-
252 AccentuateModulate)*matte.green+(QuantumRange*AccentuateModulate)));
253 accentuate.blue=(double) (QuantumScale*((QuantumRange-
254 AccentuateModulate)*matte.blue+(QuantumRange*AccentuateModulate)));
255 accentuate.black=(double) (QuantumScale*((QuantumRange-
256 AccentuateModulate)*matte.black+(QuantumRange*AccentuateModulate)));
257 accentuate.alpha=matte.alpha;
259 highlight.red=(double) (QuantumScale*((QuantumRange-
260 HighlightModulate)*matte.red+(QuantumRange*HighlightModulate)));
261 highlight.green=(double) (QuantumScale*((QuantumRange-
262 HighlightModulate)*matte.green+(QuantumRange*HighlightModulate)));
263 highlight.blue=(double) (QuantumScale*((QuantumRange-
264 HighlightModulate)*matte.blue+(QuantumRange*HighlightModulate)));
265 highlight.black=(double) (QuantumScale*((QuantumRange-
266 HighlightModulate)*matte.black+(QuantumRange*HighlightModulate)));
267 highlight.alpha=matte.alpha;
269 shadow.red=QuantumScale*matte.red*ShadowModulate;
270 shadow.green=QuantumScale*matte.green*ShadowModulate;
271 shadow.blue=QuantumScale*matte.blue*ShadowModulate;
272 shadow.black=QuantumScale*matte.black*ShadowModulate;
273 shadow.alpha=matte.alpha;
275 trough.red=QuantumScale*matte.red*TroughModulate;
276 trough.green=QuantumScale*matte.green*TroughModulate;
277 trough.blue=QuantumScale*matte.blue*TroughModulate;
278 trough.black=QuantumScale*matte.black*TroughModulate;
279 trough.alpha=matte.alpha;
282 image_view=AcquireVirtualCacheView(image,exception);
283 frame_view=AcquireAuthenticCacheView(frame_image,exception);
284 height=(size_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
285 frame_info->inner_bevel);
295 Draw top of ornamental border.
297 q=QueueCacheViewAuthenticPixels(frame_view,0,0,frame_image->columns,
299 if (q != (Quantum *) NULL)
302 Draw top of ornamental border.
304 for (y=0; y < (ssize_t) frame_info->outer_bevel; y++)
306 for (x=0; x < (ssize_t) (frame_image->columns-y); x++)
309 SetPixelViaPixelInfo(frame_image,&highlight,q);
311 SetPixelViaPixelInfo(frame_image,&accentuate,q);
312 q+=GetPixelChannels(frame_image);
314 for ( ; x < (ssize_t) frame_image->columns; x++)
316 SetPixelViaPixelInfo(frame_image,&shadow,q);
317 q+=GetPixelChannels(frame_image);
320 for (y=0; y < (ssize_t) (frame_info->y-bevel_width); y++)
322 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
324 SetPixelViaPixelInfo(frame_image,&highlight,q);
325 q+=GetPixelChannels(frame_image);
327 width=frame_image->columns-2*frame_info->outer_bevel;
328 for (x=0; x < (ssize_t) width; x++)
330 SetPixelViaPixelInfo(frame_image,&matte,q);
331 q+=GetPixelChannels(frame_image);
333 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
335 SetPixelViaPixelInfo(frame_image,&shadow,q);
336 q+=GetPixelChannels(frame_image);
339 for (y=0; y < (ssize_t) frame_info->inner_bevel; y++)
341 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
343 SetPixelViaPixelInfo(frame_image,&highlight,q);
344 q+=GetPixelChannels(frame_image);
346 for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
348 SetPixelViaPixelInfo(frame_image,&matte,q);
349 q+=GetPixelChannels(frame_image);
351 width=image->columns+((size_t) frame_info->inner_bevel << 1)-
353 for (x=0; x < (ssize_t) width; x++)
356 SetPixelViaPixelInfo(frame_image,&shadow,q);
358 SetPixelViaPixelInfo(frame_image,&trough,q);
359 q+=GetPixelChannels(frame_image);
361 for ( ; x < (ssize_t) (image->columns+2*frame_info->inner_bevel); x++)
363 SetPixelViaPixelInfo(frame_image,&highlight,q);
364 q+=GetPixelChannels(frame_image);
366 width=frame_info->width-frame_info->x-image->columns-bevel_width;
367 for (x=0; x < (ssize_t) width; x++)
369 SetPixelViaPixelInfo(frame_image,&matte,q);
370 q+=GetPixelChannels(frame_image);
372 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
374 SetPixelViaPixelInfo(frame_image,&shadow,q);
375 q+=GetPixelChannels(frame_image);
378 (void) SyncCacheViewAuthenticPixels(frame_view,exception);
382 Draw sides of ornamental border.
384 #if defined(MAGICKCORE_OPENMP_SUPPORT)
385 #pragma omp parallel for schedule(static) shared(progress,status) \
386 magick_number_threads(image,frame_image,image->rows,1)
388 for (y=0; y < (ssize_t) image->rows; y++)
400 Initialize scanline with matte color.
402 if (status == MagickFalse)
404 q=QueueCacheViewAuthenticPixels(frame_view,0,frame_info->y+y,
405 frame_image->columns,1,exception);
406 if (q == (Quantum *) NULL)
411 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
413 SetPixelViaPixelInfo(frame_image,&highlight,q);
414 q+=GetPixelChannels(frame_image);
416 for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
418 SetPixelViaPixelInfo(frame_image,&matte,q);
419 q+=GetPixelChannels(frame_image);
421 for (x=0; x < (ssize_t) frame_info->inner_bevel; x++)
423 SetPixelViaPixelInfo(frame_image,&shadow,q);
424 q+=GetPixelChannels(frame_image);
427 Set frame interior pixels.
429 for (x=0; x < (ssize_t) image->columns; x++)
431 SetPixelViaPixelInfo(frame_image,&frame_image->border_color,q);
432 q+=GetPixelChannels(frame_image);
434 for (x=0; x < (ssize_t) frame_info->inner_bevel; x++)
436 SetPixelViaPixelInfo(frame_image,&highlight,q);
437 q+=GetPixelChannels(frame_image);
439 width=frame_info->width-frame_info->x-image->columns-bevel_width;
440 for (x=0; x < (ssize_t) width; x++)
442 SetPixelViaPixelInfo(frame_image,&matte,q);
443 q+=GetPixelChannels(frame_image);
445 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
447 SetPixelViaPixelInfo(frame_image,&shadow,q);
448 q+=GetPixelChannels(frame_image);
450 if (SyncCacheViewAuthenticPixels(frame_view,exception) == MagickFalse)
452 if (image->progress_monitor != (MagickProgressMonitor) NULL)
457 #if defined(MAGICKCORE_OPENMP_SUPPORT)
461 proceed=SetImageProgress(image,FrameImageTag,progress,image->rows);
462 if (proceed == MagickFalse)
466 height=(size_t) (frame_info->inner_bevel+frame_info->height-
467 frame_info->y-image->rows-bevel_width+frame_info->outer_bevel);
477 Draw bottom of ornamental border.
479 q=QueueCacheViewAuthenticPixels(frame_view,0,(ssize_t) (frame_image->rows-
480 height),frame_image->columns,height,exception);
481 if (q != (Quantum *) NULL)
484 Draw bottom of ornamental border.
486 for (y=frame_info->inner_bevel-1; y >= 0; y--)
488 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
490 SetPixelViaPixelInfo(frame_image,&highlight,q);
491 q+=GetPixelChannels(frame_image);
493 for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
495 SetPixelViaPixelInfo(frame_image,&matte,q);
496 q+=GetPixelChannels(frame_image);
498 for (x=0; x < y; x++)
500 SetPixelViaPixelInfo(frame_image,&shadow,q);
501 q+=GetPixelChannels(frame_image);
503 for ( ; x < (ssize_t) (image->columns+2*frame_info->inner_bevel); x++)
505 if (x >= (ssize_t) (image->columns+2*frame_info->inner_bevel-y))
506 SetPixelViaPixelInfo(frame_image,&highlight,q);
508 SetPixelViaPixelInfo(frame_image,&accentuate,q);
509 q+=GetPixelChannels(frame_image);
511 width=frame_info->width-frame_info->x-image->columns-bevel_width;
512 for (x=0; x < (ssize_t) width; x++)
514 SetPixelViaPixelInfo(frame_image,&matte,q);
515 q+=GetPixelChannels(frame_image);
517 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
519 SetPixelViaPixelInfo(frame_image,&shadow,q);
520 q+=GetPixelChannels(frame_image);
523 height=frame_info->height-frame_info->y-image->rows-bevel_width;
524 for (y=0; y < (ssize_t) height; y++)
526 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
528 SetPixelViaPixelInfo(frame_image,&highlight,q);
529 q+=GetPixelChannels(frame_image);
531 width=frame_image->columns-2*frame_info->outer_bevel;
532 for (x=0; x < (ssize_t) width; x++)
534 SetPixelViaPixelInfo(frame_image,&matte,q);
535 q+=GetPixelChannels(frame_image);
537 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
539 SetPixelViaPixelInfo(frame_image,&shadow,q);
540 q+=GetPixelChannels(frame_image);
543 for (y=frame_info->outer_bevel-1; y >= 0; y--)
545 for (x=0; x < y; x++)
547 SetPixelViaPixelInfo(frame_image,&highlight,q);
548 q+=GetPixelChannels(frame_image);
550 for ( ; x < (ssize_t) frame_image->columns; x++)
552 if (x >= (ssize_t) (frame_image->columns-y))
553 SetPixelViaPixelInfo(frame_image,&shadow,q);
555 SetPixelViaPixelInfo(frame_image,&trough,q);
556 q+=GetPixelChannels(frame_image);
559 (void) SyncCacheViewAuthenticPixels(frame_view,exception);
562 frame_view=DestroyCacheView(frame_view);
563 image_view=DestroyCacheView(image_view);
564 x=(ssize_t) (frame_info->outer_bevel+(frame_info->x-bevel_width)+
565 frame_info->inner_bevel);
566 y=(ssize_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
567 frame_info->inner_bevel);
568 if (status != MagickFalse)
569 status=CompositeImage(frame_image,image,compose,MagickTrue,x,y,
571 if (status == MagickFalse)
572 frame_image=DestroyImage(frame_image);
577 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
581 % R a i s e I m a g e %
585 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
587 % RaiseImage() creates a simulated three-dimensional button-like effect
588 % by lightening and darkening the edges of the image. Members width and
589 % height of raise_info define the width of the vertical and horizontal
590 % edge of the effect.
592 % The format of the RaiseImage method is:
594 % MagickBooleanType RaiseImage(const Image *image,
595 % const RectangleInfo *raise_info,const MagickBooleanType raise,
596 % ExceptionInfo *exception)
598 % A description of each parameter follows:
600 % o image: the image.
602 % o raise_info: Define the width and height of the raise area.
604 % o raise: A value other than zero creates a 3-D raise effect,
605 % otherwise it has a lowered effect.
607 % o exception: return any errors or warnings in this structure.
610 MagickExport MagickBooleanType RaiseImage(Image *image,
611 const RectangleInfo *raise_info,const MagickBooleanType raise,
612 ExceptionInfo *exception)
614 #define AccentuateFactor ScaleCharToQuantum(135)
615 #define HighlightFactor ScaleCharToQuantum(190)
616 #define ShadowFactor ScaleCharToQuantum(190)
617 #define RaiseImageTag "Raise/Image"
618 #define TroughFactor ScaleCharToQuantum(135)
636 assert(image != (Image *) NULL);
637 assert(image->signature == MagickCoreSignature);
638 if (image->debug != MagickFalse)
639 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
640 assert(raise_info != (RectangleInfo *) NULL);
641 if ((image->columns <= (raise_info->width << 1)) ||
642 (image->rows <= (raise_info->height << 1)))
643 ThrowBinaryException(OptionError,"ImageSizeMustExceedBevelWidth",
645 foreground=QuantumRange;
646 background=(Quantum) 0;
647 if (raise == MagickFalse)
649 foreground=(Quantum) 0;
650 background=QuantumRange;
652 if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
659 image_view=AcquireAuthenticCacheView(image,exception);
660 #if defined(MAGICKCORE_OPENMP_SUPPORT)
661 #pragma omp parallel for schedule(static) shared(progress,status) \
662 magick_number_threads(image,image,raise_info->height,1)
664 for (y=0; y < (ssize_t) raise_info->height; y++)
673 if (status == MagickFalse)
675 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
676 if (q == (Quantum *) NULL)
681 for (x=0; x < y; x++)
683 for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
685 PixelChannel channel = GetPixelChannelChannel(image,i);
686 PixelTrait traits = GetPixelChannelTraits(image,channel);
687 if ((traits & UpdatePixelTrait) == 0)
689 q[i]=ClampToQuantum(QuantumScale*((double) q[i]*HighlightFactor+(double)
690 foreground*(QuantumRange-HighlightFactor)));
692 q+=GetPixelChannels(image);
694 for ( ; x < (ssize_t) (image->columns-y); x++)
696 for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
698 PixelChannel channel = GetPixelChannelChannel(image,i);
699 PixelTrait traits = GetPixelChannelTraits(image,channel);
700 if ((traits & UpdatePixelTrait) == 0)
702 q[i]=ClampToQuantum(QuantumScale*((double) q[i]*AccentuateFactor+
703 (double) foreground*(QuantumRange-AccentuateFactor)));
705 q+=GetPixelChannels(image);
707 for ( ; x < (ssize_t) image->columns; x++)
709 for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
711 PixelChannel channel = GetPixelChannelChannel(image,i);
712 PixelTrait traits = GetPixelChannelTraits(image,channel);
713 if ((traits & UpdatePixelTrait) == 0)
715 q[i]=ClampToQuantum(QuantumScale*((double) q[i]*ShadowFactor+(double)
716 background*(QuantumRange-ShadowFactor)));
718 q+=GetPixelChannels(image);
720 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
722 if (image->progress_monitor != (MagickProgressMonitor) NULL)
727 #if defined(MAGICKCORE_OPENMP_SUPPORT)
731 proceed=SetImageProgress(image,RaiseImageTag,progress,image->rows);
732 if (proceed == MagickFalse)
736 #if defined(MAGICKCORE_OPENMP_SUPPORT)
737 #pragma omp parallel for schedule(static) shared(progress,status) \
738 magick_number_threads(image,image,image->rows-2*raise_info->height,1)
740 for (y=(ssize_t) raise_info->height; y < (ssize_t) (image->rows-raise_info->height); y++)
749 if (status == MagickFalse)
751 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
752 if (q == (Quantum *) NULL)
757 for (x=0; x < (ssize_t) raise_info->width; x++)
759 for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
761 PixelChannel channel = GetPixelChannelChannel(image,i);
762 PixelTrait traits = GetPixelChannelTraits(image,channel);
763 if ((traits & UpdatePixelTrait) == 0)
765 q[i]=ClampToQuantum(QuantumScale*((double) q[i]*HighlightFactor+(double)
766 foreground*(QuantumRange-HighlightFactor)));
768 q+=GetPixelChannels(image);
770 for ( ; x < (ssize_t) (image->columns-raise_info->width); x++)
771 q+=GetPixelChannels(image);
772 for ( ; x < (ssize_t) image->columns; x++)
774 for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
776 PixelChannel channel = GetPixelChannelChannel(image,i);
777 PixelTrait traits = GetPixelChannelTraits(image,channel);
778 if ((traits & UpdatePixelTrait) == 0)
780 q[i]=ClampToQuantum(QuantumScale*((double) q[i]*ShadowFactor+(double)
781 background*(QuantumRange-ShadowFactor)));
783 q+=GetPixelChannels(image);
785 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
787 if (image->progress_monitor != (MagickProgressMonitor) NULL)
792 #if defined(MAGICKCORE_OPENMP_SUPPORT)
796 proceed=SetImageProgress(image,RaiseImageTag,progress,image->rows);
797 if (proceed == MagickFalse)
801 #if defined(MAGICKCORE_OPENMP_SUPPORT)
802 #pragma omp parallel for schedule(static) shared(progress,status) \
803 magick_number_threads(image,image,image->rows-raise_info->height,1)
805 for (y=(ssize_t) (image->rows-raise_info->height); y < (ssize_t) image->rows; y++)
814 if (status == MagickFalse)
816 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
817 if (q == (Quantum *) NULL)
822 for (x=0; x < (ssize_t) (image->rows-y); x++)
824 for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
826 PixelChannel channel = GetPixelChannelChannel(image,i);
827 PixelTrait traits = GetPixelChannelTraits(image,channel);
828 if ((traits & UpdatePixelTrait) == 0)
830 q[i]=ClampToQuantum(QuantumScale*((double) q[i]*HighlightFactor+(double)
831 foreground*(QuantumRange-HighlightFactor)));
833 q+=GetPixelChannels(image);
835 for ( ; x < (ssize_t) (image->columns-(image->rows-y)); x++)
837 for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
839 PixelChannel channel = GetPixelChannelChannel(image,i);
840 PixelTrait traits = GetPixelChannelTraits(image,channel);
841 if ((traits & UpdatePixelTrait) == 0)
843 q[i]=ClampToQuantum(QuantumScale*((double) q[i]*TroughFactor+
844 (double) background*(QuantumRange-TroughFactor)));
846 q+=GetPixelChannels(image);
848 for ( ; x < (ssize_t) image->columns; x++)
850 for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
852 PixelChannel channel = GetPixelChannelChannel(image,i);
853 PixelTrait traits = GetPixelChannelTraits(image,channel);
854 if ((traits & UpdatePixelTrait) == 0)
856 q[i]=ClampToQuantum(QuantumScale*((double) q[i]*ShadowFactor+(double)
857 background*(QuantumRange-ShadowFactor)));
859 q+=GetPixelChannels(image);
861 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
863 if (image->progress_monitor != (MagickProgressMonitor) NULL)
868 #if defined(MAGICKCORE_OPENMP_SUPPORT)
872 proceed=SetImageProgress(image,RaiseImageTag,progress,image->rows);
873 if (proceed == MagickFalse)
877 image_view=DestroyCacheView(image_view);