blob: 748254b065a7c26787beec8805b642a343ae55ad [file] [log] [blame]
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9#ifndef SkWriteBuffer_DEFINED
10#define SkWriteBuffer_DEFINED
11
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000012#include "SkData.h"
Mike Reed60691a52017-12-05 15:11:24 -050013#include "SkSerialProcs.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000014#include "SkWriter32.h"
msaretta3b3b232016-04-22 12:43:07 -070015#include "../private/SkTHash.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000016
reed54dc4872016-09-13 08:09:45 -070017class SkDeduper;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000018class SkFactorySet;
19class SkFlattenable;
Mike Reed0dec3af2017-12-20 05:33:53 -050020class SkImage;
21class SkPath;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000022class SkRefCntSet;
23
Adrienne Walkerb7e300f2017-06-05 15:25:05 -070024class SK_API SkWriteBuffer {
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000025public:
brianosmanfad98562016-05-04 11:06:28 -070026 SkWriteBuffer() {}
27 virtual ~SkWriteBuffer() {}
28
29 virtual bool isCrossProcess() const = 0;
30
Mike Reed45ab6302017-12-13 11:38:57 -050031 virtual void writePad32(const void* buffer, size_t bytes) = 0;
32
brianosmanfad98562016-05-04 11:06:28 -070033 virtual void writeByteArray(const void* data, size_t size) = 0;
34 void writeDataAsByteArray(SkData* data) {
35 this->writeByteArray(data->data(), data->size());
36 }
37 virtual void writeBool(bool value) = 0;
38 virtual void writeScalar(SkScalar value) = 0;
39 virtual void writeScalarArray(const SkScalar* value, uint32_t count) = 0;
40 virtual void writeInt(int32_t value) = 0;
41 virtual void writeIntArray(const int32_t* value, uint32_t count) = 0;
42 virtual void writeUInt(uint32_t value) = 0;
43 void write32(int32_t value) {
44 this->writeInt(value);
45 }
46 virtual void writeString(const char* value) = 0;
47
48 virtual void writeFlattenable(const SkFlattenable* flattenable) = 0;
49 virtual void writeColor(SkColor color) = 0;
50 virtual void writeColorArray(const SkColor* color, uint32_t count) = 0;
brianosman97bbf822016-09-25 13:15:58 -070051 virtual void writeColor4f(const SkColor4f& color) = 0;
52 virtual void writeColor4fArray(const SkColor4f* color, uint32_t count) = 0;
brianosmanfad98562016-05-04 11:06:28 -070053 virtual void writePoint(const SkPoint& point) = 0;
54 virtual void writePointArray(const SkPoint* point, uint32_t count) = 0;
55 virtual void writeMatrix(const SkMatrix& matrix) = 0;
56 virtual void writeIRect(const SkIRect& rect) = 0;
57 virtual void writeRect(const SkRect& rect) = 0;
58 virtual void writeRegion(const SkRegion& region) = 0;
59 virtual void writePath(const SkPath& path) = 0;
60 virtual size_t writeStream(SkStream* stream, size_t length) = 0;
brianosmanfad98562016-05-04 11:06:28 -070061 virtual void writeImage(const SkImage*) = 0;
62 virtual void writeTypeface(SkTypeface* typeface) = 0;
63 virtual void writePaint(const SkPaint& paint) = 0;
reed54dc4872016-09-13 08:09:45 -070064
65 void setDeduper(SkDeduper* deduper) { fDeduper = deduper; }
66
Mike Reed45ab6302017-12-13 11:38:57 -050067 void setSerialProcs(const SkSerialProcs& procs) { fProcs = procs; }
68
reed54dc4872016-09-13 08:09:45 -070069protected:
Mike Reed45ab6302017-12-13 11:38:57 -050070 SkDeduper* fDeduper = nullptr;
Mike Reed45ab6302017-12-13 11:38:57 -050071 SkSerialProcs fProcs;
72
73 friend class SkPicture; // fProcs
brianosmanfad98562016-05-04 11:06:28 -070074};
75
76/**
77 * Concrete implementation that serializes to a flat binary blob.
78 */
Adrienne Walkerb7e300f2017-06-05 15:25:05 -070079class SK_API SkBinaryWriteBuffer : public SkWriteBuffer {
brianosmanfad98562016-05-04 11:06:28 -070080public:
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000081 enum Flags {
brianosmanfad98562016-05-04 11:06:28 -070082 kCrossProcess_Flag = 1 << 0,
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000083 };
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000084
brianosmanfad98562016-05-04 11:06:28 -070085 SkBinaryWriteBuffer(uint32_t flags = 0);
86 SkBinaryWriteBuffer(void* initialStorage, size_t storageSize, uint32_t flags = 0);
Brian Salomond3b65972017-03-22 12:05:03 -040087 ~SkBinaryWriteBuffer() override;
commit-bot@chromium.orga2bd2d12014-01-30 22:16:32 +000088
brianosmanfad98562016-05-04 11:06:28 -070089 bool isCrossProcess() const override {
msaretta3b3b232016-04-22 12:43:07 -070090 return SkToBool(fFlags & kCrossProcess_Flag);
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000091 }
92
reed54dc4872016-09-13 08:09:45 -070093 void write(const void* buffer, size_t bytes) {
94 fWriter.write(buffer, bytes);
95 }
Mike Reed45ab6302017-12-13 11:38:57 -050096 void writePad32(const void* buffer, size_t bytes) override {
Mike Reed60691a52017-12-05 15:11:24 -050097 fWriter.writePad(buffer, bytes);
98 }
reed54dc4872016-09-13 08:09:45 -070099
Ben Wagnera93a14a2017-08-28 10:34:05 -0400100 void reset(void* storage = nullptr, size_t storageSize = 0) {
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000101 fWriter.reset(storage, storageSize);
102 }
103
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000104 size_t bytesWritten() const { return fWriter.bytesWritten(); }
105
brianosmanfad98562016-05-04 11:06:28 -0700106 void writeByteArray(const void* data, size_t size) override;
107 void writeBool(bool value) override;
108 void writeScalar(SkScalar value) override;
109 void writeScalarArray(const SkScalar* value, uint32_t count) override;
110 void writeInt(int32_t value) override;
111 void writeIntArray(const int32_t* value, uint32_t count) override;
112 void writeUInt(uint32_t value) override;
113 void writeString(const char* value) override;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000114
brianosmanfad98562016-05-04 11:06:28 -0700115 void writeFlattenable(const SkFlattenable* flattenable) override;
116 void writeColor(SkColor color) override;
117 void writeColorArray(const SkColor* color, uint32_t count) override;
brianosman97bbf822016-09-25 13:15:58 -0700118 void writeColor4f(const SkColor4f& color) override;
119 void writeColor4fArray(const SkColor4f* color, uint32_t count) override;
brianosmanfad98562016-05-04 11:06:28 -0700120 void writePoint(const SkPoint& point) override;
121 void writePointArray(const SkPoint* point, uint32_t count) override;
122 void writeMatrix(const SkMatrix& matrix) override;
123 void writeIRect(const SkIRect& rect) override;
124 void writeRect(const SkRect& rect) override;
125 void writeRegion(const SkRegion& region) override;
126 void writePath(const SkPath& path) override;
127 size_t writeStream(SkStream* stream, size_t length) override;
brianosmanfad98562016-05-04 11:06:28 -0700128 void writeImage(const SkImage*) override;
129 void writeTypeface(SkTypeface* typeface) override;
130 void writePaint(const SkPaint& paint) override;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000131
132 bool writeToStream(SkWStream*);
133 void writeToMemory(void* dst) { fWriter.flatten(dst); }
134
135 SkFactorySet* setFactoryRecorder(SkFactorySet*);
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000136 SkRefCntSet* setTypefaceRecorder(SkRefCntSet*);
137
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000138private:
commit-bot@chromium.orga2bd2d12014-01-30 22:16:32 +0000139 const uint32_t fFlags;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000140 SkFactorySet* fFactorySet;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000141 SkWriter32 fWriter;
142
Mike Reed60691a52017-12-05 15:11:24 -0500143 SkRefCntSet* fTFSet;
msaretta3b3b232016-04-22 12:43:07 -0700144
145 // Only used if we do not have an fFactorySet
146 SkTHashMap<SkString, uint32_t> fFlattenableDict;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000147};
148
149#endif // SkWriteBuffer_DEFINED