SkMetaData.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. /*
  2. * Copyright 2006 The Android Open Source Project
  3. *
  4. * Use of this source code is governed by a BSD-style license that can be
  5. * found in the LICENSE file.
  6. */
  7. #ifndef SkMetaData_DEFINED
  8. #define SkMetaData_DEFINED
  9. #include "include/core/SkScalar.h"
  10. class SkRefCnt;
  11. class SK_API SkMetaData {
  12. public:
  13. /**
  14. * Used to manage the life-cycle of a ptr in the metadata. This is option
  15. * in setPtr, and is only invoked when either copying one metadata to
  16. * another, or when the metadata is destroyed.
  17. *
  18. * setPtr(name, ptr, proc) {
  19. * fPtr = proc(ptr, true);
  20. * }
  21. *
  22. * copy: A = B {
  23. * A.fPtr = B.fProc(B.fPtr, true);
  24. * }
  25. *
  26. * ~SkMetaData {
  27. * fProc(fPtr, false);
  28. * }
  29. */
  30. typedef void* (*PtrProc)(void* ptr, bool doRef);
  31. /**
  32. * Implements PtrProc for SkRefCnt pointers
  33. */
  34. static void* RefCntProc(void* ptr, bool doRef);
  35. SkMetaData();
  36. SkMetaData(const SkMetaData& src);
  37. ~SkMetaData();
  38. SkMetaData& operator=(const SkMetaData& src);
  39. void reset();
  40. bool findS32(const char name[], int32_t* value = nullptr) const;
  41. bool findScalar(const char name[], SkScalar* value = nullptr) const;
  42. const SkScalar* findScalars(const char name[], int* count,
  43. SkScalar values[] = nullptr) const;
  44. const char* findString(const char name[]) const;
  45. bool findPtr(const char name[], void** value = nullptr, PtrProc* = nullptr) const;
  46. bool findBool(const char name[], bool* value = nullptr) const;
  47. const void* findData(const char name[], size_t* byteCount = nullptr) const;
  48. bool hasS32(const char name[], int32_t value) const {
  49. int32_t v;
  50. return this->findS32(name, &v) && v == value;
  51. }
  52. bool hasScalar(const char name[], SkScalar value) const {
  53. SkScalar v;
  54. return this->findScalar(name, &v) && v == value;
  55. }
  56. bool hasString(const char name[], const char value[]) const {
  57. const char* v = this->findString(name);
  58. return (v == nullptr && value == nullptr) ||
  59. (v != nullptr && value != nullptr && !strcmp(v, value));
  60. }
  61. bool hasPtr(const char name[], void* value) const {
  62. void* v;
  63. return this->findPtr(name, &v) && v == value;
  64. }
  65. bool hasBool(const char name[], bool value) const {
  66. bool v;
  67. return this->findBool(name, &v) && v == value;
  68. }
  69. bool hasData(const char name[], const void* data, size_t byteCount) const {
  70. size_t len;
  71. const void* ptr = this->findData(name, &len);
  72. return ptr && len == byteCount && !memcmp(ptr, data, len);
  73. }
  74. void setS32(const char name[], int32_t value);
  75. void setScalar(const char name[], SkScalar value);
  76. SkScalar* setScalars(const char name[], int count, const SkScalar values[] = nullptr);
  77. void setString(const char name[], const char value[]);
  78. void setPtr(const char name[], void* value, PtrProc proc = nullptr);
  79. void setBool(const char name[], bool value);
  80. // the data is copied from the input pointer.
  81. void setData(const char name[], const void* data, size_t byteCount);
  82. bool removeS32(const char name[]);
  83. bool removeScalar(const char name[]);
  84. bool removeString(const char name[]);
  85. bool removePtr(const char name[]);
  86. bool removeBool(const char name[]);
  87. bool removeData(const char name[]);
  88. // helpers for SkRefCnt
  89. bool findRefCnt(const char name[], SkRefCnt** ptr = nullptr) {
  90. return this->findPtr(name, reinterpret_cast<void**>(ptr));
  91. }
  92. bool hasRefCnt(const char name[], SkRefCnt* ptr) {
  93. return this->hasPtr(name, ptr);
  94. }
  95. void setRefCnt(const char name[], SkRefCnt* ptr) {
  96. this->setPtr(name, ptr, RefCntProc);
  97. }
  98. bool removeRefCnt(const char name[]) {
  99. return this->removePtr(name);
  100. }
  101. enum Type {
  102. kS32_Type,
  103. kScalar_Type,
  104. kString_Type,
  105. kPtr_Type,
  106. kBool_Type,
  107. kData_Type,
  108. kTypeCount
  109. };
  110. struct Rec;
  111. class Iter;
  112. friend class Iter;
  113. class Iter {
  114. public:
  115. Iter() : fRec(nullptr) {}
  116. Iter(const SkMetaData&);
  117. /** Reset the iterator, so that calling next() will return the first
  118. data element. This is done implicitly in the constructor.
  119. */
  120. void reset(const SkMetaData&);
  121. /** Each time next is called, it returns the name of the next data element,
  122. or null when there are no more elements. If non-null is returned, then the
  123. element's type is returned (if not null), and the number of data values
  124. is returned in count (if not null).
  125. */
  126. const char* next(Type*, int* count);
  127. private:
  128. Rec* fRec;
  129. };
  130. public:
  131. struct Rec {
  132. Rec* fNext;
  133. uint16_t fDataCount; // number of elements
  134. uint8_t fDataLen; // sizeof a single element
  135. uint8_t fType;
  136. const void* data() const { return (this + 1); }
  137. void* data() { return (this + 1); }
  138. const char* name() const { return (const char*)this->data() + fDataLen * fDataCount; }
  139. char* name() { return (char*)this->data() + fDataLen * fDataCount; }
  140. static Rec* Alloc(size_t);
  141. static void Free(Rec*);
  142. };
  143. Rec* fRec;
  144. const Rec* find(const char name[], Type) const;
  145. void* set(const char name[], const void* data, size_t len, Type, int count);
  146. bool remove(const char name[], Type);
  147. };
  148. #endif