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                                %
16de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy%                                   Cristy                                    %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                 July 1992                                   %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
207ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/blob-private.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/colormap.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/constitute.h"
484c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
501c974a99bac1e62504306e1ac5ad59ba8c12adbadirk#include "MagickCore/image-private.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/magick.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/pixel-accessor.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/static.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/module.h"
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_DJVU_DELEGATE)
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include <libdjvu/ddjvuapi.h>
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   I s D J V U                                                               %
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  IsDJVU() returns MagickTrue if the image format type, identified by the
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  magick string, is DJVU.
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the IsDJVU method is:
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType IsDJVU(const unsigned char *magick,const size_t length)
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o magick: compare image format pattern against these bytes.
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o length: Specifies the length of the magick string.
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsDJVU(const unsigned char *magick,const size_t length)
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (length < 8)
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (memcmp(magick,"AT&TFORM",8) == 0)
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickFalse);
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_DJVU_DELEGATE)
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e a d D J V U I m a g e                                                 %
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ReadDJVUImage() reads DJVU image and returns it.  It allocates the memory
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  necessary for the new Image structure and returns a pointer to the new
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image or set of images.
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ReadDJVUImage method is:
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Image *ReadDJVUImage(const ImageInfo *image_info,
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" {
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _LoadContext
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   LoadContext;
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristystruct _LoadContext
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_context_t* context;
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_document_t *document;
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_page_t *page;
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int streamid;
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int pages;
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image *image;
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy};
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define BLOCKSIZE  65536
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristypump_data(Image *image, LoadContext* lc)
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int blocksize = BLOCKSIZE;
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        char data[BLOCKSIZE];
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int size;
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* i might check for a condition! */
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while ((size = (size_t) ReadBlob(image,(size_t) blocksize,data)) == blocksize) {
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_stream_write(lc->document, lc->streamid, data, size);
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (size)
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_stream_write(lc->document, lc->streamid, data, size);
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_stream_close(lc->document, lc->streamid, 0);
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* returns NULL only after all is delivered! */
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic ddjvu_message_t*
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristypump_data_until_message(LoadContext *lc,Image *image) /* ddjvu_context_t *context, type ddjvu_document_type_t */
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
168bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        size_t blocksize = BLOCKSIZE;
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        unsigned char data[BLOCKSIZE];
170bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        size_t size;
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_message_t *message;
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* i might check for a condition! */
174697f5a9793bfc7d9958a1a28c4a118220882b0bacristy        size=0;
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        while (!(message = ddjvu_message_peek(lc->context))
176bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy               && (size = (size_t) ReadBlob(image,(size_t) blocksize,data)) == blocksize) {
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_stream_write(lc->document, lc->streamid, (char *) data, size);
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (message)
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                return message;
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (size)
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_stream_write(lc->document, lc->streamid, (char *) data, size);
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_stream_close(lc->document, lc->streamid, 0);
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return NULL;
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DEBUG 0
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic const char*
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristymessage_tag_name(ddjvu_message_tag_t tag)
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   static char* names[] =
1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "ERROR",
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "INFO",
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "NEWSTREAM",
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "DOCINFO",
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "PAGEINFO",
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "RELAYOUT",
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "REDISPLAY",
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "CHUNK",
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "THUMBNAIL",
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy         "PROGRESS",
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      };
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   if (tag <= DDJVU_PROGRESS)
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return names[tag];
2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   else {
2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /* bark! */
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return 0;
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   }
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* write out nice info on the message,
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * and store in *user* data the info on progress.
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * */
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristyint
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristyprocess_message(ddjvu_message_t *message)
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   ddjvu_context_t* context= message->m_any.context;
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   if (! message)
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      return(-1);
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   printf("*** %s: %s.\n",__FUNCTION__, message_tag_name(message->m_any.tag));
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   switch (message->m_any.tag){
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_DOCINFO:
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   {
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ddjvu_document_t* document= message->m_any.document;
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /* ddjvu_document_decoding_status  is set by libdjvu! */
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      /* we have some info on the document  */
2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      LoadContext *lc = (LoadContext *) ddjvu_document_get_user_data(document);
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      lc->pages = ddjvu_document_get_pagenum(document);
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      printf("the doc has %d pages\n", ddjvu_document_get_pagenum(document));
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   }
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_CHUNK:
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
2473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           printf("the name of the chunk is: %s\n", message->m_chunk.chunkid);
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           break;
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_RELAYOUT:
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_PAGEINFO:
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   {
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ddjvu_page_t* page = message->m_any.page;
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      page_info* info = ddjvu_page_get_user_data(page);
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      printf("page decoding status: %d %s%s%s\n",
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             ddjvu_page_decoding_status(page),
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             status_color, status_name(ddjvu_page_decoding_status(page)), color_reset);
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      printf("the page LAYOUT changed: width x height: %d x %d @ %d dpi. Version %d, type %d\n",
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             // printf("page info:\n width x height: %d x %d @ %d dpi, version %d, type %d\n",
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             ddjvu_page_get_width(page),
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             ddjvu_page_get_height(page),
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             ddjvu_page_get_resolution(page),
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             ddjvu_page_get_version(page),
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             /* DDJVU_PAGETYPE_BITONAL */
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy             ddjvu_page_get_type(page));
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      info->info = 1;
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   }
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_REDISPLAY:
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   {
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ddjvu_page_t* page = message->m_any.page;
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      page_info* info = ddjvu_page_get_user_data(page);
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      printf("the page can/should be REDISPLAYED\n");
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      info->display = 1;
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   }
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_PROGRESS:
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           printf("PROGRESS:\n");
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           break;
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_ERROR:
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           printf("simply ERROR!\n message:\t%s\nfunction:\t%s(file %s)\nlineno:\t%d\n",
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  message->m_error.message,
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  message->m_error.function,
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  message->m_error.filename,
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  message->m_error.lineno);
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           break;
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   case DDJVU_INFO:
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           printf("INFO: %s!\n", message->m_info.message);
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy           break;
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   default:
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      printf("unexpected\n");
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   };
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(message->m_any.tag);
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus)
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define RGB 1
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * DjVu advertised readiness to provide bitmap: So get it!
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * we use the RGB format!
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void
326b0de93fdedaac769cb08e15b3ec176d4c9078907cristyget_page_image(LoadContext *lc, ddjvu_page_t *page, int x, int y, int w, int h, ExceptionInfo *exception ) {
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_format_t
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *format;
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_page_type_t
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    type;
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image;
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ret,
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    stride;
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_rect_t rect;
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.x = x;
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.y = y;
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.w = (unsigned int) w;             /* /10 */
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.h = (unsigned int) h;             /* /10 */
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image = lc->image;
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        type = ddjvu_page_get_type(lc->page);
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* stride of this temporary buffer: */
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        stride = (type == DDJVU_PAGETYPE_BITONAL)?
35498a8577a50f3c5b960f5d7f0f830d76c0e2c6fe8cristy                (image->columns + 7)/8 : image->columns *3;
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
35698a8577a50f3c5b960f5d7f0f830d76c0e2c6fe8cristy        q = (unsigned char *) AcquireQuantumMemory(image->rows,stride);
35798a8577a50f3c5b960f5d7f0f830d76c0e2c6fe8cristy        if (q == (unsigned char *) NULL)
35898a8577a50f3c5b960f5d7f0f830d76c0e2c6fe8cristy          return;
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        format = ddjvu_format_create(
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                (type == DDJVU_PAGETYPE_BITONAL)?DDJVU_FORMAT_LSBTOMSB : DDJVU_FORMAT_RGB24,
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* DDJVU_FORMAT_RGB24
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                 * DDJVU_FORMAT_RGBMASK32*/
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* DDJVU_FORMAT_RGBMASK32 */
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                0, NULL);
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* fixme:  ThrowReaderException is a macro, which uses  `exception' variable */
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (format == NULL)
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        abort();
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        /* ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); */
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_format_set_row_order(format, 1);
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_format_set_y_direction(format, 1);
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ret = ddjvu_page_render(page,
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    DDJVU_RENDER_COLOR, /* ddjvu_render_mode_t */
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    &rect,
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    &rect,     /* mmc: ?? */
3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    format,
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    stride, /* ?? */
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    (char*)q);
3869561fec9e40dfe2c5c00e42ee8b6a0131f4cf9fecristy        (void) ret;
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_format_release(format);
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (type == DDJVU_PAGETYPE_BITONAL) {
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /*  */
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                printf("%s: expanding BITONAL page/image\n", __FUNCTION__);
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
395bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                size_t bit, byte;
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
397bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                for (y=0; y < (ssize_t) image->rows; y++)
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        {
399c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy                                Quantum * o = QueueAuthenticPixels(image,0,y,image->columns,1,exception);
4004c08aed51c5899665ade97263692328eea4af106cristy                                if (o == (Quantum *) NULL)
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                        break;
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                bit=0;
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                byte=0;
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                /* fixme:  the non-aligned, last =<7 bits ! that's ok!!!*/
406bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                                for (x= 0; x < (ssize_t) image->columns; x++)
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                        {
408bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                                                if (bit == 0) byte= (size_t) q[(y * stride) + (x / 8)];
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4104c08aed51c5899665ade97263692328eea4af106cristy                                                SetPixelIndex(image,(Quantum) (((byte & 0x01) != 0) ? 0x00 : 0x01),o);
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                bit++;
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                if (bit == 8)
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                        bit=0;
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                                byte>>=1;
415ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                                          o+=GetPixelChannels(image);
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                        }
417c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy                                if (SyncAuthenticPixels(image,exception) == MagickFalse)
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                        break;
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        }
420f500a7b853da661ef13958c7ba2bcd91622b77a5cristy                if (!image->ping)
421c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy                  SyncImage(image,exception);
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        } else {
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                printf("%s: expanding PHOTO page/image\n", __FUNCTION__);
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* now transfer line-wise: */
427bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy                ssize_t i;
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* old: */
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                char* r;
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
4324c08aed51c5899665ade97263692328eea4af106cristy                register Quantum *r;
43398a8577a50f3c5b960f5d7f0f830d76c0e2c6fe8cristy                unsigned char *s;
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
43598a8577a50f3c5b960f5d7f0f830d76c0e2c6fe8cristy                s=q;
43698a8577a50f3c5b960f5d7f0f830d76c0e2c6fe8cristy                for (i = 0;i< (ssize_t) image->rows; i++)
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        {
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                               if (i % 1000 == 0) printf("%d\n",i);
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
441c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy                               r = QueueAuthenticPixels(image,0,i,image->columns,1,exception);
4424c08aed51c5899665ade97263692328eea4af106cristy                               if (r == (Quantum *) NULL)
4439561fec9e40dfe2c5c00e42ee8b6a0131f4cf9fecristy                                 break;
44498a8577a50f3c5b960f5d7f0f830d76c0e2c6fe8cristy                  for (x=0; x < (ssize_t) image->columns; x++)
44598a8577a50f3c5b960f5d7f0f830d76c0e2c6fe8cristy                  {
4464c08aed51c5899665ade97263692328eea4af106cristy                    SetPixelRed(image,ScaleCharToQuantum(*s++),r);
4474c08aed51c5899665ade97263692328eea4af106cristy                    SetPixelGreen(image,ScaleCharToQuantum(*s++),r);
4484c08aed51c5899665ade97263692328eea4af106cristy                    SetPixelBlue(image,ScaleCharToQuantum(*s++),r);
449ed2315769b26818ed9d0c1291dc0457f0d8da0a4cristy                    r+=GetPixelChannels(image);
45098a8577a50f3c5b960f5d7f0f830d76c0e2c6fe8cristy                  }
45198a8577a50f3c5b960f5d7f0f830d76c0e2c6fe8cristy
4524d0ca34912f861b25e5ed95e3f624048cb180358cristy                              (void) SyncAuthenticPixels(image,exception);
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        }
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=(unsigned char *) RelinquishMagickMemory(q);
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_DJVU_DELEGATE)
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
46195236b5197310e4ca467d8585545bbd77edddc53cristy#if 0
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristyget_page_line(LoadContext *lc, int row, QuantumInfo* quantum_info)
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_format_t
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *format;
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ret;
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    stride;
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *q;
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_rect_t rect, pagerect;
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.x = 0;
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.y = row;
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.w = lc->image->columns;             /* /10 */
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        rect.h = 1;             /* /10 */
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pagerect.x = 0;
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pagerect.y = 0;
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pagerect.w = lc->image->columns;
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        pagerect.h = lc->image->rows;
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        format = ddjvu_format_create(
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if RGB
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                DDJVU_FORMAT_RGB24
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                DDJVU_FORMAT_GREY8
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ,
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                0, NULL);
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_format_set_row_order(format, 1);
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_format_set_y_direction(format, 1);
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        stride=1;
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if RGB
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        stride=3;
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q = (unsigned char *) AcquireQuantumMemory(lc->image->columns,stride);
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ret = ddjvu_page_render(lc->page,
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    DDJVU_RENDER_COLOR, /* ddjvu_render_mode_t */
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    &pagerect,
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    &rect,     /* mmc: ?? */
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    format,
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    pagerect.w * 3, /* ?? */
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                    (char*)q);
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ImportQuantumPixels(lc->image,
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                            (CacheView *) NULL,
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                            quantum_info,
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if RGB
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                            RGBQuantum
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                            GrayQuantum
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                            ,q,&lc->image->exception);
5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        q=(unsigned char *) RelinquishMagickMemory(q);
5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_format_release(format);
5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return ret;
5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
52895236b5197310e4ca467d8585545bbd77edddc53cristy#endif
5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e a d O n e D J V U I m a g e                                           %
5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  ReadOneDJVUImage() reads a Portable Network Graphics (DJVU) image file
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  (minus the 8-byte signature)  and returns it.  It allocates the memory
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  necessary for the new Image structure and returns a pointer to the new
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  image.
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the ReadOneDJVUImage method is:
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      Image *ReadOneDJVUImage(MngInfo *mng_info, const ImageInfo *image_info,
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%         ExceptionInfo *exception)
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o mng_info: Specifies a pointer to a MngInfo structure.
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image_info: the image info.
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadOneDJVUImage(LoadContext* lc,const int pagenum,
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const ImageInfo *image_info,ExceptionInfo *exception)
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_page_type_t
5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     type;
5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_pageinfo_t info;
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_message_t *message;
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image *image;
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int logging;
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int tag;
572acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy  MagickBooleanType status;
5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* so, we know that the page is there! Get its dimension, and  */
5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* Read one DJVU image */
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image = lc->image;
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5794c08aed51c5899665ade97263692328eea4af106cristy        /* register Quantum *q; */
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        logging=LogMagickEvent(CoderEvent,GetMagickModule(), "  enter ReadOneDJVUImage()");
582c8d219935c26692865fa48e63df9d1865c4d8915cristy        (void) logging;
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        printf("====  Loading the page %d\n", pagenum);
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        lc->page = ddjvu_page_create_by_pageno(lc->document, pagenum); /*  0? */
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* pump data untill the page is ready for rendering. */
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        tag=(-1);
5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        do {
5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                while ((message = ddjvu_message_peek(lc->context)))
5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        {
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                tag=process_message(message);
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                if (tag == 0) break;
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                ddjvu_message_pop(lc->context);
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        }
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* fixme: maybe exit? */
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* if (lc->error) break; */
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                message = pump_data_until_message(lc,image);
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                if (message)
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        do {
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                tag=process_message(message);
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                if (tag == 0) break;
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                                ddjvu_message_pop(lc->context);
6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        } while ((message = ddjvu_message_peek(lc->context)));
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        } while (!ddjvu_page_decoding_done(lc->page));
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ddjvu_document_get_pageinfo(lc->document, pagenum, &info);
6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6122a11befa48257796843468409d77bb8cfb129cdccristy        image->resolution.x = (float) info.dpi;
6132a11befa48257796843468409d77bb8cfb129cdccristy        image->resolution.y =(float) info.dpi;
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (image_info->density != (char *) NULL)
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          {
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            int
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              flags;
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            GeometryInfo
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              geometry_info;
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            /*
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy              Set rendering resolution.
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            */
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            flags=ParseGeometry(image_info->density,&geometry_info);
6262a11befa48257796843468409d77bb8cfb129cdccristy            image->resolution.x=geometry_info.rho;
6272a11befa48257796843468409d77bb8cfb129cdccristy            image->resolution.y=geometry_info.sigma;
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy            if ((flags & SigmaValue) == 0)
6292a11befa48257796843468409d77bb8cfb129cdccristy              image->resolution.y=image->resolution.x;
6302a11befa48257796843468409d77bb8cfb129cdccristy            info.width*=image->resolution.x/info.dpi;
6312a11befa48257796843468409d77bb8cfb129cdccristy            info.height*=image->resolution.y/info.dpi;
6322a11befa48257796843468409d77bb8cfb129cdccristy            info.dpi=(ssize_t) MagickMax(image->resolution.x,image->resolution.y);
6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          }
6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        type = ddjvu_page_get_type(lc->page);
6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* double -> float! */
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* image->gamma = (float)ddjvu_page_get_gamma(lc->page); */
6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* mmc:  set  image->depth  */
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* mmc:  This from the type */
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
642bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        image->columns=(size_t) info.width;
643bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy        image->rows=(size_t) info.height;
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* mmc: bitonal should be palettized, and compressed! */
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (type == DDJVU_PAGETYPE_BITONAL){
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->colorspace = GRAYColorspace;
6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->storage_class = PseudoClass;
6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->depth =  8UL;    /* i only support that? */
6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->colors= 2;
651018f07f7333b25743d0afff892450cebdb905c1acristy                if (AcquireImageColormap(image,image->colors,exception) == MagickFalse)
6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                  ThrowReaderException(ResourceLimitError,
6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                   "MemoryAllocationFailed");
6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        } else {
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->colorspace = RGBColorspace;
6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->storage_class = DirectClass;
6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* fixme:  MAGICKCORE_QUANTUM_DEPTH ?*/
6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                image->depth =  8UL;    /* i only support that? */
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
660b0a657e13c4aefba39c51292005427b47277869dcristy                image->alpha_trait = BlendPixelTrait;
6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                /* is this useful? */
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
663acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy        status=SetImageExtent(image,image->columns,image->rows,exception);
664acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy        if (status == MagickFalse)
665acabb847a592ca5e430c1c0949d03acfc0b78bb9cristy          return(DestroyImageList(image));
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
667e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy        printf("now filling %.20g x %.20g\n",(double) image->columns,(double)
668e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy          image->rows);
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 1                           /* per_line */
6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* q = QueueAuthenticPixels(image,0,0,image->columns,image->rows); */
675b0de93fdedaac769cb08e15b3ec176d4c9078907cristy        get_page_image(lc, lc->page, 0, 0, info.width, info.height, exception);
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        int i;
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        for (i = 0;i< image->rows; i++)
6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                {
6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        printf("%d\n",i);
6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        q = QueueAuthenticPixels(image,0,i,image->columns,1);
6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        get_page_line(lc, i, quantum_info);
6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                        SyncAuthenticPixels(image);
6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                }
6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* per_line */
6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if DEBUG
690e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy        printf("END: finished filling %.20g x %.20g\n",(double) image->columns,
691e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy          (double) image->rows);
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
694f500a7b853da661ef13958c7ba2bcd91622b77a5cristy        if (!image->ping)
695ea1a8aa04a9fe1500104284407c1cc06d20da699cristy          SyncImage(image,exception);
6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* mmc: ??? Convert PNM pixels to runlength-encoded MIFF packets. */
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* image->colors =  */
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* how is the line padding  / stride? */
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (lc->page) {
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_page_release(lc->page);
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                lc->page = NULL;
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        }
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* image->page.y=mng_info->y_off[mng_info->object_id]; */
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (tag == 0)
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          image=DestroyImage(image);
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        return image;
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        /* end of reading one DJVU page/image */
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* palette */
715018f07f7333b25743d0afff892450cebdb905c1acristy  if (AcquireImageColormap(image,2,exception) == MagickFalse)
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Monochrome colormap.   mmc: this the default!
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colormap[0].red=QuantumRange;
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colormap[0].green=QuantumRange;
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colormap[0].blue=QuantumRange;
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colormap[1].red=0;
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colormap[1].green=0;
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->colormap[1].blue=0;
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void djvu_close_lc(LoadContext* lc)
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (lc->document)
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_document_release(lc->document);
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (lc->context)
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_context_release(lc->context);
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        if (lc->page)
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy                ddjvu_page_release(lc->page);
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RelinquishMagickMemory(lc);
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadDJVUImage(const ImageInfo *image_info,
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ExceptionInfo *exception)
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *url;
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_message_t
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *message;
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Image
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *image,
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *images;
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  int
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    logging,
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    use_cache;
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  LoadContext
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *lc;
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
762bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   * Open image file.
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   */
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image_info != (const ImageInfo *) NULL);
769e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image_info->signature == MagickCoreSignature);
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->debug != MagickFalse)
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", image_info->filename);
7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
776e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  logging = LogMagickEvent(CoderEvent,GetMagickModule(),"enter ReadDJVUImage()");
7809561fec9e40dfe2c5c00e42ee8b6a0131f4cf9fecristy  (void) logging;
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7829950d57e1124b73f684fb5946e206994cefda628cristy  image = AcquireImage(image_info,exception); /* mmc: ?? */
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lc = (LoadContext *) NULL;
7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status = OpenBlob(image_info,image,ReadBinaryBlobMode,exception);
7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (status == MagickFalse)
7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(FileOpenError,"UnableToOpenFile");
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Verify DJVU signature.
7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  count = ReadBlob(image,8,(unsigned char *) magic_number);
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* IsDJVU(const unsigned char *magick,const size_t length) */
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (memcmp(magic_number,"AT&TFORM",8) != 0)
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(CorruptImageError,"ImproperImageHeader");
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   * Allocate a LoadContext structure.
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   */
80473bd4a51b419e914565bdf204bf1540dc4c8ee26cristy  lc = (LoadContext *) AcquireMagickMemory(sizeof(*lc));
8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (lc == NULL)
8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed");
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   * Initialize members of the MngInfo structure.
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy   */
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(lc,0,sizeof(LoadContext));
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lc->image = image;
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lc->pages = 0;
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lc->context = ddjvu_context_create("ImageMagick djvu loader"); /* g_program_name */
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_cache_set_size(lc->context, 1); /* right? */
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  use_cache = 0;
8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* document: here we don't have a filename, but, for the sake of generality, a FILE* ! */
82179565a227f89ff0b550e46db3b4e348e726511fbcristy  url="http://www.imagemagick.org/fake.djvu";
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lc->document = ddjvu_document_create(lc->context, url, use_cache); /* don't cache */
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_document_set_user_data(lc->document, lc);
8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* now we wait the message-request for data: */
8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  message = ddjvu_message_wait(lc->context);
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (message->m_any.tag != DDJVU_NEWSTREAM) {
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          /* fixme: the djvu context, document! */
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ddjvu_document_release(lc->document);
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ddjvu_context_release(lc->context);
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          RelinquishMagickMemory(lc);
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ThrowReaderException(ResourceLimitError,"Djvu initial message: unexpected type");
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          return NULL;    /* error! */
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  lc->streamid = message->m_newstream.streamid;
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ddjvu_message_pop(lc->context);
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  message = pump_data_until_message(lc,image);
8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* now process the messages: */
8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (message) do {
8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          process_message(message);
8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ddjvu_message_pop(lc->context);
8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  } while ((message = ddjvu_message_peek(lc->context)));
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /* fixme: i hope we have not read any messages pertinent(?) related to the page itself!  */
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  while (lc->pages == 0) {
8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          message = ddjvu_message_wait(lc->context);
8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          process_message(message);
8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          ddjvu_message_pop(lc->context);
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  images=NewImageList();
8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  i=0;
8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image_info->number_scenes != 0)
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i=image_info->scene;
865bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for ( ; i < (ssize_t) lc->pages; i++)
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    image=ReadOneDJVUImage(lc,i,image_info,exception);
8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image == (Image *) NULL)
8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
870c3ebda260e2cdca5c0efa27addf0a66748d7c6facristy    image->scene=i;
8713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    AppendImageToList(&images,CloneImageList(image,exception));
8723f1c12010ba5f446abca3b5ed6a21b3c43384e7ccristy    images->extent=GetBlobSize(image);
8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (image_info->number_scenes != 0)
8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (image->scene >= (image_info->scene+image_info->number_scenes-1))
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        break;
8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  djvu_close_lc(lc);
8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CloseBlob(images);
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image != (Image *) NULL)
8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    image=DestroyImageList(image);
8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((image->page.width == 0) && (image->page.height == 0))
8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->page.width = image->columns+image->page.x;
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      image->page.height = image->rows+image->page.y;
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->columns == 0 || image->rows == 0)
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if (logging != MagickFalse)
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        (void) LogMagickEvent(CoderEvent,GetMagickModule(),
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy          "exit ReadDJVUImage() with error.");
8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowReaderException(CorruptImageError,"CorruptImage");
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (logging != MagickFalse)
8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadDJVUImage()");
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(GetFirstImageInList(images));
9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   R e g i s t e r D J V U I m a g e                                         %
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  RegisterDJVUImage() adds attributes for the DJVU image format to
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  the list of supported formats.  The attributes include the image format
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  tag, a method to read and/or write the format, whether the format
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  supports the saving of more than one frame to the same file or blob,
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  whether the format supports native in-memory I/O, and a brief
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  description of the format.
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the RegisterDJVUImage method is:
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
925bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy%      size_t RegisterDJVUImage(void)
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
928bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterDJVUImage(void)
9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
931151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy    version[MagickPathExtent];
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickInfo
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *entry;
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static const char
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *DJVUNote =
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "See http://www.djvuzone.org/ for details about the DJVU format.  The\n"
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "DJVU 1.2 specification is available there and at\n"
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      "ftp://swrinde.nde.swri.edu/pub/djvu/documents/."
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *version='\0';
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(DJVU_LIBDJVU_VER_STRING)
946151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) ConcatenateMagickString(version,"libdjvu ",MagickPathExtent);
947151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy  (void) ConcatenateMagickString(version,DJVU_LIBDJVU_VER_STRING,MagickPathExtent);
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
9490d143b185eba0e33494f940e274c43267a11f8eecristy  entry=AcquireMagickInfo("DJVU","DJVU","Deja vu");
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_DJVU_DELEGATE)
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->decoder=(DecodeImageHandler *) ReadDJVUImage;
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->magick=(IsImageFormatHandler *) IsDJVU;
95408e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags|=CoderRawSupportFlag;
95508e9a113db499034abb5ad8d59b42f8eca3c641cdirk  entry->flags^=CoderAdjoinFlag;
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (*version != '\0')
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    entry->version=AcquireString(version);
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  entry->note=AcquireString(DJVUNote);
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) RegisterMagickInfo(entry);
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(MagickImageCoderSignature);
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   U n r e g i s t e r D J V U I m a g e                                     %
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  UnregisterDJVUImage() removes format registrations made by the
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DJVU module from the list of supported formats.
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the UnregisterDJVUImage method is:
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      UnregisterDJVUImage(void)
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterDJVUImage(void)
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) UnregisterMagickInfo("DJVU");
9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
986