/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2008 Robert Osfield * * This library is open source and may be redistributed and/or modified under * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or * (at your option) any later version. The full license is in LICENSE file * included with this distribution, and on the openscenegraph.org website. * * This library 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 * OpenSceneGraph Public License for more details. */ #ifndef OSGWIDGET_PDFREADER #define OSGWIDGET_PDFREADER #include #include #include namespace osgWidget { /** Hints structure that can be passed to PdfReader and VncClient classes to help guide them on what geometry to build.*/ struct GeometryHints { enum AspectRatioPolicy { RESIZE_HEIGHT_TO_MAINTAINCE_ASPECT_RATIO, RESIZE_WIDTH_TO_MAINTAINCE_ASPECT_RATIO, IGNORE_DOCUMENT_ASPECT_RATIO }; 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), widthResolution(1024), heightResolution(1024) {} 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, unsigned int wRes=1024, unsigned int hRes=1024): position(pos), widthVec(wVec), heightVec(hVec), backgroundColor(bColor), aspectRatioPolicy(asp), widthResolution(wRes), heightResolution(hRes) {} osg::Vec3 position; osg::Vec3 widthVec; osg::Vec3 heightVec; osg::Vec4 backgroundColor; AspectRatioPolicy aspectRatioPolicy; unsigned int widthResolution; unsigned int heightResolution; }; /** Pure virtual base class for interfacing with implementation of PDF reader.*/ 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; virtual bool page(int pageNum) = 0; bool previous() { return page(_pageNum-1); } bool next() { return page(_pageNum+1); } void setNextPageKeyEvent(int key) { _nextPageKeyEvent = key; } int getNextPageKeyEvent() const { return _nextPageKeyEvent; } void setPreviousPageKeyEvent(int key) { _previousPageKeyEvent = key; } int getPreviousPageKeyEvent() const { return _previousPageKeyEvent; } protected: virtual ~PdfImage() {} osg::Vec4 _backgroundColor; int _pageNum; int _nextPageKeyEvent; int _previousPageKeyEvent; }; /** Convenience class that provides a interactive quad that can be placed directly in the scene.*/ class OSGWIDGET_EXPORT PdfReader : public osg::Geode { public: PdfReader() {} PdfReader(const std::string& filename, const GeometryHints& hints = GeometryHints()); bool assign(PdfImage* pdfImage, const GeometryHints& hints = GeometryHints()); bool open(const std::string& filename, const GeometryHints& hints = GeometryHints()); bool page(int pageNum); bool previous(); bool next(); protected: osg::ref_ptr _pdfImage; }; } #endif