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