root/OpenSceneGraph/trunk/include/osg/Image @ 9910

Revision 9910, 15.3 kB (checked in by robert, 5 years ago)

From Tanguy Fautre,

Clean up of the FFmpeg plugin's class API/AudioStream API.
Implementation of isImageTransparent().
Implementation of Image:g/setPixelAspectRatio()

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
RevLine 
[5328]1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 Robert Osfield
[1529]2 *
3 * This library is open source and may be redistributed and/or modified under 
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version.  The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 * OpenSceneGraph Public License for more details.
12*/
[51]13
[2]14#ifndef OSG_IMAGE
15#define OSG_IMAGE 1
16
[3819]17#include <osg/BufferObject>
[7581]18#include <osg/Vec2>
19#include <osg/Vec3>
20#include <osg/Vec4>
[8642]21#include <osg/FrameStamp>
[2]22
[8]23#include <string>
[616]24#include <vector>
[8]25
[1084]26#ifndef GL_VERSION_1_2
[3405]27    // 1.2 definitions...
[1084]28    #define GL_BGR                          0x80E0
29    #define GL_BGRA                         0x80E1
30    #define GL_UNSIGNED_BYTE_3_3_2          0x8032
31    #define GL_UNSIGNED_BYTE_2_3_3_REV      0x8362
32    #define GL_UNSIGNED_SHORT_5_6_5         0x8363
33    #define GL_UNSIGNED_SHORT_5_6_5_REV     0x8364
34    #define GL_UNSIGNED_SHORT_4_4_4_4       0x8033
35    #define GL_UNSIGNED_SHORT_4_4_4_4_REV   0x8365
36    #define GL_UNSIGNED_SHORT_5_5_5_1       0x8034
37    #define GL_UNSIGNED_SHORT_1_5_5_5_REV   0x8366
38    #define GL_UNSIGNED_INT_8_8_8_8         0x8035
39    #define GL_UNSIGNED_INT_8_8_8_8_REV     0x8367
40    #define GL_UNSIGNED_INT_10_10_10_2      0x8036
41    #define GL_UNSIGNED_INT_2_10_10_10_REV  0x8368
42#endif
43
[3795]44#ifndef GL_COMPRESSED_ALPHA
45    #define GL_COMPRESSED_ALPHA             0x84E9
46    #define GL_COMPRESSED_LUMINANCE         0x84EA
47    #define GL_COMPRESSED_LUMINANCE_ALPHA   0x84EB
48    #define GL_COMPRESSED_INTENSITY         0x84EC
49    #define GL_COMPRESSED_RGB               0x84ED
50    #define GL_COMPRESSED_RGBA              0x84EE
51#endif
52
[5650]53
[9317]54#ifndef GL_ABGR_EXT
55#define GL_ABGR_EXT                         0x8000
56#endif
57
[2]58namespace osg {
59
[8647]60// forward declare
61class NodeVisitor;
62
[3405]63/** Image class for encapsulating the storage texture image data. */
[4021]64class OSG_EXPORT Image : public Object
[2]65{
66
67    public :
68
69        Image();
[327]70       
[3405]71        /** Copy constructor using CopyOp to manage deep vs shallow copy. */
[331]72        Image(const Image& image,const CopyOp& copyop=CopyOp::SHALLOW_COPY);
[2]73
[1418]74        virtual Object* cloneType() const { return new Image(); }
75        virtual Object* clone(const CopyOp& copyop) const { return new Image(*this,copyop); }
[8]76        virtual bool isSameKindAs(const Object* obj) const { return dynamic_cast<const Image*>(obj)!=0; }
[740]77        virtual const char* libraryName() const { return "osg"; }
[2]78        virtual const char* className() const { return "Image"; }
79
[3405]80        /** Return -1 if *this < *rhs, 0 if *this==*rhs, 1 if *this>*rhs. */
[1676]81        virtual int compare(const Image& rhs) const;
[2]82
[529]83        void setFileName(const std::string& fileName);
[8]84        inline const std::string& getFileName() const { return _fileName; }
[2]85       
[8834]86        enum WriteHint {
87            NO_PREFERENCE,
88            STORE_INLINE,
89            EXTERNAL_FILE
90        };
91       
92        void setWriteHint(WriteHint writeHint) { _writeHint = writeHint; }
93        WriteHint getWriteHint() const { return _writeHint; }
94       
[1624]95        enum AllocationMode {
96            NO_DELETE,
97            USE_NEW_DELETE,
98            USE_MALLOC_FREE
99        };
100       
[3405]101        /** Set the method used for deleting data once it goes out of scope. */
[1624]102        void setAllocationMode(AllocationMode mode) { _allocationMode = mode; }
103
[3405]104        /** Get the method used for deleting data once it goes out of scope. */
[2319]105        AllocationMode getAllocationMode() const { return _allocationMode; }
[1624]106
107
[3405]108        /** Allocate a pixel block of specified size and type. */
[1088]109        void allocateImage(int s,int t,int r,
[2308]110                           GLenum pixelFormat,GLenum type,
[1088]111                           int packing=1);
[521]112       
113       
[4843]114        /** Set the image dimensions, format and data. */
[529]115        void setImage(int s,int t,int r,
116                      GLint internalTextureformat,
[2308]117                      GLenum pixelFormat,GLenum type,
[4297]118                      unsigned char* data,
[1624]119                      AllocationMode mode,
[529]120                      int packing=1);
[521]121           
[3405]122        /** Read pixels from current frame buffer at specified position and size, using glReadPixels.
123          * Create memory for storage if required, reuse existing pixel coords if possible.
[3779]124        */
[521]125        void readPixels(int x,int y,int width,int height,
[2308]126                        GLenum pixelFormat,GLenum type);
[521]127           
[2]128
[3405]129        /** Read the contents of the current bound texture, handling compressed pixelFormats if present.
130          * Create memory for storage if required, reuse existing pixel coords if possible.
[3779]131        */
[5265]132        void readImageFromCurrentTexture(unsigned int contextID, bool copyMipMapsIfAvailable, GLenum type = GL_UNSIGNED_BYTE);
[1794]133
134
[529]135        /** Scale image to specified size. */
[2403]136        void scaleImage(int s,int t,int r) { scaleImage(s,t,r, getDataType()); }
[529]137
[2403]138        /** Scale image to specified size and with specified data type. */
139        void scaleImage(int s,int t,int r, GLenum newDataType);
140
[1088]141        /** Copy a source Image into a subpart of this Image at specified position.
142          * Typically used to copy to an already allocated image, such as creating
143          * a 3D image from a stack 2D images.
[3405]144          * If this Image is empty then image data is created to
145          * accomodate the source image in its offset position.
146          * If source is NULL then no operation happens, this Image is left unchanged.
[3779]147        */
[9643]148        void copySubImage(int s_offset, int t_offset, int r_offset, const osg::Image* source);
[529]149
[6947]150
151        enum Origin
152        {
153            BOTTOM_LEFT,
154            TOP_LEFT
155        };
156       
157        /** Set the origin of the image.
158          * The default value is BOTTOM_LEFT and is consistent with OpenGL.
159          * TOP_LEFT is used for imagery that follows standard Imagery convention, such as movies,
160          * and hasn't been flipped yet.  For such images one much flip the t axis of the tex coords.
161          * to handle this origin position. */
162        void setOrigin(Origin origin) { _origin = origin; }
163       
164        /** Get the origin of the image.*/
165        Origin getOrigin() const { return _origin; }
166       
167
[3405]168        /** Width of image. */
[1133]169        inline int s() const { return _s; }
[529]170
[3405]171        /** Height of image. */
[1133]172        inline int t() const { return _t; }
[529]173       
[3405]174        /** Depth of image. */
[1133]175        inline int r() const { return _r; }
[2]176       
[577]177        void setInternalTextureFormat(GLint internalFormat);
[1133]178        inline GLint getInternalTextureFormat() const { return _internalTextureFormat; }
[521]179       
[2308]180        void setPixelFormat(GLenum pixelFormat);
[1133]181        inline GLenum getPixelFormat() const { return _pixelFormat; }
[521]182       
[5478]183        void setDataType(GLenum dataType);
[1133]184        inline GLenum getDataType() const { return _dataType; }       
[521]185       
[5478]186        void setPacking(unsigned int packing) { _packing = packing; }
[1133]187        inline unsigned int getPacking() const { return _packing; }
[9910]188
189        inline void setPixelAspectRatio(float pixelAspectRatio) { _pixelAspectRatio = pixelAspectRatio; }
190        inline float getPixelAspectRatio() const { return _pixelAspectRatio; }
[2]191       
[3405]192        /** Return the number of bits required for each pixel. */
[1133]193        inline unsigned int getPixelSizeInBits() const { return computePixelSizeInBits(_pixelFormat,_dataType); }
[529]194
[3405]195        /** Return the number of bytes each row of pixels occupies once it has been packed. */
[1133]196        inline unsigned int getRowSizeInBytes() const { return computeRowWidthInBytes(_s,_pixelFormat,_dataType,_packing); }
[529]197
[3405]198        /** Return the number of bytes each image (_s*_t) of pixels occupies. */
[1133]199        inline unsigned int getImageSizeInBytes() const { return getRowSizeInBytes()*_t; }
[521]200       
[3405]201        /** Return the number of bytes the whole row/image/volume of pixels occupies. */
[1133]202        inline unsigned int getTotalSizeInBytes() const { return getImageSizeInBytes()*_r; }
[529]203
[3405]204        /** Return the number of bytes the whole row/image/volume of pixels occupies, including all mip maps if included. */
[1983]205        unsigned int getTotalSizeInBytesIncludingMipmaps() const;
206
[4080]207        /** Return true if the Image represent a valid and usable imagery.*/
208        bool valid() const { return _s!=0 && _t!=0 && _r!=0 && _data!=0 && _dataType!=0; }
209
[3405]210        /** Raw image data. */
[4297]211        inline unsigned char* data() { return _data; }
[2]212       
[3405]213        /** Raw const image data. */
[4297]214        inline const unsigned char* data() const { return _data; }
[8]215
[2]216
[1048]217        inline unsigned char* data(int column, int row=0,int image=0)
[529]218        {
219            if (!_data) return NULL;
[577]220            return _data+(column*getPixelSizeInBits())/8+row*getRowSizeInBytes()+image*getImageSizeInBytes();
[529]221        }
[690]222       
[3947]223        inline const unsigned char* data(int column, int row=0,int image=0) const
[1048]224        {
225            if (!_data) return NULL;
226            return _data+(column*getPixelSizeInBits())/8+row*getRowSizeInBytes()+image*getImageSizeInBytes();
227        }
228
[7581]229        /** Get the color value for specified texcoord.*/
230        Vec4 getColor(unsigned int s,unsigned t=0,unsigned r=0) const;
[3819]231
[7581]232        /** Get the color value for specified texcoord.*/
233        Vec4 getColor(const Vec2& texcoord) const { return getColor(Vec3(texcoord.x(),texcoord.y(),0.0f)); }
234
235        /** Get the color value for specified texcoord.*/
236        Vec4 getColor(const Vec3& texcoord) const;
237
238
[3405]239        /** Flip the image horizontally. */
[3289]240        void flipHorizontal();
[690]241       
[3405]242        /** Flip the image vertically. */
[3289]243        void flipVertical();
[529]244
245
[2]246        /** Ensure image dimensions are a power of two.
[3405]247          * Mipmapped textures require the image dimensions to be
[558]248          * power of two and are within the maxiumum texture size for
[3405]249          * the host machine.
[3779]250        */
[1155]251        void ensureValidSizeForTexturing(GLint maxTextureSize);
[8]252     
[3819]253        /** Dirty the image, which increments the modified count, to force osg::Texture to reload the image. */
[6574]254        inline void dirty() { ++_modifiedCount; if (_bufferObject.valid()) _bufferObject->dirty(); }     
[178]255     
[3819]256        /** Set the modified count value. Used by osg::Texture when using texture subloading. */
257        inline void setModifiedCount(unsigned int value) { _modifiedCount=value; }
[178]258
[3819]259        /** Get modified count value. Used by osg::Texture when using texture subloading. */
260        inline unsigned int getModifiedCount() const { return _modifiedCount; }
[8]261
[529]262
[1133]263        static bool isPackedType(GLenum type);
[5650]264        static GLenum computePixelFormat(GLenum pixelFormat);
[9298]265        static GLenum computeFormatDataType(GLenum pixelFormat);
[2308]266        static unsigned int computeNumComponents(GLenum pixelFormat);
267        static unsigned int computePixelSizeInBits(GLenum pixelFormat,GLenum type);
268        static unsigned int computeRowWidthInBytes(int width,GLenum pixelFormat,GLenum type,int packing);
[1776]269        static int computeNearestPowerOfTwo(int s,float bias=0.5f);
[7521]270        static int computeNumberOfMipmapLevels(int s,int t = 1, int r = 1);
[1133]271               
[3405]272        /** Precomputed mipmaps stuff. */
[624]273        typedef std::vector< unsigned int > MipmapDataType;
[529]274
[616]275        inline bool isMipmap() const {return !_mipmapData.empty();};
[529]276
[1047]277        unsigned int getNumMipmapLevels() const
[616]278        {
[9599]279            return static_cast<unsigned int>(_mipmapData.size())+1;
[616]280        };
281
[3405]282        /** Send offsets into data. It is assumed that first mipmap offset (index 0) is 0.*/
[3755]283        inline void setMipmapLevels(const MipmapDataType& mipmapDataVector) { _mipmapData = mipmapDataVector; }
[616]284       
[3755]285        inline const MipmapDataType& getMipmapLevels() const { return _mipmapData; }
286
287        inline unsigned int getMipmapOffset(unsigned int mipmapLevel) const
[616]288        {
[3755]289            if(mipmapLevel == 0)
290                return 0;
291            else if (mipmapLevel < getNumMipmapLevels())
292               return _mipmapData[mipmapLevel-1];
293            return 0;
[616]294        };
[1047]295       
[3755]296        inline unsigned char* getMipmapData(unsigned int mipmapLevel)
[3779]297        {
298           return _data+getMipmapOffset(mipmapLevel);
299        }
[3755]300
301        inline const unsigned char* getMipmapData(unsigned int mipmapLevel) const
[3779]302        {
303           return _data+getMipmapOffset(mipmapLevel);
304        }
[9298]305
306        /*inline const unsigned char* getMipmapData(unsigned int row, unsigned int column, unsigned int mipmapLevel) const
307        {
308           if (!_data) return NULL;
309           return getMipmapData(mipmapLevel) + (column*getPixelSizeInBits())/8+row*getRowSizeInBytes();
310        }*/
311
[3405]312        /** Return true if this image is translucent - i.e. it has alpha values that are less 1.0 (when normalized). */
[9888]313        virtual bool isImageTranslucent() const;
[616]314
[3819]315        /** Set the optional PixelBufferObject used to map the image memory efficiently to graphics memory. */
316        void setPixelBufferObject(PixelBufferObject* buffer) { _bufferObject = buffer; if (_bufferObject.valid()) _bufferObject->setImage(this); }
317
318        /** Get the PixelBufferObject.*/
319        PixelBufferObject* getPixelBufferObject() { return _bufferObject.get(); }
320
321        /** Get the const PixelBufferObject.*/
322        const PixelBufferObject* getPixelBufferObject() const { return _bufferObject.get(); }
[8642]323       
[9388]324        virtual void update(NodeVisitor* /*nv*/) {}       
[9088]325
[9319]326        /** method for sending pointer events to images that are acting as front ends to interactive surfaces such as a vnc or browser window.  Return true if handled. */
[9388]327        virtual bool sendPointerEvent(int /*x*/, int /*y*/, int /*buttonMask*/) { return false; }
[9088]328
[9319]329        /** method for sending key events to images that are acting as front ends to interactive surfaces such as a vnc or browser window.  Return true if handled.*/
[9388]330        virtual bool sendKeyEvent(int /*key*/, bool /*keyDown*/) { return false; }
[9088]331
[9219]332        /** method for passing frame information to the custom Image classes, to be called only when objects associated with imagery are not culled.*/
[9388]333        virtual void setFrameLastRendered(const osg::FrameStamp* /*frameStamp*/) {}
[9088]334
[2]335    protected :
336
337        virtual ~Image();
338
[341]339        Image& operator = (const Image&) { return *this; }
[2]340
[8]341        std::string _fileName;
[8834]342        WriteHint   _writeHint;
[1624]343
[8834]344
[6947]345        Origin _origin;
346
[2]347        int _s, _t, _r;
[529]348        GLint _internalTextureFormat;
349        GLenum _pixelFormat;
350        GLenum _dataType;
[2]351        unsigned int _packing;
[9910]352        float _pixelAspectRatio;
[1624]353
354        AllocationMode _allocationMode;
[4297]355        unsigned char* _data;
[1624]356       
357        void deallocateData();
358       
[4297]359        void setData(unsigned char* data,AllocationMode allocationMode);
[2]360
[3819]361        unsigned int _modifiedCount;
[616]362
363        MipmapDataType _mipmapData;
[3819]364       
365        ref_ptr<PixelBufferObject> _bufferObject;
[2]366};
367
368class Geode;
369
[3405]370/** Convenience function to be used by image loaders to generate a valid geode
371  * to return for readNode().
372  * Use the image's s and t values to scale the dimensions of the image.
373*/
[4021]374extern OSG_EXPORT Geode* createGeodeForImage(Image* image);
[3405]375/** Convenience function to be used by image loaders to generate a valid geode
376  * to return for readNode().
377  * Use the specified s and t values to scale the dimensions of the image.
378*/
[4021]379extern OSG_EXPORT Geode* createGeodeForImage(Image* image,float s,float t);
[2]380
[349]381}
[2]382
383#endif                                            // __SG_IMAGE_H
Note: See TracBrowser for help on using the browser.