summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorfmalita@google.com <fmalita@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-21 02:57:56 +0000
committerfmalita@google.com <fmalita@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-21 02:57:56 +0000
commit91d8aa9df9f97a36bb6441da44289bee6661714d (patch)
treeac88be1f2cb6115266e63e6381ba178eeeb81529
parent5322973d577a1064bb32eb19bd01c6aa5e7c51a5 (diff)
downloadchromium_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.gypi1
-rw-r--r--content/renderer/skia_benchmarking_extension.cc85
-rw-r--r--content/renderer/skia_benchmarking_extension_unittest.cc105
-rw-r--r--skia/skia.gyp6
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',