blob: 87ac8bf21494aa3ea8ec2aec7823a03bf74a0bea [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;
22class SkFactorySet;
23class SkFlattenable;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000024class SkRefCntSet;
25
26class SkWriteBuffer {
27public:
brianosmanfad98562016-05-04 11:06:28 -070028 SkWriteBuffer() {}
29 virtual ~SkWriteBuffer() {}
30
31 virtual bool isCrossProcess() const = 0;
32
33 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;
51 virtual void writePoint(const SkPoint& point) = 0;
52 virtual void writePointArray(const SkPoint* point, uint32_t count) = 0;
53 virtual void writeMatrix(const SkMatrix& matrix) = 0;
54 virtual void writeIRect(const SkIRect& rect) = 0;
55 virtual void writeRect(const SkRect& rect) = 0;
56 virtual void writeRegion(const SkRegion& region) = 0;
57 virtual void writePath(const SkPath& path) = 0;
58 virtual size_t writeStream(SkStream* stream, size_t length) = 0;
59 virtual void writeBitmap(const SkBitmap& bitmap) = 0;
60 virtual void writeImage(const SkImage*) = 0;
61 virtual void writeTypeface(SkTypeface* typeface) = 0;
62 virtual void writePaint(const SkPaint& paint) = 0;
63};
64
65/**
66 * Concrete implementation that serializes to a flat binary blob.
67 */
68class SkBinaryWriteBuffer final : public SkWriteBuffer {
69public:
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000070 enum Flags {
brianosmanfad98562016-05-04 11:06:28 -070071 kCrossProcess_Flag = 1 << 0,
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000072 };
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000073
brianosmanfad98562016-05-04 11:06:28 -070074 SkBinaryWriteBuffer(uint32_t flags = 0);
75 SkBinaryWriteBuffer(void* initialStorage, size_t storageSize, uint32_t flags = 0);
76 ~SkBinaryWriteBuffer();
commit-bot@chromium.orga2bd2d12014-01-30 22:16:32 +000077
brianosmanfad98562016-05-04 11:06:28 -070078 bool isCrossProcess() const override {
msaretta3b3b232016-04-22 12:43:07 -070079 return SkToBool(fFlags & kCrossProcess_Flag);
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000080 }
81
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000082 void reset(void* storage = NULL, size_t storageSize = 0) {
83 fWriter.reset(storage, storageSize);
84 }
85
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000086 size_t bytesWritten() const { return fWriter.bytesWritten(); }
87
brianosmanfad98562016-05-04 11:06:28 -070088 void writeByteArray(const void* data, size_t size) override;
89 void writeBool(bool value) override;
90 void writeScalar(SkScalar value) override;
91 void writeScalarArray(const SkScalar* value, uint32_t count) override;
92 void writeInt(int32_t value) override;
93 void writeIntArray(const int32_t* value, uint32_t count) override;
94 void writeUInt(uint32_t value) override;
95 void writeString(const char* value) override;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +000096
brianosmanfad98562016-05-04 11:06:28 -070097 void writeFlattenable(const SkFlattenable* flattenable) override;
98 void writeColor(SkColor color) override;
99 void writeColorArray(const SkColor* color, uint32_t count) override;
100 void writePoint(const SkPoint& point) override;
101 void writePointArray(const SkPoint* point, uint32_t count) override;
102 void writeMatrix(const SkMatrix& matrix) override;
103 void writeIRect(const SkIRect& rect) override;
104 void writeRect(const SkRect& rect) override;
105 void writeRegion(const SkRegion& region) override;
106 void writePath(const SkPath& path) override;
107 size_t writeStream(SkStream* stream, size_t length) override;
108 void writeBitmap(const SkBitmap& bitmap) override;
109 void writeImage(const SkImage*) override;
110 void writeTypeface(SkTypeface* typeface) override;
111 void writePaint(const SkPaint& paint) override;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000112
113 bool writeToStream(SkWStream*);
114 void writeToMemory(void* dst) { fWriter.flatten(dst); }
115
116 SkFactorySet* setFactoryRecorder(SkFactorySet*);
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000117 SkRefCntSet* setTypefaceRecorder(SkRefCntSet*);
118
119 /**
scroggo895c43b2014-12-11 10:53:58 -0800120 * Set an SkPixelSerializer to store an encoded representation of pixels,
121 * e.g. SkBitmaps.
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000122 *
scroggo895c43b2014-12-11 10:53:58 -0800123 * Calls ref() on the serializer.
124 *
125 * TODO: Encode SkImage pixels as well.
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000126 */
scroggo895c43b2014-12-11 10:53:58 -0800127 void setPixelSerializer(SkPixelSerializer*);
reed871872f2015-06-22 12:48:26 -0700128 SkPixelSerializer* getPixelSerializer() const { return fPixelSerializer; }
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000129
130private:
commit-bot@chromium.orga2bd2d12014-01-30 22:16:32 +0000131 const uint32_t fFlags;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000132 SkFactorySet* fFactorySet;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000133 SkWriter32 fWriter;
134
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000135 SkRefCntSet* fTFSet;
136
scroggo895c43b2014-12-11 10:53:58 -0800137 SkAutoTUnref<SkPixelSerializer> fPixelSerializer;
msaretta3b3b232016-04-22 12:43:07 -0700138
139 // Only used if we do not have an fFactorySet
140 SkTHashMap<SkString, uint32_t> fFlattenableDict;
commit-bot@chromium.org8b0e8ac2014-01-30 18:58:24 +0000141};
142
143#endif // SkWriteBuffer_DEFINED