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 8 #ifndef SkWriteBuffer_DEFINED 9 #define SkWriteBuffer_DEFINED 10 11 #include "include/core/SkColor.h" 12 #include "include/core/SkData.h" 13 #include "include/core/SkRefCnt.h" 14 #include "include/core/SkSamplingOptions.h" 15 #include "include/core/SkScalar.h" 16 #include "include/core/SkSerialProcs.h" 17 #include "src/core/SkTHash.h" 18 #include "src/core/SkWriter32.h" 19 20 #include <cstddef> 21 #include <cstdint> 22 #include <string_view> 23 24 class SkFactorySet; 25 class SkFlattenable; 26 class SkImage; 27 class SkM44; 28 class SkMatrix; 29 class SkPaint; 30 class SkPath; 31 class SkRefCntSet; 32 class SkRegion; 33 class SkStream; 34 class SkTypeface; 35 class SkWStream; 36 struct SkIRect; 37 struct SkPoint3; 38 struct SkPoint; 39 struct SkRect; 40 41 class SkWriteBuffer { 42 public: SkWriteBuffer(const SkSerialProcs & p)43 SkWriteBuffer(const SkSerialProcs& p): fProcs(p) {} ~SkWriteBuffer()44 virtual ~SkWriteBuffer() {} 45 46 virtual void writePad32(const void* buffer, size_t bytes) = 0; 47 48 virtual void writeByteArray(const void* data, size_t size) = 0; writeDataAsByteArray(const SkData * data)49 void writeDataAsByteArray(const SkData* data) { 50 if (!data) { 51 this->write32(0); 52 } else { 53 this->writeByteArray(data->data(), data->size()); 54 } 55 } 56 57 virtual void writeBool(bool value) = 0; 58 virtual void writeScalar(SkScalar value) = 0; 59 virtual void writeScalarArray(const SkScalar* value, uint32_t count) = 0; 60 virtual void writeInt(int32_t value) = 0; 61 virtual void writeIntArray(const int32_t* value, uint32_t count) = 0; 62 virtual void writeUInt(uint32_t value) = 0; write32(int32_t value)63 void write32(int32_t value) { 64 this->writeInt(value); 65 } 66 virtual void writeString(std::string_view value) = 0; 67 68 virtual void writeFlattenable(const SkFlattenable* flattenable) = 0; 69 virtual void writeColor(SkColor color) = 0; 70 virtual void writeColorArray(const SkColor* color, uint32_t count) = 0; 71 virtual void writeColor4f(const SkColor4f& color) = 0; 72 virtual void writeColor4fArray(const SkColor4f* color, uint32_t count) = 0; 73 virtual void writePoint(const SkPoint& point) = 0; 74 virtual void writePointArray(const SkPoint* point, uint32_t count) = 0; 75 virtual void writePoint3(const SkPoint3& point) = 0; 76 virtual void write(const SkM44&) = 0; 77 virtual void writeMatrix(const SkMatrix& matrix) = 0; 78 virtual void writeIRect(const SkIRect& rect) = 0; 79 virtual void writeRect(const SkRect& rect) = 0; 80 virtual void writeRegion(const SkRegion& region) = 0; 81 virtual void writeSampling(const SkSamplingOptions&) = 0; 82 virtual void writePath(const SkPath& path) = 0; 83 virtual size_t writeStream(SkStream* stream, size_t length) = 0; 84 virtual void writeImage(const SkImage*) = 0; 85 virtual void writeTypeface(SkTypeface* typeface) = 0; 86 virtual void writePaint(const SkPaint& paint) = 0; 87 serialProcs()88 const SkSerialProcs& serialProcs() const { return fProcs; } 89 90 protected: 91 SkSerialProcs fProcs; 92 }; 93 94 /** 95 * Concrete implementation that serializes to a flat binary blob. 96 */ 97 class SkBinaryWriteBuffer : public SkWriteBuffer { 98 public: 99 SkBinaryWriteBuffer(const SkSerialProcs&); 100 SkBinaryWriteBuffer(void* initialStorage, size_t storageSize, const SkSerialProcs&); 101 ~SkBinaryWriteBuffer() override; 102 write(const void * buffer,size_t bytes)103 void write(const void* buffer, size_t bytes) { 104 fWriter.write(buffer, bytes); 105 } writePad32(const void * buffer,size_t bytes)106 void writePad32(const void* buffer, size_t bytes) override { 107 fWriter.writePad(buffer, bytes); 108 } 109 110 void reset(void* storage = nullptr, size_t storageSize = 0) { 111 fWriter.reset(storage, storageSize); 112 } 113 bytesWritten()114 size_t bytesWritten() const { return fWriter.bytesWritten(); } 115 116 // Returns true iff all of the bytes written so far are stored in the initial storage 117 // buffer provided in the constructor or the most recent call to reset. 118 bool usingInitialStorage() const; 119 120 void writeByteArray(const void* data, size_t size) override; 121 void writeBool(bool value) override; 122 void writeScalar(SkScalar value) override; 123 void writeScalarArray(const SkScalar* value, uint32_t count) override; 124 void writeInt(int32_t value) override; 125 void writeIntArray(const int32_t* value, uint32_t count) override; 126 void writeUInt(uint32_t value) override; 127 void writeString(std::string_view value) override; 128 129 void writeFlattenable(const SkFlattenable* flattenable) override; 130 void writeColor(SkColor color) override; 131 void writeColorArray(const SkColor* color, uint32_t count) override; 132 void writeColor4f(const SkColor4f& color) override; 133 void writeColor4fArray(const SkColor4f* color, uint32_t count) override; 134 void writePoint(const SkPoint& point) override; 135 void writePointArray(const SkPoint* point, uint32_t count) override; 136 void writePoint3(const SkPoint3& point) override; 137 void write(const SkM44&) override; 138 void writeMatrix(const SkMatrix& matrix) override; 139 void writeIRect(const SkIRect& rect) override; 140 void writeRect(const SkRect& rect) override; 141 void writeRegion(const SkRegion& region) override; 142 void writeSampling(const SkSamplingOptions&) override; 143 void writePath(const SkPath& path) override; 144 size_t writeStream(SkStream* stream, size_t length) override; 145 void writeImage(const SkImage*) override; 146 void writeTypeface(SkTypeface* typeface) override; 147 void writePaint(const SkPaint& paint) override; 148 149 bool writeToStream(SkWStream*) const; writeToMemory(void * dst)150 void writeToMemory(void* dst) const { fWriter.flatten(dst); } snapshotAsData()151 sk_sp<SkData> snapshotAsData() const { return fWriter.snapshotAsData(); } 152 153 void setFactoryRecorder(sk_sp<SkFactorySet>); 154 void setTypefaceRecorder(sk_sp<SkRefCntSet>); 155 156 private: 157 sk_sp<SkFactorySet> fFactorySet; 158 sk_sp<SkRefCntSet> fTFSet; 159 160 SkWriter32 fWriter; 161 162 // Only used if we do not have an fFactorySet 163 skia_private::THashMap<const char*, uint32_t> fFlattenableDict; 164 }; 165 166 enum SkWriteBufferImageFlags { 167 kVersion_bits = 8, 168 kCurrVersion = 0, 169 170 kHasSubsetRect = 1 << 8, 171 kHasMipmap = 1 << 9, 172 kUnpremul = 1 << 10, 173 }; 174 175 176 #endif // SkWriteBuffer_DEFINED 177