From 58833e23d4c087cbd12ec565ded10e99a3e7da34 Mon Sep 17 00:00:00 2001 From: artemp Date: Wed, 24 Jul 2013 12:39:42 +0100 Subject: [PATCH] + PDF export (skia) --- demo/viewer/mainwindow.cpp | 36 +++++++++++++++++++++++++++++++++ demo/viewer/mainwindow.hpp | 5 +++++ demo/viewer/mapwidget.cpp | 41 ++++++++++++++++++++++++++++++++++++++ demo/viewer/mapwidget.hpp | 2 ++ demo/viewer/viewer.pro | 4 ++++ 5 files changed, 88 insertions(+) diff --git a/demo/viewer/mainwindow.cpp b/demo/viewer/mainwindow.cpp index 8e85e1e4c..0778d1616 100644 --- a/demo/viewer/mainwindow.cpp +++ b/demo/viewer/mainwindow.cpp @@ -263,6 +263,32 @@ void MainWindow::export_as() } } +void MainWindow::export_as_skia_pdf() +{ + std::cerr << "Skia PDF" << std::endl; + + QAction *action = qobject_cast(sender()); + QByteArray fileFormat("pdf"); + QString initialPath = QDir::currentPath() + "/map-skia." + fileFormat; + + QString fileName = QFileDialog::getSaveFileName(this, tr("Export As Skia PDF"), + initialPath, + tr("%1 Files (*.%2);;All Files (*)") + .arg(QString(fileFormat.toUpper())) + .arg(QString(fileFormat))); + if (!fileName.isEmpty()) + { + std::cerr << "Skia PDF" << std::endl; + mapWidget_->export_skia_pdf(fileName); + } + +} + +void MainWindow::export_as_cairo_pdf() +{ + std::cerr << "Cairo PDF" << std::endl; +} + void MainWindow::print() { @@ -335,6 +361,11 @@ void MainWindow::createActions() exportAsActs.append(action); } + exportSkiaPdf = new QAction("Skia",this); + connect(exportSkiaPdf, SIGNAL(triggered()), this, SLOT(export_as_skia_pdf())); + exportCairoPdf = new QAction("Cairo",this); + connect(exportCairoPdf, SIGNAL(triggered()), this, SLOT(export_as_cairo_pdf())); + printAct = new QAction(QIcon(":/images/print.png"),tr("&Print ..."),this); printAct->setShortcut(tr("Ctrl+E")); connect(printAct, SIGNAL(triggered()), this, SLOT(print())); @@ -353,10 +384,15 @@ void MainWindow::createMenus() foreach (QAction *action, exportAsActs) exportMenu->addAction(action); + exportPdfMenu = new QMenu(tr("&Export As PDF"), this); + exportPdfMenu->addAction(exportSkiaPdf); + exportPdfMenu->addAction(exportCairoPdf); + fileMenu = new QMenu(tr("&File"),this); fileMenu->addAction(openAct); fileMenu->addAction(saveAct); fileMenu->addMenu(exportMenu); + fileMenu->addMenu(exportPdfMenu); fileMenu->addAction(printAct); fileMenu->addSeparator(); fileMenu->addAction(exitAct); diff --git a/demo/viewer/mainwindow.hpp b/demo/viewer/mainwindow.hpp index f5f01863f..3c01ec1fb 100644 --- a/demo/viewer/mainwindow.hpp +++ b/demo/viewer/mainwindow.hpp @@ -54,6 +54,8 @@ public slots: void pan(); void info(); void export_as(); + void export_as_skia_pdf(); + void export_as_cairo_pdf(); void open(QString const& path = QString()); void reload(); void save(); @@ -96,11 +98,14 @@ private: QAction *panDownAct; QAction *reloadAct; QAction *layerInfo; + QAction *exportSkiaPdf; + QAction *exportCairoPdf; //toolbars QToolBar *fileToolBar; QToolBar *editToolBar; //menus QMenu *exportMenu; + QMenu *exportPdfMenu; QMenu *fileMenu; QMenu *helpMenu; //status bar diff --git a/demo/viewer/mapwidget.cpp b/demo/viewer/mapwidget.cpp index da458ef85..9192bcacb 100644 --- a/demo/viewer/mapwidget.cpp +++ b/demo/viewer/mapwidget.cpp @@ -45,6 +45,9 @@ #include #include #include +#include +#include +#include #include #include #if SK_SUPPORT_GPU @@ -625,6 +628,44 @@ void render_skia_gpu(GrGLInterface const * cur_interface, mapnik::Map const& map } +void MapWidget::export_skia_pdf(QString const& filename) +{ + unsigned width = map_->width(); + unsigned height = map_->height(); + SkISize pageSize = SkISize::Make(width,height); + + + SkPDFDevice dev(pageSize, pageSize, SkMatrix::I()); + SkCanvas canvas(&dev); + mapnik::skia_renderer ren(*map_,canvas,scaling_factor_); + try + { + ren.apply(); + } + catch (mapnik::config_error & ex) + { + std::cerr << "Skia:" << ex.what() << std::endl; + } + catch (const std::exception & ex) + { + std::cerr << "Skia:exception: " << ex.what() << std::endl; + } + catch (...) + { + std::cerr << "Skia:Unknown exception caught!\n"; + } + + SkPDFDocument doc; + doc.appendPage(&dev); + std::cerr << filename.toStdString() << std::endl; + SkFILEWStream stream(filename.toStdString().c_str()); + if (stream.isValid()) + { + doc.emitPDF(&stream); + } + std::cerr << "Done" << std::endl; +} + void render_grid(mapnik::Map const& map, double scaling_factor, QPixmap & pix) { std::cerr << "Not supported" << std::endl; diff --git a/demo/viewer/mapwidget.hpp b/demo/viewer/mapwidget.hpp index 1ffc48972..0d7ae0bb5 100644 --- a/demo/viewer/mapwidget.hpp +++ b/demo/viewer/mapwidget.hpp @@ -90,6 +90,7 @@ public: void panUp(); void panDown(); void set_scaling_factor(double); + void export_skia_pdf(QString const& filename); public slots: void zoomToLevel(int level); void updateMap(); @@ -110,6 +111,7 @@ protected: unsigned height, std::string const& filename, std::string const& type); + }; #endif // MAP_WIDGET_HPP diff --git a/demo/viewer/viewer.pro b/demo/viewer/viewer.pro index 146c5159d..b0ce85083 100644 --- a/demo/viewer/viewer.pro +++ b/demo/viewer/viewer.pro @@ -9,10 +9,14 @@ QMAKE_CXX = $$system(mapnik-config --cxx) QMAKE_LINK = $$system(mapnik-config --cxx) QMAKE_CXXFLAGS += $$system(mapnik-config --cxxflags --defines) QMAKE_CXXFLAGS += $$system(mapnik-config --includes --dep-includes) +QMAKE_CXXFLAGS += "-I/Users/artem/Projects/skia/trunk/include/gpu" +QMAKE_CXXFLAGS += "-I/Users/artem/Projects/skia/trunk/include/pdf" QMAKE_LFLAGS += $$system(mapnik-config --libs) QMAKE_LFLAGS += $$system(mapnik-config --ldflags --dep-libs) QMAKE_LFLAGS += -lboost_timer +QMAKE_LFLAGS += -lskia_pdf +QMAKE_LFLAGS += -lzlib QMAKE_LFLAGS += "-framework Cocoa" # Input