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