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 "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/thread-private.h"
58 #include "magick/transform.h"
63 #define AccentuateModulate ScaleCharToQuantum(80)
64 #define HighlightModulate ScaleCharToQuantum(125)
65 #define ShadowModulate ScaleCharToQuantum(135)
66 #define DepthModulate ScaleCharToQuantum(185)
67 #define TroughModulate ScaleCharToQuantum(110)
70 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
74 % B o r d e r I m a g e %
78 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
80 % BorderImage() surrounds the image with a border of the color defined by
81 % the bordercolor member of the image structure. The width and height
82 % of the border are defined by the corresponding members of the border_info
85 % The format of the BorderImage method is:
87 % Image *BorderImage(const Image *image,const RectangleInfo *border_info,
88 % ExceptionInfo *exception)
90 % A description of each parameter follows:
94 % o border_info: Define the width and height of the border.
96 % o exception: return any errors or warnings in this structure.
99 MagickExport Image *BorderImage(const Image *image,
100 const RectangleInfo *border_info,ExceptionInfo *exception)
109 assert(image != (const Image *) NULL);
110 assert(image->signature == MagickSignature);
111 if (image->debug != MagickFalse)
112 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
113 assert(border_info != (RectangleInfo *) NULL);
114 frame_info.width=image->columns+(border_info->width << 1);
115 frame_info.height=image->rows+(border_info->height << 1);
116 frame_info.x=(ssize_t) border_info->width;
117 frame_info.y=(ssize_t) border_info->height;
118 frame_info.inner_bevel=0;
119 frame_info.outer_bevel=0;
120 clone_image=CloneImage(image,0,0,MagickTrue,exception);
121 if (clone_image == (Image *) NULL)
122 return((Image *) NULL);
123 clone_image->matte_color=image->border_color;
124 border_image=FrameImage(clone_image,&frame_info,exception);
125 clone_image=DestroyImage(clone_image);
126 if (border_image != (Image *) NULL)
127 border_image->matte_color=image->matte_color;
128 return(border_image);
132 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
136 % F r a m e I m a g e %
140 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
142 % FrameImage() adds a simulated three-dimensional border around the image.
143 % The color of the border is defined by the matte_color member of image.
144 % Members width and height of frame_info specify the border width of the
145 % vertical and horizontal sides of the frame. Members inner and outer
146 % indicate the width of the inner and outer shadows of the frame.
148 % The format of the FrameImage method is:
150 % Image *FrameImage(const Image *image,const FrameInfo *frame_info,
151 % ExceptionInfo *exception)
153 % A description of each parameter follows:
155 % o image: the image.
157 % o frame_info: Define the width and height of the frame and its bevels.
159 % o exception: return any errors or warnings in this structure.
162 MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
163 ExceptionInfo *exception)
165 #define FrameImageTag "Frame/Image"
201 Check frame geometry.
203 assert(image != (Image *) NULL);
204 assert(image->signature == MagickSignature);
205 if (image->debug != MagickFalse)
206 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
207 assert(frame_info != (FrameInfo *) NULL);
208 if ((frame_info->outer_bevel < 0) || (frame_info->inner_bevel < 0))
209 ThrowImageException(OptionError,"FrameIsLessThanImageSize");
210 bevel_width=(size_t) (frame_info->outer_bevel+frame_info->inner_bevel);
211 width=frame_info->width-frame_info->x-bevel_width;
212 height=frame_info->height-frame_info->y-bevel_width;
213 if ((width < image->columns) || (height < image->rows))
214 ThrowImageException(OptionError,"FrameIsLessThanImageSize");
216 Initialize framed image attributes.
218 frame_image=CloneImage(image,frame_info->width,frame_info->height,MagickTrue,
220 if (frame_image == (Image *) NULL)
221 return((Image *) NULL);
222 if (SetImageStorageClass(frame_image,DirectClass) == MagickFalse)
224 InheritException(exception,&frame_image->exception);
225 frame_image=DestroyImage(frame_image);
226 return((Image *) NULL);
228 if (frame_image->matte_color.opacity != OpaqueOpacity)
229 frame_image->matte=MagickTrue;
230 frame_image->page=image->page;
231 if ((image->page.width != 0) && (image->page.height != 0))
233 frame_image->page.width+=frame_image->columns-image->columns;
234 frame_image->page.height+=frame_image->rows-image->rows;
237 Initialize 3D effects color.
239 GetMagickPixelPacket(frame_image,&interior);
240 SetMagickPixelPacket(frame_image,&image->border_color,(IndexPacket *) NULL,
242 GetMagickPixelPacket(frame_image,&matte);
243 matte.colorspace=RGBColorspace;
244 SetMagickPixelPacket(frame_image,&image->matte_color,(IndexPacket *) NULL,
246 GetMagickPixelPacket(frame_image,&border);
247 border.colorspace=RGBColorspace;
248 SetMagickPixelPacket(frame_image,&image->border_color,(IndexPacket *) NULL,
250 GetMagickPixelPacket(frame_image,&accentuate);
251 accentuate.red=(MagickRealType) (QuantumScale*((QuantumRange-
252 AccentuateModulate)*matte.red+(QuantumRange*AccentuateModulate)));
253 accentuate.green=(MagickRealType) (QuantumScale*((QuantumRange-
254 AccentuateModulate)*matte.green+(QuantumRange*AccentuateModulate)));
255 accentuate.blue=(MagickRealType) (QuantumScale*((QuantumRange-
256 AccentuateModulate)*matte.blue+(QuantumRange*AccentuateModulate)));
257 accentuate.opacity=matte.opacity;
258 GetMagickPixelPacket(frame_image,&highlight);
259 highlight.red=(MagickRealType) (QuantumScale*((QuantumRange-
260 HighlightModulate)*matte.red+(QuantumRange*HighlightModulate)));
261 highlight.green=(MagickRealType) (QuantumScale*((QuantumRange-
262 HighlightModulate)*matte.green+(QuantumRange*HighlightModulate)));
263 highlight.blue=(MagickRealType) (QuantumScale*((QuantumRange-
264 HighlightModulate)*matte.blue+(QuantumRange*HighlightModulate)));
265 highlight.opacity=matte.opacity;
266 GetMagickPixelPacket(frame_image,&shadow);
267 shadow.red=QuantumScale*matte.red*ShadowModulate;
268 shadow.green=QuantumScale*matte.green*ShadowModulate;
269 shadow.blue=QuantumScale*matte.blue*ShadowModulate;
270 shadow.opacity=matte.opacity;
271 GetMagickPixelPacket(frame_image,&trough);
272 trough.red=QuantumScale*matte.red*TroughModulate;
273 trough.green=QuantumScale*matte.green*TroughModulate;
274 trough.blue=QuantumScale*matte.blue*TroughModulate;
275 trough.opacity=matte.opacity;
276 if (image->colorspace == CMYKColorspace)
278 ConvertRGBToCMYK(&interior);
279 ConvertRGBToCMYK(&matte);
280 ConvertRGBToCMYK(&border);
281 ConvertRGBToCMYK(&accentuate);
282 ConvertRGBToCMYK(&highlight);
283 ConvertRGBToCMYK(&shadow);
284 ConvertRGBToCMYK(&trough);
288 image_view=AcquireCacheView(image);
289 frame_view=AcquireCacheView(frame_image);
290 height=(size_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
291 frame_info->inner_bevel);
295 *restrict frame_indexes;
304 Draw top of ornamental border.
306 q=QueueCacheViewAuthenticPixels(frame_view,0,0,frame_image->columns,
308 frame_indexes=GetCacheViewAuthenticIndexQueue(frame_view);
309 if (q != (PixelPacket *) NULL)
312 Draw top of ornamental border.
314 for (y=0; y < (ssize_t) frame_info->outer_bevel; y++)
316 for (x=0; x < (ssize_t) (frame_image->columns-y); x++)
319 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
321 SetPixelPacket(frame_image,&accentuate,q,frame_indexes);
325 for ( ; x < (ssize_t) frame_image->columns; x++)
327 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
332 for (y=0; y < (ssize_t) (frame_info->y-bevel_width); y++)
334 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
336 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
340 width=frame_image->columns-2*frame_info->outer_bevel;
341 for (x=0; x < (ssize_t) width; x++)
343 SetPixelPacket(frame_image,&matte,q,frame_indexes);
347 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
349 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
354 for (y=0; y < (ssize_t) frame_info->inner_bevel; y++)
356 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
358 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
362 for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
364 SetPixelPacket(frame_image,&matte,q,frame_indexes);
368 width=image->columns+((size_t) frame_info->inner_bevel << 1)-
370 for (x=0; x < (ssize_t) width; x++)
373 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
375 SetPixelPacket(frame_image,&trough,q,frame_indexes);
379 for ( ; x < (ssize_t) (image->columns+2*frame_info->inner_bevel); x++)
381 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
385 width=frame_info->width-frame_info->x-image->columns-bevel_width;
386 for (x=0; x < (ssize_t) width; x++)
388 SetPixelPacket(frame_image,&matte,q,frame_indexes);
392 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
394 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
399 (void) SyncCacheViewAuthenticPixels(frame_view,exception);
403 Draw sides of ornamental border.
405 #if defined(MAGICKCORE_OPENMP_SUPPORT)
406 #pragma omp parallel for schedule(dynamic,4) shared(progress,status) omp_throttle(1)
408 for (y=0; y < (ssize_t) image->rows; y++)
411 *restrict frame_indexes;
420 Initialize scanline with matte color.
422 if (status == MagickFalse)
424 q=QueueCacheViewAuthenticPixels(frame_view,0,frame_info->y+y,
425 frame_image->columns,1,exception);
426 if (q == (PixelPacket *) NULL)
431 frame_indexes=GetCacheViewAuthenticIndexQueue(frame_view);
432 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
434 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
438 for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
440 SetPixelPacket(frame_image,&matte,q,frame_indexes);
444 for (x=0; x < (ssize_t) frame_info->inner_bevel; x++)
446 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
451 Set frame interior to interior color.
453 if ((image->compose != CopyCompositeOp) &&
454 ((image->compose != OverCompositeOp) || (image->matte != MagickFalse)))
455 for (x=0; x < (ssize_t) image->columns; x++)
457 SetPixelPacket(frame_image,&interior,q,frame_indexes);
463 register const IndexPacket
466 register const PixelPacket
469 p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
470 if (p == (const PixelPacket *) NULL)
475 indexes=GetCacheViewVirtualIndexQueue(image_view);
476 (void) CopyMagickMemory(q,p,image->columns*sizeof(*p));
477 if ((image->colorspace == CMYKColorspace) &&
478 (frame_image->colorspace == CMYKColorspace))
480 (void) CopyMagickMemory(frame_indexes,indexes,image->columns*
482 frame_indexes+=image->columns;
486 for (x=0; x < (ssize_t) frame_info->inner_bevel; x++)
488 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
492 width=frame_info->width-frame_info->x-image->columns-bevel_width;
493 for (x=0; x < (ssize_t) width; x++)
495 SetPixelPacket(frame_image,&matte,q,frame_indexes);
499 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
501 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
505 if (SyncCacheViewAuthenticPixels(frame_view,exception) == MagickFalse)
507 if (image->progress_monitor != (MagickProgressMonitor) NULL)
512 #if defined(MAGICKCORE_OPENMP_SUPPORT)
513 #pragma omp critical (MagickCore_FrameImage)
515 proceed=SetImageProgress(image,FrameImageTag,progress++,image->rows);
516 if (proceed == MagickFalse)
520 height=(size_t) (frame_info->inner_bevel+frame_info->height-
521 frame_info->y-image->rows-bevel_width+frame_info->outer_bevel);
525 *restrict frame_indexes;
534 Draw bottom of ornamental border.
536 q=QueueCacheViewAuthenticPixels(frame_view,0,(ssize_t) (frame_image->rows-
537 height),frame_image->columns,height,exception);
538 if (q != (PixelPacket *) NULL)
541 Draw bottom of ornamental border.
543 frame_indexes=GetCacheViewAuthenticIndexQueue(frame_view);
544 for (y=frame_info->inner_bevel-1; y >= 0; y--)
546 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
548 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
552 for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
554 SetPixelPacket(frame_image,&matte,q,frame_indexes);
558 for (x=0; x < y; x++)
560 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
564 for ( ; x < (ssize_t) (image->columns+2*frame_info->inner_bevel); x++)
566 if (x >= (ssize_t) (image->columns+2*frame_info->inner_bevel-y))
567 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
569 SetPixelPacket(frame_image,&accentuate,q,frame_indexes);
573 width=frame_info->width-frame_info->x-image->columns-bevel_width;
574 for (x=0; x < (ssize_t) width; x++)
576 SetPixelPacket(frame_image,&matte,q,frame_indexes);
580 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
582 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
587 height=frame_info->height-frame_info->y-image->rows-bevel_width;
588 for (y=0; y < (ssize_t) height; y++)
590 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
592 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
596 width=frame_image->columns-2*frame_info->outer_bevel;
597 for (x=0; x < (ssize_t) width; x++)
599 SetPixelPacket(frame_image,&matte,q,frame_indexes);
603 for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
605 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
610 for (y=frame_info->outer_bevel-1; y >= 0; y--)
612 for (x=0; x < y; x++)
614 SetPixelPacket(frame_image,&highlight,q,frame_indexes);
618 for ( ; x < (ssize_t) frame_image->columns; x++)
620 if (x >= (ssize_t) (frame_image->columns-y))
621 SetPixelPacket(frame_image,&shadow,q,frame_indexes);
623 SetPixelPacket(frame_image,&trough,q,frame_indexes);
628 (void) SyncCacheViewAuthenticPixels(frame_view,exception);
631 frame_view=DestroyCacheView(frame_view);
632 image_view=DestroyCacheView(image_view);
633 if ((image->compose != CopyCompositeOp) &&
634 ((image->compose != OverCompositeOp) || (image->matte != MagickFalse)))
636 x=(ssize_t) (frame_info->outer_bevel+(frame_info->x-bevel_width)+
637 frame_info->inner_bevel);
638 y=(ssize_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
639 frame_info->inner_bevel);
640 (void) CompositeImage(frame_image,image->compose,image,x,y);
646 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
650 % R a i s e I m a g e %
654 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
656 % RaiseImage() creates a simulated three-dimensional button-like effect
657 % by lightening and darkening the edges of the image. Members width and
658 % height of raise_info define the width of the vertical and horizontal
659 % edge of the effect.
661 % The format of the RaiseImage method is:
663 % MagickBooleanType RaiseImage(const Image *image,
664 % const RectangleInfo *raise_info,const MagickBooleanType raise)
666 % A description of each parameter follows:
668 % o image: the image.
670 % o raise_info: Define the width and height of the raise area.
672 % o raise: A value other than zero creates a 3-D raise effect,
673 % otherwise it has a lowered effect.
676 MagickExport MagickBooleanType RaiseImage(Image *image,
677 const RectangleInfo *raise_info,const MagickBooleanType raise)
679 #define AccentuateFactor ScaleCharToQuantum(135)
680 #define HighlightFactor ScaleCharToQuantum(190)
681 #define ShadowFactor ScaleCharToQuantum(190)
682 #define RaiseImageTag "Raise/Image"
683 #define TroughFactor ScaleCharToQuantum(135)
704 assert(image != (Image *) NULL);
705 assert(image->signature == MagickSignature);
706 if (image->debug != MagickFalse)
707 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
708 assert(raise_info != (RectangleInfo *) NULL);
709 if ((image->columns <= (raise_info->width << 1)) ||
710 (image->rows <= (raise_info->height << 1)))
711 ThrowBinaryException(OptionError,"ImageSizeMustExceedBevelWidth",
713 foreground=(Quantum) QuantumRange;
714 background=(Quantum) 0;
715 if (raise == MagickFalse)
717 foreground=(Quantum) 0;
718 background=(Quantum) QuantumRange;
720 if (SetImageStorageClass(image,DirectClass) == MagickFalse)
727 exception=(&image->exception);
728 image_view=AcquireCacheView(image);
729 #if defined(MAGICKCORE_OPENMP_SUPPORT)
730 #pragma omp parallel for schedule(dynamic,4) shared(progress,status) omp_throttle(1)
732 for (y=0; y < (ssize_t) raise_info->height; y++)
740 if (status == MagickFalse)
742 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
743 if (q == (PixelPacket *) NULL)
748 for (x=0; x < y; x++)
750 SetRedPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
751 GetRedPixelComponent(q)*HighlightFactor+(MagickRealType) foreground*
752 (QuantumRange-HighlightFactor))));
753 SetGreenPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
754 GetGreenPixelComponent(q)*HighlightFactor+(MagickRealType) foreground*
755 (QuantumRange-HighlightFactor))));
756 SetBluePixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
757 GetBluePixelComponent(q)*HighlightFactor+(MagickRealType) foreground*
758 (QuantumRange-HighlightFactor))));
761 for ( ; x < (ssize_t) (image->columns-y); x++)
763 SetRedPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
764 GetRedPixelComponent(q)*AccentuateFactor+(MagickRealType) foreground*
765 (QuantumRange-AccentuateFactor))));
766 SetGreenPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
767 GetGreenPixelComponent(q)*AccentuateFactor+(MagickRealType) foreground*
768 (QuantumRange-AccentuateFactor))));
769 SetBluePixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
770 GetBluePixelComponent(q)*AccentuateFactor+(MagickRealType) foreground*
771 (QuantumRange-AccentuateFactor))));
774 for ( ; x < (ssize_t) image->columns; x++)
776 SetRedPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
777 GetRedPixelComponent(q)*ShadowFactor+(MagickRealType) background*
778 (QuantumRange-ShadowFactor))));
779 SetGreenPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
780 GetGreenPixelComponent(q)*ShadowFactor+(MagickRealType) background*
781 (QuantumRange-ShadowFactor))));
782 SetBluePixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
783 GetBluePixelComponent(q)*ShadowFactor+(MagickRealType) background*
784 (QuantumRange-ShadowFactor))));
787 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
789 if (image->progress_monitor != (MagickProgressMonitor) NULL)
794 proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
795 if (proceed == MagickFalse)
799 #if defined(MAGICKCORE_OPENMP_SUPPORT)
800 #pragma omp parallel for schedule(dynamic,4) shared(progress,status) omp_throttle(1)
802 for (y=(ssize_t) raise_info->height; y < (ssize_t) (image->rows-raise_info->height); y++)
810 if (status == MagickFalse)
812 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
813 if (q == (PixelPacket *) NULL)
818 for (x=0; x < (ssize_t) raise_info->width; x++)
820 SetRedPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
821 GetRedPixelComponent(q)*HighlightFactor+(MagickRealType) foreground*
822 (QuantumRange-HighlightFactor))));
823 SetGreenPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
824 GetGreenPixelComponent(q)*HighlightFactor+(MagickRealType) foreground*
825 (QuantumRange-HighlightFactor))));
826 SetBluePixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
827 GetBluePixelComponent(q)*HighlightFactor+(MagickRealType) foreground*
828 (QuantumRange-HighlightFactor))));
831 for ( ; x < (ssize_t) (image->columns-raise_info->width); x++)
833 for ( ; x < (ssize_t) image->columns; x++)
835 SetRedPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
836 GetRedPixelComponent(q)*ShadowFactor+(MagickRealType) background*
837 (QuantumRange-ShadowFactor))));
838 SetGreenPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
839 GetGreenPixelComponent(q)*ShadowFactor+(MagickRealType) background*
840 (QuantumRange-ShadowFactor))));
841 SetBluePixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
842 GetBluePixelComponent(q)*ShadowFactor+(MagickRealType) background*
843 (QuantumRange-ShadowFactor))));
846 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
848 if (image->progress_monitor != (MagickProgressMonitor) NULL)
853 proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
854 if (proceed == MagickFalse)
858 #if defined(MAGICKCORE_OPENMP_SUPPORT)
859 #pragma omp parallel for schedule(dynamic,4) shared(progress,status) omp_throttle(1)
861 for (y=(ssize_t) (image->rows-raise_info->height); y < (ssize_t) image->rows; y++)
869 if (status == MagickFalse)
871 q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
872 if (q == (PixelPacket *) NULL)
877 for (x=0; x < (ssize_t) (image->rows-y); x++)
879 SetRedPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
880 GetRedPixelComponent(q)*HighlightFactor+(MagickRealType) foreground*
881 (QuantumRange-HighlightFactor))));
882 SetGreenPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
883 GetGreenPixelComponent(q)*HighlightFactor+(MagickRealType) foreground*
884 (QuantumRange-HighlightFactor))));
885 SetBluePixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
886 GetBluePixelComponent(q)*HighlightFactor+(MagickRealType) foreground*
887 (QuantumRange-HighlightFactor))));
890 for ( ; x < (ssize_t) (image->columns-(image->rows-y)); x++)
892 SetRedPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
893 GetRedPixelComponent(q)*TroughFactor+(MagickRealType) background*
894 (QuantumRange-TroughFactor))));
895 SetGreenPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
896 GetGreenPixelComponent(q)*TroughFactor+(MagickRealType) background*
897 (QuantumRange-TroughFactor))));
898 SetBluePixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
899 GetBluePixelComponent(q)*TroughFactor+(MagickRealType) background*
900 (QuantumRange-TroughFactor))));
903 for ( ; x < (ssize_t) image->columns; x++)
905 SetRedPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
906 GetRedPixelComponent(q)*ShadowFactor+(MagickRealType) background*
907 (QuantumRange-ShadowFactor))));
908 SetGreenPixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
909 GetGreenPixelComponent(q)*ShadowFactor+(MagickRealType) background*
910 (QuantumRange-ShadowFactor))));
911 SetBluePixelComponent(q,ClampToQuantum(QuantumScale*((MagickRealType)
912 GetBluePixelComponent(q)*ShadowFactor+(MagickRealType) background*
913 (QuantumRange-ShadowFactor))));
916 if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
918 if (image->progress_monitor != (MagickProgressMonitor) NULL)
923 #if defined(MAGICKCORE_OPENMP_SUPPORT)
924 #pragma omp critical (MagickCore_RaiseImage)
926 proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
927 if (proceed == MagickFalse)
931 image_view=DestroyCacheView(image_view);