From fcb1a668b974425a0378c278db25aca29ec70894 Mon Sep 17 00:00:00 2001 From: cristy Date: Sun, 20 Sep 2009 02:31:52 +0000 Subject: [PATCH] --- coders/tile.c | 3 +- magick/composite.c | 120 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 115 insertions(+), 8 deletions(-) diff --git a/coders/tile.c b/coders/tile.c index fa6c4f1a6..398368840 100644 --- a/coders/tile.c +++ b/coders/tile.c @@ -74,7 +74,8 @@ % % The format of the ReadTILEImage method is: % -% Image *ReadTILEImage(const ImageInfo *image_info,ExceptionInfo *exception) +% Image *ReadTILEImage(const ImageInfo *image_info, +% ExceptionInfo *exception) % % A description of each parameter follows: % diff --git a/magick/composite.c b/magick/composite.c index 629195249..47505acae 100644 --- a/magick/composite.c +++ b/magick/composite.c @@ -2399,13 +2399,17 @@ MagickExport MagickBooleanType TextureImage(Image *image,const Image *texture) { #define TextureImageTag "Texture/Image" + CacheView + *image_view, + *texture_view; + ExceptionInfo *exception; long y; - MagickStatusType + MagickBooleanType status; assert(image != (Image *) NULL); @@ -2416,29 +2420,131 @@ MagickExport MagickBooleanType TextureImage(Image *image,const Image *texture) return(MagickFalse); if (SetImageStorageClass(image,DirectClass) == MagickFalse) return(MagickFalse); + status=MagickTrue; + if ((image->compose != CopyCompositeOp) && + ((image->compose != OverCompositeOp) || (image->matte != MagickFalse))) + { + /* + Tile texture onto the image background. + */ +#if defined(_OPENMP) && (_OPENMP >= 200203) + #pragma omp parallel for schedule(static,1) shared(status) +#endif + for (y=0; y < (long) image->rows; y+=texture->rows) + { + register long + x; + + if (status == MagickFalse) + continue; + for (x=0; x < (long) image->columns; x+=texture->columns) + { + MagickBooleanType + thread_status; + + thread_status=CompositeImage(image,image->compose,texture,x+ + texture->tile_offset.x,y+texture->tile_offset.y); + if (thread_status == MagickFalse) + { + status=thread_status; + break; + } + } + if (image->progress_monitor != (MagickProgressMonitor) NULL) + { + MagickBooleanType + proceed; + +#if defined(_OPENMP) && (_OPENMP >= 200203) + #pragma omp critical (MagickCore_TextureImage) +#endif + proceed=SetImageProgress(image,TextureImageTag,y,image->rows); + if (proceed == MagickFalse) + status=MagickFalse; + } + } + (void) SetImageProgress(image,TextureImageTag,(MagickOffsetType) + image->rows,image->rows); + return(status); + } /* - Tile texture onto the image background. + Tile texture onto the image background (optimized). */ status=MagickTrue; exception=(&image->exception); - for (y=0; y < (long) image->rows; y+=texture->rows) + image_view=AcquireCacheView(image); + texture_view=AcquireCacheView(texture); +#if defined(_OPENMP) && (_OPENMP >= 200203) +#pragma omp parallel for schedule(static,1) shared(status) +#endif + for (y=0; y < (long) image->rows; y++) { + MagickBooleanType + sync; + + register const IndexPacket + *texture_indexes; + + register const PixelPacket + *p; + + register IndexPacket + *indexes; + register long x; + register PixelPacket + *q; + + unsigned long + width; + + if (status == MagickFalse) + continue; + p=GetCacheViewVirtualPixels(texture_view,0,y % texture->rows, + texture->columns,1,exception); + q=QueueCacheViewAuthenticPixels(image_view,0,y,image->columns,1, + exception); + if ((p == (const PixelPacket *) NULL) || (q == (PixelPacket *) NULL)) + { + status=MagickFalse; + continue; + } + texture_indexes=GetCacheViewVirtualIndexQueue(texture_view); + indexes=GetCacheViewAuthenticIndexQueue(image_view); for (x=0; x < (long) image->columns; x+=texture->columns) - status|=CompositeImage(image,image->compose,texture,x+ - texture->tile_offset.x,y+texture->tile_offset.y); + { + width=texture->columns; + if ((x+width) > (long) image->columns) + width=image->columns-x; + (void) CopyMagickMemory(q,p,width*sizeof(*p)); + if ((indexes != (IndexPacket *) NULL) && + (texture_indexes != (const IndexPacket *) NULL)) + { + (void) CopyMagickMemory(indexes,texture_indexes,width* + sizeof(*indexes)); + indexes+=width; + } + q+=width; + } + sync=SyncCacheViewAuthenticPixels(image_view,exception); + if (sync == MagickFalse) + status=MagickFalse; if (image->progress_monitor != (MagickProgressMonitor) NULL) { MagickBooleanType proceed; +#if defined(_OPENMP) && (_OPENMP >= 200203) +#pragma omp critical (MagickCore_TextureImage) +#endif proceed=SetImageProgress(image,TextureImageTag,y,image->rows); if (proceed == MagickFalse) status=MagickFalse; } } - (void) SetImageProgress(image,TextureImageTag,image->rows,image->rows); - return(status != 0 ? MagickTrue : MagickFalse); + texture_view=DestroyCacheView(texture_view); + image_view=DestroyCacheView(image_view); + return(status); } -- 2.40.0