diff --git a/YACReader/YACReader.pro b/YACReader/YACReader.pro index 34d5a48a..07b05243 100644 --- a/YACReader/YACReader.pro +++ b/YACReader/YACReader.pro @@ -7,6 +7,24 @@ DEPENDPATH += . \ release INCLUDEPATH += . INCLUDEPATH += ../common + +win32 { +INCLUDEPATH += ../dependencies/poppler/include +LIBS += -L../dependencies/poppler/lib -lpoppler-qt4 +} + +unix:!macx{ +INCLUDEPATH += /usr/include/poppler/qt4 +LIBS += -L/usr/lib -lpoppler-qt4 +LIBS += -lGLU +} + +macx{ +INCLUDEPATH += "/Volumes/Mac OS X Lion/usr/X11/include" +INCLUDEPATH += /usr/local/include/poppler/qt4 +LIBS += -L/usr/local/lib -lpoppler-qt4 +} + QT += network webkit phonon opengl CONFIG += release CONFIG -= flat diff --git a/YACReader/comic.cpp b/YACReader/comic.cpp index 7cbd1dc5..090d4a4c 100644 --- a/YACReader/comic.cpp +++ b/YACReader/comic.cpp @@ -13,13 +13,13 @@ //----------------------------------------------------------------------------- Comic::Comic() -:_pages(),_index(0),_path(),_loaded(false),bm(new Bookmarks()),_loadedPages() +:_pages(),_index(0),_path(),_loaded(false),bm(new Bookmarks()),_loadedPages(),_isPDF(false) { setup(); } //----------------------------------------------------------------------------- Comic::Comic(const QString pathFile) -:_pages(),_index(0),_path(pathFile),_loaded(false),bm(new Bookmarks()),_loadedPages() +:_pages(),_index(0),_path(pathFile),_loaded(false),bm(new Bookmarks()),_loadedPages(),_isPDF(false) { setup(); loadFromFile(pathFile); @@ -50,7 +50,13 @@ bool Comic::load(const QString & path) if(fi.isFile()) { - loadFromFile(path); + if(fi.suffix().compare("pdf",Qt::CaseInsensitive) == 0) + { + _isPDF = true; + loadFromPDF(path); + } + else + loadFromFile(path); } else { @@ -87,43 +93,96 @@ void Comic::loadFromDir(const QString & pathDir) start(); } //----------------------------------------------------------------------------- +void Comic::loadFromPDF(const QString & pathPdf) +{ + _path = pathPdf; + start(); +} +//----------------------------------------------------------------------------- void Comic::run() { - QDir d(_pathDir); - QStringList l; - l EXTENSIONS; - d.setNameFilters(l); - d.setFilter(QDir::Files|QDir::NoDotAndDotDot); - //d.setSorting(QDir::Name|QDir::IgnoreCase|QDir::LocaleAware); - QFileInfoList list = d.entryInfoList(); - - qSort(list.begin(),list.end(),naturalSortLessThanCIFileInfo); - - int nPages = list.size(); - _pages.clear(); - _pages.resize(nPages); - _loadedPages = QVector(nPages,false); - if(nPages==0) + if(_isPDF) { - QMessageBox::critical(NULL,tr("No images found"),tr("There are not images on the selected folder")); - emit errorOpening(); + pdfComic = Poppler::Document::load(_path); + if (!pdfComic) + { + delete pdfComic; + pdfComic = 0; + QMessageBox::critical(NULL,tr("Bad PDF File"),tr("Invalid PDF file")); + emit errorOpening(); + return; + } + + //pdfComic->setRenderHint(Poppler::Document::Antialiasing, true); + pdfComic->setRenderHint(Poppler::Document::TextAntialiasing, true); + int nPages = pdfComic->numPages(); + emit pageChanged(0); // this indicates new comic, index=0 + emit numPages(nPages); + _loaded = true; + //QMessageBox::critical(NULL,QString("%1").arg(nPages),tr("Invalid PDF file")); + + _pages.clear(); + _pages.resize(nPages); + _loadedPages = QVector(nPages,false); + for(int i=0;ipage(i); + if (pdfpage) + { + QImage img = pdfpage->renderToImage(150,150); //TODO use defaults if not using X11 (e.g. MS Win) + delete pdfpage; + QByteArray ba; + QBuffer buf(&ba); + img.save(&buf, "jpg"); + _pages[i] = ba; + emit imageLoaded(i); + emit imageLoaded(i,_pages[i]); + + } + + } + delete pdfComic; + emit imagesLoaded(); } else { - emit pageChanged(0); // this indicates new comic, index=0 - emit numPages(_pages.size()); - _loaded = true; - - for(int i=0;i(nPages,false); + if(nPages==0) + { + QMessageBox::critical(NULL,tr("No images found"),tr("There are not images on the selected folder")); + emit errorOpening(); + } + else + { + emit pageChanged(0); // this indicates new comic, index=0 + emit numPages(_pages.size()); + _loaded = true; + + for(int i=0;i../images/flow1.png ../images/flow2.png ../images/flow3.png + ../images/flow4.png + ../images/flow5.png ../images/bookmark.png ../images/setBookmark.png ../images/notCover.png @@ -64,7 +66,8 @@ ../images/helpImages/mouse.png ../images/helpImages/speaker.png ../images/defaultCover.png - ../images/onStartFlowSelection.png + ../images/onStartFlowSelection.png + ../images/onStartFlowSelection_es.png ../images/useNewFlowButton.png ../images/useOldFlowButton.png diff --git a/YACReader/main_window_viewer.cpp b/YACReader/main_window_viewer.cpp index 8b834e94..5205b585 100644 --- a/YACReader/main_window_viewer.cpp +++ b/YACReader/main_window_viewer.cpp @@ -395,7 +395,7 @@ void MainWindowViewer::reloadOptions() void MainWindowViewer::open() { QFileDialog openDialog; - QString pathFile = openDialog.getOpenFileName(this,tr("Open Comic"),currentDirectory,tr("Comic files (*.cbr *.cbz *.rar *.zip *.tar *.arj)")); + QString pathFile = openDialog.getOpenFileName(this,tr("Open Comic"),currentDirectory,tr("Comic files (*.cbr *.cbz *.rar *.zip *.pdf *.tar *.arj)")); if (!pathFile.isEmpty()) { openComicFromPath(pathFile); diff --git a/YACReader/options_dialog.cpp b/YACReader/options_dialog.cpp index e19e26f9..1129d4fd 100644 --- a/YACReader/options_dialog.cpp +++ b/YACReader/options_dialog.cpp @@ -85,7 +85,7 @@ OptionsDialog::OptionsDialog(QWidget * parent) //restoreOptions(); //load options resize(400,0); setModal (true); - setWindowTitle("Options"); + setWindowTitle(tr("Options")); } void OptionsDialog::findFolder() diff --git a/YACReader/yacreader_es.qm b/YACReader/yacreader_es.qm index 2c4ce689..bcaa5a3a 100644 Binary files a/YACReader/yacreader_es.qm and b/YACReader/yacreader_es.qm differ diff --git a/YACReader/yacreader_es.ts b/YACReader/yacreader_es.ts index 7da06f15..446b8b51 100644 --- a/YACReader/yacreader_es.ts +++ b/YACReader/yacreader_es.ts @@ -28,85 +28,138 @@ Comic - + Not found No encontrado - + Comic not found Cómic no encontrado - + + Bad PDF File + Archivo PDF erróneo + + + + Invalid PDF file + Archivo PDF inválido + + + No images found No se han encontrado imágenes - + There are not images on the selected folder No hay imágenes en el directorio seleccionado - + File error Error en archivo - + File not found or not images in file Archivo no encontrado o no hay imágenes en él - + 7z not found 7z no encontrado - + 7z wasn't found in your PATH. 7z no se ha encontrado en el PATH. - + 7z crashed 7z falló - + 7z crashed. 7z falló. - + 7z reading 7z leyendo - + problem reading from 7z Problema leyendo desde 7z - + 7z problem 7z problema - + Unknown error 7z Error desconocido 7z + + Comic2 + + + 7z not found + 7z no encontrado + + + + 7z wasn't found in your PATH. + 7z no se ha encontrado en el PATH. + + + + 7z crashed + 7z falló + + + + 7z crashed. + 7z falló. + + + + 7z reading + 7z leyendo + + + + problem reading from 7z + Problema leyendo desde 7z + + + + 7z problem + 7z problema + + + + Unknown error 7z + Error desconocido 7z + + Configuration - + Saving config file.... Guardando el archivo de configuración... - + There was a problem saving YACReader configuration. Please, check if you have enough permissions in the YACReader root folder. Hubo un problema al guardar la configuración de YACReader. Por favor, comprueba si tienes suficientes permisos en el directorio raíz de YACReader. @@ -152,15 +205,23 @@ Page: + + GoToFlowGL + + + Page : + Página : + + HelpAboutDialog - + About Acerca de - + Help Ayuda @@ -168,294 +229,298 @@ MainWindowViewer - + &Open &Abrir - + O O - + Open a comic Abrir cómic - + Open Folder Abrir carpeta - + Ctrl+O Ctrl+O - + Open image folder Open images in a folder Abrir carpeta de imágenes - + Save Guardar - - + + Save current page Guardar la página actual - + Previous Comic Cómic anterior - + Open previous comic Abrir cómic anterior - + Next Comic Siguiente Cómic - + Open next comic Abrir siguiente cómic - + &Previous A&nterior - + Go to previous page Ir a la página anterior - + &Next Siguie&nte - + Go to next page Ir a la página siguiente - + Fit Width Ajustar anchura - + A A - + Fit image to ... Ajustar imagen a... - + Rotate image to the left Rotar imagen a la izquierda - + L L - + Rotate image to the right Rotar imagen a la derecha - + R R - + Double page mode Modo a doble página - + Switch to double page mode Cambiar a modo de doble página - + D D - + Go To Ir a - + G G - + Go to page ... Ir a página... - + Options Opciones - + C C - + YACReader options Opciones de YACReader - + Help Ayuda - + Help, About YACReader Ayuda, Sobre YACReader - + Magnifying glass Lupa - + Switch Magnifying glass Lupa On/Off - + Z Z - + Set bookmark Añadir marcador - + Set a bookmark on the current page Añadir un marcador en la página actual - + Show bookmarks Mostrar marcadores - + Show the bookmarks of the current comic Mostrar los marcadores del cómic actual - + M M - + Show keyboard shortcuts Mostrar atajos de teclado - + Show Info Mostrar información - + I I - + Close Cerrar - + Show Dictionary Mostrar diccionario - + Always on top Siempre visible - + Show full size Mostrar a tamaño original - + &File &Archivo - + Open Comic Abrir cómic - - Comic files (*.cbr *.cbz *.rar *.zip *.tar *.arj) - Archivos de cómic (*.cbr *.cbz *.rar *.zip *.tar *.arj) + + Comic files (*.cbr *.cbz *.rar *.zip *.pdf *.tar *.arj) + Archivos de cómic (*.cbr *.cbz *.rar *.zip *pdf *.tar *.arj) - + Comic files (*.cbr *.cbz *.rar *.zip *.tar *.arj) + Archivos de cómic (*.cbr *.cbz *.rar *.zip *.tar *.arj) + + + Open folder Abrir carpeta - + Image files (*.jpg) Archivos de imagen (*.jpg) - + There is a new version avaliable Hay una nueva versión disponible - + Do you want to download the new version? ¿Desea descargar la nueva versión? - + Saving error log file.... Guardando el archivo de log... - + There was a problem saving YACReader error log file. Please, check if you have enough permissions in the YACReader root folder. Hubo un problema al guardar el archivo de log de YACReader. Por favor, comprueba si tienes suficientes permisos en el directorio raíz de YACReader. @@ -473,58 +538,44 @@ Ruta a mis cómics - Save - Guardar + Guardar + + + Cancel + Cancelar + + + How to show pages in GoToFlow: + ¿Cómo deseas que se muestren las páginas en "Go To Flow": - Cancel - Cancelar - - - - How to show pages in GoToFlow: - ¿Cómo deseas que se muestren las páginas en "Go To Flow": - - - - CoverFlow look - - - - - Stripe look - - - - - Overlapped Stripe look - Overlaped Stripe look - - - - Page width stretch Ajuste en anchura de la página - + Background color Color de fondo - + Choose Elegir - + Restart is needed Es necesario reiniciar - + + Options + Opciones + + + Comics directory Directorio de cómics @@ -557,8 +608,8 @@ Viewer - - + + Press 'O' to open comic. Pulsa 'O' para abrir un fichero. @@ -571,7 +622,7 @@ I - + Loading...please wait! Cargando...espere, por favor! @@ -579,13 +630,13 @@ YACReaderFieldEdit - - + + Click to overwrite Click para sobreescribir - + Restore to default Restaurar valor por defecto @@ -593,17 +644,171 @@ YACReaderFieldPlainTextEdit - - - - + + + + Click to overwrite Click para sobreescribir - + Restore to default Restaurar valor por defecto + + YACReaderFlowConfigWidget + + + How to show covers: + Cómo mostrar las portadas: + + + + CoverFlow look + Tipo CoverFlow + + + + Stripe look + Tipo tira + + + + Overlapped Stripe look + Tipo tira solapada + + + + YACReaderGLFlowConfigWidget + + + Presets: + Predefinidos: + + + + Classic look + Tipo clásico + + + + Stripe look + Tipo tira + + + + Overlapped Stripe look + Tipo tira solapada + + + + Modern look + Tipo moderno + + + + Roulette look + Tipo ruleta + + + + Custom: + Personalizado: + + + + View angle + Ángulo de vista + + + + Position + Posición + + + + Cover gap + Hueco entre portadas + + + + Central gap + Hueco central + + + + Zoom + Zoom + + + + Y offset + Desplazamiento en Y + + + + Z offset + Desplazamiento en Z + + + + Cover Angle + Ángulo de las portadas + + + + Visibility + Visibilidad + + + + Light + Luz + + + + Max angle + Ángulo máximo + + + + Low Performance + Rendimiento bajo + + + + High Performance + Alto rendimiento + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Utilizar VSync (mejora la calidad de imagen en pantalla completa, peor rendimiento) + + + + Performance: + Rendimiento: + + + + YACReaderOptionsDialog + + + Save + Guardar + + + + Cancel + Cancelar + + + + Use hardware acceleration (restart needed) + Utilizar aceleración por hardware (necesario reiniciar) + + diff --git a/YACReader/yacreader_fr.ts b/YACReader/yacreader_fr.ts index b6ef6b92..cf843f25 100644 --- a/YACReader/yacreader_fr.ts +++ b/YACReader/yacreader_fr.ts @@ -28,72 +28,125 @@ Comic - + Not found - + Comic not found - + + Bad PDF File + + + + + Invalid PDF file + + + + No images found - + There are not images on the selected folder - + File error - + File not found or not images in file - + 7z not found - + 7z wasn't found in your PATH. - + 7z crashed - + 7z crashed. - + 7z reading - + problem reading from 7z - + 7z problem - + + Unknown error 7z + + + + + Comic2 + + + 7z not found + + + + + 7z wasn't found in your PATH. + + + + + 7z crashed + + + + + 7z crashed. + + + + + 7z reading + + + + + problem reading from 7z + + + + + 7z problem + + + + Unknown error 7z @@ -101,12 +154,12 @@ Configuration - + Saving config file.... - + There was a problem saving YACReader configuration. Please, check if you have enough permissions in the YACReader root folder. @@ -148,15 +201,23 @@ + + GoToFlowGL + + + Page : + + + HelpAboutDialog - + About - + Help @@ -164,293 +225,293 @@ MainWindowViewer - + &Open - + O - + Open a comic - + Open Folder - + Ctrl+O - + Open image folder - + Save - - + + Save current page - + Previous Comic - + Open previous comic - + Next Comic - + Open next comic - + &Previous - + Go to previous page - + &Next - + Go to next page - + Fit Width - + A - + Fit image to ... - + Rotate image to the left - + L - + Rotate image to the right - + R - + Double page mode - + Switch to double page mode - + D - + Go To - + G - + Go to page ... - + Options - + C - + YACReader options - + Help - + Help, About YACReader - + Magnifying glass - + Switch Magnifying glass - + Z - + Set bookmark - + Set a bookmark on the current page - + Show bookmarks - + Show the bookmarks of the current comic - + M - + Show keyboard shortcuts - + Show Info - + I - + Close - + Show Dictionary - + Always on top - + Show full size - + &File - + Open Comic - - Comic files (*.cbr *.cbz *.rar *.zip *.tar *.arj) + + Comic files (*.cbr *.cbz *.rar *.zip *.pdf *.tar *.arj) - + Open folder - + Image files (*.jpg) - + There is a new version avaliable - + Do you want to download the new version? - + Saving error log file.... - + There was a problem saving YACReader error log file. Please, check if you have enough permissions in the YACReader root folder. @@ -467,58 +528,33 @@ My comics path - - - Save - - - Cancel - - - - - How to show pages in GoToFlow: - - - - - CoverFlow look - - - - - Stripe look - - - - - Overlapped Stripe look - - - - Page width stretch - + Background color - + Choose - + Restart is needed - + + Options + + + + Comics directory @@ -544,13 +580,13 @@ Viewer - - + + Press 'O' to open comic. - + Loading...please wait! @@ -558,13 +594,13 @@ YACReaderFieldEdit - - + + Click to overwrite - + Restore to default @@ -572,17 +608,171 @@ YACReaderFieldPlainTextEdit - - - - + + + + Click to overwrite - + Restore to default + + YACReaderFlowConfigWidget + + + How to show covers: + + + + + CoverFlow look + + + + + Stripe look + + + + + Overlapped Stripe look + + + + + YACReaderGLFlowConfigWidget + + + Presets: + + + + + Classic look + + + + + Stripe look + + + + + Overlapped Stripe look + + + + + Modern look + + + + + Roulette look + + + + + Custom: + + + + + View angle + + + + + Position + + + + + Cover gap + + + + + Central gap + + + + + Zoom + + + + + Y offset + + + + + Z offset + + + + + Cover Angle + + + + + Visibility + + + + + Light + + + + + Max angle + + + + + Low Performance + + + + + High Performance + + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + + + + + Performance: + + + + + YACReaderOptionsDialog + + + Save + + + + + Cancel + + + + + Use hardware acceleration (restart needed) + + + diff --git a/YACReaderLibrary/YACReaderLibrary.pro b/YACReaderLibrary/YACReaderLibrary.pro index 16e133db..602784ec 100644 --- a/YACReaderLibrary/YACReaderLibrary.pro +++ b/YACReaderLibrary/YACReaderLibrary.pro @@ -9,11 +9,31 @@ INCLUDEPATH += . INCLUDEPATH += ../common \ ./server \ ./db \ - ../YACReader + ../YACReader + +win32 { +INCLUDEPATH += ../dependencies/poppler/include +LIBS += -L../dependencies/poppler/lib -lpoppler-qt4 +} + +unix:!macx{ +INCLUDEPATH += /usr/include/poppler/qt4 +LIBS += -L/usr/lib -lpoppler-qt4 +LIBS += -lGLU +} + +macx{ +INCLUDEPATH += "/Volumes/Mac OS X Lion/usr/X11/include" +INCLUDEPATH += /usr/local/include/poppler/qt4 +LIBS += -L/usr/local/lib -lpoppler-qt4 +} + CONFIG += release CONFIG -= flat QT += sql network opengl + + # Input HEADERS += comic_flow.h \ create_library_dialog.h \ diff --git a/YACReaderLibrary/db/data_base_management.cpp b/YACReaderLibrary/db/data_base_management.cpp index 6aefe958..ab69e6f3 100644 --- a/YACReaderLibrary/db/data_base_management.cpp +++ b/YACReaderLibrary/db/data_base_management.cpp @@ -218,7 +218,7 @@ void DataBaseManagement::exportComicsInfo(QString source, QString dest) queryComicsInfo.exec();*/ QSqlQuery query("INSERT INTO dest.db_info (version) " - "VALUES ('5.0.0')",destDB); + "VALUES ('"VERSION"')",destDB); //query.finish(); QSqlQuery exportData(destDB); @@ -536,6 +536,27 @@ int DataBaseManagement::compareVersions(const QString & v1, const QString v2) return 0; } +bool DataBaseManagement::updateToCurrentVersion(const QString & fullPath) +{ + QSqlDatabase db = loadDatabaseFromFile(fullPath); + bool returnValue = false; + if(db.isValid() && db.isOpen()) + { + QSqlQuery updateVersion(db); + updateVersion.prepare("UPDATE db_info SET " + "version = :version"); + updateVersion.bindValue(":version",VERSION); + updateVersion.exec(); + + if(updateVersion.numRowsAffected() > 0) + returnValue = true; + } + + db.close(); + QSqlDatabase::removeDatabase(fullPath); + return returnValue; +} + //COMICS_INFO_EXPORTER ComicsInfoExporter::ComicsInfoExporter() :QThread() diff --git a/YACReaderLibrary/db/data_base_management.h b/YACReaderLibrary/db/data_base_management.h index 470bc24c..f7a49dbb 100644 --- a/YACReaderLibrary/db/data_base_management.h +++ b/YACReaderLibrary/db/data_base_management.h @@ -53,6 +53,7 @@ public: static QString checkValidDB(const QString & fullPath); //retorna "" si la DB es invlida la versin si es vlida. static int compareVersions(const QString & v1, const QString v2); //retorna <0 si v1 < v2, 0 si v1 = v2 y >0 si v1 > v2 + static bool updateToCurrentVersion(const QString & path); }; #endif \ No newline at end of file diff --git a/YACReaderLibrary/images.qrc b/YACReaderLibrary/images.qrc index 70ad9bef..7eb7bc27 100644 --- a/YACReaderLibrary/images.qrc +++ b/YACReaderLibrary/images.qrc @@ -20,6 +20,8 @@ ../images/flow1.png ../images/flow2.png ../images/flow3.png + ../images/flow4.png + ../images/flow5.png ../images/importLibrary.png ../images/exportLibrary.png ../images/open.png @@ -42,6 +44,7 @@ ../images/iphoneConfig.png ../images/qrMessage.png ../images/onStartFlowSelection.png + ../images/onStartFlowSelection_es.png ../images/useNewFlowButton.png ../images/useOldFlowButton.png diff --git a/YACReaderLibrary/library_creator.cpp b/YACReaderLibrary/library_creator.cpp index 05ff1789..80f3d8e1 100644 --- a/YACReaderLibrary/library_creator.cpp +++ b/YACReaderLibrary/library_creator.cpp @@ -12,7 +12,7 @@ using namespace std; //QMutex mutex; - +#include "poppler-qt4.h" /*int numThreads = 0; @@ -25,7 +25,7 @@ QMutex mutex; LibraryCreator::LibraryCreator() :creation(false) { - _nameFilter << "*.cbr" << "*.cbz" << "*.rar" << "*.zip" << "*.tar"; + _nameFilter << "*.cbr" << "*.cbz" << "*.rar" << "*.zip" << "*.tar" << "*.pdf"; } void LibraryCreator::createLibrary(const QString &source, const QString &target) @@ -393,74 +393,25 @@ ThumbnailCreator::ThumbnailCreator(QString fileSource, QString target="", int co void ThumbnailCreator::create() { - _7z = new QProcess(); - QStringList attributes; - attributes << "l" << "-ssc-" << "-r" << _fileSource << "*.jpg" << "*.jpeg" << "*.png" << "*.gif" << "*.tiff" << "*.tif" << "*.bmp"; - //connect(_7z,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(loadFirstImage(void))); - connect(_7z,SIGNAL(error(QProcess::ProcessError)),this,SIGNAL(openingError(QProcess::ProcessError))); - _7z->start(QCoreApplication::applicationDirPath()+"/utils/7z",attributes); - _7z->waitForFinished(60000); - - QRegExp rx("[0-9]{4}-[0-9]{2}-[0-9]{2}[ ]+[0-9]{2}:[0-9]{2}:[0-9]{2}[ ]+.{5}[ ]+([0-9]+)[ ]+([0-9]+)[ ]+(.+)"); - - QString ba = QString::fromUtf8(_7z->readAllStandardOutput()); - QList lines = ba.split('\n'); - QString line; - _currentName = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"; //TODO - QString name; - if(_coverPage == 1) + QFileInfo fi(_fileSource); + if(fi.suffix().compare("pdf",Qt::CaseInsensitive) == 0) { - foreach(line,lines) + Poppler::Document * pdfComic = Poppler::Document::load(_fileSource); + if (!pdfComic) { - if(rx.indexIn(line)!=-1) - { - name = rx.cap(3).trimmed(); - if(naturalSortLessThanCI(name,_currentName)) - _currentName = name; - _numPages++; - } + delete pdfComic; + pdfComic = 0; + QImage p; + p.load(":/images/notCover.png"); + p.save(_target); + return; } - } - else - { - QList names; - foreach(line,lines) + _numPages = pdfComic->numPages(); + if(_numPages >= _coverPage) { - if(rx.indexIn(line)!=-1) - { - name = rx. cap(3).trimmed(); - names.append(name); - } - } - std::sort(names.begin(),names.end(),naturalSortLessThanCI); - _currentName = names[_coverPage-1]; - } - delete _7z; - attributes.clear(); - _currentName = QDir::fromNativeSeparators(_currentName).split('/').last(); //separator fixed. -#ifdef Q_WS_WIN - attributes << "e" << "-so" << "-r" << _fileSource << QString(_currentName.toLocal8Bit().constData()); //TODO platform dependency?? OEM 437 -#else - attributes << "e" << "-so" << "-r" << _fileSource << _currentName; //TODO platform dependency?? OEM 437 -#endif - _7z = new QProcess(); - connect(_7z,SIGNAL(error(QProcess::ProcessError)),this,SIGNAL(openingError(QProcess::ProcessError))); - //connect(_7z,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(writeThumbnail(void))); - _7z->start(QCoreApplication::applicationDirPath()+"/utils/7z",attributes); - _7z->waitForFinished(60000); - QByteArray image = _7z->readAllStandardOutput(); - QString error = _7z->readAllStandardError(); - QImage p; - if(_target=="") - { - if(!_cover.loadFromData(image)) - _cover.load(":/images/notCover.png"); - } - else - { - if(p.loadFromData(image)) - { + QImage p = pdfComic->page(_coverPage-1)->renderToImage(72,72); //TODO check if the the page is valid + _cover = QPixmap::fromImage(p); QImage scaled; if(p.width()>p.height()) //landscape?? scaled = p.scaledToWidth(640,Qt::SmoothTransformation); @@ -470,11 +421,97 @@ void ThumbnailCreator::create() } else { + QImage p; p.load(":/images/notCover.png"); p.save(_target); } } - delete _7z; + else + { + + _7z = new QProcess(); + QStringList attributes; + attributes << "l" << "-ssc-" << "-r" << _fileSource << "*.jpg" << "*.jpeg" << "*.png" << "*.gif" << "*.tiff" << "*.tif" << "*.bmp"; + //connect(_7z,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(loadFirstImage(void))); + connect(_7z,SIGNAL(error(QProcess::ProcessError)),this,SIGNAL(openingError(QProcess::ProcessError))); + _7z->start(QCoreApplication::applicationDirPath()+"/utils/7z",attributes); + _7z->waitForFinished(60000); + + QRegExp rx("[0-9]{4}-[0-9]{2}-[0-9]{2}[ ]+[0-9]{2}:[0-9]{2}:[0-9]{2}[ ]+.{5}[ ]+([0-9]+)[ ]+([0-9]+)[ ]+(.+)"); + + QString ba = QString::fromUtf8(_7z->readAllStandardOutput()); + QList lines = ba.split('\n'); + QString line; + _currentName = "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"; //TODO + QString name; + if(_coverPage == 1) + { + foreach(line,lines) + { + if(rx.indexIn(line)!=-1) + { + name = rx.cap(3).trimmed(); + if(naturalSortLessThanCI(name,_currentName)) + _currentName = name; + _numPages++; + } + } + } + else + { + QList names; + foreach(line,lines) + { + if(rx.indexIn(line)!=-1) + { + name = rx. cap(3).trimmed(); + names.append(name); + } + } + std::sort(names.begin(),names.end(),naturalSortLessThanCI); + _currentName = names[_coverPage-1]; + } + delete _7z; + attributes.clear(); + _currentName = QDir::fromNativeSeparators(_currentName).split('/').last(); //separator fixed. +#ifdef Q_WS_WIN + attributes << "e" << "-so" << "-r" << _fileSource << QString(_currentName.toLocal8Bit().constData()); //TODO platform dependency?? OEM 437 +#else + attributes << "e" << "-so" << "-r" << _fileSource << _currentName; //TODO platform dependency?? OEM 437 +#endif + _7z = new QProcess(); + connect(_7z,SIGNAL(error(QProcess::ProcessError)),this,SIGNAL(openingError(QProcess::ProcessError))); + //connect(_7z,SIGNAL(finished(int,QProcess::ExitStatus)),this,SLOT(writeThumbnail(void))); + _7z->start(QCoreApplication::applicationDirPath()+"/utils/7z",attributes); + _7z->waitForFinished(60000); + + QByteArray image = _7z->readAllStandardOutput(); + QString error = _7z->readAllStandardError(); + QImage p; + if(_target=="") + { + if(!_cover.loadFromData(image)) + _cover.load(":/images/notCover.png"); + } + else + { + if(p.loadFromData(image)) + { + QImage scaled; + if(p.width()>p.height()) //landscape?? + scaled = p.scaledToWidth(640,Qt::SmoothTransformation); + else + scaled = p.scaledToWidth(480,Qt::SmoothTransformation); + scaled.save(_target,0,75); + } + else + { + p.load(":/images/notCover.png"); + p.save(_target); + } + } + delete _7z; + } } /*void ThumbnailCreator::openingError(QProcess::ProcessError error) diff --git a/YACReaderLibrary/library_window.cpp b/YACReaderLibrary/library_window.cpp index 358a9a07..f7bc7c1e 100644 --- a/YACReaderLibrary/library_window.cpp +++ b/YACReaderLibrary/library_window.cpp @@ -81,7 +81,9 @@ void LibraryWindow::doLayout() QMatrix m; m.rotate(-90); m.scale(-1,1); - comicFlow->setMarkImage(QImage(":/images/setRead.png").transformed(m,Qt::SmoothTransformation)); + QImage image(":/images/setRead.png"); + image.transformed(m,Qt::SmoothTransformation); + comicFlow->setMarkImage(image); int heightDesktopResolution = QApplication::desktop()->screenGeometry().height(); int height,width; height = heightDesktopResolution*0.39; @@ -210,7 +212,10 @@ void LibraryWindow::doDialogs() addLibraryDialog = new AddLibraryDialog(this); optionsDialog = new OptionsDialog(this); optionsDialog->restoreOptions(settings); + +#ifdef SERVER_RELEASE serverConfigDialog = new ServerConfigDialog(this); +#endif had = new HelpAboutDialog(this); //TODO load data. QString sufix = QLocale::system().name(); @@ -511,7 +516,10 @@ void LibraryWindow::createToolBars() libraryToolBar->addAction(toggleFullScreenAction); libraryToolBar->addWidget(new QToolBarStretch()); + +#ifdef SERVER_RELEASE libraryToolBar->addAction(serverConfigAction); +#endif libraryToolBar->addAction(optionsAction); libraryToolBar->addAction(helpAboutAction); @@ -614,7 +622,9 @@ void LibraryWindow::createConnections() connect(colapseAllNodesAction,SIGNAL(triggered()),foldersView,SLOT(collapseAll())); connect(toggleFullScreenAction,SIGNAL(triggered()),this,SLOT(toggleFullScreen())); connect(optionsAction, SIGNAL(triggered()),optionsDialog,SLOT(show())); +#ifdef SERVER_RELEASE connect(serverConfigAction, SIGNAL(triggered()), serverConfigDialog, SLOT(show())); +#endif connect(optionsDialog, SIGNAL(optionsChanged()),this,SLOT(reloadOptions())); //ComicFlow connect(comicFlow,SIGNAL(selected(unsigned int)),this,SLOT(openComic())); @@ -648,8 +658,28 @@ void LibraryWindow::loadLibrary(const QString & name) QString dbVersion; if(d.exists(path) && (dbVersion = DataBaseManagement::checkValidDB(path+"/library.ydb")) != "") //si existe en disco la biblioteca seleccionada, y es vlida.. { - int comparation; - if((comparation = DataBaseManagement::compareVersions(dbVersion,VERSION)) == 0) //en caso de que la versin se igual que la actual + int comparation = DataBaseManagement::compareVersions(dbVersion,VERSION); + bool updated = false; + if(comparation < 0) + { + int ret = QMessageBox::question(this,tr("Update needed"),tr("This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now?"),QMessageBox::Yes,QMessageBox::No); + if(ret == QMessageBox::Yes) + { + //TODO update to new version + updated = DataBaseManagement::updateToCurrentVersion(path+"/library.ydb"); + if(!updated) + QMessageBox::critical(this,tr("Update failed"), tr("The current library can't be udpated. Check for write write permissions on: ") + path+"/library.ydb"); + } + else + { + comicView->setModel(NULL); + foldersView->setModel(NULL); + comicFlow->clear(); + disableAllActions();//TODO comprobar que se deben deshabilitar + } + } + + if(comparation == 0 || updated) //en caso de que la versin se igual que la actual { index = 0; sm->clear(); @@ -677,24 +707,8 @@ void LibraryWindow::loadLibrary(const QString & name) //includeComicsCheckBox->setCheckState(Qt::Unchecked); foldersFilter->clear(); } - else + else if(comparation > 0) { - if(comparation < 0) - { - int ret = QMessageBox::question(this,tr("Update needed"),tr("This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now?")); - if(ret == QMessageBox::Yes) - { - } - else - { - comicView->setModel(NULL); - foldersView->setModel(NULL); - comicFlow->clear(); - disableAllActions();//TODO comprobar que se deben deshabilitar - } - } - else - { int ret = QMessageBox::question(this,tr("Download new version"),tr("This library was created with a newer version of YACReaderLibrary. Download the new version now?"),QMessageBox::Yes,QMessageBox::No); if(ret == QMessageBox::Yes) QDesktopServices::openUrl(QUrl("http://www.yacreader.com")); @@ -703,8 +717,6 @@ void LibraryWindow::loadLibrary(const QString & name) foldersView->setModel(NULL); comicFlow->clear(); disableAllActions();//TODO comprobar que se deben deshabilitar - - } } } else diff --git a/YACReaderLibrary/main.cpp b/YACReaderLibrary/main.cpp index b10e5107..a922757c 100644 --- a/YACReaderLibrary/main.cpp +++ b/YACReaderLibrary/main.cpp @@ -18,8 +18,10 @@ int main( int argc, char ** argv ) app.installTranslator(&translator); app.setApplicationName("YACReaderLibrary"); +#ifdef SERVER_RELEASE s = new Startup(); s->start(); +#endif mw = new LibraryWindow(); mw->resize(800,480); diff --git a/YACReaderLibrary/options_dialog.cpp b/YACReaderLibrary/options_dialog.cpp index 3274c910..959f8550 100644 --- a/YACReaderLibrary/options_dialog.cpp +++ b/YACReaderLibrary/options_dialog.cpp @@ -42,7 +42,7 @@ OptionsDialog::OptionsDialog(QWidget * parent) //restoreOptions(settings); //load options //resize(200,0); setModal (true); - setWindowTitle("Options"); + setWindowTitle(tr("Options")); } diff --git a/YACReaderLibrary/server/lib/bfLogging/logmessage.cpp b/YACReaderLibrary/server/lib/bfLogging/logmessage.cpp index 59e4d8da..3c00b016 100644 --- a/YACReaderLibrary/server/lib/bfLogging/logmessage.cpp +++ b/YACReaderLibrary/server/lib/bfLogging/logmessage.cpp @@ -49,7 +49,7 @@ QString LogMessage::toString(const QString& msgFormat, const QString& timestampF } QString threadId; - threadId.setNum((unsigned int)QThread::currentThreadId()); + threadId.setNum((quint64)QThread::currentThreadId()); //CAMBIADo unsigned int por quint64, evita error de compilacin en mquinas de 64bit decorated.replace("{thread}",threadId); // Fill in variables diff --git a/YACReaderLibrary/yacreaderlibrary_es.qm b/YACReaderLibrary/yacreaderlibrary_es.qm index b1800b42..19156329 100644 Binary files a/YACReaderLibrary/yacreaderlibrary_es.qm and b/YACReaderLibrary/yacreaderlibrary_es.qm differ diff --git a/YACReaderLibrary/yacreaderlibrary_es.ts b/YACReaderLibrary/yacreaderlibrary_es.ts index 66996c6f..56397684 100644 --- a/YACReaderLibrary/yacreaderlibrary_es.ts +++ b/YACReaderLibrary/yacreaderlibrary_es.ts @@ -29,6 +29,132 @@ Añadir una biblioteca existente + + Comic + + + Not found + + + + + Comic not found + + + + + Bad PDF File + + + + + Invalid PDF file + + + + + No images found + + + + + There are not images on the selected folder + + + + + File error + + + + + File not found or not images in file + + + + + 7z not found + 7z no encontrado + + + + 7z wasn't found in your PATH. + 7z no ha sido encontrado en tu PATH. + + + + 7z crashed + fallo en 7z + + + + 7z crashed. + fallo en 7z. + + + + 7z reading + Leyendo de 7z + + + + problem reading from 7z + Problema lenyendo de 7z + + + + 7z problem + Problema en 7z + + + + Unknown error 7z + Error desconocido en 7z + + + + Comic2 + + + 7z not found + 7z no encontrado + + + + 7z wasn't found in your PATH. + 7z no ha sido encontrado en tu PATH. + + + + 7z crashed + fallo en 7z + + + + 7z crashed. + fallo en 7z. + + + + 7z reading + Leyendo de 7z + + + + problem reading from 7z + Problema lenyendo de 7z + + + + 7z problem + Problema en 7z + + + + Unknown error 7z + Error desconocido en 7z + + CreateLibraryDialog @@ -161,12 +287,12 @@ HelpAboutDialog - + About Acerca de - + Help Ayuda @@ -252,322 +378,347 @@ LibraryWindow - + Select a library: Seleciona una biblioteca: - + Clear Borrar - + Search folders/comics Buscar directorios/cómics - + Include files (slower) Incluir archivos (lento) - + <font color='white'> press 'F' to close fullscreen mode </font> <font color='white'> presiona 'F' para salir de pantalla completa </font> - + YACReader Library YACReader Library - + Create a new library Crear una nueva biblioteca - + Open an existing library Abrir una biblioteca existente - - + + Export comics info Exportar información de los cómics - - + + Import comics info Importar información de cómics - + Pack covers Empaquetar portadas - + Pack the covers of the selected library Empaquetar las portadas de la biblioteca seleccionada - + Unpack covers Desempaquetar portadas - + Unpack a catalog Desempaquetar un catálogo - + Update current library Actualizar la biblioteca seleccionada - + Rename current library Renombrar la biblioteca seleccionada - + Delete current library from disk Borrar la biblioteca seleccionada del disco - + Remove current library from your collection Eliminar biblioteca de la colección - + + Open current comic + Abrir cómic actual + + + Open current comic on YACReader Abrir el cómic actual en YACReader - + Set as read Marcar como leído - + Set comic as read Marcar cómic como leído - + Set as unread Marcar como no leído - + Set comic as unread Marcar cómic como no leído - + Set all as read Marcar todos como leídos - + Set all comics as read Marcar todos los cómics como leídos - + Set all as unread Marcar todos como no leídos - + Set all comics as unread Marcar todos los cómics como no leídos - + Show/Hide marks Mostrar/Ocultar marcas - + Show or hide readed marks Mostrar u ocultar marcas - + Show properties of current comic Mostrar las propiedades del cómic actual - + + Fullscreen mode on/off + Modo a pantalla completa on/off + + + Fullscreen mode on/off (F) Activar/desactivar modo a pantalla completa (F) - + Help, About YACReader Ayuda, A cerca de... YACReader - + Select root node Seleccionar el nodo raíz - + Expand all nodes Expandir todos los nodos - + Colapse all nodes Contraer todos los nodos - + Show options dialog Mostrar opciones - + + Show comics server options dialog + + + + Open folder... Abrir carpeta... - + Open containing folder... Abrir carpeta contenedora... - + Select all comics Seleccionar todos los cómics - + Edit Editar - + Asign current order to comics Asignar el orden actual a los cómics - + Update cover Actualizar portada - + Hide comic flow Ocultar cómic flow - + Library Librería - + Update needed Se necesita actualizar - + This library was created with a previous version of YACReaderLibrary. It needs to be updated. Update now? Esta biblioteca fue creada con una versión anterior de YACReaderLibrary. Es necesario que se actualice. ¿Deseas hacerlo ahora? - + + Update failed + La actualización ha fallado + + + + The current library can't be udpated. Check for write write permissions on: + La librería actual no ha podido ser actualizada. Verifica que posees permisos de escritura en: + + + Download new version Descargar la nueva versión - + This library was created with a newer version of YACReaderLibrary. Download the new version now? Esta biblioteca fue creada con una versión más nueva de YACReaderLibrary. ¿Deseas descargar la nueva versión ahora? - + Library not available Biblioteca no disponible - - + + Library La biblioteca - + is no longer available. Do you want to remove it? ya no esta disponible. ¿Deseas borrarla? - + Old library or corrupted Biblioteca antigua o corrupta - + is corrupted or has been created with an older version of YACReaderLibrary. It must be created again. Do you want to create the library now? está corrupta o ha sido creada con una versión antigua de YACReaderLibrary, por lo que debe ser creada de nuevo. ¿Deseas volver a crearla ahora? - + Library not found Biblioteca no encontrada - + The selected folder doesn't contain any library. La carpeta seleccionada no contiene ninguna biblioteca. - + Saving libraries file.... Guardando bibliotecas... - + There was a problem saving YACReaderLibrary libraries file. Please, check if you have enough permissions in the YACReader root folder. Hubo un problema al guardar las bibliotecas de YACReaderLibrary. Por favor, comprueba si tienes suficientes permisos en el directorio raíz de YACReader. - - + + Are you sure? ¿Estás seguro? - + Do you want delete ¿Deseas borrar - + Do you want remove ¿Deseas eliminar - + library? Files won't be erased from disk. ? Los archivos no serán borrados del disco. - + Asign comics numbers Asignar números de cómic - + Asign numbers starting in: Asignar números empezando en: @@ -575,54 +726,37 @@ Files won't be erased from disk. OptionsDialog - Save - Guardar + Guardar - Cancel - Cancelar + Cancelar - How to show covers: - Cómo mostrar las portadas: - - - - CoverFlow look - - - - - Stripe look - - - - - Overlapped Stripe look - Overlaped Stripe look - + Cómo mostrar las portadas: Restart is needed Es necesario reiniciar - Comics directory - Directorio de cómics + Directorio de cómics - Saving config file.... - Guardando archivo de configuración... + Guardando archivo de configuración... - There was a problem saving YACReaderLibrary configuration. Please, check if you have enough permissions in the YACReader root folder. - Hubo un problema al guardar la configuración de YACReaderLibrary. Por favor, comprueba si tienes suficientes permisos en el directorio raíz de YACReader. + Hubo un problema al guardar la configuración de YACReaderLibrary. Por favor, comprueba si tienes suficientes permisos en el directorio raíz de YACReader. + + + + Options + Opciones @@ -706,7 +840,7 @@ Files won't be erased from disk. Writer(s): - Guionista(s): + Guionista(s): @@ -716,7 +850,7 @@ Files won't be erased from disk. Inker(s): - Entintador(es): + Entintador(es): @@ -725,8 +859,9 @@ Files won't be erased from disk. - Letterer(es): - + Letterer(s): + Letterer(es): + Rotulista(s): @@ -824,6 +959,29 @@ Files won't be erased from disk. Renombrar la biblioteca seleccionada + + ServerConfigDialog + + + Generar + + + + + IP + + + + + Port + + + + + QR generator error! + + + TableModel @@ -898,13 +1056,13 @@ Files won't be erased from disk. YACReaderFieldEdit - - + + Click to overwrite Click para sobreescribir - + Restore to default Restaurar valor por defecto @@ -912,17 +1070,171 @@ Files won't be erased from disk. YACReaderFieldPlainTextEdit - - - - + + + + Click to overwrite Click para sobreescribir - + Restore to default Restaurar valor por defecto + + YACReaderFlowConfigWidget + + + How to show covers: + Cómo mostrar las portadas: + + + + CoverFlow look + Tipo CoverFlow + + + + Stripe look + Tipo tira + + + + Overlapped Stripe look + Tipo tira solapada + + + + YACReaderGLFlowConfigWidget + + + Presets: + Predeterminados: + + + + Classic look + Tipo clásico + + + + Stripe look + Tipo tira + + + + Overlapped Stripe look + Tipo tira solapada + + + + Modern look + Tipo moderno + + + + Roulette look + Tipo ruleta + + + + Custom: + Personalizado: + + + + View angle + Ángulo de vista + + + + Position + Posición + + + + Cover gap + Hueco entre portadas + + + + Central gap + Hueco central + + + + Zoom + Zoom + + + + Y offset + Desplazamiento en Y + + + + Z offset + Desplazamiento en Z + + + + Cover Angle + Ángulo de las portadas + + + + Visibility + Visibilidad + + + + Light + Luz + + + + Max angle + Ángulo máximo + + + + Low Performance + Rendimiento bajo + + + + High Performance + Alto rendimiento + + + + Use VSync (improve the image quality in fullscreen mode, worse performance) + Usar VSync (mejora la calidad de imagen en pantalla completa, peor rendimiento) + + + + Performance: + Rendimiento: + + + + YACReaderOptionsDialog + + + Save + Guardar + + + + Cancel + Cancelar + + + + Use hardware acceleration (restart needed) + Usar aceleración por hardware (necesario reiniciar) + + diff --git a/common/check_new_version.cpp b/common/check_new_version.cpp index af586246..744bada7 100644 --- a/common/check_new_version.cpp +++ b/common/check_new_version.cpp @@ -4,7 +4,7 @@ #include #include -#define PREVIOUS_VERSION "0.4.5" +#define PREVIOUS_VERSION "5.0.0" HttpVersionChecker::HttpVersionChecker() :QWidget() diff --git a/common/custom_widgets.cpp b/common/custom_widgets.cpp index 6f746835..e0ef8b74 100644 --- a/common/custom_widgets.cpp +++ b/common/custom_widgets.cpp @@ -516,7 +516,7 @@ YACReaderSpinSliderWidget::YACReaderSpinSliderWidget(QWidget * parent) :QWidget(parent) { QHBoxLayout * layout = new QHBoxLayout; - layout->addWidget(label = new QLabel(this)); + layout->addWidget(label = new QLabel(this),1); layout->addStretch(); spinBox = new QSpinBox(this); layout->addWidget(spinBox); @@ -561,7 +561,7 @@ int YACReaderSpinSliderWidget::getValue() QSize YACReaderSpinSliderWidget::minimumSizeHint() const { - return QSize(220, 25); + return QSize(270, 25); } ////////////////////////////////////////////////////////////////////////// @@ -602,39 +602,39 @@ YACReaderOptionsDialog::YACReaderOptionsDialog(QWidget * parent) connect(gl->radionModern,SIGNAL(toggled(bool)),this,SIGNAL(optionsChanged())); connect(gl->radioDown,SIGNAL(toggled(bool)),this,SIGNAL(optionsChanged())); - connect(gl->xRotation,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); connect(gl->xRotation,SIGNAL(valueChanged(int)),this,SLOT(saveXRotation(int))); - - connect(gl->yPosition,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->xRotation,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->yPosition,SIGNAL(valueChanged(int)),this,SLOT(saveYPosition(int))); - - connect(gl->coverDistance,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->yPosition,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->coverDistance,SIGNAL(valueChanged(int)),this,SLOT(saveCoverDistance(int))); - - connect(gl->centralDistance,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->coverDistance,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->centralDistance,SIGNAL(valueChanged(int)),this,SLOT(saveCentralDistance(int))); - - connect(gl->zoomLevel,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->centralDistance,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->zoomLevel,SIGNAL(valueChanged(int)),this,SLOT(saveZoomLevel(int))); - - connect(gl->yCoverOffset,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->zoomLevel,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->yCoverOffset,SIGNAL(valueChanged(int)),this,SLOT(saveYCoverOffset(int))); - - connect(gl->zCoverOffset,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->yCoverOffset,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->zCoverOffset,SIGNAL(valueChanged(int)),this,SLOT(saveZCoverOffset(int))); - - connect(gl->coverRotation,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->zCoverOffset,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->coverRotation,SIGNAL(valueChanged(int)),this,SLOT(saveCoverRotation(int))); - - connect(gl->fadeOutDist,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->coverRotation,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->fadeOutDist,SIGNAL(valueChanged(int)),this,SLOT(saveFadeOutDist(int))); - - connect(gl->lightStrength,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->fadeOutDist,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->lightStrength,SIGNAL(valueChanged(int)),this,SLOT(saveLightStrength(int))); - - connect(gl->maxAngle,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->lightStrength,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->maxAngle,SIGNAL(valueChanged(int)),this,SLOT(saveMaxAngle(int))); - + connect(gl->maxAngle,SIGNAL(valueChanged(int)),this,SIGNAL(optionsChanged())); + connect(gl->performanceSlider, SIGNAL(valueChanged(int)),this,SLOT(savePerformance(int))); connect(gl->performanceSlider, SIGNAL(valueChanged(int)),this,SLOT(optionsChanged())); @@ -981,7 +981,7 @@ YACReaderGLFlowConfigWidget::YACReaderGLFlowConfigWidget(QWidget * parent /* = 0 QHBoxLayout * opt4 = new QHBoxLayout; opt4->addWidget(radionModern); QLabel * lOpt4 = new QLabel(); - lOpt4->setPixmap(QPixmap(":/images/flow3.png")); + lOpt4->setPixmap(QPixmap(":/images/flow4.png")); opt4->addStretch(); opt4->addWidget(lOpt4); vbox->addLayout(opt4); @@ -989,7 +989,7 @@ YACReaderGLFlowConfigWidget::YACReaderGLFlowConfigWidget(QWidget * parent /* = 0 QHBoxLayout * opt5 = new QHBoxLayout; opt5->addWidget(radioDown); QLabel * lOpt5 = new QLabel(); - lOpt5->setPixmap(QPixmap(":/images/flow3.png")); + lOpt5->setPixmap(QPixmap(":/images/flow5.png")); opt5->addStretch(); opt5->addWidget(lOpt5); vbox->addLayout(opt5); diff --git a/common/onstart_flow_selection_dialog.cpp b/common/onstart_flow_selection_dialog.cpp index b37c9b31..9f92feae 100644 --- a/common/onstart_flow_selection_dialog.cpp +++ b/common/onstart_flow_selection_dialog.cpp @@ -2,6 +2,7 @@ #include #include +#include OnStartFlowSelectionDialog::OnStartFlowSelectionDialog(QWidget * parent) :QDialog(parent) @@ -20,17 +21,30 @@ OnStartFlowSelectionDialog::OnStartFlowSelectionDialog(QWidget * parent) rejectHW->setAutoFillBackground(true); QPalette paletteHW; - paletteHW.setBrush(acceptHW->backgroundRole(), QBrush(QImage(":/images/useNewFlowButton.png"))); + QLocale locale = this->locale(); + QLocale::Language language = locale.language(); + + /*if(language == QLocale::Spanish) + paletteHW.setBrush(acceptHW->backgroundRole(), QBrush(QImage(":/images/useNewFlowButton_es.png"))); + else + paletteHW.setBrush(acceptHW->backgroundRole(), QBrush(QImage(":/images/useNewFlowButton.png")));*/ + + + paletteHW.setBrush(acceptHW->backgroundRole(), QBrush(QImage(":/images/nonexxx.png"))); acceptHW->setPalette(paletteHW); QPalette paletteSW; - paletteSW.setBrush(rejectHW->backgroundRole(), QBrush(QImage(":/images/useOldFlowButton.png"))); + paletteSW.setBrush(rejectHW->backgroundRole(), QBrush(QImage(":/images/nonexxx.png"))); rejectHW->setPalette(paletteSW); //QHBoxLayout * layout = new QHBoxLayout; //layout->addWidget(acceptHW); //layout->addWidget(rejectHW); QPalette palette; - palette.setBrush(this->backgroundRole(), QBrush(QImage(":/images/onStartFlowSelection.png"))); + if(language == QLocale::Spanish) + palette.setBrush(this->backgroundRole(), QBrush(QImage(":/images/onStartFlowSelection_es.png"))); + else + palette.setBrush(this->backgroundRole(), QBrush(QImage(":/images/onStartFlowSelection.png"))); + setPalette(palette); diff --git a/common/yacreader_flow_gl.cpp b/common/yacreader_flow_gl.cpp index 0066d0eb..1e3a276f 100644 --- a/common/yacreader_flow_gl.cpp +++ b/common/yacreader_flow_gl.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include #include diff --git a/common/yacreader_global.h b/common/yacreader_global.h index b10e60af..a7ab9ba6 100644 --- a/common/yacreader_global.h +++ b/common/yacreader_global.h @@ -1,7 +1,7 @@ #ifndef __YACREADER_GLOBAL_H #define __YACREADER_GLOBAL_H -#define VERSION "5.0.0" +#define VERSION "5.5.0" #define PATH "PATH" #define MAG_GLASS_SIZE "MAG_GLASS_SIZE" diff --git a/dependencies/poppler/bin/poppler-qt4.dll b/dependencies/poppler/bin/poppler-qt4.dll new file mode 100644 index 00000000..f5b21d16 Binary files /dev/null and b/dependencies/poppler/bin/poppler-qt4.dll differ diff --git a/dependencies/poppler/bin/poppler-qt4.dll.manifest b/dependencies/poppler/bin/poppler-qt4.dll.manifest new file mode 100644 index 00000000..e693382a --- /dev/null +++ b/dependencies/poppler/bin/poppler-qt4.dll.manifest @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/dependencies/poppler/dependencies/bin/freetype6.dll b/dependencies/poppler/dependencies/bin/freetype6.dll new file mode 100644 index 00000000..632b2a40 Binary files /dev/null and b/dependencies/poppler/dependencies/bin/freetype6.dll differ diff --git a/dependencies/poppler/dependencies/bin/freetype6.dll.manifest b/dependencies/poppler/dependencies/bin/freetype6.dll.manifest new file mode 100644 index 00000000..e693382a --- /dev/null +++ b/dependencies/poppler/dependencies/bin/freetype6.dll.manifest @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/dependencies/poppler/dependencies/bin/openjpeg.dll b/dependencies/poppler/dependencies/bin/openjpeg.dll new file mode 100644 index 00000000..bdd8f57e Binary files /dev/null and b/dependencies/poppler/dependencies/bin/openjpeg.dll differ diff --git a/dependencies/poppler/dependencies/bin/openjpeg.dll.manifest b/dependencies/poppler/dependencies/bin/openjpeg.dll.manifest new file mode 100644 index 00000000..e693382a --- /dev/null +++ b/dependencies/poppler/dependencies/bin/openjpeg.dll.manifest @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/dependencies/poppler/dependencies/lib/VACO.txt b/dependencies/poppler/dependencies/lib/VACO.txt new file mode 100644 index 00000000..e69de29b diff --git a/dependencies/poppler/include/poppler-annotation-helper.h b/dependencies/poppler/include/poppler-annotation-helper.h new file mode 100644 index 00000000..5f335c04 --- /dev/null +++ b/dependencies/poppler/include/poppler-annotation-helper.h @@ -0,0 +1,198 @@ +/* poppler-annotation-helper.h: qt interface to poppler + * Copyright (C) 2006, 2008, Albert Astals Cid + * Copyright (C) 2008, Pino Toscano + * Copyright (C) 2012, Fabio D'Urso + * Adapting code from + * Copyright (C) 2004 by Enrico Ros + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include + +#include + +class QColor; + +class AnnotColor; + +namespace Poppler { + +class XPDFReader +{ + public: + // find named symbol and parse it + static inline void lookupName( Dict *, char *, QString & dest ); + static inline void lookupString( Dict *, char *, QString & dest ); + static inline void lookupBool( Dict *, char *, bool & dest ); + static inline void lookupInt( Dict *, char *, int & dest ); + static inline void lookupNum( Dict *, char *, double & dest ); + static inline int lookupNumArray( Dict *, char *, double * dest, int len ); + static inline void lookupColor( Dict *, char *, QColor & color ); + static inline void lookupIntRef( Dict *, char *, int & dest ); + static inline void lookupDate( Dict *, char *, QDateTime & dest ); + // transform from user coords to normalized ones using the matrix M + static inline void transform( double * M, double x, double y, QPointF &res ); + static inline void invTransform( double * M, const QPointF &p, double &x, double &y ); +}; + +void XPDFReader::lookupName( Dict * dict, char * type, QString & dest ) +{ + Object nameObj; + dict->lookup( type, &nameObj ); + if ( nameObj.isNull() ) + return; + if ( nameObj.isName() ) + dest = nameObj.getName(); + else + qDebug() << type << " is not Name." << endl; + nameObj.free(); +} + +void XPDFReader::lookupString( Dict * dict, char * type, QString & dest ) +{ + Object stringObj; + dict->lookup( type, &stringObj ); + if ( stringObj.isNull() ) + return; + if ( stringObj.isString() ) + dest = stringObj.getString()->getCString(); + else + qDebug() << type << " is not String." << endl; + stringObj.free(); +} + +void XPDFReader::lookupBool( Dict * dict, char * type, bool & dest ) +{ + Object boolObj; + dict->lookup( type, &boolObj ); + if ( boolObj.isNull() ) + return; + if ( boolObj.isBool() ) + dest = boolObj.getBool() == gTrue; + else + qDebug() << type << " is not Bool." << endl; + boolObj.free(); +} + +void XPDFReader::lookupInt( Dict * dict, char * type, int & dest ) +{ + Object intObj; + dict->lookup( type, &intObj ); + if ( intObj.isNull() ) + return; + if ( intObj.isInt() ) + dest = intObj.getInt(); + else + qDebug() << type << " is not Int." << endl; + intObj.free(); +} + +void XPDFReader::lookupNum( Dict * dict, char * type, double & dest ) +{ + Object numObj; + dict->lookup( type, &numObj ); + if ( numObj.isNull() ) + return; + if ( numObj.isNum() ) + dest = numObj.getNum(); + else + qDebug() << type << " is not Num." << endl; + numObj.free(); +} + +int XPDFReader::lookupNumArray( Dict * dict, char * type, double * dest, int len ) +{ + Object arrObj; + dict->lookup( type, &arrObj ); + if ( arrObj.isNull() ) + return 0; + Object numObj; + if ( arrObj.isArray() ) + { + len = qMin( len, arrObj.arrayGetLength() ); + for ( int i = 0; i < len; i++ ) + { + dest[i] = arrObj.arrayGet( i, &numObj )->getNum(); + numObj.free(); + } + } + else + { + len = 0; + qDebug() << type << "is not Array." << endl; + } + arrObj.free(); + return len; +} + +void XPDFReader::lookupColor( Dict * dict, char * type, QColor & dest ) +{ + double c[3]; + if ( XPDFReader::lookupNumArray( dict, type, c, 3 ) == 3 ) + dest = QColor( (int)(c[0]*255.0), (int)(c[1]*255.0), (int)(c[2]*255.0)); +} + +void XPDFReader::lookupIntRef( Dict * dict, char * type, int & dest ) +{ + Object refObj; + dict->lookupNF( type, &refObj ); + if ( refObj.isNull() ) + return; + if ( refObj.isRef() ) + dest = refObj.getRefNum(); + else + qDebug() << type << " is not Ref." << endl; + refObj.free(); +} + +void XPDFReader::lookupDate( Dict * dict, char * type, QDateTime & dest ) +{ + Object dateObj; + dict->lookup( type, &dateObj ); + if ( dateObj.isNull() ) + return; + if ( dateObj.isString() ) + { + dest = convertDate( dateObj.getString()->getCString() ); + } + else + qDebug() << type << " is not Date" << endl; + dateObj.free(); +} + +void XPDFReader::transform( double * M, double x, double y, QPointF &res ) +{ + res.setX( M[0] * x + M[2] * y + M[4] ); + res.setY( M[1] * x + M[3] * y + M[5] ); +} + +void XPDFReader::invTransform( double * M, const QPointF &p, double &x, double &y ) +{ + const double det = M[0]*M[3] - M[1]*M[2]; + Q_ASSERT(det != 0); + + const double invM[4] = { M[3]/det, -M[1]/det, -M[2]/det, M[0]/det }; + const double xt = p.x() - M[4]; + const double yt = p.y() - M[5]; + + x = invM[0] * xt + invM[2] * yt; + y = invM[1] * xt + invM[3] * yt; +} + +QColor convertAnnotColor( AnnotColor *color ); +AnnotColor* convertQColor( const QColor &color ); + +} diff --git a/dependencies/poppler/include/poppler-annotation-private.h b/dependencies/poppler/include/poppler-annotation-private.h new file mode 100644 index 00000000..3bfb5daf --- /dev/null +++ b/dependencies/poppler/include/poppler-annotation-private.h @@ -0,0 +1,111 @@ +/* poppler-annotation-private.h: qt interface to poppler + * Copyright (C) 2007, Pino Toscano + * Copyright (C) 2012, Tobias Koenig + * Copyright (C) 2012, Fabio D'Urso + * Copyright (C) 2012, Albert Astals Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_ANNOTATION_PRIVATE_H_ +#define _POPPLER_ANNOTATION_PRIVATE_H_ + +#include +#include +#include + +#include "poppler-annotation.h" + +#include + +class Annot; +class AnnotPath; +class Link; +class Page; +class PDFRectangle; + +namespace Poppler +{ +class DocumentData; + +class AnnotationPrivate : public QSharedData +{ + public: + AnnotationPrivate(); + virtual ~AnnotationPrivate(); + + void addRevision(Annotation *ann, Annotation::RevScope scope, Annotation::RevType type); + + /* Returns an Annotation of the right subclass whose d_ptr points to + * this AnnotationPrivate */ + virtual Annotation * makeAlias() = 0; + + /* properties: contents related */ + QString author; + QString contents; + QString uniqueName; + QDateTime modDate; // before or equal to currentDateTime() + QDateTime creationDate; // before or equal to modifyDate + + /* properties: look/interaction related */ + int flags; + QRectF boundary; + + /* style and popup */ + Annotation::Style style; + Annotation::Popup popup; + + /* revisions */ + Annotation::RevScope revisionScope; + Annotation::RevType revisionType; + QList revisions; + + /* After this call, the Annotation object will behave like a wrapper for + * the specified Annot object. All cached values are discarded */ + void tieToNativeAnnot(Annot *ann, ::Page *page, DocumentData *doc); + + /* Creates a new Annot object on the specified page, flushes current + * values to that object and ties this Annotation to that object */ + virtual Annot* createNativeAnnot(::Page *destPage, DocumentData *doc) = 0; + + /* Inited to 0 (i.e. untied annotation) */ + Annot *pdfAnnot; + ::Page *pdfPage; + DocumentData * parentDoc; + + /* The following helpers only work if pdfPage is set */ + void flushBaseAnnotationProperties(); + void fillMTX(double MTX[6]) const; + QRectF fromPdfRectangle(const PDFRectangle &r) const; + PDFRectangle toPdfRectangle(const QRectF &r) const; + AnnotPath * toAnnotPath(const QLinkedList &l) const; + + /* Scan page for annotations, parentId=0 searches for root annotations */ + static QList findAnnotations(::Page *pdfPage, DocumentData *doc, int parentId = 0); + + /* Add given annotation to given page */ + static void addAnnotationToPage(::Page *pdfPage, DocumentData *doc, const Annotation * ann); + + /* Remove annotation from page and destroy ann */ + static void removeAnnotationFromPage(::Page *pdfPage, const Annotation * ann); + + Ref pdfObjectReference() const; + + Link* additionalAction( Annotation::AdditionalActionType type ) const; +}; + +} + +#endif diff --git a/dependencies/poppler/include/poppler-annotation.h b/dependencies/poppler/include/poppler-annotation.h new file mode 100644 index 00000000..9208ca7a --- /dev/null +++ b/dependencies/poppler/include/poppler-annotation.h @@ -0,0 +1,920 @@ +/* poppler-annotation.h: qt interface to poppler + * Copyright (C) 2006-2008, 2012 Albert Astals Cid + * Copyright (C) 2006, 2008 Pino Toscano + * Copyright (C) 2007, Brad Hards + * Copyright (C) 2010, Philip Lorenz + * Copyright (C) 2012, Tobias Koenig + * Copyright (C) 2012, Guillermo A. Amaral B. + * Copyright (C) 2012, Fabio D'Urso + * Adapting code from + * Copyright (C) 2004 by Enrico Ros + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_ANNOTATION_H_ +#define _POPPLER_ANNOTATION_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "poppler-export.h" + +namespace Poppler { + +class Annotation; +class AnnotationPrivate; +class TextAnnotationPrivate; +class LineAnnotationPrivate; +class GeomAnnotationPrivate; +class HighlightAnnotationPrivate; +class StampAnnotationPrivate; +class InkAnnotationPrivate; +class LinkAnnotationPrivate; +class CaretAnnotationPrivate; +class FileAttachmentAnnotationPrivate; +class SoundAnnotationPrivate; +class MovieAnnotationPrivate; +class ScreenAnnotationPrivate; +class WidgetAnnotationPrivate; +class EmbeddedFile; +class Link; +class SoundObject; +class MovieObject; +class LinkRendition; +class Page; + +/** + * \short Helper class for (recursive) Annotation retrieval/storage. + * + */ +class POPPLER_QT4_EXPORT AnnotationUtils +{ + public: + /** + * Restore an Annotation (with revisions if needed) from the DOM + * element \p annElement. + * \returns a pointer to the complete Annotation or 0 if element is + * invalid. + */ + static Annotation * createAnnotation( const QDomElement & annElement ); + + /** + * Save the Annotation \p ann as a child of \p annElement taking + * care of saving all revisions if \p ann has any. + */ + static void storeAnnotation( const Annotation * ann, + QDomElement & annElement, QDomDocument & document ); + + /** + * Returns an element called \p name from the direct children of + * \p parentNode or a null element if not found. + */ + static QDomElement findChildElement( const QDomNode & parentNode, + const QString & name ); +}; + + +/** + * \short Annotation class holding properties shared by all annotations. + * + * An Annotation is an object (text note, highlight, sound, popup window, ..) + * contained by a Page in the document. + * + * \warning Different Annotation objects might point to the same annotation. + * Use uniqueName to test for Annotation equality + */ +class POPPLER_QT4_EXPORT Annotation +{ + friend class AnnotationUtils; + friend class LinkMovie; + friend class LinkRendition; + + public: + // enum definitions + // WARNING!!! oKular uses that very same values so if you change them notify the author! + enum SubType { AText = 1, ALine = 2, AGeom = 3, AHighlight = 4, AStamp = 5, + AInk = 6, ALink = 7, ACaret = 8, AFileAttachment = 9, ASound = 10, + AMovie = 11, AScreen = 12 /** \since 0.20 */, AWidget = 13 /** \since 0.22 */, A_BASE = 0 }; + enum Flag { Hidden = 1, FixedSize = 2, FixedRotation = 4, DenyPrint = 8, + DenyWrite = 16, DenyDelete = 32, ToggleHidingOnMouse = 64, External = 128 }; + enum LineStyle { Solid = 1, Dashed = 2, Beveled = 4, Inset = 8, Underline = 16 }; + enum LineEffect { NoEffect = 1, Cloudy = 2}; + enum RevScope { Root = 0 /** \since 0.20 */, Reply = 1, Group = 2, Delete = 4 }; + enum RevType { None = 1, Marked = 2, Unmarked = 4, Accepted = 8, Rejected = 16, Cancelled = 32, Completed = 64 }; + + /** + * Returns the author of the annotation. + */ + QString author() const; + /** + * Sets a new author for the annotation. + */ + void setAuthor( const QString &author ); + + QString contents() const; + void setContents( const QString &contents ); + + /** + * Returns the unique name (ID) of the annotation. + */ + QString uniqueName() const; + /** + * Sets a new unique name for the annotation. + * + * \note no check of the new uniqueName is done + */ + void setUniqueName( const QString &uniqueName ); + + QDateTime modificationDate() const; + void setModificationDate( const QDateTime &date ); + + QDateTime creationDate() const; + void setCreationDate( const QDateTime &date ); + + int flags() const; + void setFlags( int flags ); + + QRectF boundary() const; + void setBoundary( const QRectF &boundary ); + + /** + * \short Container class for Annotation style information + * + * \since 0.20 + */ + class POPPLER_QT4_EXPORT Style + { + public: + Style(); + Style( const Style &other ); + Style& operator=( const Style &other ); + ~Style(); + + // appearance properties + QColor color() const; // black + void setColor(const QColor &color); + double opacity() const; // 1.0 + void setOpacity(double opacity); + + // pen properties + double width() const; // 1.0 + void setWidth(double width); + LineStyle lineStyle() const; // LineStyle::Solid + void setLineStyle(LineStyle style); + double xCorners() const; // 0.0 + void setXCorners(double radius); + double yCorners() const; // 0.0 + void setYCorners(double radius); + const QVector& dashArray() const; // [ 3 ] + void setDashArray(const QVector &array); + + // pen effects + LineEffect lineEffect() const; // LineEffect::NoEffect + void setLineEffect(LineEffect effect); + double effectIntensity() const; // 1.0 + void setEffectIntensity(double intens); + + private: + class Private; + QSharedDataPointer d; + }; + + /// \since 0.20 + Style style() const; + /// \since 0.20 + void setStyle( const Style& style ); + + /** + * \short Container class for Annotation pop-up window information + * + * \since 0.20 + */ + class POPPLER_QT4_EXPORT Popup + { + public: + Popup(); + Popup( const Popup &other ); + Popup& operator=( const Popup &other ); + ~Popup(); + + // window state (Hidden, FixedRotation, Deny* flags allowed) + int flags() const; // -1 (never initialized) -> 0 (if inited and shown) + void setFlags( int flags ); + + // geometric properties + QRectF geometry() const; // no default + void setGeometry( const QRectF &geom ); + + // window contens/override properties + QString title() const; // '' text in the titlebar (overrides author) + void setTitle( const QString &title ); + QString summary() const; // '' short description (displayed if not empty) + void setSummary( const QString &summary ); + QString text() const; // '' text for the window (overrides annot->contents) + void setText( const QString &text ); + + private: + class Private; + QSharedDataPointer d; + }; + + /// \since 0.20 + Popup popup() const; + /// \since 0.20 + void setPopup( const Popup& popup ); + + /// \cond PRIVATE + // This field is deprecated and not used any more. Use popup + Q_DECL_DEPRECATED struct { int width, height; } window; // Always set to zero + /// \endcond + + /// \since 0.20 + RevScope revisionScope() const; // Root + + /// \since 0.20 + RevType revisionType() const; // None + + /** + * Returns the revisions of this annotation + * + * \note The caller owns the returned annotations and they should + * be deleted when no longer required. + * + * \since 0.20 + */ + QList revisions() const; + + /** + * The type of the annotation. + */ + virtual SubType subType() const = 0; + + /** + * Destructor. + */ + virtual ~Annotation(); + + /** + * Describes the flags from an annotations 'AA' dictionary. + * + * This flag is used by the additionalAction() method for ScreenAnnotation + * and WidgetAnnotation. + * + * \since 0.22 + */ + enum AdditionalActionType + { + CursorEnteringAction, ///< Performed when the cursor enters the annotation's active area + CursorLeavingAction, ///< Performed when the cursor exists the annotation's active area + MousePressedAction, ///< Performed when the mouse button is pressed inside the annotation's active area + MouseReleasedAction, ///< Performed when the mouse button is released inside the annotation's active area + FocusInAction, ///< Performed when the annotation receives the input focus + FocusOutAction, ///< Performed when the annotation loses the input focus + PageOpeningAction, ///< Performed when the page containing the annotation is opened + PageClosingAction, ///< Performed when the page containing the annotation is closed + PageVisibleAction, ///< Performed when the page containing the annotation becomes visible + PageInvisibleAction ///< Performed when the page containing the annotation becomes invisible + }; + + protected: + /// \cond PRIVATE + Annotation( AnnotationPrivate &dd ); + Annotation( AnnotationPrivate &dd, const QDomNode &description ); + void storeBaseAnnotationProperties( QDomNode & parentNode, QDomDocument & document ) const; + Q_DECLARE_PRIVATE( Annotation ) + QExplicitlySharedDataPointer d_ptr; + /// \endcond + + private: + virtual void store( QDomNode & parentNode, QDomDocument & document ) const = 0; + Q_DISABLE_COPY( Annotation ) +}; + +/** + * \short Annotation containing text. + * + * A text annotation is an object showing some text directly on the page, or + * linked to the contents using an icon shown on a page. + */ +class POPPLER_QT4_EXPORT TextAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + // local enums + enum TextType { Linked, InPlace }; + enum InplaceIntent { Unknown, Callout, TypeWriter }; + + TextAnnotation( TextType type ); + virtual ~TextAnnotation(); + virtual SubType subType() const; + + /** + The type of text annotation represented by this object + */ + TextType textType() const; + + /** + The name of the icon for this text annotation. + + Standard names for text annotation icons are: + - Comment + - Help + - Insert + - Key + - NewParagraph + - Note (this is the default icon to use) + - Paragraph + */ + QString textIcon() const; + + /** + Set the name of the icon to use for this text annotation. + + \sa textIcon for the list of standard names + */ + void setTextIcon( const QString &icon ); + + QFont textFont() const; + void setTextFont( const QFont &font ); + + int inplaceAlign() const; + void setInplaceAlign( int align ); + + /** + Synonym for contents() + + \deprecated Use contents() instead + */ + QString inplaceText() const; + /** + Synonym for setContents() + + \deprecated Use setContents() instead + */ + void setInplaceText( const QString &text ); + + QPointF calloutPoint( int id ) const; + /// \since 0.20 + QVector calloutPoints() const; + /// \since 0.20 + void setCalloutPoints( const QVector &points ); + + InplaceIntent inplaceIntent() const; + void setInplaceIntent( InplaceIntent intent ); + + private: + TextAnnotation( const QDomNode &node ); + TextAnnotation( TextAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + void setTextType( TextType type ); + Q_DECLARE_PRIVATE( TextAnnotation ) + Q_DISABLE_COPY( TextAnnotation ) +}; + +/** + * \short Polygon/polyline annotation. + * + * This annotation represents a polygon (or polyline) to be drawn on a page. + */ +class POPPLER_QT4_EXPORT LineAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + // local enums + /// \since 0.20 + enum LineType { StraightLine, Polyline }; + enum TermStyle { Square, Circle, Diamond, OpenArrow, ClosedArrow, None, + Butt, ROpenArrow, RClosedArrow, Slash }; + enum LineIntent { Unknown, Arrow, Dimension, PolygonCloud }; + + /// \since 0.20 + LineAnnotation( LineType type ); + virtual ~LineAnnotation(); + virtual SubType subType() const; + + /// \since 0.20 + LineType lineType() const; + + QLinkedList linePoints() const; + void setLinePoints( const QLinkedList &points ); + + TermStyle lineStartStyle() const; + void setLineStartStyle( TermStyle style ); + + TermStyle lineEndStyle() const; + void setLineEndStyle( TermStyle style ); + + bool isLineClosed() const; + void setLineClosed( bool closed ); + + QColor lineInnerColor() const; + void setLineInnerColor( const QColor &color ); + + double lineLeadingForwardPoint() const; + void setLineLeadingForwardPoint( double point ); + + double lineLeadingBackPoint() const; + void setLineLeadingBackPoint( double point ); + + bool lineShowCaption() const; + void setLineShowCaption( bool show ); + + LineIntent lineIntent() const; + void setLineIntent( LineIntent intent ); + + private: + LineAnnotation( const QDomNode &node ); + LineAnnotation( LineAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + void setLineType( LineType type ); + Q_DECLARE_PRIVATE( LineAnnotation ) + Q_DISABLE_COPY( LineAnnotation ) +}; + +/** + * \short Geometric annotation. + * + * The geometric annotation represents a geometric figure, like a rectangle or + * an ellipse. + */ +class POPPLER_QT4_EXPORT GeomAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + GeomAnnotation(); + virtual ~GeomAnnotation(); + virtual SubType subType() const; + + // common enums + enum GeomType { InscribedSquare, InscribedCircle }; + + GeomType geomType() const; + void setGeomType( GeomType style ); + + QColor geomInnerColor() const; + void setGeomInnerColor( const QColor &color ); + + private: + GeomAnnotation( const QDomNode &node ); + GeomAnnotation( GeomAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( GeomAnnotation ) + Q_DISABLE_COPY( GeomAnnotation ) +}; + +/** + * \short Text highlight annotation. + * + * The higlight annotation represents some areas of text being "highlighted". + */ +class POPPLER_QT4_EXPORT HighlightAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + HighlightAnnotation(); + virtual ~HighlightAnnotation(); + virtual SubType subType() const; + + /** + The type of highlight + */ + enum HighlightType { Highlight, ///< highlighter pen style annotation + Squiggly, ///< jagged or squiggly underline + Underline, ///< straight line underline + StrikeOut ///< straight line through-line + }; + + /** + Structure corresponding to a QuadPoints array. This matches a + quadrilateral that describes the area around a word (or set of + words) that are to be highlighted. + */ + struct Quad + { + QPointF points[4]; // 8 valid coords + bool capStart; // false (vtx 1-4) [K] + bool capEnd; // false (vtx 2-3) [K] + double feather; // 0.1 (in range 0..1) [K] + }; + + /** + The type (style) of highlighting to use for this area + or these areas. + */ + HighlightType highlightType() const; + + /** + Set the type of highlighting to use for the given area + or areas. + */ + void setHighlightType( HighlightType type ); + + /** + The list of areas to highlight. + */ + QList< Quad > highlightQuads() const; + + /** + Set the areas to highlight. + */ + void setHighlightQuads( const QList< Quad > &quads ); + + private: + HighlightAnnotation( const QDomNode &node ); + HighlightAnnotation( HighlightAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( HighlightAnnotation ) + Q_DISABLE_COPY( HighlightAnnotation ) +}; + +/** + * \short Stamp annotation. + * + * A simple annotation drawing a stamp on a page. + */ +class POPPLER_QT4_EXPORT StampAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + StampAnnotation(); + virtual ~StampAnnotation(); + virtual SubType subType() const; + + /** + The name of the icon for this stamp annotation. + + Standard names for stamp annotation icons are: + - Approved + - AsIs + - Confidential + - Departmental + - Draft (this is the default icon type) + - Experimental + - Expired + - Final + - ForComment + - ForPublicRelease + - NotApproved + - NotForPublicRelease + - Sold + - TopSecret + */ + QString stampIconName() const; + + /** + Set the icon type for this stamp annotation. + + \sa stampIconName for the list of standard icon names + */ + void setStampIconName( const QString &name ); + + private: + StampAnnotation( const QDomNode &node ); + StampAnnotation( StampAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( StampAnnotation ) + Q_DISABLE_COPY( StampAnnotation ) +}; + +/** + * \short Ink Annotation. + * + * Annotation representing an ink path on a page. + */ +class POPPLER_QT4_EXPORT InkAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + InkAnnotation(); + virtual ~InkAnnotation(); + virtual SubType subType() const; + + QList< QLinkedList > inkPaths() const; + void setInkPaths( const QList< QLinkedList > &paths ); + + private: + InkAnnotation( const QDomNode &node ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + InkAnnotation(InkAnnotationPrivate &dd); + Q_DECLARE_PRIVATE( InkAnnotation ) + Q_DISABLE_COPY( InkAnnotation ) +}; + +class POPPLER_QT4_EXPORT LinkAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + virtual ~LinkAnnotation(); + virtual SubType subType() const; + + // local enums + enum HighlightMode { None, Invert, Outline, Push }; + + /** \since 0.20 */ + Link* linkDestination() const; + void setLinkDestination( Link *link ); + + HighlightMode linkHighlightMode() const; + void setLinkHighlightMode( HighlightMode mode ); + + QPointF linkRegionPoint( int id ) const; + void setLinkRegionPoint( int id, const QPointF &point ); + + private: + LinkAnnotation(); + LinkAnnotation( const QDomNode &node ); + LinkAnnotation( LinkAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( LinkAnnotation ) + Q_DISABLE_COPY( LinkAnnotation ) +}; + +/** + * \short Caret annotation. + * + * The caret annotation represents a symbol to indicate the presence of text. + */ +class POPPLER_QT4_EXPORT CaretAnnotation : public Annotation +{ + friend class AnnotationUtils; + friend class AnnotationPrivate; + + public: + CaretAnnotation(); + virtual ~CaretAnnotation(); + virtual SubType subType() const; + + /** + * The symbols for the caret annotation. + */ + enum CaretSymbol { None, P }; + + CaretSymbol caretSymbol() const; + void setCaretSymbol( CaretSymbol symbol ); + + private: + CaretAnnotation( const QDomNode &node ); + CaretAnnotation( CaretAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( CaretAnnotation ) + Q_DISABLE_COPY( CaretAnnotation ) +}; + +/** + * \short File attachment annotation. + * + * The file attachment annotation represents a file embedded in the document. + * + * \since 0.10 + */ +class POPPLER_QT4_EXPORT FileAttachmentAnnotation : public Annotation +{ + friend class AnnotationPrivate; + + public: + virtual ~FileAttachmentAnnotation(); + virtual SubType subType() const; + + /** + * Returns the name of the icon of this annotation. + */ + QString fileIconName() const; + /** + * Sets a new name for the icon of this annotation. + */ + void setFileIconName( const QString &icon ); + + /** + * Returns the EmbeddedFile of this annotation. + */ + EmbeddedFile* embeddedFile() const; + /** + * Sets a new EmbeddedFile for this annotation. + * + * \note FileAttachmentAnnotation takes ownership of the object + */ + void setEmbeddedFile( EmbeddedFile *ef ); + + private: + FileAttachmentAnnotation(); + FileAttachmentAnnotation( const QDomNode &node ); + FileAttachmentAnnotation( FileAttachmentAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( FileAttachmentAnnotation ) + Q_DISABLE_COPY( FileAttachmentAnnotation ) +}; + +/** + * \short Sound annotation. + * + * The sound annotation represents a sound to be played when activated. + * + * \since 0.10 + */ +class POPPLER_QT4_EXPORT SoundAnnotation : public Annotation +{ + friend class AnnotationPrivate; + + public: + virtual ~SoundAnnotation(); + virtual SubType subType() const; + + /** + * Returns the name of the icon of this annotation. + */ + QString soundIconName() const; + /** + * Sets a new name for the icon of this annotation. + */ + void setSoundIconName( const QString &icon ); + + /** + * Returns the SoundObject of this annotation. + */ + SoundObject* sound() const; + /** + * Sets a new SoundObject for this annotation. + * + * \note SoundAnnotation takes ownership of the object + */ + void setSound( SoundObject *ef ); + + private: + SoundAnnotation(); + SoundAnnotation( const QDomNode &node ); + SoundAnnotation( SoundAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( SoundAnnotation ) + Q_DISABLE_COPY( SoundAnnotation ) +}; + +/** + * \short Movie annotation. + * + * The movie annotation represents a movie to be played when activated. + * + * \since 0.10 + */ +class POPPLER_QT4_EXPORT MovieAnnotation : public Annotation +{ + friend class AnnotationPrivate; + + public: + virtual ~MovieAnnotation(); + virtual SubType subType() const; + + /** + * Returns the MovieObject of this annotation. + */ + MovieObject* movie() const; + /** + * Sets a new MovieObject for this annotation. + * + * \note MovieAnnotation takes ownership of the object + */ + void setMovie( MovieObject *movie ); + + /** + * Returns the title of the movie of this annotation. + */ + QString movieTitle() const; + /** + * Sets a new title for the movie of this annotation. + */ + void setMovieTitle( const QString &title ); + + private: + MovieAnnotation(); + MovieAnnotation( const QDomNode &node ); + MovieAnnotation( MovieAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; + Q_DECLARE_PRIVATE( MovieAnnotation ) + Q_DISABLE_COPY( MovieAnnotation ) +}; + +/** + * \short Screen annotation. + * + * The screen annotation represents a screen to be played when activated. + * + * \since 0.20 + */ +class POPPLER_QT4_EXPORT ScreenAnnotation : public Annotation +{ + friend class AnnotationPrivate; + + public: + virtual ~ScreenAnnotation(); + + virtual SubType subType() const; + + /** + * Returns the LinkRendition of this annotation. + */ + LinkRendition* action() const; + + /** + * Sets a new LinkRendition for this annotation. + * + * \note ScreenAnnotation takes ownership of the object + */ + void setAction( LinkRendition *action ); + + /** + * Returns the title of the screen of this annotation. + */ + QString screenTitle() const; + + /** + * Sets a new title for the screen of this annotation. + */ + void setScreenTitle( const QString &title ); + + /** + * Returns the additional action of the given @p type fo the annotation or + * @c 0 if no action has been defined. + * + * \since 0.22 + */ + Link* additionalAction( AdditionalActionType type ) const; + + private: + ScreenAnnotation(); + ScreenAnnotation( ScreenAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; // stub + Q_DECLARE_PRIVATE( ScreenAnnotation ) + Q_DISABLE_COPY( ScreenAnnotation ) +}; + +/** + * \short Widget annotation. + * + * The widget annotation represents a widget (form field) on a page. + * + * \note This class is just provided for consistency of the annotation API, + * use the FormField classes to get all the form-related information. + * + * \since 0.22 + */ +class POPPLER_QT4_EXPORT WidgetAnnotation : public Annotation +{ + friend class AnnotationPrivate; + + public: + virtual ~WidgetAnnotation(); + + virtual SubType subType() const; + + /** + * Returns the additional action of the given @p type fo the annotation or + * @c 0 if no action has been defined. + * + * \since 0.22 + */ + Link* additionalAction( AdditionalActionType type ) const; + + private: + WidgetAnnotation(); + WidgetAnnotation( WidgetAnnotationPrivate &dd ); + virtual void store( QDomNode &parentNode, QDomDocument &document ) const; // stub + Q_DECLARE_PRIVATE( WidgetAnnotation ) + Q_DISABLE_COPY( WidgetAnnotation ) +}; + +} + +#endif diff --git a/dependencies/poppler/include/poppler-converter-private.h b/dependencies/poppler/include/poppler-converter-private.h new file mode 100644 index 00000000..dc3e9437 --- /dev/null +++ b/dependencies/poppler/include/poppler-converter-private.h @@ -0,0 +1,49 @@ +/* poppler-converter-private.h: Qt4 interface to poppler + * Copyright (C) 2007, 2009, Albert Astals Cid + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_QT4_CONVERTER_PRIVATE_H +#define POPPLER_QT4_CONVERTER_PRIVATE_H + +#include + +class QIODevice; + +namespace Poppler { + +class DocumentData; + +class BaseConverterPrivate +{ + public: + BaseConverterPrivate(); + virtual ~BaseConverterPrivate(); + + QIODevice* openDevice(); + void closeDevice(); + + DocumentData *document; + QString outputFileName; + QIODevice *iodev; + bool ownIodev : 1; + BaseConverter::Error lastError; +}; + +} + +#endif diff --git a/dependencies/poppler/include/poppler-embeddedfile-private.h b/dependencies/poppler/include/poppler-embeddedfile-private.h new file mode 100644 index 00000000..83549dad --- /dev/null +++ b/dependencies/poppler/include/poppler-embeddedfile-private.h @@ -0,0 +1,42 @@ +/* poppler-embeddedfile-private.h: Qt4 interface to poppler + * Copyright (C) 2005, 2008, 2009, 2012, Albert Astals Cid + * Copyright (C) 2005, Brad Hards + * Copyright (C) 2008, 2011, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_EMBEDDEDFILE_PRIVATE_H +#define POPPLER_EMBEDDEDFILE_PRIVATE_H + +class FileSpec; + +namespace Poppler +{ + +class EmbeddedFileData +{ +public: + EmbeddedFileData(FileSpec *fs); + ~EmbeddedFileData(); + + EmbFile *embFile() const; + + FileSpec *filespec; +}; + +} + +#endif diff --git a/dependencies/poppler/include/poppler-export.h b/dependencies/poppler/include/poppler-export.h new file mode 100644 index 00000000..7661fe9e --- /dev/null +++ b/dependencies/poppler/include/poppler-export.h @@ -0,0 +1,17 @@ +/* +* This file is used to set the poppler_qt4_EXPORT macros right. +* This is needed for setting the visibility on windows, it will have no effect on other platforms. +*/ +#if defined(_WIN32) +# define LIB_EXPORT __declspec(dllexport) +# define LIB_IMPORT __declspec(dllimport) +#else +# define LIB_EXPORT +# define LIB_IMPORT +#endif + +#ifdef poppler_qt4_EXPORTS +# define POPPLER_QT4_EXPORT LIB_EXPORT +#else +# define POPPLER_QT4_EXPORT LIB_IMPORT +#endif diff --git a/dependencies/poppler/include/poppler-form.h b/dependencies/poppler/include/poppler-form.h new file mode 100644 index 00000000..79ed3932 --- /dev/null +++ b/dependencies/poppler/include/poppler-form.h @@ -0,0 +1,343 @@ +/* poppler-form.h: qt4 interface to poppler + * Copyright (C) 2007-2008, Pino Toscano + * Copyright (C) 2008, 2011, Albert Astals Cid + * Copyright (C) 2012, Adam Reichold + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_QT4_FORM_H_ +#define _POPPLER_QT4_FORM_H_ + +#include +#include +#include "poppler-export.h" + +class Page; +class FormWidget; +class FormWidgetButton; +class FormWidgetText; +class FormWidgetChoice; + +namespace Poppler { + + class DocumentData; + class Link; + + class FormFieldData; + /** + The base class representing a form field. + + \since 0.6 + */ + class POPPLER_QT4_EXPORT FormField { + public: + + /** + The different types of form field. + */ + enum FormType { + FormButton, ///< A button field. See \ref Poppler::FormFieldButton::ButtonType "ButtonType" + FormText, ///< A text field. See \ref Poppler::FormFieldText::TextType "TextType" + FormChoice, ///< A single choice field. See \ref Poppler::FormFieldChoice::ChoiceType "ChoiceType" + FormSignature ///< A signature field. + }; + + virtual ~FormField(); + + /** + The type of the field. + */ + virtual FormType type() const = 0; + + /** + \return The size of the field, in normalized coordinates, i.e. + [0..1] with regard to the dimensions (cropbox) of the page + */ + QRectF rect() const; + + /** + The ID of the field. + */ + int id() const; + + /** + The internal name of the field. + */ + QString name() const; + + /** + The internal fully qualified name of the field. + \since 0.18 + */ + QString fullyQualifiedName() const; + + /** + The name of the field to be used in user interface (eg messages to + the user). + */ + QString uiName() const; + + /** + Whether this form field is read-only. + */ + bool isReadOnly() const; + + /** + Whether this form field is visible. + */ + bool isVisible() const; + + /** + The activation action of this form field. + + \note It may be null. + */ + Link* activationAction() const; + + protected: + /// \cond PRIVATE + FormField(FormFieldData &dd); + + FormFieldData *m_formData; + /// \endcond + + private: + Q_DISABLE_COPY(FormField) + }; + + /** + A form field that represents a "button". + + \since 0.8 + */ + class POPPLER_QT4_EXPORT FormFieldButton : public FormField { + public: + + /** + * The types of button field. + */ + enum ButtonType + { + Push, ///< A simple push button. + CheckBox, ///< A check box. + Radio ///< A radio button. + }; + + /// \cond PRIVATE + FormFieldButton(DocumentData *doc, ::Page *p, ::FormWidgetButton *w); + /// \endcond + virtual ~FormFieldButton(); + + virtual FormType type() const; + + /** + The particular type of the button field. + */ + ButtonType buttonType() const; + + /** + * The caption to be used for the button. + */ + QString caption() const; + + /** + The state of the button. + */ + bool state() const; + + /** + Sets the state of the button to the new \p state . + */ + void setState( bool state ); + + /** + The list with the IDs of siblings (ie, buttons belonging to the same + group as the current one. + + Valid only for \ref Radio buttons, an empty list otherwise. + */ + QList siblings() const; + + private: + Q_DISABLE_COPY(FormFieldButton) + }; + + /** + A form field that represents a text input. + + \since 0.6 + */ + class POPPLER_QT4_EXPORT FormFieldText : public FormField { + public: + + /** + The particular type of this text field. + */ + enum TextType { + Normal, ///< A simple singleline text field. + Multiline, ///< A multiline text field. + FileSelect ///< An input field to select the path of a file on disk. + }; + + /// \cond PRIVATE + FormFieldText(DocumentData *doc, ::Page *p, ::FormWidgetText *w); + /// \endcond + virtual ~FormFieldText(); + + virtual FormType type() const; + + /** + The text type of the text field. + */ + TextType textType() const; + + /** + The text associated with the text field. + */ + QString text() const; + + /** + Sets the text associated with the text field to the specified + \p text. + */ + void setText( const QString& text ); + + /** + Whether this text field is a password input, eg its text \b must be + replaced with asterisks. + + Always false for \ref FileSelect text fields. + */ + bool isPassword() const; + + /** + Whether this text field should allow rich text. + */ + bool isRichText() const; + + /** + The maximum length for the text of this field, or -1 if not set. + */ + int maximumLength() const; + + /** + The horizontal alignment for the text of this text field. + */ + Qt::Alignment textAlignment() const; + + /** + Whether the text inserted manually in the field (where possible) + can be spell-checked. + */ + bool canBeSpellChecked() const; + + private: + Q_DISABLE_COPY(FormFieldText) + }; + + /** + A form field that represents a choice field. + + \since 0.6 + */ + class POPPLER_QT4_EXPORT FormFieldChoice : public FormField { + public: + + /** + The particular type of this choice field. + */ + enum ChoiceType { + ComboBox, ///< A simple singleline text field. + ListBox ///< A multiline text field. + }; + + /// \cond PRIVATE + FormFieldChoice(DocumentData *doc, ::Page *p, ::FormWidgetChoice *w); + /// \endcond + virtual ~FormFieldChoice(); + + virtual FormType type() const; + + /** + The choice type of the choice field. + */ + ChoiceType choiceType() const; + + /** + The possible choices of the choice field. + */ + QStringList choices() const; + + /** + Whether this FormFieldChoice::ComboBox is editable, i.e. the user + can type in a custom value. + + Always false for the other types of choices. + */ + bool isEditable() const; + + /** + Whether more than one choice of this FormFieldChoice::ListBox + can be selected at the same time. + + Always false for the other types of choices. + */ + bool multiSelect() const; + + /** + The currently selected choices. + */ + QList currentChoices() const; + + /** + Sets the selected choices to \p choice. + */ + void setCurrentChoices( const QList &choice ); + + /** + The text entered into an editable combo box choice field. Otherwise a null string. + + \since 0.22 + */ + QString editChoice() const; + + /** + Sets the text entered into an editable combo box choice field. Otherwise does nothing. + + \since 0.22 + */ + void setEditChoice(const QString& text); + + /** + The horizontal alignment for the text of this text field. + */ + Qt::Alignment textAlignment() const; + + /** + Whether the text inserted manually in the field (where possible) + can be spell-checked. + + Returns false if the field is not an editable text field. + */ + bool canBeSpellChecked() const; + + private: + Q_DISABLE_COPY(FormFieldChoice) + }; + +} + +#endif diff --git a/dependencies/poppler/include/poppler-link-extractor-private.h b/dependencies/poppler/include/poppler-link-extractor-private.h new file mode 100644 index 00000000..32ddd038 --- /dev/null +++ b/dependencies/poppler/include/poppler-link-extractor-private.h @@ -0,0 +1,57 @@ +/* poppler-link-extractor_p.h: qt interface to poppler + * Copyright (C) 2007, 2008, 2011, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_LINK_EXTRACTOR_H_ +#define _POPPLER_LINK_EXTRACTOR_H_ + +#include +#include + +#include + +namespace Poppler +{ + +class Link; +class PageData; + +class LinkExtractorOutputDev : public OutputDev +{ + public: + LinkExtractorOutputDev(PageData *data); + virtual ~LinkExtractorOutputDev(); + + // inherited from OutputDev + virtual GBool upsideDown() { return gFalse; } + virtual GBool useDrawChar() { return gFalse; } + virtual GBool interpretType3Chars() { return gFalse; } + virtual void processLink(::AnnotLink *link); + + // our stuff + QList< Link* > links(); + + private: + PageData *m_data; + double m_pageCropWidth; + double m_pageCropHeight; + QList< Link* > m_links; +}; + +} + +#endif diff --git a/dependencies/poppler/include/poppler-link.h b/dependencies/poppler/include/poppler-link.h new file mode 100644 index 00000000..ef93bf09 --- /dev/null +++ b/dependencies/poppler/include/poppler-link.h @@ -0,0 +1,611 @@ +/* poppler-link.h: qt interface to poppler + * Copyright (C) 2006, Albert Astals Cid + * Copyright (C) 2007-2008, 2010, Pino Toscano + * Copyright (C) 2010, 2012, Guillermo Amaral + * Copyright (C) 2012, Tobias Koenig + * Adapting code from + * Copyright (C) 2004 by Enrico Ros + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_LINK_H_ +#define _POPPLER_LINK_H_ + +#include +#include +#include +#include "poppler-export.h" + +struct Ref; +class MediaRendition; + +namespace Poppler { + +class LinkPrivate; +class LinkGotoPrivate; +class LinkExecutePrivate; +class LinkBrowsePrivate; +class LinkActionPrivate; +class LinkSoundPrivate; +class LinkJavaScriptPrivate; +class LinkMoviePrivate; +class LinkDestinationData; +class LinkDestinationPrivate; +class LinkRenditionPrivate; +class MediaRendition; +class SoundObject; + +/** + * \short A destination. + * + * The LinkDestination class represent a "destination" (in terms of visual + * viewport to be displayed) for \link Poppler::LinkGoto GoTo\endlink links, + * and items in the table of contents (TOC) of a document. + * + * Coordinates are in 0..1 range + */ +class POPPLER_QT4_EXPORT LinkDestination +{ + public: + /** + * The possible kind of "viewport destination". + */ + enum Kind + { + /** + * The new viewport is specified in terms of: + * - possibile new left coordinate (see isChangeLeft() ) + * - possibile new top coordinate (see isChangeTop() ) + * - possibile new zoom level (see isChangeZoom() ) + */ + destXYZ = 1, + destFit = 2, + destFitH = 3, + destFitV = 4, + destFitR = 5, + destFitB = 6, + destFitBH = 7, + destFitBV = 8 + }; + + /// \cond PRIVATE + LinkDestination(const LinkDestinationData &data); + LinkDestination(const QString &description); + /// \endcond + /** + * Copy constructor. + */ + LinkDestination(const LinkDestination &other); + /** + * Destructor. + */ + ~LinkDestination(); + + // Accessors. + /** + * The kind of destination. + */ + Kind kind() const; + /** + * Which page is the target of this destination. + * + * \note this number is 1-based, so for a 5 pages document the + * valid page numbers go from 1 to 5 (both included). + */ + int pageNumber() const; + /** + * The new left for the viewport of the target page, in case + * it is specified to be changed (see isChangeLeft() ) + */ + double left() const; + double bottom() const; + double right() const; + /** + * The new top for the viewport of the target page, in case + * it is specified to be changed (see isChangeTop() ) + */ + double top() const; + double zoom() const; + /** + * Whether the left of the viewport on the target page should + * be changed. + * + * \see left() + */ + bool isChangeLeft() const; + /** + * Whether the top of the viewport on the target page should + * be changed. + * + * \see top() + */ + bool isChangeTop() const; + /** + * Whether the zoom level should be changed. + * + * \see zoom() + */ + bool isChangeZoom() const; + + /** + * Return a string repesentation of this destination. + */ + QString toString() const; + + /** + * Return the name of this destination. + * + * \since 0.12 + */ + QString destinationName() const; + + /** + * Assignment operator. + */ + LinkDestination& operator=(const LinkDestination &other); + + private: + QSharedDataPointer< LinkDestinationPrivate > d; +}; + +/** + * \short Encapsulates data that describes a link. + * + * This is the base class for links. It makes mandatory for inherited + * kind of links to reimplement the linkType() method and return the type of + * the link described by the reimplemented class. + */ +class POPPLER_QT4_EXPORT Link +{ + public: + /// \cond PRIVATE + Link( const QRectF &linkArea ); + /// \endcond + + /** + * The possible kinds of link. + * + * Inherited classes must return an unique identifier + */ + enum LinkType + { + None, ///< Unknown link + Goto, ///< A "Go To" link + Execute, ///< A command to be executed + Browse, ///< An URL to be browsed (eg "http://poppler.freedesktop.org") + Action, ///< A "standard" action to be executed in the viewer + Sound, ///< A link representing a sound to be played + Movie, ///< An action to be executed on a movie + Rendition, ///< A rendition link \since 0.20 + JavaScript ///< A JavaScript code to be interpreted \since 0.10 + }; + + /** + * The type of this link. + */ + virtual LinkType linkType() const; + + /** + * Destructor. + */ + virtual ~Link(); + + /** + * The area of a Page where the link should be active. + * + * \note this can be a null rect, in this case the link represents + * a general action. The area is given in 0..1 range + */ + QRectF linkArea() const; + + protected: + /// \cond PRIVATE + Link( LinkPrivate &dd ); + Q_DECLARE_PRIVATE( Link ) + LinkPrivate *d_ptr; + /// \endcond + + private: + Q_DISABLE_COPY( Link ) +}; + + +/** + * \brief Viewport reaching request. + * + * With a LinkGoto link, the document requests the specified viewport to be + * reached (aka, displayed in a viewer). Furthermore, if a file name is specified, + * then the destination refers to that document (and not to the document the + * current LinkGoto belongs to). + */ +class POPPLER_QT4_EXPORT LinkGoto : public Link +{ + public: + /** + * Create a new Goto link. + * + * \param linkArea the active area of the link + * \param extFileName if not empty, the file name to be open + * \param destination the destination to be reached + */ + LinkGoto( const QRectF &linkArea, QString extFileName, const LinkDestination & destination ); + /** + * Destructor. + */ + ~LinkGoto(); + + /** + * Whether the destination is in an external document + * (i.e. not the current document) + */ + bool isExternal() const; + // query for goto parameters + /** + * The file name of the document the destination() refers to, + * or an empty string in case it refers to the current document. + */ + QString fileName() const; + /** + * The destination to reach. + */ + LinkDestination destination() const; + LinkType linkType() const; + + private: + Q_DECLARE_PRIVATE( LinkGoto ) + Q_DISABLE_COPY( LinkGoto ) +}; + +/** + * \brief Generic execution request. + * + * The LinkExecute link represent a "file name" execution request. The result + * depends on the \link fileName() file name\endlink: + * - if it is a document, then it is requested to be open + * - otherwise, it represents an executable to be run with the specified parameters + */ +class POPPLER_QT4_EXPORT LinkExecute : public Link +{ + public: + /** + * The file name to be executed + */ + QString fileName() const; + /** + * The parameters for the command. + */ + QString parameters() const; + + /** + * Create a new Execute link. + * + * \param linkArea the active area of the link + * \param file the file name to be open, or the program to be execute + * \param params the parameters for the program to execute + */ + LinkExecute( const QRectF &linkArea, const QString & file, const QString & params ); + /** + * Destructor. + */ + ~LinkExecute(); + LinkType linkType() const; + + private: + Q_DECLARE_PRIVATE( LinkExecute ) + Q_DISABLE_COPY( LinkExecute ) +}; + +/** + * \brief An URL to browse. + * + * The LinkBrowse link holds a URL (eg 'http://poppler.freedesktop.org', + * 'mailto:john@some.org', etc) to be open. + * + * The format of the URL is specified by RFC 2396 (http://www.ietf.org/rfc/rfc2396.txt) + */ +class POPPLER_QT4_EXPORT LinkBrowse : public Link +{ + public: + /** + * The URL to open + */ + QString url() const; + + /** + * Create a new browse link. + * + * \param linkArea the active area of the link + * \param url the URL to be open + */ + LinkBrowse( const QRectF &linkArea, const QString &url ); + /** + * Destructor. + */ + ~LinkBrowse(); + LinkType linkType() const; + + private: + Q_DECLARE_PRIVATE( LinkBrowse ) + Q_DISABLE_COPY( LinkBrowse ) +}; + +/** + * \brief "Standard" action request. + * + * The LinkAction class represents a link that request a "standard" action + * to be performed by the viewer on the displayed document. + */ +class POPPLER_QT4_EXPORT LinkAction : public Link +{ + public: + /** + * The possible types of actions + */ + enum ActionType { PageFirst = 1, + PagePrev = 2, + PageNext = 3, + PageLast = 4, + HistoryBack = 5, + HistoryForward = 6, + Quit = 7, + Presentation = 8, + EndPresentation = 9, + Find = 10, + GoToPage = 11, + Close = 12, + Print = 13 ///< \since 0.16 + }; + + /** + * The action of the current LinkAction + */ + ActionType actionType() const; + + /** + * Create a new Action link, that executes a specified action + * on the document. + * + * \param linkArea the active area of the link + * \param actionType which action should be executed + */ + LinkAction( const QRectF &linkArea, ActionType actionType ); + /** + * Destructor. + */ + ~LinkAction(); + LinkType linkType() const; + + private: + Q_DECLARE_PRIVATE( LinkAction ) + Q_DISABLE_COPY( LinkAction ) +}; + +/** + * Sound: a sound to be played. + * + * \since 0.6 + */ +class POPPLER_QT4_EXPORT LinkSound : public Link +{ + public: + // create a Link_Sound + LinkSound( const QRectF &linkArea, double volume, bool sync, bool repeat, bool mix, SoundObject *sound ); + /** + * Destructor. + */ + virtual ~LinkSound(); + + LinkType linkType() const; + + /** + * The volume to be used when playing the sound. + * + * The volume is in the range [ -1, 1 ], where: + * - a negative number: no volume (mute) + * - 1: full volume + */ + double volume() const; + /** + * Whether the playback of the sound should be synchronous + * (thus blocking, waiting for the end of the sound playback). + */ + bool synchronous() const; + /** + * Whether the sound should be played continuously (that is, + * started again when it ends) + */ + bool repeat() const; + /** + * Whether the playback of this sound can be mixed with + * playbacks with other sounds of the same document. + * + * \note When false, any other playback must be stopped before + * playing the sound. + */ + bool mix() const; + /** + * The sound object to be played + */ + SoundObject *sound() const; + + private: + Q_DECLARE_PRIVATE( LinkSound ) + Q_DISABLE_COPY( LinkSound ) +}; + +/** + * Rendition: Rendition link. + * + * \since 0.20 + */ +class POPPLER_QT4_EXPORT LinkRendition : public Link +{ + public: + /** + * Describes the possible rendition actions. + * + * \since 0.22 + */ + enum RenditionAction { + NoRendition, + PlayRendition, + StopRendition, + PauseRendition, + ResumeRendition + }; + + /** + * Create a new rendition link. + * + * \param linkArea the active area of the link + * \param rendition the media rendition object + * + * \deprecated Use the constructor that takes all parameter instead + */ + Q_DECL_DEPRECATED LinkRendition( const QRectF &linkArea, ::MediaRendition *rendition ); + + /** + * Create a new rendition link. + * + * \param linkArea the active area of the link + * \param rendition the media rendition object + * \param operation the numeric operation (action) (@see ::LinkRendition::RenditionOperation) + * \param script the java script code + * \param annotationReference the object reference of the screen annotation associated with this rendition action + * \since 0.22 + */ + LinkRendition( const QRectF &linkArea, ::MediaRendition *rendition, int operation, const QString &script, const Ref &annotationReference ); + + /** + * Destructor. + */ + virtual ~LinkRendition(); + + LinkType linkType() const; + + /** + * Returns the media rendition object if the redition provides one, @c 0 otherwise + */ + MediaRendition *rendition() const; + + /** + * Returns the action that should be executed if a rendition object is provided. + * + * \since 0.22 + */ + RenditionAction action() const; + + /** + * The JS code that shall be executed or an empty string. + * + * \since 0.22 + */ + QString script() const; + + /** + * Returns whether the given @p annotation is the referenced screen annotation for this rendition @p link. + * + * \since 0.22 + */ + bool isReferencedAnnotation( const ScreenAnnotation *annotation ) const; + + private: + Q_DECLARE_PRIVATE( LinkRendition ) + Q_DISABLE_COPY( LinkRendition ) +}; + +/** + * JavaScript: a JavaScript code to be interpreted. + * + * \since 0.10 + */ +class POPPLER_QT4_EXPORT LinkJavaScript : public Link +{ + public: + /** + * Create a new JavaScript link. + * + * \param linkArea the active area of the link + * \param js the JS code to be interpreted + */ + LinkJavaScript( const QRectF &linkArea, const QString &js ); + /** + * Destructor. + */ + virtual ~LinkJavaScript(); + + LinkType linkType() const; + + /** + * The JS code + */ + QString script() const; + + private: + Q_DECLARE_PRIVATE( LinkJavaScript ) + Q_DISABLE_COPY( LinkJavaScript ) +}; + +/** + * Movie: a movie to be played. + * + * \since 0.20 + */ +class POPPLER_QT4_EXPORT LinkMovie : public Link +{ + public: + /** + * Describes the operation to be performed on the movie. + */ + enum Operation { Play, + Stop, + Pause, + Resume + }; + + /** + * Create a new Movie link. + * + * \param linkArea the active area of the link + * \param operation the operation to be performed on the movie + * \param annotationTitle the title of the movie annotation identifying the movie to be played + * \param annotationReference the object reference of the movie annotation identifying the movie to be played + * + * Note: This constructor is supposed to be used by Poppler::Page only. + */ + LinkMovie( const QRectF &linkArea, Operation operation, const QString &annotationTitle, const Ref &annotationReference ); + /** + * Destructor. + */ + ~LinkMovie(); + LinkType linkType() const; + /** + * Returns the operation to be performed on the movie. + */ + Operation operation() const; + /** + * Returns whether the given @p annotation is the referenced movie annotation for this movie @p link. + */ + bool isReferencedAnnotation( const MovieAnnotation *annotation ) const; + + private: + Q_DECLARE_PRIVATE( LinkMovie ) + Q_DISABLE_COPY( LinkMovie ) +}; + +} + +#endif diff --git a/dependencies/poppler/include/poppler-media.h b/dependencies/poppler/include/poppler-media.h new file mode 100644 index 00000000..64ec83c2 --- /dev/null +++ b/dependencies/poppler/include/poppler-media.h @@ -0,0 +1,97 @@ +/* poppler-media.h: qt interface to poppler + * Copyright (C) 2012 Guillermo A. Amaral B. + * Copyright (C) 2012 Albert Astals Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_MEDIARENDITION_H__ +#define __POPPLER_MEDIARENDITION_H__ + +#include "poppler-export.h" + +#include +#include + +class MediaRendition; +class QIODevice; + +namespace Poppler +{ + class MediaRenditionPrivate; + + /** + Qt wrapper for MediaRendition. + + \since 0.20 + */ + class POPPLER_QT4_EXPORT MediaRendition { + public: + MediaRendition(::MediaRendition *rendition); + ~MediaRendition(); + + /** + Check if wrapper is holding a valid rendition object. + */ + bool isValid() const; + + /** + Returns content type. + */ + QString contentType() const; + + /** + Returns file name. + */ + QString fileName() const; + + /** + Returns true if media is embedded. + */ + bool isEmbedded() const; + + /** + Returns data buffer. + */ + QByteArray data() const; + + /** + Convenience accessor for auto-play parameter. + */ + bool autoPlay() const; + + /** + Convenience accessor for show controls parameter. + */ + bool showControls() const; + + /** + Convenience accessor for repeat count parameter. + */ + float repeatCount() const; + + /** + Convenience accessor for size parameter. + */ + QSize size() const; + + private: + Q_DECLARE_PRIVATE( MediaRendition ) + MediaRenditionPrivate *d_ptr; + Q_DISABLE_COPY( MediaRendition ) + }; +} + +#endif /* __POPPLER_MEDIARENDITION_H__ */ diff --git a/dependencies/poppler/include/poppler-optcontent-private.h b/dependencies/poppler/include/poppler-optcontent-private.h new file mode 100644 index 00000000..98eda073 --- /dev/null +++ b/dependencies/poppler/include/poppler-optcontent-private.h @@ -0,0 +1,121 @@ +/* poppler-optcontent-private.h: qt interface to poppler + * + * Copyright (C) 2007, Brad Hards + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_OPTCONTENT_PRIVATE_H +#define POPPLER_OPTCONTENT_PRIVATE_H + +#include +#include +#include + +class Array; +class OCGs; +class OptionalContentGroup; + +class QModelIndex; + +namespace Poppler +{ + class OptContentItem; + class OptContentModel; + class OptContentModelPrivate; + + class RadioButtonGroup + { + public: + RadioButtonGroup( OptContentModelPrivate *ocModel, Array *rbarray); + ~RadioButtonGroup(); + QSet setItemOn( OptContentItem *itemToSetOn ); + + private: + QList itemsInGroup; + }; + + class OptContentItem + { + public: + enum ItemState { On, Off, HeadingOnly }; + + OptContentItem( OptionalContentGroup *group ); + OptContentItem( const QString &label ); + OptContentItem(); + ~OptContentItem(); + + QString name() const { return m_name; } + ItemState state() const { return m_stateBackup; } + bool setState(ItemState state, QSet &changedItems); + + QList childList() { return m_children; } + + void setParent( OptContentItem* parent) { m_parent = parent; } + OptContentItem* parent() { return m_parent; } + + void addChild( OptContentItem *child ); + + void appendRBGroup( RadioButtonGroup *rbgroup ); + + bool isEnabled() const { return m_enabled; } + + QSet recurseListChildren(bool includeMe = false) const; + + private: + OptionalContentGroup *m_group; + QString m_name; + ItemState m_state; // true for ON, false for OFF + ItemState m_stateBackup; + QList m_children; + OptContentItem *m_parent; + QList m_rbGroups; + bool m_enabled; + }; + + class OptContentModelPrivate + { + public: + OptContentModelPrivate( OptContentModel *qq, OCGs *optContent ); + ~OptContentModelPrivate(); + + void parseRBGroupsArray( Array *rBGroupArray ); + OptContentItem *nodeFromIndex(const QModelIndex &index, bool canBeNull = false) const; + QModelIndex indexFromItem(OptContentItem *node, int column) const; + + /** + Get the OptContentItem corresponding to a given reference value. + + \param ref the reference number (e.g. from Object.getRefNum()) to look up + + \return the matching optional content item, or null if the reference wasn't found + */ + OptContentItem *itemFromRef( const QString &ref ) const; + void setRootNode(OptContentItem *node); + + OptContentModel *q; + + QMap m_optContentItems; + QList m_rbgroups; + OptContentItem *m_rootNode; + + private: + void addChild( OptContentItem *parent, OptContentItem *child); + void parseOrderArray( OptContentItem *parentNode, Array *orderArray ); + }; +} + +#endif diff --git a/dependencies/poppler/include/poppler-optcontent.h b/dependencies/poppler/include/poppler-optcontent.h new file mode 100644 index 00000000..3f478539 --- /dev/null +++ b/dependencies/poppler/include/poppler-optcontent.h @@ -0,0 +1,76 @@ +/* poppler-optcontent.h: qt interface to poppler + * + * Copyright (C) 2007, Brad Hards + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_OPTCONTENT_H +#define POPPLER_OPTCONTENT_H + +#include + +#include "poppler-export.h" + +class OCGs; + +namespace Poppler +{ + class Document; + class OptContentModelPrivate; + + /** + * \brief Model for optional content + * + * OptContentModel is an item model representing the optional content items + * that can be found in PDF documents. + * + * The model offers a mostly read-only display of the data, allowing to + * enable/disable some contents setting the Qt::CheckStateRole data role. + * + * \since 0.8 + */ + class POPPLER_QT4_EXPORT OptContentModel : public QAbstractItemModel + { + friend class Document; + + Q_OBJECT + + public: + virtual ~OptContentModel(); + + QModelIndex index(int row, int column, const QModelIndex &parent) const; + QModelIndex parent(const QModelIndex &child) const; + + int rowCount(const QModelIndex &parent = QModelIndex()) const; + int columnCount(const QModelIndex &parent) const; + + QVariant data(const QModelIndex &index, int role) const; + virtual bool setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole ); + + Qt::ItemFlags flags ( const QModelIndex & index ) const; + + virtual QVariant headerData( int section, Qt::Orientation orientation, int role = Qt::DisplayRole ) const; + + private: + OptContentModel( OCGs *optContent, QObject *parent = 0); + + friend class OptContentModelPrivate; + OptContentModelPrivate *d; + }; +} + +#endif diff --git a/dependencies/poppler/include/poppler-page-private.h b/dependencies/poppler/include/poppler-page-private.h new file mode 100644 index 00000000..91955e09 --- /dev/null +++ b/dependencies/poppler/include/poppler-page-private.h @@ -0,0 +1,54 @@ +/* poppler-page.cc: qt interface to poppler + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2007, 2012, Albert Astals Cid + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_PAGE_PRIVATE_H_ +#define _POPPLER_PAGE_PRIVATE_H_ + +#include "CharTypes.h" + +class QRectF; + +class LinkAction; +class Page; +class TextPage; + +namespace Poppler +{ + +class DocumentData; +class PageTransition; + +class PageData { +public: + Link* convertLinkActionToLink(::LinkAction * a, const QRectF &linkArea); + + DocumentData *parentDoc; + ::Page *page; + int index; + PageTransition *transition; + + static Link* convertLinkActionToLink(::LinkAction * a, DocumentData *parentDoc, const QRectF &linkArea); + + TextPage *prepareTextSearch(const QString &text, Page::SearchMode caseSensitive, Page::Rotation rotate, GBool *sCase, QVector *u); +}; + +} + +#endif diff --git a/dependencies/poppler/include/poppler-page-transition-private.h b/dependencies/poppler/include/poppler-page-transition-private.h new file mode 100644 index 00000000..63febb09 --- /dev/null +++ b/dependencies/poppler/include/poppler-page-transition-private.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2005, Albert Astals Cid + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +class Object; + +namespace Poppler { + +class PageTransitionParams { + public: + Object *dictObj; +}; + +} diff --git a/dependencies/poppler/include/poppler-page-transition.h b/dependencies/poppler/include/poppler-page-transition.h new file mode 100644 index 00000000..e7f39e27 --- /dev/null +++ b/dependencies/poppler/include/poppler-page-transition.h @@ -0,0 +1,148 @@ +/* PageTransition.h + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2005, Brad Hards + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __PAGETRANSITION_X_H__ +#define __PAGETRANSITION_X_H__ + +#include "poppler-export.h" + +namespace Poppler { + +class PageTransitionParams; +class PageTransitionData; + +/** + \brief Describes how a PDF file viewer shall perform the transition + from one page to another + + In PDF files there is a way to specify if the viewer shall use + certain effects to perform the transition from one page to + another. This feature can be used, e.g., in a PDF-based beamer + presentation. + + This utility class represents the transition effect, and can be + used to extract the information from a PDF object. +*/ + + +class POPPLER_QT4_EXPORT PageTransition { + public: + + /** \brief transition effect that shall be used + */ + // if changed remember to keep in sync with PageTransition.h enum + enum Type { + Replace = 0, + Split, + Blinds, + Box, + Wipe, + Dissolve, + Glitter, + Fly, + Push, + Cover, + Uncover, + Fade + }; + + /** \brief alignment of the transition effect that shall be used + */ + // if changed remember to keep in sync with PageTransition.h enum + enum Alignment { + Horizontal = 0, + Vertical + }; + + /** \brief direction of the transition effect that shall be used + */ + // if changed remember to keep in sync with PageTransition.h enum + enum Direction { + Inward = 0, + Outward + }; + + /** \brief Construct a new PageTransition object from a page dictionary. + + Users of the library will rarely need to construct a + PageTransition object themselves. Instead, the method + Poppler::Page::transition() can be used to find out if a certain + transition effect is specified. + + @warning In case or error, this method will print an error message to stderr, + and construct a default object. + + @param params an object whose dictionary will be read and + parsed. This must be a valid object, whose dictionaries are + accessed by the constructor. The object is only accessed by this + constructor, and may be deleted after the constructor returns. + */ + PageTransition(const PageTransitionParams ¶ms); + + /** \brief copy constructor */ + PageTransition(const PageTransition &pt); + + /** + Destructor + */ + ~PageTransition(); + + /** + \brief Get type of the transition. + */ + Type type() const; + + /** + \brief Get duration of the transition in seconds. + */ + int duration() const; + + /** + \brief Get dimension in which the transition effect occurs. + */ + Alignment alignment() const; + + /** + \brief Get direction of motion of the transition effect. + */ + Direction direction() const; + + /** + \brief Get direction in which the transition effect moves. + */ + int angle() const; + + /** + \brief Get starting or ending scale. + */ + double scale() const; + + /** + \brief Returns true if the area to be flown is rectangular and + opaque. + */ + bool isRectangular() const; + + private: + PageTransitionData *data; +}; + +} + +#endif diff --git a/dependencies/poppler/include/poppler-private.h b/dependencies/poppler/include/poppler-private.h new file mode 100644 index 00000000..5a9e1b85 --- /dev/null +++ b/dependencies/poppler/include/poppler-private.h @@ -0,0 +1,311 @@ +/* poppler-private.h: qt interface to poppler + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2005, 2008, Brad Hards + * Copyright (C) 2006-2009, 2011, 2012 by Albert Astals Cid + * Copyright (C) 2007-2009, 2011 by Pino Toscano + * Copyright (C) 2011 Andreas Hartmetz + * Copyright (C) 2011 Hib Eris + * Copyright (C) 2012 Thomas Freitag + * Inspired on code by + * Copyright (C) 2004 by Albert Astals Cid + * Copyright (C) 2004 by Enrico Ros + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _POPPLER_PRIVATE_H_ +#define _POPPLER_PRIVATE_H_ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#if defined(HAVE_SPLASH) +#include +#endif + +#include "poppler-qt4.h" +#include "poppler-embeddedfile-private.h" + +class LinkDest; +class FormWidget; + +namespace Poppler { + + /* borrowed from kpdf */ + QString unicodeToQString(Unicode* u, int len); + + QString UnicodeParsedString(GooString *s1); + + GooString *QStringToUnicodeGooString(const QString &s); + + GooString *QStringToGooString(const QString &s); + + void qt4ErrorFunction(int pos, char *msg, va_list args); + + class LinkDestinationData + { + public: + LinkDestinationData( LinkDest *l, GooString *nd, Poppler::DocumentData *pdfdoc, bool external ) + : ld(l), namedDest(nd), doc(pdfdoc), externalDest(external) + { + } + + LinkDest *ld; + GooString *namedDest; + Poppler::DocumentData *doc; + bool externalDest; + }; + + class DocumentData { + public: + DocumentData(const QString &filePath, GooString *ownerPassword, GooString *userPassword) + { + init(); + m_filePath = filePath; + +#if defined(_WIN32) + wchar_t *fileName = new WCHAR[filePath.length()]; + int length = filePath.toWCharArray(fileName); + doc = new PDFDoc(fileName, length, ownerPassword, userPassword); + delete fileName; +#else + GooString *fileName = new GooString(QFile::encodeName(filePath)); + doc = new PDFDoc(fileName, ownerPassword, userPassword); +#endif + + delete ownerPassword; + delete userPassword; + } + + DocumentData(const QByteArray &data, GooString *ownerPassword, GooString *userPassword) + { + Object obj; + fileContents = data; + obj.initNull(); + MemStream *str = new MemStream((char*)fileContents.data(), 0, fileContents.length(), &obj); + init(); + doc = new PDFDoc(str, ownerPassword, userPassword); + delete ownerPassword; + delete userPassword; + } + + void init(); + + ~DocumentData(); + + OutputDev *getOutputDev() + { + if (!m_outputDev) + { + switch (m_backend) + { + case Document::ArthurBackend: + // create a splash backend even in case of the Arthur Backend + case Document::SplashBackend: + { +#if defined(HAVE_SPLASH) + SplashColor bgColor; + GBool overprint = m_hints & Document::OverprintPreview ? gTrue : gFalse; + globalParams->setOverprintPreview(overprint); +#if defined(SPLASH_CMYK) + if (overprint) + { + Guchar c, m, y, k; + + c = 255 - paperColor.blue(); + m = 255 - paperColor.red(); + y = 255 - paperColor.green(); + k = c; + if (m < k) { + k = m; + } + if (y < k) { + k = y; + } + bgColor[0] = c - k; + bgColor[1] = m - k; + bgColor[2] = y - k; + bgColor[3] = k; + for (int i = 4; i < SPOT_NCOMPS + 4; i++) { + bgColor[i] = 0; + } + } + else +#endif + { + bgColor[0] = paperColor.blue(); + bgColor[1] = paperColor.green(); + bgColor[2] = paperColor.red(); + } + GBool AA = m_hints & Document::TextAntialiasing ? gTrue : gFalse; + SplashOutputDev * splashOutputDev = new SplashOutputDev( +#if defined(SPLASH_CMYK) + (overprint) ? splashModeDeviceN8 : splashModeXBGR8, +#else + splashModeXBGR8, +#endif + 4, gFalse, bgColor, gTrue, AA); + splashOutputDev->setVectorAntialias(m_hints & Document::Antialiasing ? gTrue : gFalse); + splashOutputDev->setFreeTypeHinting(m_hints & Document::TextHinting ? gTrue : gFalse, m_hints & Document::TextSlightHinting ? gTrue : gFalse); + splashOutputDev->startDoc(doc); + m_outputDev = splashOutputDev; +#endif + break; + } + } + } + return m_outputDev; + } + + void addTocChildren( QDomDocument * docSyn, QDomNode * parent, GooList * items ); + + void setPaperColor(const QColor &color) + { + if (color == paperColor) + return; + + paperColor = color; + + // Make sure the new paper color will be picked up for the next rendering + delete m_outputDev; + m_outputDev = NULL; + } + + void fillMembers() + { + m_fontInfoIterator = new FontIterator(0, this); + int numEmb = doc->getCatalog()->numEmbeddedFiles(); + if (!(0 == numEmb)) { + // we have some embedded documents, build the list + for (int yalv = 0; yalv < numEmb; ++yalv) { + FileSpec *fs = doc->getCatalog()->embeddedFile(yalv); + m_embeddedFiles.append(new EmbeddedFile(*new EmbeddedFileData(fs))); + } + } + } + + static Document *checkDocument(DocumentData *doc); + + PDFDoc *doc; + QString m_filePath; + QByteArray fileContents; + bool locked; + FontIterator *m_fontInfoIterator; + Document::RenderBackend m_backend; + OutputDev *m_outputDev; + QList m_embeddedFiles; + QPointer m_optContentModel; + QColor paperColor; + int m_hints; + static int count; + }; + + class FontInfoData + { + public: + FontInfoData() + { + isEmbedded = false; + isSubset = false; + type = FontInfo::unknown; + } + + FontInfoData( const FontInfoData &fid ) + { + fontName = fid.fontName; + fontFile = fid.fontFile; + isEmbedded = fid.isEmbedded; + isSubset = fid.isSubset; + type = fid.type; + embRef = fid.embRef; + } + + FontInfoData( ::FontInfo* fi ) + { + if (fi->getName()) fontName = fi->getName()->getCString(); + if (fi->getFile()) fontFile = fi->getFile()->getCString(); + isEmbedded = fi->getEmbedded(); + isSubset = fi->getSubset(); + type = (Poppler::FontInfo::Type)fi->getType(); + embRef = fi->getEmbRef(); + } + + QString fontName; + QString fontFile; + bool isEmbedded : 1; + bool isSubset : 1; + FontInfo::Type type; + Ref embRef; + }; + + class FontIteratorData + { + public: + FontIteratorData( int startPage, DocumentData *dd ) + : fontInfoScanner( dd->doc, startPage ) + , totalPages( dd->doc->getNumPages() ) + , currentPage( qMax( startPage, 0 ) - 1 ) + { + } + + ~FontIteratorData() + { + } + + FontInfoScanner fontInfoScanner; + int totalPages; + int currentPage; + }; + + class TextBoxData + { + public: + TextBoxData() + : nextWord(0), hasSpaceAfter(false) + { + } + + QString text; + QRectF bBox; + TextBox *nextWord; + QVector charBBoxes; // the boundingRect of each character + bool hasSpaceAfter; + }; + + class FormFieldData + { + public: + FormFieldData(DocumentData *_doc, ::Page *p, ::FormWidget *w) : + doc(_doc), page(p), fm(w) + { + } + + DocumentData *doc; + ::Page *page; + ::FormWidget *fm; + QRectF box; + }; + +} + +#endif diff --git a/dependencies/poppler/include/poppler-qiodeviceoutstream-private.h b/dependencies/poppler/include/poppler-qiodeviceoutstream-private.h new file mode 100644 index 00000000..e7faa294 --- /dev/null +++ b/dependencies/poppler/include/poppler-qiodeviceoutstream-private.h @@ -0,0 +1,46 @@ +/* poppler-qiodevicestream-private.h: Qt4 interface to poppler + * Copyright (C) 2008, Pino Toscano + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POPPLER_QIODEVICESTREAM_PRIVATE_H +#define POPPLER_QIODEVICESTREAM_PRIVATE_H + +#include "Object.h" +#include "Stream.h" + +class QIODevice; + +namespace Poppler { + +class QIODeviceOutStream : public OutStream +{ + public: + QIODeviceOutStream(QIODevice* device); + virtual ~QIODeviceOutStream(); + + virtual void close(); + virtual int getPos(); + virtual void put(char c); + virtual void printf(const char *format, ...); + + private: + QIODevice *m_device; +}; + +} + +#endif diff --git a/dependencies/poppler/include/poppler-qt4.h b/dependencies/poppler/include/poppler-qt4.h new file mode 100644 index 00000000..f4f6fc65 --- /dev/null +++ b/dependencies/poppler/include/poppler-qt4.h @@ -0,0 +1,1809 @@ +/* poppler-qt.h: qt interface to poppler + * Copyright (C) 2005, Net Integration Technologies, Inc. + * Copyright (C) 2005, 2007, Brad Hards + * Copyright (C) 2005-2012, Albert Astals Cid + * Copyright (C) 2005, Stefan Kebekus + * Copyright (C) 2006-2011, Pino Toscano + * Copyright (C) 2009 Shawn Rutledge + * Copyright (C) 2010 Suzuki Toshiya + * Copyright (C) 2010 Matthias Fauconneau + * Copyright (C) 2011 Andreas Hartmetz + * Copyright (C) 2011 Glad Deschrijver + * Copyright (C) 2012, Guillermo A. Amaral B. + * Copyright (C) 2012, Fabio D'Urso + * Copyright (C) 2012, Tobias Koenig + * Copyright (C) 2012 Adam Reichold + * Copyright (C) 2012 Thomas Freitag + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef __POPPLER_QT_H__ +#define __POPPLER_QT_H__ + +#include "poppler-annotation.h" +#include "poppler-link.h" +#include "poppler-optcontent.h" +#include "poppler-page-transition.h" + +#include +#include +#include +#include +#include "poppler-export.h" + +class EmbFile; +class Sound; +class AnnotMovie; + +/** + The %Poppler Qt4 binding. +*/ +namespace Poppler { + + class Document; + class DocumentData; + + class PageData; + + class FormField; + + class TextBoxData; + + class PDFConverter; + class PSConverter; + + /** + Debug/error function. + + This function type is used for debugging & error output; + the first parameter is the actual message, the second is the unaltered + closure argument which was passed to the setDebugErrorFunction call. + + \since 0.16 + */ + typedef void (*PopplerDebugFunc)(const QString & /*message*/, const QVariant & /*closure*/); + + /** + Set a new debug/error output function. + + If not set, by default error and debug messages will be sent to the + Qt \p qDebug() function. + + \param debugFunction the new debug function + \param closure user data which will be passes as-is to the debug function + + \since 0.16 + */ + POPPLER_QT4_EXPORT void setDebugErrorFunction(PopplerDebugFunc debugFunction, const QVariant &closure); + + /** + Describes the physical location of text on a document page + + This very simple class describes the physical location of text + on the page. It consists of + - a QString that contains the text + - a QRectF that gives a box that describes where on the page + the text is found. + */ + class POPPLER_QT4_EXPORT TextBox { + friend class Page; + public: + /** + The default constructor sets the \p text and the rectangle that + contains the text. Coordinated for the \p bBox are in points = + 1/72 of an inch. + */ + TextBox(const QString& text, const QRectF &bBox); + /** + Destructor. + */ + ~TextBox(); + + /** + Returns the text of this text box + */ + QString text() const; + + /** + Returns the position of the text, in point, i.e., 1/72 of + an inch + + \since 0.8 + */ + QRectF boundingBox() const; + + /** + Returns the pointer to the next text box, if there is one. + + Otherwise, it returns a null pointer. + */ + TextBox *nextWord() const; + + /** + Returns the bounding box of the \p i -th characted of the word. + */ + QRectF charBoundingBox(int i) const; + + /** + Returns whether there is a space character after this text box + */ + bool hasSpaceAfter() const; + + private: + Q_DISABLE_COPY(TextBox) + + TextBoxData *m_data; + }; + + + class FontInfoData; + /** + Container class for information about a font within a PDF + document + */ + class POPPLER_QT4_EXPORT FontInfo { + friend class Document; + public: + /** + The type of font. + */ + enum Type { + unknown, + Type1, + Type1C, + Type1COT, + Type3, + TrueType, + TrueTypeOT, + CIDType0, + CIDType0C, + CIDType0COT, + CIDTrueType, + CIDTrueTypeOT + }; + + /// \cond PRIVATE + /** + Create a new font information container. + */ + FontInfo(); + + /** + Create a new font information container. + */ + FontInfo( const FontInfoData &fid ); + /// \endcond + + /** + Copy constructor. + */ + FontInfo( const FontInfo &fi ); + + /** + Destructor. + */ + ~FontInfo(); + + /** + The name of the font. Can be QString::null if the font has no name + */ + QString name() const; + + /** + The path of the font file used to represent this font on this system, + or a null string is the font is embedded + */ + QString file() const; + + /** + Whether the font is embedded in the file, or not + + \return true if the font is embedded + */ + bool isEmbedded() const; + + /** + Whether the font provided is only a subset of the full + font or not. This only has meaning if the font is embedded. + + \return true if the font is only a subset + */ + bool isSubset() const; + + /** + The type of font encoding + + \return a enumerated value corresponding to the font encoding used + + \sa typeName for a string equivalent + */ + Type type() const; + + /** + The name of the font encoding used + + \note if you are looking for the name of the font (as opposed to the + encoding format used), you probably want name(). + + \sa type for a enumeration version + */ + QString typeName() const; + + /** + Standard assignment operator + */ + FontInfo& operator=( const FontInfo &fi ); + + private: + FontInfoData *m_data; + }; + + + class FontIteratorData; + /** + Iterator for reading the fonts in a document. + + FontIterator provides a Java-style iterator for reading the fonts in a + document. + + You can use it in the following way: + \code +Poppler::FontIterator* it = doc->newFontIterator(); +while (it->hasNext()) { + QList fonts = it->next(); + // do something with the fonts +} +// after doing the job, the iterator must be freed +delete it; + \endcode + + \since 0.12 + */ + class POPPLER_QT4_EXPORT FontIterator { + friend class Document; + friend class DocumentData; + public: + /** + Destructor. + */ + ~FontIterator(); + + /** + Returns the fonts of the current page and then advances the iterator + to the next page. + */ + QList next(); + + /** + Checks whether there is at least one more page to iterate, ie returns + false when the iterator is beyond the last page. + */ + bool hasNext() const; + + /** + Returns the current page where the iterator is. + */ + int currentPage() const; + + private: + Q_DISABLE_COPY( FontIterator ) + FontIterator( int, DocumentData *dd ); + + FontIteratorData *d; + }; + + + class EmbeddedFileData; + /** + Container class for an embedded file with a PDF document + */ + class POPPLER_QT4_EXPORT EmbeddedFile { + friend class DocumentData; + friend class AnnotationPrivate; + public: + /// \cond PRIVATE + EmbeddedFile(EmbFile *embfile); + /// \endcond + + /** + Destructor. + */ + ~EmbeddedFile(); + + /** + The name associated with the file + */ + QString name() const; + + /** + The description associated with the file, if any. + + This will return an empty QString if there is no description element + */ + QString description() const; + + /** + The size of the file. + + This will return < 0 if there is no size element + */ + int size() const; + + /** + The modification date for the embedded file, if known. + */ + QDateTime modDate() const; + + /** + The creation date for the embedded file, if known. + */ + QDateTime createDate() const; + + /** + The MD5 checksum of the file. + + This will return an empty QByteArray if there is no checksum element. + */ + QByteArray checksum() const; + + /** + The MIME type of the file, if known. + + \since 0.8 + */ + QString mimeType() const; + + /** + The data as a byte array + */ + QByteArray data(); + + /** + Is the embedded file valid? + + \since 0.12 + */ + bool isValid() const; + + /** + A QDataStream for the actual data? + */ + //QDataStream dataStream() const; + + private: + Q_DISABLE_COPY(EmbeddedFile) + EmbeddedFile(EmbeddedFileData &dd); + + EmbeddedFileData *m_embeddedFile; + }; + + + /** + \brief A page in a document. + + The Page class represents a single page within a PDF document. + + You cannot construct a Page directly, but you have to use the Document + functions that return a new Page out of an index or a label. + */ + class POPPLER_QT4_EXPORT Page { + friend class Document; + public: + /** + Destructor. + */ + ~Page(); + + /** + The type of rotation to apply for an operation + */ + enum Rotation { Rotate0 = 0, ///< Do not rotate + Rotate90 = 1, ///< Rotate 90 degrees clockwise + Rotate180 = 2, ///< Rotate 180 degrees + Rotate270 = 3 ///< Rotate 270 degrees clockwise (90 degrees counterclockwise) + }; + + /** + The kinds of page actions + */ + enum PageAction { + Opening, ///< The action when a page is "opened" + Closing ///< The action when a page is "closed" + }; + + /** + How the text is going to be returned + \since 0.16 + */ + enum TextLayout { + PhysicalLayout, ///< The text is layouted to resemble the real page layout + RawOrderLayout ///< The text is returned without any type of processing + }; + + /** + Additional flags for the renderToPainter method + \since 0.16 + */ + enum PainterFlag { + /** + Do not save/restore the caller-owned painter. + + renderToPainter() by default preserves, using save() + restore(), + the state of the painter specified; if this is not needed, this + flag can avoid this job + */ + DontSaveAndRestore = 0x00000001 + }; + Q_DECLARE_FLAGS( PainterFlags, PainterFlag ) + + /** + Render the page to a QImage using the current + \link Document::renderBackend() Document renderer\endlink. + + If \p x = \p y = \p w = \p h = -1, the method will automatically + compute the size of the image from the horizontal and vertical + resolutions specified in \p xres and \p yres. Otherwise, the + method renders only a part of the page, specified by the + parameters (\p x, \p y, \p w, \p h) in pixel coordinates. The returned + QImage then has size (\p w, \p h), independent of the page + size. + + \param x specifies the left x-coordinate of the box, in + pixels. + + \param y specifies the top y-coordinate of the box, in + pixels. + + \param w specifies the width of the box, in pixels. + + \param h specifies the height of the box, in pixels. + + \param xres horizontal resolution of the graphics device, + in dots per inch + + \param yres vertical resolution of the graphics device, in + dots per inch + + \param rotate how to rotate the page + + \warning The parameter (\p x, \p y, \p w, \p h) are not + well-tested. Unusual or meaningless parameters may lead to + rather unexpected results. + + \returns a QImage of the page, or a null image on failure. + + \since 0.6 + */ + QImage renderToImage(double xres=72.0, double yres=72.0, int x=-1, int y=-1, int w=-1, int h=-1, Rotation rotate = Rotate0) const; + + /** + Render the page to the specified QPainter using the current + \link Document::renderBackend() Document renderer\endlink. + + If \p x = \p y = \p w = \p h = -1, the method will automatically + compute the size of the page area from the horizontal and vertical + resolutions specified in \p xres and \p yres. Otherwise, the + method renders only a part of the page, specified by the + parameters (\p x, \p y, \p w, \p h) in pixel coordinates. + + \param painter the painter to paint on + + \param x specifies the left x-coordinate of the box, in + pixels. + + \param y specifies the top y-coordinate of the box, in + pixels. + + \param w specifies the width of the box, in pixels. + + \param h specifies the height of the box, in pixels. + + \param xres horizontal resolution of the graphics device, + in dots per inch + + \param yres vertical resolution of the graphics device, in + dots per inch + + \param rotate how to rotate the page + + \param flags additional painter flags + + \warning The parameter (\p x, \p y, \p w, \p h) are not + well-tested. Unusual or meaningless parameters may lead to + rather unexpected results. + + \returns whether the painting succeeded + + \note This method is only supported for Arthur + + \since 0.16 + */ + bool renderToPainter(QPainter* painter, double xres=72.0, double yres=72.0, int x=-1, int y=-1, int w=-1, int h=-1, + Rotation rotate = Rotate0, PainterFlags flags = 0) const; + + /** + Get the page thumbnail if it exists. + + \return a QImage of the thumbnail, or a null image + if the PDF does not contain one for this page + + \since 0.12 + */ + QImage thumbnail() const; + + /** + Returns the text that is inside a specified rectangle + + \param rect the rectangle specifying the area of interest, + with coordinates given in points, i.e., 1/72th of an inch. + If rect is null, all text on the page is given + + \since 0.16 + **/ + QString text(const QRectF &rect, TextLayout textLayout) const; + + /** + Returns the text that is inside a specified rectangle. + The text is returned using the physical layout of the page + + \param rect the rectangle specifying the area of interest, + with coordinates given in points, i.e., 1/72th of an inch. + If rect is null, all text on the page is given + **/ + QString text(const QRectF &rect) const; + + /** + The starting point for a search + */ + enum SearchDirection { FromTop, ///< Start sorting at the top of the document + NextResult, ///< Find the next result, moving "down the page" + PreviousResult ///< Find the previous result, moving "up the page" + }; + + /** + The type of search to perform + */ + enum SearchMode { CaseSensitive, ///< Case differences cause no match in searching + CaseInsensitive ///< Case differences are ignored in matching + }; + + /** + Returns true if the specified text was found. + + \param text the text the search + \param rect in all directions is used to return where the text was found, for NextResult and PreviousResult + indicates where to continue searching for + \param direction in which direction do the search + \param caseSensitive be case sensitive? + \param rotate the rotation to apply for the search order + **/ + Q_DECL_DEPRECATED bool search(const QString &text, QRectF &rect, SearchDirection direction, SearchMode caseSensitive, Rotation rotate = Rotate0) const; + + /** + Returns true if the specified text was found. + + \param text the text the search + \param rectXXX in all directions is used to return where the text was found, for NextResult and PreviousResult + indicates where to continue searching for + \param direction in which direction do the search + \param caseSensitive be case sensitive? + \param rotate the rotation to apply for the search order + \since 0.14 + **/ + bool search(const QString &text, double &rectLeft, double &rectTop, double &rectRight, double &rectBottom, SearchDirection direction, SearchMode caseSensitive, Rotation rotate = Rotate0) const; + + /** + Returns a list of all occurrences of the specified text on the page. + + \param text the text to search + \param caseSensitive whether to be case sensitive + \param rotate the rotation to apply for the search order + + \warning Do not use the returned QRectF as arguments of another search call because of truncation issues if qreal is defined as float. + + \since 0.22 + **/ + QList search(const QString &text, SearchMode caseSensitive, Rotation rotate = Rotate0) const; + + /** + Returns a list of text of the page + + This method returns a QList of TextBoxes that contain all + the text of the page, with roughly one text word of text + per TextBox item. + + For text written in western languages (left-to-right and + up-to-down), the QList contains the text in the proper + order. + + \note The caller owns the text boxes and they should + be deleted when no longer required. + + \warning This method is not tested with Asian scripts + */ + QList textList(Rotation rotate = Rotate0) const; + + /** + \return The dimensions (cropbox) of the page, in points (i.e. 1/72th of an inch) + */ + QSizeF pageSizeF() const; + + /** + \return The dimensions (cropbox) of the page, in points (i.e. 1/72th of an inch) + */ + QSize pageSize() const; + + /** + Returns the transition of this page + + \returns a pointer to a PageTransition structure that + defines how transition to this page shall be performed. + + \note The PageTransition structure is owned by this page, and will + automatically be destroyed when this page class is + destroyed. + **/ + PageTransition *transition() const; + + /** + Gets the page action specified, or NULL if there is no action. + + \since 0.6 + **/ + Link *action( PageAction act ) const; + + /** + Types of orientations that are possible + */ + enum Orientation { + Landscape, ///< Landscape orientation (portrait, with 90 degrees clockwise rotation ) + Portrait, ///< Normal portrait orientation + Seascape, ///< Seascape orientation (portrait, with 270 degrees clockwise rotation) + UpsideDown ///< Upside down orientation (portrait, with 180 degrees rotation) + }; + + /** + The orientation of the page + */ + Orientation orientation() const; + + /** + The default CTM + */ + void defaultCTM(double *CTM, double dpiX, double dpiY, int rotate, bool upsideDown); + + /** + Gets the links of the page + */ + QList links() const; + + /** + Returns the annotations of the page + + \note If you call this method twice, you get different objects + pointing to the same annotations (see Annotation). + The caller owns the returned objects and they should be deleted + when no longer required. + */ + QList annotations() const; + + /** + Adds an annotation to the page + + \note Ownership of the annotation object stays with the caller, who can + delete it at any time. + \since 0.20 + */ + void addAnnotation( const Annotation *ann ); + + /** + Removes an annotation from the page and destroys the annotation object + + \note There mustn't be other Annotation objects pointing this annotation + \since 0.20 + */ + void removeAnnotation( const Annotation *ann ); + + /** + Returns the form fields on the page + The caller gets the ownership of the returned objects. + + \since 0.6 + */ + QList formFields() const; + + /** + Returns the page duration. That is the time, in seconds, that the page + should be displayed before the presentation automatically advances to the next page. + Returns < 0 if duration is not set. + + \since 0.6 + */ + double duration() const; + + /** + Returns the label of the page, or a null string is the page has no label. + + \since 0.6 + **/ + QString label() const; + + private: + Q_DISABLE_COPY(Page) + + Page(DocumentData *doc, int index); + PageData *m_page; + }; + +/** + \brief PDF document. + + The Document class represents a PDF document: its pages, and all the global + properties, metadata, etc. + + \section ownership Ownership of the returned objects + + All the functions that returns class pointers create new object, and the + responsability of those is given to the callee. + + The only exception is \link Poppler::Page::transition() Page::transition()\endlink. + + \section document-loading Loading + + To get a Document, you have to load it via the load() & loadFromData() + functions. + + In all the functions that have passwords as arguments, they \b must be Latin1 + encoded. If you have a password that is a UTF-8 string, you need to use + QString::toLatin1() (or similar) to convert the password first. + If you have a UTF-8 character array, consider converting it to a QString first + (QString::fromUtf8(), or similar) before converting to Latin1 encoding. + + \section document-rendering Rendering + + To render pages of a document, you have different Document functions to set + various options. + + \subsection document-rendering-backend Backends + + %Poppler offers a different backends for rendering the pages. Currently + there are two backends (see #RenderBackend), but only the Splash engine works + well and has been tested. + + The available rendering backends can be discovered via availableRenderBackends(). + The current rendering backend can be changed using setRenderBackend(). + Please note that setting a backend not listed in the available ones + will always result in null QImage's. + + \section document-cms Color management support + + %Poppler, if compiled with this support, provides functions to handle color + profiles. + + To know whether the %Poppler version you are using has support for color + management, you can query Poppler::isCmsAvailable(). In case it is not + avilable, all the color management-related functions will either do nothing + or return null. +*/ + class POPPLER_QT4_EXPORT Document { + friend class Page; + friend class DocumentData; + + public: + /** + The page mode + */ + enum PageMode { + UseNone, ///< No mode - neither document outline nor thumbnail images are visible + UseOutlines, ///< Document outline visible + UseThumbs, ///< Thumbnail images visible + FullScreen, ///< Fullscreen mode (no menubar, windows controls etc) + UseOC, ///< Optional content group panel visible + UseAttach ///< Attachments panel visible + }; + + /** + The page layout + */ + enum PageLayout { + NoLayout, ///< Layout not specified + SinglePage, ///< Display a single page + OneColumn, ///< Display a single column of pages + TwoColumnLeft, ///< Display the pages in two columns, with odd-numbered pages on the left + TwoColumnRight, ///< Display the pages in two columns, with odd-numbered pages on the right + TwoPageLeft, ///< Display the pages two at a time, with odd-numbered pages on the left + TwoPageRight ///< Display the pages two at a time, with odd-numbered pages on the right + }; + + /** + The render backends available + + \since 0.6 + */ + enum RenderBackend { + SplashBackend, ///< Splash backend + ArthurBackend ///< Arthur (Qt4) backend + }; + + /** + The render hints available + + \since 0.6 + */ + enum RenderHint { + Antialiasing = 0x00000001, ///< Antialiasing for graphics + TextAntialiasing = 0x00000002, ///< Antialiasing for text + TextHinting = 0x00000004, ///< Hinting for text \since 0.12.1 + TextSlightHinting = 0x00000008, ///< Lighter hinting for text when combined with TextHinting \since 0.18 + OverprintPreview = 0x00000010 ///< Overprint preview \since 0.22 + }; + Q_DECLARE_FLAGS( RenderHints, RenderHint ) + + /** + Form types + + \since 0.22 + */ + enum FormType { + NoForm, ///< Document doesn't contain forms + AcroForm, ///< AcroForm + XfaForm ///< Adobe XML Forms Architecture (XFA), currently unsupported + }; + + /** + Set a color display profile for the current document. + + \param outputProfileA is a \c cmsHPROFILE of the LCMS library. + + \since 0.12 + */ + void setColorDisplayProfile(void *outputProfileA); + /** + Set a color display profile for the current document. + + \param name is the name of the display profile to set. + + \since 0.12 + */ + void setColorDisplayProfileName(const QString &name); + /** + Return the current RGB profile. + + \return a \c cmsHPROFILE of the LCMS library. + + \since 0.12 + */ + void* colorRgbProfile() const; + /** + Return the current display profile. + + \return a \c cmsHPROFILE of the LCMS library. + + \since 0.12 + */ + void *colorDisplayProfile() const; + + /** + Load the document from a file on disk + + \param filePath the name (and path, if required) of the file to load + \param ownerPassword the Latin1-encoded owner password to use in + loading the file + \param userPassword the Latin1-encoded user ("open") password + to use in loading the file + + \return the loaded document, or NULL on error + + \note The caller owns the pointer to Document, and this should + be deleted when no longer required. + + \warning The returning document may be locked if a password is required + to open the file, and one is not provided (as the userPassword). + */ + static Document *load(const QString & filePath, + const QByteArray &ownerPassword=QByteArray(), + const QByteArray &userPassword=QByteArray()); + + /** + Load the document from memory + + \param fileContents the file contents. They are copied so there is no need + to keep the byte array around for the full life time of + the document. + \param ownerPassword the Latin1-encoded owner password to use in + loading the file + \param userPassword the Latin1-encoded user ("open") password + to use in loading the file + + \return the loaded document, or NULL on error + + \note The caller owns the pointer to Document, and this should + be deleted when no longer required. + + \warning The returning document may be locked if a password is required + to open the file, and one is not provided (as the userPassword). + + \since 0.6 + */ + static Document *loadFromData(const QByteArray &fileContents, + const QByteArray &ownerPassword=QByteArray(), + const QByteArray &userPassword=QByteArray()); + + /** + Get a specified Page + + Note that this follows the PDF standard of being zero based - if you + want the first page, then you need an index of zero. + + The caller gets the ownership of the returned object. + + \param index the page number index + */ + Page *page(int index) const; + + /** + \overload + + + The intent is that you can pass in a label like \c "ix" and + get the page with that label (which might be in the table of + contents), or pass in \c "1" and get the page that the user + expects (which might not be the first page, if there is a + title page and a table of contents). + + \param label the page label + */ + Page *page(const QString &label) const; + + /** + The number of pages in the document + */ + int numPages() const; + + /** + The type of mode that should be used by the application + when the document is opened. Note that while this is + called page mode, it is really viewer application mode. + */ + PageMode pageMode() const; + + /** + The layout that pages should be shown in when the document + is first opened. This basically describes how pages are + shown relative to each other. + */ + PageLayout pageLayout() const; + + /** + Provide the passwords required to unlock the document + + \param ownerPassword the Latin1-encoded owner password to use in + loading the file + \param userPassword the Latin1-encoded user ("open") password + to use in loading the file + */ + bool unlock(const QByteArray &ownerPassword, const QByteArray &userPassword); + + /** + Determine if the document is locked + */ + bool isLocked() const; + + /** + The date associated with the document + + You would use this method with something like: + \code +QDateTime created = m_doc->date("CreationDate"); +QDateTime modified = m_doc->date("ModDate"); + \endcode + + The available dates are: + - CreationDate: the date of creation of the document + - ModDate: the date of the last change in the document + + \param data the type of date that is required + */ + QDateTime date( const QString & data ) const; + + /** + Get specified information associated with the document + + You would use this method with something like: + \code +QString title = m_doc->info("Title"); +QString subject = m_doc->info("Subject"); + \endcode + + In addition to \c Title and \c Subject, other information that may + be available include \c Author, \c Keywords, \c Creator and \c Producer. + + \param data the information that is required + + \sa infoKeys() to get a list of the available keys + */ + QString info( const QString & data ) const; + + /** + Obtain a list of the available string information keys. + */ + QStringList infoKeys() const; + + /** + Test if the document is encrypted + */ + bool isEncrypted() const; + + /** + Test if the document is linearised + + In some cases, this is called "fast web view", since it + is mostly an optimisation for viewing over the Web. + */ + bool isLinearized() const; + + /** + Test if the permissions on the document allow it to be + printed + */ + bool okToPrint() const; + + /** + Test if the permissions on the document allow it to be + printed at high resolution + */ + bool okToPrintHighRes() const; + + /** + Test if the permissions on the document allow it to be + changed. + + \note depending on the type of change, it may be more + appropriate to check other properties as well. + */ + bool okToChange() const; + + /** + Test if the permissions on the document allow the + contents to be copied / extracted + */ + bool okToCopy() const; + + /** + Test if the permissions on the document allow annotations + to be added or modified, and interactive form fields (including + signature fields) to be completed. + */ + bool okToAddNotes() const; + + /** + Test if the permissions on the document allow interactive + form fields (including signature fields) to be completed. + + \note this can be true even if okToAddNotes() is false - this + means that only form completion is permitted. + */ + bool okToFillForm() const; + + /** + Test if the permissions on the document allow interactive + form fields (including signature fields) to be set, created and + modified + */ + bool okToCreateFormFields() const; + + /** + Test if the permissions on the document allow content extraction + (text and perhaps other content) for accessibility usage (eg for + a screen reader) + */ + bool okToExtractForAccessibility() const; + + /** + Test if the permissions on the document allow it to be + "assembled" - insertion, rotation and deletion of pages; + or creation of bookmarks and thumbnail images. + + \note this can be true even if okToChange() is false + */ + bool okToAssemble() const; + + /** + The version of the PDF specification that the document + conforms to + + \deprecated use getPdfVersion and avoid float point + comparisons/handling + */ + Q_DECL_DEPRECATED double pdfVersion() const; + + /** + The version of the PDF specification that the document + conforms to + + \param major an optional pointer to a variable where store the + "major" number of the version + \param minor an optional pointer to a variable where store the + "minor" number of the version + + \since 0.12 + */ + void getPdfVersion(int *major, int *minor) const; + + /** + The fonts within the PDF document. + + This is a shorthand for getting all the fonts at once. + + \note this can take a very long time to run with a large + document. You may wish to use a FontIterator if you have more + than say 20 pages + + \see newFontIterator() + */ + QList fonts() const; + + /** + Scans for fonts within the PDF document. + + \param numPages the number of pages to scan + \param fontList pointer to the list where the font information + should be placed + + \note with this method you can scan for fonts only \em once for each + document; once the end is reached, no more scanning with this method + can be done + + \return false if the end of the document has been reached + + \deprecated this function is quite limited in its job (see note), + better use fonts() or newFontIterator() + + \see fonts(), newFontIterator() + */ + Q_DECL_DEPRECATED bool scanForFonts( int numPages, QList *fontList ) const; + + /** + Creates a new FontIterator object for font scanning. + + The new iterator can be used for reading the font information of the + document, reading page by page. + + The caller is responsible for the returned object, ie it should freed + it when no more useful. + + \param startPage the initial page from which start reading fonts + + \see fonts() + + \since 0.12 + */ + FontIterator* newFontIterator( int startPage = 0 ) const; + + /** + The font data if the font is an embedded one. + + \since 0.10 + */ + QByteArray fontData(const FontInfo &font) const; + + /** + The documents embedded within the PDF document. + + \note there are two types of embedded document - this call + only accesses documents that are embedded at the document level. + */ + QList embeddedFiles() const; + + /** + Whether there are any documents embedded in this PDF document. + */ + bool hasEmbeddedFiles() const; + + /** + Gets the table of contents (TOC) of the Document. + + The caller is responsable for the returned object. + + In the tree the tag name is the 'screen' name of the entry. A tag can have + attributes. Here follows the list of tag attributes with meaning: + - Destination: A string description of the referred destination + - DestinationName: A 'named reference' to the viewport + - ExternalFileName: A link to a external filename + - Open: A bool value that tells whether the subbranch of the item is open or not + + Resolving the final destination for each item can be done in the following way: + - first, checking for 'Destination': if not empty, then a LinkDestination + can be constructed straight with it + - as second step, if the 'DestinationName' is not empty, then the destination + can be resolved using linkDestination() + + Note also that if 'ExternalFileName' is not emtpy, then the destination refers + to that document (and not to the current one). + + \returns the TOC, or NULL if the Document does not have one + */ + QDomDocument *toc() const; + + /** + Tries to resolve the named destination \p name. + + \note this operation starts a search through the whole document + + \returns a new LinkDestination object if the named destination was + actually found, or NULL otherwise + */ + LinkDestination *linkDestination( const QString &name ); + + /** + Sets the paper color + + \param color the new paper color + */ + void setPaperColor(const QColor &color); + /** + The paper color + + The default color is white. + */ + QColor paperColor() const; + + /** + Sets the backend used to render the pages. + + \param backend the new rendering backend + + \since 0.6 + */ + void setRenderBackend( RenderBackend backend ); + /** + The currently set render backend + + The default backend is \ref SplashBackend + + \since 0.6 + */ + RenderBackend renderBackend() const; + + /** + The available rendering backends. + + \since 0.6 + */ + static QSet availableRenderBackends(); + + /** + Sets the render \p hint . + + \note some hints may not be supported by some rendering backends. + + \param on whether the flag should be added or removed. + + \since 0.6 + */ + void setRenderHint( RenderHint hint, bool on = true ); + /** + The currently set render hints. + + \since 0.6 + */ + RenderHints renderHints() const; + + /** + Gets a new PS converter for this document. + + The caller gets the ownership of the returned converter. + + \since 0.6 + */ + PSConverter *psConverter() const; + + /** + Gets a new PDF converter for this document. + + The caller gets the ownership of the returned converter. + + \since 0.8 + */ + PDFConverter *pdfConverter() const; + + /** + Gets the metadata stream contents + + \since 0.6 + */ + QString metadata() const; + + /** + Test whether this document has "optional content". + + Optional content is used to optionally turn on (display) + and turn off (not display) some elements of the document. + The most common use of this is for layers in design + applications, but it can be used for a range of things, + such as not including some content in printing, and + displaying content in the appropriate language. + + \since 0.8 + */ + bool hasOptionalContent() const; + + /** + Itemviews model for optional content. + + The model is owned by the document. + + \since 0.8 + */ + OptContentModel *optionalContentModel(); + + /** + Document-level JavaScript scripts. + + Returns the list of document level JavaScript scripts to be always + executed before any other script. + + \since 0.10 + */ + QStringList scripts() const; + + /** + The PDF identifiers. + + \param permanentId an optional pointer to a variable where store the + permanent ID of the document + \param updateId an optional pointer to a variable where store the + update ID of the document + + \return whether the document has the IDs + + \since 0.16 + */ + bool getPdfId(QByteArray *permanentId, QByteArray *updateId) const; + + /** + Returns the type of forms contained in the document + + \since 0.22 + */ + FormType formType() const; + + /** + Destructor. + */ + ~Document(); + + private: + Q_DISABLE_COPY(Document) + + DocumentData *m_doc; + + Document(DocumentData *dataA); + }; + + class BaseConverterPrivate; + class PSConverterPrivate; + class PDFConverterPrivate; + /** + \brief Base converter. + + This is the base class for the converters. + + \since 0.8 + */ + class POPPLER_QT4_EXPORT BaseConverter + { + friend class Document; + public: + /** + Destructor. + */ + virtual ~BaseConverter(); + + /** Sets the output file name. You must set this or the output device. */ + void setOutputFileName(const QString &outputFileName); + + /** + * Sets the output device. You must set this or the output file name. + * + * \since 0.8 + */ + void setOutputDevice(QIODevice *device); + + /** + Does the conversion. + + \return whether the conversion succeeded + */ + virtual bool convert() = 0; + + enum Error + { + NoError, + FileLockedError, + OpenOutputError, + NotSupportedInputFileError + }; + + /** + Returns the last error + \since 0.12.1 + */ + Error lastError() const; + + protected: + /// \cond PRIVATE + BaseConverter(BaseConverterPrivate &dd); + Q_DECLARE_PRIVATE(BaseConverter) + BaseConverterPrivate *d_ptr; + /// \endcond + + private: + Q_DISABLE_COPY(BaseConverter) + }; + + /** + Converts a PDF to PS + + Sizes have to be in Points (1/72 inch) + + If you are using QPrinter you can get paper size by doing: + \code +QPrinter dummy(QPrinter::PrinterResolution); +dummy.setFullPage(true); +dummy.setPageSize(myPageSize); +width = dummy.width(); +height = dummy.height(); + \endcode + + \since 0.6 + */ + class POPPLER_QT4_EXPORT PSConverter : public BaseConverter + { + friend class Document; + public: + /** + Options for the PS export. + + \since 0.10 + */ + enum PSOption { + Printing = 0x00000001, ///< The PS is generated for printing purposes + StrictMargins = 0x00000002, + ForceRasterization = 0x00000004, + PrintToEPS = 0x00000008, ///< Output EPS instead of PS \since 0.20 + HideAnnotations = 0x00000010 ///< Don't print annotations \since 0.20 + }; + Q_DECLARE_FLAGS( PSOptions, PSOption ) + + /** + Destructor. + */ + ~PSConverter(); + + /** Sets the list of pages to print. Mandatory. */ + void setPageList(const QList &pageList); + + /** + Sets the title of the PS Document. Optional + */ + void setTitle(const QString &title); + + /** + Sets the horizontal DPI. Defaults to 72.0 + */ + void setHDPI(double hDPI); + + /** + Sets the vertical DPI. Defaults to 72.0 + */ + void setVDPI(double vDPI); + + /** + Sets the rotate. Defaults to not rotated + */ + void setRotate(int rotate); + + /** + Sets the output paper width. Has to be set. + */ + void setPaperWidth(int paperWidth); + + /** + Sets the output paper height. Has to be set. + */ + void setPaperHeight(int paperHeight); + + /** + Sets the output right margin. Defaults to 0 + */ + void setRightMargin(int marginRight); + + /** + Sets the output bottom margin. Defaults to 0 + */ + void setBottomMargin(int marginBottom); + + /** + Sets the output left margin. Defaults to 0 + */ + void setLeftMargin(int marginLeft); + + /** + Sets the output top margin. Defaults to 0 + */ + void setTopMargin(int marginTop); + + /** + Defines if margins have to be strictly followed (even if that + means changing aspect ratio), or if the margins can be adapted + to keep aspect ratio. + + Defaults to false. + */ + void setStrictMargins(bool strictMargins); + + /** Defines if the page will be rasterized to an image before printing. Defaults to false */ + void setForceRasterize(bool forceRasterize); + + /** + Sets the options for the PS export. + + \since 0.10 + */ + void setPSOptions(PSOptions options); + + /** + The currently set options for the PS export. + + The default flags are: Printing. + + \since 0.10 + */ + PSOptions psOptions() const; + + /** + Sets a function that will be called each time a page is converted. + + The payload belongs to the caller. + + \since 0.16 + */ + void setPageConvertedCallback(void (* callback)(int page, void *payload), void *payload); + + bool convert(); + + private: + Q_DECLARE_PRIVATE(PSConverter) + Q_DISABLE_COPY(PSConverter) + + PSConverter(DocumentData *document); + }; + + /** + Converts a PDF to PDF (thus saves a copy of the document). + + \since 0.8 + */ + class POPPLER_QT4_EXPORT PDFConverter : public BaseConverter + { + friend class Document; + public: + /** + Options for the PDF export. + */ + enum PDFOption { + WithChanges = 0x00000001 ///< The changes done to the document are saved as well + }; + Q_DECLARE_FLAGS( PDFOptions, PDFOption ) + + /** + Destructor. + */ + virtual ~PDFConverter(); + + /** + Sets the options for the PDF export. + */ + void setPDFOptions(PDFOptions options); + /** + The currently set options for the PDF export. + */ + PDFOptions pdfOptions() const; + + bool convert(); + + private: + Q_DECLARE_PRIVATE(PDFConverter) + Q_DISABLE_COPY(PDFConverter) + + PDFConverter(DocumentData *document); + }; + + /** + Conversion from PDF date string format to QDateTime + */ + POPPLER_QT4_EXPORT QDateTime convertDate( char *dateString ); + + /** + Whether the color management functions are available. + + \since 0.12 + */ + POPPLER_QT4_EXPORT bool isCmsAvailable(); + + /** + Whether the overprint preview functionality is available. + + \since 0.22 + */ + POPPLER_QT4_EXPORT bool isOverprintPreviewAvailable(); + + class SoundData; + /** + Container class for a sound file in a PDF document. + + A sound can be either External (in that case should be loaded the file + whose url is represented by url() ), or Embedded, and the player has to + play the data contained in data(). + + \since 0.6 + */ + class POPPLER_QT4_EXPORT SoundObject { + public: + /** + The type of sound + */ + enum SoundType { + External, ///< The real sound file is external + Embedded ///< The sound is contained in the data + }; + + /** + The encoding format used for the sound + */ + enum SoundEncoding { + Raw, ///< Raw encoding, with unspecified or unsigned values in the range [ 0, 2^B - 1 ] + Signed, ///< Twos-complement values + muLaw, ///< mu-law-encoded samples + ALaw ///< A-law-encoded samples + }; + + /// \cond PRIVATE + SoundObject(Sound *popplersound); + /// \endcond + + ~SoundObject(); + + /** + Is the sound embedded (SoundObject::Embedded) or external (SoundObject::External)? + */ + SoundType soundType() const; + + /** + The URL of the sound file to be played, in case of SoundObject::External + */ + QString url() const; + + /** + The data of the sound, in case of SoundObject::Embedded + */ + QByteArray data() const; + + /** + The sampling rate of the sound + */ + double samplingRate() const; + + /** + The number of sound channels to use to play the sound + */ + int channels() const; + + /** + The number of bits per sample value per channel + */ + int bitsPerSample() const; + + /** + The encoding used for the sound + */ + SoundEncoding soundEncoding() const; + + private: + Q_DISABLE_COPY(SoundObject) + + SoundData *m_soundData; + }; + + class MovieData; + /** + Container class for a movie object in a PDF document. + + \since 0.10 + */ + class POPPLER_QT4_EXPORT MovieObject { + friend class AnnotationPrivate; + public: + /** + The play mode for playing the movie + */ + enum PlayMode { + PlayOnce, ///< Play the movie once, closing the movie controls at the end + PlayOpen, ///< Like PlayOnce, but leaving the controls open + PlayRepeat, ///< Play continuously until stopped + PlayPalindrome ///< Play forward, then backward, then again foward and so on until stopped + }; + + ~MovieObject(); + + /** + The URL of the movie to be played + */ + QString url() const; + + /** + The size of the movie + */ + QSize size() const; + + /** + The rotation (either 0, 90, 180, or 270 degrees clockwise) for the movie, + */ + int rotation() const; + + /** + Whether show a bar with movie controls + */ + bool showControls() const; + + /** + How to play the movie + */ + PlayMode playMode() const; + + /** + Returns whether a poster image should be shown if the movie is not playing. + \since 0.22 + */ + bool showPosterImage() const; + + /** + Returns the poster image that should be shown if the movie is not playing. + If the image is null but showImagePoster() returns @c true, the first frame of the movie + should be used as poster image. + \since 0.22 + */ + QImage posterImage() const; + + private: + /// \cond PRIVATE + MovieObject( AnnotMovie *ann ); + /// \endcond + + Q_DISABLE_COPY(MovieObject) + + MovieData *m_movieData; + }; + +} + +Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Page::PainterFlags) +Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::Document::RenderHints) +Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PDFConverter::PDFOptions) +Q_DECLARE_OPERATORS_FOR_FLAGS(Poppler::PSConverter::PSOptions) + +#endif diff --git a/dependencies/poppler/lib/poppler-qt4.lib b/dependencies/poppler/lib/poppler-qt4.lib new file mode 100644 index 00000000..4e91866b Binary files /dev/null and b/dependencies/poppler/lib/poppler-qt4.lib differ diff --git a/files/about.html b/files/about.html index 4ef7102c..f0aba5b6 100644 --- a/files/about.html +++ b/files/about.html @@ -3,7 +3,7 @@

-YACReader - Yet Another Comic Reader - version 5.0
+YACReader - Yet Another Comic Reader - version 5.5
by Luis Ángel San Martín Rodríguez
e-mail: luisangelsm@gmail.com
web site: http://www.yacreader.com
diff --git a/files/about_es_ES.html b/files/about_es_ES.html index b00adf24..020e2c56 100644 --- a/files/about_es_ES.html +++ b/files/about_es_ES.html @@ -4,7 +4,7 @@


-YACReader - Yet Another Comic Reader - versión 5.0
+YACReader - Yet Another Comic Reader - versión 5.5
por Luis Ángel San Martín Rodríguez
e-mail: luisangelsm@gmail.com
Página web: http://www.yacreader.com
diff --git a/images/flow4.png b/images/flow4.png new file mode 100644 index 00000000..2dbcc759 Binary files /dev/null and b/images/flow4.png differ diff --git a/images/flow5.png b/images/flow5.png new file mode 100644 index 00000000..311e7aba Binary files /dev/null and b/images/flow5.png differ diff --git a/images/onStartFlowSelection.png b/images/onStartFlowSelection.png index 5f69ea2a..0675f9da 100644 Binary files a/images/onStartFlowSelection.png and b/images/onStartFlowSelection.png differ diff --git a/images/onStartFlowSelection_es.png b/images/onStartFlowSelection_es.png new file mode 100644 index 00000000..401736c9 Binary files /dev/null and b/images/onStartFlowSelection_es.png differ