Chromium Code Reviews

Side by Side Diff: sky/engine/platform/graphics/LoggingCanvas.cpp

Issue 851503003: Update from https://crrev.com/311076 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
OLDNEW
(Empty)
1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
6 * met:
7 *
8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 * * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #include "sky/engine/config.h"
32 #include "sky/engine/platform/graphics/LoggingCanvas.h"
33
34 #include "platform/image-encoders/skia/PNGImageEncoder.h"
35 #include "sky/engine/wtf/HexNumber.h"
36 #include "sky/engine/wtf/text/Base64.h"
37 #include "sky/engine/wtf/text/TextEncoding.h"
38 #include "third_party/skia/include/core/SkPicture.h"
39
40 namespace blink {
41
42 class AutoLogger {
43 public:
44 explicit AutoLogger(LoggingCanvas*);
45 PassRefPtr<JSONObject> logItem(const String& name);
46 PassRefPtr<JSONObject> logItemWithParams(const String& name);
47 ~AutoLogger();
48
49 private:
50 LoggingCanvas* m_canvas;
51 RefPtr<JSONObject> m_logItem;
52 };
53
54 AutoLogger::AutoLogger(LoggingCanvas* loggingCanvas) : m_canvas(loggingCanvas)
55 {
56 loggingCanvas->m_depthCount++;
57 }
58
59 PassRefPtr<JSONObject> AutoLogger::logItem(const String& name)
60 {
61 RefPtr<JSONObject> item = JSONObject::create();
62 item->setString("method", name);
63 m_logItem = item;
64 return item.release();
65 }
66
67 PassRefPtr<JSONObject> AutoLogger::logItemWithParams(const String& name)
68 {
69 RefPtr<JSONObject> item = logItem(name);
70 RefPtr<JSONObject> params = JSONObject::create();
71 item->setObject("params", params);
72 return params.release();
73 }
74
75 AutoLogger::~AutoLogger()
76 {
77 m_canvas->m_depthCount--;
78 if (!m_canvas->m_depthCount)
79 m_canvas->m_log->pushObject(m_logItem);
80 }
81
82 LoggingCanvas::LoggingCanvas(int width, int height) : InterceptingCanvas(width, height)
83 {
84 m_log = JSONArray::create();
85 }
86
87 void LoggingCanvas::drawPaint(const SkPaint& paint)
88 {
89 AutoLogger logger(this);
90 logger.logItemWithParams("drawPaint")->setObject("paint", objectForSkPaint(p aint));
91 this->SkCanvas::drawPaint(paint);
92 }
93
94 void LoggingCanvas::drawPoints(PointMode mode, size_t count, const SkPoint pts[] , const SkPaint& paint)
95 {
96 AutoLogger logger(this);
97 RefPtr<JSONObject> params = logger.logItemWithParams("drawPoints");
98 params->setString("pointMode", pointModeName(mode));
99 params->setArray("points", arrayForSkPoints(count, pts));
100 params->setObject("paint", objectForSkPaint(paint));
101 this->SkCanvas::drawPoints(mode, count, pts, paint);
102 }
103
104 void LoggingCanvas::drawRect(const SkRect& rect, const SkPaint& paint)
105 {
106 AutoLogger logger(this);
107 RefPtr<JSONObject> params = logger.logItemWithParams("drawRect");
108 params->setObject("rect", objectForSkRect(rect));
109 params->setObject("paint", objectForSkPaint(paint));
110 this->SkCanvas::drawRect(rect, paint);
111 }
112
113 void LoggingCanvas::drawOval(const SkRect& oval, const SkPaint& paint)
114 {
115 AutoLogger logger(this);
116 RefPtr<JSONObject> params = logger.logItemWithParams("drawOval");
117 params->setObject("oval", objectForSkRect(oval));
118 params->setObject("paint", objectForSkPaint(paint));
119 this->SkCanvas::drawOval(oval, paint);
120 }
121
122 void LoggingCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint)
123 {
124 AutoLogger logger(this);
125 RefPtr<JSONObject> params = logger.logItemWithParams("drawRRect");
126 params->setObject("rrect", objectForSkRRect(rrect));
127 params->setObject("paint", objectForSkPaint(paint));
128 this->SkCanvas::drawRRect(rrect, paint);
129 }
130
131 void LoggingCanvas::drawPath(const SkPath& path, const SkPaint& paint)
132 {
133 AutoLogger logger(this);
134 RefPtr<JSONObject> params = logger.logItemWithParams("drawPath");
135 params->setObject("path", objectForSkPath(path));
136 params->setObject("paint", objectForSkPaint(paint));
137 this->SkCanvas::drawPath(path, paint);
138 }
139
140 void LoggingCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left, SkScalar t op, const SkPaint* paint)
141 {
142 AutoLogger logger(this);
143 RefPtr<JSONObject> params = logger.logItemWithParams("drawBitmap");
144 params->setNumber("left", left);
145 params->setNumber("top", top);
146 params->setObject("bitmap", objectForSkBitmap(bitmap));
147 params->setObject("paint", objectForSkPaint(*paint));
148 this->SkCanvas::drawBitmap(bitmap, left, top, paint);
149 }
150
151 void LoggingCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, const SkRect* s rc, const SkRect& dst, const SkPaint* paint, DrawBitmapRectFlags flags)
152 {
153 AutoLogger logger(this);
154 RefPtr<JSONObject> params = logger.logItemWithParams("drawBitmapRectToRect") ;
155 params->setObject("bitmap", objectForSkBitmap(bitmap));
156 params->setObject("src", objectForSkRect(*src));
157 params->setObject("dst", objectForSkRect(dst));
158 params->setObject("paint", objectForSkPaint(*paint));
159 params->setNumber("flags", flags);
160 this->SkCanvas::drawBitmapRectToRect(bitmap, src, dst, paint, flags);
161 }
162
163 void LoggingCanvas::drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center , const SkRect& dst, const SkPaint* paint)
164 {
165 AutoLogger logger(this);
166 RefPtr<JSONObject> params = logger.logItemWithParams("drawBitmapNine");
167 params->setObject("bitmap", objectForSkBitmap(bitmap));
168 params->setObject("center", objectForSkIRect(center));
169 params->setObject("dst", objectForSkRect(dst));
170 params->setObject("paint", objectForSkPaint(*paint));
171 this->SkCanvas::drawBitmapNine(bitmap, center, dst, paint);
172 }
173
174 void LoggingCanvas::drawSprite(const SkBitmap& bitmap, int left, int top, const SkPaint* paint)
175 {
176 AutoLogger logger(this);
177 RefPtr<JSONObject> params = logger.logItemWithParams("drawSprite");
178 params->setObject("bitmap", objectForSkBitmap(bitmap));
179 params->setNumber("left", left);
180 params->setNumber("top", top);
181 params->setObject("paint", objectForSkPaint(*paint));
182 this->SkCanvas::drawSprite(bitmap, left, top, paint);
183 }
184
185 void LoggingCanvas::drawVertices(VertexMode vmode, int vertexCount, const SkPoin t vertices[], const SkPoint texs[], const SkColor colors[], SkXfermode* xmode,
186 const uint16_t indices[], int indexCount, const SkPaint& paint)
187 {
188 AutoLogger logger(this);
189 RefPtr<JSONObject> params = logger.logItemWithParams("drawVertices");
190 params->setObject("paint", objectForSkPaint(paint));
191 this->SkCanvas::drawVertices(vmode, vertexCount, vertices, texs, colors, xmo de, indices, indexCount, paint);
192 }
193
194 void LoggingCanvas::drawData(const void* data, size_t length)
195 {
196 AutoLogger logger(this);
197 RefPtr<JSONObject> params = logger.logItemWithParams("drawData");
198 params->setNumber("length", length);
199 this->SkCanvas::drawData(data, length);
200 }
201
202 void LoggingCanvas::beginCommentGroup(const char* description)
203 {
204 AutoLogger logger(this);
205 RefPtr<JSONObject> params = logger.logItemWithParams("beginCommentGroup");
206 params->setString("description", description);
207 this->SkCanvas::beginCommentGroup(description);
208 }
209
210 void LoggingCanvas::addComment(const char* keyword, const char* value)
211 {
212 AutoLogger logger(this);
213 RefPtr<JSONObject> params = logger.logItemWithParams("addComment");
214 params->setString("key", keyword);
215 params->setString("value", value);
216 this->SkCanvas::addComment(keyword, value);
217 }
218
219 void LoggingCanvas::endCommentGroup()
220 {
221 AutoLogger logger(this);
222 logger.logItem("endCommentGroup");
223 this->SkCanvas::endCommentGroup();
224 }
225
226 void LoggingCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, con st SkPaint& paint)
227 {
228 AutoLogger logger(this);
229 RefPtr<JSONObject> params = logger.logItemWithParams("drawDRRect");
230 params->setObject("outer", objectForSkRRect(outer));
231 params->setObject("inner", objectForSkRRect(inner));
232 params->setObject("paint", objectForSkPaint(paint));
233 this->SkCanvas::onDrawDRRect(outer, inner, paint);
234 }
235
236 void LoggingCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, const SkPaint& paint)
237 {
238 AutoLogger logger(this);
239 RefPtr<JSONObject> params = logger.logItemWithParams("drawText");
240 params->setString("text", stringForText(text, byteLength, paint));
241 params->setNumber("x", x);
242 params->setNumber("y", y);
243 params->setObject("paint", objectForSkPaint(paint));
244 this->SkCanvas::onDrawText(text, byteLength, x, y, paint);
245 }
246
247 void LoggingCanvas::onDrawPosText(const void* text, size_t byteLength, const SkP oint pos[], const SkPaint& paint)
248 {
249 AutoLogger logger(this);
250 RefPtr<JSONObject> params = logger.logItemWithParams("drawPosText");
251 params->setString("text", stringForText(text, byteLength, paint));
252 size_t pointsCount = paint.countText(text, byteLength);
253 params->setArray("pos", arrayForSkPoints(pointsCount, pos));
254 params->setObject("paint", objectForSkPaint(paint));
255 this->SkCanvas::onDrawPosText(text, byteLength, pos, paint);
256 }
257
258 void LoggingCanvas::onDrawPosTextH(const void* text, size_t byteLength, const Sk Scalar xpos[], SkScalar constY, const SkPaint& paint)
259 {
260 AutoLogger logger(this);
261 RefPtr<JSONObject> params = logger.logItemWithParams("drawPosTextH");
262 params->setString("text", stringForText(text, byteLength, paint));
263 size_t pointsCount = paint.countText(text, byteLength);
264 params->setArray("xpos", arrayForSkScalars(pointsCount, xpos));
265 params->setNumber("constY", constY);
266 params->setObject("paint", objectForSkPaint(paint));
267 this->SkCanvas::onDrawPosTextH(text, byteLength, xpos, constY, paint);
268 }
269
270 void LoggingCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, const SkMatrix* matrix, const SkPaint& paint)
271 {
272 AutoLogger logger(this);
273 RefPtr<JSONObject> params = logger.logItemWithParams("drawTextOnPath");
274 params->setString("text", stringForText(text, byteLength, paint));
275 params->setObject("path", objectForSkPath(path));
276 params->setArray("matrix", arrayForSkMatrix(*matrix));
277 params->setObject("paint", objectForSkPaint(paint));
278 this->SkCanvas::onDrawTextOnPath(text, byteLength, path, matrix, paint);
279 }
280
281 void LoggingCanvas::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyl e style)
282 {
283 AutoLogger logger(this);
284 RefPtr<JSONObject> params = logger.logItemWithParams("clipRect");
285 params->setObject("rect", objectForSkRect(rect));
286 params->setString("SkRegion::Op", regionOpName(op));
287 params->setBoolean("softClipEdgeStyle", kSoft_ClipEdgeStyle == style);
288 this->SkCanvas::onClipRect(rect, op, style);
289 }
290
291 void LoggingCanvas::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeS tyle style)
292 {
293 AutoLogger logger(this);
294 RefPtr<JSONObject> params = logger.logItemWithParams("clipRRect");
295 params->setObject("rrect", objectForSkRRect(rrect));
296 params->setString("SkRegion::Op", regionOpName(op));
297 params->setBoolean("softClipEdgeStyle", kSoft_ClipEdgeStyle == style);
298 this->SkCanvas::onClipRRect(rrect, op, style);
299 }
300
301 void LoggingCanvas::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyl e style)
302 {
303 AutoLogger logger(this);
304 RefPtr<JSONObject> params = logger.logItemWithParams("clipPath");
305 params->setObject("path", objectForSkPath(path));
306 params->setString("SkRegion::Op", regionOpName(op));
307 params->setBoolean("softClipEdgeStyle", kSoft_ClipEdgeStyle == style);
308 this->SkCanvas::onClipPath(path, op, style);
309 }
310
311 void LoggingCanvas::onClipRegion(const SkRegion& region, SkRegion::Op op)
312 {
313 AutoLogger logger(this);
314 RefPtr<JSONObject> params = logger.logItemWithParams("clipRegion");
315 params->setString("op", regionOpName(op));
316 this->SkCanvas::onClipRegion(region, op);
317 }
318
319 void LoggingCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matr ix, const SkPaint* paint)
320 {
321 AutoLogger logger(this);
322 logger.logItemWithParams("drawPicture")->setObject("picture", objectForSkPic ture(*picture));
323 this->SkCanvas::onDrawPicture(picture, matrix, paint);
324 }
325
326 void LoggingCanvas::didSetMatrix(const SkMatrix& matrix)
327 {
328 AutoLogger logger(this);
329 RefPtr<JSONObject> params = logger.logItemWithParams("setMatrix");
330 params->setArray("matrix", arrayForSkMatrix(matrix));
331 this->SkCanvas::didSetMatrix(matrix);
332 }
333
334 void LoggingCanvas::didConcat(const SkMatrix& matrix)
335 {
336 AutoLogger logger(this);
337 RefPtr<JSONObject> params;
338
339 switch (matrix.getType()) {
340 case SkMatrix::kTranslate_Mask:
341 params = logger.logItemWithParams("translate");
342 params->setNumber("dx", matrix.getTranslateX());
343 params->setNumber("dy", matrix.getTranslateY());
344 break;
345
346 case SkMatrix::kScale_Mask:
347 params = logger.logItemWithParams("scale");
348 params->setNumber("scaleX", matrix.getScaleX());
349 params->setNumber("scaleY", matrix.getScaleY());
350 break;
351
352 default:
353 params = logger.logItemWithParams("concat");
354 params->setArray("matrix", arrayForSkMatrix(matrix));
355 }
356 this->SkCanvas::didConcat(matrix);
357 }
358
359 void LoggingCanvas::willSave()
360 {
361 AutoLogger logger(this);
362 RefPtr<JSONObject> params = logger.logItem("save");
363 this->SkCanvas::willSave();
364 }
365
366 SkCanvas::SaveLayerStrategy LoggingCanvas::willSaveLayer(const SkRect* bounds, c onst SkPaint* paint, SaveFlags flags)
367 {
368 AutoLogger logger(this);
369 RefPtr<JSONObject> params = logger.logItemWithParams("saveLayer");
370 if (bounds)
371 params->setObject("bounds", objectForSkRect(*bounds));
372 params->setObject("paint", objectForSkPaint(*paint));
373 params->setString("saveFlags", saveFlagsToString(flags));
374 return this->SkCanvas::willSaveLayer(bounds, paint, flags);
375 }
376
377 void LoggingCanvas::willRestore()
378 {
379 AutoLogger logger(this);
380 logger.logItem("restore");
381 this->SkCanvas::willRestore();
382 }
383
384 PassRefPtr<JSONArray> LoggingCanvas::log()
385 {
386 return m_log;
387 }
388
389 PassRefPtr<JSONObject> LoggingCanvas::objectForSkRect(const SkRect& rect)
390 {
391 RefPtr<JSONObject> rectItem = JSONObject::create();
392 rectItem->setNumber("left", rect.left());
393 rectItem->setNumber("top", rect.top());
394 rectItem->setNumber("right", rect.right());
395 rectItem->setNumber("bottom", rect.bottom());
396 return rectItem.release();
397 }
398
399 PassRefPtr<JSONObject> LoggingCanvas::objectForSkIRect(const SkIRect& rect)
400 {
401 RefPtr<JSONObject> rectItem = JSONObject::create();
402 rectItem->setNumber("left", rect.left());
403 rectItem->setNumber("top", rect.top());
404 rectItem->setNumber("right", rect.right());
405 rectItem->setNumber("bottom", rect.bottom());
406 return rectItem.release();
407 }
408
409 String LoggingCanvas::pointModeName(PointMode mode)
410 {
411 switch (mode) {
412 case SkCanvas::kPoints_PointMode: return "Points";
413 case SkCanvas::kLines_PointMode: return "Lines";
414 case SkCanvas::kPolygon_PointMode: return "Polygon";
415 default:
416 ASSERT_NOT_REACHED();
417 return "?";
418 };
419 }
420
421 PassRefPtr<JSONObject> LoggingCanvas::objectForSkPoint(const SkPoint& point)
422 {
423 RefPtr<JSONObject> pointItem = JSONObject::create();
424 pointItem->setNumber("x", point.x());
425 pointItem->setNumber("y", point.y());
426 return pointItem.release();
427 }
428
429 PassRefPtr<JSONArray> LoggingCanvas::arrayForSkPoints(size_t count, const SkPoin t points[])
430 {
431 RefPtr<JSONArray> pointsArrayItem = JSONArray::create();
432 for (size_t i = 0; i < count; ++i)
433 pointsArrayItem->pushObject(objectForSkPoint(points[i]));
434 return pointsArrayItem.release();
435 }
436
437 PassRefPtr<JSONObject> LoggingCanvas::objectForSkPicture(const SkPicture& pictur e)
438 {
439 const SkIRect bounds = picture.cullRect().roundOut();
440 RefPtr<JSONObject> pictureItem = JSONObject::create();
441 pictureItem->setNumber("width", bounds.width());
442 pictureItem->setNumber("height", bounds.height());
443 return pictureItem.release();
444 }
445
446 PassRefPtr<JSONObject> LoggingCanvas::objectForRadius(const SkRRect& rrect, SkRR ect::Corner corner)
447 {
448 RefPtr<JSONObject> radiusItem = JSONObject::create();
449 SkVector radius = rrect.radii(corner);
450 radiusItem->setNumber("xRadius", radius.x());
451 radiusItem->setNumber("yRadius", radius.y());
452 return radiusItem.release();
453 }
454
455 String LoggingCanvas::rrectTypeName(SkRRect::Type type)
456 {
457 switch (type) {
458 case SkRRect::kEmpty_Type: return "Empty";
459 case SkRRect::kRect_Type: return "Rect";
460 case SkRRect::kOval_Type: return "Oval";
461 case SkRRect::kSimple_Type: return "Simple";
462 case SkRRect::kNinePatch_Type: return "Nine-patch";
463 case SkRRect::kComplex_Type: return "Complex";
464 default:
465 ASSERT_NOT_REACHED();
466 return "?";
467 };
468 }
469
470 String LoggingCanvas::radiusName(SkRRect::Corner corner)
471 {
472 switch (corner) {
473 case SkRRect::kUpperLeft_Corner: return "upperLeftRadius";
474 case SkRRect::kUpperRight_Corner: return "upperRightRadius";
475 case SkRRect::kLowerRight_Corner: return "lowerRightRadius";
476 case SkRRect::kLowerLeft_Corner: return "lowerLeftRadius";
477 default:
478 ASSERT_NOT_REACHED();
479 return "?";
480 }
481 }
482
483 PassRefPtr<JSONObject> LoggingCanvas::objectForSkRRect(const SkRRect& rrect)
484 {
485 RefPtr<JSONObject> rrectItem = JSONObject::create();
486 rrectItem->setString("type", rrectTypeName(rrect.type()));
487 rrectItem->setNumber("left", rrect.rect().left());
488 rrectItem->setNumber("top", rrect.rect().top());
489 rrectItem->setNumber("right", rrect.rect().right());
490 rrectItem->setNumber("bottom", rrect.rect().bottom());
491 for (int i = 0; i < 4; ++i)
492 rrectItem->setObject(radiusName((SkRRect::Corner) i), objectForRadius(rr ect, (SkRRect::Corner) i));
493 return rrectItem.release();
494 }
495
496 String LoggingCanvas::fillTypeName(SkPath::FillType type)
497 {
498 switch (type) {
499 case SkPath::kWinding_FillType: return "Winding";
500 case SkPath::kEvenOdd_FillType: return "EvenOdd";
501 case SkPath::kInverseWinding_FillType: return "InverseWinding";
502 case SkPath::kInverseEvenOdd_FillType: return "InverseEvenOdd";
503 default:
504 ASSERT_NOT_REACHED();
505 return "?";
506 };
507 }
508
509 String LoggingCanvas::convexityName(SkPath::Convexity convexity)
510 {
511 switch (convexity) {
512 case SkPath::kUnknown_Convexity: return "Unknown";
513 case SkPath::kConvex_Convexity: return "Convex";
514 case SkPath::kConcave_Convexity: return "Concave";
515 default:
516 ASSERT_NOT_REACHED();
517 return "?";
518 };
519 }
520
521 String LoggingCanvas::verbName(SkPath::Verb verb)
522 {
523 switch (verb) {
524 case SkPath::kMove_Verb: return "Move";
525 case SkPath::kLine_Verb: return "Line";
526 case SkPath::kQuad_Verb: return "Quad";
527 case SkPath::kConic_Verb: return "Conic";
528 case SkPath::kCubic_Verb: return "Cubic";
529 case SkPath::kClose_Verb: return "Close";
530 case SkPath::kDone_Verb: return "Done";
531 default:
532 ASSERT_NOT_REACHED();
533 return "?";
534 };
535 }
536
537 LoggingCanvas::VerbParams LoggingCanvas::segmentParams(SkPath::Verb verb)
538 {
539 switch (verb) {
540 case SkPath::kMove_Verb: return VerbParams("Move", 1, 0);
541 case SkPath::kLine_Verb: return VerbParams("Line", 1, 1);
542 case SkPath::kQuad_Verb: return VerbParams("Quad", 2, 1);
543 case SkPath::kConic_Verb: return VerbParams("Conic", 2, 1);
544 case SkPath::kCubic_Verb: return VerbParams("Cubic", 3, 1);
545 case SkPath::kClose_Verb: return VerbParams("Close", 0, 0);
546 case SkPath::kDone_Verb: return VerbParams("Done", 0, 0);
547 default:
548 ASSERT_NOT_REACHED();
549 return VerbParams("?", 0, 0);
550 };
551 }
552
553 PassRefPtr<JSONObject> LoggingCanvas::objectForSkPath(const SkPath& path)
554 {
555 RefPtr<JSONObject> pathItem = JSONObject::create();
556 pathItem->setString("fillType", fillTypeName(path.getFillType()));
557 pathItem->setString("convexity", convexityName(path.getConvexity()));
558 pathItem->setBoolean("isRect", path.isRect(0));
559 SkPath::Iter iter(path, false);
560 SkPoint points[4];
561 RefPtr<JSONArray> pathPointsArray = JSONArray::create();
562 for (SkPath::Verb verb = iter.next(points, false); verb != SkPath::kDone_Ver b; verb = iter.next(points, false)) {
563 VerbParams verbParams = segmentParams(verb);
564 RefPtr<JSONObject> pathPointItem = JSONObject::create();
565 pathPointItem->setString("verb", verbParams.name);
566 ASSERT(verbParams.pointCount + verbParams.pointOffset <= WTF_ARRAY_LENGT H(points));
567 pathPointItem->setArray("points", arrayForSkPoints(verbParams.pointCount , points + verbParams.pointOffset));
568 if (SkPath::kConic_Verb == verb)
569 pathPointItem->setNumber("conicWeight", iter.conicWeight());
570 pathPointsArray->pushObject(pathPointItem);
571 }
572 pathItem->setArray("pathPoints", pathPointsArray);
573 pathItem->setObject("bounds", objectForSkRect(path.getBounds()));
574 return pathItem.release();
575 }
576
577 String LoggingCanvas::colorTypeName(SkColorType colorType)
578 {
579 switch (colorType) {
580 case kUnknown_SkColorType: return "None";
581 case kAlpha_8_SkColorType: return "A8";
582 case kIndex_8_SkColorType: return "Index8";
583 case kRGB_565_SkColorType: return "RGB565";
584 case kARGB_4444_SkColorType: return "ARGB4444";
585 case kN32_SkColorType: return "ARGB8888";
586 default:
587 ASSERT_NOT_REACHED();
588 return "?";
589 };
590 }
591
592 PassRefPtr<JSONObject> LoggingCanvas::objectForBitmapData(const SkBitmap& bitmap )
593 {
594 RefPtr<JSONObject> dataItem = JSONObject::create();
595 Vector<unsigned char> output;
596 PNGImageEncoder::encode(bitmap, &output);
597 dataItem->setString("base64", WTF::base64Encode(reinterpret_cast<char*>(outp ut.data()), output.size()));
598 dataItem->setString("mimeType", "image/png");
599 return dataItem.release();
600 }
601
602 PassRefPtr<JSONObject> LoggingCanvas::objectForSkBitmap(const SkBitmap& bitmap)
603 {
604 RefPtr<JSONObject> bitmapItem = JSONObject::create();
605 bitmapItem->setNumber("width", bitmap.width());
606 bitmapItem->setNumber("height", bitmap.height());
607 bitmapItem->setString("config", colorTypeName(bitmap.colorType()));
608 bitmapItem->setBoolean("opaque", bitmap.isOpaque());
609 bitmapItem->setBoolean("immutable", bitmap.isImmutable());
610 bitmapItem->setBoolean("volatile", bitmap.isVolatile());
611 bitmapItem->setNumber("genID", bitmap.getGenerationID());
612 bitmapItem->setObject("data", objectForBitmapData(bitmap));
613 return bitmapItem.release();
614 }
615
616 PassRefPtr<JSONObject> LoggingCanvas::objectForSkShader(const SkShader& shader)
617 {
618 RefPtr<JSONObject> shaderItem = JSONObject::create();
619 const SkMatrix localMatrix = shader.getLocalMatrix();
620 if (!localMatrix.isIdentity())
621 shaderItem->setArray("localMatrix", arrayForSkMatrix(localMatrix));
622 return shaderItem.release();
623 }
624
625 String LoggingCanvas::stringForSkColor(const SkColor& color)
626 {
627 String colorString = "#";
628 appendUnsignedAsHex(color, colorString);
629 return colorString;
630 }
631
632 void LoggingCanvas::appendFlagToString(String* flagsString, bool isSet, const St ring& name)
633 {
634 if (!isSet)
635 return;
636 if (flagsString->length())
637 flagsString->append("|");
638 flagsString->append(name);
639 }
640
641 String LoggingCanvas::stringForSkPaintFlags(const SkPaint& paint)
642 {
643 if (!paint.getFlags())
644 return "none";
645 String flagsString = "";
646 appendFlagToString(&flagsString, paint.isAntiAlias(), "AntiAlias");
647 appendFlagToString(&flagsString, paint.isDither(), "Dither");
648 appendFlagToString(&flagsString, paint.isUnderlineText(), "UnderlinText");
649 appendFlagToString(&flagsString, paint.isStrikeThruText(), "StrikeThruText") ;
650 appendFlagToString(&flagsString, paint.isFakeBoldText(), "FakeBoldText");
651 appendFlagToString(&flagsString, paint.isLinearText(), "LinearText");
652 appendFlagToString(&flagsString, paint.isSubpixelText(), "SubpixelText");
653 appendFlagToString(&flagsString, paint.isDevKernText(), "DevKernText");
654 appendFlagToString(&flagsString, paint.isLCDRenderText(), "LCDRenderText");
655 appendFlagToString(&flagsString, paint.isEmbeddedBitmapText(), "EmbeddedBitm apText");
656 appendFlagToString(&flagsString, paint.isAutohinted(), "Autohinted");
657 appendFlagToString(&flagsString, paint.isVerticalText(), "VerticalText");
658 appendFlagToString(&flagsString, paint.getFlags() & SkPaint::kGenA8FromLCD_F lag, "GenA8FromLCD");
659 return flagsString;
660 }
661
662 String LoggingCanvas::filterLevelName(SkPaint::FilterLevel filterLevel)
663 {
664 switch (filterLevel) {
665 case SkPaint::kNone_FilterLevel: return "None";
666 case SkPaint::kLow_FilterLevel: return "Low";
667 case SkPaint::kMedium_FilterLevel: return "Medium";
668 case SkPaint::kHigh_FilterLevel: return "High";
669 default:
670 ASSERT_NOT_REACHED();
671 return "?";
672 };
673 }
674
675 String LoggingCanvas::textAlignName(SkPaint::Align align)
676 {
677 switch (align) {
678 case SkPaint::kLeft_Align: return "Left";
679 case SkPaint::kCenter_Align: return "Center";
680 case SkPaint::kRight_Align: return "Right";
681 default:
682 ASSERT_NOT_REACHED();
683 return "?";
684 };
685 }
686
687 String LoggingCanvas::strokeCapName(SkPaint::Cap cap)
688 {
689 switch (cap) {
690 case SkPaint::kButt_Cap: return "Butt";
691 case SkPaint::kRound_Cap: return "Round";
692 case SkPaint::kSquare_Cap: return "Square";
693 default:
694 ASSERT_NOT_REACHED();
695 return "?";
696 };
697 }
698
699 String LoggingCanvas::strokeJoinName(SkPaint::Join join)
700 {
701 switch (join) {
702 case SkPaint::kMiter_Join: return "Miter";
703 case SkPaint::kRound_Join: return "Round";
704 case SkPaint::kBevel_Join: return "Bevel";
705 default:
706 ASSERT_NOT_REACHED();
707 return "?";
708 };
709 }
710
711 String LoggingCanvas::styleName(SkPaint::Style style)
712 {
713 switch (style) {
714 case SkPaint::kFill_Style: return "Fill";
715 case SkPaint::kStroke_Style: return "Stroke";
716 case SkPaint::kStrokeAndFill_Style: return "StrokeAndFill";
717 default:
718 ASSERT_NOT_REACHED();
719 return "?";
720 };
721 }
722
723 String LoggingCanvas::textEncodingName(SkPaint::TextEncoding encoding)
724 {
725 switch (encoding) {
726 case SkPaint::kUTF8_TextEncoding: return "UTF-8";
727 case SkPaint::kUTF16_TextEncoding: return "UTF-16";
728 case SkPaint::kUTF32_TextEncoding: return "UTF-32";
729 case SkPaint::kGlyphID_TextEncoding: return "GlyphID";
730 default:
731 ASSERT_NOT_REACHED();
732 return "?";
733 };
734 }
735
736 String LoggingCanvas::hintingName(SkPaint::Hinting hinting)
737 {
738 switch (hinting) {
739 case SkPaint::kNo_Hinting: return "None";
740 case SkPaint::kSlight_Hinting: return "Slight";
741 case SkPaint::kNormal_Hinting: return "Normal";
742 case SkPaint::kFull_Hinting: return "Full";
743 default:
744 ASSERT_NOT_REACHED();
745 return "?";
746 };
747 }
748
749 PassRefPtr<JSONObject> LoggingCanvas::objectForSkPaint(const SkPaint& paint)
750 {
751 RefPtr<JSONObject> paintItem = JSONObject::create();
752 paintItem->setNumber("textSize", paint.getTextSize());
753 paintItem->setNumber("textScaleX", paint.getTextScaleX());
754 paintItem->setNumber("textSkewX", paint.getTextSkewX());
755 if (SkShader* shader = paint.getShader())
756 paintItem->setObject("shader", objectForSkShader(*shader));
757 paintItem->setString("color", stringForSkColor(paint.getColor()));
758 paintItem->setNumber("strokeWidth", paint.getStrokeWidth());
759 paintItem->setNumber("strokeMiter", paint.getStrokeMiter());
760 paintItem->setString("flags", stringForSkPaintFlags(paint));
761 paintItem->setString("filterLevel", filterLevelName(paint.getFilterLevel())) ;
762 paintItem->setString("textAlign", textAlignName(paint.getTextAlign()));
763 paintItem->setString("strokeCap", strokeCapName(paint.getStrokeCap()));
764 paintItem->setString("strokeJoin", strokeJoinName(paint.getStrokeJoin()));
765 paintItem->setString("styleName", styleName(paint.getStyle()));
766 paintItem->setString("textEncoding", textEncodingName(paint.getTextEncoding( )));
767 paintItem->setString("hinting", hintingName(paint.getHinting()));
768 return paintItem.release();
769 }
770
771 PassRefPtr<JSONArray> LoggingCanvas::arrayForSkMatrix(const SkMatrix& matrix)
772 {
773 RefPtr<JSONArray> matrixArray = JSONArray::create();
774 for (int i = 0; i < 9; ++i)
775 matrixArray->pushNumber(matrix[i]);
776 return matrixArray.release();
777 }
778
779 PassRefPtr<JSONArray> LoggingCanvas::arrayForSkScalars(size_t n, const SkScalar scalars[])
780 {
781 RefPtr<JSONArray> scalarsArray = JSONArray::create();
782 for (size_t i = 0; i < n; ++i)
783 scalarsArray->pushNumber(scalars[i]);
784 return scalarsArray.release();
785 }
786
787 String LoggingCanvas::regionOpName(SkRegion::Op op)
788 {
789 switch (op) {
790 case SkRegion::kDifference_Op: return "kDifference_Op";
791 case SkRegion::kIntersect_Op: return "kIntersect_Op";
792 case SkRegion::kUnion_Op: return "kUnion_Op";
793 case SkRegion::kXOR_Op: return "kXOR_Op";
794 case SkRegion::kReverseDifference_Op: return "kReverseDifference_Op";
795 case SkRegion::kReplace_Op: return "kReplace_Op";
796 default: return "Unknown type";
797 };
798 }
799
800 String LoggingCanvas::saveFlagsToString(SkCanvas::SaveFlags flags)
801 {
802 String flagsString = "";
803 if (flags & SkCanvas::kHasAlphaLayer_SaveFlag)
804 flagsString.append("kHasAlphaLayer_SaveFlag ");
805 if (flags & SkCanvas::kFullColorLayer_SaveFlag)
806 flagsString.append("kFullColorLayer_SaveFlag ");
807 if (flags & SkCanvas::kClipToLayer_SaveFlag)
808 flagsString.append("kClipToLayer_SaveFlag ");
809 return flagsString;
810 }
811
812 String LoggingCanvas::textEncodingCanonicalName(SkPaint::TextEncoding encoding)
813 {
814 String name = textEncodingName(encoding);
815 if (encoding == SkPaint::kUTF16_TextEncoding || encoding == SkPaint::kUTF32_ TextEncoding)
816 name.append("LE");
817 return name;
818 }
819
820 String LoggingCanvas::stringForUTFText(const void* text, size_t length, SkPaint: :TextEncoding encoding)
821 {
822 return WTF::TextEncoding(textEncodingCanonicalName(encoding)).decode((const char*)text, length);
823 }
824
825 String LoggingCanvas::stringForText(const void* text, size_t byteLength, const S kPaint& paint)
826 {
827 SkPaint::TextEncoding encoding = paint.getTextEncoding();
828 switch (encoding) {
829 case SkPaint::kUTF8_TextEncoding:
830 case SkPaint::kUTF16_TextEncoding:
831 case SkPaint::kUTF32_TextEncoding:
832 return stringForUTFText(text, byteLength, encoding);
833 case SkPaint::kGlyphID_TextEncoding: {
834 WTF::Vector<SkUnichar> dataVector(byteLength / 2);
835 SkUnichar* textData = dataVector.data();
836 paint.glyphsToUnichars(static_cast<const uint16_t*>(text), byteLength / 2, textData);
837 return WTF::UTF32LittleEndianEncoding().decode(reinterpret_cast<const ch ar*>(textData), byteLength * 2);
838 }
839 default:
840 ASSERT_NOT_REACHED();
841 return "?";
842 }
843 }
844
845 } // namespace blink
OLDNEW
« no previous file with comments | « sky/engine/platform/graphics/LoggingCanvas.h ('k') | sky/engine/platform/graphics/ProfilingCanvas.h » ('j') | no next file with comments »

Powered by Google App Engine