1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "tools/debugger/JsonWriteBuffer.h"
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkFlattenable.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkJSONWriter.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "tools/debugger/DrawCommand.h"
15*c8dee2aaSAndroid Build Coastguard Worker
16*c8dee2aaSAndroid Build Coastguard Worker class SkImage;
17*c8dee2aaSAndroid Build Coastguard Worker class SkMatrix;
18*c8dee2aaSAndroid Build Coastguard Worker class SkPaint;
19*c8dee2aaSAndroid Build Coastguard Worker class SkRegion;
20*c8dee2aaSAndroid Build Coastguard Worker class SkStream;
21*c8dee2aaSAndroid Build Coastguard Worker class SkTypeface;
22*c8dee2aaSAndroid Build Coastguard Worker struct SkIRect;
23*c8dee2aaSAndroid Build Coastguard Worker struct SkPoint3;
24*c8dee2aaSAndroid Build Coastguard Worker struct SkRect;
25*c8dee2aaSAndroid Build Coastguard Worker
append(const char * type)26*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::append(const char* type) {
27*c8dee2aaSAndroid Build Coastguard Worker SkString fullName = SkStringPrintf("%02d_%s", fCount++, type);
28*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendName(fullName.c_str());
29*c8dee2aaSAndroid Build Coastguard Worker }
30*c8dee2aaSAndroid Build Coastguard Worker
writePad32(const void * data,size_t size)31*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writePad32(const void* data, size_t size) {
32*c8dee2aaSAndroid Build Coastguard Worker this->append("rawBytes");
33*c8dee2aaSAndroid Build Coastguard Worker fWriter->beginArray();
34*c8dee2aaSAndroid Build Coastguard Worker const uint8_t* bytes = reinterpret_cast<const uint8_t*>(data);
35*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < size; ++i) {
36*c8dee2aaSAndroid Build Coastguard Worker SkString hexByte = SkStringPrintf("%02x", bytes[i]);
37*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendString(hexByte);
38*c8dee2aaSAndroid Build Coastguard Worker }
39*c8dee2aaSAndroid Build Coastguard Worker fWriter->endArray();
40*c8dee2aaSAndroid Build Coastguard Worker }
41*c8dee2aaSAndroid Build Coastguard Worker
writeByteArray(const void * data,size_t size)42*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeByteArray(const void* data, size_t size) {
43*c8dee2aaSAndroid Build Coastguard Worker this->append("byteArray");
44*c8dee2aaSAndroid Build Coastguard Worker fWriter->beginArray();
45*c8dee2aaSAndroid Build Coastguard Worker const uint8_t* bytes = reinterpret_cast<const uint8_t*>(data);
46*c8dee2aaSAndroid Build Coastguard Worker for (size_t i = 0; i < size; ++i) {
47*c8dee2aaSAndroid Build Coastguard Worker SkString hexByte = SkStringPrintf("%02x", bytes[i]);
48*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendString(hexByte);
49*c8dee2aaSAndroid Build Coastguard Worker }
50*c8dee2aaSAndroid Build Coastguard Worker fWriter->endArray();
51*c8dee2aaSAndroid Build Coastguard Worker }
52*c8dee2aaSAndroid Build Coastguard Worker
writeBool(bool value)53*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeBool(bool value) {
54*c8dee2aaSAndroid Build Coastguard Worker this->append("bool");
55*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendBool(value);
56*c8dee2aaSAndroid Build Coastguard Worker }
57*c8dee2aaSAndroid Build Coastguard Worker
writeScalar(SkScalar value)58*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeScalar(SkScalar value) {
59*c8dee2aaSAndroid Build Coastguard Worker this->append("scalar");
60*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendFloat(value);
61*c8dee2aaSAndroid Build Coastguard Worker }
62*c8dee2aaSAndroid Build Coastguard Worker
writeScalarArray(const SkScalar * value,uint32_t count)63*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeScalarArray(const SkScalar* value, uint32_t count) {
64*c8dee2aaSAndroid Build Coastguard Worker this->append("scalarArray");
65*c8dee2aaSAndroid Build Coastguard Worker fWriter->beginArray();
66*c8dee2aaSAndroid Build Coastguard Worker for (uint32_t i = 0; i < count; ++i) {
67*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendFloat(value[i]);
68*c8dee2aaSAndroid Build Coastguard Worker }
69*c8dee2aaSAndroid Build Coastguard Worker fWriter->endArray();
70*c8dee2aaSAndroid Build Coastguard Worker }
71*c8dee2aaSAndroid Build Coastguard Worker
writeInt(int32_t value)72*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeInt(int32_t value) {
73*c8dee2aaSAndroid Build Coastguard Worker this->append("int");
74*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendS32(value);
75*c8dee2aaSAndroid Build Coastguard Worker }
76*c8dee2aaSAndroid Build Coastguard Worker
writeIntArray(const int32_t * value,uint32_t count)77*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeIntArray(const int32_t* value, uint32_t count) {
78*c8dee2aaSAndroid Build Coastguard Worker this->append("intArray");
79*c8dee2aaSAndroid Build Coastguard Worker fWriter->beginArray();
80*c8dee2aaSAndroid Build Coastguard Worker for (uint32_t i = 0; i < count; ++i) {
81*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendS32(value[i]);
82*c8dee2aaSAndroid Build Coastguard Worker }
83*c8dee2aaSAndroid Build Coastguard Worker fWriter->endArray();
84*c8dee2aaSAndroid Build Coastguard Worker }
85*c8dee2aaSAndroid Build Coastguard Worker
writeUInt(uint32_t value)86*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeUInt(uint32_t value) {
87*c8dee2aaSAndroid Build Coastguard Worker this->append("uint");
88*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendU32(value);
89*c8dee2aaSAndroid Build Coastguard Worker }
90*c8dee2aaSAndroid Build Coastguard Worker
writeString(std::string_view value)91*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeString(std::string_view value) {
92*c8dee2aaSAndroid Build Coastguard Worker this->append("string");
93*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendString(value.data(), value.size());
94*c8dee2aaSAndroid Build Coastguard Worker }
95*c8dee2aaSAndroid Build Coastguard Worker
writeFlattenable(const SkFlattenable * flattenable)96*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeFlattenable(const SkFlattenable* flattenable) {
97*c8dee2aaSAndroid Build Coastguard Worker if (flattenable) {
98*c8dee2aaSAndroid Build Coastguard Worker this->append(flattenable->getTypeName());
99*c8dee2aaSAndroid Build Coastguard Worker fWriter->beginObject();
100*c8dee2aaSAndroid Build Coastguard Worker JsonWriteBuffer flattenableBuffer(fWriter, fUrlDataManager);
101*c8dee2aaSAndroid Build Coastguard Worker flattenable->flatten(flattenableBuffer);
102*c8dee2aaSAndroid Build Coastguard Worker fWriter->endObject();
103*c8dee2aaSAndroid Build Coastguard Worker } else {
104*c8dee2aaSAndroid Build Coastguard Worker this->append("flattenable");
105*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendPointer(nullptr);
106*c8dee2aaSAndroid Build Coastguard Worker }
107*c8dee2aaSAndroid Build Coastguard Worker }
108*c8dee2aaSAndroid Build Coastguard Worker
writeColor(SkColor color)109*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeColor(SkColor color) {
110*c8dee2aaSAndroid Build Coastguard Worker this->append("color");
111*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonColor(*fWriter, color);
112*c8dee2aaSAndroid Build Coastguard Worker }
113*c8dee2aaSAndroid Build Coastguard Worker
writeColorArray(const SkColor * color,uint32_t count)114*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeColorArray(const SkColor* color, uint32_t count) {
115*c8dee2aaSAndroid Build Coastguard Worker this->append("colorArray");
116*c8dee2aaSAndroid Build Coastguard Worker fWriter->beginArray();
117*c8dee2aaSAndroid Build Coastguard Worker for (uint32_t i = 0; i < count; ++i) {
118*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonColor(*fWriter, color[i]);
119*c8dee2aaSAndroid Build Coastguard Worker }
120*c8dee2aaSAndroid Build Coastguard Worker fWriter->endArray();
121*c8dee2aaSAndroid Build Coastguard Worker }
122*c8dee2aaSAndroid Build Coastguard Worker
writeColor4f(const SkColor4f & color)123*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeColor4f(const SkColor4f& color) {
124*c8dee2aaSAndroid Build Coastguard Worker this->append("color");
125*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonColor4f(*fWriter, color);
126*c8dee2aaSAndroid Build Coastguard Worker }
127*c8dee2aaSAndroid Build Coastguard Worker
writeColor4fArray(const SkColor4f * color,uint32_t count)128*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeColor4fArray(const SkColor4f* color, uint32_t count) {
129*c8dee2aaSAndroid Build Coastguard Worker this->append("colorArray");
130*c8dee2aaSAndroid Build Coastguard Worker fWriter->beginArray();
131*c8dee2aaSAndroid Build Coastguard Worker for (uint32_t i = 0; i < count; ++i) {
132*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonColor4f(*fWriter, color[i]);
133*c8dee2aaSAndroid Build Coastguard Worker }
134*c8dee2aaSAndroid Build Coastguard Worker fWriter->endArray();
135*c8dee2aaSAndroid Build Coastguard Worker }
136*c8dee2aaSAndroid Build Coastguard Worker
writePoint(const SkPoint & point)137*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writePoint(const SkPoint& point) {
138*c8dee2aaSAndroid Build Coastguard Worker this->append("point");
139*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonPoint(*fWriter, point);
140*c8dee2aaSAndroid Build Coastguard Worker }
141*c8dee2aaSAndroid Build Coastguard Worker
writePoint3(const SkPoint3 & point)142*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writePoint3(const SkPoint3& point) {
143*c8dee2aaSAndroid Build Coastguard Worker this->append("point3");
144*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonPoint3(*fWriter, point);
145*c8dee2aaSAndroid Build Coastguard Worker }
146*c8dee2aaSAndroid Build Coastguard Worker
writePointArray(const SkPoint * point,uint32_t count)147*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writePointArray(const SkPoint* point, uint32_t count) {
148*c8dee2aaSAndroid Build Coastguard Worker this->append("pointArray");
149*c8dee2aaSAndroid Build Coastguard Worker fWriter->beginArray();
150*c8dee2aaSAndroid Build Coastguard Worker for (uint32_t i = 0; i < count; ++i) {
151*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonPoint(*fWriter, point[i]);
152*c8dee2aaSAndroid Build Coastguard Worker }
153*c8dee2aaSAndroid Build Coastguard Worker fWriter->endArray();
154*c8dee2aaSAndroid Build Coastguard Worker }
155*c8dee2aaSAndroid Build Coastguard Worker
write(const SkM44 & matrix)156*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::write(const SkM44& matrix) {
157*c8dee2aaSAndroid Build Coastguard Worker this->append("matrix");
158*c8dee2aaSAndroid Build Coastguard Worker fWriter->beginArray();
159*c8dee2aaSAndroid Build Coastguard Worker for (int r = 0; r < 4; ++r) {
160*c8dee2aaSAndroid Build Coastguard Worker fWriter->beginArray(nullptr, false);
161*c8dee2aaSAndroid Build Coastguard Worker SkV4 v = matrix.row(r);
162*c8dee2aaSAndroid Build Coastguard Worker for (int c = 0; c < 4; ++c) {
163*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendFloat(v[c]);
164*c8dee2aaSAndroid Build Coastguard Worker }
165*c8dee2aaSAndroid Build Coastguard Worker fWriter->endArray();
166*c8dee2aaSAndroid Build Coastguard Worker }
167*c8dee2aaSAndroid Build Coastguard Worker fWriter->endArray();
168*c8dee2aaSAndroid Build Coastguard Worker }
169*c8dee2aaSAndroid Build Coastguard Worker
writeMatrix(const SkMatrix & matrix)170*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeMatrix(const SkMatrix& matrix) {
171*c8dee2aaSAndroid Build Coastguard Worker this->append("matrix");
172*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonMatrix(*fWriter, matrix);
173*c8dee2aaSAndroid Build Coastguard Worker }
174*c8dee2aaSAndroid Build Coastguard Worker
writeIRect(const SkIRect & rect)175*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeIRect(const SkIRect& rect) {
176*c8dee2aaSAndroid Build Coastguard Worker this->append("irect");
177*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonIRect(*fWriter, rect);
178*c8dee2aaSAndroid Build Coastguard Worker }
179*c8dee2aaSAndroid Build Coastguard Worker
writeRect(const SkRect & rect)180*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeRect(const SkRect& rect) {
181*c8dee2aaSAndroid Build Coastguard Worker this->append("rect");
182*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonRect(*fWriter, rect);
183*c8dee2aaSAndroid Build Coastguard Worker }
184*c8dee2aaSAndroid Build Coastguard Worker
writeRegion(const SkRegion & region)185*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeRegion(const SkRegion& region) {
186*c8dee2aaSAndroid Build Coastguard Worker this->append("region");
187*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonRegion(*fWriter, region);
188*c8dee2aaSAndroid Build Coastguard Worker }
189*c8dee2aaSAndroid Build Coastguard Worker
writePath(const SkPath & path)190*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writePath(const SkPath& path) {
191*c8dee2aaSAndroid Build Coastguard Worker this->append("path");
192*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonPath(*fWriter, path);
193*c8dee2aaSAndroid Build Coastguard Worker }
194*c8dee2aaSAndroid Build Coastguard Worker
writeSampling(const SkSamplingOptions & sampling)195*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeSampling(const SkSamplingOptions& sampling) {
196*c8dee2aaSAndroid Build Coastguard Worker this->append("sampling");
197*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonSampling(*fWriter, sampling);
198*c8dee2aaSAndroid Build Coastguard Worker }
199*c8dee2aaSAndroid Build Coastguard Worker
writeStream(SkStream * stream,size_t length)200*c8dee2aaSAndroid Build Coastguard Worker size_t JsonWriteBuffer::writeStream(SkStream* stream, size_t length) {
201*c8dee2aaSAndroid Build Coastguard Worker // Contents not supported
202*c8dee2aaSAndroid Build Coastguard Worker this->append("stream");
203*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendU64(static_cast<uint64_t>(length));
204*c8dee2aaSAndroid Build Coastguard Worker return 0;
205*c8dee2aaSAndroid Build Coastguard Worker }
206*c8dee2aaSAndroid Build Coastguard Worker
writeImage(const SkImage * image)207*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeImage(const SkImage* image) {
208*c8dee2aaSAndroid Build Coastguard Worker this->append("image");
209*c8dee2aaSAndroid Build Coastguard Worker fWriter->beginObject();
210*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::flatten(*image, *fWriter, *fUrlDataManager);
211*c8dee2aaSAndroid Build Coastguard Worker fWriter->endObject();
212*c8dee2aaSAndroid Build Coastguard Worker }
213*c8dee2aaSAndroid Build Coastguard Worker
writeTypeface(SkTypeface * typeface)214*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writeTypeface(SkTypeface* typeface) {
215*c8dee2aaSAndroid Build Coastguard Worker // Unsupported
216*c8dee2aaSAndroid Build Coastguard Worker this->append("typeface");
217*c8dee2aaSAndroid Build Coastguard Worker fWriter->appendPointer(typeface);
218*c8dee2aaSAndroid Build Coastguard Worker }
219*c8dee2aaSAndroid Build Coastguard Worker
writePaint(const SkPaint & paint)220*c8dee2aaSAndroid Build Coastguard Worker void JsonWriteBuffer::writePaint(const SkPaint& paint) {
221*c8dee2aaSAndroid Build Coastguard Worker this->append("paint");
222*c8dee2aaSAndroid Build Coastguard Worker DrawCommand::MakeJsonPaint(*fWriter, paint, *fUrlDataManager);
223*c8dee2aaSAndroid Build Coastguard Worker }
224