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-2010 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 % http://www.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 "magick/studio.h"
44 #include "magick/cache-view.h"
45 #include "magick/color-private.h"
46 #include "magick/colorspace-private.h"
47 #include "magick/composite.h"
48 #include "magick/decorate.h"
49 #include "magick/exception.h"
50 #include "magick/exception-private.h"
51 #include "magick/image.h"
52 #include "magick/memory_.h"
53 #include "magick/monitor.h"
54 #include "magick/monitor-private.h"
55 #include "magick/pixel-private.h"
56 #include "magick/quantum.h"
57 #include "magick/transform.h"
62 #define AccentuateModulate ScaleCharToQuantum(80)
63 #define HighlightModulate ScaleCharToQuantum(125)
64 #define ShadowModulate ScaleCharToQuantum(135)
65 #define DepthModulate ScaleCharToQuantum(185)
66 #define TroughModulate ScaleCharToQuantum(110)
69 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
73 % B o r d e r I m a g e %
77 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
79 % BorderImage() surrounds the image with a border of the color defined by
80 % the bordercolor member of the image structure. The width and height
81 % of the border are defined by the corresponding members of the border_info
84 % The format of the BorderImage method is:
86 % Image *BorderImage(const Image *image,const RectangleInfo *border_info,
87 % ExceptionInfo *exception)
89 % A description of each parameter follows:
93 % o border_info: Define the width and height of the border.
95 % o exception: return any errors or warnings in this structure.
98 MagickExport Image *BorderImage(const Image *image,
99 const RectangleInfo *border_info,ExceptionInfo *exception)
108 assert(image != (const Image *) NULL);
109 assert(image->signature == MagickSignature);
110 if (image->debug != MagickFalse)
111 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
112 assert(border_info != (RectangleInfo *) NULL);
113 frame_info.width=image->columns+(border_info->width << 1);
114 frame_info.height=image->rows+(border_info->height << 1);
115 frame_info.x=(ssize_t) border_info->width;
116 frame_info.y=(ssize_t) border_info->height;
117 frame_info.inner_bevel=0;
118 frame_info.outer_bevel=0;
119 clone_image=CloneImage(image,0,0,MagickTrue,exception);
120 if (clone_image == (Image *) NULL)
121 return((Image *) NULL);
122 clone_image->matte_color=image->border_color;
123 border_image=FrameImage(clone_image,&frame_info,exception);
124 clone_image=DestroyImage(clone_image);
125 if (border_image != (Image *) NULL)
126 border_image->matte_color=image->matte_color;
127 return(border_image);
131 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
135 % F r a m e I m a g e %
139 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
141 % FrameImage() adds a simulated three-dimensional border around the image.
142 % The color of the border is defined by the matte_color member of image.
143 % Members width and height of frame_info specify the border width of the
144 % vertical and horizontal sides of the frame. Members inner and outer
145 % indicate the width of the inner and outer shadows of the frame.
147 % The format of the FrameImage method is:
149 % Image *FrameImage(const Image *image,const FrameInfo *frame_info,
150 % ExceptionInfo *exception)
152 % A description of each parameter follows:
154 % o image: the image.
156 % o frame_info: Define the width and height of the frame and its bevels.
158 % o exception: return any errors or warnings in this structure.
161 MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
162 ExceptionInfo *exception)
164 #define FrameImageTag "Frame/Image"
200 Check frame geometry.
202 assert(image != (Image *) NULL);
203 assert(image->signature == MagickSignature);
204 if (image->debug != MagickFalse)
205 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
206 assert(frame_info != (FrameInfo *) NULL);
207 if ((frame_info->outer_bevel < 0) || (frame_info->inner_bevel < 0))
208 ThrowImageException(OptionError,"FrameIsLessThanImageSize");
209 bevel_width=(size_t) (frame_info->outer_bevel+frame_info->inner_bevel);
210 width=frame_info->width-frame_info->x-bevel_width;
211 height=frame_info->height-frame_info->y-bevel_width;
212 if ((width < image->columns) || (height < image->rows))
213 ThrowImageException(OptionError,"FrameIsLessThanImageSize");
215 Initialize framed image attributes.
217 frame_image=CloneImage(image,frame_info->width,frame_info->height,MagickTrue,
219 if (frame_image == (Image *) NULL)
220 return((Image *) NULL);
221 if (SetImageStorageClass(frame_image,DirectClass) == MagickFalse)
223 InheritException(exception,&frame_image->exception);
224 frame_image=DestroyImage(frame_image);
225 return((Image *) NULL);
227 if (frame_image->matte_color.opacity != OpaqueOpacity)
228 frame_image->matte=MagickTrue;
229 frame_image->page=image->page;
230 if ((image->page.width != 0) && (image->page.height != 0))
232 frame_image->page.width+=frame_image->columns-image->columns;
233 frame_image->page.height+=frame_image->rows-image->rows;
236 Initialize 3D effects color.
238 GetMagickPixelPacket(frame_image,&interior);
239 SetMagickPixelPacket(frame_image,&image->border_color,(IndexPacket *) NULL,
241 GetMagickPixelPacket(frame_image,&matte);
242 matte.colorspace=RGBColorspace;
243 SetMagickPixelPacket(frame_image,&image->matte_color,(IndexPacket *) NULL,
245 GetMagickPixelPacket(frame_image,&border);
246 border.colorspace=RGBColorspace;
247 SetMagickPixelPacket(frame_image,&image->border_color,(IndexPacket *) NULL,
249 GetMagickPixelPacket(frame_image,&accentuate);
250 accentuate.red=(MagickRealType) (QuantumScale*((QuantumRange-
251 AccentuateModulate)*matte.red+(QuantumRange*AccentuateModulate)));
252 accentuate.green=(MagickRealType) (QuantumScale*((QuantumRange-
253 AccentuateModulate)*matte.green+(QuantumRange*AccentuateModulate)));
254 accentuate.blue=(MagickRealType) (QuantumScale*((QuantumRange-
255 AccentuateModulate)*matte.blue+(QuantumRange*AccentuateModulate)));
256 accentuate.opacity=matte.opacity;
257 GetMagickPixelPacket(frame_image,&highlight);
258 highlight.red=(MagickRealType) (QuantumScale*((QuantumRange-
259 HighlightModulate)*matte.red+(QuantumRange*HighlightModulate)));
260 highlight.green=(MagickRealType) (QuantumScale*((QuantumRange-
261 HighlightModulate)*matte.green+(QuantumRange*HighlightModulate)));
262 highlight.blue=(MagickRealType) (QuantumScale*((QuantumRange-
263 HighlightModulate)*matte.blue+(QuantumRange*HighlightModulate)));
264 highlight.opacity=matte.opacity;
265 GetMagickPixelPacket(frame_image,&shadow);
266 shadow.red=QuantumScale*matte.red*ShadowModulate;
267 shadow.green=QuantumScale*matte.green*ShadowModulate;
268 shadow.blue=QuantumScale*matte.blue*ShadowModulate;
269 shadow.opacity=matte.opacity;
270 GetMagickPixelPacket(frame_image,&trough);
271 trough.red=QuantumScale*matte.red*TroughModulate;
272 trough.green=QuantumScale*matte.green*TroughModulate;
273 trough.blue=QuantumScale*matte.blue*TroughModulate;
274 trough.opacity=matte.opacity;
275 if (image->colorspace == CMYKColorspace)
277 ConvertRGBToCMYK(&interior);
278 ConvertRGBToCMYK(&matte);
279 ConvertRGBToCMYK(&border);
280 ConvertRGBToCMYK(&accentuate);
281 ConvertRGBToCMYK(&highlight);
282 ConvertRGBToCMYK(&shadow);
283 ConvertRGBToCMYK(&trough);
287 image_view=AcquireCacheView(image);
288 frame_view=AcquireCacheView(frame_image);
289 height=(size_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
290 frame_info->inner_bevel);
294 *restrict frame_indexes;
303 Draw top of ornamental border.
305 q=QueueCacheViewAuthenticPixels(frame_view,0,0,frame_image->columns,
307 frame_indexes=GetCacheViewAuthenticIndexQueue(frame_view);
308 if (q != (PixelPacket *) NULL)
311 Draw top of ornamental border.
313 for (y=0; y < (ssize_t) frame_info->outer_bevel; y++)
315 for (x=0; x < (ssize_t) (frame_image->columns-y); x++)
318 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
320 SetPixelPacket(frame_image,&accentuate,q,frame_indexes);
324 for ( ; x < (ssize_t) frame_image->columns; x++)
326 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
331 for (y=0; y < (ssize_t) (frame_info->y-bevel_width); y++)
333 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
335 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
339 width=frame_image->columns-2*frame_info->outer_bevel;
340 for (x=0; x < (ssize_t) width; x++)
342 SetPixelPacket(frame_image,&matte,q,frame_indexes);
346 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
348 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
353 for (y=0; y < (ssize_t) frame_info->inner_bevel; y++)
355 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
357 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
361 for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
363 SetPixelPacket(frame_image,&matte,q,frame_indexes);
367 width=image->columns+((size_t) frame_info->inner_bevel << 1)-
369 for (x=0; x < (ssize_t) width; x++)
372 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
374 SetPixelPacket(frame_image,&trough,q,frame_indexes);
378 for ( ; x < (ssize_t) (image->columns+2*frame_info->inner_bevel); x++)
380 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
384 width=frame_info->width-frame_info->x-image->columns-bevel_width;
385 for (x=0; x < (ssize_t) width; x++)
387 SetPixelPacket(frame_image,&matte,q,frame_indexes);
391 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
393 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
398 (void) SyncCacheViewAuthenticPixels(frame_view,exception);
402 Draw sides of ornamental border.
404 #if defined(MAGICKCORE_OPENMP_SUPPORT)
405 #pragma omp parallel for schedule(dynamic,4) shared(progress,status)
407 for (y=0; y < (ssize_t) image->rows; y++)
410 *restrict frame_indexes;
419 Initialize scanline with matte color.
421 if (status == MagickFalse)
423 q=QueueCacheViewAuthenticPixels(frame_view,0,frame_info->y+y,
424 frame_image->columns,1,exception);
425 if (q == (PixelPacket *) NULL)
430 frame_indexes=GetCacheViewAuthenticIndexQueue(frame_view);
431 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
433 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
437 for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
439 SetPixelPacket(frame_image,&matte,q,frame_indexes);
443 for (x=0; x < (ssize_t) frame_info->inner_bevel; x++)
445 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
450 Set frame interior to interior color.
452 if ((image->compose != CopyCompositeOp) &&
453 ((image->compose != OverCompositeOp) || (image->matte != MagickFalse)))
454 for (x=0; x < (ssize_t) image->columns; x++)
456 SetPixelPacket(frame_image,&interior,q,frame_indexes);
462 register const IndexPacket
465 register const PixelPacket
468 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
469 if (p == (const PixelPacket *) NULL)
474 indexes=GetCacheViewVirtualIndexQueue(image_view);
475 (void) CopyMagickMemory(q,p,image->columns*sizeof(*p));
476 if ((image->colorspace == CMYKColorspace) &&
477 (frame_image->colorspace == CMYKColorspace))
479 (void) CopyMagickMemory(frame_indexes,indexes,image->columns*
481 frame_indexes+=image->columns;
485 for (x=0; x < (ssize_t) frame_info->inner_bevel; x++)
487 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
491 width=frame_info->width-frame_info->x-image->columns-bevel_width;
492 for (x=0; x < (ssize_t) width; x++)
494 SetPixelPacket(frame_image,&matte,q,frame_indexes);
498 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
500 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
504 if (SyncCacheViewAuthenticPixels(frame_view,exception) == MagickFalse)
506 if (image->progress_monitor != (MagickProgressMonitor) NULL)
511 #if defined(MAGICKCORE_OPENMP_SUPPORT)
512 #pragma omp critical (MagickCore_FrameImage)
514 proceed=SetImageProgress(image,FrameImageTag,progress++,image->rows);
515 if (proceed == MagickFalse)
519 height=(size_t) (frame_info->inner_bevel+frame_info->height-
520 frame_info->y-image->rows-bevel_width+frame_info->outer_bevel);
524 *restrict frame_indexes;
533 Draw bottom of ornamental border.
535 q=QueueCacheViewAuthenticPixels(frame_view,0,(ssize_t) (frame_image->rows-
536 height),frame_image->columns,height,exception);
537 if (q != (PixelPacket *) NULL)
540 Draw bottom of ornamental border.
542 frame_indexes=GetCacheViewAuthenticIndexQueue(frame_view);
543 for (y=frame_info->inner_bevel-1; y >= 0; y--)
545 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
547 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
551 for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
553 SetPixelPacket(frame_image,&matte,q,frame_indexes);
557 for (x=0; x < y; x++)
559 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
563 for ( ; x < (ssize_t) (image->columns+2*frame_info->inner_bevel); x++)
565 if (x >= (ssize_t) (image->columns+2*frame_info->inner_bevel-y))
566 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
568 SetPixelPacket(frame_image,&accentuate,q,frame_indexes);
572 width=frame_info->width-frame_info->x-image->columns-bevel_width;
573 for (x=0; x < (ssize_t) width; x++)
575 SetPixelPacket(frame_image,&matte,q,frame_indexes);
579 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
581 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
586 height=frame_info->height-frame_info->y-image->rows-bevel_width;
587 for (y=0; y < (ssize_t) height; y++)
589 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
591 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
595 width=frame_image->columns-2*frame_info->outer_bevel;
596 for (x=0; x < (ssize_t) width; x++)
598 SetPixelPacket(frame_image,&matte,q,frame_indexes);
602 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
604 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
609 for (y=frame_info->outer_bevel-1; y >= 0; y--)
611 for (x=0; x < y; x++)
613 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
617 for ( ; x < (ssize_t) frame_image->columns; x++)
619 if (x >= (ssize_t) (frame_image->columns-y))
620 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
622 SetPixelPacket(frame_image,&trough,q,frame_indexes);
627 (void) SyncCacheViewAuthenticPixels(frame_view,exception);
630 frame_view=DestroyCacheView(frame_view);
631 image_view=DestroyCacheView(image_view);
632 if ((image->compose != CopyCompositeOp) &&
633 ((image->compose != OverCompositeOp) || (image->matte != MagickFalse)))
635 x=(ssize_t) (frame_info->outer_bevel+(frame_info->x-bevel_width)+
636 frame_info->inner_bevel);
637 y=(ssize_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
638 frame_info->inner_bevel);
639 (void) CompositeImage(frame_image,image->compose,image,x,y);
645 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
649 % R a i s e I m a g e %
653 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
655 % RaiseImage() creates a simulated three-dimensional button-like effect
656 % by lightening and darkening the edges of the image. Members width and
657 % height of raise_info define the width of the vertical and horizontal
658 % edge of the effect.
660 % The format of the RaiseImage method is:
662 % MagickBooleanType RaiseImage(const Image *image,
663 % const RectangleInfo *raise_info,const MagickBooleanType raise)
665 % A description of each parameter follows:
667 % o image: the image.
669 % o raise_info: Define the width and height of the raise area.
671 % o raise: A value other than zero creates a 3-D raise effect,
672 % otherwise it has a lowered effect.
675 MagickExport MagickBooleanType RaiseImage(Image *image,
676 const RectangleInfo *raise_info,const MagickBooleanType raise)
678 #define AccentuateFactor ScaleCharToQuantum(135)
679 #define HighlightFactor ScaleCharToQuantum(190)
680 #define ShadowFactor ScaleCharToQuantum(190)
681 #define RaiseImageTag "Raise/Image"
682 #define TroughFactor ScaleCharToQuantum(135)
703 assert(image != (Image *) NULL);
704 assert(image->signature == MagickSignature);
705 if (image->debug != MagickFalse)
706 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
707 assert(raise_info != (RectangleInfo *) NULL);
708 if ((image->columns <= (raise_info->width << 1)) ||
709 (image->rows <= (raise_info->height << 1)))
710 ThrowBinaryException(OptionError,"ImageSizeMustExceedBevelWidth",
712 foreground=(Quantum) QuantumRange;
713 background=(Quantum) 0;
714 if (raise == MagickFalse)
716 foreground=(Quantum) 0;
717 background=(Quantum) QuantumRange;
719 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
726 exception=(&image->exception);
727 image_view=AcquireCacheView(image);
728 #if defined(MAGICKCORE_OPENMP_SUPPORT)
729 #pragma omp parallel for schedule(dynamic,4) shared(progress,status)
731 for (y=0; y < (ssize_t) raise_info->height; y++)
739 if (status == MagickFalse)
741 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
742 if (q == (PixelPacket *) NULL)
747 for (x=0; x < y; x++)
749 q->red=ClampToQuantum(QuantumScale*((MagickRealType) q->red*
750 HighlightFactor+(MagickRealType) foreground*(QuantumRange-
752 q->green=ClampToQuantum(QuantumScale*((MagickRealType) q->green*
753 HighlightFactor+(MagickRealType) foreground*(QuantumRange-
755 q->blue=ClampToQuantum(QuantumScale*((MagickRealType) q->blue*
756 HighlightFactor+(MagickRealType) foreground*(QuantumRange-
760 for ( ; x < (ssize_t) (image->columns-y); x++)
762 q->red=ClampToQuantum(QuantumScale*((MagickRealType) q->red*
763 AccentuateFactor+(MagickRealType) foreground*(QuantumRange-
765 q->green=ClampToQuantum(QuantumScale*((MagickRealType) q->green*
766 AccentuateFactor+(MagickRealType) foreground*(QuantumRange-
768 q->blue=ClampToQuantum(QuantumScale*((MagickRealType) q->blue*
769 AccentuateFactor+(MagickRealType) foreground*(QuantumRange-
773 for ( ; x < (ssize_t) image->columns; x++)
775 q->red=ClampToQuantum(QuantumScale*((MagickRealType) q->red*ShadowFactor+
776 (MagickRealType) background*(QuantumRange-ShadowFactor)));
777 q->green=ClampToQuantum(QuantumScale*((MagickRealType) q->green*
778 ShadowFactor+(MagickRealType) background*(QuantumRange-ShadowFactor)));
779 q->blue=ClampToQuantum(QuantumScale*((MagickRealType) q->blue*
780 ShadowFactor+(MagickRealType) background*(QuantumRange-ShadowFactor)));
783 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
785 if (image->progress_monitor != (MagickProgressMonitor) NULL)
790 proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
791 if (proceed == MagickFalse)
795 #if defined(MAGICKCORE_OPENMP_SUPPORT)
796 #pragma omp parallel for schedule(dynamic,4) shared(progress,status)
798 for (y=(ssize_t) raise_info->height; y < (ssize_t) (image->rows-raise_info->height); y++)
806 if (status == MagickFalse)
808 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
809 if (q == (PixelPacket *) NULL)
814 for (x=0; x < (ssize_t) raise_info->width; x++)
816 q->red=ClampToQuantum(QuantumScale*((MagickRealType) q->red*
817 HighlightFactor+(MagickRealType) foreground*(QuantumRange-
819 q->green=ClampToQuantum(QuantumScale*((MagickRealType) q->green*
820 HighlightFactor+(MagickRealType) foreground*(QuantumRange-
822 q->blue=ClampToQuantum(QuantumScale*((MagickRealType) q->blue*
823 HighlightFactor+(MagickRealType) foreground*(QuantumRange-
827 for ( ; x < (ssize_t) (image->columns-raise_info->width); x++)
829 for ( ; x < (ssize_t) image->columns; x++)
831 q->red=ClampToQuantum(QuantumScale*((MagickRealType) q->red*ShadowFactor+
832 (MagickRealType) background*(QuantumRange-ShadowFactor)));
833 q->green=ClampToQuantum(QuantumScale*((MagickRealType) q->green*
834 ShadowFactor+(MagickRealType) background*(QuantumRange-ShadowFactor)));
835 q->blue=ClampToQuantum(QuantumScale*((MagickRealType) q->blue*
836 ShadowFactor+(MagickRealType) background*(QuantumRange-ShadowFactor)));
839 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
841 if (image->progress_monitor != (MagickProgressMonitor) NULL)
846 proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
847 if (proceed == MagickFalse)
851 #if defined(MAGICKCORE_OPENMP_SUPPORT)
852 #pragma omp parallel for schedule(dynamic,4) shared(progress,status)
854 for (y=(ssize_t) (image->rows-raise_info->height); y < (ssize_t) image->rows; y++)
862 if (status == MagickFalse)
864 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
865 if (q == (PixelPacket *) NULL)
870 for (x=0; x < (ssize_t) (image->rows-y); x++)
872 q->red=ClampToQuantum(QuantumScale*((MagickRealType) q->red*
873 HighlightFactor+(MagickRealType) foreground*(QuantumRange-
875 q->green=ClampToQuantum(QuantumScale*((MagickRealType) q->green*
876 HighlightFactor+(MagickRealType) foreground*(QuantumRange-
878 q->blue=ClampToQuantum(QuantumScale*((MagickRealType) q->blue*
879 HighlightFactor+(MagickRealType) foreground*(QuantumRange-
883 for ( ; x < (ssize_t) (image->columns-(image->rows-y)); x++)
885 q->red=ClampToQuantum(QuantumScale*((MagickRealType) q->red*TroughFactor+
886 (MagickRealType) background*(QuantumRange-TroughFactor)));
887 q->green=ClampToQuantum(QuantumScale*((MagickRealType) q->green*
888 TroughFactor+(MagickRealType) background*(QuantumRange-TroughFactor)));
889 q->blue=ClampToQuantum(QuantumScale*((MagickRealType) q->blue*
890 TroughFactor+(MagickRealType) background*(QuantumRange-TroughFactor)));
893 for ( ; x < (ssize_t) image->columns; x++)
895 q->red=ClampToQuantum(QuantumScale*((MagickRealType) q->red*ShadowFactor+
896 (MagickRealType) background*(QuantumRange-ShadowFactor)));
897 q->green=ClampToQuantum(QuantumScale*((MagickRealType) q->green*
898 ShadowFactor+(MagickRealType) background*(QuantumRange-ShadowFactor)));
899 q->blue=ClampToQuantum(QuantumScale*((MagickRealType) q->blue*
900 ShadowFactor+(MagickRealType) background*(QuantumRange-ShadowFactor)));
903 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
905 if (image->progress_monitor != (MagickProgressMonitor) NULL)
910 #if defined(MAGICKCORE_OPENMP_SUPPORT)
911 #pragma omp critical (MagickCore_RaiseImage)
913 proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
914 if (proceed == MagickFalse)
918 image_view=DestroyCacheView(image_view);