blob: 42d8f96eb97384730f9bdbf6f827f5b48d45fe4f [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
40 virtual void writeByteArray(const void* data, size_t size) = 0;
41 void writeDataAsByteArray(SkData* data) {
42 this->writeByteArray(data->data(), data->size());
43 }
44 virtual void writeBool(bool value) = 0;
45 virtual void writeScalar(SkScalar value) = 0;
46 virtual void writeScalarArray(const SkScalar* value, uint32_t count) = 0;
47 virtual void writeInt(int32_t value) = 0;
48 virtual void writeIntArray(const int32_t* value, uint32_t count) = 0;
49 virtual void writeUInt(uint32_t value) = 0;
50 void write32(int32_t value) {
51 this->writeInt(value);
52 }
53 virtual void writeString(const char* value) = 0;
54
55 virtual void writeFlattenable(const SkFlattenable* flattenable) = 0;
56 virtual void writeColor(SkColor color) = 0;
57 virtual void writeColorArray(const SkColor* color, uint32_t count) = 0;
brianosman97bbf822016-09-25 13:15:58 -070058 virtual void writeColor4f(const SkColor4f& color) = 0;
59 virtual void writeColor4fArray(const SkColor4f* color, uint32_t count) = 0;
brianosmanfad98562016-05-04 11:06:28 -070060 virtual void writePoint(const SkPoint& point) = 0;
61 virtual void writePointArray(const SkPoint* point, uint32_t count) = 0;
62 virtual void writeMatrix(const SkMatrix& matrix) = 0;
63 virtual void writeIRect(const SkIRect& rect) = 0;
64 virtual void writeRect(const SkRect& rect) = 0;
65 virtual void writeRegion(const SkRegion& region) = 0;
66 virtual void writePath(const SkPath& path) = 0;
67 virtual size_t writeStream(SkStream* stream, size_t length) = 0;
brianosmanfad98562016-05-04 11:06:28 -070068 virtual void writeImage(const SkImage*) = 0;
69 virtual void writeTypeface(SkTypeface* typeface) = 0;
70 virtual void writePaint(const SkPaint& paint) = 0;
reed54dc4872016-09-13 08:09:45 -070071
72 void setDeduper(SkDeduper* deduper) { fDeduper = deduper; }
73
Mike Reed88ea5b92017-11-02 11:32:45 -040074 /**
75 * Return a client specified context pointer. This is not interpreted by the writebuffer.
76 * It defaults to nullptr, but may be set with setClientContext(...).
77 */
78 void* getClientContext() const { return fClientCtx; }
79
80 /**
81 * Set the client specified context pointer. This is not interpreted by the writebuffer.
82 * It defaults to nullptr. It can be inspected by calling getClientContext().
83 */
84 void setClientContext(void* ctx) { fClientCtx = ctx; }
85
reed54dc4872016-09-13 08:09:45 -070086protected:
87 SkDeduper* fDeduper = nullptr;
Mike Reed88ea5b92017-11-02 11:32:45 -040088 void* fClientCtx = nullptr;
brianosmanfad98562016-05-04 11:06:28 -070089};
90
91/**
92 * Concrete implementation that serializes to a flat binary blob.
93 */
Adrienne Walkerb7e300f2017-06-05 15:25:05 -070094class SK_API SkBinaryWriteBuffer : public SkWriteBuffer {
brianosmanfad98562016-05-04 11:06:28 -070095public:
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000096 enum Flags {
brianosmanfad98562016-05-04 11:06:28 -070097 kCrossProcess_Flag = 1 << 0,
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000098 };
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000099
brianosmanfad98562016-05-04 11:06:28 -0700100 SkBinaryWriteBuffer(uint32_t flags = 0);
101 SkBinaryWriteBuffer(void* initialStorage, size_t storageSize, uint32_t flags = 0);
Brian Salomond3b65972017-03-22 12:05:03 -0400102 ~SkBinaryWriteBuffer() override;
commit-bot@chromium.orga2bd2d12014-01-30 22:16:32 +0000103
brianosmanfad98562016-05-04 11:06:28 -0700104 bool isCrossProcess() const override {
msaretta3b3b232016-04-22 12:43:07 -0700105 return SkToBool(fFlags & kCrossProcess_Flag);
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000106 }
107
reed54dc4872016-09-13 08:09:45 -0700108 void write(const void* buffer, size_t bytes) {
109 fWriter.write(buffer, bytes);
110 }
Mike Reed60691a52017-12-05 15:11:24 -0500111 void writePad32(const void* buffer, size_t bytes) {
112 fWriter.writePad(buffer, bytes);
113 }
reed54dc4872016-09-13 08:09:45 -0700114
Ben Wagnera93a14a2017-08-28 10:34:05 -0400115 void reset(void* storage = nullptr, size_t storageSize = 0) {
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000116 fWriter.reset(storage, storageSize);
117 }
118
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000119 size_t bytesWritten() const { return fWriter.bytesWritten(); }
120
brianosmanfad98562016-05-04 11:06:28 -0700121 void writeByteArray(const void* data, size_t size) override;
122 void writeBool(bool value) override;
123 void writeScalar(SkScalar value) override;
124 void writeScalarArray(const SkScalar* value, uint32_t count) override;
125 void writeInt(int32_t value) override;
126 void writeIntArray(const int32_t* value, uint32_t count) override;
127 void writeUInt(uint32_t value) override;
128 void writeString(const char* value) override;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000129
brianosmanfad98562016-05-04 11:06:28 -0700130 void writeFlattenable(const SkFlattenable* flattenable) override;
131 void writeColor(SkColor color) override;
132 void writeColorArray(const SkColor* color, uint32_t count) override;
brianosman97bbf822016-09-25 13:15:58 -0700133 void writeColor4f(const SkColor4f& color) override;
134 void writeColor4fArray(const SkColor4f* color, uint32_t count) override;
brianosmanfad98562016-05-04 11:06:28 -0700135 void writePoint(const SkPoint& point) override;
136 void writePointArray(const SkPoint* point, uint32_t count) override;
137 void writeMatrix(const SkMatrix& matrix) override;
138 void writeIRect(const SkIRect& rect) override;
139 void writeRect(const SkRect& rect) override;
140 void writeRegion(const SkRegion& region) override;
141 void writePath(const SkPath& path) override;
142 size_t writeStream(SkStream* stream, size_t length) override;
brianosmanfad98562016-05-04 11:06:28 -0700143 void writeImage(const SkImage*) override;
144 void writeTypeface(SkTypeface* typeface) override;
145 void writePaint(const SkPaint& paint) override;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000146
147 bool writeToStream(SkWStream*);
148 void writeToMemory(void* dst) { fWriter.flatten(dst); }
149
150 SkFactorySet* setFactoryRecorder(SkFactorySet*);
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000151 SkRefCntSet* setTypefaceRecorder(SkRefCntSet*);
152
Mike Reed60691a52017-12-05 15:11:24 -0500153 void setSerialProcs(const SkSerialProcs& procs) { fProcs = procs; }
154
155#ifdef SK_SUPPORT_LEGACY_SERIAL_BUFFER_OBJECTS
bungeman6bd52842016-10-27 09:30:08 -0700156 void setPixelSerializer(sk_sp<SkPixelSerializer>);
Mike Reed60691a52017-12-05 15:11:24 -0500157#endif
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000158
159private:
commit-bot@chromium.orga2bd2d12014-01-30 22:16:32 +0000160 const uint32_t fFlags;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000161 SkFactorySet* fFactorySet;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000162 SkWriter32 fWriter;
163
Mike Reed60691a52017-12-05 15:11:24 -0500164 SkRefCntSet* fTFSet;
165 SkSerialProcs fProcs;
msaretta3b3b232016-04-22 12:43:07 -0700166
167 // Only used if we do not have an fFactorySet
168 SkTHashMap<SkString, uint32_t> fFlattenableDict;
Mike Reed60691a52017-12-05 15:11:24 -0500169
170#ifdef SK_SUPPORT_LEGACY_SERIAL_BUFFER_OBJECTS
171 sk_sp<SkPixelSerializer> fPS;
172#endif
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000173};
174
175#endif // SkWriteBuffer_DEFINED