1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/logging.h"
6 #include "base/strings/stringprintf.h"
7 #include "base/time/time.h"
8 #include "skia/ext/benchmarking_canvas.h"
9 #include "third_party/skia/include/core/SkColorFilter.h"
10 #include "third_party/skia/include/core/SkImageFilter.h"
11 #include "third_party/skia/include/core/SkPicture.h"
12 #include "third_party/skia/include/core/SkRegion.h"
13 #include "third_party/skia/include/core/SkTextBlob.h"
14 #include "third_party/skia/include/core/SkXfermode.h"
20 FlagsBuilder(char separator
)
21 : separator_(separator
) {}
23 void addFlag(bool flag_val
, const char flag_name
[]) {
26 if (!oss_
.str().empty())
32 std::string
str() const {
38 std::ostringstream oss_
;
42 scoped_ptr
<base::Value
> AsValue(bool b
) {
43 scoped_ptr
<base::FundamentalValue
> val(new base::FundamentalValue(b
));
49 scoped_ptr
<base::Value
> AsValue(SkScalar scalar
) {
50 scoped_ptr
<base::FundamentalValue
> val(new base::FundamentalValue(scalar
));
56 scoped_ptr
<base::Value
> AsValue(const SkSize
& size
) {
57 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
58 val
->Set("width", AsValue(size
.width()));
59 val
->Set("height", AsValue(size
.height()));
65 scoped_ptr
<base::Value
> AsValue(const SkPoint
& point
) {
66 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
67 val
->Set("x", AsValue(point
.x()));
68 val
->Set("y", AsValue(point
.y()));
74 scoped_ptr
<base::Value
> AsValue(const SkRect
& rect
) {
75 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
76 val
->Set("left", AsValue(rect
.fLeft
));
77 val
->Set("top", AsValue(rect
.fTop
));
78 val
->Set("right", AsValue(rect
.fRight
));
79 val
->Set("bottom", AsValue(rect
.fBottom
));
85 scoped_ptr
<base::Value
> AsValue(const SkRRect
& rrect
) {
86 scoped_ptr
<base::DictionaryValue
> radii_val(new base::DictionaryValue());
87 radii_val
->Set("upper-left", AsValue(rrect
.radii(SkRRect::kUpperLeft_Corner
)));
88 radii_val
->Set("upper-right", AsValue(rrect
.radii(SkRRect::kUpperRight_Corner
)));
89 radii_val
->Set("lower-right", AsValue(rrect
.radii(SkRRect::kLowerRight_Corner
)));
90 radii_val
->Set("lower-left", AsValue(rrect
.radii(SkRRect::kLowerLeft_Corner
)));
92 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
93 val
->Set("rect", AsValue(rrect
.rect()));
94 val
->Set("radii", radii_val
.Pass());
100 scoped_ptr
<base::Value
> AsValue(const SkMatrix
& matrix
) {
101 scoped_ptr
<base::ListValue
> val(new base::ListValue());
102 for (int i
= 0; i
< 9; ++i
)
103 val
->Append(AsValue(matrix
[i
]).release()); // no scoped_ptr-aware Append() variant
109 scoped_ptr
<base::Value
> AsValue(SkColor color
) {
110 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
111 val
->SetInteger("a", SkColorGetA(color
));
112 val
->SetInteger("r", SkColorGetR(color
));
113 val
->SetInteger("g", SkColorGetG(color
));
114 val
->SetInteger("b", SkColorGetB(color
));
120 scoped_ptr
<base::Value
> AsValue(SkXfermode::Mode mode
) {
121 scoped_ptr
<base::StringValue
> val(
122 new base::StringValue(SkXfermode::ModeName(mode
)));
128 scoped_ptr
<base::Value
> AsValue(SkCanvas::PointMode mode
) {
129 static const char* gModeStrings
[] = { "Points", "Lines", "Polygon" };
130 DCHECK_LT(static_cast<size_t>(mode
), SK_ARRAY_COUNT(gModeStrings
));
132 scoped_ptr
<base::StringValue
> val(new base::StringValue(gModeStrings
[mode
]));
138 scoped_ptr
<base::Value
> AsValue(const SkXfermode
& xfermode
) {
139 SkXfermode::Mode mode
;
140 if (xfermode
.asMode(&mode
))
141 return AsValue(mode
);
143 scoped_ptr
<base::StringValue
> val(new base::StringValue("unknown"));
148 scoped_ptr
<base::Value
> AsValue(const SkColorFilter
& filter
) {
149 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
151 if (unsigned flags
= filter
.getFlags()) {
152 FlagsBuilder
builder('|');
153 builder
.addFlag(flags
& SkColorFilter::kAlphaUnchanged_Flag
,
154 "kAlphaUnchanged_Flag");
155 builder
.addFlag(flags
& SkColorFilter::kHasFilter16_Flag
,
156 "kHasFilter16_Flag");
158 val
->SetString("flags", builder
.str());
161 SkScalar color_matrix
[20];
162 if (filter
.asColorMatrix(color_matrix
)) {
163 scoped_ptr
<base::ListValue
> color_matrix_val(new base::ListValue());
164 for (unsigned i
= 0; i
< 20; ++i
)
165 color_matrix_val
->Append(AsValue(color_matrix
[i
]).release());
167 val
->Set("color_matrix", color_matrix_val
.Pass());
171 SkXfermode::Mode mode
;
172 if (filter
.asColorMode(&color
, &mode
)) {
173 scoped_ptr
<base::DictionaryValue
> color_mode_val(
174 new base::DictionaryValue());
175 color_mode_val
->Set("color", AsValue(color
));
176 color_mode_val
->Set("mode", AsValue(mode
));
178 val
->Set("color_mode", color_mode_val
.Pass());
181 if (filter
.asComponentTable(nullptr)) {
182 scoped_ptr
<base::DictionaryValue
> component_table_val(
183 new base::DictionaryValue());
184 // use this as a marker for now
185 val
->Set("component_table", component_table_val
.Pass());
192 scoped_ptr
<base::Value
> AsValue(const SkImageFilter
& filter
) {
193 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
194 val
->SetInteger("inputs", filter
.countInputs());
196 SkColorFilter
* color_filter
;
197 if (filter
.asColorFilter(&color_filter
)) {
198 val
->Set("color_filter", AsValue(*color_filter
));
199 SkSafeUnref(color_filter
); // ref'd in asColorFilter
206 scoped_ptr
<base::Value
> AsValue(const SkPaint
& paint
) {
207 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
208 SkPaint default_paint
;
210 if (paint
.getColor() != default_paint
.getColor())
211 val
->Set("Color", AsValue(paint
.getColor()));
213 if (paint
.getStyle() != default_paint
.getStyle()) {
214 static const char* gStyleStrings
[] = { "Fill", "Stroke", "StrokeFill" };
215 DCHECK_LT(static_cast<size_t>(paint
.getStyle()),
216 SK_ARRAY_COUNT(gStyleStrings
));
217 val
->SetString("Style", gStyleStrings
[paint
.getStyle()]);
220 if (paint
.getXfermode() != default_paint
.getXfermode()) {
221 DCHECK(paint
.getXfermode());
222 val
->Set("Xfermode", AsValue(*paint
.getXfermode()));
225 if (paint
.getFlags()) {
226 FlagsBuilder
builder('|');
227 builder
.addFlag(paint
.isAntiAlias(), "AntiAlias");
228 builder
.addFlag(paint
.isDither(), "Dither");
229 builder
.addFlag(paint
.isUnderlineText(), "UnderlineText");
230 builder
.addFlag(paint
.isStrikeThruText(), "StrikeThruText");
231 builder
.addFlag(paint
.isFakeBoldText(), "FakeBoldText");
232 builder
.addFlag(paint
.isLinearText(), "LinearText");
233 builder
.addFlag(paint
.isSubpixelText(), "SubpixelText");
234 builder
.addFlag(paint
.isDevKernText(), "DevKernText");
235 builder
.addFlag(paint
.isLCDRenderText(), "LCDRenderText");
236 builder
.addFlag(paint
.isEmbeddedBitmapText(), "EmbeddedBitmapText");
237 builder
.addFlag(paint
.isAutohinted(), "Autohinted");
238 builder
.addFlag(paint
.isVerticalText(), "VerticalText");
239 builder
.addFlag(paint
.getFlags() & SkPaint::kGenA8FromLCD_Flag
,
242 val
->SetString("Flags", builder
.str());
245 if (paint
.getFilterLevel() != default_paint
.getFilterLevel()) {
246 static const char* gFilterLevelStrings
[] =
247 { "None", "Low", "Medium", "High" };
248 DCHECK_LT(static_cast<size_t>(paint
.getFilterLevel()),
249 SK_ARRAY_COUNT(gFilterLevelStrings
));
250 val
->SetString("FilterLevel", gFilterLevelStrings
[paint
.getFilterLevel()]);
253 if (paint
.getTextSize() != default_paint
.getTextSize())
254 val
->SetDouble("TextSize", paint
.getTextSize());
256 if (paint
.getTextScaleX() != default_paint
.getTextScaleX())
257 val
->SetDouble("TextScaleX", paint
.getTextScaleX());
259 if (paint
.getTextSkewX() != default_paint
.getTextSkewX())
260 val
->SetDouble("TextSkewX", paint
.getTextSkewX());
262 if (paint
.getColorFilter())
263 val
->Set("ColorFilter", AsValue(*paint
.getColorFilter()));
265 if (paint
.getImageFilter())
266 val
->Set("ImageFilter", AsValue(*paint
.getImageFilter()));
272 scoped_ptr
<base::Value
> AsValue(SkCanvas::SaveFlags flags
) {
273 FlagsBuilder
builder('|');
274 builder
.addFlag(flags
& SkCanvas::kHasAlphaLayer_SaveFlag
,
276 builder
.addFlag(flags
& SkCanvas::kFullColorLayer_SaveFlag
,
278 builder
.addFlag(flags
& SkCanvas::kClipToLayer_SaveFlag
,
281 scoped_ptr
<base::StringValue
> val(new base::StringValue(builder
.str()));
287 scoped_ptr
<base::Value
> AsValue(SkRegion::Op op
) {
288 static const char* gOpStrings
[] = { "Difference",
295 DCHECK_LT(static_cast<size_t>(op
), SK_ARRAY_COUNT(gOpStrings
));
296 scoped_ptr
<base::StringValue
> val(new base::StringValue(gOpStrings
[op
]));
301 scoped_ptr
<base::Value
> AsValue(const SkRegion
& region
) {
302 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
303 val
->Set("bounds", AsValue(SkRect::Make(region
.getBounds())));
309 scoped_ptr
<base::Value
> AsValue(const SkPicture
& picture
) {
310 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
311 val
->Set("cull-rect", AsValue(picture
.cullRect()));
317 scoped_ptr
<base::Value
> AsValue(const SkBitmap
& bitmap
) {
318 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
319 val
->Set("size", AsValue(SkSize::Make(bitmap
.width(), bitmap
.height())));
325 scoped_ptr
<base::Value
> AsValue(const SkImage
& image
) {
326 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
327 val
->Set("size", AsValue(SkSize::Make(image
.width(), image
.height())));
333 scoped_ptr
<base::Value
> AsValue(const SkTextBlob
& blob
) {
334 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
335 val
->Set("bounds", AsValue(blob
.bounds()));
341 scoped_ptr
<base::Value
> AsValue(const SkPath
& path
) {
342 scoped_ptr
<base::DictionaryValue
> val(new base::DictionaryValue());
344 static const char* gFillStrings
[] =
345 { "winding", "even-odd", "inverse-winding", "inverse-even-odd" };
346 DCHECK_LT(static_cast<size_t>(path
.getFillType()),
347 SK_ARRAY_COUNT(gFillStrings
));
348 val
->SetString("fill-type", gFillStrings
[path
.getFillType()]);
350 static const char* gConvexityStrings
[] = { "Unknown", "Convex", "Concave" };
351 DCHECK_LT(static_cast<size_t>(path
.getConvexity()),
352 SK_ARRAY_COUNT(gConvexityStrings
));
353 val
->SetString("convexity", gConvexityStrings
[path
.getConvexity()]);
355 val
->SetBoolean("is-rect", path
.isRect(nullptr));
356 val
->Set("bounds", AsValue(path
.getBounds()));
358 static const char* gVerbStrings
[] =
359 { "move", "line", "quad", "conic", "cubic", "close", "done" };
360 static const int gPtsPerVerb
[] = { 1, 1, 2, 2, 3, 0, 0 };
361 static const int gPtOffsetPerVerb
[] = { 0, 1, 1, 1, 1, 0, 0 };
363 SK_ARRAY_COUNT(gVerbStrings
) == static_cast<size_t>(SkPath::kDone_Verb
+ 1),
364 gVerbStrings_size_mismatch
);
366 SK_ARRAY_COUNT(gVerbStrings
) == SK_ARRAY_COUNT(gPtsPerVerb
),
367 gPtsPerVerb_size_mismatch
);
369 SK_ARRAY_COUNT(gVerbStrings
) == SK_ARRAY_COUNT(gPtOffsetPerVerb
),
370 gPtOffsetPerVerb_size_mismatch
);
372 scoped_ptr
<base::ListValue
> verbs_val(new base::ListValue());
373 SkPath::Iter
iter(const_cast<SkPath
&>(path
), false);
376 for(SkPath::Verb verb
= iter
.next(points
, false);
377 verb
!= SkPath::kDone_Verb
; verb
= iter
.next(points
, false)) {
378 DCHECK_LT(static_cast<size_t>(verb
), SK_ARRAY_COUNT(gVerbStrings
));
380 scoped_ptr
<base::DictionaryValue
> verb_val(new base::DictionaryValue());
381 scoped_ptr
<base::ListValue
> pts_val(new base::ListValue());
383 for (int i
= 0; i
< gPtsPerVerb
[verb
]; ++i
)
384 pts_val
->Append(AsValue(points
[i
+ gPtOffsetPerVerb
[verb
]]).release());
386 verb_val
->Set(gVerbStrings
[verb
], pts_val
.Pass());
388 if (SkPath::kConic_Verb
== verb
)
389 verb_val
->Set("weight", AsValue(iter
.conicWeight()));
391 verbs_val
->Append(verb_val
.release());
393 val
->Set("verbs", verbs_val
.Pass());
400 scoped_ptr
<base::Value
> AsListValue(const T array
[], size_t count
) {
401 scoped_ptr
<base::ListValue
> val(new base::ListValue());
403 for (size_t i
= 0; i
< count
; ++i
)
404 val
->Append(AsValue(array
[i
]).release());
413 class BenchmarkingCanvas::AutoOp
{
415 AutoOp(BenchmarkingCanvas
* canvas
, const char op_name
[],
416 const SkPaint
* paint
= nullptr)
418 , op_record_(new base::DictionaryValue())
419 , op_params_(new base::ListValue()) {
424 op_record_
->SetString("cmd_string", op_name
);
425 op_record_
->Set("info", op_params_
);
428 this->addParam("paint", AsValue(*paint
));
430 start_ticks_
= base::TimeTicks::Now();
434 base::TimeDelta ticks
= base::TimeTicks::Now() - start_ticks_
;
435 op_record_
->SetDouble("cmd_time", ticks
.InMillisecondsF());
437 canvas_
->op_records_
.Append(op_record_
);
440 void addParam(const char name
[], scoped_ptr
<base::Value
> value
) {
441 scoped_ptr
<base::DictionaryValue
> param(new base::DictionaryValue());
442 param
->Set(name
, value
.Pass());
444 op_params_
->Append(param
.release());
448 BenchmarkingCanvas
* canvas_
;
449 base::DictionaryValue
* op_record_
;
450 base::ListValue
* op_params_
;
451 base::TimeTicks start_ticks_
;
454 BenchmarkingCanvas::BenchmarkingCanvas(SkCanvas
* canvas
, unsigned flags
)
455 : INHERITED(canvas
->imageInfo().width(),
456 canvas
->imageInfo().height())
461 BenchmarkingCanvas::~BenchmarkingCanvas() {
464 size_t BenchmarkingCanvas::CommandCount() const {
465 return op_records_
.GetSize();
468 const base::ListValue
& BenchmarkingCanvas::Commands() const {
472 double BenchmarkingCanvas::GetTime(size_t index
) {
473 const base::DictionaryValue
* op
;
474 if (!op_records_
.GetDictionary(index
, &op
))
478 if (!op
->GetDouble("cmd_time", &t
))
484 void BenchmarkingCanvas::willSave() {
485 AutoOp
op(this, "Save");
487 INHERITED::willSave();
490 SkCanvas::SaveLayerStrategy
BenchmarkingCanvas::willSaveLayer(const SkRect
* rect
,
491 const SkPaint
* paint
,
493 AutoOp
op(this, "SaveLayer", paint
);
495 op
.addParam("bounds", AsValue(*rect
));
497 op
.addParam("paint", AsValue(*paint
));
499 op
.addParam("flags", AsValue(flags
));
501 return INHERITED::willSaveLayer(rect
, paint
, flags
);
504 void BenchmarkingCanvas::willRestore() {
505 AutoOp
op(this, "Restore");
507 INHERITED::willRestore();
510 void BenchmarkingCanvas::didConcat(const SkMatrix
& m
) {
511 AutoOp
op(this, "Concat");
512 op
.addParam("matrix", AsValue(m
));
514 INHERITED::didConcat(m
);
517 void BenchmarkingCanvas::didSetMatrix(const SkMatrix
& m
) {
518 AutoOp
op(this, "SetMatrix");
519 op
.addParam("matrix", AsValue(m
));
521 INHERITED::didSetMatrix(m
);
524 void BenchmarkingCanvas::onClipRect(const SkRect
& rect
,
525 SkRegion::Op region_op
,
526 SkCanvas::ClipEdgeStyle style
) {
527 AutoOp
op(this, "ClipRect");
528 op
.addParam("rect", AsValue(rect
));
529 op
.addParam("op", AsValue(region_op
));
530 op
.addParam("anti-alias", AsValue(style
== kSoft_ClipEdgeStyle
));
532 INHERITED::onClipRect(rect
, region_op
, style
);
535 void BenchmarkingCanvas::onClipRRect(const SkRRect
& rrect
,
536 SkRegion::Op region_op
,
537 SkCanvas::ClipEdgeStyle style
) {
538 AutoOp
op(this, "ClipRRect");
539 op
.addParam("rrect", AsValue(rrect
));
540 op
.addParam("op", AsValue(region_op
));
541 op
.addParam("anti-alias", AsValue(style
== kSoft_ClipEdgeStyle
));
543 INHERITED::onClipRRect(rrect
, region_op
, style
);
546 void BenchmarkingCanvas::onClipPath(const SkPath
& path
,
547 SkRegion::Op region_op
,
548 SkCanvas::ClipEdgeStyle style
) {
549 AutoOp
op(this, "ClipPath");
550 op
.addParam("path", AsValue(path
));
551 op
.addParam("op", AsValue(region_op
));
552 op
.addParam("anti-alias", AsValue(style
== kSoft_ClipEdgeStyle
));
554 INHERITED::onClipPath(path
, region_op
, style
);
557 void BenchmarkingCanvas::onClipRegion(const SkRegion
& region
,
558 SkRegion::Op region_op
) {
559 AutoOp
op(this, "ClipRegion");
560 op
.addParam("region", AsValue(region
));
561 op
.addParam("op", AsValue(region_op
));
563 INHERITED::onClipRegion(region
, region_op
);
566 void BenchmarkingCanvas::onDrawPaint(const SkPaint
& paint
) {
567 AutoOp
op(this, "DrawPaint", &paint
);
569 INHERITED::onDrawPaint(paint
);
572 void BenchmarkingCanvas::onDrawPoints(PointMode mode
, size_t count
,
573 const SkPoint pts
[], const SkPaint
& paint
) {
574 AutoOp
op(this, "DrawPoints", &paint
);
575 op
.addParam("mode", AsValue(mode
));
576 op
.addParam("points", AsListValue(pts
, count
));
578 INHERITED::onDrawPoints(mode
, count
, pts
, paint
);
581 void BenchmarkingCanvas::onDrawRect(const SkRect
& rect
, const SkPaint
& paint
) {
582 AutoOp
op(this, "DrawRect", &paint
);
583 op
.addParam("rect", AsValue(rect
));
585 INHERITED::onDrawRect(rect
, paint
);
588 void BenchmarkingCanvas::onDrawOval(const SkRect
& rect
, const SkPaint
& paint
) {
589 AutoOp
op(this, "DrawOval", &paint
);
590 op
.addParam("rect", AsValue(rect
));
592 INHERITED::onDrawOval(rect
, paint
);
595 void BenchmarkingCanvas::onDrawRRect(const SkRRect
& rrect
, const SkPaint
& paint
) {
596 AutoOp
op(this, "DrawRRect", &paint
);
597 op
.addParam("rrect", AsValue(rrect
));
599 INHERITED::onDrawRRect(rrect
, paint
);
602 void BenchmarkingCanvas::onDrawDRRect(const SkRRect
& outer
, const SkRRect
& inner
,
603 const SkPaint
& paint
) {
604 AutoOp
op(this, "DrawDRRect", &paint
);
605 op
.addParam("outer", AsValue(outer
));
606 op
.addParam("inner", AsValue(inner
));
608 INHERITED::onDrawDRRect(outer
, inner
, paint
);
611 void BenchmarkingCanvas::onDrawPath(const SkPath
& path
, const SkPaint
& paint
) {
612 AutoOp
op(this, "DrawPath", &paint
);
613 op
.addParam("path", AsValue(path
));
615 INHERITED::onDrawPath(path
, paint
);
618 void BenchmarkingCanvas::onDrawPicture(const SkPicture
* picture
,
619 const SkMatrix
* matrix
,
620 const SkPaint
* paint
) {
622 AutoOp
op(this, "DrawPicture", paint
);
623 op
.addParam("picture", AsValue(picture
));
625 op
.addParam("matrix", AsValue(*matrix
));
627 INHERITED::drawPicture(picture
, matrix
, paint
);
630 void BenchmarkingCanvas::onDrawBitmap(const SkBitmap
& bitmap
,
633 const SkPaint
* paint
) {
634 AutoOp
op(this, "DrawBitmap", paint
);
635 op
.addParam("bitmap", AsValue(bitmap
));
636 op
.addParam("left", AsValue(left
));
637 op
.addParam("top", AsValue(top
));
639 INHERITED::onDrawBitmap(bitmap
, left
, top
, paint
);
642 void BenchmarkingCanvas::onDrawBitmapRect(const SkBitmap
& bitmap
,
645 const SkPaint
* paint
,
646 DrawBitmapRectFlags flags
) {
647 AutoOp
op(this, "DrawBitmapRect", paint
);
648 op
.addParam("bitmap", AsValue(bitmap
));
650 op
.addParam("src", AsValue(*src
));
651 op
.addParam("dst", AsValue(dst
));
653 INHERITED::onDrawBitmapRect(bitmap
, src
, dst
, paint
, flags
);
656 void BenchmarkingCanvas::onDrawImage(const SkImage
* image
,
659 const SkPaint
* paint
) {
661 AutoOp
op(this, "DrawImage", paint
);
662 op
.addParam("image", AsValue(*image
));
663 op
.addParam("left", AsValue(left
));
664 op
.addParam("top", AsValue(top
));
666 INHERITED::onDrawImage(image
, left
, top
, paint
);
669 void BenchmarkingCanvas::onDrawImageRect(const SkImage
* image
, const SkRect
* src
,
670 const SkRect
& dst
, const SkPaint
* paint
) {
672 AutoOp
op(this, "DrawImageRect", paint
);
673 op
.addParam("image", AsValue(*image
));
675 op
.addParam("src", AsValue(*src
));
676 op
.addParam("dst", AsValue(dst
));
678 INHERITED::onDrawImageRect(image
, src
, dst
, paint
);
681 void BenchmarkingCanvas::onDrawBitmapNine(const SkBitmap
& bitmap
,
682 const SkIRect
& center
,
684 const SkPaint
* paint
) {
685 AutoOp
op(this, "DrawBitmapNine", paint
);
686 op
.addParam("bitmap", AsValue(bitmap
));
687 op
.addParam("center", AsValue(SkRect::Make(center
)));
688 op
.addParam("dst", AsValue(dst
));
690 INHERITED::onDrawBitmapNine(bitmap
, center
, dst
, paint
);
693 void BenchmarkingCanvas::onDrawSprite(const SkBitmap
& bitmap
, int left
, int top
,
694 const SkPaint
* paint
) {
695 AutoOp
op(this, "DrawSprite", paint
);
696 op
.addParam("bitmap", AsValue(bitmap
));
697 op
.addParam("left", AsValue(SkIntToScalar(left
)));
698 op
.addParam("top", AsValue(SkIntToScalar(top
)));
700 INHERITED::onDrawSprite(bitmap
, left
, top
, paint
);
703 void BenchmarkingCanvas::onDrawText(const void* text
, size_t byteLength
,
704 SkScalar x
, SkScalar y
,
705 const SkPaint
& paint
) {
706 AutoOp
op(this, "DrawText", &paint
);
707 op
.addParam("count", AsValue(SkIntToScalar(paint
.countText(text
, byteLength
))));
708 op
.addParam("x", AsValue(x
));
709 op
.addParam("y", AsValue(y
));
711 INHERITED::onDrawText(text
, byteLength
, x
, y
, paint
);
714 void BenchmarkingCanvas::onDrawPosText(const void* text
, size_t byteLength
,
715 const SkPoint pos
[], const SkPaint
& paint
) {
716 AutoOp
op(this, "DrawPosText", &paint
);
718 int count
= paint
.countText(text
, byteLength
);
719 op
.addParam("count", AsValue(SkIntToScalar(count
)));
720 op
.addParam("pos", AsListValue(pos
, count
));
722 INHERITED::onDrawPosText(text
, byteLength
, pos
, paint
);
725 void BenchmarkingCanvas::onDrawPosTextH(const void* text
, size_t byteLength
,
726 const SkScalar xpos
[], SkScalar constY
,
727 const SkPaint
& paint
) {
728 AutoOp
op(this, "DrawPosTextH", &paint
);
729 op
.addParam("constY", AsValue(constY
));
731 int count
= paint
.countText(text
, byteLength
);
732 op
.addParam("count", AsValue(SkIntToScalar(count
)));
733 op
.addParam("pos", AsListValue(xpos
, count
));
735 INHERITED::onDrawPosTextH(text
, byteLength
, xpos
, constY
, paint
);
738 void BenchmarkingCanvas::onDrawTextOnPath(const void* text
, size_t byteLength
,
739 const SkPath
& path
, const SkMatrix
* matrix
,
740 const SkPaint
& paint
) {
741 AutoOp
op(this, "DrawTextOnPath", &paint
);
742 op
.addParam("count", AsValue(SkIntToScalar(paint
.countText(text
, byteLength
))));
743 op
.addParam("path", AsValue(path
));
745 op
.addParam("matrix", AsValue(*matrix
));
747 INHERITED::onDrawTextOnPath(text
, byteLength
, path
, matrix
, paint
);
750 void BenchmarkingCanvas::onDrawTextBlob(const SkTextBlob
* blob
, SkScalar x
, SkScalar y
,
751 const SkPaint
& paint
) {
753 AutoOp
op(this, "DrawTextBlob", &paint
);
754 op
.addParam("blob", AsValue(*blob
));
755 op
.addParam("x", AsValue(x
));
756 op
.addParam("y", AsValue(y
));
758 INHERITED::onDrawTextBlob(blob
, x
, y
, paint
);