13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
27ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  dedicated to making software imaging solutions freely available.
45cce74b1e47afda3614fe1775353f204e17b5ecbcristy
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  You may not use this file except in compliance with the License.
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  obtain a copy of the License at
75cce74b1e47afda3614fe1775353f204e17b5ecbcristy
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    http://www.imagemagick.org/script/license.php
95cce74b1e47afda3614fe1775353f204e17b5ecbcristy
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Unless required by applicable law or agreed to in writing, software
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  distributed under the License is distributed on an "AS IS" BASIS,
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  See the License for the specific language governing permissions and
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  limitations under the License.
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickCore image resampling private methods.
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1883bceaa5d7a1196e05c1ccba443f90f4b032fca6Cristy#ifndef MAGICKCORE_RESAMPLE_PRIVATE_H
1983bceaa5d7a1196e05c1ccba443f90f4b032fca6Cristy#define MAGICKCORE_RESAMPLE_PRIVATE_H
203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
216398ec777e91813b64767e25358b7062a7de56cbcristy#include "MagickCore/thread-private.h"
226398ec777e91813b64767e25358b7062a7de56cbcristy
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline ResampleFilter **DestroyResampleFilterThreadSet(
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ResampleFilter **filter)
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
30bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(filter != (ResampleFilter **) NULL);
3492923f1e6fbf86ce3d345bf8e907e9d0aab70808cristy  for (i=0; i < (ssize_t) GetMagickResourceLimit(ThreadResource); i++)
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (filter[i] != (ResampleFilter *) NULL)
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      filter[i]=DestroyResampleFilter(filter[i]);
37a64b85d7873d5e540fe6e2941aa98ec7653a4e2dcristy  filter=(ResampleFilter **) RelinquishMagickMemory(filter);
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(filter);
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline ResampleFilter **AcquireResampleFilterThreadSet(
42b2a11ae782e3f5ba1c020d944bc5ff8382d378fecristy  const Image *image,const VirtualPixelMethod method,
43b2a11ae782e3f5ba1c020d944bc5ff8382d378fecristy  const MagickBooleanType interpolate,ExceptionInfo *exception)
443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
45bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ResampleFilter
493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    **filter;
503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
51bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    number_threads;
533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5492923f1e6fbf86ce3d345bf8e907e9d0aab70808cristy  number_threads=(size_t) GetMagickResourceLimit(ThreadResource);
55a64b85d7873d5e540fe6e2941aa98ec7653a4e2dcristy  filter=(ResampleFilter **) AcquireQuantumMemory(number_threads,
563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    sizeof(*filter));
573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (filter == (ResampleFilter **) NULL)
583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return((ResampleFilter **) NULL);
593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(filter,0,number_threads*sizeof(*filter));
60bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (i=0; i < (ssize_t) number_threads; i++)
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    filter[i]=AcquireResampleFilter(image,exception);
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (filter[i] == (ResampleFilter *) NULL)
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(DestroyResampleFilterThreadSet(filter));
65b65a5b83785ab7b6a8f6fc2d47ba5dca776143bbcristy    if (method != UndefinedVirtualPixelMethod)
66b65a5b83785ab7b6a8f6fc2d47ba5dca776143bbcristy      (void) SetResampleFilterVirtualPixelMethod(filter[i],method);
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (interpolate != MagickFalse)
68aa2c16cb5e695053aa78e40f66bc36fbef4b1ed1cristy      SetResampleFilter(filter[i],PointFilter);
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(filter);
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
78