blob: 7be1794c2da3615109741672f2ae89765633f219 [file] [log] [blame]
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +00001/*
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
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000011#include "SkData.h"
Mike Reed60691a52017-12-05 15:11:24 -050012#include "SkSerialProcs.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000013#include "SkWriter32.h"
msaretta3b3b232016-04-22 12:43:07 -070014#include "../private/SkTHash.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000015
reed54dc4872016-09-13 08:09:45 -070016class SkDeduper;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000017class SkFactorySet;
18class SkFlattenable;
Mike Reed0dec3af2017-12-20 05:33:53 -050019class SkImage;
20class SkPath;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000021class SkRefCntSet;
22
Mike Reed57c2b8b2017-12-31 15:23:54 -050023class SkWriteBuffer {
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000024public:
brianosmanfad98562016-05-04 11:06:28 -070025 SkWriteBuffer() {}
26 virtual ~SkWriteBuffer() {}
27
Mike Reed45ab6302017-12-13 11:38:57 -050028 virtual void writePad32(const void* buffer, size_t bytes) = 0;
29
brianosmanfad98562016-05-04 11:06:28 -070030 virtual void writeByteArray(const void* data, size_t size) = 0;
31 void writeDataAsByteArray(SkData* data) {
32 this->writeByteArray(data->data(), data->size());
33 }
34 virtual void writeBool(bool value) = 0;
35 virtual void writeScalar(SkScalar value) = 0;
36 virtual void writeScalarArray(const SkScalar* value, uint32_t count) = 0;
37 virtual void writeInt(int32_t value) = 0;
38 virtual void writeIntArray(const int32_t* value, uint32_t count) = 0;
39 virtual void writeUInt(uint32_t value) = 0;
40 void write32(int32_t value) {
41 this->writeInt(value);
42 }
43 virtual void writeString(const char* value) = 0;
44
45 virtual void writeFlattenable(const SkFlattenable* flattenable) = 0;
46 virtual void writeColor(SkColor color) = 0;
47 virtual void writeColorArray(const SkColor* color, uint32_t count) = 0;
brianosman97bbf822016-09-25 13:15:58 -070048 virtual void writeColor4f(const SkColor4f& color) = 0;
49 virtual void writeColor4fArray(const SkColor4f* color, uint32_t count) = 0;
brianosmanfad98562016-05-04 11:06:28 -070050 virtual void writePoint(const SkPoint& point) = 0;
51 virtual void writePointArray(const SkPoint* point, uint32_t count) = 0;
52 virtual void writeMatrix(const SkMatrix& matrix) = 0;
53 virtual void writeIRect(const SkIRect& rect) = 0;
54 virtual void writeRect(const SkRect& rect) = 0;
55 virtual void writeRegion(const SkRegion& region) = 0;
56 virtual void writePath(const SkPath& path) = 0;
57 virtual size_t writeStream(SkStream* stream, size_t length) = 0;
brianosmanfad98562016-05-04 11:06:28 -070058 virtual void writeImage(const SkImage*) = 0;
59 virtual void writeTypeface(SkTypeface* typeface) = 0;
60 virtual void writePaint(const SkPaint& paint) = 0;
reed54dc4872016-09-13 08:09:45 -070061
62 void setDeduper(SkDeduper* deduper) { fDeduper = deduper; }
63
Mike Reed45ab6302017-12-13 11:38:57 -050064 void setSerialProcs(const SkSerialProcs& procs) { fProcs = procs; }
65
reed54dc4872016-09-13 08:09:45 -070066protected:
Mike Reed45ab6302017-12-13 11:38:57 -050067 SkDeduper* fDeduper = nullptr;
Mike Reed45ab6302017-12-13 11:38:57 -050068 SkSerialProcs fProcs;
69
Cary Clarkefd99cc2018-06-11 16:25:43 -040070 friend class SkPicturePriv; // fProcs
brianosmanfad98562016-05-04 11:06:28 -070071};
72
73/**
74 * Concrete implementation that serializes to a flat binary blob.
75 */
Mike Reed57c2b8b2017-12-31 15:23:54 -050076class SkBinaryWriteBuffer : public SkWriteBuffer {
brianosmanfad98562016-05-04 11:06:28 -070077public:
Mike Reedd1c65d62018-01-03 11:32:13 -050078 SkBinaryWriteBuffer();
79 SkBinaryWriteBuffer(void* initialStorage, size_t storageSize);
Brian Salomond3b65972017-03-22 12:05:03 -040080 ~SkBinaryWriteBuffer() override;
commit-bot@chromium.orga2bd2d12014-01-30 22:16:32 +000081
reed54dc4872016-09-13 08:09:45 -070082 void write(const void* buffer, size_t bytes) {
83 fWriter.write(buffer, bytes);
84 }
Mike Reed45ab6302017-12-13 11:38:57 -050085 void writePad32(const void* buffer, size_t bytes) override {
Mike Reed60691a52017-12-05 15:11:24 -050086 fWriter.writePad(buffer, bytes);
87 }
reed54dc4872016-09-13 08:09:45 -070088
Ben Wagnera93a14a2017-08-28 10:34:05 -040089 void reset(void* storage = nullptr, size_t storageSize = 0) {
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000090 fWriter.reset(storage, storageSize);
91 }
92
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000093 size_t bytesWritten() const { return fWriter.bytesWritten(); }
94
Mike Reed25325842018-03-14 09:52:02 -040095 // Returns true iff all of the bytes written so far are stored in the initial storage
96 // buffer provided in the constructor or the most recent call to reset.
97 bool usingInitialStorage() const;
98
brianosmanfad98562016-05-04 11:06:28 -070099 void writeByteArray(const void* data, size_t size) override;
100 void writeBool(bool value) override;
101 void writeScalar(SkScalar value) override;
102 void writeScalarArray(const SkScalar* value, uint32_t count) override;
103 void writeInt(int32_t value) override;
104 void writeIntArray(const int32_t* value, uint32_t count) override;
105 void writeUInt(uint32_t value) override;
106 void writeString(const char* value) override;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000107
brianosmanfad98562016-05-04 11:06:28 -0700108 void writeFlattenable(const SkFlattenable* flattenable) override;
109 void writeColor(SkColor color) override;
110 void writeColorArray(const SkColor* color, uint32_t count) override;
brianosman97bbf822016-09-25 13:15:58 -0700111 void writeColor4f(const SkColor4f& color) override;
112 void writeColor4fArray(const SkColor4f* color, uint32_t count) override;
brianosmanfad98562016-05-04 11:06:28 -0700113 void writePoint(const SkPoint& point) override;
114 void writePointArray(const SkPoint* point, uint32_t count) override;
115 void writeMatrix(const SkMatrix& matrix) override;
116 void writeIRect(const SkIRect& rect) override;
117 void writeRect(const SkRect& rect) override;
118 void writeRegion(const SkRegion& region) override;
119 void writePath(const SkPath& path) override;
120 size_t writeStream(SkStream* stream, size_t length) override;
brianosmanfad98562016-05-04 11:06:28 -0700121 void writeImage(const SkImage*) override;
122 void writeTypeface(SkTypeface* typeface) override;
123 void writePaint(const SkPaint& paint) override;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000124
125 bool writeToStream(SkWStream*);
126 void writeToMemory(void* dst) { fWriter.flatten(dst); }
127
128 SkFactorySet* setFactoryRecorder(SkFactorySet*);
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000129 SkRefCntSet* setTypefaceRecorder(SkRefCntSet*);
130
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000131private:
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000132 SkFactorySet* fFactorySet;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000133 SkWriter32 fWriter;
134
Mike Reed60691a52017-12-05 15:11:24 -0500135 SkRefCntSet* fTFSet;
msaretta3b3b232016-04-22 12:43:07 -0700136
137 // Only used if we do not have an fFactorySet
138 SkTHashMap<SkString, uint32_t> fFlattenableDict;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000139};
140
141#endif // SkWriteBuffer_DEFINED