OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrAuditTrail.h" | 8 #include "GrAuditTrail.h" |
9 #include "batches/GrBatch.h" | 9 #include "batches/GrBatch.h" |
10 | 10 |
11 const int GrAuditTrail::kInvalidID = -1; | |
12 | |
11 void GrAuditTrail::batchingResultCombined(GrBatch* combiner) { | 13 void GrAuditTrail::batchingResultCombined(GrBatch* combiner) { |
12 int* indexPtr = fIDLookup.find(combiner); | 14 int* indexPtr = fIDLookup.find(combiner); |
13 SkASSERT(indexPtr); | 15 SkASSERT(indexPtr); |
14 int index = *indexPtr; | 16 int index = *indexPtr; |
15 SkASSERT(index < fBatches.count()); | 17 SkASSERT(index < fBatchList.count()); |
16 Batch& batch = *fBatches[index]; | 18 BatchNode& batch = *fBatchList[index]; |
17 | 19 |
18 // if this is our first child, we also push back a copy of the original batc h and its | 20 // set the ids for the child batch |
19 // bounds | 21 fCurrentBatch->fBatchListID = index; |
20 if (batch.fChildren.empty()) { | 22 fCurrentBatch->fChildID = batch.fChildren.count(); |
21 Batch* firstBatch = new Batch; | 23 |
22 firstBatch->fName = batch.fName; | 24 // Update the bounds and store a pointer to the new batch |
23 firstBatch->fBounds = batch.fBounds; | |
24 fEvents.emplace_back(firstBatch); | |
25 batch.fChildren.push_back(firstBatch); | |
26 } | |
27 batch.fChildren.push_back(fCurrentBatch); | 25 batch.fChildren.push_back(fCurrentBatch); |
28 batch.fBounds = combiner->bounds(); | 26 batch.fBounds = combiner->bounds(); |
29 } | 27 } |
30 | 28 |
31 void GrAuditTrail::batchingResultNew(GrBatch* batch) { | 29 void GrAuditTrail::batchingResultNew(GrBatch* batch) { |
32 fIDLookup.set(batch, fBatches.count()); | 30 // Our algorithm doesn't bother to reorder inside of a BatchNode |
33 fBatches.push_back(fCurrentBatch); | 31 // so the ChildID will start at 0 |
32 fCurrentBatch->fBatchListID = fBatchList.count(); | |
33 fCurrentBatch->fChildID = 0; | |
34 | |
35 // We use the batch pointer as a key to find the batchnode we are 'glomming' batches onto | |
36 fIDLookup.set(batch, fCurrentBatch->fBatchListID); | |
37 BatchNode* batchNode = new BatchNode; | |
38 batchNode->fBounds = fCurrentBatch->fBounds; | |
39 batchNode->fChildren.push_back(fCurrentBatch); | |
40 fBatchList.emplace_back(batchNode); | |
34 } | 41 } |
35 | 42 |
36 template <typename T> | 43 template <typename T> |
37 void GrAuditTrail::JsonifyTArray(SkString* json, const char* name, const T& arra y, | 44 void GrAuditTrail::JsonifyTArray(SkString* json, const char* name, const T& arra y, |
38 bool addComma) { | 45 bool addComma) { |
39 if (array.count()) { | 46 if (array.count()) { |
40 if (addComma) { | 47 if (addComma) { |
41 json->appendf(","); | 48 json->appendf(","); |
42 } | 49 } |
43 json->appendf("\"%s\": [", name); | 50 json->appendf("\"%s\": [", name); |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
111 int fTabCount; | 118 int fTabCount; |
112 bool fFreshLine; | 119 bool fFreshLine; |
113 bool fCommaException; | 120 bool fCommaException; |
114 }; | 121 }; |
115 | 122 |
116 static SkString pretty_print_json(SkString json) { | 123 static SkString pretty_print_json(SkString json) { |
117 class PrettyPrintJson prettyPrintJson; | 124 class PrettyPrintJson prettyPrintJson; |
118 return prettyPrintJson.prettify(json); | 125 return prettyPrintJson.prettify(json); |
119 } | 126 } |
120 | 127 |
121 SkString GrAuditTrail::toJson(bool batchList, bool prettyPrint) const { | 128 SkString GrAuditTrail::toJson(bool prettyPrint) const { |
122 SkString json; | 129 SkString json; |
123 json.append("{"); | 130 json.append("{"); |
124 if (!batchList) { | 131 JsonifyTArray(&json, "Batches", fBatchList, false); |
125 JsonifyTArray(&json, "Stacks", fFrames, false); | |
126 } else { | |
127 JsonifyTArray(&json, "Batches", fBatches, false); | |
128 } | |
129 json.append("}"); | 132 json.append("}"); |
130 | 133 |
131 if (prettyPrint) { | 134 if (prettyPrint) { |
132 return pretty_print_json(json); | 135 return pretty_print_json(json); |
136 } else { | |
137 return json; | |
138 } | |
139 } | |
140 | |
141 SkString GrAuditTrail::toJson(int clientID, bool prettyPrint) const { | |
142 SkString json; | |
143 json.append("{"); | |
144 Batches** batches = fClientIDLookup.find(clientID); | |
145 if (batches) { | |
146 JsonifyTArray(&json, "Batches", **batches, false); | |
147 } | |
148 json.appendf("}"); | |
149 | |
150 if (prettyPrint) { | |
151 return pretty_print_json(json); | |
133 } else { | 152 } else { |
134 return json; | 153 return json; |
135 } | 154 } |
136 } | 155 } |
137 | 156 |
138 SkString GrAuditTrail::Frame::toJson() const { | 157 static void skrect_to_json(SkString* json, const char* name, const SkRect& rect) { |
139 SkString json; | 158 json->appendf("\"%s\": {", name); |
140 json.append("{"); | 159 json->appendf("\"Left\": %f,", rect.fLeft); |
ethannicholas
2016/02/26 20:55:32
I know it predates this change, but while we're at
joshualitt
2016/02/26 21:08:00
Can we do this as a follow on? I think we should f
| |
141 json.appendf("\"Name\": \"%s\"", fName); | 160 json->appendf("\"Right\": %f,", rect.fRight); |
142 JsonifyTArray(&json, "Frames", fChildren, true); | 161 json->appendf("\"Top\": %f,", rect.fTop); |
143 json.append("}"); | 162 json->appendf("\"Bottom\": %f", rect.fBottom); |
144 return json; | 163 json->append("}"); |
145 } | 164 } |
146 | 165 |
147 SkString GrAuditTrail::Batch::toJson() const { | 166 SkString GrAuditTrail::Batch::toJson() const { |
148 SkString json; | 167 SkString json; |
149 json.append("{"); | 168 json.append("{"); |
150 json.appendf("\"Name\": \"%s\",", fName); | 169 json.appendf("\"Name\": \"%s\",", fName.c_str()); |
151 json.append("\"Bounds\": {"); | 170 json.appendf("\"ClientID\": \"%d\",", fClientID); |
152 json.appendf("\"Left\": %f,", fBounds.fLeft); | 171 json.appendf("\"BatchListID\": \"%d\",", fBatchListID); |
153 json.appendf("\"Right\": %f,", fBounds.fRight); | 172 json.appendf("\"ChildID\": \"%d\",", fChildID); |
154 json.appendf("\"Top\": %f,", fBounds.fTop); | 173 skrect_to_json(&json, "Bounds", fBounds); |
155 json.appendf("\"Bottom\": %f", fBounds.fBottom); | |
156 JsonifyTArray(&json, "Children", fChildren, true); | |
157 json.append("}"); | |
158 json.append("}"); | 174 json.append("}"); |
159 return json; | 175 return json; |
160 } | 176 } |
177 | |
178 SkString GrAuditTrail::BatchNode::toJson() const { | |
179 SkString json; | |
180 json.append("{"); | |
181 skrect_to_json(&json, "Bounds", fBounds); | |
182 JsonifyTArray(&json, "Batches", fChildren, true); | |
183 json.append("}"); | |
184 return json; | |
185 } | |
OLD | NEW |