xref: /aosp_15_r20/external/skia/src/core/SkWriteBuffer.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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