SkDescriptor.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 SkDescriptor_DEFINED
  8. #define SkDescriptor_DEFINED
  9. #include <memory>
  10. #include "include/private/SkMacros.h"
  11. #include "include/private/SkNoncopyable.h"
  12. #include "src/core/SkScalerContext.h"
  13. class SkDescriptor : SkNoncopyable {
  14. public:
  15. static size_t ComputeOverhead(int entryCount) {
  16. SkASSERT(entryCount >= 0);
  17. return sizeof(SkDescriptor) + entryCount * sizeof(Entry);
  18. }
  19. static std::unique_ptr<SkDescriptor> Alloc(size_t length);
  20. // Ensure the unsized delete is called.
  21. void operator delete(void* p);
  22. void init() {
  23. fLength = sizeof(SkDescriptor);
  24. fCount = 0;
  25. }
  26. uint32_t getLength() const { return fLength; }
  27. void* addEntry(uint32_t tag, size_t length, const void* data = nullptr);
  28. void computeChecksum();
  29. // Assumes that getLength <= capacity of this SkDescriptor.
  30. bool isValid() const;
  31. #ifdef SK_DEBUG
  32. void assertChecksum() const {
  33. SkASSERT(SkDescriptor::ComputeChecksum(this) == fChecksum);
  34. }
  35. #endif
  36. const void* findEntry(uint32_t tag, uint32_t* length) const;
  37. std::unique_ptr<SkDescriptor> copy() const;
  38. // This assumes that all memory added has a length that is a multiple of 4. This is checked
  39. // by the assert in addEntry.
  40. bool operator==(const SkDescriptor& other) const;
  41. bool operator!=(const SkDescriptor& other) const { return !(*this == other); }
  42. uint32_t getChecksum() const { return fChecksum; }
  43. struct Entry {
  44. uint32_t fTag;
  45. uint32_t fLen;
  46. };
  47. #ifdef SK_DEBUG
  48. uint32_t getCount() const { return fCount; }
  49. #endif
  50. private:
  51. // private so no one can create one except our factories
  52. SkDescriptor() = default;
  53. friend class SkDescriptorTestHelper;
  54. static uint32_t ComputeChecksum(const SkDescriptor* desc);
  55. uint32_t fChecksum; // must be first
  56. uint32_t fLength; // must be second
  57. uint32_t fCount;
  58. };
  59. class SkAutoDescriptor {
  60. public:
  61. SkAutoDescriptor();
  62. explicit SkAutoDescriptor(size_t size);
  63. explicit SkAutoDescriptor(const SkDescriptor& desc);
  64. SkAutoDescriptor(const SkAutoDescriptor& ad);
  65. SkAutoDescriptor& operator= (const SkAutoDescriptor& ad);
  66. SkAutoDescriptor(SkAutoDescriptor&&) = delete;
  67. SkAutoDescriptor& operator= (SkAutoDescriptor&&) = delete;
  68. ~SkAutoDescriptor();
  69. void reset(size_t size);
  70. void reset(const SkDescriptor& desc);
  71. SkDescriptor* getDesc() const { SkASSERT(fDesc); return fDesc; }
  72. private:
  73. void free();
  74. static constexpr size_t kStorageSize
  75. = sizeof(SkDescriptor)
  76. + sizeof(SkDescriptor::Entry) + sizeof(SkScalerContextRec) // for rec
  77. + sizeof(SkDescriptor::Entry) + sizeof(void*) // for typeface
  78. + 32; // slop for occasional small extras
  79. SkDescriptor* fDesc{nullptr};
  80. std::aligned_storage<kStorageSize, alignof(uint32_t)>::type fStorage;
  81. };
  82. #endif //SkDescriptor_DEFINED