xref: /aosp_15_r20/external/skia/dm/DMJsonWriter.cpp (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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