From d8c17e4c4c99f0253cfc4801a0d7b85326c0a31a Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 9 Dec 2008 09:26:51 +0000 Subject: [PATCH] Added support for setting background colour of Pdf document. --- examples/osgpdf/osgpdf.cpp | 1 + examples/osgvnc/CMakeLists.txt | 2 ++ examples/osgvnc/osgvnc.cpp | 3 +++ include/osgWidget/PdfReader | 12 +++++++++++- src/osgPlugins/pdf/CMakeLists.txt | 2 +- src/osgPlugins/pdf/ReaderWriterPDF.cpp | 13 +++---------- src/osgViewer/ViewerEventHandlers.cpp | 4 +++- src/osgWidget/PdfReader.cpp | 1 + 8 files changed, 25 insertions(+), 13 deletions(-) diff --git a/examples/osgpdf/osgpdf.cpp b/examples/osgpdf/osgpdf.cpp index 6b33b2f67..dcbaf9532 100644 --- a/examples/osgpdf/osgpdf.cpp +++ b/examples/osgpdf/osgpdf.cpp @@ -20,6 +20,7 @@ int main(int argc,char** argv) osgWidget::GeometryHints hints(osg::Vec3(1.0f,0.0f,0.0f), osg::Vec3(1.0f,0.0f,0.0f), osg::Vec3(0.0f,0.0f,1.0f), + osg::Vec4(1.0f,1.0f,1.0f,1.0f), osgWidget::GeometryHints::RESIZE_HEIGHT_TO_MAINTAINCE_ASPECT_RATIO); osg::ref_ptr group = new osg::Group; diff --git a/examples/osgvnc/CMakeLists.txt b/examples/osgvnc/CMakeLists.txt index 96d337812..16ce636c7 100644 --- a/examples/osgvnc/CMakeLists.txt +++ b/examples/osgvnc/CMakeLists.txt @@ -1,5 +1,7 @@ SET(TARGET_SRC osgvnc.cpp) +SET(TARGET_ADDED_LIBRARIES osgWidget ) + #### end var setup ### SETUP_EXAMPLE(osgvnc) diff --git a/examples/osgvnc/osgvnc.cpp b/examples/osgvnc/osgvnc.cpp index 4f963aadb..21c49715b 100644 --- a/examples/osgvnc/osgvnc.cpp +++ b/examples/osgvnc/osgvnc.cpp @@ -4,6 +4,8 @@ #include +#include + #include #include @@ -50,6 +52,7 @@ int main(int argc,char** argv) osgWidget::GeometryHints hints(osg::Vec3(1.0f,0.0f,0.0f), osg::Vec3(1.0f,0.0f,0.0f), osg::Vec3(0.0f,0.0f,1.0f), + osg::Vec4(1.0f,1.0f,1.0f,1.0f), osgWidget::GeometryHints::RESIZE_HEIGHT_TO_MAINTAINCE_ASPECT_RATIO); osg::ref_ptr group = new osg::Group; diff --git a/include/osgWidget/PdfReader b/include/osgWidget/PdfReader index 33310dbb0..f20dd456b 100644 --- a/include/osgWidget/PdfReader +++ b/include/osgWidget/PdfReader @@ -36,20 +36,24 @@ struct GeometryHints position(0.0f,0.0f,0.0f), widthVec(1.0f,0.0f,0.0f), heightVec(0.0f,1.0f,0.0f), + backgroundColor(1.0f,1.0f,1.0f,1.0f), aspectRatioPolicy(RESIZE_HEIGHT_TO_MAINTAINCE_ASPECT_RATIO) {} GeometryHints(const osg::Vec3& pos, const osg::Vec3& wVec, const osg::Vec3& hVec, + const osg::Vec4& bColor, AspectRatioPolicy asp=RESIZE_HEIGHT_TO_MAINTAINCE_ASPECT_RATIO): position(pos), widthVec(wVec), heightVec(hVec), + backgroundColor(bColor), aspectRatioPolicy(asp) {} osg::Vec3 position; osg::Vec3 widthVec; osg::Vec3 heightVec; + osg::Vec4 backgroundColor; AspectRatioPolicy aspectRatioPolicy; }; @@ -60,10 +64,14 @@ class PdfImage : public osg::Image public: PdfImage(): + _backgroundColor(1.0f,1.0f,1.0f,1.0f), _pageNum(0), _nextPageKeyEvent('n'), _previousPageKeyEvent('p') {} + void setBackgroundColor(const osg::Vec4& backgroundColor) { _backgroundColor = backgroundColor; } + const osg::Vec4& getBackgroundColor() const { return _backgroundColor; } + int getPageNum() const { return _pageNum; } virtual int getNumOfPages() = 0; @@ -85,11 +93,13 @@ class PdfImage : public osg::Image void setPreviousPageKeyEvent(int key) { _previousPageKeyEvent = key; } int getPreviousPageKeyEvent() const { return _previousPageKeyEvent; } - + protected: virtual ~PdfImage() {} + osg::Vec4 _backgroundColor; + int _pageNum; int _nextPageKeyEvent; int _previousPageKeyEvent; diff --git a/src/osgPlugins/pdf/CMakeLists.txt b/src/osgPlugins/pdf/CMakeLists.txt index e09ccd540..5c29a4519 100644 --- a/src/osgPlugins/pdf/CMakeLists.txt +++ b/src/osgPlugins/pdf/CMakeLists.txt @@ -4,7 +4,7 @@ INCLUDE_DIRECTORIES( ${CAIRO_INCLUDE_DIRS} ${POPPLER_INCLUDE_DIRS} ) LINK_DIRECTORIES(${CAIRO_LIBRARY_DIRS} ${POPPLER_LIB_DIRS}) SET(TARGET_EXTERNAL_LIBRARIES ${CAIRO_LIBRARIES} ${POPPLER_LIBRARIES} ) -SET(TARGET_ADDED_LIBRARIES osgWidget ) +SET(TARGET_ADDED_LIBRARIES osgWidget osgVolume) #### end var setup ### SETUP_PLUGIN(pdf) diff --git a/src/osgPlugins/pdf/ReaderWriterPDF.cpp b/src/osgPlugins/pdf/ReaderWriterPDF.cpp index 922855d6d..66fbf6a73 100644 --- a/src/osgPlugins/pdf/ReaderWriterPDF.cpp +++ b/src/osgPlugins/pdf/ReaderWriterPDF.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include @@ -196,21 +197,13 @@ class PopplerPdfImage : public osgWidget::PdfImage _cairoImage->create((unsigned int)(w*2.0),(unsigned int)(h*2.0)); - double r = 1.0; - double g = 1.0; - double b = 1.0; - double a = 1.0; - + osgVolume::clearImageToColor(this, _backgroundColor); + cairo_save(_cairoImage->getContext()); - cairo_set_source_rgba(_cairoImage->getContext(), r, g, b, a); cairo_rectangle(_cairoImage->getContext(), 0.0, 0.0, double(s()), double(t())); - cairo_fill(_cairoImage->getContext()); - cairo_scale(_cairoImage->getContext(), double(s())/w, double(t())/h); - poppler_page_render(page, _cairoImage->getContext()); - cairo_restore(_cairoImage->getContext()); diff --git a/src/osgViewer/ViewerEventHandlers.cpp b/src/osgViewer/ViewerEventHandlers.cpp index 8a02f2ea5..502aad766 100644 --- a/src/osgViewer/ViewerEventHandlers.cpp +++ b/src/osgViewer/ViewerEventHandlers.cpp @@ -676,7 +676,7 @@ bool InteractiveImageHandler::mousePosition(osgViewer::View* view, osg::NodeVisi x = int( tc.x() ); y = int( tc.y() ); } - else + else if (_image.valid()) { x = int( float(_image->s()) * tc.x() ); y = int( float(_image->t()) * tc.y() ); @@ -693,6 +693,8 @@ bool InteractiveImageHandler::mousePosition(osgViewer::View* view, osg::NodeVisi bool InteractiveImageHandler::handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa, osg::Object*, osg::NodeVisitor* nv) { if (ea.getHandled()) return false; + + if (!_image) return false; switch(ea.getEventType()) { diff --git a/src/osgWidget/PdfReader.cpp b/src/osgWidget/PdfReader.cpp index 22d01a966..20c4665fd 100644 --- a/src/osgWidget/PdfReader.cpp +++ b/src/osgWidget/PdfReader.cpp @@ -31,6 +31,7 @@ bool PdfReader::assign(PdfImage* pdfImage, GeometryHints hints) if (!pdfImage) return false; _pdfImage = pdfImage; + _pdfImage->setBackgroundColor(hints.backgroundColor); bool flip = _pdfImage->getOrigin()==osg::Image::TOP_LEFT;