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;
343  MetaMap _map;
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:
623  DefaultInputHandler() : buffer(0) {}
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  };
703  ReductionMap _reductions;
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
DefaultInputHandler _defaultIo
Definition: PtexReader.h:646
bool needToOpen() const
Definition: PtexReader.h:58
EdgeFilterMode edgeFilterMode
Definition: Ptexture.h:494
void setPendingPurge()
Definition: PtexReader.h:62
virtual int numFaces()
Number of faces stored in file.
Definition: PtexReader.h:98
ExtHeader _extheader
Definition: PtexReader.h:657
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:373
std::vector< char > _errorPixel
Definition: PtexReader.h:704
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)
Definition: PtexReader.cpp:998
uint32_t hash() const volatile
Definition: PtexReader.h:697
Signed 32-bit integer.
Definition: Ptexture.h:106
virtual bool hasMipMaps()
True if the file has mipmaps.
Definition: PtexReader.h:100
void getValue(const char *key, MetaDataType requestedType, const T *&value, int &count)
Definition: PtexReader.h:191
DataType dataType
Definition: Ptexture.h:491
virtual PtexFaceData * getTile(int)
Access a tile from the data block.
Definition: PtexReader.h:360
virtual void getValue(const char *key, const float *&value, int &count)
Query the value of a given meta data entry.
Definition: PtexReader.h:229
const ExtHeader & extheader() const
Definition: PtexReader.h:120
ConstantFace(int pixelsize)
Definition: PtexReader.h:406
uint32_t meshtype
Definition: PtexIO.h:47
std::vector< Entry * > _entries
Definition: PtexReader.h:344
void setIOError(const char *error)
Definition: PtexReader.h:564
virtual void * getData()
Access the data from this data block.
Definition: PtexReader.h:443
void ReduceFn(const void *src, int sstride, int ures, int vres, void *dst, int dstride, DataType dt, int nchannels)
Definition: PtexUtils.h:167
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:352
virtual bool hasEdits()
Obsolete (returns false).
Definition: PtexReader.h:99
virtual Ptex::Res tileRes()
Resolution of each tile in this data block.
Definition: PtexReader.h:445
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:421
PtexInputHandler * _io
Definition: PtexReader.h:647
void readFaceInfo()
Definition: PtexReader.cpp:318
FaceData(Res resArg)
Definition: PtexReader.h:370
Memory-managed string.
Definition: Ptexture.h:298
void computeFaceTileOffsets(FilePos pos, int noffsets, const FaceDataHeader *fdh, FilePos *offsets)
Definition: PtexReader.h:613
virtual const Ptex::FaceInfo & getFaceInfo(int faceid)
Access resolution and adjacency information about a face.
Definition: PtexReader.cpp:308
void logOpen()
Definition: PtexReader.h:73
uint16_t nlevels
Definition: PtexIO.h:51
void readLevelInfo()
Definition: PtexReader.cpp:343
volatile size_t _opens
Definition: PtexReader.h:709
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
BorderMode vBorderMode
Definition: Ptexture.h:493
uint16_t ubordermode
Definition: PtexIO.h:65
int32_t alphachan
Definition: PtexIO.h:49
Definition: PtexIO.h:44
bool readBlock(void *data, int size)
Definition: PtexReader.cpp:514
FilePos _leveldatapos
Definition: PtexReader.h:661
Meta data accessor.
Definition: Ptexture.h:331
uint16_t edgefiltermode
Definition: PtexIO.h:68
MetaData * _metadata
Definition: PtexReader.h:667
virtual int alphaChannel()
Index of alpha channel (if any).
Definition: PtexReader.h:96
void closeFP()
Definition: PtexReader.cpp:272
virtual bool close(Handle handle)
Close a file.
Definition: PtexReader.h:637
PtexReader(bool premultiply, PtexInputHandler *inputHandler, PtexErrorHandler *errorHandler)
Definition: PtexReader.cpp:74
virtual bool isConstant()
True if this data block is constant.
Definition: PtexReader.h:441
size_t memUsed()
Definition: PtexReader.h:540
void readConstData()
Definition: PtexReader.cpp:364
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:128
bool isEmpty() const volatile
Definition: PtexReader.h:696
std::vector< FilePos > offsets
Definition: PtexReader.h:526
PTEX_INLINE T AtomicIncrement(volatile T *target)
Definition: PtexPlatform.h:227
virtual const char * path()
Path that file was opened with.
Definition: PtexReader.h:76
std::string _path
Definition: PtexReader.h:655
virtual const char * lastError()
Return the last error message encountered.
Definition: PtexReader.h:642
virtual int numChannels()
Number of channels stored in file.
Definition: PtexReader.h:97
uint8_t * _constdata
Definition: PtexReader.h:666
void readLevel(int levelid, Level *&level)
Definition: PtexReader.cpp:547
std::vector< FilePos > _levelpos
Definition: PtexReader.h:672
bool matches(const ReductionKey &key) const volatile
Definition: PtexReader.h:692
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
Signed 8-bit integer.
Definition: Ptexture.h:104
virtual PtexMetaData * getMetaData()
Access meta data.
Definition: PtexReader.cpp:385
void readMetaDataBlock(MetaData *metadata, FilePos pos, int zipsize, int memsize, size_t &metaDataMemUsed)
Definition: PtexReader.cpp:459
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)
EdgeFilterMode
How to handle transformation across edges when filtering.
Definition: Ptexture.h:80
Get most commonly used info in a single call for convenience / efficiency.
Definition: Ptexture.h:489
LargeMetaData * lmdData
Definition: PtexReader.h:293
PTEX_INLINE T AtomicAdd(volatile T *target, T value)
Definition: PtexPlatform.h:211
virtual Ptex::Res res()
Resolution of the texture held by this data block.
Definition: PtexReader.h:374
bool _needToOpen
Definition: PtexReader.h:651
size_t _baseMemUsed
Definition: PtexReader.h:707
std::vector< uint32_t > _rfaceids
Definition: PtexReader.h:670
virtual Ptex::EdgeFilterMode edgeFilterMode()
Mode for filtering textures across edges.
Definition: PtexReader.h:95
virtual void getPixel(int, int, void *result)
Read a single texel from the data block.
Definition: PtexReader.h:355
virtual void getValue(const char *key, const double *&value, int &count)
Query the value of a given meta data entry.
Definition: PtexReader.h:239
ReductionMap _reductions
Definition: PtexReader.h:703
Double-precision (32-bit) floating point.
Definition: Ptexture.h:108
virtual Ptex::DataType dataType()
Type of data stored in file.
Definition: PtexReader.h:92
off_t FilePos
Definition: PtexPlatform.h:101
virtual void reportError(const char *error)=0
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 invalidate()
Definition: PtexReader.h:67
FaceData * errorData(bool deleteOnRelease=false)
Definition: PtexReader.h:608
void getValue(int index, MetaDataType requestedType, const T *&value, int &count)
Definition: PtexReader.h:175
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:440
void readFace(int levelid, Level *level, int faceid, Res res)
Definition: PtexReader.cpp:607
ErrorFace(void *errorPixel, int pixelsize, bool deleteOnRelease)
Definition: PtexReader.h:416
Per-face texture data accessor.
Definition: Ptexture.h:409
uint16_t vbordermode
Definition: PtexIO.h:67
void increaseMemUsed(size_t amount)
Definition: PtexReader.h:72
Custom handler interface redirecting Ptex error messages.
Definition: Ptexture.h:667
TiledFace(PtexReader *reader, Res resArg, Res tileresArg, int levelid)
Definition: PtexReader.h:475
FilePos _lmdheaderpos
Definition: PtexReader.h:663
virtual void seek(Handle handle, int64_t pos)
Seek to an absolute byte position in the input stream.
Definition: PtexReader.h:633
virtual Ptex::BorderMode vBorderMode()
Mode for filtering texture access beyond mesh border.
Definition: PtexReader.h:94
void getCompressedData(int faceid, int level, FaceDataHeader &fdh, std::vector< std::byte > &data)
Definition: PtexReader.cpp:940
const LevelInfo & levelinfo(int level) const
Definition: PtexReader.h:121
virtual void getPixel(int u, int v, void *result)
Read a single texel from the data block.
Definition: PtexReader.h:387
std::vector< FaceData * > _tiles
Definition: PtexReader.h:469
virtual bool isTiled()
True if this data block is tiled.
Definition: PtexReader.h:358
virtual Ptex::BorderMode uBorderMode()
Mode for filtering texture access beyond mesh border.
Definition: PtexReader.h:93
virtual bool isConstant()
True if this data block is constant.
Definition: PtexReader.h:386
MeshType
Type of base mesh for which the textures are defined.
Definition: Ptexture.h:66
virtual size_t read(void *bufferArg, size_t size, Handle handle)
Read a number of bytes from the file.
Definition: PtexReader.h:634
virtual void * getData()
Access the data from this data block.
Definition: PtexReader.h:357
MetaData(PtexReader *reader)
Definition: PtexReader.h:125
uint32_t blocksize() const
Definition: PtexIO.h:85
virtual bool isConstant()
True if this data block is constant.
Definition: PtexReader.h:354
void readTile(int tile, FaceData *&data)
Definition: PtexReader.cpp:615
void readMetaData()
Definition: PtexReader.cpp:431
virtual Info getInfo()
Definition: PtexReader.h:78
void readLargeMetaDataHeaders(MetaData *metadata, FilePos pos, int zipsize, int memsize, size_t &metaDataMemUsed)
Definition: PtexReader.cpp:485
virtual ~PtexReader()
Definition: PtexReader.cpp:95
virtual Ptex::Res tileRes()
Resolution of each tile in this data block.
Definition: PtexReader.h:393
BorderMode
How to handle mesh border when filtering.
Definition: Ptexture.h:86
virtual void * getConstantData(int faceid) final
Access the constant (or average) data value for a given face.
Definition: PtexReader.h:108
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
Mutex readlock
Definition: PtexReader.h:645
PtexHashMap< ReductionKey, FaceData * > ReductionMap
Definition: PtexReader.h:702
void prune()
Definition: PtexReader.cpp:107
FilePos _faceinfopos
Definition: PtexReader.h:658
bool isOpen()
Definition: PtexReader.h:66
virtual void release()
Release resources held by this pointer (pointer becomes invalid).
Definition: PtexReader.h:57
PtexErrorHandler * _err
Definition: PtexReader.h:648
TiledReducedFace(PtexReader *reader, Res resArg, Res tileresArg, TiledFaceBase *parentface, PtexUtils::ReduceFn reducefn)
Definition: PtexReader.h:503
void logBlockRead()
Definition: PtexReader.h:74
virtual const char * lastError()=0
Return the last error message encountered.
virtual Ptex::Res res()
Resolution of the texture held by this data block.
Definition: PtexReader.h:353
void addEntry(uint8_t keysize, const char *key, uint8_t datatype, uint32_t datasize, const void *data, size_t &metaDataMemUsed)
Definition: PtexReader.h:249
bool readZipBlock(void *data, int zipsize, int unzipsize)
Definition: PtexReader.cpp:528
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 PtexFaceData * getTile(int tile)
Access a tile from the data block.
Definition: PtexReader.h:482
FilePos _levelinfopos
Definition: PtexReader.h:660
uint32_t datatype
Definition: PtexIO.h:48
DataType datatype() const
Definition: PtexReader.h:116
virtual bool isConstant()
True if this data block is constant.
Definition: PtexReader.h:408
MeshType meshType
Definition: Ptexture.h:490
virtual void getData(int faceid, void *buffer, int stride)
Access texture data for a face at highest-resolution.
Definition: PtexReader.cpp:691
bool _premultiply
Definition: PtexReader.h:649
virtual void getPixel(int u, int v, void *result)
Read a single texel from the data block.
virtual bool isTiled()
True if this data block is tiled.
Definition: PtexReader.h:392
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
FilePos _constdatapos
Definition: PtexReader.h:659
std::vector< Level * > _levels
Definition: PtexReader.h:673
std::vector< FaceDataHeader > fdh
Definition: PtexReader.h:525
Level * getLevel(int levelid)
Definition: PtexReader.h:584
virtual bool isTiled()
True if this data block is tiled.
Definition: PtexReader.h:444
PtexInputHandler::Handle _fp
Definition: PtexReader.h:653
virtual void getKey(int index, const char *&key, MetaDataType &type)
Definition: PtexReader.h:131
std::vector< FaceInfo > _faceinfo
Definition: PtexReader.h:669
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:873
void purge()
Definition: PtexReader.cpp:118
Entry * getEntry(int index)
Definition: PtexReader.cpp:393
std::vector< FaceDataHeader > _fdh
Definition: PtexReader.h:496
int nchannels() const
Definition: PtexReader.h:117
const Header & header() const
Definition: PtexReader.h:119
FaceData * getFace(int levelid, Level *level, int faceid, Res res)
Definition: PtexReader.h:591
virtual void getPixel(int, int, void *result)
Read a single texel from the data block.
Definition: PtexReader.h:409
PtexUtils::ReduceFn * _reducefn
Definition: PtexReader.h:519
Entry * newEntry(uint8_t keysize, const char *key, uint8_t datatype, uint32_t datasize, size_t &metaDataMemUsed)
Definition: PtexReader.h:316
bool tryClose()
Definition: PtexReader.cpp:261
virtual Handle open(const char *path)
Open a file in read mode.
Definition: PtexReader.h:624
virtual int numKeys()
Query number of meta data entries stored in file.
Definition: PtexReader.h:130
virtual void seek(Handle handle, int64_t pos)=0
Seek to an absolute byte position in the input stream.
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
FilePos _metadatapos
Definition: PtexReader.h:662
void readFaceData(FilePos pos, FaceDataHeader fdh, Res res, int levelid, FaceData *&face)
Definition: PtexReader.cpp:621
ReductionKey(uint32_t faceid, Res res)
Definition: PtexReader.h:679
virtual void * getData()
Access the data from this data block.
Definition: PtexReader.h:391
Null-terminated string.
Definition: Ptexture.h:103
Header _header
Definition: PtexReader.h:656
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
int _pixelsize
Definition: PtexReader.h:665
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
volatile size_t _memUsed
Definition: PtexReader.h:708
virtual PtexFaceData * getTile(int tile)
Access a tile from the data block.
TiledFaceBase(PtexReader *reader, Res resArg, Res tileresArg)
Definition: PtexReader.h:426
Interface for reading data from a ptex file.
Definition: Ptexture.h:460
std::vector< FilePos > _offsets
Definition: PtexReader.h:497
virtual bool findKey(const char *key, int &index, MetaDataType &type)
Definition: PtexReader.h:141
uint16_t nchannels
Definition: PtexIO.h:50
Pixel resolution of a given texture.
Definition: Ptexture.h:159
virtual Ptex::MeshType meshType()
Type of mesh for which texture data is defined.
Definition: PtexReader.h:91
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)
Definition: PtexReader.cpp:981
bool pendingPurge() const
Definition: PtexReader.h:63
Contains PtexHashMap, a lightweight multi-threaded hash table.
ConstDataPtr(void *data, int pixelsize)
Definition: PtexReader.h:350
void copy(volatile ReductionKey &key) volatile
Definition: PtexReader.h:682
bool open(const char *path, Ptex::String &error)
Definition: PtexReader.cpp:141
Single-precision (32-bit) floating point.
Definition: Ptexture.h:107
uint32_t nfaces
Definition: PtexIO.h:52
int DataSize(DataType dt)
Look up size of given data type (in bytes).
Definition: Ptexture.h:130
virtual Ptex::Res tileRes()
Resolution of each tile in this data block.
Definition: PtexReader.h:359
void setError(const char *error, bool ioError=false)
Definition: PtexReader.h:549
MetaDataType
Type of meta data entry.
Definition: Ptexture.h:102
bool ok() const
Definition: PtexReader.h:65
std::vector< LevelInfo > _levelinfo
Definition: PtexReader.h:671
std::vector< FaceData * > faces
Definition: PtexReader.h:527
virtual void getValue(int index, const char *&value)
Query the value of a given meta data entry by index.
Definition: PtexReader.h:166
libdeflate_decompressor * _decompressor
Definition: PtexReader.h:706
void move(volatile ReductionKey &key) volatile
Definition: PtexReader.h:687
Information about a face, as stored in the Ptex file header.
Definition: Ptexture.h:232
virtual void getValue(const char *key, const char *&value)
Query the value of a given meta data entry.
Definition: PtexReader.h:153
const int IBuffSize
Definition: PtexIO.h:106
int pixelsize() const
Definition: PtexReader.h:118
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
Signed 16-bit integer.
Definition: Ptexture.h:105
void seek(FilePos pos)
Definition: PtexReader.h:570
Level(int nfaces)
Definition: PtexReader.h:529
DataType
Type of data stored in texture file.
Definition: Ptexture.h:72
#define PTEXAPI
Definition: PtexExports.h:60
virtual FaceData * reduce(PtexReader *, Res newres, PtexUtils::ReduceFn, size_t &newMemUsed)=0
#define PTEX_NAMESPACE_END
Definition: PtexVersion.h:62
bool reopenFP()
Definition: PtexReader.cpp:281
FilePos tell()
Definition: PtexReader.h:569
volatile size_t _blockReads
Definition: PtexReader.h:710
FilePos _pos
Definition: PtexReader.h:654
Public API classes for reading, writing, caching, and filtering Ptex files.
BorderMode uBorderMode
Definition: Ptexture.h:492
std::map< std::string, Entry > MetaMap
Definition: PtexReader.h:342
bool _pendingPurge
Definition: PtexReader.h:652
PtexReader * _reader
Definition: PtexReader.h:341
Custom handler interface for intercepting and redirecting Ptex input stream calls.
Definition: Ptexture.h:628
FilePos _lmddatapos
Definition: PtexReader.h:664
TiledFaceBase * _parentface
Definition: PtexReader.h:518