HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
PXL_Raster.h
Go to the documentation of this file.
1 /*
2  * PROPRIETARY INFORMATION. This software is proprietary to
3  * Side Effects Software Inc., and is not to be reproduced,
4  * transmitted, or disclosed in any way without written permission.
5  *
6  * NAME: PXL_Raster.h (Pixel Library, C++)
7  *
8  * COMMENTS:
9  * Defines a more generic raster for texture maps & display.
10  *
11  */
12 #ifndef PXL_RASTER_H
13 #define PXL_RASTER_H
14 
15 #include "PXL_API.h"
16 #include "PXL_Common.h"
17 #include <UT/UT_Rect.h>
18 #include <UT/UT_SmallObject.h>
19 #include <UT/UT_StringHolder.h>
20 #include <SYS/fpreal16Limits.h>
21 #include <SYS/SYS_TypeTraits.h>
22 #include <iosfwd>
23 #include <limits>
24 
25 class UT_IStream;
26 
27 #define PXL_ROFF 16
28 
33 };
34 
36  : public UT_SmallObject<PXL_Raster,
37  UT_SMALLOBJECT_CLEANPAGES_OFF, 250,
38  UT_SMALLOBJECT_THREADSAFE_ON>
39 {
40 public:
41  PXL_Raster();
42  PXL_Raster(const PXL_Raster &);
43  PXL_Raster(const PXL_Raster &,
44  exint x1, exint y1, exint x2, exint y2);
46  exint xres = 0, exint yres = 0, int clear = 0,
47  int alloc = 1);
48  virtual ~PXL_Raster();
49 
50  virtual int64 getMemoryUsage(bool inclusive) const;
51 
52 
53  /// Assignment disallowed, use copy() instead. @see copyProperties()
54  PXL_Raster& operator=(const PXL_Raster &) = delete;
55 
56  /// Copy over all the information and data from the src. This allocates a
57  /// new raster (rather than doing a shallow copy).
58  virtual void copy(const PXL_Raster &src);
59 
60  /// copies only the raster properties (res, type, etc), not the data, nor
61  /// does this method allocate memory for a raster.
62  virtual void copyProperties(const PXL_Raster &src);
63 
64  // initializes the raster (destroys any previous image data). If you call
65  // any of these methods, call init() after to reallocate the raster.
66  void setPacking(PXL_Packing p);
67  void setFormat(PXL_DataFormat f);
68  void setRes(exint x, exint y);
69  void setBWPoints(float black, float white);
70 
71  /// Colorspace that this raster is in. Changing the color space does not
72  /// affect the image values stored in this raster, only how they are
73  /// interpreted. custom_gamma must be specified for PXL_CS_CUSTOM_GAMMA.
74  void setColorSpace(PXL_ColorSpace space,
75  fpreal custom_gamma = 0.0);
76  void setOCIOColorSpace(const UT_StringHolder &space);
77  void setOCIODisplayView(const UT_StringHolder &baked_display,
78  const UT_StringHolder &baked_view);
79  void setOCIOParms(const UT_StringHolder &color_space,
80  const UT_StringHolder &baked_display,
81  const UT_StringHolder &baked_view);
82 
83  void init();
84 
85  // sets the raster data to r, optionally giving this class ownership of it.
86  // make sure it's the right packing type, res & format!
87  void setRaster(void *r, bool give_ownership = true,
88  bool use_offset = false);
89 
90  // steals ownership from this raster. Returns NULL if this raster doesn't
91  // own the image.
92  void * steal();
93 
94  // packing, format & xres/yres must be set for the raster to be valid.
95  int isValid() const { return myRaster ? 1 : 0; }
96  // accessers.
97  exint getXres() const { return myXres; }
98  exint getYres() const { return myYres; }
99  exint getNumPixels() const { return myXres * myYres; }
100  int64 getStride() const { return myStride; }
101  int64 getSize() const { return myRasterSize; } // bytes
102  PXL_DataFormat getFormat() const { return myFormat; }
103  PXL_Packing getPacking() const { return myPacking; }
104  void getBWPoints(float &black, float &white) const;
105  int getNumChannels() const
106  { return PXLpackingComponents(myPacking); }
107 
108  // Rotation of the raster. Must be between [-360, 360] in 90 degree increments
109  void setRotation(int rotation);
110  int getRotation() const { return myRotation; }
111  bool isRotated() const { return myRotation != 0; }
112 
113  // Raster width and height taking the rotation into consideration
114  exint getCorrectedXres() const;
115  exint getCorrectedYres() const;
116 
117  /// Colorspace this raster requires for correct display
118  PXL_ColorSpace getColorSpace() const { return myColorSpace; }
119 
120  /// Gamma that must be applied to this raster to get accurate color. Only
121  /// valid for PXL_CS_LINEAR, PXL_CS_GAMMA2_2, and PXL_CS_CUSTOM_GAMMA.
122  fpreal getColorSpaceGamma() const { return myColorSpaceGamma; }
123  /// OCIO colorspace name, valid for PXL_CS_OCIO
124  const UT_StringHolder &getColorSpaceName() const { return myColorSpaceName;}
125  const UT_StringHolder &getOCIODisplay() const { return myOCIODisplay;}
126  const UT_StringHolder &getOCIOView() const { return myOCIOView; }
127 
128  // data window
129  void setDataWindow(const UT_DimRect &new_rect);
130  const UT_DimRect & getDataWindow() const
131  { return myDataWindow; }
132  bool hasDataWindow() const
133  { return !myDataWindow.isEmpty(); }
134 
135  // returns the min/max values. black & white specify the black & white
136  // of the raster, comp specifies an optional component to get the range
137  // from. If ignore_farthest is true, 'max' will contain the 2nd largest
138  // value. Good for ignoring the background.
139  void getRange(float &min, float &max,
140  float black = 0.0f, float white = 1.0f,
141  exint comp = -1,
142  bool ignore_farthest = false) const;
143 
144  // leave 2 pixels to draw grey single channels (R,G,B)
145  void * getPixels()
146  { return (unsigned char *)myRaster+myRasterOffset; }
147 
148  const void * getPixels() const
149  { return (unsigned char *)myRaster+myRasterOffset; }
150 
151  // this is for drawing single greyscale R,G,B images.
152  const void * getRawPixels() const
153  { return myRaster; }
154 
155  // x/y coords, + comp# for Non-interleaved data (0-2 for RGB, 0-3 RGBA).
156  void * getPixel(exint x, exint y, exint comp = 0);
157  const void * getPixel(exint x, exint y, exint comp = 0) const;
158 
159  void setPixelValue(exint x, exint y, const float *vals);
160  void getPixelValue(exint x, exint y, float *vals) const;
161 
162  // returns 1 if interleaved (RGBRGB), 0 otherwise.
163  bool isInterleaved() const;
164 
165  // returns 1 if this raster can have its components rendered separately.
166  int areComponentsRenderable() const;
167 
168  // if not interleaved, returbs the size of 1 channel's data.
169  int64 getNonInterleavedSize() const;
170 
171  // simple operations.
172 
173  // clears the raster to 0, unless color is not null; it assumes it points
174  // to 8/16/32 bit int or float single/triple/quad value, depending on
175  // packing type & data format.
176  void clear(const void *color = 0);
177  void clearNormal(const float *color,
178  unsigned ib = 0,
179  unsigned iw = 0);
180 
181 
182  // reads a scanline from the raster. THe buffer must be big enough to
183  // hold a single scanline at the data format and packing of the raster.
184  void readFromRow(exint y, void *data) const;
185 
186  // Writes a scanline to the raster. The data format and packing are
187  // assumed to match the raster's.
188  void writeToRow(exint y, const void *data);
189 
190  // instead of writing a scanline, this writes a column of data. The
191  // data format and packing are assumed to match the raster's, and
192  // have yres pixels. Useful for flopping images.
193  void writeToColumn(exint x, const void *data);
194 
195  // deletes the image memory. If full = 1, everything is reset - xres/yres
196  // to 0, packing and format to invalid.
197  virtual void reset(int full = 0);
198 
199  // Extracts a portion of the image 'from' into this raster, setting the
200  // res, data format and packing if needed.
201  void extract(const PXL_Raster &from,
202  exint x1, exint y1, exint x2, exint y2);
203 
204  // Inserts a portion of the image 'from' into this raster. The res,
205  // data format and packing must match.
206  void insert(const PXL_Raster &from,exint x, exint y);
207 
208  // If RGB, add an Alpha channel.
209  void promoteRGBToRGBA(fpreal alpha = 1.0);
210 
211  void applyLUT(const PXL_Raster *src, float *lptr[4],
212  exint comp, float lstart, float lend);
213 
214  // of the raster. The rectangle can go outside of the raster.
215  void streakEdges(exint x1,exint y1, exint x2,exint y2,
216  PXL_StreakComponents streak_comps = PXL_STREAK_ALL);
217  void convert8Bit(unsigned b, unsigned w);
218 
219  void adjustSaturation(float sat);
220 
221  // flip the raster in-place
222  void flipVertical();
223 
224  bool load(UT_IStream &is);
225  int save(std::ostream &os, int binary = 1) const;
226 
227  int getProxyIndex() const { return myProxyIndex; }
228 
229  void setDataWritten(bool written = true)
230  { myWriteFlag = written; }
231  bool getDataWritten() const { return myWriteFlag; }
232 
233  void setTextureID(void *id) { myTextureID = id; }
234  void *getTextureID() const;
235  void clearTextureID();
236  void setManagesOwnTextureID(bool manages_own)
237  { myManagesOwnTextureID = manages_own; }
238  bool managesOwnTextureID() const
239  { return myManagesOwnTextureID; }
240 
241  // dither the image in a subdued way for mplay's render over previous.
242  // If a crop region is provided, only pixels inside the crop will be
243  // dimmed.
244  void dither(const UT_DimRect &crop);
245  void dither();
246 
247  bool premultiply(PXL_Raster *other = nullptr);
248  bool unpremultiply(PXL_Raster *other = nullptr);
249 
250  bool hasAlpha() const;
251 
252  bool clampAlpha();
253 
254  void addInterest(void *callerData,
255  void (*changeCB)(PXL_Raster *, void *));
256  void removeInterest();
257 
258 protected:
259  virtual void initialize();
260  bool allocRaster(int alloc_mem = 1);
261  void freeRaster();
262 
263  void applyLUT8(const PXL_Raster *src, float *lptr[4],
264  exint comp, float lscale, float lshift,
265  exint size);
266  void applyLUT16(const PXL_Raster *src, float *lptr[4],
267  exint comp, float lscale, float lshift,
268  exint size);
269 
270  virtual void attemptRealloc(int64 size);
271 
280  exint myXres, myYres;
283  float myBlack, myWhite;
285  void *myRaster;
286  bool myAmOwner;
290  void *myTextureID;
291  void (*myChangeCB)(PXL_Raster *, void *);
293 
294  UT_DimRect myDataWindow; // (0,0) is lower-left corner
295 };
296 
297 /// This is a wrapper for when the PXL_DataFormat and PXL_Packing are known
298 /// at compile-time, e.g. constructing this inside a branch of a switch
299 /// statement over all types.
300 template<typename T, int NCOMPONENTS, bool INTERLEAVED, bool READ_ONLY>
302 {
303 public:
306 
308  {
309  UT_ASSERT_COMPILETIME(NCOMPONENTS >= 1 && NCOMPONENTS <= 4);
311 
312  setRaster(raster);
313  }
314 
316  {
318  }
319 
321  {
322  return myRaster;
323  }
324 
326  {
327  return myRaster->getXres();
328  }
330  {
331  return myRaster->getYres();
332  }
333 
335  {
336  myRaster = raster;
337  if (!raster)
338  return;
339 
340  UT_ASSERT(PXLpackingComponents(raster->getPacking()) == NCOMPONENTS);
341  UT_ASSERT(NCOMPONENTS==1 || raster->isInterleaved() == INTERLEAVED);
342  UT_ASSERT(sizeof(T) == PXLformatDepth(raster->getFormat()));
344  raster->getFormat() == PXL_INT8 ||
345  raster->getFormat() == PXL_INT16 ||
346  raster->getFormat() == PXL_INT32));
347  UT_ASSERT(raster->getRawPixels() != nullptr);
348  }
349 
350  DataType *getPixel(exint x, exint y, exint comp = 0) const
351  {
352  UT_ASSERT_P(myRaster);
353  if (!myRaster)
354  return nullptr;
355  const exint xres = myRaster->getXres();
356  const exint yres = myRaster->getYres();
357  if (x < 0 || y < 0 || x >= xres || y >= yres || !myRaster->getRawPixels())
358  return nullptr;
359 
360  const exint stride = myRaster->getStride();
361  int64 offset;
362  if (NCOMPONENTS==1)
363  offset = x*sizeof(T) + y * stride;
364  else if (INTERLEAVED)
365  offset = (comp+x*NCOMPONENTS)*sizeof(T) + y * stride;
366  else
367  offset = x *sizeof(T) + (y + comp*yres) * stride;
368 
369  return (DataType *)(((typename SYS_ConstType<unsigned char,READ_ONLY>::type *)myRaster->getPixels()) + offset);
370  }
371 
372  SYS_FORCE_INLINE DataType *getPixelFast(void *pixels, exint x, exint y/*, exint comp = 0*/) const
373  {
374  UT_ASSERT_P(myRaster);
375  const exint stride = myRaster->getStride();
376  int64 offset;
377  if (NCOMPONENTS==1)
378  offset = x*sizeof(T) + y * stride;
379  else if (INTERLEAVED)
380  offset = (/*comp+*/x*NCOMPONENTS)*sizeof(T) + y * stride;
381  else
382  offset = x *sizeof(T) + (y /*+ comp*myRaster->getYres()*/) * stride;
383  return (DataType *)(((typename SYS_ConstType<unsigned char,READ_ONLY>::type *)pixels) + offset);
384  }
385 
386  SYS_FORCE_INLINE void getPixelValueFast(const void *pixels, exint x, exint y, float *vals) const
387  {
388  // const even if READ_ONLY is false
389  const DataType *data = getPixelFast(pixels, x, y);
390  if (INTERLEAVED || NCOMPONENTS==1)
391  {
392  for (int i = 0; i < NCOMPONENTS; ++i)
393  {
395  vals[i] = float(data[i])/float(std::numeric_limits<T>::max());
396  else
397  vals[i] = float(data[i]);
398  }
399  }
400  else
401  {
402  const exint yres_stride = myRaster->getYres()*myRaster->getStride();
403  for (int i = 0; i < NCOMPONENTS; ++i,
404  data = (const DataType *)(((const unsigned char *)data) + yres_stride))
405  {
407  vals[i] = float(*data)/float(std::numeric_limits<T>::max());
408  else
409  vals[i] = float(*data);
410  }
411  }
412  }
413 
415  {
416  UT_ASSERT_P(!READ_ONLY);
417 
418  DataType *data = getPixelFast(pixels, x, y);
419  if (INTERLEAVED || NCOMPONENTS==1)
420  {
421  for (int i = 0; i < NCOMPONENTS; ++i)
422  data[i] = T(0);
423  }
424  else
425  {
426  const exint yres_stride = myRaster->getYres()*myRaster->getStride();
427  for (int i = 0; i < NCOMPONENTS; ++i,
428  data = (DataType *)(((typename SYS_ConstType<unsigned char,READ_ONLY>::type *)data) + yres_stride))
429  {
430  *data = T(0);
431  }
432  }
433  }
434 
436  {
438  return T(val * std::numeric_limits<T>::max());
439  else
440  return T(val);
441  }
442 
443  SYS_FORCE_INLINE void setPixelValueFast(void *pixels, exint x, exint y, const T *vals) const
444  {
445  UT_ASSERT_P(!READ_ONLY);
446 
447  DataType *data = getPixelFast(pixels, x, y);
448  if (INTERLEAVED || NCOMPONENTS==1)
449  {
450  for (int i = 0; i < NCOMPONENTS; ++i)
451  data[i] = vals[i];
452  }
453  else
454  {
455  const exint yres_stride = myRaster->getYres()*myRaster->getStride();
456  for (int i = 0; i < NCOMPONENTS; ++i,
457  data = (DataType *)(((typename SYS_ConstType<unsigned char,READ_ONLY>::type *)data) + yres_stride))
458  {
459  *data = vals[i];
460  }
461  }
462  }
463 
464 private:
465  RasterType *myRaster;
466 };
467 
468 #endif
SYS_FORCE_INLINE DataType * getPixelFast(void *pixels, exint x, exint y) const
Definition: PXL_Raster.h:372
void * getPixels()
Definition: PXL_Raster.h:145
SYS_FORCE_INLINE void getPixelValueFast(const void *pixels, exint x, exint y, float *vals) const
Definition: PXL_Raster.h:386
int PXLpackingComponents(PXL_Packing p)
Definition: PXL_Common.h:126
fpreal myColorSpaceGamma
Definition: PXL_Raster.h:275
UT_ASSERT_COMPILETIME(BRAY_EVENT_MAXFLAGS<=32)
SYS_FORCE_INLINE exint getYres() const
Definition: PXL_Raster.h:329
void * myTextureID
Definition: PXL_Raster.h:290
bool myManagesOwnTextureID
Definition: PXL_Raster.h:289
exint getYres() const
Definition: PXL_Raster.h:98
int getNumChannels() const
Definition: PXL_Raster.h:105
int getRotation() const
Definition: PXL_Raster.h:110
void setTextureID(void *id)
Definition: PXL_Raster.h:233
void
Definition: png.h:1083
OIIO_UTIL_API bool copy(string_view from, string_view to, std::string &err)
PXL_DataFormat myFormat
Definition: PXL_Raster.h:272
exint myRasterOffset
Definition: PXL_Raster.h:279
const GLuint GLenum const void * binary
Definition: glcorearb.h:1924
UT_StringHolder myColorSpaceName
Definition: PXL_Raster.h:276
PXL_ColorSpace getColorSpace() const
Colorspace this raster requires for correct display.
Definition: PXL_Raster.h:118
const void * getRawPixels() const
Definition: PXL_Raster.h:152
bool_constant< is_integral< T >::value &&!std::is_same< T, bool >::value &&!std::is_same< T, char >::value &&!std::is_same< T, wchar_t >::value > is_integer
Definition: format.h:2010
int64 exint
Definition: SYS_Types.h:125
fpreal getColorSpaceGamma() const
Definition: PXL_Raster.h:122
const UT_StringHolder & getOCIODisplay() const
Definition: PXL_Raster.h:125
const UT_StringHolder & getOCIOView() const
Definition: PXL_Raster.h:126
ImageBuf OIIO_API min(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
GLint GLint GLsizei GLint GLenum GLenum const void * pixels
Definition: glcorearb.h:108
GLint y
Definition: glcorearb.h:103
bool myWriteFlag
Definition: PXL_Raster.h:288
std::integral_constant< bool, std::numeric_limits< T >::is_signed||std::is_same< T, int128_t >::value > is_signed
Definition: format.h:821
OIIO_FORCEINLINE vbool4 insert(const vbool4 &a, bool val)
Helper: substitute val for a[i].
Definition: simd.h:3436
bool getDataWritten() const
Definition: PXL_Raster.h:231
SYS_FORCE_INLINE PXL_RasterWrapper< T, NCOMPONENTS, INTERLEAVED, true > makeConstant() const
Definition: PXL_Raster.h:315
#define PXL_API
Definition: PXL_API.h:10
void * myRaster
Definition: PXL_Raster.h:285
GLdouble GLdouble x2
Definition: glad.h:2349
PXL_DataFormat getFormat() const
Definition: PXL_Raster.h:102
int64 myStride
Definition: PXL_Raster.h:281
#define UT_ASSERT_MSG(ZZ,...)
Definition: UT_Assert.h:159
OIIO_FORCEINLINE bool extract(const vbool4 &a)
Definition: simd.h:3426
SYS_FORCE_INLINE exint getXres() const
Definition: PXL_Raster.h:325
GLfloat f
Definition: glcorearb.h:1926
GLintptr offset
Definition: glcorearb.h:665
PXL_ColorSpace myColorSpace
Definition: PXL_Raster.h:274
PXL_Packing getPacking() const
Definition: PXL_Raster.h:103
GLboolean reset
Definition: glad.h:5138
bool myAmOwner
Definition: PXL_Raster.h:286
exint getNumPixels() const
Definition: PXL_Raster.h:99
#define UT_ASSERT_P(ZZ)
Definition: UT_Assert.h:155
SYS_FORCE_INLINE void setRaster(RasterType *raster)
Definition: PXL_Raster.h:334
int isValid() const
Definition: PXL_Raster.h:95
bool isRotated() const
Definition: PXL_Raster.h:111
#define SYS_FORCE_INLINE
Definition: SYS_Inline.h:45
GLint GLenum GLboolean GLsizei stride
Definition: glcorearb.h:872
GLdouble y1
Definition: glad.h:2349
SYS_ConstType< T, READ_ONLY >::type DataType
Definition: PXL_Raster.h:305
float myWhite
Definition: PXL_Raster.h:283
PXL_Packing
Definition: PXL_Common.h:32
bool isInterleaved() const
HUSD_API const char * raster()
UT_StringHolder myOCIOView
Definition: PXL_Raster.h:278
long long int64
Definition: SYS_Types.h:116
GLuint id
Definition: glcorearb.h:655
bool managesOwnTextureID() const
Definition: PXL_Raster.h:238
GLfloat GLfloat GLfloat alpha
Definition: glcorearb.h:112
SIM_API const UT_StringHolder rotation
int myProxyIndex
Definition: PXL_Raster.h:287
OPENVDB_API void initialize()
Global registration of native Grid, Transform, Metadata and Point attribute types. Also initializes blosc (if enabled).
Definition: logging.h:294
bool hasDataWindow() const
Definition: PXL_Raster.h:132
int64 myRasterSize
Definition: PXL_Raster.h:282
PXL_DataFormat
Definition: PXL_Common.h:20
static SYS_FORCE_INLINE T convertFromFloat(const float val)
Definition: PXL_Raster.h:435
GLboolean GLboolean GLboolean b
Definition: glcorearb.h:1222
const UT_DimRect & getDataWindow() const
Definition: PXL_Raster.h:130
GLint GLenum GLint x
Definition: glcorearb.h:409
const void * getPixels() const
Definition: PXL_Raster.h:148
SYS_FORCE_INLINE RasterType * getRaster() const
Definition: PXL_Raster.h:320
exint myYres
Definition: PXL_Raster.h:280
const UT_StringHolder & getColorSpaceName() const
OCIO colorspace name, valid for PXL_CS_OCIO.
Definition: PXL_Raster.h:124
int64 getStride() const
Definition: PXL_Raster.h:100
GLsizeiptr size
Definition: glcorearb.h:664
GLuint color
Definition: glcorearb.h:1261
fpreal64 fpreal
Definition: SYS_Types.h:277
int64 getSize() const
Definition: PXL_Raster.h:101
void * myCallerData
Definition: PXL_Raster.h:292
PXL_ColorSpace
Definition: PXL_Common.h:72
GLuint GLfloat * val
Definition: glcorearb.h:1608
ImageBuf OIIO_API max(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
int PXLformatDepth(PXL_DataFormat d)
Definition: PXL_Common.h:123
int myRotation
Definition: PXL_Raster.h:284
PXL_Packing myPacking
Definition: PXL_Raster.h:273
GLubyte GLubyte GLubyte GLubyte w
Definition: glcorearb.h:857
#define UT_ASSERT(ZZ)
Definition: UT_Assert.h:156
int getProxyIndex() const
Definition: PXL_Raster.h:227
void setDataWritten(bool written=true)
Definition: PXL_Raster.h:229
GLboolean r
Definition: glcorearb.h:1222
GLdouble GLdouble GLdouble y2
Definition: glad.h:2349
void setManagesOwnTextureID(bool manages_own)
Definition: PXL_Raster.h:236
ImageBuf OIIO_API crop(const ImageBuf &src, ROI roi={}, int nthreads=0)
SYS_ConstType< PXL_Raster, READ_ONLY >::type RasterType
Definition: PXL_Raster.h:304
PXL_StreakComponents
Definition: PXL_Raster.h:29
SYS_FORCE_INLINE void zeroPixelValueFast(void *pixels, exint x, exint y) const
Definition: PXL_Raster.h:414
exint getXres() const
Definition: PXL_Raster.h:97
DataType * getPixel(exint x, exint y, exint comp=0) const
Definition: PXL_Raster.h:350
SYS_FORCE_INLINE PXL_RasterWrapper(RasterType *raster=nullptr)
Definition: PXL_Raster.h:307
UT_StringHolder myOCIODisplay
Definition: PXL_Raster.h:277
Definition: format.h:895
SYS_FORCE_INLINE void setPixelValueFast(void *pixels, exint x, exint y, const T *vals) const
Definition: PXL_Raster.h:443
UT_DimRect myDataWindow
Definition: PXL_Raster.h:294
GLenum src
Definition: glcorearb.h:1793