#include #include #include #include #include #include #include #include #include #include #include class CarioImage : public osg::Image { public: CarioImage(): _surface(0), _context(0) {} void create(unsigned int width, unsigned int height) { if (data() && width==s() && height==t()) return; osg::notify(osg::NOTICE)<<"Create cario surface/context "<=getNumOfPages()) return false; PopplerPage* page = poppler_document_get_page(_doc, pageNum); if(!page) return false; _pageNum = pageNum; double w = 0.0f; double h = 0.0f; poppler_page_get_size(page, &w, &h); 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; cairo_save(_context); cairo_set_source_rgba(_context, r, g, b, a); cairo_rectangle(_context, 0.0, 0.0, double(s()), double(t())); cairo_fill(_context); cairo_scale(_context, double(s())/w, double(t())/h); poppler_page_render(page, getContext()); cairo_restore(_context); dirty(); } }; osg::Node* createInteractiveQuad(const osg::Vec3& origin, osg::Vec3& widthAxis, osg::Vec3& heightAxis, osg::Image* image) { bool flip = image->getOrigin()==osg::Image::TOP_LEFT; osg::Geometry* pictureQuad = osg::createTexturedQuadGeometry(origin, widthAxis, heightAxis, 0.0f, flip ? 1.0f : 0.0f , 1.0f, flip ? 0.0f : 1.0f); osg::Texture2D* texture = new osg::Texture2D(image); texture->setResizeNonPowerOfTwoHint(false); texture->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINEAR); texture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE); texture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE); pictureQuad->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON); pictureQuad->setEventCallback(new osgViewer::InteractiveImageHandler(image)); osg::Geode* geode = new osg::Geode; geode->addDrawable(pictureQuad); return geode; } class PageHandler : public osgGA::GUIEventHandler { public: PageHandler() {} bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa) { if (ea.getHandled()) return false; switch(ea.getEventType()) { case(osgGA::GUIEventAdapter::KEYDOWN): { if (ea.getKey()=='n') { osg::notify(osg::NOTICE)<<"Next page"< > Images; Images images; for(int i=1; i pdfImage= new PdfImage; if (pdfImage->open(arguments[i])) { images.push_back(pdfImage.get()); } } } bool xyPlane = false; osg::Group* group = new osg::Group; osg::Vec3 origin = osg::Vec3(0.0f,0.0f,0.0f); for(Images::iterator itr = images.begin(); itr != images.end(); ++itr) { osg::Image* image = itr->get(); float width = 1.0; float height = float(image->t())/float(image->s()); osg::Vec3 widthAxis = osg::Vec3(width,0.0f,0.0f); osg::Vec3 heightAxis = xyPlane ? osg::Vec3(0.0f,height,0.0f) : osg::Vec3(0.0f,0.0f,height); group->addChild(createInteractiveQuad(origin, widthAxis, heightAxis, image)); origin += widthAxis*1.1f; } viewer.setSceneData(group); viewer.addEventHandler(new osgViewer::StatsHandler); //viewer.addEventHandler(new PageHandler); return viewer.run(); }