116881e68c6165c6191fc44151a8a4320e3dd1ffdcristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
57eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%                     IIIII  M   M   AAA    GGGG  EEEEE                       %
67eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%                       I    MM MM  A   A  G      E                           %
77eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%                       I    M M M  AAAAA  G  GG  EEE                         %
87eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%                       I    M   M  A   A  G   G  E                           %
97eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%                     IIIII  M   M  A   A   GGGG  EEEEE                       %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                         V   V  IIIII  EEEEE  W   W                          %
12cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                         V   V    I    E      W   W                          %
13cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                         V   V    I    EEE    W W W                          %
14cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                          V V     I    E      WW WW                          %
15cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                           V    IIIII  EEEEE  W   W                          %
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
187eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%                       MagickCore Image View Methods                         %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              Software Design                                %
21de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy%                                   Cristy                                    %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                March 2003                                   %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
257ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/MagickCore.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/thread-private.h"
533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Typedef declarations.
563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
577eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristystruct _ImageView
583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
59c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  char
60c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    *description;
61c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy
62c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  RectangleInfo
63c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    extent;
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
657eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  Image
667eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy    *image;
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  CacheView
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *view;
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
71c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  ExceptionInfo
72c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    *exception;
73c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    debug;
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
77bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    signature;
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy};
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
867eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%   C l o n e I m a g e V i e w                                               %
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9273b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  CloneImageView() makes a copy of the specified image view.
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
947eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%  The format of the CloneImageView method is:
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9673b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%      ImageView *CloneImageView(const ImageView *image_view)
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10073b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o image_view: the image view.
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
10373b7d4c082e57242f06e402275b2c9b1bb4e8feecristyMagickExport ImageView *CloneImageView(const ImageView *image_view)
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1057eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  ImageView
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *clone_view;
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10873b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  assert(image_view != (ImageView *) NULL);
109e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_view->signature == MagickCoreSignature);
11073bd4a51b419e914565bdf204bf1540dc4c8ee26cristy  clone_view=(ImageView *) AcquireMagickMemory(sizeof(*clone_view));
1117eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  if (clone_view == (ImageView *) NULL)
1127eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(clone_view,0,sizeof(*clone_view));
114c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  clone_view->description=ConstantString(image_view->description);
115c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  clone_view->extent=image_view->extent;
11673b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  clone_view->view=CloneCacheView(image_view->view);
117c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  clone_view->exception=AcquireExceptionInfo();
118c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  InheritException(clone_view->exception,image_view->exception);
11973b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  clone_view->debug=image_view->debug;
120e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  clone_view->signature=MagickCoreSignature;
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(clone_view);
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1297eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%   D e s t r o y I m a g e V i e w                                           %
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13573b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  DestroyImageView() deallocates memory associated with a image view.
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1377eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%  The format of the DestroyImageView method is:
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
13973b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%      ImageView *DestroyImageView(ImageView *image_view)
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
14373b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o image_view: the image view.
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
14673b7d4c082e57242f06e402275b2c9b1bb4e8feecristyMagickExport ImageView *DestroyImageView(ImageView *image_view)
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
14873b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  assert(image_view != (ImageView *) NULL);
149e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_view->signature == MagickCoreSignature);
150c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  if (image_view->description != (char *) NULL)
151c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    image_view->description=DestroyString(image_view->description);
15273b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  image_view->view=DestroyCacheView(image_view->view);
15373b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  image_view->exception=DestroyExceptionInfo(image_view->exception);
154e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  image_view->signature=(~MagickCoreSignature);
15573b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  image_view=(ImageView *) RelinquishMagickMemory(image_view);
15673b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  return(image_view);
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1647eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%   D u p l e x T r a n s f e r I m a g e V i e w I t e r a t o r             %
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
17073b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  DuplexTransferImageViewIterator() iterates over three image views in
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  parallel and calls your transfer method for each scanline of the view.  The
172c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%  source and duplex pixel extent is not confined to the image canvas-- that is
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  you can include negative offsets or widths or heights that exceed the image
17473b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  dimension.  However, the destination image view is confined to the image
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  canvas-- that is no negative offsets or widths or heights that exceed the
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image dimension are permitted.
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
178d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%  The callback signature is:
179d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%
180d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%      MagickBooleanType DuplexTransferImageViewMethod(const ImageView *source,
181d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%        const ImageView *duplex,ImageView *destination,const ssize_t y,
182d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%        const int thread_id,void *context)
183d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%
18458739475eaf89390210048221cd0fb7204e0908fcristy%  Use this pragma if the view is not single threaded:
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    #pragma omp critical
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  to define a section of code in your callback transfer method that must be
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  executed by a single thread at a time.
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1917eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%  The format of the DuplexTransferImageViewIterator method is:
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1937eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%      MagickBooleanType DuplexTransferImageViewIterator(ImageView *source,
1947eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%        ImageView *duplex,ImageView *destination,
1957eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%        DuplexTransferImageViewMethod transfer,void *context)
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
19973b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o source: the source image view.
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20173b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o duplex: the duplex image view.
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
20373b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o destination: the destination image view.
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o transfer: the transfer callback method.
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o context: the user defined context.
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2107eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristyMagickExport MagickBooleanType DuplexTransferImageViewIterator(
2117eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  ImageView *source,ImageView *duplex,ImageView *destination,
2127eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  DuplexTransferImageViewMethod transfer,void *context)
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *destination_image,
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *source_image;
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
221cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy  MagickOffsetType
222cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy    progress;
223cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy
22437618d6dda040a999610efa231f6a547fb703b25glennrp#if defined(MAGICKCORE_OPENMP_SUPPORT)
225ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy  size_t
22626b649100680af051e65caec259bf535dbdb5b1acristy    height;
22737618d6dda040a999610efa231f6a547fb703b25glennrp#endif
228ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy
229cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy  ssize_t
230cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy    y;
231cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy
2327eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  assert(source != (ImageView *) NULL);
233e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(source->signature == MagickCoreSignature);
2347eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  if (transfer == (DuplexTransferImageViewMethod) NULL)
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
2367eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  source_image=source->image;
2377eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  destination_image=destination->image;
2387c3af951210f34d3f244b31f06ee291e5be8ecb7cristy  status=SetImageStorageClass(destination_image,DirectClass,
2397c3af951210f34d3f244b31f06ee291e5be8ecb7cristy    destination->exception);
2407c3af951210f34d3f244b31f06ee291e5be8ecb7cristy  if (status == MagickFalse)
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  progress=0;
24437618d6dda040a999610efa231f6a547fb703b25glennrp#if defined(MAGICKCORE_OPENMP_SUPPORT)
245ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy  height=source->extent.height-source->extent.y;
2469a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy  #pragma omp parallel for schedule(static,4) shared(progress,status) \
2475e6b259130f9dbe0da4666f734937017babe573acristy    magick_threads(source_image,destination_image,height,1)
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
249c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  for (y=source->extent.y; y < (ssize_t) source->extent.height; y++)
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
2515c9e6f2ec2e7738ede83902931da0f80db60f565cristy    const int
2525c9e6f2ec2e7738ede83902931da0f80db60f565cristy      id = GetOpenMPThreadId();
253ad740057043b3db03f329993b8af90932852ef06cristy
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    MagickBooleanType
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      sync;
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2574c08aed51c5899665ade97263692328eea4af106cristy    register const Quantum
25805d2ff7ebf21f659f5b11e45afb294e152f4330cdirk      *magick_restrict duplex_pixels,
25905d2ff7ebf21f659f5b11e45afb294e152f4330cdirk      *magick_restrict pixels;
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2614c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
26205d2ff7ebf21f659f5b11e45afb294e152f4330cdirk      *magick_restrict destination_pixels;
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == MagickFalse)
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
266c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    pixels=GetCacheViewVirtualPixels(source->view,source->extent.x,y,
267c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy      source->extent.width,1,source->exception);
2684c08aed51c5899665ade97263692328eea4af106cristy    if (pixels == (const Quantum *) NULL)
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=MagickFalse;
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
273c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    duplex_pixels=GetCacheViewVirtualPixels(duplex->view,duplex->extent.x,y,
274c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy      duplex->extent.width,1,duplex->exception);
2754c08aed51c5899665ade97263692328eea4af106cristy    if (duplex_pixels == (const Quantum *) NULL)
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=MagickFalse;
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    destination_pixels=GetCacheViewAuthenticPixels(destination->view,
2817c3af951210f34d3f244b31f06ee291e5be8ecb7cristy      destination->extent.x,y,destination->extent.width,1,
2827c3af951210f34d3f244b31f06ee291e5be8ecb7cristy      destination->exception);
2834c08aed51c5899665ade97263692328eea4af106cristy    if (destination_pixels == (Quantum *) NULL)
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=MagickFalse;
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
288c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    if (transfer(source,duplex,destination,y,id,context) == MagickFalse)
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=MagickFalse;
2907c3af951210f34d3f244b31f06ee291e5be8ecb7cristy    sync=SyncCacheViewAuthenticPixels(destination->view,destination->exception);
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (sync == MagickFalse)
2927c3af951210f34d3f244b31f06ee291e5be8ecb7cristy      status=MagickFalse;
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (source_image->progress_monitor != (MagickProgressMonitor) NULL)
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MagickBooleanType
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          proceed;
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
298b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
299ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy        #pragma omp critical (MagickCore_DuplexTransferImageViewIterator)
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
301c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy        proceed=SetImageProgress(source_image,source->description,progress++,
302c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy          source->extent.height);
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (proceed == MagickFalse)
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3157c3af951210f34d3f244b31f06ee291e5be8ecb7cristy%   G e t I m a g e V i e w A u t h e n t i c M e t a c o n t e n t           %
316cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
317cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
318cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
319cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
320cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
3214c08aed51c5899665ade97263692328eea4af106cristy%  GetImageViewAuthenticMetacontent() returns the image view authentic
3224c08aed51c5899665ade97263692328eea4af106cristy%  meta-content.
323cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
324cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%  The format of the GetImageViewAuthenticPixels method is:
325cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
3264c08aed51c5899665ade97263692328eea4af106cristy%      void *GetImageViewAuthenticMetacontent(
3274c08aed51c5899665ade97263692328eea4af106cristy%        const ImageView *image_view)
328cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
329cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%  A description of each parameter follows:
330cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
33173b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o image_view: the image view.
332cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
333cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy*/
3344c08aed51c5899665ade97263692328eea4af106cristyMagickExport void *GetImageViewAuthenticMetacontent(
33573b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  const ImageView *image_view)
336cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy{
33773b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  assert(image_view != (ImageView *) NULL);
338e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_view->signature == MagickCoreSignature);
3394c08aed51c5899665ade97263692328eea4af106cristy  return(GetCacheViewAuthenticMetacontent(image_view->view));
340cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy}
341cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy
342cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy/*
343cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
344cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
345cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
346cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
347cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%   G e t I m a g e V i e w A u t h e n t i c P i x e l s                     %
348cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
349cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
350cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
351cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
352cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
35373b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  GetImageViewAuthenticPixels() returns the image view authentic pixels.
354cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
355cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%  The format of the GetImageViewAuthenticPixels method is:
356cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
3574c08aed51c5899665ade97263692328eea4af106cristy%      Quantum *GetImageViewAuthenticPixels(const ImageView *image_view)
358cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
359cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%  A description of each parameter follows:
360cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
36173b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o image_view: the image view.
362cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
363cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy*/
3644c08aed51c5899665ade97263692328eea4af106cristyMagickExport Quantum *GetImageViewAuthenticPixels(
36573b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  const ImageView *image_view)
366cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy{
36773b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  assert(image_view != (ImageView *) NULL);
368e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_view->signature == MagickCoreSignature);
36973b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  return(GetCacheViewAuthenticPixelQueue(image_view->view));
370cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy}
371cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy
372cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy/*
373cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
374cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
375cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
376cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
3777eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%   G e t I m a g e V i e w E x c e p t i o n                                 %
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3837eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%  GetImageViewException() returns the severity, reason, and description of any
38473b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  error that occurs when utilizing a image view.
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3867eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%  The format of the GetImageViewException method is:
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
38873b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%      char *GetImageViewException(const PixelImage *image_view,
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionType *severity)
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
39373b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o image_view: the pixel image_view.
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o severity: the severity of the error is returned here.
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
39873b7d4c082e57242f06e402275b2c9b1bb4e8feecristyMagickExport char *GetImageViewException(const ImageView *image_view,
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionType *severity)
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *description;
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
40473b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  assert(image_view != (const ImageView *) NULL);
405e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_view->signature == MagickCoreSignature);
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(severity != (ExceptionType *) NULL);
40773b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  *severity=image_view->exception->severity;
408151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  description=(char *) AcquireQuantumMemory(2UL*MagickPathExtent,
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*description));
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (description == (char *) NULL)
4117eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *description='\0';
41373b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  if (image_view->exception->reason != (char *) NULL)
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) CopyMagickString(description,GetLocaleExceptionMessage(
41573b7d4c082e57242f06e402275b2c9b1bb4e8feecristy      image_view->exception->severity,image_view->exception->reason),
416151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        MagickPathExtent);
41773b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  if (image_view->exception->description != (char *) NULL)
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
419151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) ConcatenateMagickString(description," (",MagickPathExtent);
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) ConcatenateMagickString(description,GetLocaleExceptionMessage(
42173b7d4c082e57242f06e402275b2c9b1bb4e8feecristy        image_view->exception->severity,image_view->exception->description),
422151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy        MagickPathExtent);
423151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy      (void) ConcatenateMagickString(description,")",MagickPathExtent);
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(description);
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
433c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%   G e t I m a g e V i e w E x t e n t                                       %
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
439c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%  GetImageViewExtent() returns the image view extent.
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
441c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%  The format of the GetImageViewExtent method is:
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
443c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%      RectangleInfo GetImageViewExtent(const ImageView *image_view)
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
44773b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o image_view: the image view.
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
450c3ebda260e2cdca5c0efa27addf0a66748d7c6facristyMagickExport RectangleInfo GetImageViewExtent(const ImageView *image_view)
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
45273b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  assert(image_view != (ImageView *) NULL);
453e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_view->signature == MagickCoreSignature);
454c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  return(image_view->extent);
45573b7d4c082e57242f06e402275b2c9b1bb4e8feecristy}
45673b7d4c082e57242f06e402275b2c9b1bb4e8feecristy
45773b7d4c082e57242f06e402275b2c9b1bb4e8feecristy/*
45873b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
45973b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%                                                                             %
46073b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%                                                                             %
46173b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%                                                                             %
46273b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%   G e t I m a g e V i e w I m a g e                                         %
46373b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%                                                                             %
46473b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%                                                                             %
46573b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%                                                                             %
46673b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
46773b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%
46873b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  GetImageViewImage() returns the image associated with the image view.
46973b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%
47073b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  The format of the GetImageViewImage method is:
47173b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%
47273b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%      MagickCore *GetImageViewImage(const ImageView *image_view)
47373b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%
47473b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  A description of each parameter follows:
47573b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%
47673b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o image_view: the image view.
47773b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%
47873b7d4c082e57242f06e402275b2c9b1bb4e8feecristy*/
47973b7d4c082e57242f06e402275b2c9b1bb4e8feecristyMagickExport Image *GetImageViewImage(const ImageView *image_view)
48073b7d4c082e57242f06e402275b2c9b1bb4e8feecristy{
48173b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  assert(image_view != (ImageView *) NULL);
482e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_view->signature == MagickCoreSignature);
48373b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  return(image_view->image);
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4917eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%   G e t I m a g e V i e w I t e r a t o r                                   %
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
49773b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  GetImageViewIterator() iterates over the image view in parallel and calls
498c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%  your get method for each scanline of the view.  The pixel extent is
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  not confined to the image canvas-- that is you can include negative offsets
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  or widths or heights that exceed the image dimension.  Any updates to
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the pixels in your callback are ignored.
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
503d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%  The callback signature is:
504d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%
505d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%      MagickBooleanType GetImageViewMethod(const ImageView *source,
506d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%        const ssize_t y,const int thread_id,void *context)
507d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%
50858739475eaf89390210048221cd0fb7204e0908fcristy%  Use this pragma if the view is not single threaded:
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    #pragma omp critical
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  to define a section of code in your callback get method that must be
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  executed by a single thread at a time.
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5157eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%  The format of the GetImageViewIterator method is:
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5177eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%      MagickBooleanType GetImageViewIterator(ImageView *source,
5187eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%        GetImageViewMethod get,void *context)
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
52273b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o source: the source image view.
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o get: the get callback method.
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o context: the user defined context.
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5297eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristyMagickExport MagickBooleanType GetImageViewIterator(ImageView *source,
5307eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  GetImageViewMethod get,void *context)
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *source_image;
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
538cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy  MagickOffsetType
539cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy    progress;
540cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy
54137618d6dda040a999610efa231f6a547fb703b25glennrp#if defined(MAGICKCORE_OPENMP_SUPPORT)
542ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy  size_t
54326b649100680af051e65caec259bf535dbdb5b1acristy    height;
54437618d6dda040a999610efa231f6a547fb703b25glennrp#endif
545ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy
546cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy  ssize_t
547cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy    y;
548cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy
5497eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  assert(source != (ImageView *) NULL);
550e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(source->signature == MagickCoreSignature);
5517eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  if (get == (GetImageViewMethod) NULL)
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
5537eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  source_image=source->image;
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  progress=0;
5569d9f0e5f677a2d995426ffdefc2c17473e021be8glennrp#if defined(MAGICKCORE_OPENMP_SUPPORT)
557ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy  height=source->extent.height-source->extent.y;
5589a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy  #pragma omp parallel for schedule(static,4) shared(progress,status) \
5595e6b259130f9dbe0da4666f734937017babe573acristy    magick_threads(source_image,source_image,height,1)
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
561c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  for (y=source->extent.y; y < (ssize_t) source->extent.height; y++)
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
5635c9e6f2ec2e7738ede83902931da0f80db60f565cristy    const int
5645c9e6f2ec2e7738ede83902931da0f80db60f565cristy      id = GetOpenMPThreadId();
565ad740057043b3db03f329993b8af90932852ef06cristy
5664c08aed51c5899665ade97263692328eea4af106cristy    register const Quantum
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      *pixels;
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == MagickFalse)
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
571c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    pixels=GetCacheViewVirtualPixels(source->view,source->extent.x,y,
572c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy      source->extent.width,1,source->exception);
5734c08aed51c5899665ade97263692328eea4af106cristy    if (pixels == (const Quantum *) NULL)
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=MagickFalse;
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
578d6dfc0d795119799f97da48c731a7e30e1ed671dcristy    if (get(source,y,id,context) == MagickFalse)
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=MagickFalse;
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (source_image->progress_monitor != (MagickProgressMonitor) NULL)
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MagickBooleanType
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          proceed;
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
585b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
586ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy        #pragma omp critical (MagickCore_GetImageViewIterator)
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
588c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy        proceed=SetImageProgress(source_image,source->description,progress++,
589c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy          source->extent.height);
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (proceed == MagickFalse)
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6024c08aed51c5899665ade97263692328eea4af106cristy%   G e t I m a g e V i e w V i r t u a l M e t a c o n t e n t     %
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6084c08aed51c5899665ade97263692328eea4af106cristy%  GetImageViewVirtualMetacontent() returns the image view virtual
6094c08aed51c5899665ade97263692328eea4af106cristy%  meta-content.
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6114c08aed51c5899665ade97263692328eea4af106cristy%  The format of the GetImageViewVirtualMetacontent method is:
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6134c08aed51c5899665ade97263692328eea4af106cristy%      const void *GetImageViewVirtualMetacontent(
61473b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%        const ImageView *image_view)
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
61873b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o image_view: the image view.
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
6214c08aed51c5899665ade97263692328eea4af106cristyMagickExport const void *GetImageViewVirtualMetacontent(
62273b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  const ImageView *image_view)
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
62473b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  assert(image_view != (ImageView *) NULL);
625e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_view->signature == MagickCoreSignature);
6264c08aed51c5899665ade97263692328eea4af106cristy  return(GetCacheViewVirtualMetacontent(image_view->view));
627cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy}
628cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy
629cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy/*
630cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
631cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
632cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
633cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
634cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%   G e t I m a g e V i e w V i r t u a l P i x e l s                         %
635cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
636cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
637cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%                                                                             %
638cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
639cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
64073b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  GetImageViewVirtualPixels() returns the image view virtual pixels.
641cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
642cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%  The format of the GetImageViewVirtualPixels method is:
643cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
6444c08aed51c5899665ade97263692328eea4af106cristy%      const Quantum *GetImageViewVirtualPixels(const ImageView *image_view)
645cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
646cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%  A description of each parameter follows:
647cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
64873b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o image_view: the image view.
649cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy%
650cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy*/
6514c08aed51c5899665ade97263692328eea4af106cristyMagickExport const Quantum *GetImageViewVirtualPixels(
65273b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  const ImageView *image_view)
653cc34c496cc82dec84cc1b245d3188bac5fb03b4dcristy{
65473b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  assert(image_view != (ImageView *) NULL);
655e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_view->signature == MagickCoreSignature);
65673b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  return(GetCacheViewVirtualPixelQueue(image_view->view));
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6647eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%   I s I m a g e V i e w                                                     %
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67073b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  IsImageView() returns MagickTrue if the the parameter is verified as a image
67173b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  view object.
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6737eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%  The format of the IsImageView method is:
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67573b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%      MagickBooleanType IsImageView(const ImageView *image_view)
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
67973b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o image_view: the image view.
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
68273b7d4c082e57242f06e402275b2c9b1bb4e8feecristyMagickExport MagickBooleanType IsImageView(const ImageView *image_view)
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
68473b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  if (image_view == (const ImageView *) NULL)
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
686e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  if (image_view->signature != MagickCoreSignature)
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickTrue);
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6967eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%   N e w I m a g e V i e w                                                   %
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
70273b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  NewImageView() returns a image view required for all other methods in the
70373b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  Image View API.
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7057eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%  The format of the NewImageView method is:
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
707db070957cf6bf959df9283a482377e8854c3d4d2cristy%      ImageView *NewImageView(MagickCore *wand,ExceptionInfo *exception)
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
711db070957cf6bf959df9283a482377e8854c3d4d2cristy%    o image: the image.
712db070957cf6bf959df9283a482377e8854c3d4d2cristy%
713db070957cf6bf959df9283a482377e8854c3d4d2cristy%    o exception: return any errors or warnings in this structure.
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
716db070957cf6bf959df9283a482377e8854c3d4d2cristyMagickExport ImageView *NewImageView(Image *image,ExceptionInfo *exception)
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7187eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  ImageView
71973b7d4c082e57242f06e402275b2c9b1bb4e8feecristy    *image_view;
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7217eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  assert(image != (Image *) NULL);
722e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
72373bd4a51b419e914565bdf204bf1540dc4c8ee26cristy  image_view=(ImageView *) AcquireMagickMemory(sizeof(*image_view));
72473b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  if (image_view == (ImageView *) NULL)
7257eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
72673b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  (void) ResetMagickMemory(image_view,0,sizeof(*image_view));
727c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  image_view->description=ConstantString("ImageView");
72873b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  image_view->image=image;
72946ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy  image_view->view=AcquireVirtualCacheView(image_view->image,exception);
730c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  image_view->extent.width=image->columns;
731c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  image_view->extent.height=image->rows;
732c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  image_view->extent.x=0;
733c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  image_view->extent.y=0;
734c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  image_view->exception=AcquireExceptionInfo();
73573b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  image_view->debug=IsEventLogging();
736e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  image_view->signature=MagickCoreSignature;
73773b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  return(image_view);
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7457eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%   N e w I m a g e V i e w R e g i o n                                       %
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
75173b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  NewImageViewRegion() returns a image view required for all other methods
75273b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  in the Image View API.
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7547eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%  The format of the NewImageViewRegion method is:
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7567eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%      ImageView *NewImageViewRegion(MagickCore *wand,const ssize_t x,
757db070957cf6bf959df9283a482377e8854c3d4d2cristy%        const ssize_t y,const size_t width,const size_t height,
758db070957cf6bf959df9283a482377e8854c3d4d2cristy%        ExceptionInfo *exception)
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o wand: the magick wand.
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
764c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%    o x,y,columns,rows:  These values define the perimeter of a extent of
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      pixel_wands view.
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
767db070957cf6bf959df9283a482377e8854c3d4d2cristy%    o exception: return any errors or warnings in this structure.
768db070957cf6bf959df9283a482377e8854c3d4d2cristy%
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
7707eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristyMagickExport ImageView *NewImageViewRegion(Image *image,const ssize_t x,
771db070957cf6bf959df9283a482377e8854c3d4d2cristy  const ssize_t y,const size_t width,const size_t height,
772db070957cf6bf959df9283a482377e8854c3d4d2cristy  ExceptionInfo *exception)
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7747eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  ImageView
77573b7d4c082e57242f06e402275b2c9b1bb4e8feecristy    *image_view;
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7777eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  assert(image != (Image *) NULL);
778e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
77973bd4a51b419e914565bdf204bf1540dc4c8ee26cristy  image_view=(ImageView *) AcquireMagickMemory(sizeof(*image_view));
78073b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  if (image_view == (ImageView *) NULL)
7817eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
78273b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  (void) ResetMagickMemory(image_view,0,sizeof(*image_view));
783c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  image_view->description=ConstantString("ImageView");
78446ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy  image_view->view=AcquireVirtualCacheView(image_view->image,exception);
78573b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  image_view->image=image;
786c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  image_view->extent.width=width;
787c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  image_view->extent.height=height;
788c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  image_view->extent.x=x;
789c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  image_view->extent.y=y;
790c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  image_view->exception=AcquireExceptionInfo();
79173b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  image_view->debug=IsEventLogging();
792e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  image_view->signature=MagickCoreSignature;
79373b7d4c082e57242f06e402275b2c9b1bb4e8feecristy  return(image_view);
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
801c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%   S e t I m a g e V i e w D e s c r i p t i o n                             %
802c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%                                                                             %
803c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%                                                                             %
804c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%                                                                             %
805c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
806c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%
807c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%  SetImageViewDescription() associates a description with an image view.
808c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%
809c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%  The format of the SetImageViewDescription method is:
810c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%
811c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%      void SetImageViewDescription(ImageView *image_view,
812c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%        const char *description)
813c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%
814c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%  A description of each parameter follows:
815c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%
816c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%    o image_view: the image view.
817c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%
818c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%    o description: the image view description.
819c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%
820c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy*/
821c3ebda260e2cdca5c0efa27addf0a66748d7c6facristyMagickExport void SetImageViewDescription(ImageView *image_view,
822c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  const char *description)
823c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy{
824c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  assert(image_view != (ImageView *) NULL);
825e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_view->signature == MagickCoreSignature);
826c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  image_view->description=ConstantString(description);
827c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy}
828c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy
829c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy/*
830c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
831c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%                                                                             %
832c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%                                                                             %
833c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%                                                                             %
8347eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%   S e t I m a g e V i e w I t e r a t o r                                   %
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
84073b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  SetImageViewIterator() iterates over the image view in parallel and calls
841c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%  your set method for each scanline of the view.  The pixel extent is
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  confined to the image canvas-- that is no negative offsets or widths or
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  heights that exceed the image dimension.  The pixels are initiallly
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  undefined and any settings you make in the callback method are automagically
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  synced back to your image.
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
847d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%  The callback signature is:
848d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%
849d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%      MagickBooleanType SetImageViewMethod(ImageView *destination,
850d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%        const ssize_t y,const int thread_id,void *context)
851d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%
85258739475eaf89390210048221cd0fb7204e0908fcristy%  Use this pragma if the view is not single threaded:
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    #pragma omp critical
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  to define a section of code in your callback set method that must be
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  executed by a single thread at a time.
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8597eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%  The format of the SetImageViewIterator method is:
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8617eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%      MagickBooleanType SetImageViewIterator(ImageView *destination,
8627eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%        SetImageViewMethod set,void *context)
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
86673b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o destination: the image view.
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o set: the set callback method.
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o context: the user defined context.
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
8737eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristyMagickExport MagickBooleanType SetImageViewIterator(ImageView *destination,
8747eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  SetImageViewMethod set,void *context)
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *destination_image;
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
882cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy  MagickOffsetType
883cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy    progress;
884cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy
88537618d6dda040a999610efa231f6a547fb703b25glennrp#if defined(MAGICKCORE_OPENMP_SUPPORT)
886ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy  size_t
88726b649100680af051e65caec259bf535dbdb5b1acristy    height;
88837618d6dda040a999610efa231f6a547fb703b25glennrp#endif
889ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy
890cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy  ssize_t
891cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy    y;
892cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy
8937eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  assert(destination != (ImageView *) NULL);
894e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(destination->signature == MagickCoreSignature);
8957eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  if (set == (SetImageViewMethod) NULL)
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
8977eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  destination_image=destination->image;
8987c3af951210f34d3f244b31f06ee291e5be8ecb7cristy  status=SetImageStorageClass(destination_image,DirectClass,
8997c3af951210f34d3f244b31f06ee291e5be8ecb7cristy    destination->exception);
9007c3af951210f34d3f244b31f06ee291e5be8ecb7cristy  if (status == MagickFalse)
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  progress=0;
90437618d6dda040a999610efa231f6a547fb703b25glennrp#if defined(MAGICKCORE_OPENMP_SUPPORT)
905ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy  height=destination->extent.height-destination->extent.y;
9069a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy  #pragma omp parallel for schedule(static,4) shared(progress,status) \
9075e6b259130f9dbe0da4666f734937017babe573acristy    magick_threads(destination_image,destination_image,height,1)
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
909c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  for (y=destination->extent.y; y < (ssize_t) destination->extent.height; y++)
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
9115c9e6f2ec2e7738ede83902931da0f80db60f565cristy    const int
9125c9e6f2ec2e7738ede83902931da0f80db60f565cristy      id = GetOpenMPThreadId();
913ad740057043b3db03f329993b8af90932852ef06cristy
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    MagickBooleanType
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      sync;
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9174c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
91805d2ff7ebf21f659f5b11e45afb294e152f4330cdirk      *magick_restrict pixels;
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == MagickFalse)
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
922c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    pixels=GetCacheViewAuthenticPixels(destination->view,destination->extent.x,
9237c3af951210f34d3f244b31f06ee291e5be8ecb7cristy      y,destination->extent.width,1,destination->exception);
9244c08aed51c5899665ade97263692328eea4af106cristy    if (pixels == (Quantum *) NULL)
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=MagickFalse;
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
929d6dfc0d795119799f97da48c731a7e30e1ed671dcristy    if (set(destination,y,id,context) == MagickFalse)
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=MagickFalse;
9317c3af951210f34d3f244b31f06ee291e5be8ecb7cristy    sync=SyncCacheViewAuthenticPixels(destination->view,destination->exception);
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (sync == MagickFalse)
9337c3af951210f34d3f244b31f06ee291e5be8ecb7cristy      status=MagickFalse;
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (destination_image->progress_monitor != (MagickProgressMonitor) NULL)
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MagickBooleanType
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          proceed;
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
939b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
940ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy        #pragma omp critical (MagickCore_SetImageViewIterator)
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
942c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy        proceed=SetImageProgress(destination_image,destination->description,
943c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy          progress++,destination->extent.height);
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (proceed == MagickFalse)
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9567eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%   T r a n s f e r I m a g e V i e w I t e r a t o r                         %
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
96273b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  TransferImageViewIterator() iterates over two image views in parallel and
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  calls your transfer method for each scanline of the view.  The source pixel
964c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%  extent is not confined to the image canvas-- that is you can include
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  negative offsets or widths or heights that exceed the image dimension.
96673b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  However, the destination image view is confined to the image canvas-- that
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  is no negative offsets or widths or heights that exceed the image dimension
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  are permitted.
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
970d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%  The callback signature is:
971d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%
972d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%      MagickBooleanType TransferImageViewMethod(const ImageView *source,
973d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%        ImageView *destination,const ssize_t y,const int thread_id,
974d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%        void *context)
975d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%
97658739475eaf89390210048221cd0fb7204e0908fcristy%  Use this pragma if the view is not single threaded:
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    #pragma omp critical
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  to define a section of code in your callback transfer method that must be
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  executed by a single thread at a time.
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9837eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%  The format of the TransferImageViewIterator method is:
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9857eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%      MagickBooleanType TransferImageViewIterator(ImageView *source,
9867eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%        ImageView *destination,TransferImageViewMethod transfer,void *context)
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
99073b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o source: the source image view.
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
99273b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o destination: the destination image view.
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o transfer: the transfer callback method.
9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o context: the user defined context.
9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9997eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristyMagickExport MagickBooleanType TransferImageViewIterator(ImageView *source,
10007eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  ImageView *destination,TransferImageViewMethod transfer,void *context)
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *destination_image,
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *source_image;
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1009cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy  MagickOffsetType
1010cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy    progress;
1011cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy
101237618d6dda040a999610efa231f6a547fb703b25glennrp#if defined(MAGICKCORE_OPENMP_SUPPORT)
1013ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy  size_t
101426b649100680af051e65caec259bf535dbdb5b1acristy    height;
101537618d6dda040a999610efa231f6a547fb703b25glennrp#endif
1016ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy
1017cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy  ssize_t
1018cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy    y;
1019cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy
10207eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  assert(source != (ImageView *) NULL);
1021e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(source->signature == MagickCoreSignature);
10227eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  if (transfer == (TransferImageViewMethod) NULL)
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
10247eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  source_image=source->image;
10257eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  destination_image=destination->image;
10267c3af951210f34d3f244b31f06ee291e5be8ecb7cristy  status=SetImageStorageClass(destination_image,DirectClass,
10277c3af951210f34d3f244b31f06ee291e5be8ecb7cristy    destination->exception);
10287c3af951210f34d3f244b31f06ee291e5be8ecb7cristy  if (status == MagickFalse)
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  progress=0;
103237618d6dda040a999610efa231f6a547fb703b25glennrp#if defined(MAGICKCORE_OPENMP_SUPPORT)
1033ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy  height=source->extent.height-source->extent.y;
10349a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy  #pragma omp parallel for schedule(static,4) shared(progress,status) \
10355e6b259130f9dbe0da4666f734937017babe573acristy    magick_threads(source_image,destination_image,height,1)
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1037c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  for (y=source->extent.y; y < (ssize_t) source->extent.height; y++)
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
10395c9e6f2ec2e7738ede83902931da0f80db60f565cristy    const int
10405c9e6f2ec2e7738ede83902931da0f80db60f565cristy      id = GetOpenMPThreadId();
1041ad740057043b3db03f329993b8af90932852ef06cristy
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    MagickBooleanType
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      sync;
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10454c08aed51c5899665ade97263692328eea4af106cristy    register const Quantum
104605d2ff7ebf21f659f5b11e45afb294e152f4330cdirk      *magick_restrict pixels;
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10484c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
104905d2ff7ebf21f659f5b11e45afb294e152f4330cdirk      *magick_restrict destination_pixels;
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == MagickFalse)
10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
1053c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    pixels=GetCacheViewVirtualPixels(source->view,source->extent.x,y,
1054c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy      source->extent.width,1,source->exception);
10554c08aed51c5899665ade97263692328eea4af106cristy    if (pixels == (const Quantum *) NULL)
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=MagickFalse;
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    destination_pixels=GetCacheViewAuthenticPixels(destination->view,
10617c3af951210f34d3f244b31f06ee291e5be8ecb7cristy      destination->extent.x,y,destination->extent.width,1,
10627c3af951210f34d3f244b31f06ee291e5be8ecb7cristy      destination->exception);
10634c08aed51c5899665ade97263692328eea4af106cristy    if (destination_pixels == (Quantum *) NULL)
10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=MagickFalse;
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1068c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    if (transfer(source,destination,y,id,context) == MagickFalse)
10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=MagickFalse;
10707c3af951210f34d3f244b31f06ee291e5be8ecb7cristy    sync=SyncCacheViewAuthenticPixels(destination->view,destination->exception);
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (sync == MagickFalse)
10727c3af951210f34d3f244b31f06ee291e5be8ecb7cristy      status=MagickFalse;
10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (source_image->progress_monitor != (MagickProgressMonitor) NULL)
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MagickBooleanType
10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          proceed;
10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1078b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
1079ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy        #pragma omp critical (MagickCore_TransferImageViewIterator)
10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1081c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy        proceed=SetImageProgress(source_image,source->description,progress++,
1082c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy          source->extent.height);
10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (proceed == MagickFalse)
10843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
10873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10957eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%   U p d a t e I m a g e V i e w I t e r a t o r                             %
10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
110173b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%  UpdateImageViewIterator() iterates over the image view in parallel and calls
1102c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy%  your update method for each scanline of the view.  The pixel extent is
11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  confined to the image canvas-- that is no negative offsets or widths or
11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  heights that exceed the image dimension are permitted.  Updates to pixels
11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  in your callback are automagically synced back to the image.
11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1107d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%  The callback signature is:
1108d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%
1109d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%      MagickBooleanType UpdateImageViewMethod(ImageView *source,
1110d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%        const ssize_t y,const int thread_id,void *context)
1111d6dfc0d795119799f97da48c731a7e30e1ed671dcristy%
111258739475eaf89390210048221cd0fb7204e0908fcristy%  Use this pragma if the view is not single threaded:
11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    #pragma omp critical
11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  to define a section of code in your callback update method that must be
11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  executed by a single thread at a time.
11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11197eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%  The format of the UpdateImageViewIterator method is:
11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11217eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%      MagickBooleanType UpdateImageViewIterator(ImageView *source,
11227eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy%        UpdateImageViewMethod update,void *context)
11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
112673b7d4c082e57242f06e402275b2c9b1bb4e8feecristy%    o source: the source image view.
11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o update: the update callback method.
11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o context: the user defined context.
11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
11337eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristyMagickExport MagickBooleanType UpdateImageViewIterator(ImageView *source,
11347eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  UpdateImageViewMethod update,void *context)
11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *source_image;
11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1142cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy  MagickOffsetType
1143cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy    progress;
1144cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy
114537618d6dda040a999610efa231f6a547fb703b25glennrp#if defined(MAGICKCORE_OPENMP_SUPPORT)
1146ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy  size_t
114726b649100680af051e65caec259bf535dbdb5b1acristy    height;
114837618d6dda040a999610efa231f6a547fb703b25glennrp#endif
1149ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy
1150cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy  ssize_t
1151cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy    y;
1152cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy
11537eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  assert(source != (ImageView *) NULL);
1154e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(source->signature == MagickCoreSignature);
11557eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  if (update == (UpdateImageViewMethod) NULL)
11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
11577eb1b7a244425a6d1821076a6c3da3f5c3e4b771cristy  source_image=source->image;
11587c3af951210f34d3f244b31f06ee291e5be8ecb7cristy  status=SetImageStorageClass(source_image,DirectClass,source->exception);
11597c3af951210f34d3f244b31f06ee291e5be8ecb7cristy  if (status == MagickFalse)
11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=MagickTrue;
11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  progress=0;
116337618d6dda040a999610efa231f6a547fb703b25glennrp#if defined(MAGICKCORE_OPENMP_SUPPORT)
1164ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy  height=source->extent.height-source->extent.y;
11659a5a52fdbea9190e1c868ba9298a6f64d1c896d1cristy  #pragma omp parallel for schedule(static,4) shared(progress,status) \
11665e6b259130f9dbe0da4666f734937017babe573acristy    magick_threads(source_image,source_image,height,1)
11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1168c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy  for (y=source->extent.y; y < (ssize_t) source->extent.height; y++)
11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
11705c9e6f2ec2e7738ede83902931da0f80db60f565cristy    const int
11715c9e6f2ec2e7738ede83902931da0f80db60f565cristy      id = GetOpenMPThreadId();
1172ad740057043b3db03f329993b8af90932852ef06cristy
11734c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
117405d2ff7ebf21f659f5b11e45afb294e152f4330cdirk      *magick_restrict pixels;
11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (status == MagickFalse)
11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      continue;
1178c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    pixels=GetCacheViewAuthenticPixels(source->view,source->extent.x,y,
11797c3af951210f34d3f244b31f06ee291e5be8ecb7cristy      source->extent.width,1,source->exception);
11804c08aed51c5899665ade97263692328eea4af106cristy    if (pixels == (Quantum *) NULL)
11813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        status=MagickFalse;
11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        continue;
11843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
1185c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    if (update(source,y,id,context) == MagickFalse)
11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      status=MagickFalse;
11877c3af951210f34d3f244b31f06ee291e5be8ecb7cristy    status=SyncCacheViewAuthenticPixels(source->view,source->exception);
11887c3af951210f34d3f244b31f06ee291e5be8ecb7cristy    if (status == MagickFalse)
11897c3af951210f34d3f244b31f06ee291e5be8ecb7cristy      status=MagickFalse;
11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (source_image->progress_monitor != (MagickProgressMonitor) NULL)
11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        MagickBooleanType
11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          proceed;
11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1195b5d5f725fef80ff5d50db3111c05a1a521b81e7fcristy#if defined(MAGICKCORE_OPENMP_SUPPORT)
1196ac245f8a51ea65b085d751c41d8ca4b426bdfe5bcristy        #pragma omp critical (MagickCore_UpdateImageViewIterator)
11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1198c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy        proceed=SetImageProgress(source_image,source->description,progress++,
1199c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy          source->extent.height);
12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (proceed == MagickFalse)
12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          status=MagickFalse;
12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1206