blob: b0b6fd993ae58053ae7419007f1f9d6d52a08281 [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
Mike Reed60691a52017-12-05 15:11:24 -050012#define SK_SUPPORT_LEGACY_SERIAL_BUFFER_OBJECTS
13
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000014#include "SkData.h"
msarette8597a42016-03-24 10:41:47 -070015#include "SkImage.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000016#include "SkPath.h"
17#include "SkPicture.h"
18#include "SkRefCnt.h"
Mike Reed60691a52017-12-05 15:11:24 -050019#include "SkSerialProcs.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000020#include "SkWriter32.h"
msaretta3b3b232016-04-22 12:43:07 -070021#include "../private/SkTHash.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000022
Mike Reed60691a52017-12-05 15:11:24 -050023#ifdef SK_SUPPORT_LEGACY_SERIAL_BUFFER_OBJECTS
24#include "SkPixelSerializer.h"
25#endif
26
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000027class SkBitmap;
reed54dc4872016-09-13 08:09:45 -070028class SkDeduper;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000029class SkFactorySet;
30class SkFlattenable;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000031class SkRefCntSet;
32
Adrienne Walkerb7e300f2017-06-05 15:25:05 -070033class SK_API SkWriteBuffer {
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000034public:
brianosmanfad98562016-05-04 11:06:28 -070035 SkWriteBuffer() {}
36 virtual ~SkWriteBuffer() {}
37
38 virtual bool isCrossProcess() const = 0;
39
Mike Reed45ab6302017-12-13 11:38:57 -050040 virtual void writePad32(const void* buffer, size_t bytes) = 0;
41
brianosmanfad98562016-05-04 11:06:28 -070042 virtual void writeByteArray(const void* data, size_t size) = 0;
43 void writeDataAsByteArray(SkData* data) {
44 this->writeByteArray(data->data(), data->size());
45 }
46 virtual void writeBool(bool value) = 0;
47 virtual void writeScalar(SkScalar value) = 0;
48 virtual void writeScalarArray(const SkScalar* value, uint32_t count) = 0;
49 virtual void writeInt(int32_t value) = 0;
50 virtual void writeIntArray(const int32_t* value, uint32_t count) = 0;
51 virtual void writeUInt(uint32_t value) = 0;
52 void write32(int32_t value) {
53 this->writeInt(value);
54 }
55 virtual void writeString(const char* value) = 0;
56
57 virtual void writeFlattenable(const SkFlattenable* flattenable) = 0;
58 virtual void writeColor(SkColor color) = 0;
59 virtual void writeColorArray(const SkColor* color, uint32_t count) = 0;
brianosman97bbf822016-09-25 13:15:58 -070060 virtual void writeColor4f(const SkColor4f& color) = 0;
61 virtual void writeColor4fArray(const SkColor4f* color, uint32_t count) = 0;
brianosmanfad98562016-05-04 11:06:28 -070062 virtual void writePoint(const SkPoint& point) = 0;
63 virtual void writePointArray(const SkPoint* point, uint32_t count) = 0;
64 virtual void writeMatrix(const SkMatrix& matrix) = 0;
65 virtual void writeIRect(const SkIRect& rect) = 0;
66 virtual void writeRect(const SkRect& rect) = 0;
67 virtual void writeRegion(const SkRegion& region) = 0;
68 virtual void writePath(const SkPath& path) = 0;
69 virtual size_t writeStream(SkStream* stream, size_t length) = 0;
brianosmanfad98562016-05-04 11:06:28 -070070 virtual void writeImage(const SkImage*) = 0;
71 virtual void writeTypeface(SkTypeface* typeface) = 0;
72 virtual void writePaint(const SkPaint& paint) = 0;
reed54dc4872016-09-13 08:09:45 -070073
74 void setDeduper(SkDeduper* deduper) { fDeduper = deduper; }
75
Mike Reed88ea5b92017-11-02 11:32:45 -040076 /**
77 * Return a client specified context pointer. This is not interpreted by the writebuffer.
78 * It defaults to nullptr, but may be set with setClientContext(...).
79 */
80 void* getClientContext() const { return fClientCtx; }
81
82 /**
83 * Set the client specified context pointer. This is not interpreted by the writebuffer.
84 * It defaults to nullptr. It can be inspected by calling getClientContext().
85 */
86 void setClientContext(void* ctx) { fClientCtx = ctx; }
87
Mike Reed45ab6302017-12-13 11:38:57 -050088 void setSerialProcs(const SkSerialProcs& procs) { fProcs = procs; }
89
reed54dc4872016-09-13 08:09:45 -070090protected:
Mike Reed45ab6302017-12-13 11:38:57 -050091 SkDeduper* fDeduper = nullptr;
92 void* fClientCtx = nullptr;
93 SkSerialProcs fProcs;
94
95 friend class SkPicture; // fProcs
brianosmanfad98562016-05-04 11:06:28 -070096};
97
98/**
99 * Concrete implementation that serializes to a flat binary blob.
100 */
Adrienne Walkerb7e300f2017-06-05 15:25:05 -0700101class SK_API SkBinaryWriteBuffer : public SkWriteBuffer {
brianosmanfad98562016-05-04 11:06:28 -0700102public:
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000103 enum Flags {
brianosmanfad98562016-05-04 11:06:28 -0700104 kCrossProcess_Flag = 1 << 0,
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000105 };
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000106
brianosmanfad98562016-05-04 11:06:28 -0700107 SkBinaryWriteBuffer(uint32_t flags = 0);
108 SkBinaryWriteBuffer(void* initialStorage, size_t storageSize, uint32_t flags = 0);
Brian Salomond3b65972017-03-22 12:05:03 -0400109 ~SkBinaryWriteBuffer() override;
commit-bot@chromium.orga2bd2d12014-01-30 22:16:32 +0000110
brianosmanfad98562016-05-04 11:06:28 -0700111 bool isCrossProcess() const override {
msaretta3b3b232016-04-22 12:43:07 -0700112 return SkToBool(fFlags & kCrossProcess_Flag);
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000113 }
114
reed54dc4872016-09-13 08:09:45 -0700115 void write(const void* buffer, size_t bytes) {
116 fWriter.write(buffer, bytes);
117 }
Mike Reed45ab6302017-12-13 11:38:57 -0500118 void writePad32(const void* buffer, size_t bytes) override {
Mike Reed60691a52017-12-05 15:11:24 -0500119 fWriter.writePad(buffer, bytes);
120 }
reed54dc4872016-09-13 08:09:45 -0700121
Ben Wagnera93a14a2017-08-28 10:34:05 -0400122 void reset(void* storage = nullptr, size_t storageSize = 0) {
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000123 fWriter.reset(storage, storageSize);
124 }
125
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000126 size_t bytesWritten() const { return fWriter.bytesWritten(); }
127
brianosmanfad98562016-05-04 11:06:28 -0700128 void writeByteArray(const void* data, size_t size) override;
129 void writeBool(bool value) override;
130 void writeScalar(SkScalar value) override;
131 void writeScalarArray(const SkScalar* value, uint32_t count) override;
132 void writeInt(int32_t value) override;
133 void writeIntArray(const int32_t* value, uint32_t count) override;
134 void writeUInt(uint32_t value) override;
135 void writeString(const char* value) override;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000136
brianosmanfad98562016-05-04 11:06:28 -0700137 void writeFlattenable(const SkFlattenable* flattenable) override;
138 void writeColor(SkColor color) override;
139 void writeColorArray(const SkColor* color, uint32_t count) override;
brianosman97bbf822016-09-25 13:15:58 -0700140 void writeColor4f(const SkColor4f& color) override;
141 void writeColor4fArray(const SkColor4f* color, uint32_t count) override;
brianosmanfad98562016-05-04 11:06:28 -0700142 void writePoint(const SkPoint& point) override;
143 void writePointArray(const SkPoint* point, uint32_t count) override;
144 void writeMatrix(const SkMatrix& matrix) override;
145 void writeIRect(const SkIRect& rect) override;
146 void writeRect(const SkRect& rect) override;
147 void writeRegion(const SkRegion& region) override;
148 void writePath(const SkPath& path) override;
149 size_t writeStream(SkStream* stream, size_t length) override;
brianosmanfad98562016-05-04 11:06:28 -0700150 void writeImage(const SkImage*) override;
151 void writeTypeface(SkTypeface* typeface) override;
152 void writePaint(const SkPaint& paint) override;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000153
154 bool writeToStream(SkWStream*);
155 void writeToMemory(void* dst) { fWriter.flatten(dst); }
156
157 SkFactorySet* setFactoryRecorder(SkFactorySet*);
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000158 SkRefCntSet* setTypefaceRecorder(SkRefCntSet*);
159
Mike Reed60691a52017-12-05 15:11:24 -0500160#ifdef SK_SUPPORT_LEGACY_SERIAL_BUFFER_OBJECTS
bungeman6bd52842016-10-27 09:30:08 -0700161 void setPixelSerializer(sk_sp<SkPixelSerializer>);
Mike Reed60691a52017-12-05 15:11:24 -0500162#endif
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000163
164private:
commit-bot@chromium.orga2bd2d12014-01-30 22:16:32 +0000165 const uint32_t fFlags;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000166 SkFactorySet* fFactorySet;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000167 SkWriter32 fWriter;
168
Mike Reed60691a52017-12-05 15:11:24 -0500169 SkRefCntSet* fTFSet;
msaretta3b3b232016-04-22 12:43:07 -0700170
171 // Only used if we do not have an fFactorySet
172 SkTHashMap<SkString, uint32_t> fFlattenableDict;
Mike Reed60691a52017-12-05 15:11:24 -0500173
174#ifdef SK_SUPPORT_LEGACY_SERIAL_BUFFER_OBJECTS
175 sk_sp<SkPixelSerializer> fPS;
176#endif
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000177};
178
179#endif // SkWriteBuffer_DEFINED