From b68e15a811359f8c7ab6f239cd5e8bf36e854f0e Mon Sep 17 00:00:00 2001 From: Ian Jauslin Date: Sun, 7 Jun 2015 15:28:16 +0000 Subject: Initial commit --- src/pdfWindow.cpp | 139 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/pdfWindow.cpp (limited to 'src/pdfWindow.cpp') diff --git a/src/pdfWindow.cpp b/src/pdfWindow.cpp new file mode 100644 index 0000000..e4ca3e4 --- /dev/null +++ b/src/pdfWindow.cpp @@ -0,0 +1,139 @@ +/* +Copyright 2015 Ian Jauslin + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +#include "pdfWindow.h" + +// constructor +pdfWindow::pdfWindow(QWidget *parent) : + QMainWindow(parent) +{ + // set defaults + fullscreen=0; + curpage=0; + totalpages=0; + verticalOffset=0; + document=NULL; + + //scene to draw the view + pdfViewScene=new QGraphicsScene; + pdfView=new QGraphicsView(pdfViewScene); +} + +// set PDF document +void pdfWindow::setDoc(char* file){ + if(document){delete document;} + doc=file; + + QString filename=file; + document = Poppler::Document::load(filename); + if(document){ + // display options + document->setRenderHint(Poppler::Document::Antialiasing,true); + document->setRenderHint(Poppler::Document::TextAntialiasing,true); + + curpage=0; + totalpages=document->numPages(); + this->updatePDF(); + } +} + +void pdfWindow::gotoPage(int page){ + if(page=0){ + curpage=page; + this->updatePDF(); + } +} +void pdfWindow::nextPage(){ + if(curpageupdatePDF(); + } +} +void pdfWindow::previousPage(){ + if(curpage>0){ + curpage--; + this->updatePDF(); + } +} + +// toggle fullscreen +void pdfWindow::fullscreenPDF(){ + if(!fullscreen){ + fullscreen=1; + this->showFullScreen(); + } + else{ + fullscreen=0; + this->showNormal(); + } +} + +// draw (or redraw) PDF +void pdfWindow::updatePDF(){ + // current page + Poppler::Page* pdfPage = document->page(curpage); + if(!pdfPage){ + std::cout << "Error: could not load page " << curpage << '\n'; + return; + } + + // total size available + QSize windowsize=this->size(); + // verticalOffset to allow timebar + QSize viewSize(windowsize.width()+2,windowsize.height()+2-verticalOffset); + pdfView->setGeometry(-1,-1,viewSize.width(),viewSize.height()); + + // page size in points (1/72 inch) + QSize pageSize=pdfPage->pageSize(); + // aspect ratio + double aspect=double(pageSize.width())/double(pageSize.height()); + // an image to display the page + QImage image; + // keep aspect ratop + if(viewSize.width()<=aspect*viewSize.height()){ + // render PDF page with appropriate resolution (pix/inch) + image = pdfPage->renderToImage(72*viewSize.width()/pageSize.width(),72*viewSize.width()/aspect/pageSize.height(),0,0,viewSize.width(),viewSize.width()/aspect); + } + else{ + // render PDF page with appropriate resolution (pix/inch) + image = pdfPage->renderToImage(72*viewSize.height()*aspect/pageSize.width(),72*viewSize.height()/pageSize.height(),0,0,viewSize.height()*aspect,viewSize.height()); + } + delete pdfPage; + + // update scene + delete pdfViewScene; + pdfViewScene=new QGraphicsScene; + pdfView->setScene(pdfViewScene); + pdfViewScene->setBackgroundBrush(Qt::black); + // draw image + pdfViewScene->addPixmap(QPixmap::fromImage(image)); +} + +// respond to resize +void pdfWindow::resizeEvent(QResizeEvent* event){ + if(document){ + this->updatePDF(); + } + + QMainWindow::resizeEvent(event); +} + +// destructor +pdfWindow::~pdfWindow(){ + if(document){delete document;} + delete pdfView; + delete pdfViewScene; +} -- cgit v1.2.3-54-g00ecf