13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            M   M  PPPP   RRRR                               %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            MM MM  P   P  R   R                              %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            M M M  PPPP   RRRR                               %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            M   M  P      R R                                %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                            M   M  P      R  R                               %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                  Read/Write the Magick Persistent Registry.                 %
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*/
424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/registry.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/static.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/module.h"
543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Forward declarations.
573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
583ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType
591e178e70fb3c956f9fc1e30c3ba863e882666465cristy  WriteMPRImage(const ImageInfo *,Image *,ExceptionInfo *);
603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e a d M P R I m a g e                                                   %
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ReadMPRImage() reads a Magick Persistent Registry image as a blob from
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  memory.  It allocates the memory necessary for the new Image structure and
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  returns a pointer to the new image.
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ReadMPRImage method is:
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Image *ReadMPRImage(const ImageInfo *image_info,
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadMPRImage(const ImageInfo *image_info,ExceptionInfo *exception)
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image;
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
94e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_info->signature == MagickCoreSignature);
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->debug != MagickFalse)
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image_info->filename);
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
99e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image=(Image *) GetImageRegistry(ImageRegistryType,image_info->filename,
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    exception);
102d89d5aadb8301206bfc2d7c46781ca4b425035f6cristy  if (image != (Image *) NULL)
1036fccee1683f6c6d17f30dad4c9bd4fea48d66ca1cristy    (void) SyncImageSettings(image_info,image,exception);
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(image);
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e g i s t e r M P R I m a g e                                           %
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  RegisterMPRImage() adds attributes for the MPR image format to
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the list of supported formats.  The attributes include the image format
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  tag, a method to read and/or write the format, whether the format
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  supports the saving of more than one frame to the same file or blob,
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  whether the format supports native in-memory I/O, and a brief
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  description of the format.
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the RegisterMPRImage method is:
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
127bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t RegisterMPRImage(void)
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
130bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterMPRImage(void)
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickInfo
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *entry;
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
13506b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("MPR","MPR","Magick Persistent Registry");
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadMPRImage;
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->encoder=(EncodeImageHandler *) WriteMPRImage;
13808e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
139009d739511cb808de2f5899fe7e06be7350838e9cristy  entry->format_type=ImplicitFormatType;
14008e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags|=CoderStealthFlag;
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
14206b627a07ff44e1ff93ef1288c9f428066ded10ddirk  entry=AcquireMagickInfo("MPR","MPRI","Magick Persistent Registry");
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadMPRImage;
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->encoder=(EncodeImageHandler *) WriteMPRImage;
14508e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
146009d739511cb808de2f5899fe7e06be7350838e9cristy  entry->format_type=ImplicitFormatType;
14708e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags|=CoderStealthFlag;
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickImageCoderSignature);
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   U n r e g i s t e r M P R I m a g e                                       %
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  UnregisterMPRImage() removes format registrations made by the
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  MPR module from the list of supported formats.
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the UnregisterMPRImage method is:
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      UnregisterMPRImage(void)
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterMPRImage(void)
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("MPRI");
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("MPR");
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   W r i t e M P R I m a g e                                                 %
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WriteMPRImage() writes an image into the Magick Persistent Registry
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image as a blob from memory.  It allocates the memory necessary for the
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  new Image structure and returns a pointer to the new image.
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the WriteMPRImage method is:
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1941e178e70fb3c956f9fc1e30c3ba863e882666465cristy%      MagickBooleanType WriteMPRImage(const ImageInfo *image_info,
1951e178e70fb3c956f9fc1e30c3ba863e882666465cristy%        Image *image,ExceptionInfo *exception)
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows.
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image:  The image.
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2031e178e70fb3c956f9fc1e30c3ba863e882666465cristy%    o exception: return any errors or warnings in this structure.
2041e178e70fb3c956f9fc1e30c3ba863e882666465cristy%
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2061e178e70fb3c956f9fc1e30c3ba863e882666465cristystatic MagickBooleanType WriteMPRImage(const ImageInfo *image_info,Image *image,
2071e178e70fb3c956f9fc1e30c3ba863e882666465cristy  ExceptionInfo *exception)
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
213e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_info->signature == MagickCoreSignature);
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
215e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
216c18ea1f327ac7ffe805c0be2ae6f2b5471b78853cristy  magick_unreferenced(image_info);
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
2191e178e70fb3c956f9fc1e30c3ba863e882666465cristy  status=SetImageRegistry(ImageRegistryType,image->filename,image,exception);
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
222