Ptex
PtexReader.h
Go to the documentation of this file.
1 #ifndef PtexReader_h
2 #define PtexReader_h
3 
4 /*
5 PTEX SOFTWARE
6 Copyright 2014 Disney Enterprises, Inc. All rights reserved
7 
8 Redistribution and use in source and binary forms, with or without
9 modification, are permitted provided that the following conditions are
10 met:
11 
12  * Redistributions of source code must retain the above copyright
13  notice, this list of conditions and the following disclaimer.
14 
15  * Redistributions in binary form must reproduce the above copyright
16  notice, this list of conditions and the following disclaimer in
17  the documentation and/or other materials provided with the
18  distribution.
19 
20  * The names "Disney", "Walt Disney Pictures", "Walt Disney Animation
21  Studios" or the names of its contributors may NOT be used to
22  endorse or promote products derived from this software without
23  specific prior written permission from Walt Disney Pictures.
24 
25 Disclaimer: THIS SOFTWARE IS PROVIDED BY WALT DISNEY PICTURES AND
26 CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
27 BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
28 FOR A PARTICULAR PURPOSE, NONINFRINGEMENT AND TITLE ARE DISCLAIMED.
29 IN NO EVENT SHALL WALT DISNEY PICTURES, THE COPYRIGHT HOLDER OR
30 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND BASED ON ANY
34 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
36 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
37 */
38 #include <stdio.h>
39 #include <vector>
40 #include <string>
41 #include <map>
42 #include <errno.h>
43 #include "Ptexture.h"
44 #include "PtexIO.h"
45 #include "PtexUtils.h"
46 
47 #include "PtexHashMap.h"
48 
49 struct libdeflate_decompressor;
50 
52 
53 class PtexReader : public PtexTexture {
54 public:
55  PtexReader(bool premultiply, PtexInputHandler* inputHandler, PtexErrorHandler* errorHandler);
56  virtual ~PtexReader();
57  virtual void release() { delete this; }
58  bool needToOpen() const { return _needToOpen; }
59  bool open(const char* path, Ptex::String& error);
60  void prune();
61  void purge();
62  void setPendingPurge() { _pendingPurge = true; }
63  bool pendingPurge() const { return _pendingPurge; }
64  bool tryClose();
65  bool ok() const { return _ok; }
66  bool isOpen() { return _fp; }
67  void invalidate() {
68  _ok = false;
69  _needToOpen = false;
70  }
71 
72  void increaseMemUsed(size_t amount) { if (amount) AtomicAdd(&_memUsed, amount); }
75 
76  virtual const char* path() { return _path.c_str(); }
77 
78  virtual Info getInfo() {
79  Info info;
87  info.numFaces = _header.nfaces;
88  return info;
89  }
90 
96  virtual int alphaChannel() { return _header.alphachan; }
97  virtual int numChannels() { return _header.nchannels; }
98  virtual int numFaces() { return _header.nfaces; }
99  virtual bool hasEdits() { return false; }
100  virtual bool hasMipMaps() { return _header.nlevels > 1; }
101 
102  virtual PtexMetaData* getMetaData();
103  virtual const Ptex::FaceInfo& getFaceInfo(int faceid);
104  virtual void getData(int faceid, void* buffer, int stride);
105  virtual void getData(int faceid, void* buffer, int stride, Res res);
106  virtual PtexFaceData* getData(int faceid);
107  virtual PtexFaceData* getData(int faceid, Res res);
108  virtual void* getConstantData(int faceid) final { return _constdata + faceid * _pixelsize; }
109  virtual void getPixel(int faceid, int u, int v,
110  float* result, int firstchan, int nchannels);
111  virtual void getPixel(int faceid, int u, int v,
112  float* result, int firstchan, int nchannels,
113  Ptex::Res res);
114  void getCompressedData(int faceid, int level, FaceDataHeader& fdh, std::vector<std::byte>& data);
115 
117  int nchannels() const { return _header.nchannels; }
118  int pixelsize() const { return _pixelsize; }
119  const Header& header() const { return _header; }
120  const ExtHeader& extheader() const { return _extheader; }
121  const LevelInfo& levelinfo(int level) const { return _levelinfo[level]; }
122 
123  class MetaData : public PtexMetaData {
124  public:
126  : _reader(reader) {}
128  virtual void release() {}
129 
130  virtual int numKeys() { return int(_entries.size()); }
131  virtual void getKey(int index, const char*& key, MetaDataType& type)
132  {
133  if (index < 0 || index >= int(_entries.size())) {
134  return;
135  }
136  Entry* e = _entries[index];
137  key = e->key;
138  type = e->type;
139  }
140 
141  virtual bool findKey(const char* key, int& index, MetaDataType& type)
142  {
143  MetaMap::iterator iter = _map.find(key);
144  if (iter==_map.end()) {
145  index = -1;
146  return false;
147  }
148  index = iter->second.index;
149  type = iter->second.type;
150  return true;
151  }
152 
153  virtual void getValue(const char* key, const char*& value)
154  {
155  int index = -1;
156  MetaDataType type;
157  if (!findKey(key, index, type)) {
158  value = 0;
159  return;
160  }
161  Entry* e = getEntry(index);
162  if (e && e->type == mdt_string) value = (const char*) e->data;
163  else value = 0;
164  }
165 
166  virtual void getValue(int index, const char*& value)
167  {
168  if (index < 0 || index >= int(_entries.size())) { value = 0; return; }
169  Entry* e = getEntry(index);
170  if (e && e->type == mdt_string) value = (const char*) e->data;
171  else value = 0;
172  }
173 
174  template<typename T>
175  void getValue(int index, MetaDataType requestedType, const T*& value, int& count)
176  {
177  if (index < 0 || index >= int(_entries.size())) {
178  value = 0;
179  count = 0;
180  return;
181  }
182  Entry* e = getEntry(index);
183  if (e && e->type == requestedType) {
184  value = (const T*) e->data;
185  count = int(e->datasize/sizeof(T));
186  }
187  else { value = 0; count = 0; }
188  }
189 
190  template<typename T>
191  void getValue(const char* key, MetaDataType requestedType, const T*& value, int& count)
192  {
193  int index = -1;
194  MetaDataType type;
195  findKey(key, index, type);
196  getValue<T>(index, requestedType, value, count);
197  }
198 
199  virtual void getValue(const char* key, const int8_t*& value, int& count)
200  {
201  getValue<int8_t>(key, mdt_int8, value, count);
202  }
203 
204  virtual void getValue(int index, const int8_t*& value, int& count)
205  {
206  getValue<int8_t>(index, mdt_int8, value, count);
207  }
208 
209  virtual void getValue(const char* key, const int16_t*& value, int& count)
210  {
211  getValue<int16_t>(key, mdt_int16, value, count);
212  }
213 
214  virtual void getValue(int index, const int16_t*& value, int& count)
215  {
216  getValue<int16_t>(index, mdt_int16, value, count);
217  }
218 
219  virtual void getValue(const char* key, const int32_t*& value, int& count)
220  {
221  getValue<int32_t>(key, mdt_int32, value, count);
222  }
223 
224  virtual void getValue(int index, const int32_t*& value, int& count)
225  {
226  getValue<int32_t>(index, mdt_int32, value, count);
227  }
228 
229  virtual void getValue(const char* key, const float*& value, int& count)
230  {
231  getValue<float>(key, mdt_float, value, count);
232  }
233 
234  virtual void getValue(int index, const float*& value, int& count)
235  {
236  getValue<float>(index, mdt_float, value, count);
237  }
238 
239  virtual void getValue(const char* key, const double*& value, int& count)
240  {
241  getValue<double>(key, mdt_double, value, count);
242  }
243 
244  virtual void getValue(int index, const double*& value, int& count)
245  {
246  getValue<double>(index, mdt_double, value, count);
247  }
248 
249  void addEntry(uint8_t keysize, const char* key, uint8_t datatype,
250  uint32_t datasize, const void* data, size_t& metaDataMemUsed)
251  {
252  Entry* e = newEntry(keysize, key, datatype, datasize, metaDataMemUsed);
253  e->data = new char[datasize];
254  memcpy(e->data, data, datasize);
255  metaDataMemUsed += datasize;
256  }
257 
258  void addLmdEntry(uint8_t keysize, const char* key, uint8_t datatype,
259  uint32_t datasize, FilePos filepos, uint32_t zipsize,
260  size_t& metaDataMemUsed)
261  {
262  Entry* e = newEntry(keysize, key, datatype, datasize, metaDataMemUsed);
263  e->isLmd = true;
264  e->lmdData = 0;
265  e->lmdPos = filepos;
266  e->lmdZipSize = zipsize;
267  }
268 
269  size_t selfDataSize()
270  {
271  return sizeof(*this) + sizeof(Entry*) * _entries.capacity();
272  }
273 
274  protected:
276  {
277  public:
278  LargeMetaData(int size)
279  : _data(new char [size]) {}
280  virtual ~LargeMetaData() { delete [] _data; }
281  void* data() { return _data; }
282  private:
284  char* _data;
285  };
286 
287  struct Entry {
288  const char* key; // ptr to map key string
289  MetaDataType type; // meta data type
290  uint32_t datasize; // size of data in bytes
291  char* data; // if lmd, data only valid when lmd is loaded and ref'ed
292  bool isLmd; // true if data is a large meta data block
293  LargeMetaData* lmdData; // large meta data (lazy-loaded)
294  FilePos lmdPos; // large meta data file position
295  uint32_t lmdZipSize; // large meta data size on disk
296  uint32_t index; // index in vector
297 
298  Entry() :
299  key(0), type(MetaDataType(0)), datasize(0), data(0),
300  isLmd(0), lmdData(0), lmdPos(0), lmdZipSize(0) {}
301  ~Entry() { clear(); }
302  void clear() {
303  if (isLmd) {
304  isLmd = 0;
305  if (lmdData) { delete lmdData; lmdData = 0; }
306  lmdPos = 0;
307  lmdZipSize = 0;
308  }
309  else {
310  if (data) { delete [] data; }
311  }
312  data = 0;
313  }
314  };
315 
316  Entry* newEntry(uint8_t keysize, const char* key, uint8_t datatype, uint32_t datasize, size_t& metaDataMemUsed)
317  {
318  std::pair<MetaMap::iterator,bool> result =
319  _map.insert(std::make_pair(std::string(key, keysize), Entry()));
320  Entry* e = &result.first->second;
321  bool newentry = result.second;
322  uint32_t index = 0;
323  if (newentry) {
324  index = uint32_t(_entries.size());
325  _entries.push_back(e);
326  }
327  else {
328  index = e->index;
329  e->clear();
330  }
331  e->key = result.first->first.c_str();
332  e->type = MetaDataType(datatype);
333  e->datasize = datasize;
334  e->index = index;
335  metaDataMemUsed += sizeof(std::string) + keysize + 1 + sizeof(Entry);
336  return e;
337  }
338 
339  PTEXAPI Entry* getEntry(int index);
340 
342  typedef std::map<std::string, Entry> MetaMap;
344  std::vector<Entry*> _entries;
345  };
346 
347 
348  class ConstDataPtr : public PtexFaceData {
349  public:
350  ConstDataPtr(void* data, int pixelsize)
351  : _data(data), _pixelsize(pixelsize) {}
352  virtual void release() { delete this; }
353  virtual Ptex::Res res() { return 0; }
354  virtual bool isConstant() { return true; }
355  virtual void getPixel(int, int, void* result)
356  { memcpy(result, _data, _pixelsize); }
357  virtual void* getData() { return _data; }
358  virtual bool isTiled() { return false; }
359  virtual Ptex::Res tileRes() { return 0; }
360  virtual PtexFaceData* getTile(int) { return 0; }
361 
362  protected:
363  void* _data;
365  };
366 
367 
368  class FaceData : public PtexFaceData {
369  public:
370  FaceData(Res resArg)
371  : _res(resArg) {}
372  virtual ~FaceData() {}
373  virtual void release() { }
374  virtual Ptex::Res res() { return _res; }
375  virtual FaceData* reduce(PtexReader*, Res newres, PtexUtils::ReduceFn, size_t& newMemUsed) = 0;
376  protected:
377  Res _res;
378  };
379 
380  class PackedFace : public FaceData {
381  public:
382  PackedFace(Res resArg, int pixelsize, int size)
383  : FaceData(resArg),
384  _pixelsize(pixelsize), _data(new char [size]) {}
385  void* data() { return _data; }
386  virtual bool isConstant() { return false; }
387  virtual void getPixel(int u, int v, void* result)
388  {
389  memcpy(result, _data + (v*_res.u() + u) * _pixelsize, _pixelsize);
390  }
391  virtual void* getData() { return _data; }
392  virtual bool isTiled() { return false; }
393  virtual Ptex::Res tileRes() { return _res; }
394  virtual PtexFaceData* getTile(int) { return 0; }
395  virtual FaceData* reduce(PtexReader*, Res newres, PtexUtils::ReduceFn, size_t& newMemUsed);
396 
397  protected:
398  virtual ~PackedFace() { delete [] _data; }
399 
401  char* _data;
402  };
403 
404  class ConstantFace : public PackedFace {
405  public:
407  : PackedFace(0, pixelsize, pixelsize) {}
408  virtual bool isConstant() { return true; }
409  virtual void getPixel(int, int, void* result) { memcpy(result, _data, _pixelsize); }
410  virtual FaceData* reduce(PtexReader*, Res newres, PtexUtils::ReduceFn, size_t& newMemUsed);
411  };
412 
413  class ErrorFace : public ConstantFace {
415  public:
416  ErrorFace(void* errorPixel, int pixelsize, bool deleteOnRelease)
417  : ConstantFace(pixelsize), _deleteOnRelease(deleteOnRelease)
418  {
419  memcpy(_data, errorPixel, pixelsize);
420  }
421  virtual void release() { if (_deleteOnRelease) delete this; }
422  };
423 
424  class TiledFaceBase : public FaceData {
425  public:
426  TiledFaceBase(PtexReader* reader, Res resArg, Res tileresArg)
427  : FaceData(resArg),
428  _reader(reader),
429  _tileres(tileresArg)
430  {
431  _dt = reader->datatype();
432  _nchan = reader->nchannels();
434  _ntilesu = _res.ntilesu(tileresArg);
435  _ntilesv = _res.ntilesv(tileresArg);
437  _tiles.resize(_ntiles);
438  }
439 
440  virtual void release() { }
441  virtual bool isConstant() { return false; }
442  virtual void getPixel(int u, int v, void* result);
443  virtual void* getData() { return 0; }
444  virtual bool isTiled() { return true; }
445  virtual Ptex::Res tileRes() { return _tileres; }
446  virtual FaceData* reduce(PtexReader*, Res newres, PtexUtils::ReduceFn, size_t& newMemUsed);
447  Res tileres() const { return _tileres; }
448  int ntilesu() const { return _ntilesu; }
449  int ntilesv() const { return _ntilesv; }
450  int ntiles() const { return _ntiles; }
451 
452  protected:
453  size_t baseExtraMemUsed() { return _tiles.size() * sizeof(_tiles[0]); }
454 
455  virtual ~TiledFaceBase() {
456  for (std::vector<FaceData*>::iterator i = _tiles.begin(); i != _tiles.end(); ++i) {
457  if (*i) delete *i;
458  }
459  }
460 
462  Res _tileres;
464  int _nchan;
465  int _ntilesu;
466  int _ntilesv;
467  int _ntiles;
469  std::vector<FaceData*> _tiles;
470  };
471 
472 
473  class TiledFace : public TiledFaceBase {
474  public:
475  TiledFace(PtexReader* reader, Res resArg, Res tileresArg, int levelid)
476  : TiledFaceBase(reader, resArg, tileresArg),
477  _levelid(levelid)
478  {
479  _fdh.resize(_ntiles),
480  _offsets.resize(_ntiles);
481  }
482  virtual PtexFaceData* getTile(int tile)
483  {
484  FaceData*& f = _tiles[tile];
485  if (!f) readTile(tile, f);
486  return f;
487  }
488  void readTile(int tile, FaceData*& data);
489  size_t memUsed() {
490  return sizeof(*this) + baseExtraMemUsed() + _fdh.size() * (sizeof(_fdh[0]) + sizeof(_offsets[0]));
491  }
492 
493  protected:
494  friend class PtexReader;
495  int _levelid;
496  std::vector<FaceDataHeader> _fdh;
497  std::vector<FilePos> _offsets;
498  };
499 
500 
502  public:
503  TiledReducedFace(PtexReader* reader, Res resArg, Res tileresArg,
504  TiledFaceBase* parentface, PtexUtils::ReduceFn reducefn)
505  : TiledFaceBase(reader, resArg, tileresArg),
506  _parentface(parentface),
507  _reducefn(reducefn)
508  {
509  }
511  {
512  }
513  virtual PtexFaceData* getTile(int tile);
514 
515  size_t memUsed() { return sizeof(*this) + baseExtraMemUsed(); }
516 
517  protected:
520  };
521 
522 
523  class Level {
524  public:
525  std::vector<FaceDataHeader> fdh;
526  std::vector<FilePos> offsets;
527  std::vector<FaceData*> faces;
528 
529  Level(int nfaces)
530  : fdh(nfaces),
531  offsets(nfaces),
532  faces(nfaces) {}
533 
534  ~Level() {
535  for (std::vector<FaceData*>::iterator i = faces.begin(); i != faces.end(); ++i) {
536  if (*i) delete *i;
537  }
538  }
539 
540  size_t memUsed() {
541  return sizeof(*this) + fdh.size() * (sizeof(fdh[0]) +
542  sizeof(offsets[0]) +
543  sizeof(faces[0]));
544  }
545  };
546 
547 
548 protected:
549  void setError(const char* error, bool ioError = false)
550  {
551  std::string msg = error;
552  msg += " PtexFile: ";
553  msg += _path;
554  msg += "\n";
555  if (ioError) {
556  msg += _io->lastError();
557  msg += "\n";
558  }
559  if (_err) _err->reportError(msg.c_str());
560  else std::cerr << msg;
561  _ok = 0;
562  }
563 
564  void setIOError(const char* error)
565  {
566  setError(error, true);
567  }
568 
569  FilePos tell() { return _pos; }
570  void seek(FilePos pos)
571  {
572  if (!_fp && !reopenFP()) return;
573  logBlockRead();
574  if (pos != _pos) {
575  _io->seek(_fp, pos);
576  _pos = pos;
577  }
578  }
579 
580  void closeFP();
581  bool reopenFP();
582  bool readBlock(void* data, int size);
583  bool readZipBlock(void* data, int zipsize, int unzipsize);
584  Level* getLevel(int levelid)
585  {
586  Level*& level = _levels[levelid];
587  if (!level) readLevel(levelid, level);
588  return level;
589  }
590 
591  FaceData* getFace(int levelid, Level* level, int faceid, Res res)
592  {
593  FaceData*& face = level->faces[faceid];
594  if (!face) readFace(levelid, level, faceid, res);
595  return face;
596  }
597 
598  void readFaceInfo();
599  void readLevelInfo();
600  void readConstData();
601  void readLevel(int levelid, Level*& level);
602  void readFace(int levelid, Level* level, int faceid, Res res);
603  void readFaceData(FilePos pos, FaceDataHeader fdh, Res res, int levelid, FaceData*& face);
604  void readMetaData();
605  void readMetaDataBlock(MetaData* metadata, FilePos pos, int zipsize, int memsize, size_t& metaDataMemUsed);
606  void readLargeMetaDataHeaders(MetaData* metadata, FilePos pos, int zipsize, int memsize, size_t& metaDataMemUsed);
607 
608  FaceData* errorData(bool deleteOnRelease=false)
609  {
610  return new ErrorFace(&_errorPixel[0], _pixelsize, deleteOnRelease);
611  }
612 
613  void computeFaceTileOffsets(FilePos pos, int noffsets, const FaceDataHeader* fdh, FilePos* offsets)
614  {
615  FilePos* end = offsets + noffsets;
616  while (offsets != end) { *offsets++ = pos; pos += fdh->blocksize(); fdh++; }
617  }
618 
620  {
621  char* buffer;
622  public:
624  virtual Handle open(const char* path) {
625  FILE* fp = fopen(path, "rb");
626  if (fp) {
627  buffer = new char [IBuffSize];
628  setvbuf(fp, buffer, _IOFBF, IBuffSize);
629  }
630  else buffer = 0;
631  return (Handle) fp;
632  }
633  virtual void seek(Handle handle, int64_t pos) { fseeko((FILE*)handle, pos, SEEK_SET); }
634  virtual size_t read(void* bufferArg, size_t size, Handle handle) {
635  return fread(bufferArg, size, 1, (FILE*)handle) == 1 ? size : 0;
636  }
637  virtual bool close(Handle handle) {
638  bool ok = handle && (fclose((FILE*)handle) == 0);
639  if (buffer) { delete [] buffer; buffer = 0; }
640  return ok;
641  }
642  virtual const char* lastError() { return strerror(errno); }
643  };
644 
646  DefaultInputHandler _defaultIo; // Default IO handler
647  PtexInputHandler* _io; // IO handler
648  PtexErrorHandler* _err; // Error handler
649  bool _premultiply; // true if reader should premultiply the alpha chan
650  bool _ok; // flag set to false if open or read error occurred
651  bool _needToOpen; // true if file needs to be opened (or reopened after a purge)
652  bool _pendingPurge; // true if a purge attempt was made but file was busy
653  PtexInputHandler::Handle _fp; // file pointer
654  FilePos _pos; // current seek position
655  std::string _path; // current file path
656  Header _header; // the header
657  ExtHeader _extheader; // extended header
658  FilePos _faceinfopos; // file positions of data sections
665  int _pixelsize; // size of a pixel in bytes
666  uint8_t* _constdata; // constant pixel value per face
667  MetaData* _metadata; // meta data (read on demand)
668 
669  std::vector<FaceInfo> _faceinfo; // per-face header info
670  std::vector<uint32_t> _rfaceids; // faceids sorted in reduction order
671  std::vector<LevelInfo> _levelinfo; // per-level header info
672  std::vector<FilePos> _levelpos; // file position of each level's data
673  std::vector<Level*> _levels; // level data (read on demand)
674 
675  class ReductionKey {
676  int64_t _val;
677  public:
678  ReductionKey() : _val(-1) {}
679  ReductionKey(uint32_t faceid, Res res)
680  : _val( int64_t(faceid)<<32 | uint32_t(16777619*((res.val()<<16) ^ faceid)) ) {}
681 
682  void copy(volatile ReductionKey& key) volatile
683  {
684  _val = key._val;
685  }
686 
687  void move(volatile ReductionKey& key) volatile
688  {
689  _val = key._val;
690  }
691 
692  bool matches(const ReductionKey& key) const volatile
693  {
694  return _val == key._val;
695  }
696  bool isEmpty() const volatile { return _val==-1; }
697  uint32_t hash() const volatile
698  {
699  return uint32_t(_val);
700  }
701  };
704  std::vector<char> _errorPixel; // referenced by errorData()
705 
706  libdeflate_decompressor* _decompressor;
707  size_t _baseMemUsed;
708  volatile size_t _memUsed;
709  volatile size_t _opens;
710  volatile size_t _blockReads;
711 };
712 
714 
715 #endif
#define PTEXAPI
Definition: PtexExports.h:60
Contains PtexHashMap, a lightweight multi-threaded hash table.
const int IBuffSize
Definition: PtexIO.h:106
off_t FilePos
Definition: PtexPlatform.h:101
PTEX_INLINE T AtomicAdd(volatile T *target, T value)
Definition: PtexPlatform.h:211
PTEX_INLINE T AtomicIncrement(volatile T *target)
Definition: PtexPlatform.h:227
#define PTEX_NAMESPACE_END
Definition: PtexVersion.h:62
Public API classes for reading, writing, caching, and filtering Ptex files.
Custom handler interface redirecting Ptex error messages.
Definition: Ptexture.h:667
virtual void reportError(const char *error)=0
Per-face texture data accessor.
Definition: Ptexture.h:409
Custom handler interface for intercepting and redirecting Ptex input stream calls.
Definition: Ptexture.h:628
virtual void seek(Handle handle, int64_t pos)=0
Seek to an absolute byte position in the input stream.
virtual const char * lastError()=0
Return the last error message encountered.
Meta data accessor.
Definition: Ptexture.h:331
virtual PtexFaceData * getTile(int)
Access a tile from the data block.
Definition: PtexReader.h:360
virtual bool isConstant()
True if this data block is constant.
Definition: PtexReader.h:354
virtual Ptex::Res res()
Resolution of the texture held by this data block.
Definition: PtexReader.h:353
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:352
virtual bool isTiled()
True if this data block is tiled.
Definition: PtexReader.h:358
virtual void getPixel(int, int, void *result)
Read a single texel from the data block.
Definition: PtexReader.h:355
virtual void * getData()
Access the data from this data block.
Definition: PtexReader.h:357
virtual Ptex::Res tileRes()
Resolution of each tile in this data block.
Definition: PtexReader.h:359
ConstDataPtr(void *data, int pixelsize)
Definition: PtexReader.h:350
virtual void getPixel(int, int, void *result)
Read a single texel from the data block.
Definition: PtexReader.h:409
ConstantFace(int pixelsize)
Definition: PtexReader.h:406
virtual bool isConstant()
True if this data block is constant.
Definition: PtexReader.h:408
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)
Definition: PtexReader.cpp:950
virtual void seek(Handle handle, int64_t pos)
Seek to an absolute byte position in the input stream.
Definition: PtexReader.h:633
virtual bool close(Handle handle)
Close a file.
Definition: PtexReader.h:637
virtual size_t read(void *bufferArg, size_t size, Handle handle)
Read a number of bytes from the file.
Definition: PtexReader.h:634
virtual Handle open(const char *path)
Open a file in read mode.
Definition: PtexReader.h:624
virtual const char * lastError()
Return the last error message encountered.
Definition: PtexReader.h:642
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:421
ErrorFace(void *errorPixel, int pixelsize, bool deleteOnRelease)
Definition: PtexReader.h:416
virtual Ptex::Res res()
Resolution of the texture held by this data block.
Definition: PtexReader.h:374
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:373
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)=0
FaceData(Res resArg)
Definition: PtexReader.h:370
Level(int nfaces)
Definition: PtexReader.h:529
std::vector< FilePos > offsets
Definition: PtexReader.h:526
std::vector< FaceDataHeader > fdh
Definition: PtexReader.h:525
std::vector< FaceData * > faces
Definition: PtexReader.h:527
size_t memUsed()
Definition: PtexReader.h:540
LargeMetaData(const LargeMetaData &)
virtual void getValue(int index, const int8_t *&value, int &count)
Query the value of a given meta data entry by index.
Definition: PtexReader.h:204
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:128
virtual void getKey(int index, const char *&key, MetaDataType &type)
Definition: PtexReader.h:131
virtual void getValue(int index, const double *&value, int &count)
Query the value of a given meta data entry by index.
Definition: PtexReader.h:244
virtual void getValue(const char *key, const int8_t *&value, int &count)
Query the value of a given meta data entry.
Definition: PtexReader.h:199
virtual void getValue(int index, const char *&value)
Query the value of a given meta data entry by index.
Definition: PtexReader.h:166
void addEntry(uint8_t keysize, const char *key, uint8_t datatype, uint32_t datasize, const void *data, size_t &metaDataMemUsed)
Definition: PtexReader.h:249
virtual void getValue(int index, const float *&value, int &count)
Query the value of a given meta data entry by index.
Definition: PtexReader.h:234
void getValue(const char *key, MetaDataType requestedType, const T *&value, int &count)
Definition: PtexReader.h:191
virtual bool findKey(const char *key, int &index, MetaDataType &type)
Definition: PtexReader.h:141
virtual void getValue(int index, const int16_t *&value, int &count)
Query the value of a given meta data entry by index.
Definition: PtexReader.h:214
MetaData(PtexReader *reader)
Definition: PtexReader.h:125
Entry * newEntry(uint8_t keysize, const char *key, uint8_t datatype, uint32_t datasize, size_t &metaDataMemUsed)
Definition: PtexReader.h:316
virtual void getValue(const char *key, const int32_t *&value, int &count)
Query the value of a given meta data entry.
Definition: PtexReader.h:219
virtual int numKeys()
Query number of meta data entries stored in file.
Definition: PtexReader.h:130
virtual void getValue(int index, const int32_t *&value, int &count)
Query the value of a given meta data entry by index.
Definition: PtexReader.h:224
virtual void getValue(const char *key, const double *&value, int &count)
Query the value of a given meta data entry.
Definition: PtexReader.h:239
PtexReader * _reader
Definition: PtexReader.h:341
virtual void getValue(const char *key, const char *&value)
Query the value of a given meta data entry.
Definition: PtexReader.h:153
std::map< std::string, Entry > MetaMap
Definition: PtexReader.h:342
virtual void getValue(const char *key, const float *&value, int &count)
Query the value of a given meta data entry.
Definition: PtexReader.h:229
void addLmdEntry(uint8_t keysize, const char *key, uint8_t datatype, uint32_t datasize, FilePos filepos, uint32_t zipsize, size_t &metaDataMemUsed)
Definition: PtexReader.h:258
void getValue(int index, MetaDataType requestedType, const T *&value, int &count)
Definition: PtexReader.h:175
Entry * getEntry(int index)
Definition: PtexReader.cpp:345
std::vector< Entry * > _entries
Definition: PtexReader.h:344
virtual void getValue(const char *key, const int16_t *&value, int &count)
Query the value of a given meta data entry.
Definition: PtexReader.h:209
virtual PtexFaceData * getTile(int)
Access a tile from the data block.
Definition: PtexReader.h:394
PackedFace(Res resArg, int pixelsize, int size)
Definition: PtexReader.h:382
virtual bool isTiled()
True if this data block is tiled.
Definition: PtexReader.h:392
virtual Ptex::Res tileRes()
Resolution of each tile in this data block.
Definition: PtexReader.h:393
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)
Definition: PtexReader.cpp:933
virtual void * getData()
Access the data from this data block.
Definition: PtexReader.h:391
virtual bool isConstant()
True if this data block is constant.
Definition: PtexReader.h:386
virtual void getPixel(int u, int v, void *result)
Read a single texel from the data block.
Definition: PtexReader.h:387
bool isEmpty() const volatile
Definition: PtexReader.h:696
ReductionKey(uint32_t faceid, Res res)
Definition: PtexReader.h:679
void move(volatile ReductionKey &key) volatile
Definition: PtexReader.h:687
uint32_t hash() const volatile
Definition: PtexReader.h:697
void copy(volatile ReductionKey &key) volatile
Definition: PtexReader.h:682
bool matches(const ReductionKey &key) const volatile
Definition: PtexReader.h:692
TiledFaceBase(PtexReader *reader, Res resArg, Res tileresArg)
Definition: PtexReader.h:426
std::vector< FaceData * > _tiles
Definition: PtexReader.h:469
virtual bool isTiled()
True if this data block is tiled.
Definition: PtexReader.h:444
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)
Definition: PtexReader.cpp:963
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:440
virtual Ptex::Res tileRes()
Resolution of each tile in this data block.
Definition: PtexReader.h:445
virtual void * getData()
Access the data from this data block.
Definition: PtexReader.h:443
virtual bool isConstant()
True if this data block is constant.
Definition: PtexReader.h:441
virtual void getPixel(int u, int v, void *result)
Read a single texel from the data block.
virtual PtexFaceData * getTile(int tile)
Access a tile from the data block.
Definition: PtexReader.h:482
std::vector< FaceDataHeader > _fdh
Definition: PtexReader.h:496
TiledFace(PtexReader *reader, Res resArg, Res tileresArg, int levelid)
Definition: PtexReader.h:475
void readTile(int tile, FaceData *&data)
Definition: PtexReader.cpp:567
std::vector< FilePos > _offsets
Definition: PtexReader.h:497
TiledFaceBase * _parentface
Definition: PtexReader.h:518
virtual PtexFaceData * getTile(int tile)
Access a tile from the data block.
PtexUtils::ReduceFn * _reducefn
Definition: PtexReader.h:519
TiledReducedFace(PtexReader *reader, Res resArg, Res tileresArg, TiledFaceBase *parentface, PtexUtils::ReduceFn reducefn)
Definition: PtexReader.h:503
void readLevelInfo()
Definition: PtexReader.cpp:300
ReductionMap _reductions
Definition: PtexReader.h:703
bool reopenFP()
Definition: PtexReader.cpp:242
bool ok() const
Definition: PtexReader.h:65
DataType datatype() const
Definition: PtexReader.h:116
bool _premultiply
Definition: PtexReader.h:649
FilePos _constdatapos
Definition: PtexReader.h:659
void readMetaDataBlock(MetaData *metadata, FilePos pos, int zipsize, int memsize, size_t &metaDataMemUsed)
Definition: PtexReader.cpp:411
virtual int numFaces()
Number of faces stored in file.
Definition: PtexReader.h:98
void setPendingPurge()
Definition: PtexReader.h:62
void readFaceInfo()
Definition: PtexReader.cpp:279
virtual Ptex::BorderMode vBorderMode()
Mode for filtering texture access beyond mesh border.
Definition: PtexReader.h:94
std::string _path
Definition: PtexReader.h:655
uint8_t * _constdata
Definition: PtexReader.h:666
std::vector< FilePos > _levelpos
Definition: PtexReader.h:672
virtual void getPixel(int faceid, int u, int v, float *result, int firstchan, int nchannels)
Access a single texel from the highest resolution texture .
Definition: PtexReader.cpp:825
virtual Info getInfo()
Definition: PtexReader.h:78
void setIOError(const char *error)
Definition: PtexReader.h:564
volatile size_t _opens
Definition: PtexReader.h:709
FaceData * errorData(bool deleteOnRelease=false)
Definition: PtexReader.h:608
bool isOpen()
Definition: PtexReader.h:66
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:57
void increaseMemUsed(size_t amount)
Definition: PtexReader.h:72
void computeFaceTileOffsets(FilePos pos, int noffsets, const FaceDataHeader *fdh, FilePos *offsets)
Definition: PtexReader.h:613
void purge()
Definition: PtexReader.cpp:117
FilePos tell()
Definition: PtexReader.h:569
virtual ~PtexReader()
Definition: PtexReader.cpp:94
FaceData * getFace(int levelid, Level *level, int faceid, Res res)
Definition: PtexReader.h:591
bool _needToOpen
Definition: PtexReader.h:651
virtual Ptex::BorderMode uBorderMode()
Mode for filtering texture access beyond mesh border.
Definition: PtexReader.h:93
void readConstData()
Definition: PtexReader.cpp:321
virtual const char * path()
Path that file was opened with.
Definition: PtexReader.h:76
virtual PtexMetaData * getMetaData()
Access meta data.
Definition: PtexReader.cpp:337
bool needToOpen() const
Definition: PtexReader.h:58
virtual int alphaChannel()
Index of alpha channel (if any).
Definition: PtexReader.h:96
ExtHeader _extheader
Definition: PtexReader.h:657
FilePos _leveldatapos
Definition: PtexReader.h:661
virtual void getData(int faceid, void *buffer, int stride)
Access texture data for a face at highest-resolution.
Definition: PtexReader.cpp:643
PtexErrorHandler * _err
Definition: PtexReader.h:648
FilePos _faceinfopos
Definition: PtexReader.h:658
std::vector< LevelInfo > _levelinfo
Definition: PtexReader.h:671
bool readBlock(void *data, int size)
Definition: PtexReader.cpp:466
PtexHashMap< ReductionKey, FaceData * > ReductionMap
Definition: PtexReader.h:702
PtexReader(bool premultiply, PtexInputHandler *inputHandler, PtexErrorHandler *errorHandler)
Definition: PtexReader.cpp:73
virtual bool hasMipMaps()
True if the file has mipmaps.
Definition: PtexReader.h:100
PtexInputHandler * _io
Definition: PtexReader.h:647
virtual const Ptex::FaceInfo & getFaceInfo(int faceid)
Access resolution and adjacency information about a face.
Definition: PtexReader.cpp:269
FilePos _metadatapos
Definition: PtexReader.h:662
void readLargeMetaDataHeaders(MetaData *metadata, FilePos pos, int zipsize, int memsize, size_t &metaDataMemUsed)
Definition: PtexReader.cpp:437
void closeFP()
Definition: PtexReader.cpp:233
int _pixelsize
Definition: PtexReader.h:665
bool _pendingPurge
Definition: PtexReader.h:652
bool pendingPurge() const
Definition: PtexReader.h:63
Mutex readlock
Definition: PtexReader.h:645
const Header & header() const
Definition: PtexReader.h:119
void setError(const char *error, bool ioError=false)
Definition: PtexReader.h:549
Level * getLevel(int levelid)
Definition: PtexReader.h:584
void readFace(int levelid, Level *level, int faceid, Res res)
Definition: PtexReader.cpp:559
FilePos _levelinfopos
Definition: PtexReader.h:660
FilePos _lmdheaderpos
Definition: PtexReader.h:663
virtual bool hasEdits()
Obsolete (returns false).
Definition: PtexReader.h:99
int nchannels() const
Definition: PtexReader.h:117
FilePos _lmddatapos
Definition: PtexReader.h:664
void prune()
Definition: PtexReader.cpp:106
std::vector< uint32_t > _rfaceids
Definition: PtexReader.h:670
volatile size_t _memUsed
Definition: PtexReader.h:708
DefaultInputHandler _defaultIo
Definition: PtexReader.h:646
const LevelInfo & levelinfo(int level) const
Definition: PtexReader.h:121
volatile size_t _blockReads
Definition: PtexReader.h:710
Header _header
Definition: PtexReader.h:656
void readFaceData(FilePos pos, FaceDataHeader fdh, Res res, int levelid, FaceData *&face)
Definition: PtexReader.cpp:573
libdeflate_decompressor * _decompressor
Definition: PtexReader.h:706
void seek(FilePos pos)
Definition: PtexReader.h:570
MetaData * _metadata
Definition: PtexReader.h:667
std::vector< Level * > _levels
Definition: PtexReader.h:673
size_t _baseMemUsed
Definition: PtexReader.h:707
std::vector< FaceInfo > _faceinfo
Definition: PtexReader.h:669
void invalidate()
Definition: PtexReader.h:67
virtual Ptex::MeshType meshType()
Type of mesh for which texture data is defined.
Definition: PtexReader.h:91
virtual Ptex::EdgeFilterMode edgeFilterMode()
Mode for filtering textures across edges.
Definition: PtexReader.h:95
int pixelsize() const
Definition: PtexReader.h:118
PtexInputHandler::Handle _fp
Definition: PtexReader.h:653
bool readZipBlock(void *data, int zipsize, int unzipsize)
Definition: PtexReader.cpp:480
void getCompressedData(int faceid, int level, FaceDataHeader &fdh, std::vector< std::byte > &data)
Definition: PtexReader.cpp:892
void readMetaData()
Definition: PtexReader.cpp:383
void logBlockRead()
Definition: PtexReader.h:74
void logOpen()
Definition: PtexReader.h:73
virtual void * getConstantData(int faceid) final
Access the constant (or average) data value for a given face.
Definition: PtexReader.h:108
void readLevel(int levelid, Level *&level)
Definition: PtexReader.cpp:499
virtual Ptex::DataType dataType()
Type of data stored in file.
Definition: PtexReader.h:92
std::vector< char > _errorPixel
Definition: PtexReader.h:704
virtual int numChannels()
Number of channels stored in file.
Definition: PtexReader.h:97
FilePos _pos
Definition: PtexReader.h:654
const ExtHeader & extheader() const
Definition: PtexReader.h:120
bool open(const char *path, Ptex::String &error)
Definition: PtexReader.cpp:137
bool tryClose()
Definition: PtexReader.cpp:222
Interface for reading data from a ptex file.
Definition: Ptexture.h:460
Memory-managed string.
Definition: Ptexture.h:299
void ReduceFn(const void *src, int sstride, int ures, int vres, void *dst, int dstride, DataType dt, int nchannels)
Definition: PtexUtils.h:167
int DataSize(DataType dt)
Look up size of given data type (in bytes).
Definition: Ptexture.h:130
DataType
Type of data stored in texture file.
Definition: Ptexture.h:72
MeshType
Type of base mesh for which the textures are defined.
Definition: Ptexture.h:66
BorderMode
How to handle mesh border when filtering.
Definition: Ptexture.h:86
MetaDataType
Type of meta data entry.
Definition: Ptexture.h:102
@ mdt_string
Null-terminated string.
Definition: Ptexture.h:103
@ mdt_float
Single-precision (32-bit) floating point.
Definition: Ptexture.h:107
@ mdt_int32
Signed 32-bit integer.
Definition: Ptexture.h:106
@ mdt_int8
Signed 8-bit integer.
Definition: Ptexture.h:104
@ mdt_double
Double-precision (32-bit) floating point.
Definition: Ptexture.h:108
@ mdt_int16
Signed 16-bit integer.
Definition: Ptexture.h:105
EdgeFilterMode
How to handle transformation across edges when filtering.
Definition: Ptexture.h:80
uint16_t edgefiltermode
Definition: PtexIO.h:68
uint16_t vbordermode
Definition: PtexIO.h:67
uint16_t ubordermode
Definition: PtexIO.h:65
uint32_t blocksize() const
Definition: PtexIO.h:85
Definition: PtexIO.h:44
uint16_t nlevels
Definition: PtexIO.h:51
uint16_t nchannels
Definition: PtexIO.h:50
uint32_t meshtype
Definition: PtexIO.h:47
uint32_t datatype
Definition: PtexIO.h:48
int32_t alphachan
Definition: PtexIO.h:49
uint32_t nfaces
Definition: PtexIO.h:52
LargeMetaData * lmdData
Definition: PtexReader.h:293
Get most commonly used info in a single call for convenience / efficiency.
Definition: Ptexture.h:489
BorderMode uBorderMode
Definition: Ptexture.h:492
BorderMode vBorderMode
Definition: Ptexture.h:493
EdgeFilterMode edgeFilterMode
Definition: Ptexture.h:494
DataType dataType
Definition: Ptexture.h:491
MeshType meshType
Definition: Ptexture.h:490
Information about a face, as stored in the Ptex file header.
Definition: Ptexture.h:232
Pixel resolution of a given texture.
Definition: Ptexture.h:159