diff options
author | fmalita@google.com <fmalita@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-21 02:57:56 +0000 |
---|---|---|
committer | fmalita@google.com <fmalita@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-21 02:57:56 +0000 |
commit | 91d8aa9df9f97a36bb6441da44289bee6661714d (patch) | |
tree | ac88be1f2cb6115266e63e6381ba178eeeb81529 | |
parent | 5322973d577a1064bb32eb19bd01c6aa5e7c51a5 (diff) | |
download | chromium_src-91d8aa9df9f97a36bb6441da44289bee6661714d.zip chromium_src-91d8aa9df9f97a36bb6441da44289bee6661714d.tar.gz chromium_src-91d8aa9df9f97a36bb6441da44289bee6661714d.tar.bz2 |
Add skiaBenchmarking.getOps()
Given a JSON-encoded Picture, the new function returns an array of Skia draw commands + info.
Depends on https://codereview.chromium.org/16638014/.
R=nduca@chromium.org, piman@chromium.org, senorblanco@chromium.org
Review URL: https://codereview.chromium.org/15967010
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@207676 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | content/content_tests.gypi | 1 | ||||
-rw-r--r-- | content/renderer/skia_benchmarking_extension.cc | 85 | ||||
-rw-r--r-- | content/renderer/skia_benchmarking_extension_unittest.cc | 105 | ||||
-rw-r--r-- | skia/skia.gyp | 6 |
4 files changed, 181 insertions, 16 deletions
diff --git a/content/content_tests.gypi b/content/content_tests.gypi index 751ffa0..9e63719 100644 --- a/content/content_tests.gypi +++ b/content/content_tests.gypi @@ -408,6 +408,7 @@ 'renderer/media/video_capture_impl_unittest.cc', 'renderer/media/video_capture_message_filter_unittest.cc', 'renderer/paint_aggregator_unittest.cc', + 'renderer/skia_benchmarking_extension_unittest.cc', 'renderer/pepper/pepper_broker_impl_unittest.cc', 'renderer/render_thread_impl_unittest.cc', 'renderer/render_view_impl_unittest.cc', diff --git a/content/renderer/skia_benchmarking_extension.cc b/content/renderer/skia_benchmarking_extension.cc index c916c39..0a1c608 100644 --- a/content/renderer/skia_benchmarking_extension.cc +++ b/content/renderer/skia_benchmarking_extension.cc @@ -12,6 +12,8 @@ #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColorPriv.h" #include "third_party/skia/include/core/SkGraphics.h" +#include "third_party/skia/src/utils/debugger/SkDebugCanvas.h" +#include "third_party/skia/src/utils/debugger/SkDrawCommand.h" #include "ui/gfx/rect_conversions.h" #include "v8/include/v8.h" @@ -21,6 +23,19 @@ namespace { const char kSkiaBenchmarkingExtensionName[] = "v8/SkiaBenchmarking"; +static scoped_refptr<cc::Picture> ParsePictureArg(v8::Handle<v8::Value> arg) { + scoped_ptr<content::V8ValueConverter> converter( + content::V8ValueConverter::create()); + + v8::String::Value v8_picture(arg); + scoped_ptr<base::Value> picture_value( + converter->FromV8Value(arg, v8::Context::GetCurrent())); + if (!picture_value) + return NULL; + + return cc::Picture::CreateFromValue(picture_value.get()); +} + class SkiaBenchmarkingWrapper : public v8::Extension { public: SkiaBenchmarkingWrapper() : @@ -39,10 +54,23 @@ class SkiaBenchmarkingWrapper : public v8::Extension { " @param [Number, Number, Number, Number] clip_rect (optional)." " @returns { 'width': {Number}, 'height': {Number}," " 'data': {ArrayBuffer} }" + " @returns undefined if the arguments are invalid or the picture" + " version is not supported." " */" " native function Rasterize();" " return Rasterize(picture, scale, rect);" "};" + "chrome.skiaBenchmarking.getOps = function(picture) {" + " /* " + " Extracts the Skia draw commands from a JSON-encoded cc::Picture" + " @param {Object} picture A json-encoded cc::Picture." + " @returns [{ 'cmd': {String}, 'info': [String, ...] }, ...]" + " @returns undefined if the arguments are invalid or the picture" + " version is not supported." + " */" + " native function GetOps();" + " return GetOps(picture);" + "};" ) { content::SkiaBenchmarkingExtension::InitSkGraphics(); } @@ -51,6 +79,8 @@ class SkiaBenchmarkingWrapper : public v8::Extension { v8::Handle<v8::String> name) OVERRIDE { if (name->Equals(v8::String::New("Rasterize"))) return v8::FunctionTemplate::New(Rasterize); + if (name->Equals(v8::String::New("GetOps"))) + return v8::FunctionTemplate::New(GetOps); return v8::Handle<v8::FunctionTemplate>(); } @@ -59,22 +89,7 @@ class SkiaBenchmarkingWrapper : public v8::Extension { if (args.Length() < 1) return; - WebFrame* web_frame = WebFrame::frameForCurrentContext(); - if (!web_frame) - return; - - scoped_ptr<content::V8ValueConverter> converter( - content::V8ValueConverter::create()); - - v8::String::Value v8_picture(args[0]); - scoped_ptr<base::Value> picture_value( - converter->FromV8Value( - args[0], v8::Context::GetCurrent())); - if (!picture_value) - return; - - scoped_refptr<cc::Picture> picture = - cc::Picture::CreateFromValue(picture_value.get()); + scoped_refptr<cc::Picture> picture = ParsePictureArg(args[0]); if (!picture.get()) return; @@ -140,6 +155,44 @@ class SkiaBenchmarkingWrapper : public v8::Extension { args.GetReturnValue().Set(result); } + + static void GetOps(const v8::FunctionCallbackInfo<v8::Value>& args) { + if (args.Length() != 1) + return; + + scoped_refptr<cc::Picture> picture = ParsePictureArg(args[0]); + if (!picture.get()) + return; + + gfx::Rect bounds = picture->LayerRect(); + SkDebugCanvas canvas(bounds.width(), bounds.height()); + picture->Raster(&canvas, NULL, bounds, 1.0f); + + v8::Local<v8::Array> result = v8::Array::New(canvas.getSize()); + for (int i = 0; i < canvas.getSize(); ++i) { + DrawType cmd_type = canvas.getDrawCommandAt(i)->getType(); + v8::Handle<v8::Object> cmd = v8::Object::New(); + cmd->Set(v8::String::New("cmd_type"), v8::Integer::New(cmd_type)); + cmd->Set(v8::String::New("cmd_string"), v8::String::New( + SkDrawCommand::GetCommandString(cmd_type))); + + SkTDArray<SkString*>* info = canvas.getCommandInfo(i); + DCHECK(info); + + v8::Local<v8::Array> v8_info = v8::Array::New(info->count()); + for (int j = 0; j < info->count(); ++j) { + const SkString* info_str = (*info)[j]; + DCHECK(info_str); + v8_info->Set(j, v8::String::New(info_str->c_str())); + } + + cmd->Set(v8::String::New("info"), v8_info); + + result->Set(i, cmd); + } + + args.GetReturnValue().Set(result); + } }; } // namespace diff --git a/content/renderer/skia_benchmarking_extension_unittest.cc b/content/renderer/skia_benchmarking_extension_unittest.cc new file mode 100644 index 0000000..c9f4e90 --- /dev/null +++ b/content/renderer/skia_benchmarking_extension_unittest.cc @@ -0,0 +1,105 @@ +// Copyright (c) 2013 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/renderer/skia_benchmarking_extension.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/skia/include/core/SkCanvas.h" +#include "third_party/skia/include/core/SkGraphics.h" +#include "third_party/skia/src/utils/debugger/SkDebugCanvas.h" +#include "third_party/skia/src/utils/debugger/SkDrawCommand.h" + +namespace { + +testing::AssertionResult HasInfoField(SkDebugCanvas& canvas, int index, + const char* field) { + + SkTDArray<SkString*>* info = canvas.getCommandInfo(index); + if (info == NULL) + return testing::AssertionFailure() << " command info not found for index " + << index; + + for (int i = 0; i < info->count(); ++i) { + const SkString* info_str = (*info)[i]; + if (info_str == NULL) + return testing::AssertionFailure() << " NULL info string for index " + << index; + + // FIXME: loose info paramter test. + if (strstr(info_str->c_str(), field) != NULL) + return testing::AssertionSuccess() << field << " found"; + } + + return testing::AssertionFailure() << field << " not found"; +} + +} + +namespace content { + +TEST(SkiaBenchmarkingExtensionTest, SkDebugCanvas) { + SkGraphics::Init(); + + // Prepare canvas and resources. + SkDebugCanvas canvas(100, 100); + SkPaint red_paint; + red_paint.setColor(SkColorSetARGB(255, 255, 0, 0)); + SkRect fullRect = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)); + SkRect fillRect = SkRect::MakeXYWH(SkIntToScalar(25), SkIntToScalar(25), + SkIntToScalar(50), SkIntToScalar(50)); + + // Draw a trivial scene. + canvas.save(SkCanvas::kMatrixClip_SaveFlag); + canvas.clipRect(fullRect, SkRegion::kIntersect_Op, false); + canvas.translate(SkIntToScalar(10), SkIntToScalar(10)); + canvas.scale(SkIntToScalar(2), SkIntToScalar(2)); + canvas.drawRect(fillRect, red_paint); + canvas.restore(); + + // Verify the recorded commands. + DrawType cmd; + int idx = 0; + ASSERT_EQ(canvas.getSize(), 6); + + ASSERT_TRUE(canvas.getDrawCommandAt(idx) != NULL); + cmd = canvas.getDrawCommandAt(idx)->getType(); + EXPECT_EQ(cmd, SAVE); + EXPECT_STREQ(SkDrawCommand::GetCommandString(cmd), "Save"); + EXPECT_TRUE(HasInfoField(canvas, idx, "SaveFlags")); + + ASSERT_TRUE(canvas.getDrawCommandAt(++idx) != NULL); + cmd = canvas.getDrawCommandAt(idx)->getType(); + EXPECT_EQ(cmd, CLIP_RECT); + EXPECT_STREQ(SkDrawCommand::GetCommandString(cmd), "Clip Rect"); + EXPECT_TRUE(HasInfoField(canvas, idx, "SkRect")); + EXPECT_TRUE(HasInfoField(canvas, idx, "Op")); + EXPECT_TRUE(HasInfoField(canvas, idx, "doAA")); + + ASSERT_TRUE(canvas.getDrawCommandAt(++idx) != NULL); + cmd = canvas.getDrawCommandAt(idx)->getType(); + EXPECT_EQ(cmd, TRANSLATE); + EXPECT_STREQ(SkDrawCommand::GetCommandString(cmd), "Translate"); + EXPECT_TRUE(HasInfoField(canvas, idx, "dx")); + EXPECT_TRUE(HasInfoField(canvas, idx, "dy")); + + ASSERT_TRUE(canvas.getDrawCommandAt(++idx) != NULL); + cmd = canvas.getDrawCommandAt(idx)->getType(); + EXPECT_EQ(cmd, SCALE); + EXPECT_STREQ(SkDrawCommand::GetCommandString(cmd), "Scale"); + EXPECT_TRUE(HasInfoField(canvas, idx, "sx")); + EXPECT_TRUE(HasInfoField(canvas, idx, "sy")); + + ASSERT_TRUE(canvas.getDrawCommandAt(++idx) != NULL); + cmd = canvas.getDrawCommandAt(idx)->getType(); + EXPECT_EQ(cmd, DRAW_RECT); + EXPECT_STREQ(SkDrawCommand::GetCommandString(cmd), "Draw Rect"); + EXPECT_TRUE(HasInfoField(canvas, idx, "SkRect")); + + ASSERT_TRUE(canvas.getDrawCommandAt(++idx) != NULL); + cmd = canvas.getDrawCommandAt(idx)->getType(); + EXPECT_EQ(cmd, RESTORE); + EXPECT_STREQ(SkDrawCommand::GetCommandString(cmd), "Restore"); +} + +} // namespace content diff --git a/skia/skia.gyp b/skia/skia.gyp index e806d2c..2f7a2a9 100644 --- a/skia/skia.gyp +++ b/skia/skia.gyp @@ -129,6 +129,12 @@ '../third_party/skia/include/utils/mac/SkCGUtils.h', '../third_party/skia/include/utils/SkDeferredCanvas.h', '../third_party/skia/include/utils/SkMatrix44.h', + '../third_party/skia/src/utils/debugger/SkDebugCanvas.cpp', + '../third_party/skia/src/utils/debugger/SkDebugCanvas.h', + '../third_party/skia/src/utils/debugger/SkDrawCommand.cpp', + '../third_party/skia/src/utils/debugger/SkDrawCommand.h', + '../third_party/skia/src/utils/debugger/SkObjectParser.cpp', + '../third_party/skia/src/utils/debugger/SkObjectParser.h', '../third_party/skia/src/utils/mac/SkCreateCGImageRef.cpp', '../third_party/skia/src/utils/SkBase64.cpp', '../third_party/skia/src/utils/SkBase64.h', |