Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(575)

Side by Side Diff: tests/SerializeDrawableTest.cpp

Issue 1837913003: Add support for serializing/deserializing of SkDrawable (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Improve testing Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/core/SkSerializeDrawable.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /*
2 * Copyright 2016 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 #include "SkCanvas.h"
9 #include "SkDrawable.h"
10 #include "SkReadBuffer.h"
11 #include "SkRect.h"
12 #include "SkSerializeDrawable.h"
13 #include "SkStream.h"
14 #include "SkWriteBuffer.h"
15 #include "Test.h"
16
17 class SkIntDrawable : public SkDrawable {
18 public:
19 SkIntDrawable(uint32_t a, uint32_t b, uint32_t c, uint32_t d)
20 : fA(a)
21 , fB(b)
22 , fC(c)
23 , fD(d)
24 {}
25
26 void flatten(SkWriteBuffer& buffer) const override {
27 buffer.writeUInt(fA);
28 buffer.writeUInt(fB);
29 buffer.writeUInt(fC);
30 buffer.writeUInt(fD);
31 }
32
33 static SkFlattenable* CreateProc(SkReadBuffer& buffer) {
34 uint32_t a = buffer.readUInt();
35 uint32_t b = buffer.readUInt();
36 uint32_t c = buffer.readUInt();
37 uint32_t d = buffer.readUInt();
38 return new SkIntDrawable(a, b, c, d);
39 }
40
41 Factory getFactory() const override { return CreateProc; }
42
43 uint32_t a() const { return fA; }
44 uint32_t b() const { return fB; }
45 uint32_t c() const { return fC; }
46 uint32_t d() const { return fD; }
47
48 protected:
49 SkRect onGetBounds() override { return SkRect::MakeEmpty(); }
50 void onDraw(SkCanvas*) override {}
51
52 private:
53 uint32_t fA;
54 uint32_t fB;
55 uint32_t fC;
56 uint32_t fD;
57 };
58
59 class SkPaintDrawable : public SkDrawable {
60 public:
61 SkPaintDrawable(const SkPaint& paint)
62 : fPaint(paint)
63 {}
64
65 void flatten(SkWriteBuffer& buffer) const override {
66 buffer.writePaint(fPaint);
67 }
68
69 static SkFlattenable* CreateProc(SkReadBuffer& buffer) {
70 SkPaint paint;
71 buffer.readPaint(&paint);
72 return new SkPaintDrawable(paint);
73 }
74
75 Factory getFactory() const override { return CreateProc; }
76
77 const SkPaint& paint() const { return fPaint; }
78
79 protected:
80 SkRect onGetBounds() override { return SkRect::MakeEmpty(); }
81 void onDraw(SkCanvas*) override {}
82
83 private:
84 SkPaint fPaint;
85 };
86
87 class SkCompoundDrawable : public SkDrawable {
88 public:
89 SkCompoundDrawable(uint32_t a, uint32_t b, uint32_t c, uint32_t d, const SkP aint& paint)
90 : fIntDrawable(new SkIntDrawable(a, b, c, d))
91 , fPaintDrawable(new SkPaintDrawable(paint))
92 {}
93
94 SkCompoundDrawable(SkIntDrawable* intDrawable, SkPaintDrawable* paintDrawabl e)
95 : fIntDrawable(SkRef(intDrawable))
96 , fPaintDrawable(SkRef(paintDrawable))
97 {}
98
99 void flatten(SkWriteBuffer& buffer) const override {
100 buffer.writeFlattenable(fIntDrawable);
101 buffer.writeFlattenable(fPaintDrawable);
102 }
103
104 static SkFlattenable* CreateProc(SkReadBuffer& buffer) {
105 SkAutoTUnref<SkFlattenable> intDrawable(
106 buffer.readFlattenable(SkFlattenable::kSkDrawable_Type));
107 SkASSERT(intDrawable);
108 SkASSERT(!strcmp("SkIntDrawable", intDrawable->getTypeName()));
109
110 SkAutoTUnref<SkFlattenable> paintDrawable(
111 buffer.readFlattenable(SkFlattenable::kSkDrawable_Type));
112 SkASSERT(paintDrawable);
113 SkASSERT(!strcmp("SkPaintDrawable", paintDrawable->getTypeName()));
114
115 return new SkCompoundDrawable((SkIntDrawable*) intDrawable.get(),
116 (SkPaintDrawable*) paintDrawable.get());
117 }
118
119 Factory getFactory() const override { return CreateProc; }
120
121 SkIntDrawable* intDrawable() const { return fIntDrawable; }
122 SkPaintDrawable* paintDrawable() const { return fPaintDrawable; }
123
124 protected:
125 SkRect onGetBounds() override { return SkRect::MakeEmpty(); }
126 void onDraw(SkCanvas*) override {}
127
128 private:
129 SkAutoTUnref<SkIntDrawable> fIntDrawable;
130 SkAutoTUnref<SkPaintDrawable> fPaintDrawable;
131 };
132
133 class SkRootDrawable : public SkDrawable {
134 public:
135 SkRootDrawable(uint32_t a, uint32_t b, uint32_t c, uint32_t d, const SkPaint & paint,
136 uint32_t e, uint32_t f, uint32_t g, uint32_t h, SkDrawable* d rawable)
137 : fCompoundDrawable(new SkCompoundDrawable(a, b, c, d, paint))
138 , fIntDrawable(new SkIntDrawable(e, f, g, h))
139 , fDrawable(SkRef(drawable))
140 {}
141
142 SkRootDrawable(SkCompoundDrawable* compoundDrawable, SkIntDrawable* intDrawa ble,
143 SkDrawable* drawable)
144 : fCompoundDrawable(SkRef(compoundDrawable))
145 , fIntDrawable(SkRef(intDrawable))
146 , fDrawable(SkRef(drawable))
147 {}
148
149 void flatten(SkWriteBuffer& buffer) const override {
150 buffer.writeFlattenable(fCompoundDrawable);
151 buffer.writeFlattenable(fIntDrawable);
152 buffer.writeFlattenable(fDrawable);
153 }
154
155 static SkFlattenable* CreateProc(SkReadBuffer& buffer) {
156 SkAutoTUnref<SkFlattenable> compoundDrawable(
157 buffer.readFlattenable(SkFlattenable::kSkDrawable_Type));
158 SkASSERT(compoundDrawable);
159 SkASSERT(!strcmp("SkCompoundDrawable", compoundDrawable->getTypeName())) ;
160
161 SkAutoTUnref<SkFlattenable> intDrawable(
162 buffer.readFlattenable(SkFlattenable::kSkDrawable_Type));
163 SkASSERT(intDrawable);
164 SkASSERT(!strcmp("SkIntDrawable", intDrawable->getTypeName()));
165
166 SkAutoTUnref<SkFlattenable> drawable(
167 buffer.readFlattenable(SkFlattenable::kSkDrawable_Type));
168 SkASSERT(drawable);
169
170 return new SkRootDrawable((SkCompoundDrawable*) compoundDrawable.get(),
171 (SkIntDrawable*) intDrawable.get(),
172 (SkDrawable*) drawable.get());
173 }
174
175 Factory getFactory() const override { return CreateProc; }
176
177 SkCompoundDrawable* compoundDrawable() const { return fCompoundDrawable; }
178 SkIntDrawable* intDrawable() const { return fIntDrawable; }
179 SkDrawable* drawable() const { return fDrawable; }
180
181 protected:
182 SkRect onGetBounds() override { return SkRect::MakeEmpty(); }
183 void onDraw(SkCanvas*) override {}
184
185 private:
186 SkAutoTUnref<SkCompoundDrawable> fCompoundDrawable;
187 SkAutoTUnref<SkIntDrawable> fIntDrawable;
188 SkAutoTUnref<SkDrawable> fDrawable;
189 };
190
191 DEF_TEST(SerializeDrawable, r) {
192 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkIntDrawable)
msarett 2016/03/29 15:29:18 Still need to think about how to register drawable
193 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkPaintDrawable)
194 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkCompoundDrawable)
195 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkRootDrawable)
196
197 // Create and serialize the test drawable
198 SkAutoTUnref<SkDrawable> drawable(new SkIntDrawable(1, 2, 3, 4));
199 SkPaint paint;
200 paint.setColor(SK_ColorBLUE);
201 SkAutoTUnref<SkRootDrawable> rootDrawable(new SkRootDrawable(5, 6, 7, 8, pai nt, 9, 10, 11, 12,
202 drawable));
203 SkAutoTDelete<SkWriteBuffer> writeBuffer(SkSerializeDrawable::Serialize(*roo tDrawable));
204
205 // Copy the contents of the write buffer into a read buffer
206 sk_sp<SkData> data = SkData::MakeUninitialized(writeBuffer->bytesWritten());
207 writeBuffer->writeToMemory(data->writable_data());
208 SkReadBuffer readBuffer(data->data(), data->size());
209
210 // Deserialize and verify the drawable
211 SkAutoTUnref<SkDrawable> out(SkSerializeDrawable::NewFromSerialized(readBuff er));
212 REPORTER_ASSERT(r, out);
213 REPORTER_ASSERT(r, !strcmp("SkRootDrawable", out->getTypeName()));
214
215 SkRootDrawable* root = (SkRootDrawable*) out.get();
216 REPORTER_ASSERT(r, 5 == root->compoundDrawable()->intDrawable()->a());
217 REPORTER_ASSERT(r, 6 == root->compoundDrawable()->intDrawable()->b());
218 REPORTER_ASSERT(r, 7 == root->compoundDrawable()->intDrawable()->c());
219 REPORTER_ASSERT(r, 8 == root->compoundDrawable()->intDrawable()->d());
220 REPORTER_ASSERT(r, SK_ColorBLUE ==
221 root->compoundDrawable()->paintDrawable()->paint().getColor());
222 REPORTER_ASSERT(r, 9 == root->intDrawable()->a());
223 REPORTER_ASSERT(r, 10 == root->intDrawable()->b());
224 REPORTER_ASSERT(r, 11 == root->intDrawable()->c());
225 REPORTER_ASSERT(r, 12 == root->intDrawable()->d());
226
227 // Note that we can still recognize the generic drawable as int drawable
228 SkDrawable* generic = root->drawable();
229 REPORTER_ASSERT(r, !strcmp("SkIntDrawable", generic->getTypeName()));
230 SkIntDrawable* integer = (SkIntDrawable*) generic;
231 REPORTER_ASSERT(r, 1 == integer->a());
232 REPORTER_ASSERT(r, 2 == integer->b());
233 REPORTER_ASSERT(r, 3 == integer->c());
234 REPORTER_ASSERT(r, 4 == integer->d());
235 }
OLDNEW
« no previous file with comments | « src/core/SkSerializeDrawable.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698