13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%            DDDD   EEEEE   CCCC   OOO   RRRR    AAA   TTTTT  EEEEE           %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%            D   D  E      C      O   O  R   R  A   A    T    E               %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%            D   D  EEE    C      O   O  RRRR   AAAAA    T    EEE             %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%            D   D  E      C      O   O  R R    A   A    T    E               %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%            DDDD   EEEEE   CCCC   OOO   R  R   A   A    T    EEEEE           %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                     MagickCore Image Decoration Methods                     %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                Software Design                              %
16de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy%                                     Cristy                                  %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                   July 1992                                 %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
207ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache-view.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color-private.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colorspace-private.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/composite.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/decorate.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel-accessor.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
58ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy#include "MagickCore/resource_.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/thread-private.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/transform.h"
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Define declarations.
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define AccentuateModulate  ScaleCharToQuantum(80)
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define HighlightModulate  ScaleCharToQuantum(125)
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define ShadowModulate  ScaleCharToQuantum(135)
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DepthModulate  ScaleCharToQuantum(185)
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define TroughModulate  ScaleCharToQuantum(110)
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   B o r d e r I m a g e                                                     %
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  BorderImage() surrounds the image with a border of the color defined by
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the bordercolor member of the image structure.  The width and height
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  of the border are defined by the corresponding members of the border_info
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  structure.
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the BorderImage method is:
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Image *BorderImage(const Image *image,const RectangleInfo *border_info,
90633f0c61bb0414b644dccf4f335576a10bca0329cristy%        const CompositeOperator compose,ExceptionInfo *exception)
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96633f0c61bb0414b644dccf4f335576a10bca0329cristy%    o border_info:  define the width and height of the border.
97633f0c61bb0414b644dccf4f335576a10bca0329cristy%
98633f0c61bb0414b644dccf4f335576a10bca0329cristy%    o compose:  the composite operator.
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport Image *BorderImage(const Image *image,
104633f0c61bb0414b644dccf4f335576a10bca0329cristy  const RectangleInfo *border_info,const CompositeOperator compose,
105633f0c61bb0414b644dccf4f335576a10bca0329cristy  ExceptionInfo *exception)
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
108b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy    *border_image,
109b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy    *clone_image;
110b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy
111b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy  FrameInfo
112b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy    frame_info;
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (const Image *) NULL);
115e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
118b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy  assert(border_info != (RectangleInfo *) NULL);
119b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy  frame_info.width=image->columns+(border_info->width << 1);
120b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy  frame_info.height=image->rows+(border_info->height << 1);
121bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  frame_info.x=(ssize_t) border_info->width;
122bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  frame_info.y=(ssize_t) border_info->height;
123b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy  frame_info.inner_bevel=0;
124b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy  frame_info.outer_bevel=0;
125b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy  clone_image=CloneImage(image,0,0,MagickTrue,exception);
126b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy  if (clone_image == (Image *) NULL)
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((Image *) NULL);
128b797b2c96f796f4920c9ee807dc5f47e6f160418dirk  clone_image->alpha_color=image->border_color;
129633f0c61bb0414b644dccf4f335576a10bca0329cristy  border_image=FrameImage(clone_image,&frame_info,compose,exception);
130b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy  clone_image=DestroyImage(clone_image);
131b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy  if (border_image != (Image *) NULL)
132b797b2c96f796f4920c9ee807dc5f47e6f160418dirk    border_image->alpha_color=image->alpha_color;
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(border_image);
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   F r a m e I m a g e                                                       %
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  FrameImage() adds a simulated three-dimensional border around the image.
148b797b2c96f796f4920c9ee807dc5f47e6f160418dirk%  The color of the border is defined by the alpha_color member of image.
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Members width and height of frame_info specify the border width of the
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  vertical and horizontal sides of the frame.  Members inner and outer
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  indicate the width of the inner and outer shadows of the frame.
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the FrameImage method is:
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Image *FrameImage(const Image *image,const FrameInfo *frame_info,
156633f0c61bb0414b644dccf4f335576a10bca0329cristy%        const CompositeOperator compose,ExceptionInfo *exception)
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o frame_info: Define the width and height of the frame and its bevels.
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
164633f0c61bb0414b644dccf4f335576a10bca0329cristy%    o compose: the composite operator.
165633f0c61bb0414b644dccf4f335576a10bca0329cristy%
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport Image *FrameImage(const Image *image,const FrameInfo *frame_info,
170633f0c61bb0414b644dccf4f335576a10bca0329cristy  const CompositeOperator compose,ExceptionInfo *exception)
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define FrameImageTag  "Frame/Image"
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
174c4c8d13c0996fea659ce63c682c803e74c1abc8acristy  CacheView
175c4c8d13c0996fea659ce63c682c803e74c1abc8acristy    *image_view,
176c4c8d13c0996fea659ce63c682c803e74c1abc8acristy    *frame_view;
177c4c8d13c0996fea659ce63c682c803e74c1abc8acristy
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *frame_image;
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
184bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  MagickOffsetType
185bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    progress;
186bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy
1874c08aed51c5899665ade97263692328eea4af106cristy  PixelInfo
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    accentuate,
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    highlight,
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    matte,
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    shadow,
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    trough;
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
194bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    x;
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
197bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
19862cb9cd9bcbbf30447de1b9f3019714d742bd1f3cristy    bevel_width,
19962cb9cd9bcbbf30447de1b9f3019714d742bd1f3cristy    height,
20062cb9cd9bcbbf30447de1b9f3019714d742bd1f3cristy    width;
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
202bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t
203bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    y;
204bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Check frame geometry.
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
209e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(frame_info != (FrameInfo *) NULL);
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((frame_info->outer_bevel < 0) || (frame_info->inner_bevel < 0))
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowImageException(OptionError,"FrameIsLessThanImageSize");
215bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  bevel_width=(size_t) (frame_info->outer_bevel+frame_info->inner_bevel);
2165c75db1071e1f0ed28c1c3e3e91c4c995b258b57cristy  x=(ssize_t) frame_info->width-frame_info->x-bevel_width;
2175c75db1071e1f0ed28c1c3e3e91c4c995b258b57cristy  y=(ssize_t) frame_info->height-frame_info->y-bevel_width;
2185c75db1071e1f0ed28c1c3e3e91c4c995b258b57cristy  if ((x < (ssize_t) image->columns) |  (y < (ssize_t) image->rows))
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowImageException(OptionError,"FrameIsLessThanImageSize");
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize framed image attributes.
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  frame_image=CloneImage(image,frame_info->width,frame_info->height,MagickTrue,
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    exception);
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (frame_image == (Image *) NULL)
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((Image *) NULL);
227574cc26500992189f637cd1cdf93d0654e7df7aecristy  if (SetImageStorageClass(frame_image,DirectClass,exception) == MagickFalse)
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      frame_image=DestroyImage(frame_image);
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return((Image *) NULL);
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
232d76cbb302b40fecfa282ef3b8b99107364d0dbd2cristy  if ((IsPixelInfoGray(&frame_image->border_color) == MagickFalse) &&
233d76cbb302b40fecfa282ef3b8b99107364d0dbd2cristy      (IsGrayColorspace(frame_image->colorspace) != MagickFalse))
234d76cbb302b40fecfa282ef3b8b99107364d0dbd2cristy    (void) SetImageColorspace(frame_image,sRGBColorspace,exception);
235b797b2c96f796f4920c9ee807dc5f47e6f160418dirk  if ((frame_image->alpha_color.alpha_trait != UndefinedPixelTrait) &&
23617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy      (frame_image->alpha_trait == UndefinedPixelTrait))
237d76cbb302b40fecfa282ef3b8b99107364d0dbd2cristy    (void) SetImageAlpha(frame_image,OpaqueAlpha,exception);
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  frame_image->page=image->page;
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((image->page.width != 0) && (image->page.height != 0))
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      frame_image->page.width+=frame_image->columns-image->columns;
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      frame_image->page.height+=frame_image->rows-image->rows;
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Initialize 3D effects color.
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
247b797b2c96f796f4920c9ee807dc5f47e6f160418dirk  matte=image->alpha_color;
2489d8c8ce096b3b8b2b1df1aec061f17eabba22b1dcristy  accentuate=matte;
249a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  accentuate.red=(double) (QuantumScale*((QuantumRange-
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    AccentuateModulate)*matte.red+(QuantumRange*AccentuateModulate)));
251a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  accentuate.green=(double) (QuantumScale*((QuantumRange-
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    AccentuateModulate)*matte.green+(QuantumRange*AccentuateModulate)));
253a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  accentuate.blue=(double) (QuantumScale*((QuantumRange-
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    AccentuateModulate)*matte.blue+(QuantumRange*AccentuateModulate)));
255a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  accentuate.black=(double) (QuantumScale*((QuantumRange-
2569d8c8ce096b3b8b2b1df1aec061f17eabba22b1dcristy    AccentuateModulate)*matte.black+(QuantumRange*AccentuateModulate)));
2574c08aed51c5899665ade97263692328eea4af106cristy  accentuate.alpha=matte.alpha;
2589d8c8ce096b3b8b2b1df1aec061f17eabba22b1dcristy  highlight=matte;
259a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  highlight.red=(double) (QuantumScale*((QuantumRange-
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    HighlightModulate)*matte.red+(QuantumRange*HighlightModulate)));
261a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  highlight.green=(double) (QuantumScale*((QuantumRange-
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    HighlightModulate)*matte.green+(QuantumRange*HighlightModulate)));
263a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  highlight.blue=(double) (QuantumScale*((QuantumRange-
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    HighlightModulate)*matte.blue+(QuantumRange*HighlightModulate)));
265a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy  highlight.black=(double) (QuantumScale*((QuantumRange-
2669d8c8ce096b3b8b2b1df1aec061f17eabba22b1dcristy    HighlightModulate)*matte.black+(QuantumRange*HighlightModulate)));
2674c08aed51c5899665ade97263692328eea4af106cristy  highlight.alpha=matte.alpha;
2689d8c8ce096b3b8b2b1df1aec061f17eabba22b1dcristy  shadow=matte;
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  shadow.red=QuantumScale*matte.red*ShadowModulate;
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  shadow.green=QuantumScale*matte.green*ShadowModulate;
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  shadow.blue=QuantumScale*matte.blue*ShadowModulate;
2729d8c8ce096b3b8b2b1df1aec061f17eabba22b1dcristy  shadow.black=QuantumScale*matte.black*ShadowModulate;
2734c08aed51c5899665ade97263692328eea4af106cristy  shadow.alpha=matte.alpha;
2749d8c8ce096b3b8b2b1df1aec061f17eabba22b1dcristy  trough=matte;
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  trough.red=QuantumScale*matte.red*TroughModulate;
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  trough.green=QuantumScale*matte.green*TroughModulate;
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  trough.blue=QuantumScale*matte.blue*TroughModulate;
2789d8c8ce096b3b8b2b1df1aec061f17eabba22b1dcristy  trough.black=QuantumScale*matte.black*TroughModulate;
2794c08aed51c5899665ade97263692328eea4af106cristy  trough.alpha=matte.alpha;
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  progress=0;
28246ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy  image_view=AcquireVirtualCacheView(image,exception);
28346ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy  frame_view=AcquireAuthenticCacheView(frame_image,exception);
284bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  height=(size_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    frame_info->inner_bevel);
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (height != 0)
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
288bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      register ssize_t
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x;
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2914c08aed51c5899665ade97263692328eea4af106cristy      register Quantum
29205d2ff7ebf21f659f5b11e45afb294e152f4330cdirk        *magick_restrict q;
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Draw top of ornamental border.
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      q=QueueCacheViewAuthenticPixels(frame_view,0,0,frame_image->columns,
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        height,exception);
2994c08aed51c5899665ade97263692328eea4af106cristy      if (q != (Quantum *) NULL)
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Draw top of ornamental border.
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
304bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (y=0; y < (ssize_t) frame_info->outer_bevel; y++)
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
306bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) (frame_image->columns-y); x++)
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (x < y)
30911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy                SetPixelViaPixelInfo(frame_image,&highlight,q);
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
31111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy                SetPixelViaPixelInfo(frame_image,&accentuate,q);
312ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
314bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for ( ; x < (ssize_t) frame_image->columns; x++)
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
31611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&shadow,q);
317ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
320bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (y=0; y < (ssize_t) (frame_info->y-bevel_width); y++)
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
322bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
32411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&highlight,q);
325ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            width=frame_image->columns-2*frame_info->outer_bevel;
328bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) width; x++)
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
33011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&matte,q);
331ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
333bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
33511a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&shadow,q);
336ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
339bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (y=0; y < (ssize_t) frame_info->inner_bevel; y++)
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
341bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
34311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&highlight,q);
344ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
346bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
34811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&matte,q);
349ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
351bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            width=image->columns+((size_t) frame_info->inner_bevel << 1)-
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              y;
353bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) width; x++)
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              if (x < y)
35611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy                SetPixelViaPixelInfo(frame_image,&shadow,q);
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
35811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy                SetPixelViaPixelInfo(frame_image,&trough,q);
359ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
361bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for ( ; x < (ssize_t) (image->columns+2*frame_info->inner_bevel); x++)
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
36311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&highlight,q);
364ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            width=frame_info->width-frame_info->x-image->columns-bevel_width;
367bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) width; x++)
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
36911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&matte,q);
370ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
372bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
37411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&shadow,q);
375ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) SyncCacheViewAuthenticPixels(frame_view,exception);
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Draw sides of ornamental border.
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
38426b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
385d643247965337aae790abe62ef297abc3cc63c3dcristy  #pragma omp parallel for schedule(static,4) shared(progress,status) \
386d643247965337aae790abe62ef297abc3cc63c3dcristy    magick_threads(image,frame_image,1,1)
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
388bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=0; y < (ssize_t) image->rows; y++)
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
390bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    register ssize_t
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x;
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3934c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
39405d2ff7ebf21f659f5b11e45afb294e152f4330cdirk      *magick_restrict q;
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
396564a56979706a30a3d0f920fd5f538a408efd4f1cristy    size_t
397564a56979706a30a3d0f920fd5f538a408efd4f1cristy      width;
398564a56979706a30a3d0f920fd5f538a408efd4f1cristy
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Initialize scanline with matte color.
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == MagickFalse)
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q=QueueCacheViewAuthenticPixels(frame_view,0,frame_info->y+y,
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      frame_image->columns,1,exception);
406acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy    if (q == (Quantum *) NULL)
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=MagickFalse;
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
411bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
41311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      SetPixelViaPixelInfo(frame_image,&highlight,q);
414ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(frame_image);
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
416bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
41811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      SetPixelViaPixelInfo(frame_image,&matte,q);
419ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(frame_image);
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
421bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) frame_info->inner_bevel; x++)
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
42311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      SetPixelViaPixelInfo(frame_image,&shadow,q);
424ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(frame_image);
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
4277b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy      Set frame interior pixels.
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
4297b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy    {
4307b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy      register const Quantum
4317b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy        *p;
4327b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy
4337b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy      p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
4347b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy      if (p == (const Quantum *) NULL)
4357b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy        {
4367b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy          status=MagickFalse;
4377b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy          continue;
4387b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy        }
439bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      for (x=0; x < (ssize_t) image->columns; x++)
440b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy      {
4417b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy        register ssize_t
4427b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy          i;
443b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy
4447b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy        if (GetPixelReadMask(image,q) == 0)
445b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy          {
4467b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy            SetPixelBackgoundColor(frame_image,q);
4477b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy            p+=GetPixelChannels(image);
4487b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy            q+=GetPixelChannels(frame_image);
449b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy            continue;
450b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy          }
4517b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy        for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
4524c08aed51c5899665ade97263692328eea4af106cristy        {
4537b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy          PixelChannel channel=GetPixelChannelChannel(image,i);
4547b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy          PixelTrait traits=GetPixelChannelTraits(image,channel);
4557b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy          PixelTrait frame_traits=GetPixelChannelTraits(frame_image,channel);
4567b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy          if ((traits == UndefinedPixelTrait) ||
4577b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy              (frame_traits == UndefinedPixelTrait))
4587b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy            continue;
4597b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy          SetPixelChannel(frame_image,channel,p[i],q);
4604c08aed51c5899665ade97263692328eea4af106cristy        }
4617b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy        SetPixelRed(frame_image,GetPixelRed(image,p),q);
4627b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy        SetPixelGreen(frame_image,GetPixelGreen(image,p),q);
4637b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy        SetPixelBlue(frame_image,GetPixelBlue(image,p),q);
4647b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy        SetPixelAlpha(frame_image,GetPixelAlpha(image,p),q);
4657b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy        p+=GetPixelChannels(image);
4667b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy        q+=GetPixelChannels(frame_image);
467b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy      }
4687b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy    }
469bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) frame_info->inner_bevel; x++)
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
47111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      SetPixelViaPixelInfo(frame_image,&highlight,q);
472ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(frame_image);
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    width=frame_info->width-frame_info->x-image->columns-bevel_width;
475bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) width; x++)
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
47711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      SetPixelViaPixelInfo(frame_image,&matte,q);
478ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(frame_image);
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
480bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
48211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy      SetPixelViaPixelInfo(frame_image,&shadow,q);
483ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(frame_image);
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (SyncCacheViewAuthenticPixels(frame_view,exception) == MagickFalse)
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=MagickFalse;
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image->progress_monitor != (MagickProgressMonitor) NULL)
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MagickBooleanType
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          proceed;
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
49226b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
49369cfa02cfc7b694242c26efab9d8fde75adf3c38cristy        #pragma omp critical (MagickCore_FrameImage)
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        proceed=SetImageProgress(image,FrameImageTag,progress++,image->rows);
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (proceed == MagickFalse)
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
500bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  height=(size_t) (frame_info->inner_bevel+frame_info->height-
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    frame_info->y-image->rows-bevel_width+frame_info->outer_bevel);
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (height != 0)
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
504bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      register ssize_t
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        x;
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5074c08aed51c5899665ade97263692328eea4af106cristy      register Quantum
50805d2ff7ebf21f659f5b11e45afb294e152f4330cdirk        *magick_restrict q;
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /*
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        Draw bottom of ornamental border.
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      */
513bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      q=QueueCacheViewAuthenticPixels(frame_view,0,(ssize_t) (frame_image->rows-
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        height),frame_image->columns,height,exception);
5154c08aed51c5899665ade97263692328eea4af106cristy      if (q != (Quantum *) NULL)
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        {
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /*
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            Draw bottom of ornamental border.
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          */
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=frame_info->inner_bevel-1; y >= 0; y--)
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
522bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
52411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&highlight,q);
525ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
527bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) (frame_info->x-bevel_width); x++)
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
52911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&matte,q);
530ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < y; x++)
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
53411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&shadow,q);
535ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
537bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for ( ; x < (ssize_t) (image->columns+2*frame_info->inner_bevel); x++)
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
539bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              if (x >= (ssize_t) (image->columns+2*frame_info->inner_bevel-y))
54011a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy                SetPixelViaPixelInfo(frame_image,&highlight,q);
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
54211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy                SetPixelViaPixelInfo(frame_image,&accentuate,q);
543ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            width=frame_info->width-frame_info->x-image->columns-bevel_width;
546bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) width; x++)
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
54811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&matte,q);
549ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
551bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
55311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&shadow,q);
554ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          height=frame_info->height-frame_info->y-image->rows-bevel_width;
558bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy          for (y=0; y < (ssize_t) height; y++)
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
560bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
56211a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&highlight,q);
563ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            width=frame_image->columns-2*frame_info->outer_bevel;
566bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) width; x++)
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
56811a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&matte,q);
569ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
571bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for (x=0; x < (ssize_t) frame_info->outer_bevel; x++)
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
57311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&shadow,q);
574ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          for (y=frame_info->outer_bevel-1; y >= 0; y--)
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            for (x=0; x < y; x++)
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
58111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy              SetPixelViaPixelInfo(frame_image,&highlight,q);
582ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
584bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy            for ( ; x < (ssize_t) frame_image->columns; x++)
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            {
586bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy              if (x >= (ssize_t) (frame_image->columns-y))
58711a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy                SetPixelViaPixelInfo(frame_image,&shadow,q);
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              else
58911a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy                SetPixelViaPixelInfo(frame_image,&trough,q);
590ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy              q+=GetPixelChannels(frame_image);
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            }
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          (void) SyncCacheViewAuthenticPixels(frame_view,exception);
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  frame_view=DestroyCacheView(frame_view);
597b78bb04767c9e12e0349e8a6d92a4d2fb52e6fd4cristy  image_view=DestroyCacheView(image_view);
5987b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy  x=(ssize_t) (frame_info->outer_bevel+(frame_info->x-bevel_width)+
5997b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy    frame_info->inner_bevel);
6007b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy  y=(ssize_t) (frame_info->outer_bevel+(frame_info->y-bevel_width)+
6017b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy    frame_info->inner_bevel);
6027b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy  if (status != MagickFalse)
6037b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy    status=CompositeImage(frame_image,image,compose,MagickTrue,x,y,
6047b2df43e55e1e3d42c28bf5a0dab4a1f44536935cristy      exception);
6051c2f48d0fbbad5757296fca9324fa14033f56632cristy  if (status == MagickFalse)
6061c2f48d0fbbad5757296fca9324fa14033f56632cristy    frame_image=DestroyImage(frame_image);
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(frame_image);
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R a i s e I m a g e                                                       %
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  RaiseImage() creates a simulated three-dimensional button-like effect
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  by lightening and darkening the edges of the image.  Members width and
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  height of raise_info define the width of the vertical and horizontal
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  edge of the effect.
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the RaiseImage method is:
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType RaiseImage(const Image *image,
6296170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy%        const RectangleInfo *raise_info,const MagickBooleanType raise,
6306170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy%        ExceptionInfo *exception)
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o raise_info: Define the width and height of the raise area.
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o raise: A value other than zero creates a 3-D raise effect,
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      otherwise it has a lowered effect.
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6416170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy%    o exception: return any errors or warnings in this structure.
6426170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy%
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType RaiseImage(Image *image,
6456170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy  const RectangleInfo *raise_info,const MagickBooleanType raise,
6466170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy  ExceptionInfo *exception)
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define AccentuateFactor  ScaleCharToQuantum(135)
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define HighlightFactor  ScaleCharToQuantum(190)
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define ShadowFactor  ScaleCharToQuantum(190)
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define RaiseImageTag  "Raise/Image"
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define TroughFactor  ScaleCharToQuantum(135)
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
654c4c8d13c0996fea659ce63c682c803e74c1abc8acristy  CacheView
655c4c8d13c0996fea659ce63c682c803e74c1abc8acristy    *image_view;
656c4c8d13c0996fea659ce63c682c803e74c1abc8acristy
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
660bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  MagickOffsetType
661bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    progress;
662bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Quantum
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    foreground,
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    background;
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
667bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t
668bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    y;
669bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
671e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(raise_info != (RectangleInfo *) NULL);
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((image->columns <= (raise_info->width << 1)) ||
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (image->rows <= (raise_info->height << 1)))
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowBinaryException(OptionError,"ImageSizeMustExceedBevelWidth",
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->filename);
6796e963d8cbd0aebba1073d7f4b61e3d17177d6fedcristy  foreground=QuantumRange;
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  background=(Quantum) 0;
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (raise == MagickFalse)
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      foreground=(Quantum) 0;
6846e963d8cbd0aebba1073d7f4b61e3d17177d6fedcristy      background=QuantumRange;
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
686574cc26500992189f637cd1cdf93d0654e7df7aecristy  if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Raise image.
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  progress=0;
69346ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy  image_view=AcquireAuthenticCacheView(image,exception);
69426b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
695d643247965337aae790abe62ef297abc3cc63c3dcristy  #pragma omp parallel for schedule(static,4) shared(progress,status) \
696d643247965337aae790abe62ef297abc3cc63c3dcristy    magick_threads(image,image,1,1)
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
698bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=0; y < (ssize_t) raise_info->height; y++)
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
700bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    register ssize_t
7016170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      i,
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x;
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7044c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
70505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk      *magick_restrict q;
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == MagickFalse)
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
710acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy    if (q == (Quantum *) NULL)
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=MagickFalse;
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (x=0; x < y; x++)
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
717883fde11debec15cedb05dc5d7228d8588066bc0cristy      if (GetPixelReadMask(image,q) == 0)
71810a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        {
71910a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          q+=GetPixelChannels(image);
72010a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          continue;
72110a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        }
72214973baa8fa5c79889bc4db247200bb7d4626324cristy      for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
72314973baa8fa5c79889bc4db247200bb7d4626324cristy      {
7245a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(image,i);
7255a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(image,channel);
726d09f880db9ae231429495434fc7f908bdce240f4cristy        if ((traits & UpdatePixelTrait) == 0)
727d09f880db9ae231429495434fc7f908bdce240f4cristy          continue;
7281eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*HighlightFactor+(double)
7291eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy          foreground*(QuantumRange-HighlightFactor)));
73014973baa8fa5c79889bc4db247200bb7d4626324cristy      }
731ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(image);
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
733bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for ( ; x < (ssize_t) (image->columns-y); x++)
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
735883fde11debec15cedb05dc5d7228d8588066bc0cristy      if (GetPixelReadMask(image,q) == 0)
73610a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        {
73710a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          q+=GetPixelChannels(image);
73810a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          continue;
73910a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        }
74014973baa8fa5c79889bc4db247200bb7d4626324cristy      for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
74114973baa8fa5c79889bc4db247200bb7d4626324cristy      {
7425a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(image,i);
7435a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(image,channel);
744d09f880db9ae231429495434fc7f908bdce240f4cristy        if ((traits & UpdatePixelTrait) == 0)
745d09f880db9ae231429495434fc7f908bdce240f4cristy          continue;
7461eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*AccentuateFactor+
7471eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy          (double) foreground*(QuantumRange-AccentuateFactor)));
74814973baa8fa5c79889bc4db247200bb7d4626324cristy      }
749ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(image);
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
751bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for ( ; x < (ssize_t) image->columns; x++)
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
753883fde11debec15cedb05dc5d7228d8588066bc0cristy      if (GetPixelReadMask(image,q) == 0)
75410a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        {
75510a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          q+=GetPixelChannels(image);
75610a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          continue;
75710a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        }
75814973baa8fa5c79889bc4db247200bb7d4626324cristy      for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
75914973baa8fa5c79889bc4db247200bb7d4626324cristy      {
7605a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(image,i);
7615a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(image,channel);
762d09f880db9ae231429495434fc7f908bdce240f4cristy        if ((traits & UpdatePixelTrait) == 0)
763d09f880db9ae231429495434fc7f908bdce240f4cristy          continue;
7641eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*ShadowFactor+(double)
7651eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy          background*(QuantumRange-ShadowFactor)));
76614973baa8fa5c79889bc4db247200bb7d4626324cristy      }
767ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(image);
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=MagickFalse;
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image->progress_monitor != (MagickProgressMonitor) NULL)
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MagickBooleanType
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          proceed;
7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77626b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
7779a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy        #pragma omp critical (MagickCore_RaiseImage)
7789a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy#endif
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (proceed == MagickFalse)
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
78426b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
785d643247965337aae790abe62ef297abc3cc63c3dcristy  #pragma omp parallel for schedule(static,4) shared(progress,status) \
786cb7dfccc2e3a9d57a44294cde5228e6f3f27d003cristy    magick_threads(image,image,1,1)
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
788bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=(ssize_t) raise_info->height; y < (ssize_t) (image->rows-raise_info->height); y++)
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
790bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    register ssize_t
7916170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      i,
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x;
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7944c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
79505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk      *magick_restrict q;
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == MagickFalse)
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
800acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy    if (q == (Quantum *) NULL)
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=MagickFalse;
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
805bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) raise_info->width; x++)
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
807883fde11debec15cedb05dc5d7228d8588066bc0cristy      if (GetPixelReadMask(image,q) == 0)
80810a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        {
80910a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          q+=GetPixelChannels(image);
81010a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          continue;
81110a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        }
8126170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
8136170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      {
8145a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(image,i);
8155a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(image,channel);
816d09f880db9ae231429495434fc7f908bdce240f4cristy        if ((traits & UpdatePixelTrait) == 0)
817d09f880db9ae231429495434fc7f908bdce240f4cristy          continue;
8181eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*HighlightFactor+(double)
8191eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy          foreground*(QuantumRange-HighlightFactor)));
8206170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      }
821ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(image);
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
823bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for ( ; x < (ssize_t) (image->columns-raise_info->width); x++)
824ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(image);
825bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for ( ; x < (ssize_t) image->columns; x++)
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
827883fde11debec15cedb05dc5d7228d8588066bc0cristy      if (GetPixelReadMask(image,q) == 0)
82810a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        {
82910a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          q+=GetPixelChannels(image);
83010a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          continue;
83110a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        }
8326170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
8336170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      {
8345a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(image,i);
8355a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(image,channel);
836d09f880db9ae231429495434fc7f908bdce240f4cristy        if ((traits & UpdatePixelTrait) == 0)
837d09f880db9ae231429495434fc7f908bdce240f4cristy          continue;
8381eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*ShadowFactor+(double)
8391eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy          background*(QuantumRange-ShadowFactor)));
8406170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      }
841ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(image);
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=MagickFalse;
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image->progress_monitor != (MagickProgressMonitor) NULL)
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MagickBooleanType
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          proceed;
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
85026b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
8519a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy        #pragma omp critical (MagickCore_RaiseImage)
8529a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy#endif
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (proceed == MagickFalse)
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
85826b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
859d643247965337aae790abe62ef297abc3cc63c3dcristy  #pragma omp parallel for schedule(static,4) shared(progress,status) \
860cb7dfccc2e3a9d57a44294cde5228e6f3f27d003cristy    magick_threads(image,image,1,1)
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
862bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=(ssize_t) (image->rows-raise_info->height); y < (ssize_t) image->rows; y++)
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
864bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    register ssize_t
8656170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      i,
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x;
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8684c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
86905d2ff7ebf21f659f5b11e45afb294e152f4330cdirk      *magick_restrict q;
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == MagickFalse)
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
874acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy    if (q == (Quantum *) NULL)
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=MagickFalse;
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
879bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for (x=0; x < (ssize_t) (image->rows-y); x++)
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
881883fde11debec15cedb05dc5d7228d8588066bc0cristy      if (GetPixelReadMask(image,q) == 0)
88210a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        {
88310a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          q+=GetPixelChannels(image);
88410a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          continue;
88510a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        }
8866170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
8876170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      {
8885a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(image,i);
8895a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(image,channel);
890d09f880db9ae231429495434fc7f908bdce240f4cristy        if ((traits & UpdatePixelTrait) == 0)
891d09f880db9ae231429495434fc7f908bdce240f4cristy          continue;
8921eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*HighlightFactor+(double)
8931eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy          foreground*(QuantumRange-HighlightFactor)));
8946170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      }
895ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(image);
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
897bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for ( ; x < (ssize_t) (image->columns-(image->rows-y)); x++)
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8996170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
9006170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      {
9015a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(image,i);
9025a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(image,channel);
903d09f880db9ae231429495434fc7f908bdce240f4cristy        if ((traits & UpdatePixelTrait) == 0)
904d09f880db9ae231429495434fc7f908bdce240f4cristy          continue;
905a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*TroughFactor+
906a19f1d70e9a9f88279c4ecafe6dfafc1f9a09599cristy          (double) background*(QuantumRange-TroughFactor)));
9076170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      }
908ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(image);
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
910bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    for ( ; x < (ssize_t) image->columns; x++)
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
912883fde11debec15cedb05dc5d7228d8588066bc0cristy      if (GetPixelReadMask(image,q) == 0)
91310a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        {
91410a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          q+=GetPixelChannels(image);
91510a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy          continue;
91610a6c61544fb48d72f29ec8f9573bdcd52abf1b7cristy        }
9176170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
9186170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      {
9195a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelChannel channel=GetPixelChannelChannel(image,i);
9205a23c55ddcfdf6ae717dd42d8a1c1a2ff8c6305fcristy        PixelTrait traits=GetPixelChannelTraits(image,channel);
921d09f880db9ae231429495434fc7f908bdce240f4cristy        if ((traits & UpdatePixelTrait) == 0)
922d09f880db9ae231429495434fc7f908bdce240f4cristy          continue;
9231eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy        q[i]=ClampToQuantum(QuantumScale*((double) q[i]*ShadowFactor+(double)
9241eced097f7f4f51d5aa14d46079292fa1dcf0e77cristy          background*(QuantumRange-ShadowFactor)));
9256170ac3e0ac67b0ea3716fe9e886a52c90c1bd3fcristy      }
926ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy      q+=GetPixelChannels(image);
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=MagickFalse;
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image->progress_monitor != (MagickProgressMonitor) NULL)
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MagickBooleanType
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          proceed;
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
93526b649100680af051e65caec259bf535dbdb5b1acristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
93669cfa02cfc7b694242c26efab9d8fde75adf3c38cristy        #pragma omp critical (MagickCore_RaiseImage)
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        proceed=SetImageProgress(image,RaiseImageTag,progress++,image->rows);
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (proceed == MagickFalse)
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image_view=DestroyCacheView(image_view);
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
946