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 "SkData.h"
12#include "SkSerialProcs.h"
13#include "SkWriter32.h"
14#include "../private/SkTHash.h"
15
16class SkDeduper;
17class SkFactorySet;
18class SkFlattenable;
19class SkImage;
20class SkPath;
21class SkRefCntSet;
22
23class SkWriteBuffer {
24public:
25    SkWriteBuffer() {}
26    virtual ~SkWriteBuffer() {}
27
28    virtual void writePad32(const void* buffer, size_t bytes) = 0;
29
30    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;
48    virtual void writeColor4f(const SkColor4f& color) = 0;
49    virtual void writeColor4fArray(const SkColor4f* color, uint32_t count) = 0;
50    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;
58    virtual void writeImage(const SkImage*) = 0;
59    virtual void writeTypeface(SkTypeface* typeface) = 0;
60    virtual void writePaint(const SkPaint& paint) = 0;
61
62    void setDeduper(SkDeduper* deduper) { fDeduper = deduper; }
63
64    void setSerialProcs(const SkSerialProcs& procs) { fProcs = procs; }
65
66protected:
67    SkDeduper*      fDeduper = nullptr;
68    SkSerialProcs   fProcs;
69
70    friend class SkPicture; // fProcs
71};
72
73/**
74 * Concrete implementation that serializes to a flat binary blob.
75 */
76class SkBinaryWriteBuffer : public SkWriteBuffer {
77public:
78    SkBinaryWriteBuffer();
79    SkBinaryWriteBuffer(void* initialStorage, size_t storageSize);
80    ~SkBinaryWriteBuffer() override;
81
82    void write(const void* buffer, size_t bytes) {
83        fWriter.write(buffer, bytes);
84    }
85    void writePad32(const void* buffer, size_t bytes) override {
86        fWriter.writePad(buffer, bytes);
87    }
88
89    void reset(void* storage = nullptr, size_t storageSize = 0) {
90        fWriter.reset(storage, storageSize);
91    }
92
93    size_t bytesWritten() const { return fWriter.bytesWritten(); }
94
95    void writeByteArray(const void* data, size_t size) override;
96    void writeBool(bool value) override;
97    void writeScalar(SkScalar value) override;
98    void writeScalarArray(const SkScalar* value, uint32_t count) override;
99    void writeInt(int32_t value) override;
100    void writeIntArray(const int32_t* value, uint32_t count) override;
101    void writeUInt(uint32_t value) override;
102    void writeString(const char* value) override;
103
104    void writeFlattenable(const SkFlattenable* flattenable) override;
105    void writeColor(SkColor color) override;
106    void writeColorArray(const SkColor* color, uint32_t count) override;
107    void writeColor4f(const SkColor4f& color) override;
108    void writeColor4fArray(const SkColor4f* color, uint32_t count) override;
109    void writePoint(const SkPoint& point) override;
110    void writePointArray(const SkPoint* point, uint32_t count) override;
111    void writeMatrix(const SkMatrix& matrix) override;
112    void writeIRect(const SkIRect& rect) override;
113    void writeRect(const SkRect& rect) override;
114    void writeRegion(const SkRegion& region) override;
115    void writePath(const SkPath& path) override;
116    size_t writeStream(SkStream* stream, size_t length) override;
117    void writeImage(const SkImage*) override;
118    void writeTypeface(SkTypeface* typeface) override;
119    void writePaint(const SkPaint& paint) override;
120
121    bool writeToStream(SkWStream*);
122    void writeToMemory(void* dst) { fWriter.flatten(dst); }
123
124    SkFactorySet* setFactoryRecorder(SkFactorySet*);
125    SkRefCntSet* setTypefaceRecorder(SkRefCntSet*);
126
127private:
128    SkFactorySet* fFactorySet;
129    SkWriter32 fWriter;
130
131    SkRefCntSet*    fTFSet;
132
133    // Only used if we do not have an fFactorySet
134    SkTHashMap<SkString, uint32_t> fFlattenableDict;
135};
136
137#endif // SkWriteBuffer_DEFINED
138