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