14 #ifndef OSG_IMAGEUTILS
15 #define OSG_IMAGEUTILS 1
24 template <
typename T,
class O>
25 void _readRow(
unsigned int num, GLenum pixelFormat,
const T* data, O& operation)
29 case(
GL_INTENSITY): {
for(
unsigned int i=0;i<num;++i) { T v=*data++; operation.rgba( operation.cast(v),operation.cast(v),operation.cast(v),operation.cast(v)); } }
break;
30 case(GL_LUMINANCE): {
for(
unsigned int i=0;i<num;++i) { operation.luminance(operation.cast(*data++)); } }
break;
31 case(GL_ALPHA): {
for(
unsigned int i=0;i<num;++i) { operation.alpha(operation.cast(*data++)); } }
break;
32 case(GL_LUMINANCE_ALPHA): {
for(
unsigned int i=0;i<num;++i) { T l=*data++; T a = *data++; operation.luminance_alpha(operation.cast(l),operation.cast(a)); } }
break;
33 case(GL_RGB): {
for(
unsigned int i=0;i<num;++i) { T r=*data++; T g=*data++; T b=*data++; operation.rgb(operation.cast(r),operation.cast(g),operation.cast(b)); } }
break;
34 case(GL_RGBA): {
for(
unsigned int i=0;i<num;++i) { T r=*data++; T g=*data++; T b=*data++; T a=*data++; operation.rgba(operation.cast(r),operation.cast(g),operation.cast(b),operation.cast(a)); } }
break;
35 case(
GL_BGR): {
for(
unsigned int i=0;i<num;++i) { T b=*data++; T g=*data++; T r=*data++; operation.rgb(operation.cast(r),operation.cast(g),operation.cast(b)); } }
break;
36 case(
GL_BGRA): {
for(
unsigned int i=0;i<num;++i) { T b=*data++; T g=*data++; T r=*data++; T a=*data++; operation.rgba(operation.cast(r),operation.cast(g),operation.cast(b),operation.cast(a)); } }
break;
42 void readRow(
unsigned int num, GLenum pixelFormat, GLenum dataType,
const unsigned char* data, O& operation)
46 case(GL_BYTE):
_readRow(num, pixelFormat, (
const char*)data, operation);
break;
47 case(GL_UNSIGNED_BYTE):
_readRow(num, pixelFormat, (
const unsigned char*)data, operation);
break;
48 case(GL_SHORT):
_readRow(num, pixelFormat, (
const short*) data, operation);
break;
49 case(GL_UNSIGNED_SHORT):
_readRow(num, pixelFormat, (
const unsigned short*)data, operation);
break;
50 case(
GL_INT):
_readRow(num, pixelFormat, (
const int*) data, operation);
break;
52 case(GL_FLOAT):
_readRow(num, pixelFormat, (
const float*) data, operation);
break;
53 case(
GL_DOUBLE):
_readRow(num, pixelFormat, (
const double*) data, operation);
break;
63 for(
int r=0;r<image->
r();++r)
65 for(
int t=0;t<image->
t();++t)
75 float cast(
char v) {
return static_cast<float>(v)*(1.0f/128.0f); }
76 float cast(
unsigned char v) {
return static_cast<float>(v)*(1.0f/255.0f); }
77 float cast(
short v) {
return static_cast<float>(v)*(1.0f/32768.0f); }
78 float cast(
unsigned short v) {
return static_cast<float>(v)*(1.0f/65535.0f); }
79 float cast(
int v) {
return static_cast<float>(v)*(1.0f/2147483648.0f); }
80 float cast(
unsigned int v) {
return static_cast<float>(v)*(1.0f/4294967295.0f); }
81 float cast(
float v) {
return v; }
82 float cast(
double v) {
return static_cast<double>(v); }
86 template <
typename T,
class O>
87 void _readRow(
unsigned int num, GLenum pixelFormat,
const T* data,
float scale, O& operation)
91 case(GL_LUMINANCE): {
for(
unsigned int i=0;i<num;++i) {
float l = float(*data++)*scale; operation.luminance(l); } }
break;
92 case(GL_ALPHA): {
for(
unsigned int i=0;i<num;++i) {
float a = float(*data++)*scale; operation.alpha(a); } }
break;
93 case(GL_LUMINANCE_ALPHA): {
for(
unsigned int i=0;i<num;++i) {
float l = float(*data++)*scale;
float a = float(*data++)*scale; operation.luminance_alpha(l,a); } }
break;
94 case(GL_RGB): {
for(
unsigned int i=0;i<num;++i) {
float r = float(*data++)*scale;
float g = float(*data++)*scale;
float b = float(*data++)*scale; operation.rgb(r,g,b); } }
break;
95 case(GL_RGBA): {
for(
unsigned int i=0;i<num;++i) {
float r = float(*data++)*scale;
float g = float(*data++)*scale;
float b = float(*data++)*scale;
float a = float(*data++)*scale; operation.rgba(r,g,b,a); } }
break;
96 case(
GL_BGR): {
for(
unsigned int i=0;i<num;++i) {
float b = float(*data++)*scale;
float g = float(*data++)*scale;
float r = float(*data++)*scale; operation.rgb(r,g,b); } }
break;
97 case(
GL_BGRA): {
for(
unsigned int i=0;i<num;++i) {
float b = float(*data++)*scale;
float g = float(*data++)*scale;
float r = float(*data++)*scale;
float a = float(*data++)*scale; operation.rgba(r,g,b,a); } }
break;
102 void readRow(
unsigned int num, GLenum pixelFormat, GLenum dataType,
const unsigned char* data, O& operation)
106 case(GL_BYTE):
_readRow(num,pixelFormat, (
const char*)data, 1.0f/128.0f, operation);
break;
107 case(GL_UNSIGNED_BYTE):
_readRow(num,pixelFormat, (
const unsigned char*)data, 1.0f/255.0f, operation);
break;
108 case(GL_SHORT):
_readRow(num,pixelFormat, (
const short*) data, 1.0f/32768.0f, operation);
break;
109 case(GL_UNSIGNED_SHORT):
_readRow(num,pixelFormat, (
const unsigned short*)data, 1.0f/65535.0f, operation);
break;
110 case(
GL_INT):
_readRow(num,pixelFormat, (
const int*) data, 1.0f/2147483648.0f, operation);
break;
111 case(
GL_UNSIGNED_INT):
_readRow(num,pixelFormat, (
const unsigned int*) data, 1.0f/4294967295.0f, operation);
break;
112 case(GL_FLOAT):
_readRow(num,pixelFormat, (
const float*) data, 1.0f, operation);
break;
121 for(
int r=0;r<image->
r();++r)
123 for(
int t=0;t<image->
t();++t)
144 template <
typename T,
class M>
145 void _modifyRow(
unsigned int num, GLenum pixelFormat, T* data,
float scale,
const M& operation)
147 float inv_scale = 1.0f/scale;
150 case(GL_LUMINANCE): {
for(
unsigned int i=0;i<num;++i) {
float l = float(*data)*scale; operation.luminance(l); *data++ = T(l*inv_scale); } }
break;
151 case(GL_ALPHA): {
for(
unsigned int i=0;i<num;++i) {
float a = float(*data)*scale; operation.alpha(a); *data++ = T(a*inv_scale); } }
break;
152 case(GL_LUMINANCE_ALPHA): {
for(
unsigned int i=0;i<num;++i) {
float l = float(*data)*scale;
float a = float(*(data+1))*scale; operation.luminance_alpha(l,a); *data++ = T(l*inv_scale); *data++ = T(a*inv_scale); } }
break;
153 case(GL_RGB): {
for(
unsigned int i=0;i<num;++i) {
float r = float(*data)*scale;
float g = float(*(data+1))*scale;
float b = float(*(data+2))*scale; operation.rgb(r,g,b); *data++ = T(r*inv_scale); *data++ = T(g*inv_scale); *data++ = T(b*inv_scale); } }
break;
154 case(GL_RGBA): {
for(
unsigned int i=0;i<num;++i) {
float r = float(*data)*scale;
float g = float(*(data+1))*scale;
float b = float(*(data+2))*scale;
float a = float(*(data+3))*scale; operation.rgba(r,g,b,a); *data++ = T(r*inv_scale); *data++ = T(g*inv_scale); *data++ = T(b*inv_scale); *data++ = T(a*inv_scale); } }
break;
155 case(
GL_BGR): {
for(
unsigned int i=0;i<num;++i) {
float b = float(*data)*scale;
float g = float(*(data+1))*scale;
float r = float(*(data+2))*scale; operation.rgb(r,g,b); *data++ = T(b*inv_scale); *data++ = T(g*inv_scale); *data++ = T(r*inv_scale); } }
break;
156 case(
GL_BGRA): {
for(
unsigned int i=0;i<num;++i) {
float b = float(*data)*scale;
float g = float(*(data+1))*scale;
float r = float(*(data+2))*scale;
float a = float(*(data+3))*scale; operation.rgba(r,g,b,a); *data++ = T(b*inv_scale); *data++ = T(g*inv_scale); *data++ = T(r*inv_scale); *data++ = T(a*inv_scale); } }
break;
161 void modifyRow(
unsigned int num, GLenum pixelFormat, GLenum dataType,
unsigned char* data,
const M& operation)
165 case(GL_BYTE):
_modifyRow(num,pixelFormat, (
char*)data, 1.0f/128.0f, operation);
break;
166 case(GL_UNSIGNED_BYTE):
_modifyRow(num,pixelFormat, (
unsigned char*)data, 1.0f/255.0f, operation);
break;
167 case(GL_SHORT):
_modifyRow(num,pixelFormat, (
short*) data, 1.0f/32768.0f, operation);
break;
168 case(GL_UNSIGNED_SHORT):
_modifyRow(num,pixelFormat, (
unsigned short*)data, 1.0f/65535.0f, operation);
break;
169 case(
GL_INT):
_modifyRow(num,pixelFormat, (
int*) data, 1.0f/2147483648.0f, operation);
break;
171 case(GL_FLOAT):
_modifyRow(num,pixelFormat, (
float*) data, 1.0f, operation);
break;
180 for(
int r=0;r<image->
r();++r)
182 for(
int t=0;t<image->
t();++t)
197 osg::Image* destImage,
int dest_s,
int dest_t,
int dest_r,
bool doRescale =
false);
202 typedef std::vector< osg::ref_ptr<osg::Image> >
ImageList;
209 GLenum desiredPixelFormat,
210 int s_maximumImageSize = 1024,
211 int t_maximumImageSize = 1024,
212 int r_maximumImageSize = 1024,
213 bool resizeToPowerOfTwo =
false);
217 int s_maximumImageSize = 1024,
218 int t_maximumImageSize = 1024,
219 int r_maximumImageSize = 1024,
220 bool resizeToPowerOfTwo =
false);
OSG_EXPORT bool copyImage(const osg::Image *srcImage, int src_s, int src_t, int src_r, int width, int height, int depth, osg::Image *destImage, int dest_s, int dest_t, int dest_r, bool doRescale=false)
OSG_EXPORT osg::Image * createImageWithOrientationConversion(const osg::Image *srcImage, const osg::Vec3i &srcOrigin, const osg::Vec3i &srcRow, const osg::Vec3i &srcColumn, const osg::Vec3i &srcLayer)
void readRow(unsigned int num, GLenum pixelFormat, GLenum dataType, const unsigned char *data, O &operation)
OSG_EXPORT unsigned int maximimNumOfComponents(const ImageList &imageList)
OSG_EXPORT bool computeMinMax(const osg::Image *image, osg::Vec4 &min, osg::Vec4 &max)
GLint GLenum GLsizei GLsizei GLsizei depth
GLenum getPixelFormat() const
void modifyImage(osg::Image *image, const M &operation)
void _readRow(unsigned int num, GLenum pixelFormat, const T *data, O &operation)
OSG_EXPORT osg::Image * createImage3D(const ImageList &imageList, GLenum desiredPixelFormat, int s_maximumImageSize=1024, int t_maximumImageSize=1024, int r_maximumImageSize=1024, bool resizeToPowerOfTwo=false)
GLint GLenum GLsizei width
OSG_EXPORT osg::Image * colorSpaceConversion(ColorSpaceOperation op, osg::Image *image, const osg::Vec4 &colour)
void modifyRow(unsigned int num, GLenum pixelFormat, GLenum dataType, unsigned char *data, const M &operation)
float cast(unsigned int v)
OSG_EXPORT bool offsetAndScaleImage(osg::Image *image, const osg::Vec4 &offset, const osg::Vec4 &scale)
GLenum getDataType() const
GLint GLenum GLsizei GLsizei height
OSG_EXPORT osg::Image * createImage3DWithAlpha(const ImageList &imageList, int s_maximumImageSize=1024, int t_maximumImageSize=1024, int r_maximumImageSize=1024, bool resizeToPowerOfTwo=false)
float cast(unsigned short v)
void _modifyRow(unsigned int num, GLenum pixelFormat, T *data, float scale, const M &operation)
float cast(unsigned char v)
OSG_EXPORT osg::Image * createSpotLightImage(const osg::Vec4 ¢erColour, const osg::Vec4 &backgroudColour, unsigned int size, float power)
OSG_EXPORT bool clearImageToColor(osg::Image *image, const osg::Vec4 &colour)
void readImage(const osg::Image *image, O &operation)
std::vector< osg::ref_ptr< osg::Image > > ImageList