cache-view.c revision c11dacef705c151ed54ef04628d7ef800086e081
1/* 2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 3% % 4% % 5% % 6% CCCC AAA CCCC H H EEEEE % 7% C A A C H H E % 8% C AAAAA C HHHHH EEE % 9% C A A C H H E % 10% CCCC A A CCCC H H EEEEE % 11% % 12% V V IIIII EEEEE W W % 13% V V I E W W % 14% V V I EEE W W W % 15% V V I E WW WW % 16% V IIIII EEEEE W W % 17% % 18% % 19% MagickCore Cache View Methods % 20% % 21% Software Design % 22% John Cristy % 23% February 2000 % 24% % 25% % 26% Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization % 27% dedicated to making software imaging solutions freely available. % 28% % 29% You may not use this file except in compliance with the License. You may % 30% obtain a copy of the License at % 31% % 32% http://www.imagemagick.org/script/license.php % 33% % 34% Unless required by applicable law or agreed to in writing, software % 35% distributed under the License is distributed on an "AS IS" BASIS, % 36% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % 37% See the License for the specific language governing permissions and % 38% limitations under the License. % 39% % 40%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 41% 42% 43% 44*/ 45 46/* 47 Include declarations. 48*/ 49#include "MagickCore/studio.h" 50#include "MagickCore/cache.h" 51#include "MagickCore/cache-private.h" 52#include "MagickCore/cache-view.h" 53#include "MagickCore/memory_.h" 54#include "MagickCore/exception.h" 55#include "MagickCore/exception-private.h" 56#include "MagickCore/pixel-accessor.h" 57#include "MagickCore/string_.h" 58#include "MagickCore/thread-private.h" 59 60/* 61 Typedef declarations. 62*/ 63struct _CacheView 64{ 65 Image 66 *image; 67 68 VirtualPixelMethod 69 virtual_pixel_method; 70 71 size_t 72 number_threads; 73 74 NexusInfo 75 **nexus_info; 76 77 MagickBooleanType 78 debug; 79 80 size_t 81 signature; 82}; 83 84/* 85%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 86% % 87% % 88% % 89% A c q u i r e C a c h e V i e w % 90% % 91% % 92% % 93%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 94% 95% AcquireCacheView() acquires a view into the pixel cache, using the 96% VirtualPixelMethod that is defined within the given image itself. 97% 98% The format of the AcquireCacheView method is: 99% 100% CacheView *AcquireCacheView(const Image *image) 101% 102% A description of each parameter follows: 103% 104% o image: the image. 105% 106*/ 107MagickExport CacheView *AcquireCacheView(const Image *image) 108{ 109 CacheView 110 *cache_view; 111 112 assert(image != (Image *) NULL); 113 assert(image->signature == MagickSignature); 114 if (image->debug != MagickFalse) 115 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 116 cache_view=(CacheView *) AcquireQuantumMemory(1,sizeof(*cache_view)); 117 if (cache_view == (CacheView *) NULL) 118 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); 119 (void) ResetMagickMemory(cache_view,0,sizeof(*cache_view)); 120 cache_view->image=ReferenceImage((Image *) image); 121 cache_view->number_threads=GetOpenMPMaximumThreads(); 122 cache_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads); 123 cache_view->virtual_pixel_method=GetImageVirtualPixelMethod(image); 124 cache_view->debug=IsEventLogging(); 125 cache_view->signature=MagickSignature; 126 if (cache_view->nexus_info == (NexusInfo **) NULL) 127 ThrowFatalException(CacheFatalError,"UnableToAcquireCacheView"); 128 return(cache_view); 129} 130 131/* 132%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 133% % 134% % 135% % 136% C l o n e C a c h e V i e w % 137% % 138% % 139% % 140%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 141% 142% CloneCacheView() makes an exact copy of the specified cache view. 143% 144% The format of the CloneCacheView method is: 145% 146% CacheView *CloneCacheView(const CacheView *cache_view) 147% 148% A description of each parameter follows: 149% 150% o cache_view: the cache view. 151% 152*/ 153MagickExport CacheView *CloneCacheView(const CacheView *cache_view) 154{ 155 CacheView 156 *clone_view; 157 158 assert(cache_view != (CacheView *) NULL); 159 assert(cache_view->signature == MagickSignature); 160 if (cache_view->debug != MagickFalse) 161 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 162 cache_view->image->filename); 163 clone_view=(CacheView *) AcquireQuantumMemory(1,sizeof(*clone_view)); 164 if (clone_view == (CacheView *) NULL) 165 ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed"); 166 (void) ResetMagickMemory(clone_view,0,sizeof(*clone_view)); 167 clone_view->image=ReferenceImage(cache_view->image); 168 clone_view->number_threads=cache_view->number_threads; 169 clone_view->nexus_info=AcquirePixelCacheNexus(cache_view->number_threads); 170 clone_view->virtual_pixel_method=cache_view->virtual_pixel_method; 171 clone_view->debug=cache_view->debug; 172 clone_view->signature=MagickSignature; 173 return(clone_view); 174} 175 176/* 177%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 178% % 179% % 180% % 181% D e s t r o y C a c h e V i e w % 182% % 183% % 184% % 185%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 186% 187% DestroyCacheView() destroys the specified view returned by a previous call 188% to AcquireCacheView(). 189% 190% The format of the DestroyCacheView method is: 191% 192% CacheView *DestroyCacheView(CacheView *cache_view) 193% 194% A description of each parameter follows: 195% 196% o cache_view: the cache view. 197% 198*/ 199MagickExport CacheView *DestroyCacheView(CacheView *cache_view) 200{ 201 assert(cache_view != (CacheView *) NULL); 202 assert(cache_view->signature == MagickSignature); 203 if (cache_view->debug != MagickFalse) 204 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 205 cache_view->image->filename); 206 if (cache_view->nexus_info != (NexusInfo **) NULL) 207 cache_view->nexus_info=DestroyPixelCacheNexus(cache_view->nexus_info, 208 cache_view->number_threads); 209 cache_view->image=DestroyImage(cache_view->image); 210 cache_view->signature=(~MagickSignature); 211 cache_view=(CacheView *) RelinquishMagickMemory(cache_view); 212 return(cache_view); 213} 214 215/* 216%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 217% % 218% % 219% % 220% G e t C a c h e V i e w C o l o r s p a c e % 221% % 222% % 223% % 224%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 225% 226% GetCacheViewColorspace() returns the image colorspace associated with the 227% specified view. 228% 229% The format of the GetCacheViewColorspace method is: 230% 231% ColorspaceType GetCacheViewColorspace(const CacheView *cache_view) 232% 233% A description of each parameter follows: 234% 235% o cache_view: the cache view. 236% 237*/ 238MagickExport ColorspaceType GetCacheViewColorspace(const CacheView *cache_view) 239{ 240 assert(cache_view != (CacheView *) NULL); 241 assert(cache_view->signature == MagickSignature); 242 if (cache_view->debug != MagickFalse) 243 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 244 cache_view->image->filename); 245 return(GetPixelCacheColorspace(cache_view->image->cache)); 246} 247 248/* 249%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 250% % 251% % 252% % 253+ G e t C a c h e V i e w E x t e n t % 254% % 255% % 256% % 257%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 258% 259% GetCacheViewExtent() returns the extent of the pixels associated with the 260% last call to QueueCacheViewAuthenticPixels() or 261% GetCacheViewAuthenticPixels(). 262% 263% The format of the GetCacheViewExtent() method is: 264% 265% MagickSizeType GetCacheViewExtent(const CacheView *cache_view) 266% 267% A description of each parameter follows: 268% 269% o cache_view: the cache view. 270% 271*/ 272MagickExport MagickSizeType GetCacheViewExtent(const CacheView *cache_view) 273{ 274 const int 275 id = GetOpenMPThreadId(); 276 277 MagickSizeType 278 extent; 279 280 assert(cache_view != (CacheView *) NULL); 281 assert(cache_view->signature == MagickSignature); 282 if (cache_view->debug != MagickFalse) 283 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 284 cache_view->image->filename); 285 assert(cache_view->image->cache != (Cache) NULL); 286 assert(id < (int) cache_view->number_threads); 287 extent=GetPixelCacheNexusExtent(cache_view->image->cache, 288 cache_view->nexus_info[id]); 289 return(extent); 290} 291 292/* 293%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 294% % 295% % 296% % 297% G e t C a c h e V i e w S t o r a g e C l a s s % 298% % 299% % 300% % 301%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 302% 303% GetCacheViewStorageClass() returns the image storage class associated with 304% the specified view. 305% 306% The format of the GetCacheViewStorageClass method is: 307% 308% ClassType GetCacheViewStorageClass(const CacheView *cache_view) 309% 310% A description of each parameter follows: 311% 312% o cache_view: the cache view. 313% 314*/ 315MagickExport ClassType GetCacheViewStorageClass(const CacheView *cache_view) 316{ 317 assert(cache_view != (CacheView *) NULL); 318 assert(cache_view->signature == MagickSignature); 319 if (cache_view->debug != MagickFalse) 320 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 321 cache_view->image->filename); 322 return(GetPixelCacheStorageClass(cache_view->image->cache)); 323} 324 325/* 326%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 327% % 328% % 329% % 330% G e t C a c h e V i e w A u t h e n t i c P i x e l s % 331% % 332% % 333% % 334%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 335% 336% GetCacheViewAuthenticPixels() gets pixels from the in-memory or disk pixel 337% cache as defined by the geometry parameters. A pointer to the pixels is 338% returned if the pixels are transferred, otherwise a NULL is returned. 339% 340% The format of the GetCacheViewAuthenticPixels method is: 341% 342% Quantum *GetCacheViewAuthenticPixels(CacheView *cache_view, 343% const ssize_t x,const ssize_t y,const size_t columns, 344% const size_t rows,ExceptionInfo *exception) 345% 346% A description of each parameter follows: 347% 348% o cache_view: the cache view. 349% 350% o x,y,columns,rows: These values define the perimeter of a region of 351% pixels. 352% 353*/ 354MagickExport Quantum *GetCacheViewAuthenticPixels(CacheView *cache_view, 355 const ssize_t x,const ssize_t y,const size_t columns,const size_t rows, 356 ExceptionInfo *exception) 357{ 358 const int 359 id = GetOpenMPThreadId(); 360 361 Quantum 362 *pixels; 363 364 assert(cache_view != (CacheView *) NULL); 365 assert(cache_view->signature == MagickSignature); 366 assert(id < (int) cache_view->number_threads); 367 pixels=GetAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows, 368 cache_view->nexus_info[id],exception); 369 return(pixels); 370} 371 372/* 373%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 374% % 375% % 376% % 377% G e t C a c h 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 % 378% % 379% % 380% % 381%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 382% 383% GetCacheViewAuthenticMetacontent() returns the meta-content corresponding 384% with the last call to SetCacheViewIndexes() or 385% GetCacheViewAuthenticMetacontent(). The meta-content are authentic and can 386% be updated. 387% 388% The format of the GetCacheViewAuthenticMetacontent() method is: 389% 390% void *GetCacheViewAuthenticMetacontent(CacheView *cache_view) 391% 392% A description of each parameter follows: 393% 394% o cache_view: the cache view. 395% 396*/ 397MagickExport void *GetCacheViewAuthenticMetacontent( 398 CacheView *cache_view) 399{ 400 const int 401 id = GetOpenMPThreadId(); 402 403 void 404 *metacontent; 405 406 assert(cache_view != (CacheView *) NULL); 407 assert(cache_view->signature == MagickSignature); 408 assert(cache_view->image->cache != (Cache) NULL); 409 assert(id < (int) cache_view->number_threads); 410 metacontent=GetPixelCacheNexusMetacontent(cache_view->image->cache, 411 cache_view->nexus_info[id]); 412 return(metacontent); 413} 414 415/* 416%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 417% % 418% % 419% % 420% G e t C a c h e V i e w A u t h e n t i c P i x e l Q u e u e % 421% % 422% % 423% % 424%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 425% 426% GetCacheViewAuthenticPixelQueue() returns the pixels associated with the 427% last call to QueueCacheViewAuthenticPixels() or 428% GetCacheViewAuthenticPixels(). The pixels are authentic and therefore can be 429% updated. 430% 431% The format of the GetCacheViewAuthenticPixelQueue() method is: 432% 433% Quantum *GetCacheViewAuthenticPixelQueue(CacheView *cache_view) 434% 435% A description of each parameter follows: 436% 437% o cache_view: the cache view. 438% 439*/ 440MagickExport Quantum *GetCacheViewAuthenticPixelQueue(CacheView *cache_view) 441{ 442 const int 443 id = GetOpenMPThreadId(); 444 445 Quantum 446 *pixels; 447 448 assert(cache_view != (CacheView *) NULL); 449 assert(cache_view->signature == MagickSignature); 450 assert(cache_view->image->cache != (Cache) NULL); 451 assert(id < (int) cache_view->number_threads); 452 pixels=GetPixelCacheNexusPixels(cache_view->image->cache, 453 cache_view->nexus_info[id]); 454 return(pixels); 455} 456 457/* 458%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 459% % 460% % 461% % 462% G e t C a c h e V i e w V i r t u a l M e t a c o n t e n t % 463% % 464% % 465% % 466%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 467% 468% GetCacheViewVirtualMetacontent() returns the meta-content corresponding 469% with the last call to GetCacheViewVirtualMetacontent(). The meta-content 470% is virtual and therefore cannot be updated. 471% 472% The format of the GetCacheViewVirtualMetacontent() method is: 473% 474% const void *GetCacheViewVirtualMetacontent( 475% const CacheView *cache_view) 476% 477% A description of each parameter follows: 478% 479% o cache_view: the cache view. 480% 481*/ 482MagickExport const void *GetCacheViewVirtualMetacontent( 483 const CacheView *cache_view) 484{ 485 const int 486 id = GetOpenMPThreadId(); 487 488 const void 489 *metacontent; 490 491 assert(cache_view != (const CacheView *) NULL); 492 assert(cache_view->signature == MagickSignature); 493 assert(cache_view->image->cache != (Cache) NULL); 494 assert(id < (int) cache_view->number_threads); 495 metacontent=GetVirtualMetacontentFromNexus(cache_view->image->cache, 496 cache_view->nexus_info[id]); 497 return(metacontent); 498} 499 500/* 501%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 502% % 503% % 504% % 505% G e t C a c h e V i e w V i r t u a l P i x e l Q u e u e % 506% % 507% % 508% % 509%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 510% 511% GetCacheViewVirtualPixelQueue() returns the the pixels associated with 512% the last call to GetCacheViewVirtualPixels(). The pixels are virtual 513% and therefore cannot be updated. 514% 515% The format of the GetCacheViewVirtualPixelQueue() method is: 516% 517% const Quantum *GetCacheViewVirtualPixelQueue( 518% const CacheView *cache_view) 519% 520% A description of each parameter follows: 521% 522% o cache_view: the cache view. 523% 524*/ 525MagickExport const Quantum *GetCacheViewVirtualPixelQueue( 526 const CacheView *cache_view) 527{ 528 const int 529 id = GetOpenMPThreadId(); 530 531 const Quantum 532 *pixels; 533 534 assert(cache_view != (const CacheView *) NULL); 535 assert(cache_view->signature == MagickSignature); 536 assert(cache_view->image->cache != (Cache) NULL); 537 assert(id < (int) cache_view->number_threads); 538 pixels=GetVirtualPixelsNexus(cache_view->image->cache, 539 cache_view->nexus_info[id]); 540 return(pixels); 541} 542 543/* 544%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 545% % 546% % 547% % 548% G e t C a c h e V i e w V i r t u a l P i x e l s % 549% % 550% % 551% % 552%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 553% 554% GetCacheViewVirtualPixels() gets virtual pixels from the in-memory or 555% disk pixel cache as defined by the geometry parameters. A pointer to the 556% pixels is returned if the pixels are transferred, otherwise a NULL is 557% returned. 558% 559% The format of the GetCacheViewVirtualPixels method is: 560% 561% const Quantum *GetCacheViewVirtualPixels( 562% const CacheView *cache_view,const ssize_t x,const ssize_t y, 563% const size_t columns,const size_t rows,ExceptionInfo *exception) 564% 565% A description of each parameter follows: 566% 567% o cache_view: the cache view. 568% 569% o x,y,columns,rows: These values define the perimeter of a region of 570% pixels. 571% 572% o exception: return any errors or warnings in this structure. 573% 574*/ 575MagickExport const Quantum *GetCacheViewVirtualPixels( 576 const CacheView *cache_view,const ssize_t x,const ssize_t y, 577 const size_t columns,const size_t rows,ExceptionInfo *exception) 578{ 579 const int 580 id = GetOpenMPThreadId(); 581 582 const Quantum 583 *pixels; 584 585 assert(cache_view != (CacheView *) NULL); 586 assert(cache_view->signature == MagickSignature); 587 assert(id < (int) cache_view->number_threads); 588 pixels=GetVirtualPixelsFromNexus(cache_view->image, 589 cache_view->virtual_pixel_method,x,y,columns,rows, 590 cache_view->nexus_info[id],exception); 591 return(pixels); 592} 593 594/* 595%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 596% % 597% % 598% % 599% G e t O n e C a c h e V i e w A u t h e n t i c P i x e l % 600% % 601% % 602% % 603%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 604% 605% GetOneCacheViewAuthenticPixel() returns a single pixel at the specified (x,y) 606% location. The image background color is returned if an error occurs. 607% 608% The format of the GetOneCacheViewAuthenticPixel method is: 609% 610% MagickBooleaNType GetOneCacheViewAuthenticPixel( 611% const CacheView *cache_view,const ssize_t x,const ssize_t y, 612% Quantum *pixel,ExceptionInfo *exception) 613% 614% A description of each parameter follows: 615% 616% o cache_view: the cache view. 617% 618% o x,y: These values define the offset of the pixel. 619% 620% o pixel: return a pixel at the specified (x,y) location. 621% 622% o exception: return any errors or warnings in this structure. 623% 624*/ 625MagickExport MagickBooleanType GetOneCacheViewAuthenticPixel( 626 const CacheView *cache_view,const ssize_t x,const ssize_t y,Quantum *pixel, 627 ExceptionInfo *exception) 628{ 629 const int 630 id = GetOpenMPThreadId(); 631 632 Quantum 633 *p; 634 635 register ssize_t 636 i; 637 638 assert(cache_view != (CacheView *) NULL); 639 assert(cache_view->signature == MagickSignature); 640 assert(id < (int) cache_view->number_threads); 641 (void) memset(pixel,0,MaxPixelChannels*sizeof(*pixel)); 642 p=GetAuthenticPixelCacheNexus(cache_view->image,x,y,1,1, 643 cache_view->nexus_info[id],exception); 644 if (p == (const Quantum *) NULL) 645 { 646 pixel[RedPixelChannel]=cache_view->image->background_color.red; 647 pixel[GreenPixelChannel]=cache_view->image->background_color.green; 648 pixel[BluePixelChannel]=cache_view->image->background_color.blue; 649 pixel[AlphaPixelChannel]=cache_view->image->background_color.alpha; 650 return(MagickFalse); 651 } 652 for (i=0; i < (ssize_t) GetPixelChannels(cache_view->image); i++) 653 { 654 PixelChannel 655 channel; 656 657 channel=GetPixelChannelMapChannel(cache_view->image,i); 658 pixel[channel]=p[i]; 659 } 660 return(MagickTrue); 661} 662 663/* 664%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 665% % 666% % 667% % 668% G e t O n e C a c h e V i e w V i r t u a l P i x e l % 669% % 670% % 671% % 672%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 673% 674% GetOneCacheViewVirtualPixel() returns a single pixel at the specified (x,y) 675% location. The image background color is returned if an error occurs. If 676% you plan to modify the pixel, use GetOneCacheViewAuthenticPixel() instead. 677% 678% The format of the GetOneCacheViewVirtualPixel method is: 679% 680% MagickBooleanType GetOneCacheViewVirtualPixel( 681% const CacheView *cache_view,const ssize_t x,const ssize_t y, 682% Quantum *pixel,ExceptionInfo *exception) 683% 684% A description of each parameter follows: 685% 686% o cache_view: the cache view. 687% 688% o x,y: These values define the offset of the pixel. 689% 690% o pixel: return a pixel at the specified (x,y) location. 691% 692% o exception: return any errors or warnings in this structure. 693% 694*/ 695MagickExport MagickBooleanType GetOneCacheViewVirtualPixel( 696 const CacheView *cache_view,const ssize_t x,const ssize_t y,Quantum *pixel, 697 ExceptionInfo *exception) 698{ 699 const int 700 id = GetOpenMPThreadId(); 701 702 const Quantum 703 *p; 704 705 register ssize_t 706 i; 707 708 assert(cache_view != (CacheView *) NULL); 709 assert(cache_view->signature == MagickSignature); 710 assert(id < (int) cache_view->number_threads); 711 (void) memset(pixel,0,MaxPixelChannels*sizeof(*pixel)); 712 p=GetVirtualPixelsFromNexus(cache_view->image, 713 cache_view->virtual_pixel_method,x,y,1,1,cache_view->nexus_info[id], 714 exception); 715 if (p == (const Quantum *) NULL) 716 { 717 pixel[RedPixelChannel]=cache_view->image->background_color.red; 718 pixel[GreenPixelChannel]=cache_view->image->background_color.green; 719 pixel[BluePixelChannel]=cache_view->image->background_color.blue; 720 pixel[AlphaPixelChannel]=cache_view->image->background_color.alpha; 721 return(MagickFalse); 722 } 723 for (i=0; i < (ssize_t) GetPixelChannels(cache_view->image); i++) 724 { 725 PixelChannel 726 channel; 727 728 channel=GetPixelChannelMapChannel(cache_view->image,i); 729 pixel[channel]=p[i]; 730 } 731 return(MagickTrue); 732} 733 734/* 735%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 736% % 737% % 738% % 739% G e t O n e C a c h e V i e w V i r t u a l P i x e l % 740% % 741% % 742% % 743%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 744% 745% GetOneCacheViewVirtualMethodPixel() returns a single virtual pixel at 746% the specified (x,y) location. The image background color is returned if an 747% error occurs. If you plan to modify the pixel, use 748% GetOneCacheViewAuthenticPixel() instead. 749% 750% The format of the GetOneCacheViewVirtualPixel method is: 751% 752% MagickBooleanType GetOneCacheViewVirtualMethodPixel( 753% const CacheView *cache_view, 754% const VirtualPixelMethod virtual_pixel_method,const ssize_t x, 755% const ssize_t y,Quantum *pixel,ExceptionInfo *exception) 756% 757% A description of each parameter follows: 758% 759% o cache_view: the cache view. 760% 761% o virtual_pixel_method: the virtual pixel method. 762% 763% o x,y: These values define the offset of the pixel. 764% 765% o pixel: return a pixel at the specified (x,y) location. 766% 767% o exception: return any errors or warnings in this structure. 768% 769*/ 770MagickExport MagickBooleanType GetOneCacheViewVirtualMethodPixel( 771 const CacheView *cache_view,const VirtualPixelMethod virtual_pixel_method, 772 const ssize_t x,const ssize_t y,Quantum *pixel,ExceptionInfo *exception) 773{ 774 const int 775 id = GetOpenMPThreadId(); 776 777 const Quantum 778 *p; 779 780 register ssize_t 781 i; 782 783 assert(cache_view != (CacheView *) NULL); 784 assert(cache_view->signature == MagickSignature); 785 assert(id < (int) cache_view->number_threads); 786 (void) memset(pixel,0,MaxPixelChannels*sizeof(*pixel)); 787 p=GetVirtualPixelsFromNexus(cache_view->image,virtual_pixel_method,x,y,1,1, 788 cache_view->nexus_info[id],exception); 789 if (p == (const Quantum *) NULL) 790 { 791 pixel[RedPixelChannel]=cache_view->image->background_color.red; 792 pixel[GreenPixelChannel]=cache_view->image->background_color.green; 793 pixel[BluePixelChannel]=cache_view->image->background_color.blue; 794 pixel[AlphaPixelChannel]=cache_view->image->background_color.alpha; 795 return(MagickFalse); 796 } 797 for (i=0; i < (ssize_t) GetPixelChannels(cache_view->image); i++) 798 { 799 PixelChannel 800 channel; 801 802 channel=GetPixelChannelMapChannel(cache_view->image,i); 803 pixel[channel]=p[i]; 804 } 805 return(MagickTrue); 806} 807 808/* 809%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 810% % 811% % 812% % 813% Q u e u e C a c h e V i e w A u t h e n t i c P i x e l s % 814% % 815% % 816% % 817%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 818% 819% QueueCacheViewAuthenticPixels() queues authentic pixels from the in-memory or 820% disk pixel cache as defined by the geometry parameters. A pointer to the 821% pixels is returned if the pixels are transferred, otherwise a NULL is 822% returned. 823% 824% The format of the QueueCacheViewAuthenticPixels method is: 825% 826% Quantum *QueueCacheViewAuthenticPixels(CacheView *cache_view, 827% const ssize_t x,const ssize_t y,const size_t columns, 828% const size_t rows,ExceptionInfo *exception) 829% 830% A description of each parameter follows: 831% 832% o cache_view: the cache view. 833% 834% o x,y,columns,rows: These values define the perimeter of a region of 835% pixels. 836% 837% o exception: return any errors or warnings in this structure. 838% 839*/ 840MagickExport Quantum *QueueCacheViewAuthenticPixels(CacheView *cache_view, 841 const ssize_t x,const ssize_t y,const size_t columns,const size_t rows, 842 ExceptionInfo *exception) 843{ 844 const int 845 id = GetOpenMPThreadId(); 846 847 Quantum 848 *pixels; 849 850 assert(cache_view != (CacheView *) NULL); 851 assert(cache_view->signature == MagickSignature); 852 assert(id < (int) cache_view->number_threads); 853 pixels=QueueAuthenticPixelCacheNexus(cache_view->image,x,y,columns,rows, 854 MagickFalse,cache_view->nexus_info[id],exception); 855 return(pixels); 856} 857 858/* 859%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 860% % 861% % 862% % 863% S e t C a c h e V i e w S t o r a g e C l a s s % 864% % 865% % 866% % 867%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 868% 869% SetCacheViewStorageClass() sets the image storage class associated with 870% the specified view. 871% 872% The format of the SetCacheViewStorageClass method is: 873% 874% MagickBooleanType SetCacheViewStorageClass(CacheView *cache_view, 875% const ClassType storage_class,ExceptionInfo *exception) 876% 877% A description of each parameter follows: 878% 879% o cache_view: the cache view. 880% 881% o storage_class: the image storage class: PseudoClass or DirectClass. 882% 883% o exception: return any errors or warnings in this structure. 884% 885*/ 886MagickExport MagickBooleanType SetCacheViewStorageClass(CacheView *cache_view, 887 const ClassType storage_class,ExceptionInfo *exception) 888{ 889 assert(cache_view != (CacheView *) NULL); 890 assert(cache_view->signature == MagickSignature); 891 if (cache_view->debug != MagickFalse) 892 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 893 cache_view->image->filename); 894 return(SetImageStorageClass(cache_view->image,storage_class,exception)); 895} 896 897/* 898%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 899% % 900% % 901% % 902% S e t C a c h e V i e w V i r t u a l P i x e l M e t h o d % 903% % 904% % 905% % 906%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 907% 908% SetCacheViewVirtualPixelMethod() sets the virtual pixel method associated 909% with the specified cache view. 910% 911% The format of the SetCacheViewVirtualPixelMethod method is: 912% 913% MagickBooleanType SetCacheViewVirtualPixelMethod(CacheView *cache_view, 914% const VirtualPixelMethod virtual_pixel_method) 915% 916% A description of each parameter follows: 917% 918% o cache_view: the cache view. 919% 920% o virtual_pixel_method: the virtual pixel method. 921% 922*/ 923MagickExport MagickBooleanType SetCacheViewVirtualPixelMethod( 924 CacheView *cache_view,const VirtualPixelMethod virtual_pixel_method) 925{ 926 assert(cache_view != (CacheView *) NULL); 927 assert(cache_view->signature == MagickSignature); 928 if (cache_view->debug != MagickFalse) 929 (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 930 cache_view->image->filename); 931 cache_view->virtual_pixel_method=virtual_pixel_method; 932 return(MagickTrue); 933} 934 935/* 936%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 937% % 938% % 939% % 940% S y n c C a c h e V i e w A u t h e n t i c P i x e l s % 941% % 942% % 943% % 944%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 945% 946% SyncCacheViewAuthenticPixels() saves the cache view pixels to the in-memory 947% or disk cache. It returns MagickTrue if the pixel region is flushed, 948% otherwise MagickFalse. 949% 950% The format of the SyncCacheViewAuthenticPixels method is: 951% 952% MagickBooleanType SyncCacheViewAuthenticPixels(CacheView *cache_view, 953% ExceptionInfo *exception) 954% 955% A description of each parameter follows: 956% 957% o cache_view: the cache view. 958% 959% o exception: return any errors or warnings in this structure. 960% 961*/ 962MagickExport MagickBooleanType SyncCacheViewAuthenticPixels( 963 CacheView *cache_view,ExceptionInfo *exception) 964{ 965 const int 966 id = GetOpenMPThreadId(); 967 968 MagickBooleanType 969 status; 970 971 assert(cache_view != (CacheView *) NULL); 972 assert(cache_view->signature == MagickSignature); 973 assert(id < (int) cache_view->number_threads); 974 status=SyncAuthenticPixelCacheNexus(cache_view->image, 975 cache_view->nexus_info[id],exception); 976 return(status); 977} 978