MagickExport CacheView *AcquireVirtualCacheView(const Image *image, ExceptionInfo *exception) { CacheView *restrict cache_view; assert(image != (Image *) NULL); assert(image->signature == MagickSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); (void) exception; cache_view=(CacheView *) MagickAssumeAligned(AcquireAlignedMemory(1, sizeof(*cache_view))); if (cache_view == (CacheView *) NULL) ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); (void) ResetMagickMemory(cache_view,0,sizeof(*cache_view)); cache_view->image=ReferenceImage((Image *) image); cache_view->number_threads=GetOpenMPMaximumThreads(); if (GetMagickResourceLimit(ThreadResource) > cache_view->number_threads) cache_view->number_threads=(size_t) GetMagickResourceLimit(ThreadResource); if (cache_view->number_threads == 0) cache_view->number_threads=1; cache_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads); cache_view->virtual_pixel_method=GetImageVirtualPixelMethod(image); cache_view->debug=IsEventLogging(); cache_view->signature=MagickSignature; if (cache_view->nexus_info == (NexusInfo **) NULL) ThrowFatalException(CacheFatalError,"UnableToAcquireCacheView"); return(cache_view); }
MagickExport MagickBooleanType AccelerateConvolveImage(const Image *image, const KernelInfo *kernel,Image *convolve_image,ExceptionInfo *exception) { assert(image != (Image *) NULL); assert(image->signature == MagickSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(kernel != (KernelInfo *) NULL); assert(kernel->signature == MagickSignature); assert(convolve_image != (Image *) NULL); assert(convolve_image->signature == MagickSignature); assert(exception != (ExceptionInfo *) NULL); assert(exception->signature == MagickSignature); if ((image->storage_class != DirectClass) || (image->colorspace == CMYKColorspace)) if ((GetImageVirtualPixelMethod(image) != UndefinedVirtualPixelMethod) && (GetImageVirtualPixelMethod(image) != EdgeVirtualPixelMethod)) return(MagickFalse); #if !defined(MAGICKCORE_OPENCL_SUPPORT) return(MagickFalse); #else { const void *pixels; ConvolveInfo *convolve_info; MagickBooleanType status; MagickSizeType length; void *convolve_pixels; convolve_info=GetConvolveInfo(image,"Convolve",ConvolveKernel,exception); if (convolve_info == (ConvolveInfo *) NULL) return(MagickFalse); pixels=AcquirePixelCachePixels(image,&length,exception); if (pixels == (const void *) NULL) { (void) ThrowMagickException(exception,GetMagickModule(),CacheError, "UnableToReadPixelCache","`%s'",image->filename); convolve_info=DestroyConvolveInfo(convolve_info); return(MagickFalse); } convolve_pixels=GetPixelCachePixels(convolve_image,&length,exception); if (convolve_pixels == (void *) NULL) { (void) ThrowMagickException(exception,GetMagickModule(),CacheError, "UnableToReadPixelCache","`%s'",image->filename); convolve_info=DestroyConvolveInfo(convolve_info); return(MagickFalse); } status=BindConvolveParameters(convolve_info,image,pixels,kernel->values, kernel->width,kernel->height,convolve_pixels); if (status == MagickFalse) { DestroyConvolveBuffers(convolve_info); convolve_info=DestroyConvolveInfo(convolve_info); return(MagickFalse); } status=EnqueueConvolveKernel(convolve_info,image,pixels,kernel->values, kernel->width,kernel->height,convolve_pixels); if (status == MagickFalse) { DestroyConvolveBuffers(convolve_info); convolve_info=DestroyConvolveInfo(convolve_info); return(MagickFalse); } DestroyConvolveBuffers(convolve_info); convolve_info=DestroyConvolveInfo(convolve_info); return(MagickTrue); } #endif }
MagickExport MagickBooleanType AccelerateConvolveImage(const Image *image, const KernelInfo *kernel,Image *convolve_image,ExceptionInfo *exception) { assert(image != (Image *) NULL); assert(image->signature == MagickSignature); if (image->debug != MagickFalse) (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); assert(kernel != (KernelInfo *) NULL); assert(kernel->signature == MagickSignature); assert(convolve_image != (Image *) NULL); assert(convolve_image->signature == MagickSignature); assert(exception != (ExceptionInfo *) NULL); assert(exception->signature == MagickSignature); if ((image->storage_class != DirectClass) || (image->colorspace == CMYKColorspace)) return(MagickFalse); if ((GetImageVirtualPixelMethod(image) != UndefinedVirtualPixelMethod) && (GetImageVirtualPixelMethod(image) != EdgeVirtualPixelMethod)) return(MagickFalse); if (GetPixelChannels(image) != 4) return(MagickFalse); #if !defined(MAGICKCORE_OPENCL_SUPPORT) return(MagickFalse); #else { const void *pixels; float *filter; ConvolveInfo *convolve_info; MagickBooleanType status; MagickSizeType length; register ssize_t i; void *convolve_pixels; convolve_info=GetConvolveInfo(image,"Convolve",ConvolveKernel,exception); if (convolve_info == (ConvolveInfo *) NULL) return(MagickFalse); pixels=AcquirePixelCachePixels(image,&length,exception); if (pixels == (const void *) NULL) { convolve_info=DestroyConvolveInfo(convolve_info); (void) ThrowMagickException(exception,GetMagickModule(),CacheError, "UnableToReadPixelCache","'%s'",image->filename); return(MagickFalse); } convolve_pixels=GetPixelCachePixels(convolve_image,&length,exception); if (convolve_pixels == (void *) NULL) { convolve_info=DestroyConvolveInfo(convolve_info); (void) ThrowMagickException(exception,GetMagickModule(),CacheError, "UnableToReadPixelCache","'%s'",image->filename); return(MagickFalse); } filter=(float *) AcquireQuantumMemory(kernel->width,kernel->height* sizeof(*filter)); if (filter == (float *) NULL) { DestroyConvolveBuffers(convolve_info); convolve_info=DestroyConvolveInfo(convolve_info); (void) ThrowMagickException(exception,GetMagickModule(), ResourceLimitError,"MemoryAllocationFailed","'%s'",image->filename); return(MagickFalse); } for (i=0; i < (ssize_t) (kernel->width*kernel->height); i++) filter[i]=(float) kernel->values[i]; status=BindConvolveParameters(convolve_info,image,pixels,filter, kernel->width,kernel->height,convolve_pixels); if (status == MagickFalse) { filter=(float *) RelinquishMagickMemory(filter); DestroyConvolveBuffers(convolve_info); convolve_info=DestroyConvolveInfo(convolve_info); return(MagickFalse); } status=EnqueueConvolveKernel(convolve_info,image,pixels,filter, kernel->width,kernel->height,convolve_pixels); filter=(float *) RelinquishMagickMemory(filter); if (status == MagickFalse) { DestroyConvolveBuffers(convolve_info); convolve_info=DestroyConvolveInfo(convolve_info); return(MagickFalse); } DestroyConvolveBuffers(convolve_info); convolve_info=DestroyConvolveInfo(convolve_info); return(MagickTrue); } #endif }