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-2011 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 "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/thread-private.h"
59 #include "MagickCore/transform.h"
64 #define AccentuateModulate ScaleCharToQuantum(80)
65 #define HighlightModulate ScaleCharToQuantum(125)
66 #define ShadowModulate ScaleCharToQuantum(135)
67 #define DepthModulate ScaleCharToQuantum(185)
68 #define TroughModulate ScaleCharToQuantum(110)
71 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
75 % B o r d e r I m a g e %
79 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
81 % BorderImage() surrounds the image with a border of the color defined by
82 % the bordercolor member of the image structure. The width and height
83 % of the border are defined by the corresponding members of the border_info
86 % The format of the BorderImage method is:
88 % Image *BorderImage(const Image *image,const RectangleInfo *border_info,
89 % ExceptionInfo *exception)
91 % A description of each parameter follows:
95 % o border_info: Define the width and height of the border.
97 % o exception: return any errors or warnings in this structure.
100 MagickExport Image *BorderImage(const Image *image,
101 const RectangleInfo *border_info,ExceptionInfo *exception)
110 assert(image != (const Image *) NULL);
111 assert(image->signature == MagickSignature);
112 if (image->debug != MagickFalse)
113 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
114 assert(border_info != (RectangleInfo *) NULL);
115 frame_info.width=image->columns+(border_info->width << 1);
116 frame_info.height=image->rows+(border_info->height << 1);
117 frame_info.x=(ssize_t) border_info->width;
118 frame_info.y=(ssize_t) border_info->height;
119 frame_info.inner_bevel=0;
120 frame_info.outer_bevel=0;
121 clone_image=CloneImage(image,0,0,MagickTrue,exception);
122 if (clone_image == (Image *) NULL)
123 return((Image *) NULL);
124 clone_image->matte_color=image->border_color;
125 border_image=FrameImage(clone_image,&frame_info,exception);
126 clone_image=DestroyImage(clone_image);
127 if (border_image != (Image *) NULL)
128 border_image->matte_color=image->matte_color;
129 return(border_image);
133 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
137 % F r a m e I m a g e %
141 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
143 % FrameImage() adds a simulated three-dimensional border around the image.
144 % The color of the border is defined by the matte_color member of image.
145 % Members width and height of frame_info specify the border width of the
146 % vertical and horizontal sides of the frame. Members inner and outer
147 % indicate the width of the inner and outer shadows of the frame.
149 % The format of the FrameImage method is:
151 % Image *FrameImage(const Image *image,const FrameInfo *frame_info,
152 % ExceptionInfo *exception)
154 % A description of each parameter follows:
156 % o image: the image.
158 % o frame_info: Define the width and height of the frame and its bevels.
160 % o exception: return any errors or warnings in this structure.
163 MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
164 ExceptionInfo *exception)
166 #define FrameImageTag "Frame/Image"
202 Check frame geometry.
204 assert(image != (Image *) NULL);
205 assert(image->signature == MagickSignature);
206 if (image->debug != MagickFalse)
207 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
208 assert(frame_info != (FrameInfo *) NULL);
209 if ((frame_info->outer_bevel < 0) || (frame_info->inner_bevel < 0))
210 ThrowImageException(OptionError,"FrameIsLessThanImageSize");
211 bevel_width=(size_t) (frame_info->outer_bevel+frame_info->inner_bevel);
212 width=frame_info->width-frame_info->x-bevel_width;
213 height=frame_info->height-frame_info->y-bevel_width;
214 if ((width < image->columns) || (height < image->rows))
215 ThrowImageException(OptionError,"FrameIsLessThanImageSize");
217 Initialize framed image attributes.
219 frame_image=CloneImage(image,frame_info->width,frame_info->height,MagickTrue,
221 if (frame_image == (Image *) NULL)
222 return((Image *) NULL);
223 if (SetImageStorageClass(frame_image,DirectClass) == MagickFalse)
225 InheritException(exception,&frame_image->exception);
226 frame_image=DestroyImage(frame_image);
227 return((Image *) NULL);
229 if (frame_image->matte_color.alpha != OpaqueAlpha)
230 frame_image->matte=MagickTrue;
231 frame_image->page=image->page;
232 if ((image->page.width != 0) && (image->page.height != 0))
234 frame_image->page.width+=frame_image->columns-image->columns;
235 frame_image->page.height+=frame_image->rows-image->rows;
238 Initialize 3D effects color.
240 GetPixelInfo(frame_image,&interior);
241 SetPixelInfoPacket(frame_image,&image->border_color,&interior);
242 GetPixelInfo(frame_image,&matte);
243 matte.colorspace=RGBColorspace;
244 SetPixelInfoPacket(frame_image,&image->matte_color,&matte);
245 GetPixelInfo(frame_image,&border);
246 border.colorspace=RGBColorspace;
247 SetPixelInfoPacket(frame_image,&image->border_color,&border);
248 GetPixelInfo(frame_image,&accentuate);
249 accentuate.red=(MagickRealType) (QuantumScale*((QuantumRange-
250 AccentuateModulate)*matte.red+(QuantumRange*AccentuateModulate)));
251 accentuate.green=(MagickRealType) (QuantumScale*((QuantumRange-
252 AccentuateModulate)*matte.green+(QuantumRange*AccentuateModulate)));
253 accentuate.blue=(MagickRealType) (QuantumScale*((QuantumRange-
254 AccentuateModulate)*matte.blue+(QuantumRange*AccentuateModulate)));
255 accentuate.alpha=matte.alpha;
256 GetPixelInfo(frame_image,&highlight);
257 highlight.red=(MagickRealType) (QuantumScale*((QuantumRange-
258 HighlightModulate)*matte.red+(QuantumRange*HighlightModulate)));
259 highlight.green=(MagickRealType) (QuantumScale*((QuantumRange-
260 HighlightModulate)*matte.green+(QuantumRange*HighlightModulate)));
261 highlight.blue=(MagickRealType) (QuantumScale*((QuantumRange-
262 HighlightModulate)*matte.blue+(QuantumRange*HighlightModulate)));
263 highlight.alpha=matte.alpha;
264 GetPixelInfo(frame_image,&shadow);
265 shadow.red=QuantumScale*matte.red*ShadowModulate;
266 shadow.green=QuantumScale*matte.green*ShadowModulate;
267 shadow.blue=QuantumScale*matte.blue*ShadowModulate;
268 shadow.alpha=matte.alpha;
269 GetPixelInfo(frame_image,&trough);
270 trough.red=QuantumScale*matte.red*TroughModulate;
271 trough.green=QuantumScale*matte.green*TroughModulate;
272 trough.blue=QuantumScale*matte.blue*TroughModulate;
273 trough.alpha=matte.alpha;
274 if (image->colorspace == CMYKColorspace)
276 ConvertRGBToCMYK(&interior);
277 ConvertRGBToCMYK(&matte);
278 ConvertRGBToCMYK(&border);
279 ConvertRGBToCMYK(&accentuate);
280 ConvertRGBToCMYK(&highlight);
281 ConvertRGBToCMYK(&shadow);
282 ConvertRGBToCMYK(&trough);
286 image_view=AcquireCacheView(image);
287 frame_view=AcquireCacheView(frame_image);
288 height=(size_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
289 frame_info->inner_bevel);
299 Draw top of ornamental border.
301 q=QueueCacheViewAuthenticPixels(frame_view,0,0,frame_image->columns,
303 if (q != (Quantum *) NULL)
306 Draw top of ornamental border.
308 for (y=0; y < (ssize_t) frame_info->outer_bevel; y++)
310 for (x=0; x < (ssize_t) (frame_image->columns-y); x++)
313 SetPixelPixelInfo(frame_image,&highlight,q);
315 SetPixelPixelInfo(frame_image,&accentuate,q);
316 q+=GetPixelComponents(frame_image);
318 for ( ; x < (ssize_t) frame_image->columns; x++)
320 SetPixelPixelInfo(frame_image,&shadow,q);
321 q+=GetPixelComponents(frame_image);
324 for (y=0; y < (ssize_t) (frame_info->y-bevel_width); y++)
326 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
328 SetPixelPixelInfo(frame_image,&highlight,q);
329 q+=GetPixelComponents(frame_image);
331 width=frame_image->columns-2*frame_info->outer_bevel;
332 for (x=0; x < (ssize_t) width; x++)
334 SetPixelPixelInfo(frame_image,&matte,q);
335 q+=GetPixelComponents(frame_image);
337 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
339 SetPixelPixelInfo(frame_image,&shadow,q);
340 q+=GetPixelComponents(frame_image);
343 for (y=0; y < (ssize_t) frame_info->inner_bevel; y++)
345 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
347 SetPixelPixelInfo(frame_image,&highlight,q);
348 q+=GetPixelComponents(frame_image);
350 for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
352 SetPixelPixelInfo(frame_image,&matte,q);
353 q+=GetPixelComponents(frame_image);
355 width=image->columns+((size_t) frame_info->inner_bevel << 1)-
357 for (x=0; x < (ssize_t) width; x++)
360 SetPixelPixelInfo(frame_image,&shadow,q);
362 SetPixelPixelInfo(frame_image,&trough,q);
363 q+=GetPixelComponents(frame_image);
365 for ( ; x < (ssize_t) (image->columns+2*frame_info->inner_bevel); x++)
367 SetPixelPixelInfo(frame_image,&highlight,q);
368 q+=GetPixelComponents(frame_image);
370 width=frame_info->width-frame_info->x-image->columns-bevel_width;
371 for (x=0; x < (ssize_t) width; x++)
373 SetPixelPixelInfo(frame_image,&matte,q);
374 q+=GetPixelComponents(frame_image);
376 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
378 SetPixelPixelInfo(frame_image,&shadow,q);
379 q+=GetPixelComponents(frame_image);
382 (void) SyncCacheViewAuthenticPixels(frame_view,exception);
386 Draw sides of ornamental border.
388 #if defined(MAGICKCORE_OPENMP_SUPPORT)
389 #pragma omp parallel for schedule(dynamic,4) shared(progress,status) omp_throttle(1)
391 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 == (const Quantum *) NULL)
411 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
413 SetPixelPixelInfo(frame_image,&highlight,q);
414 q+=GetPixelComponents(frame_image);
416 for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
418 SetPixelPixelInfo(frame_image,&matte,q);
419 q+=GetPixelComponents(frame_image);
421 for (x=0; x < (ssize_t) frame_info->inner_bevel; x++)
423 SetPixelPixelInfo(frame_image,&shadow,q);
424 q+=GetPixelComponents(frame_image);
427 Set frame interior to interior color.
429 if ((image->compose != CopyCompositeOp) &&
430 ((image->compose != OverCompositeOp) || (image->matte != MagickFalse)))
431 for (x=0; x < (ssize_t) image->columns; x++)
433 SetPixelPixelInfo(frame_image,&interior,q);
434 q+=GetPixelComponents(frame_image);
438 register const Quantum
441 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
442 if (p == (const Quantum *) NULL)
447 for (x=0; x < (ssize_t) image->columns; x++)
449 SetPixelRed(frame_image,GetPixelRed(image,p),q);
450 SetPixelGreen(frame_image,GetPixelGreen(image,p),q);
451 SetPixelBlue(frame_image,GetPixelBlue(image,p),q);
452 if (image->colorspace == CMYKColorspace)
453 SetPixelBlack(frame_image,GetPixelBlack(image,p),q);
454 SetPixelAlpha(frame_image,GetPixelAlpha(image,p),q);
455 p+=GetPixelComponents(image);
456 q+=GetPixelComponents(frame_image);
459 for (x=0; x < (ssize_t) frame_info->inner_bevel; x++)
461 SetPixelPixelInfo(frame_image,&highlight,q);
462 q+=GetPixelComponents(frame_image);
464 width=frame_info->width-frame_info->x-image->columns-bevel_width;
465 for (x=0; x < (ssize_t) width; x++)
467 SetPixelPixelInfo(frame_image,&matte,q);
468 q+=GetPixelComponents(frame_image);
470 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
472 SetPixelPixelInfo(frame_image,&shadow,q);
473 q+=GetPixelComponents(frame_image);
475 if (SyncCacheViewAuthenticPixels(frame_view,exception) == MagickFalse)
477 if (image->progress_monitor != (MagickProgressMonitor) NULL)
482 #if defined(MAGICKCORE_OPENMP_SUPPORT)
483 #pragma omp critical (MagickCore_FrameImage)
485 proceed=SetImageProgress(image,FrameImageTag,progress++,image->rows);
486 if (proceed == MagickFalse)
490 height=(size_t) (frame_info->inner_bevel+frame_info->height-
491 frame_info->y-image->rows-bevel_width+frame_info->outer_bevel);
501 Draw bottom of ornamental border.
503 q=QueueCacheViewAuthenticPixels(frame_view,0,(ssize_t) (frame_image->rows-
504 height),frame_image->columns,height,exception);
505 if (q != (Quantum *) NULL)
508 Draw bottom of ornamental border.
510 for (y=frame_info->inner_bevel-1; y >= 0; y--)
512 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
514 SetPixelPixelInfo(frame_image,&highlight,q);
515 q+=GetPixelComponents(frame_image);
517 for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
519 SetPixelPixelInfo(frame_image,&matte,q);
520 q+=GetPixelComponents(frame_image);
522 for (x=0; x < y; x++)
524 SetPixelPixelInfo(frame_image,&shadow,q);
525 q+=GetPixelComponents(frame_image);
527 for ( ; x < (ssize_t) (image->columns+2*frame_info->inner_bevel); x++)
529 if (x >= (ssize_t) (image->columns+2*frame_info->inner_bevel-y))
530 SetPixelPixelInfo(frame_image,&highlight,q);
532 SetPixelPixelInfo(frame_image,&accentuate,q);
533 q+=GetPixelComponents(frame_image);
535 width=frame_info->width-frame_info->x-image->columns-bevel_width;
536 for (x=0; x < (ssize_t) width; x++)
538 SetPixelPixelInfo(frame_image,&matte,q);
539 q+=GetPixelComponents(frame_image);
541 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
543 SetPixelPixelInfo(frame_image,&shadow,q);
544 q+=GetPixelComponents(frame_image);
547 height=frame_info->height-frame_info->y-image->rows-bevel_width;
548 for (y=0; y < (ssize_t) height; y++)
550 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
552 SetPixelPixelInfo(frame_image,&highlight,q);
553 q+=GetPixelComponents(frame_image);
555 width=frame_image->columns-2*frame_info->outer_bevel;
556 for (x=0; x < (ssize_t) width; x++)
558 SetPixelPixelInfo(frame_image,&matte,q);
559 q+=GetPixelComponents(frame_image);
561 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
563 SetPixelPixelInfo(frame_image,&shadow,q);
564 q+=GetPixelComponents(frame_image);
567 for (y=frame_info->outer_bevel-1; y >= 0; y--)
569 for (x=0; x < y; x++)
571 SetPixelPixelInfo(frame_image,&highlight,q);
572 q+=GetPixelComponents(frame_image);
574 for ( ; x < (ssize_t) frame_image->columns; x++)
576 if (x >= (ssize_t) (frame_image->columns-y))
577 SetPixelPixelInfo(frame_image,&shadow,q);
579 SetPixelPixelInfo(frame_image,&trough,q);
580 q+=GetPixelComponents(frame_image);
583 (void) SyncCacheViewAuthenticPixels(frame_view,exception);
586 frame_view=DestroyCacheView(frame_view);
587 image_view=DestroyCacheView(image_view);
588 if ((image->compose != CopyCompositeOp) &&
589 ((image->compose != OverCompositeOp) || (image->matte != MagickFalse)))
591 x=(ssize_t) (frame_info->outer_bevel+(frame_info->x-bevel_width)+
592 frame_info->inner_bevel);
593 y=(ssize_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
594 frame_info->inner_bevel);
595 (void) CompositeImage(frame_image,image->compose,image,x,y);
601 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
605 % R a i s e I m a g e %
609 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
611 % RaiseImage() creates a simulated three-dimensional button-like effect
612 % by lightening and darkening the edges of the image. Members width and
613 % height of raise_info define the width of the vertical and horizontal
614 % edge of the effect.
616 % The format of the RaiseImage method is:
618 % MagickBooleanType RaiseImage(const Image *image,
619 % const RectangleInfo *raise_info,const MagickBooleanType raise)
621 % A description of each parameter follows:
623 % o image: the image.
625 % o raise_info: Define the width and height of the raise area.
627 % o raise: A value other than zero creates a 3-D raise effect,
628 % otherwise it has a lowered effect.
631 MagickExport MagickBooleanType RaiseImage(Image *image,
632 const RectangleInfo *raise_info,const MagickBooleanType raise)
634 #define AccentuateFactor ScaleCharToQuantum(135)
635 #define HighlightFactor ScaleCharToQuantum(190)
636 #define ShadowFactor ScaleCharToQuantum(190)
637 #define RaiseImageTag "Raise/Image"
638 #define TroughFactor ScaleCharToQuantum(135)
659 assert(image != (Image *) NULL);
660 assert(image->signature == MagickSignature);
661 if (image->debug != MagickFalse)
662 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
663 assert(raise_info != (RectangleInfo *) NULL);
664 if ((image->columns <= (raise_info->width << 1)) ||
665 (image->rows <= (raise_info->height << 1)))
666 ThrowBinaryException(OptionError,"ImageSizeMustExceedBevelWidth",
668 foreground=(Quantum) QuantumRange;
669 background=(Quantum) 0;
670 if (raise == MagickFalse)
672 foreground=(Quantum) 0;
673 background=(Quantum) QuantumRange;
675 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
682 exception=(&image->exception);
683 image_view=AcquireCacheView(image);
684 #if defined(MAGICKCORE_OPENMP_SUPPORT)
685 #pragma omp parallel for schedule(dynamic,4) shared(progress,status) omp_throttle(1)
687 for (y=0; y < (ssize_t) raise_info->height; y++)
695 if (status == MagickFalse)
697 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
698 if (q == (const Quantum *) NULL)
703 for (x=0; x < y; x++)
705 SetPixelRed(image,ClampToQuantum(QuantumScale*((MagickRealType)
706 GetPixelRed(image,q)*HighlightFactor+(MagickRealType) foreground*
707 (QuantumRange-HighlightFactor))),q);
708 SetPixelGreen(image,ClampToQuantum(QuantumScale*((MagickRealType)
709 GetPixelGreen(image,q)*HighlightFactor+(MagickRealType) foreground*
710 (QuantumRange-HighlightFactor))),q);
711 SetPixelBlue(image,ClampToQuantum(QuantumScale*((MagickRealType)
712 GetPixelBlue(image,q)*HighlightFactor+(MagickRealType) foreground*
713 (QuantumRange-HighlightFactor))),q);
714 q+=GetPixelComponents(image);
716 for ( ; x < (ssize_t) (image->columns-y); x++)
718 SetPixelRed(image,ClampToQuantum(QuantumScale*((MagickRealType)
719 GetPixelRed(image,q)*AccentuateFactor+(MagickRealType) foreground*
720 (QuantumRange-AccentuateFactor))),q);
721 SetPixelGreen(image,ClampToQuantum(QuantumScale*((MagickRealType)
722 GetPixelGreen(image,q)*AccentuateFactor+(MagickRealType) foreground*
723 (QuantumRange-AccentuateFactor))),q);
724 SetPixelBlue(image,ClampToQuantum(QuantumScale*((MagickRealType)
725 GetPixelBlue(image,q)*AccentuateFactor+(MagickRealType) foreground*
726 (QuantumRange-AccentuateFactor))),q);
727 q+=GetPixelComponents(image);
729 for ( ; x < (ssize_t) image->columns; x++)
731 SetPixelRed(image,ClampToQuantum(QuantumScale*((MagickRealType)
732 GetPixelRed(image,q)*ShadowFactor+(MagickRealType) background*
733 (QuantumRange-ShadowFactor))),q);
734 SetPixelGreen(image,ClampToQuantum(QuantumScale*((MagickRealType)
735 GetPixelGreen(image,q)*ShadowFactor+(MagickRealType) background*
736 (QuantumRange-ShadowFactor))),q);
737 SetPixelBlue(image,ClampToQuantum(QuantumScale*((MagickRealType)
738 GetPixelBlue(image,q)*ShadowFactor+(MagickRealType) background*
739 (QuantumRange-ShadowFactor))),q);
740 q+=GetPixelComponents(image);
742 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
744 if (image->progress_monitor != (MagickProgressMonitor) NULL)
749 proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
750 if (proceed == MagickFalse)
754 #if defined(MAGICKCORE_OPENMP_SUPPORT)
755 #pragma omp parallel for schedule(dynamic,4) shared(progress,status) omp_throttle(1)
757 for (y=(ssize_t) raise_info->height; y < (ssize_t) (image->rows-raise_info->height); y++)
765 if (status == MagickFalse)
767 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
768 if (q == (const Quantum *) NULL)
773 for (x=0; x < (ssize_t) raise_info->width; x++)
775 SetPixelRed(image,ClampToQuantum(QuantumScale*((MagickRealType)
776 GetPixelRed(image,q)*HighlightFactor+(MagickRealType) foreground*
777 (QuantumRange-HighlightFactor))),q);
778 SetPixelGreen(image,ClampToQuantum(QuantumScale*((MagickRealType)
779 GetPixelGreen(image,q)*HighlightFactor+(MagickRealType) foreground*
780 (QuantumRange-HighlightFactor))),q);
781 SetPixelBlue(image,ClampToQuantum(QuantumScale*((MagickRealType)
782 GetPixelBlue(image,q)*HighlightFactor+(MagickRealType) foreground*
783 (QuantumRange-HighlightFactor))),q);
784 q+=GetPixelComponents(image);
786 for ( ; x < (ssize_t) (image->columns-raise_info->width); x++)
787 q+=GetPixelComponents(image);
788 for ( ; x < (ssize_t) image->columns; x++)
790 SetPixelRed(image,ClampToQuantum(QuantumScale*((MagickRealType)
791 GetPixelRed(image,q)*ShadowFactor+(MagickRealType) background*
792 (QuantumRange-ShadowFactor))),q);
793 SetPixelGreen(image,ClampToQuantum(QuantumScale*((MagickRealType)
794 GetPixelGreen(image,q)*ShadowFactor+(MagickRealType) background*
795 (QuantumRange-ShadowFactor))),q);
796 SetPixelBlue(image,ClampToQuantum(QuantumScale*((MagickRealType)
797 GetPixelBlue(image,q)*ShadowFactor+(MagickRealType) background*
798 (QuantumRange-ShadowFactor))),q);
799 q+=GetPixelComponents(image);
801 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
803 if (image->progress_monitor != (MagickProgressMonitor) NULL)
808 proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
809 if (proceed == MagickFalse)
813 #if defined(MAGICKCORE_OPENMP_SUPPORT)
814 #pragma omp parallel for schedule(dynamic,4) shared(progress,status) omp_throttle(1)
816 for (y=(ssize_t) (image->rows-raise_info->height); y < (ssize_t) image->rows; y++)
824 if (status == MagickFalse)
826 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
827 if (q == (const Quantum *) NULL)
832 for (x=0; x < (ssize_t) (image->rows-y); x++)
834 SetPixelRed(image,ClampToQuantum(QuantumScale*((MagickRealType)
835 GetPixelRed(image,q)*HighlightFactor+(MagickRealType) foreground*
836 (QuantumRange-HighlightFactor))),q);
837 SetPixelGreen(image,ClampToQuantum(QuantumScale*((MagickRealType)
838 GetPixelGreen(image,q)*HighlightFactor+(MagickRealType) foreground*
839 (QuantumRange-HighlightFactor))),q);
840 SetPixelBlue(image,ClampToQuantum(QuantumScale*((MagickRealType)
841 GetPixelBlue(image,q)*HighlightFactor+(MagickRealType) foreground*
842 (QuantumRange-HighlightFactor))),q);
843 q+=GetPixelComponents(image);
845 for ( ; x < (ssize_t) (image->columns-(image->rows-y)); x++)
847 SetPixelRed(image,ClampToQuantum(QuantumScale*((MagickRealType)
848 GetPixelRed(image,q)*TroughFactor+(MagickRealType) background*
849 (QuantumRange-TroughFactor))),q);
850 SetPixelGreen(image,ClampToQuantum(QuantumScale*((MagickRealType)
851 GetPixelGreen(image,q)*TroughFactor+(MagickRealType) background*
852 (QuantumRange-TroughFactor))),q);
853 SetPixelBlue(image,ClampToQuantum(QuantumScale*((MagickRealType)
854 GetPixelBlue(image,q)*TroughFactor+(MagickRealType) background*
855 (QuantumRange-TroughFactor))),q);
856 q+=GetPixelComponents(image);
858 for ( ; x < (ssize_t) image->columns; x++)
860 SetPixelRed(image,ClampToQuantum(QuantumScale*((MagickRealType)
861 GetPixelRed(image,q)*ShadowFactor+(MagickRealType) background*
862 (QuantumRange-ShadowFactor))),q);
863 SetPixelGreen(image,ClampToQuantum(QuantumScale*((MagickRealType)
864 GetPixelGreen(image,q)*ShadowFactor+(MagickRealType) background*
865 (QuantumRange-ShadowFactor))),q);
866 SetPixelBlue(image,ClampToQuantum(QuantumScale*((MagickRealType)
867 GetPixelBlue(image,q)*ShadowFactor+(MagickRealType) background*
868 (QuantumRange-ShadowFactor))),q);
869 q+=GetPixelComponents(image);
871 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
873 if (image->progress_monitor != (MagickProgressMonitor) NULL)
878 #if defined(MAGICKCORE_OPENMP_SUPPORT)
879 #pragma omp critical (MagickCore_RaiseImage)
881 proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
882 if (proceed == MagickFalse)
886 image_view=DestroyCacheView(image_view);