⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 readerwritersvg.cpp

📁 最新osg包
💻 CPP
字号:
/* -*-c++-*- Copyright (C) 2008 Miguel Escriva Gregori * * 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.*/#include <iostream>#include <sstream>#include <osg/Image>#include <osg/Notify>#include <osgDB/Registry>#include <osgDB/FileNameUtils>#include <osgDB/FileUtils>#include <osgDB/ImageOptions>extern "C" {        #include <librsvg/rsvg.h>        #include <librsvg/rsvg-cairo.h>}class ReaderWriterSVG : public osgDB::ReaderWriter{    public:        ReaderWriterSVG()        {                supportsExtension("svg","Scalar Vector Graphics format");                        rsvg_init();        }        virtual const char* className() const { return "SVG Image Reader"; }        virtual ReadResult readObject(const std::string& file, const osgDB::ReaderWriter::Options* options) const        {                return readImage(file, options);        }        virtual ReadResult readImage(const std::string& file, const osgDB::ReaderWriter::Options* options) const        {                std::string ext = osgDB::getLowerCaseFileExtension(file);                if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;                std::string fileName = osgDB::findDataFile( file, options );                if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;                RsvgDimensionData dimensionData;                RsvgHandle* handle = rsvg_handle_new_from_file (fileName.c_str(), NULL);                rsvg_handle_get_dimensions( handle, &dimensionData);                osg::Image *image;                if (options)                {                        unsigned int w=0, h=0;                        std::string op = options->getOptionString();                                                size_t i = op.find("x");                        std::stringstream ss1(op.substr(0, i));                        std::stringstream ss2(op.substr(i+1, op.size()));                        ss1 >> w;                        ss1 >> h;                        if (w==0 || h==0){                                image = createImage(handle, dimensionData.width, dimensionData.height);                        }                        else{                                image = createImage(handle, w, h);                        }                }                else{                        image = createImage(handle, dimensionData.width, dimensionData.height);                }                rsvg_handle_free(handle);                image->setFileName(file);                return image;        }        osg::Image* createImage(RsvgHandle *handle, unsigned int width, unsigned int height) const        {                RsvgDimensionData dimensionData;                rsvg_handle_get_dimensions( handle, &dimensionData);                // If image resollution < 128, cairo produces some artifacts.                // I don't know why, but we check the size...                if (width < 128) width = 128;                if (height < 128) height = 128;                width = osg::Image::computeNearestPowerOfTwo(width);                height = osg::Image::computeNearestPowerOfTwo(height);                osg::Image *image = new osg::Image();                image->allocateImage(width, height, 1, GL_RGBA, GL_UNSIGNED_BYTE);                image->setPixelFormat(GL_BGRA);                cairo_surface_t *cairo_surface = cairo_image_surface_create_for_data(image->data(),                                        CAIRO_FORMAT_ARGB32, width, height, image->getRowSizeInBytes());                cairo_t *cr = cairo_create(cairo_surface);                cairo_scale(cr,((float)width)/dimensionData.width, ((float)height)/dimensionData.height);                rsvg_handle_render_cairo(handle, cr);                                        cairo_destroy(cr);                free(cairo_surface);                image->flipVertical();                return image;        }    protected:        virtual ~ReaderWriterSVG()        {                rsvg_term();        }};// now register with Registry to instantiate the above// reader/writer.REGISTER_OSGPLUGIN(SVG, ReaderWriterSVG)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -