13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% FFFFF PPPP X X % 73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% F P P X X % 83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% FFF PPPP X % 93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% F P X X % 103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% F P X X % 113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Read/Write FlashPIX Image Format % 143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Software Design % 16de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy% Cristy % 173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% July 1992 % 183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 207ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy% Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization % 213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% dedicated to making software imaging solutions freely available. % 223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% You may not use this file except in compliance with the License. You may % 243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% obtain a copy of the License at % 253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% http://www.imagemagick.org/script/license.php % 273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Unless required by applicable law or agreed to in writing, software % 293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% distributed under the License is distributed on an "AS IS" BASIS, % 303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % 313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% See the License for the specific language governing permissions and % 323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% limitations under the License. % 333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Include declarations. 413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 420a4d92f06aff8fa275dafec6a83e25d4f47bba1fcristy#include "MagickCore/studio.h" 43feb6b41a71b0bfd5192254cfcfdd4c421ecce9d8cristy#include "MagickCore/attribute.h" 444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/property.h" 454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h" 464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h" 474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h" 484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color.h" 494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/color-private.h" 506c9c9e800df645c721d4f81bebca5bc7cfb75e58cristy#include "MagickCore/colormap.h" 516c9c9e800df645c721d4f81bebca5bc7cfb75e58cristy#include "MagickCore/colorspace.h" 526c9c9e800df645c721d4f81bebca5bc7cfb75e58cristy#include "MagickCore/colorspace-private.h" 534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/constitute.h" 544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h" 554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h" 564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/geometry.h" 574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h" 584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h" 594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h" 604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h" 614c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h" 624c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h" 634c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h" 64a2e7da87c9d566e9fb709afbeec7c0551287fa24Cristy#include "MagickCore/option.h" 654c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel.h" 66feb6b41a71b0bfd5192254cfcfdd4c421ecce9d8cristy#include "MagickCore/pixel-accessor.h" 67feb6b41a71b0bfd5192254cfcfdd4c421ecce9d8cristy#include "MagickCore/property.h" 684c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h" 694c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/static.h" 704c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h" 714c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/module.h" 723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_FPX_DELEGATE) 730157aeadef2fce908277168097a160a8f15a6952cristy#if !defined(vms) && !defined(macintosh) && !defined(MAGICKCORE_WINDOWS_SUPPORT) 743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <fpxlib.h> 753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "Fpxlib.h" 773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_FPX_DELEGATE) 813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Forward declarations. 833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 843ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 851e178e70fb3c956f9fc1e30c3ba863e882666465cristy WriteFPXImage(const ImageInfo *,Image *,ExceptionInfo *); 863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_FPX_DELEGATE) 893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d F P X I m a g e % 953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadFPXImage() reads a FlashPix image file and returns it. It 1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% allocates the memory necessary for the new Image structure and returns a 1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% pointer to the new image. This method was contributed by BillR@corbis.com. 1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadFPXImage method is: 1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadFPXImage(const ImageInfo *image_info,ExceptionInfo *exception) 1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadFPXImage(const ImageInfo *image_info,ExceptionInfo *exception) 1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1174825f051a2c5f09c0ebe3977c6b06dd99d92a3bedirk const char 1184825f051a2c5f09c0ebe3977c6b06dd99d92a3bedirk *option; 1194825f051a2c5f09c0ebe3977c6b06dd99d92a3bedirk 1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXColorspace 1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colorspace; 1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXImageComponentDesc 1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *alpha_component, 1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *blue_component, 1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *green_component, 1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *red_component; 1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXImageDesc 1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info; 1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXImageHandle 1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *flashpix; 1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXStatus 1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status; 1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXSummaryInformation 1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info; 1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1474c08aed51c5899665ade97263692328eea4af106cristy Quantum 1484c08aed51c5899665ade97263692328eea4af106cristy index; 1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 150bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1544c08aed51c5899665ade97263692328eea4af106cristy register Quantum 1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *a, 1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *b, 1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *g, 1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r; 1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1633083ad0c99e32b3f917cc3e5d96c20dae7ac7d2ccristy size_t 1643083ad0c99e32b3f917cc3e5d96c20dae7ac7d2ccristy memory_limit; 1653083ad0c99e32b3f917cc3e5d96c20dae7ac7d2ccristy 166202de443c199963563857f50153b88fbe65afa80cristy ssize_t 167202de443c199963563857f50153b88fbe65afa80cristy y; 168202de443c199963563857f50153b88fbe65afa80cristy 1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy height, 1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tile_width, 1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tile_height, 1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy width; 1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 178bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image. 1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 185e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->debug != MagickFalse) 1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 190e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(exception->signature == MagickCoreSignature); 1919950d57e1124b73f684fb5946e206994cefda628cristy image=AcquireImage(image_info,exception); 1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize FPX toolkit. 2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_InitSystem(); 2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CoderError,"UnableToInitializeFPXLibrary"); 2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy memory_limit=20000000; 2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_SetToolkitMemoryLimit(&memory_limit); 2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_ClearSystem(); 2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CoderError,"UnableToInitializeFPXLibrary"); 2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tile_width=64; 2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tile_height=64; 2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy flashpix=(FPXImageHandle *) NULL; 2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(macintosh) 2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FSSpec 2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fsspec; 2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FilenameToFSSpec(image->filename,&fsspec); 2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_OpenImageByFilename((const FSSpec &) fsspec,(char *) NULL, 2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_OpenImageByFilename(image->filename,(char *) NULL, 2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &width,&height,&tile_width,&tile_height,&colorspace,&flashpix); 2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status == FPX_LOW_MEMORY_ERROR) 2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_ClearSystem(); 2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_ClearSystem(); 2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowFileException(exception,FileOpenError,"UnableToOpenFile", 2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (colorspace.numberOfComponents == 0) 2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_ClearSystem(); 2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImageTypeNotSupported"); 2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2454825f051a2c5f09c0ebe3977c6b06dd99d92a3bedirk option=GetImageOption(image_info,"fpx:view"); 246a79f4f4f7e4aaf929b252fb4a36666dd0e1a7396dirk if (option == (const char *) NULL) 2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy float 2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy aspect_ratio; 2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Get the aspect ratio. 2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy aspect_ratio=(float) width/height; 2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_GetImageResultAspectRatio(flashpix,&aspect_ratio); 2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(DelegateError,"UnableToReadAspectRatio"); 258bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if (width != (size_t) floor((aspect_ratio*height)+0.5)) 2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Swap(width,height); 2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_GetSummaryInformation(flashpix,&summary_info); 2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_ClearSystem(); 2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(DelegateError,"UnableToReadSummaryInfo"); 2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (summary_info.title_valid) 2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((summary_info.title.length != 0) && 2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (summary_info.title.ptr != (unsigned char *) NULL)) 2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *label; 2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note image label. 2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy label=(char *) NULL; 278151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy if (~summary_info.title.length >= (MagickPathExtent-1)) 2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy label=(char *) AcquireQuantumMemory(summary_info.title.length+ 280151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy MagickPathExtent,sizeof(*label)); 2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (label == (char *) NULL) 2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_ClearSystem(); 2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(label,(char *) summary_info.title.ptr, 2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.title.length+1); 288d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,"label",label,exception); 2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy label=DestroyString(label); 2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (summary_info.comments_valid) 2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((summary_info.comments.length != 0) && 2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (summary_info.comments.ptr != (unsigned char *) NULL)) 2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *comments; 2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note image comment. 3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy comments=(char *) NULL; 302151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy if (~summary_info.comments.length >= (MagickPathExtent-1)) 3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy comments=(char *) AcquireQuantumMemory(summary_info.comments.length+ 304151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy MagickPathExtent,sizeof(*comments)); 3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (comments == (char *) NULL) 3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_ClearSystem(); 3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(comments,(char *) summary_info.comments.ptr, 3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.comments.length+1); 312d15e65928aec551b7388c2863de3e3e628e2e0ddcristy (void) SetImageProperty(image,"comment",comments,exception); 3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy comments=DestroyString(comments); 3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Determine resolution by scene specification. 3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=1; ; i++) 3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (((width >> i) < tile_width) || ((height >> i) < tile_height)) 3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=i; 3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->number_scenes != 0) 3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (scene > image_info->scene) 3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy width>>=1; 3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy height>>=1; 3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene--; 3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->size != (char *) NULL) 3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while ((width > image->columns) || (height > image->rows)) 3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy width>>=1; 3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy height>>=1; 3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene--; 3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->depth=8; 3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=width; 3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=height; 3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((colorspace.numberOfComponents % 2) == 0) 3408a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=BlendPixelTrait; 3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (colorspace.numberOfComponents == 1) 3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Create linear colormap. 3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 3468f87c480dfae893c70e633c61bdf9aadcfee4448cristy if (AcquireImageColormap(image,MaxColormapSize,exception) == MagickFalse) 3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_ClearSystem(); 3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping != MagickFalse) 3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) FPX_CloseImage(flashpix); 3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_ClearSystem(); 3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 358acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy status=SetImageExtent(image,image->columns,image->rows,exception); 359acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy if (status == MagickFalse) 360acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy return(DestroyImageList(image)); 3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate memory for the image and pixel buffer. 3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=(unsigned char *) AcquireQuantumMemory(image->columns,(tile_height+ 3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1UL)*colorspace.numberOfComponents*sizeof(*pixels)); 3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (pixels == (unsigned char *) NULL) 3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_ClearSystem(); 3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) FPX_CloseImage(flashpix); 3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize FlashPix image description. 3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.numberOfComponents=colorspace.numberOfComponents; 3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < 4; i++) 3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[i].myColorType.myDataType=DATA_TYPE_UNSIGNED_BYTE; 3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[i].horzSubSampFactor=1; 3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[i].vertSubSampFactor=1; 3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[i].columnStride=fpx_info.numberOfComponents; 3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[i].lineStride=image->columns* 3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[i].columnStride; 3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[i].theData=pixels+i; 3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[0].myColorType.myColor=fpx_info.numberOfComponents > 2 ? 3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy NIFRGB_R : MONOCHROME; 3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_component=(&fpx_info.components[0]); 3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[1].myColorType.myColor=fpx_info.numberOfComponents > 2 ? 3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy NIFRGB_G : ALPHA; 3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_component=(&fpx_info.components[1]); 3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[2].myColorType.myColor=NIFRGB_B; 3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_component=(&fpx_info.components[2]); 3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[3].myColorType.myColor=ALPHA; 3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_component=(&fpx_info.components[fpx_info.numberOfComponents-1]); 3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_SetResampleMethod(FPX_LINEAR_INTERPOLATION); 3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize image pixels. 3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 400bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 403acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy if (q == (Quantum *) NULL) 4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((y % tile_height) == 0) 4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read FPX image tile (with or without viewing affine).. 4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 410a79f4f4f7e4aaf929b252fb4a36666dd0e1a7396dirk if (option != (const char *) NULL) 4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_ReadImageRectangle(flashpix,0,y,image->columns,y+ 4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tile_height-1,scene,&fpx_info); 4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_ReadImageTransformRectangle(flashpix,0.0F, 4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (float) y/image->rows,(float) image->columns/image->rows, 416bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (float) (y+tile_height-1)/image->rows,(ssize_t) image->columns, 417bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (ssize_t) tile_height,&fpx_info); 4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status == FPX_LOW_MEMORY_ERROR) 4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=(unsigned char *) RelinquishMagickMemory(pixels); 4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) FPX_CloseImage(flashpix); 4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_ClearSystem(); 4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Transfer a FPX pixels. 4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy r=red_component->theData+(y % tile_height)*red_component->lineStride; 4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy g=green_component->theData+(y % tile_height)*green_component->lineStride; 4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy b=blue_component->theData+(y % tile_height)*blue_component->lineStride; 4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy a=alpha_component->theData+(y % tile_height)*alpha_component->lineStride; 433bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_info.numberOfComponents > 2) 4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4374c08aed51c5899665ade97263692328eea4af106cristy SetPixelRed(image,ScaleCharToQuantum(*r),q); 4384c08aed51c5899665ade97263692328eea4af106cristy SetPixelGreen(image,ScaleCharToQuantum(*g),q); 4394c08aed51c5899665ade97263692328eea4af106cristy SetPixelBlue(image,ScaleCharToQuantum(*b),q); 4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy index=ScaleCharToQuantum(*r); 4444c08aed51c5899665ade97263692328eea4af106cristy SetPixelBlack(image,index,q); 4454c08aed51c5899665ade97263692328eea4af106cristy SetPixelRed(image,index,q); 4464c08aed51c5899665ade97263692328eea4af106cristy SetPixelGreen(image,index,q); 4474c08aed51c5899665ade97263692328eea4af106cristy SetPixelBlue(image,index,q); 4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4494c08aed51c5899665ade97263692328eea4af106cristy SetPixelAlpha(image,OpaqueAlpha,q); 45017f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 4514c08aed51c5899665ade97263692328eea4af106cristy SetPixelAlpha(image,ScaleCharToQuantum(*a),q); 452ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy q+=GetPixelChannels(image); 4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy r+=red_component->columnStride; 4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy g+=green_component->columnStride; 4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy b+=blue_component->columnStride; 4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy a+=alpha_component->columnStride; 4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 460cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, 461202de443c199963563857f50153b88fbe65afa80cristy image->rows); 4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=(unsigned char *) RelinquishMagickMemory(pixels); 4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) FPX_CloseImage(flashpix); 4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_ClearSystem(); 4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e g i s t e r F P X I m a g e % 4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% RegisterFPXImage() adds attributes for the FPX image format to 4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% the list of supported formats. The attributes include the image format 4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% tag, a method to read and/or write the format, whether the format 4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% supports the saving of more than one frame to the same file or blob, 4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% whether the format supports native in-memory I/O, and a brief 4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% description of the format. 4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the RegisterFPXImage method is: 4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 492bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t RegisterFPXImage(void) 4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 495bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterFPXImage(void) 4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickInfo 4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *entry; 4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50006b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("FPX","FPX","FlashPix Format"); 5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_FPX_DELEGATE) 5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadFPXImage; 5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteFPXImage; 5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 50508e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 50608e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags|=CoderSeekableStreamFlag; 50708e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderBlobSupportFlag; 5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickImageCoderSignature); 5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% U n r e g i s t e r F P X I m a g e % 5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterFPXImage() removes format registrations made by the 5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% FPX module from the list of supported formats. 5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the UnregisterFPXImage method is: 5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterFPXImage(void) 5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterFPXImage(void) 5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("FPX"); 5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_FPX_DELEGATE) 5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e F P X I m a g e % 5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WriteFPXImage() writes an image in the FlashPix image format. This 5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% method was contributed by BillR@corbis.com. 5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WriteFPXImage method is: 5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5531e178e70fb3c956f9fc1e30c3ba863e882666465cristy% MagickBooleanType WriteFPXImage(const ImageInfo *image_info, 5541e178e70fb3c956f9fc1e30c3ba863e882666465cristy% Image *image,ExceptionInfo *exception) 5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows. 5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5621e178e70fb3c956f9fc1e30c3ba863e882666465cristy% o exception: return any errors or warnings in this structure. 5631e178e70fb3c956f9fc1e30c3ba863e882666465cristy% 5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void ColorTwistMultiply(FPXColorTwistMatrix first, 5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXColorTwistMatrix second,FPXColorTwistMatrix *color_twist) 5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Matrix multiply. 5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(color_twist != (FPXColorTwistMatrix *) NULL); 5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->byy=(first.byy*second.byy)+(first.byc1*second.bc1y)+ 5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.byc2*second.bc2y)+(first.dummy1_zero*second.dummy4_zero); 5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->byc1=(first.byy*second.byc1)+(first.byc1*second.bc1c1)+ 5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.byc2*second.bc2c1)+(first.dummy1_zero*second.dummy5_zero); 5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->byc2=(first.byy*second.byc2)+(first.byc1*second.bc1c2)+ 5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.byc2*second.bc2c2)+(first.dummy1_zero*second.dummy6_zero); 5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->dummy1_zero=(first.byy*second.dummy1_zero)+ 5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.byc1*second.dummy2_zero)+(first.byc2*second.dummy3_zero)+ 5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.dummy1_zero*second.dummy7_one); 5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->bc1y=(first.bc1y*second.byy)+(first.bc1c1*second.bc1y)+ 5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.bc1c2*second.bc2y)+(first.dummy2_zero*second.dummy4_zero); 5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->bc1c1=(first.bc1y*second.byc1)+(first.bc1c1*second.bc1c1)+ 5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.bc1c2*second.bc2c1)+(first.dummy2_zero*second.dummy5_zero); 5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->bc1c2=(first.bc1y*second.byc2)+(first.bc1c1*second.bc1c2)+ 5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.bc1c2*second.bc2c2)+(first.dummy2_zero*second.dummy6_zero); 5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->dummy2_zero=(first.bc1y*second.dummy1_zero)+ 5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.bc1c1*second.dummy2_zero)+(first.bc1c2*second.dummy3_zero)+ 5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.dummy2_zero*second.dummy7_one); 5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->bc2y=(first.bc2y*second.byy)+(first.bc2c1*second.bc1y)+ 5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.bc2c2*second.bc2y)+(first.dummy3_zero*second.dummy4_zero); 5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->bc2c1=(first.bc2y*second.byc1)+(first.bc2c1*second.bc1c1)+ 5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.bc2c2*second.bc2c1)+(first.dummy3_zero*second.dummy5_zero); 5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->bc2c2=(first.bc2y*second.byc2)+(first.bc2c1*second.bc1c2)+ 5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.bc2c2*second.bc2c2)+(first.dummy3_zero*second.dummy6_zero); 5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->dummy3_zero=(first.bc2y*second.dummy1_zero)+ 5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.bc2c1*second.dummy2_zero)+(first.bc2c2*second.dummy3_zero)+ 5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.dummy3_zero*second.dummy7_one); 6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->dummy4_zero=(first.dummy4_zero*second.byy)+ 6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.dummy5_zero*second.bc1y)+(first.dummy6_zero*second.bc2y)+ 6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.dummy7_one*second.dummy4_zero); 6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->dummy5_zero=(first.dummy4_zero*second.byc1)+ 6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.dummy5_zero*second.bc1c1)+(first.dummy6_zero*second.bc2c1)+ 6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.dummy7_one*second.dummy5_zero); 6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->dummy6_zero=(first.dummy4_zero*second.byc2)+ 6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.dummy5_zero*second.bc1c2)+(first.dummy6_zero*second.bc2c2)+ 6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.dummy7_one*second.dummy6_zero); 6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist->dummy7_one=(first.dummy4_zero*second.dummy1_zero)+ 6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.dummy5_zero*second.dummy2_zero)+ 6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (first.dummy6_zero*second.dummy3_zero)+(first.dummy7_one*second.dummy7_one); 6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void SetBrightness(double brightness,FPXColorTwistMatrix *color_twist) 6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXColorTwistMatrix 6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect, 6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy result; 6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image brightness in color twist matrix. 6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(color_twist != (FPXColorTwistMatrix *) NULL); 6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy brightness=sqrt((double) brightness); 6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.byy=brightness; 6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.byc1=0.0; 6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.byc2=0.0; 6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy1_zero=0.0; 6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.bc1y=0.0; 6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.bc1c1=brightness; 6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.bc1c2=0.0; 6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy2_zero=0.0; 6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.bc2y=0.0; 6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.bc2c1=0.0; 6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.bc2c2=brightness; 6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy3_zero=0.0; 6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy4_zero=0.0; 6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy5_zero=0.0; 6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy6_zero=0.0; 6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy7_one=1.0; 6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ColorTwistMultiply(*color_twist,effect,&result); 6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *color_twist=result; 6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void SetColorBalance(double red,double green,double blue, 6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXColorTwistMatrix *color_twist) 6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXColorTwistMatrix 6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect, 6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect, 6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy result, 6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rgb_effect, 6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rg_effect, 6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect; 6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image color balance in color twist matrix. 6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(color_twist != (FPXColorTwistMatrix *) NULL); 6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red=sqrt((double) red)-1.0; 6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green=sqrt((double) green)-1.0; 6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue=sqrt((double) blue)-1.0; 6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.byy=1.0; 6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.byc1=0.0; 6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.byc2=0.299*red; 6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.dummy1_zero=0.0; 6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.bc1y=(-0.299)*red; 6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.bc1c1=1.0-0.299*red; 6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.bc1c2=(-0.299)*red; 6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.dummy2_zero=0.0; 6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.bc2y=0.701*red; 6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.bc2c1=0.0; 6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.bc2c2=1.0+0.402*red; 6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.dummy3_zero=0.0; 6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.dummy4_zero=0.0; 6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.dummy5_zero=0.0; 6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.dummy6_zero=0.0; 6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red_effect.dummy7_one=1.0; 6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.byy=1.0; 6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.byc1=(-0.114)*green; 6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.byc2=(-0.299)*green; 6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.dummy1_zero=0.0; 6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.bc1y=(-0.587)*green; 6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.bc1c1=1.0-0.473*green; 6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.bc1c2=0.299*green; 6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.dummy2_zero=0.0; 6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.bc2y=(-0.587)*green; 6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.bc2c1=0.114*green; 6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.bc2c2=1.0-0.288*green; 6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.dummy3_zero=0.0; 6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.dummy4_zero=0.0; 6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.dummy5_zero=0.0; 6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.dummy6_zero=0.0; 6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green_effect.dummy7_one=1.0; 6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.byy=1.0; 6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.byc1=0.114*blue; 6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.byc2=0.0; 6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.dummy1_zero=0.0; 6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.bc1y=0.886*blue; 7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.bc1c1=1.0+0.772*blue; 7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.bc1c2=0.0; 7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.dummy2_zero=0.0; 7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.bc2y=(-0.114)*blue; 7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.bc2c1=(-0.114)*blue; 7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.bc2c2=1.0-0.114*blue; 7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.dummy3_zero=0.0; 7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.dummy4_zero=0.0; 7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.dummy5_zero=0.0; 7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.dummy6_zero=0.0; 7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue_effect.dummy7_one=1.0; 7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ColorTwistMultiply(red_effect,green_effect,&rg_effect); 7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ColorTwistMultiply(rg_effect,blue_effect,&rgb_effect); 7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ColorTwistMultiply(*color_twist,rgb_effect,&result); 7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *color_twist=result; 7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void SetSaturation(double saturation,FPXColorTwistMatrix *color_twist) 7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXColorTwistMatrix 7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect, 7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy result; 7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image saturation in color twist matrix. 7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(color_twist != (FPXColorTwistMatrix *) NULL); 7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.byy=1.0; 7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.byc1=0.0; 7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.byc2=0.0; 7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy1_zero=0.0; 7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.bc1y=0.0; 7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.bc1c1=saturation; 7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.bc1c2=0.0; 7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy2_zero=0.0; 7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.bc2y=0.0; 7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.bc2c1=0.0; 7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.bc2c2=saturation; 7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy3_zero=0.0; 7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy4_zero=0.0; 7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy5_zero=0.0; 7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy6_zero=0.0; 7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy effect.dummy7_one=1.0; 7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ColorTwistMultiply(*color_twist,effect,&result); 7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *color_twist=result; 7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7471e178e70fb3c956f9fc1e30c3ba863e882666465cristystatic MagickBooleanType WriteFPXImage(const ImageInfo *image_info,Image *image, 7481e178e70fb3c956f9fc1e30c3ba863e882666465cristy ExceptionInfo *exception) 7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXBackground 7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background_color; 7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXColorspace 7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colorspace = 7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy TRUE, 4, 7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { NIFRGB_R, DATA_TYPE_UNSIGNED_BYTE }, 7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { NIFRGB_G, DATA_TYPE_UNSIGNED_BYTE }, 7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { NIFRGB_B, DATA_TYPE_UNSIGNED_BYTE }, 7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { ALPHA, DATA_TYPE_UNSIGNED_BYTE } 7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }; 7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *comment, 767a79f4f4f7e4aaf929b252fb4a36666dd0e1a7396dirk *label, 7688dcf3007ff87ee8cbfd5455385a6551a8b0015acCristy *option; 7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXCompressionOption 7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression; 7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXImageDesc 7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info; 7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXImageHandle 7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *flashpix; 7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXStatus 7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status; 7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXSummaryInformation 7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info; 7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumInfo 7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_info; 7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumType 7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type; 7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7944c08aed51c5899665ade97263692328eea4af106cristy register const Quantum 7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 797bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length, 8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy memory_limit; 8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 804202de443c199963563857f50153b88fbe65afa80cristy ssize_t 805202de443c199963563857f50153b88fbe65afa80cristy y; 806202de443c199963563857f50153b88fbe65afa80cristy 8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tile_height, 8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tile_width; 8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open input file. 8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 818e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 820e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image->signature == MagickCoreSignature); 8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->debug != MagickFalse) 8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 8233a37efd7ece979e9c63dc8f2f2d3816bab8b1156cristy assert(exception != (ExceptionInfo *) NULL); 824e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(exception->signature == MagickCoreSignature); 8251e178e70fb3c956f9fc1e30c3ba863e882666465cristy status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); 8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 828af8d391906d11f0a1f2bbf4e2adbc4995c852d33cristy (void) TransformImageColorspace(image,sRGBColorspace,exception); 8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize FPX toolkit. 8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->depth=8; 8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy memory_limit=20000000; 8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_SetToolkitMemoryLimit(&memory_limit); 8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(DelegateError,"UnableToInitializeFPXLibrary"); 8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tile_width=64; 8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy tile_height=64; 8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colorspace.numberOfComponents=3; 84117f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colorspace.numberOfComponents=4; 8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_info->type != TrueColorType) && 844f1d8548abecaf5ca89d453fd9fc0cde77d20672bdirk (SetImageGray(image,exception) != MagickFalse)) 8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colorspace.numberOfComponents=1; 8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colorspace.theComponents[0].myColor=MONOCHROME; 8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background_color.color1_value=0; 8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background_color.color2_value=0; 8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background_color.color3_value=0; 8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background_color.color4_value=0; 8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression=NONE; 8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->compression == JPEGCompression) 8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression=JPEG_UNSPECIFIED; 8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->compression == JPEGCompression) 8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression=JPEG_UNSPECIFIED; 8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(macintosh) 8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FSSpec 8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fsspec; 8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FilenameToFSSpec(filename,&fsspec); 8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_CreateImageByFilename((const FSSpec &) fsspec,image->columns, 8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_CreateImageByFilename(image->filename,image->columns, 8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows,tile_width,tile_height,colorspace,background_color, 8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression,&flashpix); 8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (compression == JPEG_UNSPECIFIED) 8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize the compression by quality for the entire image. 8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_SetJPEGCompression(flashpix,(unsigned short) 8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->quality == UndefinedCompressionQuality ? 75 : image->quality); 8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(DelegateError,"UnableToSetJPEGLevel"); 8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image summary info. 8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.title_valid=MagickFalse; 8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.subject_valid=MagickFalse; 8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.author_valid=MagickFalse; 8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.comments_valid=MagickFalse; 8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.keywords_valid=MagickFalse; 8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.OLEtemplate_valid=MagickFalse; 8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.last_author_valid=MagickFalse; 8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.rev_number_valid=MagickFalse; 8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.edit_time_valid=MagickFalse; 8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.last_printed_valid=MagickFalse; 8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.create_dtm_valid=MagickFalse; 8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.last_save_dtm_valid=MagickFalse; 8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.page_count_valid=MagickFalse; 8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.word_count_valid=MagickFalse; 9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.char_count_valid=MagickFalse; 9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.thumbnail_valid=MagickFalse; 9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.appname_valid=MagickFalse; 9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.security_valid=MagickFalse; 90488779585d7994a31bf6e8a230cb5105cc1c8ad4dcristy summary_info.title.ptr=(unsigned char *) NULL; 9058f87c480dfae893c70e633c61bdf9aadcfee4448cristy label=GetImageProperty(image,"label",exception); 9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (label != (const char *) NULL) 9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note image label. 9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.title_valid=MagickTrue; 9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=strlen(label); 9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.title.length=length; 914151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy if (~length >= (MagickPathExtent-1)) 9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.title.ptr=(unsigned char *) AcquireQuantumMemory( 916151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy length+MagickPathExtent,sizeof(*summary_info.title.ptr)); 9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (summary_info.title.ptr == (unsigned char *) NULL) 9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(DelegateError,"UnableToSetImageTitle"); 9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString((char *) summary_info.title.ptr,label, 920151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy MagickPathExtent); 9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9228f87c480dfae893c70e633c61bdf9aadcfee4448cristy comment=GetImageProperty(image,"comment",exception); 9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (comment != (const char *) NULL) 9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note image comment. 9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.comments_valid=MagickTrue; 9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.comments.ptr=(unsigned char *) AcquireString(comment); 9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy summary_info.comments.length=strlen(comment); 9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_SetSummaryInformation(flashpix,&summary_info); 9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(DelegateError,"UnableToSetSummaryInfo"); 9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize FlashPix image description. 9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 9385f766ef8b0cd9906c2c3a56d845828380a251073cristy quantum_info=AcquireQuantumInfo(image_info,image); 9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quantum_info == (QuantumInfo *) NULL) 9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 941b3f97ae45019a91b30792a6fa42d81a2689a7025cristy pixels=(unsigned char *) GetQuantumPixels(quantum_info); 9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.numberOfComponents=colorspace.numberOfComponents; 943bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) fpx_info.numberOfComponents; i++) 9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[i].myColorType.myDataType=DATA_TYPE_UNSIGNED_BYTE; 9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[i].horzSubSampFactor=1; 9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[i].vertSubSampFactor=1; 9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[i].columnStride=fpx_info.numberOfComponents; 9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[i].lineStride= 9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns*fpx_info.components[i].columnStride; 9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[i].theData=pixels+i; 9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 953bd797f1c50b04bfd5b035f4e0a9e101eaba3f105cristy fpx_info.components[0].myColorType.myColor=fpx_info.numberOfComponents != 1 ? 954bd797f1c50b04bfd5b035f4e0a9e101eaba3f105cristy NIFRGB_R : MONOCHROME; 9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[1].myColorType.myColor=NIFRGB_G; 9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[2].myColorType.myColor=NIFRGB_B; 9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_info.components[3].myColorType.myColor=ALPHA; 9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 959bd797f1c50b04bfd5b035f4e0a9e101eaba3f105cristy Write image pixels. 9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type=RGBQuantum; 96217f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type=RGBAQuantum; 9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_info.numberOfComponents == 1) 9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_type=GrayQuantum; 966bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9681e178e70fb3c956f9fc1e30c3ba863e882666465cristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 9694c08aed51c5899665ade97263692328eea4af106cristy if (p == (const Quantum *) NULL) 9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9714c08aed51c5899665ade97263692328eea4af106cristy length=ExportQuantumPixels(image,(CacheView *) NULL,quantum_info, 9721e178e70fb3c956f9fc1e30c3ba863e882666465cristy quantum_type,pixels,exception); 9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_WriteImageLine(flashpix,&fpx_info); 9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 976cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy status=SetImageProgress(image,SaveImageTag,(MagickOffsetType) y, 977202de443c199963563857f50153b88fbe65afa80cristy image->rows); 9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info=DestroyQuantumInfo(quantum_info); 982a79f4f4f7e4aaf929b252fb4a36666dd0e1a7396dirk option=GetImageOption(image_info,"fpx:view"); 983a79f4f4f7e4aaf929b252fb4a36666dd0e1a7396dirk if (option != (const char *) NULL) 9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXAffineMatrix 9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine; 9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXColorTwistMatrix 9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist; 9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXContrastAdjustment 9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy contrast; 9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXFilteringValue 9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sharpen; 9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXResultAspectRatio 9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy aspect_ratio; 9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPXROI 10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy view_rect; 10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine_valid, 10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy aspect_ratio_valid, 10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist_valid, 10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy contrast_valid, 10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sharpen_valid, 10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy view_rect_valid; 10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize default viewing parameters. 10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy contrast=1.0; 10154d0ca34912f861b25e5ed95e3f624048cb180358cristy contrast_valid=MagickTrue; 10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.byy=1.0; 10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.byc1=0.0; 10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.byc2=0.0; 10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.dummy1_zero=0.0; 10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.bc1y=0.0; 10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.bc1c1=1.0; 10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.bc1c2=0.0; 10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.dummy2_zero=0.0; 10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.bc2y=0.0; 10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.bc2c1=0.0; 10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.bc2c2=1.0; 10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.dummy3_zero=0.0; 10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.dummy4_zero=0.0; 10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.dummy5_zero=0.0; 10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.dummy6_zero=0.0; 10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist.dummy7_one=1.0; 10324d0ca34912f861b25e5ed95e3f624048cb180358cristy color_twist_valid=MagickTrue; 10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sharpen=0.0; 10344d0ca34912f861b25e5ed95e3f624048cb180358cristy sharpen_valid=MagickTrue; 10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy aspect_ratio=(double) image->columns/image->rows; 10364d0ca34912f861b25e5ed95e3f624048cb180358cristy aspect_ratio_valid=MagickTrue; 10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy view_rect.left=(float) 0.1; 10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy view_rect.width=aspect_ratio-0.2; 10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy view_rect.top=(float) 0.1; 10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy view_rect.height=(float) 0.8; /* 1.0-0.2 */ 10414d0ca34912f861b25e5ed95e3f624048cb180358cristy view_rect_valid=MagickTrue; 10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a11=1.0; 10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a12=0.0; 10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a13=0.0; 10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a14=0.0; 10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a21=0.0; 10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a22=1.0; 10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a23=0.0; 10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a24=0.0; 10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a31=0.0; 10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a32=0.0; 10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a33=1.0; 10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a34=0.0; 10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a41=0.0; 10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a42=0.0; 10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a43=0.0; 10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy affine.a44=1.0; 10584d0ca34912f861b25e5ed95e3f624048cb180358cristy affine_valid=MagickTrue; 10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (0) 10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Color color twist. 10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SetBrightness(0.5,&color_twist); 10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SetSaturation(0.5,&color_twist); 10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SetColorBalance(0.5,1.0,1.0,&color_twist); 10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_twist_valid=MagickTrue; 10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10694d0ca34912f861b25e5ed95e3f624048cb180358cristy if (affine_valid != MagickFalse) 10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_SetImageAffineMatrix(flashpix,&affine); 10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(DelegateError,"UnableToSetAffineMatrix"); 10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10754d0ca34912f861b25e5ed95e3f624048cb180358cristy if (aspect_ratio_valid != MagickFalse) 10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_SetImageResultAspectRatio(flashpix,&aspect_ratio); 10783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(DelegateError,"UnableToSetAspectRatio"); 10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10814d0ca34912f861b25e5ed95e3f624048cb180358cristy if (color_twist_valid != MagickFalse) 10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_SetImageColorTwistMatrix(flashpix,&color_twist); 10843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(DelegateError,"UnableToSetColorTwist"); 10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10874d0ca34912f861b25e5ed95e3f624048cb180358cristy if (contrast_valid != MagickFalse) 10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_SetImageContrastAdjustment(flashpix,&contrast); 10903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(DelegateError,"UnableToSetContrast"); 10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10934d0ca34912f861b25e5ed95e3f624048cb180358cristy if (sharpen_valid != MagickFalse) 10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_SetImageFilteringValue(flashpix,&sharpen); 10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(DelegateError,"UnableToSetFilteringValue"); 10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10994d0ca34912f861b25e5ed95e3f624048cb180358cristy if (view_rect_valid != MagickFalse) 11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fpx_status=FPX_SetImageROI(flashpix,&view_rect); 11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (fpx_status != FPX_OK) 11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(DelegateError,"UnableToSetRegionOfInterest"); 11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) FPX_CloseImage(flashpix); 11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy FPX_ClearSystem(); 11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 1111