djvu.c revision 3ed852eea50f9d4cd633efb8c2b054b8e33c253
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                         DDDD       J  V   V  U   U                          %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                         D   D      J  V   V  U   U                          %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                         D   D      J  V   V  U   U                          %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                         D   D  J   J   V V   U   U                          %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                         DDDD    JJJ     V     UUU                           %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             Read DjVu Images.                               %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                              Software Design                                %
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                John Cristy                                  %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                 July 1992                                   %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Copyright 1999-2009 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*/
423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/studio.h"
433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/blob.h"
443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/blob-private.h"
453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/cache.h"
463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/constitute.h"
473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/exception.h"
483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/exception-private.h"
493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/list.h"
503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/magick.h"
513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/memory_.h"
523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/monitor.h"
533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/monitor-private.h"
543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/quantum-private.h"
553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/static.h"
563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/string_.h"
573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/module.h"
583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_DJVU_DELEGATE)
593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <libdjvu/ddjvuapi.h>
603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   I s D J V U                                                               %
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  IsDJVU() returns MagickTrue if the image format type, identified by the
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  magick string, is DJVU.
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the IsDJVU method is:
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType IsDJVU(const unsigned char *magick,const size_t length)
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magick: compare image format pattern against these bytes.
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: Specifies the length of the magick string.
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsDJVU(const unsigned char *magick,const size_t length)
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (length < 8)
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (memcmp(magick,"AT&TFORM",8) == 0)
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickFalse);
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_DJVU_DELEGATE)
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e a d D J V U I m a g e                                                 %
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ReadDJVUImage() reads DJVU image and returns it.  It allocates the memory
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  necessary for the new Image structure and returns a pointer to the new
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image or set of images.
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ReadDJVUImage method is:
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Image *ReadDJVUImage(const ImageInfo *image_info,
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _LoadContext
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   LoadContext;
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristystruct _LoadContext
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_context_t* context;
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_document_t *document;
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_page_t *page;
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int streamid;
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int pages;
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image *image;
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy};
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BLOCKSIZE  65536
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristypump_data(Image *image, LoadContext* lc)
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int blocksize = BLOCKSIZE;
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        char data[BLOCKSIZE];
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int size;
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* i might check for a condition! */
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((size = (size_t) ReadBlob(image,(size_t) blocksize,data)) == blocksize) {
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_stream_write(lc->document, lc->streamid, data, size);
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (size)
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_stream_write(lc->document, lc->streamid, data, size);
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_stream_close(lc->document, lc->streamid, 0);
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* returns NULL only after all is delivered! */
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic ddjvu_message_t*
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristypump_data_until_message(LoadContext *lc,Image *image) /* ddjvu_context_t *context, type ddjvu_document_type_t */
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        unsigned long blocksize = BLOCKSIZE;
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        unsigned char data[BLOCKSIZE];
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        unsigned long size;
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_message_t *message;
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* i might check for a condition! */
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (!(message = ddjvu_message_peek(lc->context))
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy               && (size = (unsigned long) ReadBlob(image,(size_t) blocksize,data)) == blocksize) {
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_stream_write(lc->document, lc->streamid, (char *) data, size);
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (message)
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                return message;
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (size)
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_stream_write(lc->document, lc->streamid, (char *) data, size);
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_stream_close(lc->document, lc->streamid, 0);
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return NULL;
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DEBUG 0
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic const char*
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristymessage_tag_name(ddjvu_message_tag_t tag)
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   static char* names[] =
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "ERROR",
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "INFO",
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "NEWSTREAM",
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "DOCINFO",
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "PAGEINFO",
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "RELAYOUT",
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "REDISPLAY",
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "CHUNK",
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "THUMBNAIL",
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "PROGRESS",
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      };
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   if (tag <= DDJVU_PROGRESS)
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return names[tag];
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   else {
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /* bark! */
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return 0;
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   }
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* write out nice info on the message,
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * and store in *user* data the info on progress.
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * */
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristyint
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristyprocess_message(ddjvu_message_t *message)
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   ddjvu_context_t* context= message->m_any.context;
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   if (! message)
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(-1);
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   printf("*** %s: %s.\n",__FUNCTION__, message_tag_name(message->m_any.tag));
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   switch (message->m_any.tag){
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_DOCINFO:
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   {
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ddjvu_document_t* document= message->m_any.document;
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /* ddjvu_document_decoding_status  is set by libdjvu! */
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /* we have some info on the document  */
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      LoadContext *lc = (LoadContext *) ddjvu_document_get_user_data(document);
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      lc->pages = ddjvu_document_get_pagenum(document);
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      printf("the doc has %d pages\n", ddjvu_document_get_pagenum(document));
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   }
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_CHUNK:
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           printf("the name of the chunk is: %s\n", message->m_chunk.chunkid);
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           break;
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_RELAYOUT:
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_PAGEINFO:
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   {
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ddjvu_page_t* page = message->m_any.page;
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      page_info* info = ddjvu_page_get_user_data(page);
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      printf("page decoding status: %d %s%s%s\n",
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             ddjvu_page_decoding_status(page),
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             status_color, status_name(ddjvu_page_decoding_status(page)), color_reset);
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      printf("the page LAYOUT changed: width x height: %d x %d @ %d dpi. Version %d, type %d\n",
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             // printf("page info:\n width x height: %d x %d @ %d dpi, version %d, type %d\n",
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             ddjvu_page_get_width(page),
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             ddjvu_page_get_height(page),
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             ddjvu_page_get_resolution(page),
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             ddjvu_page_get_version(page),
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             /* DDJVU_PAGETYPE_BITONAL */
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             ddjvu_page_get_type(page));
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      info->info = 1;
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   }
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_REDISPLAY:
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   {
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ddjvu_page_t* page = message->m_any.page;
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      page_info* info = ddjvu_page_get_user_data(page);
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      printf("the page can/should be REDISPLAYED\n");
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      info->display = 1;
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   }
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_PROGRESS:
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           printf("PROGRESS:\n");
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           break;
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_ERROR:
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           printf("simply ERROR!\n message:\t%s\nfunction:\t%s(file %s)\nlineno:\t%d\n",
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  message->m_error.message,
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  message->m_error.function,
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  message->m_error.filename,
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  message->m_error.lineno);
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           break;
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_INFO:
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           printf("INFO: %s!\n", message->m_info.message);
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           break;
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   default:
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      printf("unexpected\n");
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   };
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(message->m_any.tag);
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define RGB 1
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * DjVu advertised readiness to provide bitmap: So get it!
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * we use the RGB format!
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristyget_page_image(LoadContext *lc, ddjvu_page_t *page, int x, int y, int w, int h, QuantumInfo* quantum_info)
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_format_t
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *format;
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_page_type_t
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    type;
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image;
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ret,
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    stride;
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_rect_t rect;
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.x = x;
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.y = y;
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.w = (unsigned int) w;             /* /10 */
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.h = (unsigned int) h;             /* /10 */
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image = lc->image;
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        type = ddjvu_page_get_type(lc->page);
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* stride of this temporary buffer: */
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        stride = (type == DDJVU_PAGETYPE_BITONAL)?
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (lc->image->columns + 7)/8:
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                lc->image->columns *3;
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q = (unsigned char *) AcquireQuantumMemory(lc->image->rows,stride);
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        format = ddjvu_format_create(
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (type == DDJVU_PAGETYPE_BITONAL)?DDJVU_FORMAT_LSBTOMSB : DDJVU_FORMAT_RGB24,
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* DDJVU_FORMAT_RGB24
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                 * DDJVU_FORMAT_RGBMASK32*/
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* DDJVU_FORMAT_RGBMASK32 */
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                0, NULL);
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* fixme:  ThrowReaderException is a macro, which uses  `exception' variable */
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (format == NULL)
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        abort();
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        /* ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); */
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_format_set_row_order(format, 1);
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_format_set_y_direction(format, 1);
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ret = ddjvu_page_render(page,
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    DDJVU_RENDER_COLOR, /* ddjvu_render_mode_t */
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    &rect,
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    &rect,     /* mmc: ?? */
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    format,
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    stride, /* ?? */
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    (char*)q);
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_format_release(format);
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (type == DDJVU_PAGETYPE_BITONAL) {
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*  */
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                printf("%s: expanding BITONAL page/image\n", __FUNCTION__);
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                register IndexPacket *indexes;
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                unsigned long bit, byte;
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (y=0; y < (long) image->rows; y++)
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        {
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                PixelPacket * o = QueueAuthenticPixels(image,0,y,image->columns,1,&image->exception);
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                if (o == (PixelPacket *) NULL)
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                        break;
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                indexes=GetAuthenticIndexQueue(image);
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                bit=0;
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                byte=0;
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                /* fixme:  the non-aligned, last =<7 bits ! that's ok!!!*/
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                for (x= 0; x < (long) image->columns; x++)
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                        {
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                if (bit == 0) byte= (unsigned long) q[(y * stride) + (x / 8)];
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                indexes[x]=(IndexPacket) (((byte & 0x01) != 0) ? 0x00 : 0x01);
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                bit++;
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                if (bit == 8)
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                        bit=0;
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                byte>>=1;
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                        }
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                if (SyncAuthenticPixels(image,&image->exception) == MagickFalse)
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                        break;
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        }
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                SyncImage(image);
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        } else {
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                printf("%s: expanding PHOTO page/image\n", __FUNCTION__);
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* now transfer line-wise: */
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                long i;
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* old: */
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                char* r;
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                register PixelPacket *r;
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                for (i = 0;i< (long) lc->image->rows; i++)
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        {
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                               if (i % 1000 == 0) printf("%d\n",i);
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                               r = QueueAuthenticPixels(lc->image,0,i,lc->image->columns,1,&image->exception);
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                ImportQuantumPixels(lc->image,
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                    (CacheView *) NULL,
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                    quantum_info,
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                    RGBQuantum, /*GrayQuantum*/
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                    q+i*stride,&image->exception);
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                SyncAuthenticPixels(lc->image,&image->exception);
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        }
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=(unsigned char *) RelinquishMagickMemory(q);
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_DJVU_DELEGATE)
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristyget_page_line(LoadContext *lc, int row, QuantumInfo* quantum_info)
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_format_t
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *format;
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ret;
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    stride;
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_rect_t rect, pagerect;
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.x = 0;
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.y = row;
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.w = lc->image->columns;             /* /10 */
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.h = 1;             /* /10 */
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pagerect.x = 0;
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pagerect.y = 0;
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pagerect.w = lc->image->columns;
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pagerect.h = lc->image->rows;
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        format = ddjvu_format_create(
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if RGB
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                DDJVU_FORMAT_RGB24
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                DDJVU_FORMAT_GREY8
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ,
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                0, NULL);
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_format_set_row_order(format, 1);
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_format_set_y_direction(format, 1);
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        stride=1;
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if RGB
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        stride=3;
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q = (unsigned char *) AcquireQuantumMemory(lc->image->columns,stride);
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ret = ddjvu_page_render(lc->page,
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    DDJVU_RENDER_COLOR, /* ddjvu_render_mode_t */
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    &pagerect,
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    &rect,     /* mmc: ?? */
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    format,
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    pagerect.w * 3, /* ?? */
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    (char*)q);
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ImportQuantumPixels(lc->image,
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                            (CacheView *) NULL,
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                            quantum_info,
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if RGB
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                            RGBQuantum
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                            GrayQuantum
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                            ,q,&lc->image->exception);
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=(unsigned char *) RelinquishMagickMemory(q);
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_format_release(format);
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return ret;
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e a d O n e D J V U I m a g e                                           %
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ReadOneDJVUImage() reads a Portable Network Graphics (DJVU) image file
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  (minus the 8-byte signature)  and returns it.  It allocates the memory
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  necessary for the new Image structure and returns a pointer to the new
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image.
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ReadOneDJVUImage method is:
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Image *ReadOneDJVUImage(MngInfo *mng_info, const ImageInfo *image_info,
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%         ExceptionInfo *exception)
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o mng_info: Specifies a pointer to a MngInfo structure.
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline double MagickMax(const double x,const double y)
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (x > y)
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(x);
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(y);
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadOneDJVUImage(LoadContext* lc,const int pagenum,
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const ImageInfo *image_info,ExceptionInfo *exception)
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_page_type_t
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     type;
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_pageinfo_t info;
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumInfo *quantum_info;
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_message_t *message;
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image *image;
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int logging;
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int tag;
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* so, we know that the page is there! Get its dimension, and  */
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* Read one DJVU image */
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image = lc->image;
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* register PixelPacket *q; */
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        logging=LogMagickEvent(CoderEvent,GetMagickModule(), "  enter ReadOneDJVUImage()");
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        printf("====  Loading the page %d\n", pagenum);
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        lc->page = ddjvu_page_create_by_pageno(lc->document, pagenum); /*  0? */
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* pump data untill the page is ready for rendering. */
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        tag=(-1);
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        do {
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                while ((message = ddjvu_message_peek(lc->context)))
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        {
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                tag=process_message(message);
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                if (tag == 0) break;
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                ddjvu_message_pop(lc->context);
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        }
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* fixme: maybe exit? */
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* if (lc->error) break; */
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                message = pump_data_until_message(lc,image);
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (message)
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        do {
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                tag=process_message(message);
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                if (tag == 0) break;
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                ddjvu_message_pop(lc->context);
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        } while ((message = ddjvu_message_peek(lc->context)));
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        } while (!ddjvu_page_decoding_done(lc->page));
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_document_get_pageinfo(lc->document, pagenum, &info);
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->x_resolution = (float) info.dpi;
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->y_resolution =(float) info.dpi;
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image_info->density != (char *) NULL)
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            int
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              flags;
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            GeometryInfo
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              geometry_info;
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Set rendering resolution.
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            flags=ParseGeometry(image_info->density,&geometry_info);
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            image->x_resolution=geometry_info.rho;
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            image->y_resolution=geometry_info.sigma;
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((flags & SigmaValue) == 0)
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              image->y_resolution=image->x_resolution;
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            info.width*=image->x_resolution/info.dpi;
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            info.height*=image->y_resolution/info.dpi;
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            info.dpi=(long) MagickMax(image->x_resolution,image->y_resolution);
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        type = ddjvu_page_get_type(lc->page);
6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* double -> float! */
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* image->gamma = (float)ddjvu_page_get_gamma(lc->page); */
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* mmc:  set  image->depth  */
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* mmc:  This from the type */
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->columns=(unsigned long) info.width;
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->rows=(unsigned long) info.height;
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* mmc: bitonal should be palettized, and compressed! */
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (type == DDJVU_PAGETYPE_BITONAL){
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->colorspace = GRAYColorspace;
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->storage_class = PseudoClass;
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->depth =  8UL;    /* i only support that? */
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->colors= 2;
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (AcquireImageColormap(image,image->colors) == MagickFalse)
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  ThrowReaderException(ResourceLimitError,
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                   "MemoryAllocationFailed");
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        } else {
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->colorspace = RGBColorspace;
6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->storage_class = DirectClass;
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* fixme:  MAGICKCORE_QUANTUM_DEPTH ?*/
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->depth =  8UL;    /* i only support that? */
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->matte = MagickTrue;
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* is this useful? */
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        printf("now filling %ld x %ld\n", image->columns,image->rows);
6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 1                           /* per_line */
6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        quantum_info=AcquireQuantumInfo(image_info,image);
6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (quantum_info == (QuantumInfo *) NULL)
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* q = QueueAuthenticPixels(image,0,0,image->columns,image->rows); */
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        get_page_image(lc, lc->page, 0, 0, info.width, info.height, quantum_info);
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int i;
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (i = 0;i< image->rows; i++)
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        printf("%d\n",i);
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        q = QueueAuthenticPixels(image,0,i,image->columns,1);
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        get_page_line(lc, i, quantum_info);
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        SyncAuthenticPixels(image);
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* per_line */
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        printf("END: finished filling %ld x %ld\n", image->columns,image->rows);
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        SyncImage(image);
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        quantum_info=DestroyQuantumInfo(quantum_info);
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* indexes=GetAuthenticIndexQueue(image); */
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* mmc: ??? Convert PNM pixels to runlength-encoded MIFF packets. */
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* image->colors =  */
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* how is the line padding  / stride? */
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (lc->page) {
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_page_release(lc->page);
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                lc->page = NULL;
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* image->page.y=mng_info->y_off[mng_info->object_id]; */
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (tag == 0)
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image=DestroyImage(image);
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return image;
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* end of reading one DJVU page/image */
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* palette */
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (AcquireImageColormap(image,2) == MagickFalse)
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Monochrome colormap.   mmc: this the default!
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colormap[0].red=QuantumRange;
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colormap[0].green=QuantumRange;
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colormap[0].blue=QuantumRange;
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colormap[1].red=0;
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colormap[1].green=0;
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colormap[1].blue=0;
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void djvu_close_lc(LoadContext* lc)
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (lc->document)
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_document_release(lc->document);
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (lc->context)
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_context_release(lc->context);
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (lc->page)
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_page_release(lc->page);
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RelinquishMagickMemory(lc);
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadDJVUImage(const ImageInfo *image_info,
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo *exception)
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *url;
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_message_t
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *message;
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image,
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *images;
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    logging,
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    use_cache;
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LoadContext
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *lc;
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register long
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   * Open image file.
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   */
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info->signature == MagickSignature);
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->debug != MagickFalse)
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", image_info->filename);
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception->signature == MagickSignature);
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  logging = LogMagickEvent(CoderEvent,GetMagickModule(),"enter ReadDJVUImage()");
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image = AcquireImage(image_info); /* mmc: ?? */
7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lc = (LoadContext *) NULL;
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status = OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(FileOpenError,"UnableToOpenFile");
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Verify DJVU signature.
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  count = ReadBlob(image,8,(unsigned char *) magic_number);
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* IsDJVU(const unsigned char *magick,const size_t length) */
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (memcmp(magic_number,"AT&TFORM",8) != 0)
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(CorruptImageError,"ImproperImageHeader");
7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   * Allocate a LoadContext structure.
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   */
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lc = (LoadContext *) AcquireMagickMemory(sizeof(*lc));
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (lc == NULL)
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   * Initialize members of the MngInfo structure.
8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   */
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(lc,0,sizeof(LoadContext));
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lc->image = image;
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lc->pages = 0;
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lc->context = ddjvu_context_create("ImageMagick djvu loader"); /* g_program_name */
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_cache_set_size(lc->context, 1); /* right? */
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  use_cache = 0;
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* document: here we don't have a filename, but, for the sake of generality, a FILE* ! */
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  url="http://maruska.dyndns.org/fake.djvu";
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lc->document = ddjvu_document_create(lc->context, url, use_cache); /* don't cache */
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_document_set_user_data(lc->document, lc);
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* now we wait the message-request for data: */
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  message = ddjvu_message_wait(lc->context);
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (message->m_any.tag != DDJVU_NEWSTREAM) {
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /* fixme: the djvu context, document! */
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ddjvu_document_release(lc->document);
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ddjvu_context_release(lc->context);
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          RelinquishMagickMemory(lc);
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowReaderException(ResourceLimitError,"Djvu initial message: unexpected type");
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return NULL;    /* error! */
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lc->streamid = message->m_newstream.streamid;
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_message_pop(lc->context);
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  message = pump_data_until_message(lc,image);
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* now process the messages: */
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (message) do {
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          process_message(message);
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ddjvu_message_pop(lc->context);
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((message = ddjvu_message_peek(lc->context)));
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* fixme: i hope we have not read any messages pertinent(?) related to the page itself!  */
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (lc->pages == 0) {
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          message = ddjvu_message_wait(lc->context);
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          process_message(message);
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ddjvu_message_pop(lc->context);
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  images=NewImageList();
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=0;
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->number_scenes != 0)
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i=image_info->scene;
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for ( ; i < (long) lc->pages; i++)
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    image=ReadOneDJVUImage(lc,i,image_info,exception);
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image == (Image *) NULL)
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    AppendImageToList(&images,CloneImageList(image,exception));
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image_info->number_scenes != 0)
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (image->scene >= (image_info->scene+image_info->number_scenes-1))
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  djvu_close_lc(lc);
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CloseBlob(images);
8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image != (Image *) NULL)
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    image=DestroyImageList(image);
8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((image->page.width == 0) && (image->page.height == 0))
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->page.width = image->columns+image->page.x;
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->page.height = image->rows+image->page.y;
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->columns == 0 || image->rows == 0)
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (logging != MagickFalse)
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) LogMagickEvent(CoderEvent,GetMagickModule(),
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "exit ReadDJVUImage() with error.");
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowReaderException(CorruptImageError,"CorruptImage");
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (logging != MagickFalse)
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadDJVUImage()");
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(GetFirstImageInList(images));
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e g i s t e r D J V U I m a g e                                         %
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  RegisterDJVUImage() adds attributes for the DJVU image format to
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the list of supported formats.  The attributes include the image format
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  tag, a method to read and/or write the format, whether the format
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  supports the saving of more than one frame to the same file or blob,
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  whether the format supports native in-memory I/O, and a brief
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  description of the format.
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the RegisterDJVUImage method is:
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      unsigned long RegisterDJVUImage(void)
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport unsigned long RegisterDJVUImage(void)
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    version[MaxTextExtent];
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickInfo
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *entry;
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const char
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *DJVUNote =
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "See http://www.djvuzone.org/ for details about the DJVU format.  The\n"
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "DJVU 1.2 specification is available there and at\n"
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "ftp://swrinde.nde.swri.edu/pub/djvu/documents/."
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *version='\0';
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(DJVU_LIBDJVU_VER_STRING)
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ConcatenateMagickString(version,"libdjvu ",MaxTextExtent);
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ConcatenateMagickString(version,DJVU_LIBDJVU_VER_STRING,MaxTextExtent);
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry=SetMagickInfo("DJVU");
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_DJVU_DELEGATE)
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadDJVUImage;
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->raw=MagickTrue;
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->magick=(IsImageFormatHandler *) IsDJVU;
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->adjoin=MagickFalse;
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->thread_support=MagickTrue;
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->description=AcquireString("D�j� vu");
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->module=AcquireString("DJVU");
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*version != '\0')
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    entry->version=AcquireString(version);
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->note=AcquireString(DJVUNote);
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickImageCoderSignature);
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   U n r e g i s t e r D J V U I m a g e                                     %
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  UnregisterDJVUImage() removes format registrations made by the
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DJVU module from the list of supported formats.
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the UnregisterDJVUImage method is:
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      UnregisterDJVUImage(void)
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterDJVUImage(void)
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("DJVU");
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
980