--- /dev/null 2011-11-05 17:04:04.509133295 +0100 +++ new/pdflib.cc 2011-11-05 21:15:20.575216608 +0100 @@ -0,0 +1,487 @@ +#include "../general.h" +#include "../prefs.h" +#include "../winimg.h" +#include "aconf.h" +#include "../custom_font.h" +#include "goo/gmem.h" +#include "goo/GString.h" +#include "goo/GList.h" +#include "xpdf/GlobalParams.h" +#include "xpdf/Object.h" +#include "xpdf/PDFDoc.h" +#include "splash/SplashBitmap.h" +#include "splash/Splash.h" +#include "xpdf/SplashOutputDev.h" +#include "xpdf/CharTypes.h" +#include "xpdf/UnicodeMap.h" +#include "xpdf/Outline.h" +#include "xpdf/Link.h" + +extern "C" { + + +static char latin_to_atari[] = { /*0x00A0*/'*','','','','*','',17,'','','','','','','-','', +'','','','','','','','','','*','\'','','','','','*','','','A','A','','','','', +'','E','','E','E','I','I','I','I','D','','O','O','O','','','x','','U','U','U','','Y','*', +'','','','','','','','','','','','','','','','','','','','','','','','','', +'','','','','','y','*',''}; + +char pdf_title[256]; + + +void delete_bookmark_child( Bookmark *book) +{ + int i; + + /* if nothing to do, end the function */ + if( book->child == NULL) + return; + + /* make a loop to see if the childs mini entries have child, if it's true, delete it */ + for ( i = 0; i < book->nbr_child ; i++) + { + if ( book->child[i].nbr_child) + delete_bookmark_child( &book->child[i]); + } + + /* Free the memory and put the counter to zero */ + gfree( book->child); + book->child = NULL; + book->nbr_child = 0; +} + + +int setupOutlineItems( WINDOW * win, PDFDoc *doc, GList *items, UnicodeMap *uMap, Bookmark *book, Bookmark *parent) +{ + OutlineItem *item; + GList *kids; + LinkAction *link_action; + char buf[8], *test; + int i, j, n, count, lenght; + + for (i = 0; i < items->getLength(); ++i) + { + item = (OutlineItem *)items->get(i); + + book[i].parent = parent; + book[i].child = NULL; + book[i].nbr_child = 0; + book[i].state = UNKNOWN; + book[i].valid = FALSE; + + link_action = item->getAction(); + + if( link_action && link_action->getKind () == actionGoTo) + { + LinkGoTo *link = dynamic_cast (link_action); + LinkDest *link_dest = link->getDest(); + GString *named_dest = link->getNamedDest (); + + if (link_dest != NULL) + { + if (link_dest->isPageRef ()) + { + Ref page_ref = link_dest->getPageRef (); + book[i].linked_page = doc->findPage( page_ref.num, page_ref.gen) - 1; + } + else + { + book[i].linked_page = link_dest->getPageNum() - 1; + } + + book[i].valid = TRUE; + } + else if( named_dest != NULL) + { + link_dest = doc->findDest (named_dest); + + if (link_dest->isPageRef ()) + { + Ref page_ref = link_dest->getPageRef (); + book[i].linked_page = doc->findPage( page_ref.num, page_ref.gen) - 1; + } + else + { + book[i].linked_page = link_dest->getPageNum () - 1; + } + + delete link_dest; + book[i].valid = TRUE; + } + } + + if( book[i].valid == FALSE) + continue; + + test = book[i].name; + + + /* Unicode to Latin 1 */ + for (j = 0, lenght = 0; j < item->getTitleLength(); ++j) + { + n = uMap->mapUnicode(item->getTitle()[j], buf, sizeof(buf)); + + for( count = 0; n > count && lenght < 254; count++) + test[lenght++] = buf[count++]; + } + + test[lenght] = '\0'; + + /* Latin 1 to Atari */ + for ( lenght = 0; test[lenght] != '\0'; ++lenght) + { + if( ( uint8)test[lenght] > 0x9F) + { + uint8 c = ( uint8)test[lenght] - 0xA0; + test[lenght] = latin_to_atari[c]; + } + } + + book[i].txt_width = get_text_width( book[i].name); + + item->open(); + + if( item->hasKids() && ( kids = item->getKids()) && kids->getLength() > 0) + { + book[i].nbr_child = kids->getLength(); + book[i].child = ( Bookmark*)gmalloc( sizeof( Bookmark) * kids->getLength()); + book[i].state = item->isOpen(); + + if( !setupOutlineItems(win, doc, kids, uMap, book[i].child, book)) + { + gfree( book[i].child); + book[i].child = NULL; + book[i].nbr_child = 0; + return( 0); + } + } + } + return( 1); +} + +void pdf_build_bookmark( WINDATA *windata, WINDOW *win) +{ + IMAGE *img = &windata->img; + PDFDoc *doc = ( PDFDoc*)img->_priv_ptr; + Outline *outline; + GList *items; + int i; + + outline = doc->getOutline(); + + if( outline == NULL) + return; + + items = outline->getItems(); + + if( items == NULL) + return; + + if ( items->getLength() > 0) + { + windata->root = ( Bookmark*)gmalloc( sizeof( Bookmark) * items->getLength()); + + if( windata->root == NULL) + return; + + GString *enc = new GString("Latin1"); + UnicodeMap *uMap = globalParams->getUnicodeMap(enc); + delete enc; + + windata->nbr_bookmark = items->getLength(); + + if( !setupOutlineItems( win, doc, items, uMap, windata->root, NULL)) + { + for ( i = 0; i < windata->nbr_bookmark; i++) + { + if ( windata->root[i].nbr_child) + delete_bookmark_child( &windata->root[i]); + } + + gfree( windata->root); + windata->root = NULL; + windata->nbr_bookmark = 0; + } + + uMap->decRefCnt(); + } +} + + +boolean lib_pdf_load( const char *name, IMAGE *img) +{ + PDFDoc *doc = NULL; + SplashColor paperColor; + SplashOutputDev *splashOut = NULL; + + char* aaString = const_cast( pdf_aa ? "yes" : "no"); + globalParams->setAntialias( aaString); + + GString nameString( name); + doc = new PDFDoc( &nameString); + + if (!doc->isOk()) + { + delete doc; + return FALSE; + } + + paperColor[0] = paperColor[1] = paperColor[2] = 0xff; + splashOut = new SplashOutputDev( splashModeRGB8, 1, gFalse, paperColor); + splashOut->startDoc(doc->getXRef()); + + img->bits = 24; + img->colors = ( 1L << ( uint32)img->bits) - 1; + img->page = ( uint16)doc->getNumPages(); + img->comments = NULL; + img->_priv_ptr = ( void*)doc; + img->_priv_ptr_more = ( void*)splashOut; + + strcpy( ( char*)img->info, "PDF"); + strcpy( ( char*)img->compression, "None"); + + return TRUE; +} + + + +void pdf_get_page_size( IMAGE *img, int page, uint16 *width, uint16 *height) +{ + PDFDoc *doc = ( PDFDoc*)img->_priv_ptr; + int rotation = doc->getPageRotate( page); + + if( ( rotation == 90) || ( rotation == 270)) + { + *width = (uint16)doc->getPageCropHeight( page); + *height = (uint16)doc->getPageCropWidth( page); + } + else + { + *width = (uint16)doc->getPageCropWidth( page); + *height = (uint16)doc->getPageCropHeight( page); + } +} + + +void pdf_decode_page( IMAGE *img, int page, double scale) +{ + PDFDoc *doc = ( PDFDoc*)img->_priv_ptr; + SplashOutputDev *splashOut = ( SplashOutputDev*)img->_priv_ptr_more; + int rotation = doc->getPageRotate( page); + + if( ( rotation == 90) || ( rotation == 270)) + { + img->img_w = (uint16)MAX(( doc->getPageCropHeight( page) * scale + 0.5), 1); + img->img_h = (uint16)MAX(( doc->getPageCropWidth( page) * scale + 0.5), 1); + } + else + { + img->img_w = (uint16)MAX(( doc->getPageCropWidth( page) * scale + 0.5), 1); + img->img_h = (uint16)MAX(( doc->getPageCropHeight( page) * scale + 0.5), 1); + } + + doc->displayPage( splashOut, page, 72.0 * scale, 72.0 * scale, 0, gFalse, gTrue, gFalse); +} + + +uint32 *pdf_get_page_addr( IMAGE *img) +{ + SplashOutputDev *splashOut = ( SplashOutputDev*)img->_priv_ptr_more; + SplashColorPtr data = splashOut->getBitmap()->getDataPtr(); + + return ( uint32*)( data); // ( data.rgb8); +} + +static char *InfoString(Dict *infoDict, char *key, UnicodeMap *uMap) +{ + Object obj; + GString *s1; + GBool isUnicode; + Unicode u; + char buf[8]; + static char text[256]; + int i, n, lenght = 0, count; + + if (infoDict->lookup(key, &obj)->isString()) + { + s1 = obj.getString(); + + if ((s1->getChar(0) & 0xff) == 0xfe && (s1->getChar(1) & 0xff) == 0xff) + { + isUnicode = gTrue; + i = 2; + } + else + { + isUnicode = gFalse; + i = 0; + } + + while ( i < obj.getString()->getLength()) + { + if (isUnicode) + { + u = ((s1->getChar(i) & 0xff) << 8) | (s1->getChar(i+1) & 0xff); + i += 2; + } + else + { + u = s1->getChar(i) & 0xff; + ++i; + } + + n = uMap->mapUnicode(u, buf, sizeof(buf)); + + count = 0; + + if(( n + lenght) > 234) + { + text[lenght] = '\0'; + obj.free(); + return ( char*)&text; + } + + while( n > count) + text[lenght++] = buf[count++]; + } + } + + text[lenght] = '\0'; + obj.free(); + + return ( char*)&text; +} + +static char *InfoDate(Dict *infoDict, char *key) +{ + Object obj; + char *s; + int year, mon, day, hour, min, sec; + struct tm tmStruct; + static char buf[256]; + + if (infoDict->lookup(key, &obj)->isString()) + { + s = obj.getString()->getCString(); + + if (s[0] == 'D' && s[1] == ':') + { + s += 2; + } + + if (sscanf(s, "%4d%2d%2d%2d%2d%2d", &year, &mon, &day, &hour, &min, &sec) == 6) + { + tmStruct.tm_year = year - 1900; + tmStruct.tm_mon = mon - 1; + tmStruct.tm_mday = day; + tmStruct.tm_hour = hour; + tmStruct.tm_min = min; + tmStruct.tm_sec = sec; + tmStruct.tm_wday = -1; + tmStruct.tm_yday = -1; + tmStruct.tm_isdst = -1; + // compute the tm_wday and tm_yday fields + if (mktime(&tmStruct) != (time_t)-1 && strftime(buf, sizeof(buf), "%c", &tmStruct)) + { + obj.free(); + return ( char*)&buf; + } + } + + strcpy( buf, s); + } + else buf[0] = '\0'; + + obj.free(); + return ( char*)&buf; +} + +void pdf_get_info( IMAGE *img, txt_data *txtdata) +{ + Object info; + UnicodeMap *uMap; + PDFDoc *doc = ( PDFDoc*)img->_priv_ptr; + char *txt; + + if (!( uMap = globalParams->getTextEncoding())) + { + pdf_title[0] = '\0'; + txtdata->txt[0][0] = '\0'; + txtdata->txt[1][0] = '\0'; + txtdata->txt[2][0] = '\0'; + txtdata->txt[3][0] = '\0'; + txtdata->txt[4][0] = '\0'; + txtdata->txt[5][0] = '\0'; + txtdata->txt[6][0] = '\0'; + txtdata->txt[7][0] = '\0'; + return; + } + + doc->getDocInfo(&info); + + if (info.isDict()) + { + txt = InfoString(info.getDict(), "Title", uMap); + sprintf( ( char*)txtdata->txt[0] , "Title: %s", txt); + strcpy( pdf_title, txt); + txt = InfoString(info.getDict(), "Subject", uMap); + sprintf( ( char*)txtdata->txt[1] , "Subject: %s", txt); + txt = InfoString(info.getDict(), "Keywords", uMap); + sprintf( ( char*)txtdata->txt[2] , "Keywords: %s", txt); + txt = InfoString(info.getDict(), "Author", uMap); + sprintf( ( char*)txtdata->txt[3] , "Author: %s", txt); + txt = InfoString(info.getDict(), "Creator", uMap); + sprintf( ( char*)txtdata->txt[4] , "Creator: %s", txt); + txt = InfoString(info.getDict(), "Producer", uMap); + sprintf( ( char*)txtdata->txt[5] , "Producer: %s", txt); +// sprintf( ( char*)txtdata->txt[6] , "PDF version: %.1f", doc->getPDFVersion()); + + txt = InfoDate(info.getDict(), "CreationDate"); + sprintf( ( char*)txtdata->txt[6] , "Creation Date: %s", txt); + txt = InfoDate(info.getDict(), "ModDate"); + sprintf( ( char*)txtdata->txt[7] , "Modification Date: %s", txt); + } + else + { + pdf_title[0] = '\0'; + txtdata->txt[0][0] = '\0'; + txtdata->txt[1][0] = '\0'; + txtdata->txt[2][0] = '\0'; + txtdata->txt[3][0] = '\0'; + txtdata->txt[4][0] = '\0'; + txtdata->txt[5][0] = '\0'; + txtdata->txt[6][0] = '\0'; + txtdata->txt[7][0] = '\0'; + } + + info.free(); + uMap->decRefCnt(); +} + +void pdf_quit( IMAGE *img) +{ + PDFDoc *doc = ( PDFDoc*)img->_priv_ptr; + SplashOutputDev *splashOut = ( SplashOutputDev*)img->_priv_ptr_more; + + delete splashOut; + delete doc; +} + +char *get_pdf_title( void) +{ + return ( char*)&pdf_title; +} + +boolean pdf_init( char *path) +{ + globalParams = new GlobalParams( NULL); + globalParams->setupBaseFonts( path); + return TRUE; +} + +void pdf_exit( void) +{ + delete globalParams; +} + +} diff -ruwN _deps/xpdf-3.03/pdflib.h xpdf-3.03/pdflib.h --- _deps/xpdf-3.03/pdflib.h 1970-01-01 01:00:00.000000000 +0100 +++ xpdf-3.03/pdflib.h 2011-10-16 22:33:31.870338392 +0200 @@ -0,0 +1,13 @@ +boolean lib_pdf_load( const char *name, IMAGE *img); +void pdf_get_page_size( IMAGE *img, int page, uint16 *width, uint16 *height); +void pdf_decode_page( IMAGE *img, int page, double scale); +uint32 *pdf_get_page_addr( IMAGE *img); +void pdf_quit( IMAGE *img); +boolean pdf_init( char *path); +void pdf_exit( void); +char *get_pdf_title( void) ; +void pdf_build_bookmark( WINDATA *windata, WINDOW *win); +void pdf_get_info( IMAGE *img, txt_data *txtdata); +void delete_bookmark_child( Bookmark *book); + + diff -ruwN _deps/xpdf-3.03/xpdf/GlobalParams.cc xpdf-3.03/xpdf/GlobalParams.cc --- _deps/xpdf-3.03/xpdf/GlobalParams.cc 2011-08-15 23:08:53.000000000 +0200 +++ xpdf-3.03/xpdf/GlobalParams.cc 2011-10-16 22:33:46.513693391 +0200 @@ -85,20 +85,20 @@ const char *t1FileName; const char *ttFileName; } displayFontTab[] = { - {"Courier", "n022003l.pfb", "cour.ttf"}, - {"Courier-Bold", "n022004l.pfb", "courbd.ttf"}, - {"Courier-BoldOblique", "n022024l.pfb", "courbi.ttf"}, - {"Courier-Oblique", "n022023l.pfb", "couri.ttf"}, - {"Helvetica", "n019003l.pfb", "arial.ttf"}, - {"Helvetica-Bold", "n019004l.pfb", "arialbd.ttf"}, - {"Helvetica-BoldOblique", "n019024l.pfb", "arialbi.ttf"}, - {"Helvetica-Oblique", "n019023l.pfb", "ariali.ttf"}, - {"Symbol", "s050000l.pfb", NULL}, - {"Times-Bold", "n021004l.pfb", "timesbd.ttf"}, - {"Times-BoldItalic", "n021024l.pfb", "timesbi.ttf"}, - {"Times-Italic", "n021023l.pfb", "timesi.ttf"}, - {"Times-Roman", "n021003l.pfb", "times.ttf"}, - {"ZapfDingbats", "d050000l.pfb", NULL}, + {"Courier", "fonts\\n022003l.pfb", "cour.ttf"}, + {"Courier-Bold", "fonts\\n022004l.pfb", "courbd.ttf"}, + {"Courier-BoldOblique", "fonts\\n022024l.pfb", "courbi.ttf"}, + {"Courier-Oblique", "fonts\\n022023l.pfb", "couri.ttf"}, + {"Helvetica", "fonts\\n019003l.pfb", "arial.ttf"}, + {"Helvetica-Bold", "fonts\\n019004l.pfb", "arialbd.ttf"}, + {"Helvetica-BoldOblique", "fonts\\n019024l.pfb", "arialbi.ttf"}, + {"Helvetica-Oblique", "fonts\\n019023l.pfb", "ariali.ttf"}, + {"Symbol", "fonts\\s050000l.pfb", NULL}, + {"Times-Bold", "fonts\\n021004l.pfb", "timesbd.ttf"}, + {"Times-BoldItalic", "fonts\\n021024l.pfb", "timesbi.ttf"}, + {"Times-Italic", "fonts\\n021023l.pfb", "timesi.ttf"}, + {"Times-Roman", "fonts\\n021003l.pfb", "times.ttf"}, + {"ZapfDingbats", "fonts\\d050000l.pfb", NULL}, {NULL} }; @@ -110,11 +110,13 @@ }; #else static const char *displayFontDirs[] = { + /* "/usr/share/ghostscript/fonts", "/usr/local/share/ghostscript/fonts", "/usr/share/fonts/default/Type1", "/usr/share/fonts/default/ghostscript", "/usr/share/fonts/type1/gsfonts", + */ NULL }; #endif