root / ImageMagick / branches / ImageMagick-6.3.5 / magick / decorate.c

Revision 8037, 27.5 kB (checked in by cristy, 14 months ago)
Line 
1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3%                                                                             %
4%                                                                             %
5%                                                                             %
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           %
11%                                                                             %
12%                                                                             %
13%                     ImageMagick Image Decoration Methods                    %
14%                                                                             %
15%                                Software Design                              %
16%                                  John Cristy                                %
17%                                   July 1992                                 %
18%                                                                             %
19%                                                                             %
20%  Copyright 1999-2007 ImageMagick Studio LLC, a non-profit organization      %
21%  dedicated to making software imaging solutions freely available.           %
22%                                                                             %
23%  You may not use this file except in compliance with the License.  You may  %
24%  obtain a copy of the License at                                            %
25%                                                                             %
26%    http://www.imagemagick.org/script/license.php                            %
27%                                                                             %
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.                                             %
33%                                                                             %
34%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35%
36%
37%
38*/
39
40/*
41  Include declarations.
42*/
43#include "magick/studio.h"
44#include "magick/color-private.h"
45#include "magick/colorspace-private.h"
46#include "magick/composite.h"
47#include "magick/decorate.h"
48#include "magick/exception.h"
49#include "magick/exception-private.h"
50#include "magick/image.h"
51#include "magick/memory_.h"
52#include "magick/monitor.h"
53#include "magick/pixel-private.h"
54#include "magick/quantum.h"
55
56/*
57  Define declarations.
58*/
59#define AccentuateModulate  ScaleCharToQuantum(80)
60#define HighlightModulate  ScaleCharToQuantum(125)
61#define ShadowModulate  ScaleCharToQuantum(135)
62#define DepthModulate  ScaleCharToQuantum(185)
63#define TroughModulate  ScaleCharToQuantum(110)
64
65/*
66%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
67%                                                                             %
68%                                                                             %
69%                                                                             %
70%   B o r d e r I m a g e                                                     %
71%                                                                             %
72%                                                                             %
73%                                                                             %
74%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
75%
76%  BorderImage() surrounds the image with a border of the color defined by
77%  the bordercolor member of the image structure.  The width and height
78%  of the border are defined by the corresponding members of the border_info
79%  structure.
80%
81%  The format of the BorderImage method is:
82%
83%      Image *BorderImage(const Image *image,const RectangleInfo *border_info,
84%        ExceptionInfo *exception)
85%
86%  A description of each parameter follows:
87%
88%    o image: The image.
89%
90%    o border_info:  Define the width and height of the border.
91%
92%    o exception: Return any errors or warnings in this structure.
93%
94%
95*/
96MagickExport Image *BorderImage(const Image *image,
97  const RectangleInfo *border_info,ExceptionInfo *exception)
98{
99  Image
100    *border_image,
101    *clone_image;
102
103  FrameInfo
104    frame_info;
105
106  assert(image != (const Image *) NULL);
107  assert(image->signature == MagickSignature);
108  if (image->debug != MagickFalse)
109    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
110  assert(border_info != (RectangleInfo *) NULL);
111  frame_info.width=image->columns+(border_info->width << 1);
112  frame_info.height=image->rows+(border_info->height << 1);
113  frame_info.x=(long) border_info->width;
114  frame_info.y=(long) border_info->height;
115  frame_info.inner_bevel=0;
116  frame_info.outer_bevel=0;
117  clone_image=CloneImage(image,0,0,MagickTrue,exception);
118  if (clone_image == (Image *) NULL)
119    return((Image *) NULL);
120  clone_image->matte_color=image->border_color;
121  border_image=FrameImage(clone_image,&frame_info,exception);
122  clone_image=DestroyImage(clone_image);
123  if (border_image != (Image *) NULL)
124    border_image->matte_color=image->matte_color;
125  return(border_image);
126}
127
128/*
129%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
130%                                                                             %
131%                                                                             %
132%                                                                             %
133%   F r a m e I m a g e                                                       %
134%                                                                             %
135%                                                                             %
136%                                                                             %
137%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
138%
139%  FrameImage() adds a simulated three-dimensional border around the image.
140%  The color of the border is defined by the matte_color member of image.
141%  Members width and height of frame_info specify the border width of the
142%  vertical and horizontal sides of the frame.  Members inner and outer
143%  indicate the width of the inner and outer shadows of the frame.
144%
145%  The format of the FrameImage method is:
146%
147%      Image *FrameImage(const Image *image,const FrameInfo *frame_info,
148%        ExceptionInfo *exception)
149%
150%  A description of each parameter follows:
151%
152%    o image: The image.
153%
154%    o frame_info: Define the width and height of the frame and its bevels.
155%
156%    o exception: Return any errors or warnings in this structure.
157%
158%
159*/
160MagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
161  ExceptionInfo *exception)
162{
163#define FrameImageTag  "Frame/Image"
164
165  Image
166    *frame_image;
167
168  long
169    y;
170
171  MagickBooleanType
172    status;
173
174  MagickPixelPacket
175    accentuate,
176    border,
177    highlight,
178    interior,
179    matte,
180    shadow,
181    trough;
182
183  register IndexPacket
184    *frame_indexes;
185
186  register long
187    x;
188
189  register PixelPacket
190    *q;
191
192  unsigned long
193    bevel_width,
194    height,
195    width;
196
197  /*
198    Check frame geometry.
199  */
200  assert(image != (Image *) NULL);
201  assert(image->signature == MagickSignature);
202  if (image->debug != MagickFalse)
203    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
204  assert(frame_info != (FrameInfo *) NULL);
205  bevel_width=(unsigned long) (frame_info->outer_bevel+frame_info->inner_bevel);
206  width=frame_info->width-frame_info->x-bevel_width;
207  height=frame_info->height-frame_info->y-bevel_width;
208  if ((width < image->columns) || (height < image->rows))
209    ThrowImageException(OptionError,"FrameIsLessThanImageSize");
210  /*
211    Initialize framed image attributes.
212  */
213  frame_image=CloneImage(image,frame_info->width,frame_info->height,MagickTrue,
214    exception);
215  if (frame_image == (Image *) NULL)
216    return((Image *) NULL);
217  if (SetImageStorageClass(frame_image,DirectClass) == MagickFalse)
218    {
219      InheritException(exception,&frame_image->exception);
220      frame_image=DestroyImage(frame_image);
221      return((Image *) NULL);
222    }
223  if (frame_image->matte_color.opacity != OpaqueOpacity)
224    frame_image->matte=MagickTrue;
225  frame_image->page=image->page;
226  if ((image->page.width != 0) && (image->page.height != 0))
227    {
228      frame_image->page.width+=frame_image->columns-image->columns;
229      frame_image->page.height+=frame_image->rows-image->rows;
230    }
231  /*
232    Initialize 3D effects color.
233  */
234  GetMagickPixelPacket(frame_image,&interior);
235  SetMagickPixelPacket(frame_image,&image->border_color,(IndexPacket *) NULL,
236    &interior);
237  GetMagickPixelPacket(frame_image,&matte);
238  matte.colorspace=RGBColorspace;
239  SetMagickPixelPacket(frame_image,&image->matte_color,(IndexPacket *) NULL,
240    &matte);
241  GetMagickPixelPacket(frame_image,&border);
242  border.colorspace=RGBColorspace;
243  SetMagickPixelPacket(frame_image,&image->border_color,(IndexPacket *) NULL,
244    &border);
245  GetMagickPixelPacket(frame_image,&accentuate);
246  accentuate.red=(MagickRealType) (QuantumScale*((QuantumRange-
247    AccentuateModulate)*matte.red+(QuantumRange*AccentuateModulate)));
248  accentuate.green=(MagickRealType) (QuantumScale*((QuantumRange-
249    AccentuateModulate)*matte.green+(QuantumRange*AccentuateModulate)));
250  accentuate.blue=(MagickRealType) (QuantumScale*((QuantumRange-
251    AccentuateModulate)*matte.blue+(QuantumRange*AccentuateModulate)));
252  accentuate.opacity=matte.opacity;
253  GetMagickPixelPacket(frame_image,&highlight);
254  highlight.red=(MagickRealType) (QuantumScale*((QuantumRange-
255    HighlightModulate)*matte.red+(QuantumRange*HighlightModulate)));
256  highlight.green=(MagickRealType) (QuantumScale*((QuantumRange-
257    HighlightModulate)*matte.green+(QuantumRange*HighlightModulate)));
258  highlight.blue=(MagickRealType) (QuantumScale*((QuantumRange-
259    HighlightModulate)*matte.blue+(QuantumRange*HighlightModulate)));
260  highlight.opacity=matte.opacity;
261  GetMagickPixelPacket(frame_image,&shadow);
262  shadow.red=QuantumScale*matte.red*ShadowModulate;
263  shadow.green=QuantumScale*matte.green*ShadowModulate;
264  shadow.blue=QuantumScale*matte.blue*ShadowModulate;
265  shadow.opacity=matte.opacity;
266  GetMagickPixelPacket(frame_image,&trough);
267  trough.red=QuantumScale*matte.red*TroughModulate;
268  trough.green=QuantumScale*matte.green*TroughModulate;
269  trough.blue=QuantumScale*matte.blue*TroughModulate;
270  trough.opacity=matte.opacity;
271  if (image->colorspace == CMYKColorspace)
272    {
273      ConvertRGBToCMYK(&interior);
274      ConvertRGBToCMYK(&matte);
275      ConvertRGBToCMYK(&border);
276      ConvertRGBToCMYK(&accentuate);
277      ConvertRGBToCMYK(&highlight);
278      ConvertRGBToCMYK(&shadow);
279      ConvertRGBToCMYK(&trough);
280    }
281  height=(unsigned long) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
282    frame_info->inner_bevel);
283  q=SetImagePixels(frame_image,0,0,frame_image->columns,height);
284  frame_indexes=GetIndexes(frame_image);
285  if (q != (PixelPacket *) NULL)
286    {
287      /*
288        Draw top of ornamental border.
289      */
290      for (y=0; y < (long) frame_info->outer_bevel; y++)
291      {
292        for (x=0; x < (long) (frame_image->columns-y); x++)
293        {
294          if (x < y)
295            SetPixelPacket(frame_image,&highlight,q,frame_indexes);
296          else
297            SetPixelPacket(frame_image,&accentuate,q,frame_indexes);
298          q++;
299          frame_indexes++;
300        }
301        for ( ; x < (long) frame_image->columns; x++)
302        {
303          SetPixelPacket(frame_image,&shadow,q,frame_indexes);
304          q++;
305          frame_indexes++;
306        }
307      }
308      for (y=0; y < (long) (frame_info->y-bevel_width); y++)
309      {
310        for (x=0; x < (long) frame_info->outer_bevel; x++)
311        {
312          SetPixelPacket(frame_image,&highlight,q,frame_indexes);
313          q++;
314          frame_indexes++;
315        }
316        width=frame_image->columns-2*frame_info->outer_bevel;
317        for (x=0; x < (long) width; x++)
318        {
319          SetPixelPacket(frame_image,&matte,q,frame_indexes);
320          q++;
321          frame_indexes++;
322        }
323        for (x=0; x < (long) frame_info->outer_bevel; x++)
324        {
325          SetPixelPacket(frame_image,&shadow,q,frame_indexes);
326          q++;
327          frame_indexes++;
328        }
329      }
330      for (y=0; y < (long) frame_info->inner_bevel; y++)
331      {
332        for (x=0; x < (long) frame_info->outer_bevel; x++)
333        {
334          SetPixelPacket(frame_image,&highlight,q,frame_indexes);
335          q++;
336          frame_indexes++;
337        }
338        for (x=0; x < (long) (frame_info->x-bevel_width); x++)
339        {
340          SetPixelPacket(frame_image,&matte,q,frame_indexes);
341          q++;
342          frame_indexes++;
343        }
344        width=image->columns+((unsigned long) frame_info->inner_bevel << 1)-y;
345        for (x=0; x < (long) width; x++)
346        {
347          if (x < y)
348            SetPixelPacket(frame_image,&shadow,q,frame_indexes);
349          else
350            SetPixelPacket(frame_image,&trough,q,frame_indexes);
351          q++;
352          frame_indexes++;
353        }
354        for ( ; x < (long) (image->columns+2*frame_info->inner_bevel); x++)
355        {
356          SetPixelPacket(frame_image,&highlight,q,frame_indexes);
357          q++;
358          frame_indexes++;
359        }
360        width=frame_info->width-frame_info->x-image->columns-bevel_width;
361        for (x=0; x < (long) width; x++)
362        {
363          SetPixelPacket(frame_image,&matte,q,frame_indexes);
364          q++;
365          frame_indexes++;
366        }
367        for (x=0; x < (long) frame_info->outer_bevel; x++)
368        {
369          SetPixelPacket(frame_image,&shadow,q,frame_indexes);
370          q++;
371          frame_indexes++;
372        }
373      }
374      (void) SyncImagePixels(frame_image);
375    }
376  /*
377    Draw sides of ornamental border.
378  */
379  for (y=0; y < (long) image->rows; y++)
380  {
381    /*
382      Initialize scanline with matte color.
383    */
384    q=SetImagePixels(frame_image,0,frame_info->y+y,frame_image->columns,1);
385    if (q == (PixelPacket *) NULL)
386      break;
387    frame_indexes=GetIndexes(frame_image);
388    for (x=0; x < (long) frame_info->outer_bevel; x++)
389    {
390      SetPixelPacket(frame_image,&highlight,q,frame_indexes);
391      q++;
392      frame_indexes++;
393    }
394    for (x=0; x < (long) (frame_info->x-bevel_width); x++)
395    {
396      SetPixelPacket(frame_image,&matte,q,frame_indexes);
397      q++;
398      frame_indexes++;
399    }
400    for (x=0; x < (long) frame_info->inner_bevel; x++)
401    {
402      SetPixelPacket(frame_image,&shadow,q,frame_indexes);
403      q++;
404      frame_indexes++;
405    }
406    /*
407      Set frame interior to interior color.
408    */
409    for (x=0; x < (long) image->columns; x++)
410    {
411      SetPixelPacket(frame_image,&interior,q,frame_indexes);
412      q++;
413      frame_indexes++;
414    }
415    for (x=0; x < (long) frame_info->inner_bevel; x++)
416    {
417      SetPixelPacket(frame_image,&highlight,q,frame_indexes);
418      q++;
419      frame_indexes++;
420    }
421    width=frame_info->width-frame_info->x-image->columns-bevel_width;
422    for (x=0; x < (long) width; x++)
423    {
424      SetPixelPacket(frame_image,&matte,q,frame_indexes);
425      q++;
426      frame_indexes++;
427    }
428    for (x=0; x < (long) frame_info->outer_bevel; x++)
429    {
430      SetPixelPacket(frame_image,&shadow,q,frame_indexes);
431      q++;
432      frame_indexes++;
433    }
434    if (SyncImagePixels(frame_image) == MagickFalse)
435      break;
436    if ((image->progress_monitor != (MagickProgressMonitor) NULL) &&
437        (QuantumTick(y,image->rows) != MagickFalse))
438      {
439        status=image->progress_monitor(FrameImageTag,y,image->rows,
440          image->client_data);
441        if (status == MagickFalse)
442          break;
443      }
444  }
445  height=(unsigned long) (frame_info->inner_bevel+frame_info->height-
446    frame_info->y-image->rows-bevel_width+frame_info->outer_bevel);
447  q=SetImagePixels(frame_image,0,(long) (frame_image->rows-height),
448    frame_image->columns,height);
449  if (q != (PixelPacket *) NULL)
450    {
451      /*
452        Draw bottom of ornamental border.
453      */
454      frame_indexes=GetIndexes(frame_image);
455      for (y=frame_info->inner_bevel-1; y >= 0; y--)
456      {
457        for (x=0; x < (long) frame_info->outer_bevel; x++)
458        {
459          SetPixelPacket(frame_image,&highlight,q,frame_indexes);
460          q++;
461          frame_indexes++;
462        }
463        for (x=0; x < (long) (frame_info->x-bevel_width); x++)
464        {
465          SetPixelPacket(frame_image,&matte,q,frame_indexes);
466          q++;
467          frame_indexes++;
468        }
469        for (x=0; x < y; x++)
470        {
471          SetPixelPacket(frame_image,&shadow,q,frame_indexes);
472          q++;
473          frame_indexes++;
474        }
475        for ( ; x < (long) (image->columns+2*frame_info->inner_bevel); x++)
476        {
477          if (x >= (long) (image->columns+2*frame_info->inner_bevel-y))
478            SetPixelPacket(frame_image,&highlight,q,frame_indexes);
479          else
480            SetPixelPacket(frame_image,&accentuate,q,frame_indexes);
481          q++;
482          frame_indexes++;
483        }
484        width=frame_info->width-frame_info->x-image->columns-bevel_width;
485        for (x=0; x < (long) width; x++)
486        {
487          SetPixelPacket(frame_image,&matte,q,frame_indexes);
488          q++;
489          frame_indexes++;
490        }
491        for (x=0; x < (long) frame_info->outer_bevel; x++)
492        {
493          SetPixelPacket(frame_image,&shadow,q,frame_indexes);
494          q++;
495          frame_indexes++;
496        }
497      }
498      height=frame_info->height-frame_info->y-image->rows-bevel_width;
499      for (y=0; y < (long) height; y++)
500      {
501        for (x=0; x < (long) frame_info->outer_bevel; x++)
502        {
503          SetPixelPacket(frame_image,&highlight,q,frame_indexes);
504          q++;
505          frame_indexes++;
506        }
507        width=frame_image->columns-2*frame_info->outer_bevel;
508        for (x=0; x < (long) width; x++)
509        {
510          SetPixelPacket(frame_image,&matte,q,frame_indexes);
511          q++;
512          frame_indexes++;
513        }
514        for (x=0; x < (long) frame_info->outer_bevel; x++)
515        {
516          SetPixelPacket(frame_image,&shadow,q,frame_indexes);
517          q++;
518          frame_indexes++;
519        }
520      }
521      for (y=frame_info->outer_bevel-1; y >= 0; y--)
522      {
523        for (x=0; x < y; x++)
524        {
525          SetPixelPacket(frame_image,&highlight,q,frame_indexes);
526          q++;
527          frame_indexes++;
528        }
529        for ( ; x < (long) frame_image->columns; x++)
530        {
531          if (x >= (long) (frame_image->columns-y))
532            SetPixelPacket(frame_image,&shadow,q,frame_indexes);
533          else
534            SetPixelPacket(frame_image,&trough,q,frame_indexes);
535          q++;
536          frame_indexes++;
537        }
538      }
539      (void) SyncImagePixels(frame_image);
540    }
541  x=(long) (frame_info->outer_bevel+(frame_info->x-bevel_width)+
542    frame_info->inner_bevel);
543  y=(long) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
544    frame_info->inner_bevel);
545  (void) CompositeImage(frame_image,image->compose,image,x,y);
546  return(frame_image);
547}
548
549/*
550%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
551%                                                                             %
552%                                                                             %
553%                                                                             %
554%   R a i s e I m a g e                                                       %
555%                                                                             %
556%                                                                             %
557%                                                                             %
558%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
559%
560%  RaiseImage() creates a simulated three-dimensional button-like effect
561%  by lightening and darkening the edges of the image.  Members width and
562%  height of raise_info define the width of the vertical and horizontal
563%  edge of the effect.
564%
565%  The format of the RaiseImage method is:
566%
567%      MagickBooleanType RaiseImage(const Image *image,
568%        const RectangleInfo *raise_info,const MagickBooleanType raise)
569%
570%  A description of each parameter follows:
571%
572%    o image: The image.
573%
574%    o raise_info: Define the width and height of the raise area.
575%
576%    o raise: A value other than zero creates a 3-D raise effect,
577%      otherwise it has a lowered effect.
578%
579%
580*/
581MagickExport MagickBooleanType RaiseImage(Image *image,
582  const RectangleInfo *raise_info,const MagickBooleanType raise)
583{
584#define AccentuateFactor  ScaleCharToQuantum(135)
585#define HighlightFactor  ScaleCharToQuantum(190)
586#define ShadowFactor  ScaleCharToQuantum(190)
587#define RaiseImageTag  "Raise/Image"
588#define TroughFactor  ScaleCharToQuantum(135)
589
590  MagickBooleanType
591    status;
592
593  Quantum
594    foreground,
595    background;
596
597  long
598    y;
599
600  register long
601    x;
602
603  register PixelPacket
604    *q;
605
606  assert(image != (Image *) NULL);
607  assert(image->signature == MagickSignature);
608  if (image->debug != MagickFalse)
609    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
610  assert(raise_info != (RectangleInfo *) NULL);
611  if ((image->columns <= (raise_info->width << 1)) ||
612      (image->rows <= (raise_info->height << 1)))
613    ThrowBinaryException(OptionError,"ImageSizeMustExceedBevelWidth",
614      image->filename);
615  foreground=(Quantum) QuantumRange;
616  background=(Quantum) 0;
617  if (raise == MagickFalse)
618    {
619      foreground=(Quantum) 0;
620      background=(Quantum) QuantumRange;
621    }
622  if (SetImageStorageClass(image,DirectClass) == MagickFalse)
623    return(MagickFalse);
624  for (y=0; y < (long) raise_info->height; y++)
625  {
626    q=GetImagePixels(image,0,y,image->columns,1);
627    if (q == (PixelPacket *) NULL)
628      break;
629    for (x=0; x < y; x++)
630    {
631      q->red=RoundToQuantum(QuantumScale*((MagickRealType) q->red*
632        HighlightFactor+(MagickRealType) foreground*(QuantumRange-
633        HighlightFactor)));
634      q->green=RoundToQuantum(QuantumScale*((MagickRealType) q->green*
635        HighlightFactor+(MagickRealType) foreground*(QuantumRange-
636        HighlightFactor)));
637      q->blue=RoundToQuantum(QuantumScale*((MagickRealType) q->blue*
638        HighlightFactor+(MagickRealType) foreground*(QuantumRange-
639        HighlightFactor)));
640      q++;
641    }
642    for ( ; x < (long) (image->columns-y); x++)
643    {
644      q->red=RoundToQuantum(QuantumScale*((MagickRealType) q->red*
645        AccentuateFactor+(MagickRealType) foreground*(QuantumRange-
646        AccentuateFactor)));
647      q->green=RoundToQuantum(QuantumScale*((MagickRealType) q->green*
648        AccentuateFactor+(MagickRealType) foreground*(QuantumRange-
649        AccentuateFactor)));
650      q->blue=RoundToQuantum(QuantumScale*((MagickRealType) q->blue*
651        AccentuateFactor+(MagickRealType) foreground*(QuantumRange-
652        AccentuateFactor)));
653      q++;
654    }
655    for ( ; x < (long) image->columns; x++)
656    {
657      q->red=RoundToQuantum(QuantumScale*((MagickRealType) q->red*ShadowFactor+
658        (MagickRealType) background*(QuantumRange-ShadowFactor)));
659      q->green=RoundToQuantum(QuantumScale*((MagickRealType) q->green*
660        ShadowFactor+(MagickRealType) background*(QuantumRange-ShadowFactor)));
661      q->blue=RoundToQuantum(QuantumScale*((MagickRealType) q->blue*
662        ShadowFactor+(MagickRealType) background*(QuantumRange-ShadowFactor)));
663      q++;
664    }
665    if (SyncImagePixels(image) == MagickFalse)
666      break;
667    if ((image->progress_monitor != (MagickProgressMonitor) NULL) &&
668        (QuantumTick(y,image->rows) != MagickFalse))
669      {
670        status=image->progress_monitor(RaiseImageTag,y,image->rows,
671          image->client_data);
672        if (status == MagickFalse)
673          break;
674      }
675  }
676  for ( ; y < (long) (image->rows-raise_info->height); y++)
677  {
678    q=GetImagePixels(image,0,y,image->columns,1);
679    if (q == (PixelPacket *) NULL)
680      break;
681    for (x=0; x < (long) raise_info->width; x++)
682    {
683      q->red=RoundToQuantum(QuantumScale*((MagickRealType) q->red*
684        HighlightFactor+(MagickRealType) foreground*(QuantumRange-
685        HighlightFactor)));
686      q->green=RoundToQuantum(QuantumScale*((MagickRealType) q->green*
687        HighlightFactor+(MagickRealType) foreground*(QuantumRange-
688        HighlightFactor)));
689      q->blue=RoundToQuantum(QuantumScale*((MagickRealType) q->blue*
690        HighlightFactor+(MagickRealType) foreground*(QuantumRange-
691        HighlightFactor)));
692      q++;
693    }
694    for ( ; x < (long) (image->columns-raise_info->width); x++)
695      q++;
696    for ( ; x < (long) image->columns; x++)
697    {
698      q->red=RoundToQuantum(QuantumScale*((MagickRealType) q->red*ShadowFactor+
699        (MagickRealType) background*(QuantumRange-ShadowFactor)));
700      q->green=RoundToQuantum(QuantumScale*((MagickRealType) q->green*
701        ShadowFactor+(MagickRealType) background*(QuantumRange-ShadowFactor)));
702      q->blue=RoundToQuantum(QuantumScale*((MagickRealType) q->blue*
703        ShadowFactor+(MagickRealType) background*(QuantumRange-ShadowFactor)));
704      q++;
705    }
706    if (SyncImagePixels(image) == MagickFalse)
707      break;
708    if ((image->progress_monitor != (MagickProgressMonitor) NULL) &&
709        (QuantumTick(y,image->rows) != MagickFalse))
710      {
711        status=image->progress_monitor(RaiseImageTag,y,image->rows,
712          image->client_data);
713        if (status == MagickFalse)
714          break;
715      }
716  }
717  for ( ; y < (long) image->rows; y++)
718  {
719    q=GetImagePixels(image,0,y,image->columns,1);
720    if (q == (PixelPacket *) NULL)
721      break;
722    for (x=0; x < (long) (image->rows-y); x++)
723    {
724      q->red=RoundToQuantum(QuantumScale*((MagickRealType) q->red*
725        HighlightFactor+(MagickRealType) foreground*(QuantumRange-
726        HighlightFactor)));
727      q->green=RoundToQuantum(QuantumScale*((MagickRealType) q->green*
728        HighlightFactor+(MagickRealType) foreground*(QuantumRange-
729        HighlightFactor)));
730      q->blue=RoundToQuantum(QuantumScale*((MagickRealType) q->blue*
731        HighlightFactor+(MagickRealType) foreground*(QuantumRange-
732        HighlightFactor)));
733      q++;
734    }
735    for ( ; x < (long) (image->columns-(image->rows-y)); x++)
736    {
737      q->red=RoundToQuantum(QuantumScale*((MagickRealType) q->red*TroughFactor+
738        (MagickRealType) background*(QuantumRange-TroughFactor)));
739      q->green=RoundToQuantum(QuantumScale*((MagickRealType) q->green*
740        TroughFactor+(MagickRealType) background*(QuantumRange-TroughFactor)));
741      q->blue=RoundToQuantum(QuantumScale*((MagickRealType) q->blue*
742        TroughFactor+(MagickRealType) background*(QuantumRange-TroughFactor)));
743      q++;
744    }
745    for ( ; x < (long) image->columns; x++)
746    {
747      q->red=RoundToQuantum(QuantumScale*((MagickRealType) q->red*ShadowFactor+
748        (MagickRealType) background*(QuantumRange-ShadowFactor)));
749      q->green=RoundToQuantum(QuantumScale*((MagickRealType) q->green*
750        ShadowFactor+(MagickRealType) background*(QuantumRange-ShadowFactor)));
751      q->blue=RoundToQuantum(QuantumScale*((MagickRealType) q->blue*
752        ShadowFactor+(MagickRealType) background*(QuantumRange-ShadowFactor)));
753      q++;
754    }
755    if (SyncImagePixels(image) == MagickFalse)
756      break;
757    if ((image->progress_monitor != (MagickProgressMonitor) NULL) &&
758        (QuantumTick(y,image->rows) != MagickFalse))
759      {
760        status=image->progress_monitor(RaiseImageTag,y,image->rows,
761          image->client_data);
762        if (status == MagickFalse)
763          break;
764      }
765  }
766  return(MagickTrue);
767}
Note: See TracBrowser for help on using the browser.