1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2014 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 "dm/DMJsonWriter.h"
9*c8dee2aaSAndroid Build Coastguard Worker
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkMutex.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkOSFile.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkJSON.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkJSONWriter.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkOSPath.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "tools/ProcStats.h"
19*c8dee2aaSAndroid Build Coastguard Worker
20*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private;
21*c8dee2aaSAndroid Build Coastguard Worker
22*c8dee2aaSAndroid Build Coastguard Worker namespace DM {
23*c8dee2aaSAndroid Build Coastguard Worker
24*c8dee2aaSAndroid Build Coastguard Worker TArray<JsonWriter::BitmapResult> gBitmapResults;
bitmap_result_mutex()25*c8dee2aaSAndroid Build Coastguard Worker static SkMutex& bitmap_result_mutex() {
26*c8dee2aaSAndroid Build Coastguard Worker static SkMutex& mutex = *(new SkMutex);
27*c8dee2aaSAndroid Build Coastguard Worker return mutex;
28*c8dee2aaSAndroid Build Coastguard Worker }
29*c8dee2aaSAndroid Build Coastguard Worker
30*c8dee2aaSAndroid Build Coastguard Worker
AddBitmapResult(const BitmapResult & result)31*c8dee2aaSAndroid Build Coastguard Worker void JsonWriter::AddBitmapResult(const BitmapResult& result) {
32*c8dee2aaSAndroid Build Coastguard Worker SkAutoMutexExclusive lock(bitmap_result_mutex());
33*c8dee2aaSAndroid Build Coastguard Worker gBitmapResults.push_back(result);
34*c8dee2aaSAndroid Build Coastguard Worker }
35*c8dee2aaSAndroid Build Coastguard Worker
DumpJson(const char * dir,CommandLineFlags::StringArray key,CommandLineFlags::StringArray properties)36*c8dee2aaSAndroid Build Coastguard Worker void JsonWriter::DumpJson(const char* dir,
37*c8dee2aaSAndroid Build Coastguard Worker CommandLineFlags::StringArray key,
38*c8dee2aaSAndroid Build Coastguard Worker CommandLineFlags::StringArray properties) {
39*c8dee2aaSAndroid Build Coastguard Worker if (0 == strcmp(dir, "")) {
40*c8dee2aaSAndroid Build Coastguard Worker return;
41*c8dee2aaSAndroid Build Coastguard Worker }
42*c8dee2aaSAndroid Build Coastguard Worker
43*c8dee2aaSAndroid Build Coastguard Worker SkString path = SkOSPath::Join(dir, "dm.json");
44*c8dee2aaSAndroid Build Coastguard Worker sk_mkdir(dir);
45*c8dee2aaSAndroid Build Coastguard Worker SkFILEWStream stream(path.c_str());
46*c8dee2aaSAndroid Build Coastguard Worker SkJSONWriter writer(&stream, SkJSONWriter::Mode::kPretty);
47*c8dee2aaSAndroid Build Coastguard Worker
48*c8dee2aaSAndroid Build Coastguard Worker writer.beginObject(); // root
49*c8dee2aaSAndroid Build Coastguard Worker
50*c8dee2aaSAndroid Build Coastguard Worker for (int i = 1; i < properties.size(); i += 2) {
51*c8dee2aaSAndroid Build Coastguard Worker writer.appendCString(properties[i-1], properties[i]);
52*c8dee2aaSAndroid Build Coastguard Worker }
53*c8dee2aaSAndroid Build Coastguard Worker
54*c8dee2aaSAndroid Build Coastguard Worker writer.beginObject("key");
55*c8dee2aaSAndroid Build Coastguard Worker for (int i = 1; i < key.size(); i += 2) {
56*c8dee2aaSAndroid Build Coastguard Worker writer.appendCString(key[i-1], key[i]);
57*c8dee2aaSAndroid Build Coastguard Worker }
58*c8dee2aaSAndroid Build Coastguard Worker writer.endObject();
59*c8dee2aaSAndroid Build Coastguard Worker
60*c8dee2aaSAndroid Build Coastguard Worker int maxResidentSetSizeMB = sk_tools::getMaxResidentSetSizeMB();
61*c8dee2aaSAndroid Build Coastguard Worker if (maxResidentSetSizeMB != -1) {
62*c8dee2aaSAndroid Build Coastguard Worker writer.appendS32("max_rss_MB", maxResidentSetSizeMB);
63*c8dee2aaSAndroid Build Coastguard Worker }
64*c8dee2aaSAndroid Build Coastguard Worker
65*c8dee2aaSAndroid Build Coastguard Worker {
66*c8dee2aaSAndroid Build Coastguard Worker SkAutoMutexExclusive lock(bitmap_result_mutex());
67*c8dee2aaSAndroid Build Coastguard Worker writer.beginArray("results");
68*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < gBitmapResults.size(); i++) {
69*c8dee2aaSAndroid Build Coastguard Worker writer.beginObject();
70*c8dee2aaSAndroid Build Coastguard Worker
71*c8dee2aaSAndroid Build Coastguard Worker writer.beginObject("key");
72*c8dee2aaSAndroid Build Coastguard Worker writer.appendString("name" , gBitmapResults[i].name);
73*c8dee2aaSAndroid Build Coastguard Worker writer.appendString("config" , gBitmapResults[i].config);
74*c8dee2aaSAndroid Build Coastguard Worker writer.appendString("source_type", gBitmapResults[i].sourceType);
75*c8dee2aaSAndroid Build Coastguard Worker
76*c8dee2aaSAndroid Build Coastguard Worker // Source options only need to be part of the key if they exist.
77*c8dee2aaSAndroid Build Coastguard Worker // Source type by source type, we either always set options or never set options.
78*c8dee2aaSAndroid Build Coastguard Worker if (!gBitmapResults[i].sourceOptions.isEmpty()) {
79*c8dee2aaSAndroid Build Coastguard Worker writer.appendString("source_options", gBitmapResults[i].sourceOptions);
80*c8dee2aaSAndroid Build Coastguard Worker }
81*c8dee2aaSAndroid Build Coastguard Worker writer.endObject(); // key
82*c8dee2aaSAndroid Build Coastguard Worker
83*c8dee2aaSAndroid Build Coastguard Worker writer.beginObject("options");
84*c8dee2aaSAndroid Build Coastguard Worker writer.appendString("ext" , gBitmapResults[i].ext);
85*c8dee2aaSAndroid Build Coastguard Worker writer.appendString("gamut", gBitmapResults[i].gamut);
86*c8dee2aaSAndroid Build Coastguard Worker writer.appendString("transfer_fn", gBitmapResults[i].transferFn);
87*c8dee2aaSAndroid Build Coastguard Worker writer.appendString("color_type", gBitmapResults[i].colorType);
88*c8dee2aaSAndroid Build Coastguard Worker writer.appendString("alpha_type", gBitmapResults[i].alphaType);
89*c8dee2aaSAndroid Build Coastguard Worker writer.appendString("color_depth", gBitmapResults[i].colorDepth);
90*c8dee2aaSAndroid Build Coastguard Worker writer.endObject(); // options
91*c8dee2aaSAndroid Build Coastguard Worker
92*c8dee2aaSAndroid Build Coastguard Worker writer.appendString("md5", gBitmapResults[i].md5);
93*c8dee2aaSAndroid Build Coastguard Worker
94*c8dee2aaSAndroid Build Coastguard Worker writer.endObject(); // 1 result
95*c8dee2aaSAndroid Build Coastguard Worker }
96*c8dee2aaSAndroid Build Coastguard Worker writer.endArray(); // results
97*c8dee2aaSAndroid Build Coastguard Worker }
98*c8dee2aaSAndroid Build Coastguard Worker
99*c8dee2aaSAndroid Build Coastguard Worker writer.endObject(); // root
100*c8dee2aaSAndroid Build Coastguard Worker writer.flush();
101*c8dee2aaSAndroid Build Coastguard Worker stream.flush();
102*c8dee2aaSAndroid Build Coastguard Worker }
103*c8dee2aaSAndroid Build Coastguard Worker
104*c8dee2aaSAndroid Build Coastguard Worker using namespace skjson;
105*c8dee2aaSAndroid Build Coastguard Worker
ReadJson(const char * path,void (* callback)(BitmapResult))106*c8dee2aaSAndroid Build Coastguard Worker bool JsonWriter::ReadJson(const char* path, void(*callback)(BitmapResult)) {
107*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> json(SkData::MakeFromFileName(path));
108*c8dee2aaSAndroid Build Coastguard Worker if (!json) {
109*c8dee2aaSAndroid Build Coastguard Worker return false;
110*c8dee2aaSAndroid Build Coastguard Worker }
111*c8dee2aaSAndroid Build Coastguard Worker
112*c8dee2aaSAndroid Build Coastguard Worker DOM dom((const char*)json->data(), json->size());
113*c8dee2aaSAndroid Build Coastguard Worker const ObjectValue* root = dom.root();
114*c8dee2aaSAndroid Build Coastguard Worker if (!root) {
115*c8dee2aaSAndroid Build Coastguard Worker return false;
116*c8dee2aaSAndroid Build Coastguard Worker }
117*c8dee2aaSAndroid Build Coastguard Worker
118*c8dee2aaSAndroid Build Coastguard Worker const ArrayValue* results = (*root)["results"];
119*c8dee2aaSAndroid Build Coastguard Worker if (!results) {
120*c8dee2aaSAndroid Build Coastguard Worker return false;
121*c8dee2aaSAndroid Build Coastguard Worker }
122*c8dee2aaSAndroid Build Coastguard Worker
123*c8dee2aaSAndroid Build Coastguard Worker BitmapResult br;
124*c8dee2aaSAndroid Build Coastguard Worker for (const ObjectValue* r : *results) {
125*c8dee2aaSAndroid Build Coastguard Worker const ObjectValue& key = (*r)["key"].as<ObjectValue>();
126*c8dee2aaSAndroid Build Coastguard Worker const ObjectValue& options = (*r)["options"].as<ObjectValue>();
127*c8dee2aaSAndroid Build Coastguard Worker
128*c8dee2aaSAndroid Build Coastguard Worker br.name = key["name"].as<StringValue>().begin();
129*c8dee2aaSAndroid Build Coastguard Worker br.config = key["config"].as<StringValue>().begin();
130*c8dee2aaSAndroid Build Coastguard Worker br.sourceType = key["source_type"].as<StringValue>().begin();
131*c8dee2aaSAndroid Build Coastguard Worker br.ext = options["ext"].as<StringValue>().begin();
132*c8dee2aaSAndroid Build Coastguard Worker br.gamut = options["gamut"].as<StringValue>().begin();
133*c8dee2aaSAndroid Build Coastguard Worker br.transferFn = options["transfer_fn"].as<StringValue>().begin();
134*c8dee2aaSAndroid Build Coastguard Worker br.colorType = options["color_type"].as<StringValue>().begin();
135*c8dee2aaSAndroid Build Coastguard Worker br.alphaType = options["alpha_type"].as<StringValue>().begin();
136*c8dee2aaSAndroid Build Coastguard Worker br.colorDepth = options["color_depth"].as<StringValue>().begin();
137*c8dee2aaSAndroid Build Coastguard Worker br.md5 = (*r)["md5"].as<StringValue>().begin();
138*c8dee2aaSAndroid Build Coastguard Worker
139*c8dee2aaSAndroid Build Coastguard Worker if (const StringValue* so = key["source_options"]) {
140*c8dee2aaSAndroid Build Coastguard Worker br.sourceOptions = so->begin();
141*c8dee2aaSAndroid Build Coastguard Worker }
142*c8dee2aaSAndroid Build Coastguard Worker callback(br);
143*c8dee2aaSAndroid Build Coastguard Worker }
144*c8dee2aaSAndroid Build Coastguard Worker return true;
145*c8dee2aaSAndroid Build Coastguard Worker }
146*c8dee2aaSAndroid Build Coastguard Worker
147*c8dee2aaSAndroid Build Coastguard Worker } // namespace DM
148