|
1 |
|
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 |
|
12 #include "SkBitmapHeap.h" |
|
13 #include "SkData.h" |
|
14 #include "SkPath.h" |
|
15 #include "SkPicture.h" |
|
16 #include "SkRefCnt.h" |
|
17 #include "SkWriter32.h" |
|
18 |
|
19 class SkBitmap; |
|
20 class SkFactorySet; |
|
21 class SkFlattenable; |
|
22 class SkNamedFactorySet; |
|
23 class SkRefCntSet; |
|
24 |
|
25 class SkWriteBuffer { |
|
26 public: |
|
27 enum Flags { |
|
28 kCrossProcess_Flag = 1 << 0, |
|
29 kValidation_Flag = 1 << 1, |
|
30 }; |
|
31 |
|
32 SkWriteBuffer(uint32_t flags = 0); |
|
33 SkWriteBuffer(void* initialStorage, size_t storageSize, uint32_t flags = 0); |
|
34 ~SkWriteBuffer(); |
|
35 |
|
36 bool isCrossProcess() const { |
|
37 return this->isValidating() || SkToBool(fFlags & kCrossProcess_Flag); |
|
38 } |
|
39 |
|
40 SkWriter32* getWriter32() { return &fWriter; } |
|
41 void reset(void* storage = NULL, size_t storageSize = 0) { |
|
42 fWriter.reset(storage, storageSize); |
|
43 } |
|
44 |
|
45 uint32_t* reserve(size_t size) { return fWriter.reserve(size); } |
|
46 |
|
47 size_t bytesWritten() const { return fWriter.bytesWritten(); } |
|
48 |
|
49 void writeByteArray(const void* data, size_t size); |
|
50 void writeDataAsByteArray(SkData* data) { this->writeByteArray(data->data(), data->size()); } |
|
51 void writeBool(bool value); |
|
52 void writeFixed(SkFixed value); |
|
53 void writeScalar(SkScalar value); |
|
54 void writeScalarArray(const SkScalar* value, uint32_t count); |
|
55 void writeInt(int32_t value); |
|
56 void writeIntArray(const int32_t* value, uint32_t count); |
|
57 void writeUInt(uint32_t value); |
|
58 void write32(int32_t value); |
|
59 void writeString(const char* value); |
|
60 void writeEncodedString(const void* value, size_t byteLength, SkPaint::TextEncoding encoding); |
|
61 void writeFunctionPtr(void* ptr) { this->writeByteArray(&ptr, sizeof(ptr)); } |
|
62 |
|
63 void writeFlattenable(const SkFlattenable* flattenable); |
|
64 void writeColor(const SkColor& color); |
|
65 void writeColorArray(const SkColor* color, uint32_t count); |
|
66 void writePoint(const SkPoint& point); |
|
67 void writePointArray(const SkPoint* point, uint32_t count); |
|
68 void writeMatrix(const SkMatrix& matrix); |
|
69 void writeIRect(const SkIRect& rect); |
|
70 void writeRect(const SkRect& rect); |
|
71 void writeRegion(const SkRegion& region); |
|
72 void writePath(const SkPath& path); |
|
73 size_t writeStream(SkStream* stream, size_t length); |
|
74 void writeBitmap(const SkBitmap& bitmap); |
|
75 void writeTypeface(SkTypeface* typeface); |
|
76 void writePaint(const SkPaint& paint) { paint.flatten(*this); } |
|
77 |
|
78 bool writeToStream(SkWStream*); |
|
79 void writeToMemory(void* dst) { fWriter.flatten(dst); } |
|
80 |
|
81 SkFactorySet* setFactoryRecorder(SkFactorySet*); |
|
82 SkNamedFactorySet* setNamedFactoryRecorder(SkNamedFactorySet*); |
|
83 |
|
84 SkRefCntSet* getTypefaceRecorder() const { return fTFSet; } |
|
85 SkRefCntSet* setTypefaceRecorder(SkRefCntSet*); |
|
86 |
|
87 /** |
|
88 * Set an SkBitmapHeap to store bitmaps rather than flattening. |
|
89 * |
|
90 * Incompatible with an EncodeBitmap function. If an EncodeBitmap function is set, setting an |
|
91 * SkBitmapHeap will set the function to NULL in release mode and crash in debug. |
|
92 */ |
|
93 void setBitmapHeap(SkBitmapHeap*); |
|
94 |
|
95 /** |
|
96 * Provide a function to encode an SkBitmap to an SkData. writeBitmap will attempt to use |
|
97 * bitmapEncoder to store the SkBitmap. If the reader does not provide a function to decode, it |
|
98 * will not be able to restore SkBitmaps, but will still be able to read the rest of the stream. |
|
99 * bitmapEncoder will never be called with a NULL pixelRefOffset. |
|
100 * |
|
101 * Incompatible with the SkBitmapHeap. If an encoder is set fBitmapHeap will be set to NULL in |
|
102 * release and crash in debug. |
|
103 */ |
|
104 void setBitmapEncoder(SkPicture::EncodeBitmap bitmapEncoder); |
|
105 |
|
106 private: |
|
107 bool isValidating() const { return SkToBool(fFlags & kValidation_Flag); } |
|
108 |
|
109 const uint32_t fFlags; |
|
110 SkFactorySet* fFactorySet; |
|
111 SkNamedFactorySet* fNamedFactorySet; |
|
112 SkWriter32 fWriter; |
|
113 |
|
114 SkBitmapHeap* fBitmapHeap; |
|
115 SkRefCntSet* fTFSet; |
|
116 |
|
117 SkPicture::EncodeBitmap fBitmapEncoder; |
|
118 }; |
|
119 |
|
120 #endif // SkWriteBuffer_DEFINED |