SkPictureData.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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 SkPictureData_DEFINED
  8. #define SkPictureData_DEFINED
  9. #include "include/core/SkBitmap.h"
  10. #include "include/core/SkDrawable.h"
  11. #include "include/core/SkPicture.h"
  12. #include "include/private/SkTArray.h"
  13. #include "src/core/SkPictureFlat.h"
  14. #include <memory>
  15. class SkData;
  16. class SkPictureRecord;
  17. class SkReader32;
  18. struct SkSerialProcs;
  19. class SkStream;
  20. class SkWStream;
  21. class SkBBoxHierarchy;
  22. class SkMatrix;
  23. class SkPaint;
  24. class SkPath;
  25. class SkReadBuffer;
  26. class SkTextBlob;
  27. struct SkPictInfo {
  28. SkPictInfo() : fVersion(~0U) {}
  29. uint32_t getVersion() const {
  30. SkASSERT(fVersion != ~0U);
  31. return fVersion;
  32. }
  33. void setVersion(uint32_t version) {
  34. SkASSERT(version != ~0U);
  35. fVersion = version;
  36. }
  37. public:
  38. char fMagic[8];
  39. private:
  40. uint32_t fVersion;
  41. public:
  42. SkRect fCullRect;
  43. };
  44. #define SK_PICT_READER_TAG SkSetFourByteTag('r', 'e', 'a', 'd')
  45. #define SK_PICT_FACTORY_TAG SkSetFourByteTag('f', 'a', 'c', 't')
  46. #define SK_PICT_TYPEFACE_TAG SkSetFourByteTag('t', 'p', 'f', 'c')
  47. #define SK_PICT_PICTURE_TAG SkSetFourByteTag('p', 'c', 't', 'r')
  48. #define SK_PICT_DRAWABLE_TAG SkSetFourByteTag('d', 'r', 'a', 'w')
  49. // This tag specifies the size of the ReadBuffer, needed for the following tags
  50. #define SK_PICT_BUFFER_SIZE_TAG SkSetFourByteTag('a', 'r', 'a', 'y')
  51. // these are all inside the ARRAYS tag
  52. #define SK_PICT_PAINT_BUFFER_TAG SkSetFourByteTag('p', 'n', 't', ' ')
  53. #define SK_PICT_PATH_BUFFER_TAG SkSetFourByteTag('p', 't', 'h', ' ')
  54. #define SK_PICT_TEXTBLOB_BUFFER_TAG SkSetFourByteTag('b', 'l', 'o', 'b')
  55. #define SK_PICT_VERTICES_BUFFER_TAG SkSetFourByteTag('v', 'e', 'r', 't')
  56. #define SK_PICT_IMAGE_BUFFER_TAG SkSetFourByteTag('i', 'm', 'a', 'g')
  57. // Always write this guy last (with no length field afterwards)
  58. #define SK_PICT_EOF_TAG SkSetFourByteTag('e', 'o', 'f', ' ')
  59. template <typename T>
  60. T* read_index_base_1_or_null(SkReadBuffer* reader, const SkTArray<sk_sp<T>>& array) {
  61. int index = reader->readInt();
  62. return reader->validate(index > 0 && index <= array.count()) ? array[index - 1].get() : nullptr;
  63. }
  64. class SkPictureData {
  65. public:
  66. SkPictureData(const SkPictureRecord& record, const SkPictInfo&);
  67. // Does not affect ownership of SkStream.
  68. static SkPictureData* CreateFromStream(SkStream*,
  69. const SkPictInfo&,
  70. const SkDeserialProcs&,
  71. SkTypefacePlayback*);
  72. static SkPictureData* CreateFromBuffer(SkReadBuffer&, const SkPictInfo&);
  73. void serialize(SkWStream*, const SkSerialProcs&, SkRefCntSet*, bool textBlobsOnly=false) const;
  74. void flatten(SkWriteBuffer&) const;
  75. const sk_sp<SkData>& opData() const { return fOpData; }
  76. protected:
  77. explicit SkPictureData(const SkPictInfo& info);
  78. // Does not affect ownership of SkStream.
  79. bool parseStream(SkStream*, const SkDeserialProcs&, SkTypefacePlayback*);
  80. bool parseBuffer(SkReadBuffer& buffer);
  81. public:
  82. const SkImage* getImage(SkReadBuffer* reader) const {
  83. // images are written base-0, unlike paths, pictures, drawables, etc.
  84. const int index = reader->readInt();
  85. return reader->validateIndex(index, fImages.count()) ? fImages[index].get() : nullptr;
  86. }
  87. const SkPath& getPath(SkReadBuffer* reader) const {
  88. int index = reader->readInt();
  89. return reader->validate(index > 0 && index <= fPaths.count()) ?
  90. fPaths[index - 1] : fEmptyPath;
  91. }
  92. const SkPicture* getPicture(SkReadBuffer* reader) const {
  93. return read_index_base_1_or_null(reader, fPictures);
  94. }
  95. SkDrawable* getDrawable(SkReadBuffer* reader) const {
  96. return read_index_base_1_or_null(reader, fDrawables);
  97. }
  98. const SkPaint* getPaint(SkReadBuffer* reader) const {
  99. int index = reader->readInt();
  100. if (index == 0) {
  101. return nullptr; // recorder wrote a zero for no paint (likely drawimage)
  102. }
  103. return reader->validate(index > 0 && index <= fPaints.count()) ?
  104. &fPaints[index - 1] : nullptr;
  105. }
  106. const SkTextBlob* getTextBlob(SkReadBuffer* reader) const {
  107. return read_index_base_1_or_null(reader, fTextBlobs);
  108. }
  109. const SkVertices* getVertices(SkReadBuffer* reader) const {
  110. return read_index_base_1_or_null(reader, fVertices);
  111. }
  112. private:
  113. // these help us with reading/writing
  114. // Does not affect ownership of SkStream.
  115. bool parseStreamTag(SkStream*, uint32_t tag, uint32_t size,
  116. const SkDeserialProcs&, SkTypefacePlayback*);
  117. void parseBufferTag(SkReadBuffer&, uint32_t tag, uint32_t size);
  118. void flattenToBuffer(SkWriteBuffer&, bool textBlobsOnly) const;
  119. SkTArray<SkPaint> fPaints;
  120. SkTArray<SkPath> fPaths;
  121. sk_sp<SkData> fOpData; // opcodes and parameters
  122. const SkPath fEmptyPath;
  123. const SkBitmap fEmptyBitmap;
  124. SkTArray<sk_sp<const SkPicture>> fPictures;
  125. SkTArray<sk_sp<SkDrawable>> fDrawables;
  126. SkTArray<sk_sp<const SkTextBlob>> fTextBlobs;
  127. SkTArray<sk_sp<const SkVertices>> fVertices;
  128. SkTArray<sk_sp<const SkImage>> fImages;
  129. SkTypefacePlayback fTFPlayback;
  130. std::unique_ptr<SkFactoryPlayback> fFactoryPlayback;
  131. const SkPictInfo fInfo;
  132. static void WriteFactories(SkWStream* stream, const SkFactorySet& rec);
  133. static void WriteTypefaces(SkWStream* stream, const SkRefCntSet& rec, const SkSerialProcs&);
  134. void initForPlayback() const;
  135. };
  136. #endif