blob: a104ffcb1f9039b29dcc4b6d760ebe12d8dbe68b [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"
msarette8597a42016-03-24 10:41:47 -070013#include "SkImage.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000014#include "SkPath.h"
15#include "SkPicture.h"
scroggo895c43b2014-12-11 10:53:58 -080016#include "SkPixelSerializer.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000017#include "SkRefCnt.h"
18#include "SkWriter32.h"
msaretta3b3b232016-04-22 12:43:07 -070019#include "../private/SkTHash.h"
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000020
21class SkBitmap;
reed54dc4872016-09-13 08:09:45 -070022class SkDeduper;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000023class SkFactorySet;
24class SkFlattenable;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000025class SkRefCntSet;
26
27class SkWriteBuffer {
28public:
brianosmanfad98562016-05-04 11:06:28 -070029 SkWriteBuffer() {}
30 virtual ~SkWriteBuffer() {}
31
32 virtual bool isCrossProcess() const = 0;
33
34 virtual void writeByteArray(const void* data, size_t size) = 0;
35 void writeDataAsByteArray(SkData* data) {
36 this->writeByteArray(data->data(), data->size());
37 }
38 virtual void writeBool(bool value) = 0;
39 virtual void writeScalar(SkScalar value) = 0;
40 virtual void writeScalarArray(const SkScalar* value, uint32_t count) = 0;
41 virtual void writeInt(int32_t value) = 0;
42 virtual void writeIntArray(const int32_t* value, uint32_t count) = 0;
43 virtual void writeUInt(uint32_t value) = 0;
44 void write32(int32_t value) {
45 this->writeInt(value);
46 }
47 virtual void writeString(const char* value) = 0;
48
49 virtual void writeFlattenable(const SkFlattenable* flattenable) = 0;
50 virtual void writeColor(SkColor color) = 0;
51 virtual void writeColorArray(const SkColor* color, uint32_t count) = 0;
brianosman97bbf822016-09-25 13:15:58 -070052 virtual void writeColor4f(const SkColor4f& color) = 0;
53 virtual void writeColor4fArray(const SkColor4f* color, uint32_t count) = 0;
brianosmanfad98562016-05-04 11:06:28 -070054 virtual void writePoint(const SkPoint& point) = 0;
55 virtual void writePointArray(const SkPoint* point, uint32_t count) = 0;
56 virtual void writeMatrix(const SkMatrix& matrix) = 0;
57 virtual void writeIRect(const SkIRect& rect) = 0;
58 virtual void writeRect(const SkRect& rect) = 0;
59 virtual void writeRegion(const SkRegion& region) = 0;
60 virtual void writePath(const SkPath& path) = 0;
61 virtual size_t writeStream(SkStream* stream, size_t length) = 0;
62 virtual void writeBitmap(const SkBitmap& bitmap) = 0;
63 virtual void writeImage(const SkImage*) = 0;
64 virtual void writeTypeface(SkTypeface* typeface) = 0;
65 virtual void writePaint(const SkPaint& paint) = 0;
reed54dc4872016-09-13 08:09:45 -070066
67 void setDeduper(SkDeduper* deduper) { fDeduper = deduper; }
68
69protected:
70 SkDeduper* fDeduper = nullptr;
brianosmanfad98562016-05-04 11:06:28 -070071};
72
73/**
74 * Concrete implementation that serializes to a flat binary blob.
75 */
reed54dc4872016-09-13 08:09:45 -070076class SkBinaryWriteBuffer : public SkWriteBuffer {
brianosmanfad98562016-05-04 11:06:28 -070077public:
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000078 enum Flags {
brianosmanfad98562016-05-04 11:06:28 -070079 kCrossProcess_Flag = 1 << 0,
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000080 };
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000081
brianosmanfad98562016-05-04 11:06:28 -070082 SkBinaryWriteBuffer(uint32_t flags = 0);
83 SkBinaryWriteBuffer(void* initialStorage, size_t storageSize, uint32_t flags = 0);
84 ~SkBinaryWriteBuffer();
commit-bot@chromium.orga2bd2d12014-01-30 22:16:32 +000085
brianosmanfad98562016-05-04 11:06:28 -070086 bool isCrossProcess() const override {
msaretta3b3b232016-04-22 12:43:07 -070087 return SkToBool(fFlags & kCrossProcess_Flag);
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000088 }
89
reed54dc4872016-09-13 08:09:45 -070090 void write(const void* buffer, size_t bytes) {
91 fWriter.write(buffer, bytes);
92 }
93
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000094 void reset(void* storage = NULL, size_t storageSize = 0) {
95 fWriter.reset(storage, storageSize);
96 }
97
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000098 size_t bytesWritten() const { return fWriter.bytesWritten(); }
99
brianosmanfad98562016-05-04 11:06:28 -0700100 void writeByteArray(const void* data, size_t size) override;
101 void writeBool(bool value) override;
102 void writeScalar(SkScalar value) override;
103 void writeScalarArray(const SkScalar* value, uint32_t count) override;
104 void writeInt(int32_t value) override;
105 void writeIntArray(const int32_t* value, uint32_t count) override;
106 void writeUInt(uint32_t value) override;
107 void writeString(const char* value) override;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000108
brianosmanfad98562016-05-04 11:06:28 -0700109 void writeFlattenable(const SkFlattenable* flattenable) override;
110 void writeColor(SkColor color) override;
111 void writeColorArray(const SkColor* color, uint32_t count) override;
brianosman97bbf822016-09-25 13:15:58 -0700112 void writeColor4f(const SkColor4f& color) override;
113 void writeColor4fArray(const SkColor4f* color, uint32_t count) override;
brianosmanfad98562016-05-04 11:06:28 -0700114 void writePoint(const SkPoint& point) override;
115 void writePointArray(const SkPoint* point, uint32_t count) override;
116 void writeMatrix(const SkMatrix& matrix) override;
117 void writeIRect(const SkIRect& rect) override;
118 void writeRect(const SkRect& rect) override;
119 void writeRegion(const SkRegion& region) override;
120 void writePath(const SkPath& path) override;
121 size_t writeStream(SkStream* stream, size_t length) override;
122 void writeBitmap(const SkBitmap& bitmap) override;
123 void writeImage(const SkImage*) override;
124 void writeTypeface(SkTypeface* typeface) override;
125 void writePaint(const SkPaint& paint) override;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000126
127 bool writeToStream(SkWStream*);
128 void writeToMemory(void* dst) { fWriter.flatten(dst); }
129
130 SkFactorySet* setFactoryRecorder(SkFactorySet*);
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000131 SkRefCntSet* setTypefaceRecorder(SkRefCntSet*);
132
133 /**
scroggo895c43b2014-12-11 10:53:58 -0800134 * Set an SkPixelSerializer to store an encoded representation of pixels,
135 * e.g. SkBitmaps.
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000136 *
scroggo895c43b2014-12-11 10:53:58 -0800137 * TODO: Encode SkImage pixels as well.
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000138 */
bungeman6bd52842016-10-27 09:30:08 -0700139 void setPixelSerializer(sk_sp<SkPixelSerializer>);
140 SkPixelSerializer* getPixelSerializer() const { return fPixelSerializer.get(); }
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000141
142private:
commit-bot@chromium.orga2bd2d12014-01-30 22:16:32 +0000143 const uint32_t fFlags;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000144 SkFactorySet* fFactorySet;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000145 SkWriter32 fWriter;
146
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000147 SkRefCntSet* fTFSet;
148
bungeman6bd52842016-10-27 09:30:08 -0700149 sk_sp<SkPixelSerializer> fPixelSerializer;
msaretta3b3b232016-04-22 12:43:07 -0700150
151 // Only used if we do not have an fFactorySet
152 SkTHashMap<SkString, uint32_t> fFlattenableDict;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000153};
154
155#endif // SkWriteBuffer_DEFINED