SkWriteBuffer.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * Copyright 2011 Google Inc.
  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 SkWriteBuffer_DEFINED
  8. #define SkWriteBuffer_DEFINED
  9. #include "include/core/SkData.h"
  10. #include "include/core/SkFlattenable.h"
  11. #include "include/core/SkSerialProcs.h"
  12. #include "include/private/SkTHash.h"
  13. #include "src/core/SkWriter32.h"
  14. class SkFactorySet;
  15. class SkImage;
  16. class SkPath;
  17. class SkRefCntSet;
  18. class SkWriteBuffer {
  19. public:
  20. SkWriteBuffer() {}
  21. virtual ~SkWriteBuffer() {}
  22. virtual void writePad32(const void* buffer, size_t bytes) = 0;
  23. virtual void writeByteArray(const void* data, size_t size) = 0;
  24. void writeDataAsByteArray(SkData* data) {
  25. this->writeByteArray(data->data(), data->size());
  26. }
  27. virtual void writeBool(bool value) = 0;
  28. virtual void writeScalar(SkScalar value) = 0;
  29. virtual void writeScalarArray(const SkScalar* value, uint32_t count) = 0;
  30. virtual void writeInt(int32_t value) = 0;
  31. virtual void writeIntArray(const int32_t* value, uint32_t count) = 0;
  32. virtual void writeUInt(uint32_t value) = 0;
  33. void write32(int32_t value) {
  34. this->writeInt(value);
  35. }
  36. virtual void writeString(const char* value) = 0;
  37. virtual void writeFlattenable(const SkFlattenable* flattenable) = 0;
  38. virtual void writeColor(SkColor color) = 0;
  39. virtual void writeColorArray(const SkColor* color, uint32_t count) = 0;
  40. virtual void writeColor4f(const SkColor4f& color) = 0;
  41. virtual void writeColor4fArray(const SkColor4f* color, uint32_t count) = 0;
  42. virtual void writePoint(const SkPoint& point) = 0;
  43. virtual void writePointArray(const SkPoint* point, uint32_t count) = 0;
  44. virtual void writePoint3(const SkPoint3& point) = 0;
  45. virtual void writeMatrix(const SkMatrix& matrix) = 0;
  46. virtual void writeIRect(const SkIRect& rect) = 0;
  47. virtual void writeRect(const SkRect& rect) = 0;
  48. virtual void writeRegion(const SkRegion& region) = 0;
  49. virtual void writePath(const SkPath& path) = 0;
  50. virtual size_t writeStream(SkStream* stream, size_t length) = 0;
  51. virtual void writeImage(const SkImage*) = 0;
  52. virtual void writeTypeface(SkTypeface* typeface) = 0;
  53. virtual void writePaint(const SkPaint& paint) = 0;
  54. void setSerialProcs(const SkSerialProcs& procs) { fProcs = procs; }
  55. protected:
  56. SkSerialProcs fProcs;
  57. friend class SkPicturePriv; // fProcs
  58. };
  59. /**
  60. * Concrete implementation that serializes to a flat binary blob.
  61. */
  62. class SkBinaryWriteBuffer : public SkWriteBuffer {
  63. public:
  64. SkBinaryWriteBuffer();
  65. SkBinaryWriteBuffer(void* initialStorage, size_t storageSize);
  66. ~SkBinaryWriteBuffer() override;
  67. void write(const void* buffer, size_t bytes) {
  68. fWriter.write(buffer, bytes);
  69. }
  70. void writePad32(const void* buffer, size_t bytes) override {
  71. fWriter.writePad(buffer, bytes);
  72. }
  73. void reset(void* storage = nullptr, size_t storageSize = 0) {
  74. fWriter.reset(storage, storageSize);
  75. }
  76. size_t bytesWritten() const { return fWriter.bytesWritten(); }
  77. // Returns true iff all of the bytes written so far are stored in the initial storage
  78. // buffer provided in the constructor or the most recent call to reset.
  79. bool usingInitialStorage() const;
  80. void writeByteArray(const void* data, size_t size) override;
  81. void writeBool(bool value) override;
  82. void writeScalar(SkScalar value) override;
  83. void writeScalarArray(const SkScalar* value, uint32_t count) override;
  84. void writeInt(int32_t value) override;
  85. void writeIntArray(const int32_t* value, uint32_t count) override;
  86. void writeUInt(uint32_t value) override;
  87. void writeString(const char* value) override;
  88. void writeFlattenable(const SkFlattenable* flattenable) override;
  89. void writeColor(SkColor color) override;
  90. void writeColorArray(const SkColor* color, uint32_t count) override;
  91. void writeColor4f(const SkColor4f& color) override;
  92. void writeColor4fArray(const SkColor4f* color, uint32_t count) override;
  93. void writePoint(const SkPoint& point) override;
  94. void writePointArray(const SkPoint* point, uint32_t count) override;
  95. void writePoint3(const SkPoint3& point) override;
  96. void writeMatrix(const SkMatrix& matrix) override;
  97. void writeIRect(const SkIRect& rect) override;
  98. void writeRect(const SkRect& rect) override;
  99. void writeRegion(const SkRegion& region) override;
  100. void writePath(const SkPath& path) override;
  101. size_t writeStream(SkStream* stream, size_t length) override;
  102. void writeImage(const SkImage*) override;
  103. void writeTypeface(SkTypeface* typeface) override;
  104. void writePaint(const SkPaint& paint) override;
  105. bool writeToStream(SkWStream*) const;
  106. void writeToMemory(void* dst) const { fWriter.flatten(dst); }
  107. void setFactoryRecorder(sk_sp<SkFactorySet>);
  108. void setTypefaceRecorder(sk_sp<SkRefCntSet>);
  109. private:
  110. sk_sp<SkFactorySet> fFactorySet;
  111. sk_sp<SkRefCntSet> fTFSet;
  112. SkWriter32 fWriter;
  113. // Only used if we do not have an fFactorySet
  114. SkTHashMap<SkFlattenable::Factory, uint32_t> fFlattenableDict;
  115. };
  116. #endif // SkWriteBuffer_DEFINED