summaryrefslogtreecommitdiffstats
path: root/cc
diff options
context:
space:
mode:
authornyquist <nyquist@chromium.org>2016-02-11 16:15:04 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-12 00:16:29 +0000
commit16febb404edc59fb8dbb13a13c68ccecfb5a0bf1 (patch)
tree882135af7b509fdc7ccebb66193039c421871711 /cc
parent23258d3c881e5c053f7bb687a13f860ea55364ef (diff)
downloadchromium_src-16febb404edc59fb8dbb13a13c68ccecfb5a0bf1.zip
chromium_src-16febb404edc59fb8dbb13a13c68ccecfb5a0bf1.tar.gz
chromium_src-16febb404edc59fb8dbb13a13c68ccecfb5a0bf1.tar.bz2
Add framework for (de)serialization of images in SkPicture
This CL adds Plumbing for picture serialization and deserialization from //blimp to DrawingDisplayItem. BUG=577262 CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel Review URL: https://codereview.chromium.org/1675763002 Cr-Commit-Position: refs/heads/master@{#375053}
Diffstat (limited to 'cc')
-rw-r--r--cc/BUILD.gn3
-rw-r--r--cc/cc.gyp1
-rw-r--r--cc/cc_tests.gyp2
-rw-r--r--cc/layers/picture_layer.cc8
-rw-r--r--cc/layers/picture_layer_unittest.cc28
-rw-r--r--cc/playback/clip_display_item.cc9
-rw-r--r--cc/playback/clip_display_item.h9
-rw-r--r--cc/playback/clip_path_display_item.cc9
-rw-r--r--cc/playback/clip_path_display_item.h9
-rw-r--r--cc/playback/compositing_display_item.cc9
-rw-r--r--cc/playback/compositing_display_item.h9
-rw-r--r--cc/playback/display_item.h7
-rw-r--r--cc/playback/display_item_list.cc14
-rw-r--r--cc/playback/display_item_list.h7
-rw-r--r--cc/playback/display_item_list_unittest.cc11
-rw-r--r--cc/playback/display_item_proto_factory.cc7
-rw-r--r--cc/playback/display_item_proto_factory.h9
-rw-r--r--cc/playback/display_list_recording_source.cc16
-rw-r--r--cc/playback/display_list_recording_source.h10
-rw-r--r--cc/playback/display_list_recording_source_unittest.cc9
-rw-r--r--cc/playback/drawing_display_item.cc19
-rw-r--r--cc/playback/drawing_display_item.h9
-rw-r--r--cc/playback/filter_display_item.cc9
-rw-r--r--cc/playback/filter_display_item.h9
-rw-r--r--cc/playback/float_clip_display_item.cc9
-rw-r--r--cc/playback/float_clip_display_item.h9
-rw-r--r--cc/playback/transform_display_item.cc9
-rw-r--r--cc/playback/transform_display_item.h9
-rw-r--r--cc/proto/image_serialization_processor.h30
-rw-r--r--cc/test/fake_image_serialization_processor.cc32
-rw-r--r--cc/test/fake_image_serialization_processor.h30
-rw-r--r--cc/test/fake_layer_tree_host.cc15
-rw-r--r--cc/test/fake_layer_tree_host.h14
-rw-r--r--cc/trees/layer_tree_host.cc3
-rw-r--r--cc/trees/layer_tree_host.h8
-rw-r--r--cc/trees/layer_tree_host_unittest_remote_server.cc9
36 files changed, 340 insertions, 69 deletions
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 70f28d2..69c41c9 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -319,6 +319,7 @@ component("cc") {
"proto/gfx_conversions.h",
"proto/gpu_conversions.cc",
"proto/gpu_conversions.h",
+ "proto/image_serialization_processor.h",
"proto/skia_conversions.cc",
"proto/skia_conversions.h",
"quads/content_draw_quad_base.cc",
@@ -584,6 +585,8 @@ source_set("test_support") {
"test/fake_display_list_recording_source.h",
"test/fake_external_begin_frame_source.cc",
"test/fake_external_begin_frame_source.h",
+ "test/fake_image_serialization_processor.cc",
+ "test/fake_image_serialization_processor.h",
"test/fake_impl_task_runner_provider.h",
"test/fake_layer_tree_host.cc",
"test/fake_layer_tree_host.h",
diff --git a/cc/cc.gyp b/cc/cc.gyp
index 8a5e6ce..a3cbc5f 100644
--- a/cc/cc.gyp
+++ b/cc/cc.gyp
@@ -381,6 +381,7 @@
'proto/gfx_conversions.h',
'proto/gpu_conversions.cc',
'proto/gpu_conversions.h',
+ 'proto/image_serialization_processor.h',
'proto/skia_conversions.cc',
'proto/skia_conversions.h',
'quads/content_draw_quad_base.cc',
diff --git a/cc/cc_tests.gyp b/cc/cc_tests.gyp
index d9fe4b1..b8f5b1c 100644
--- a/cc/cc_tests.gyp
+++ b/cc/cc_tests.gyp
@@ -187,6 +187,8 @@
'test/fake_display_list_recording_source.h',
'test/fake_external_begin_frame_source.cc',
'test/fake_external_begin_frame_source.h',
+ 'test/fake_image_serialization_processor.cc',
+ 'test/fake_image_serialization_processor.h',
'test/fake_impl_task_runner_provider.h',
'test/fake_layer_tree_host.cc',
'test/fake_layer_tree_host.h',
diff --git a/cc/layers/picture_layer.cc b/cc/layers/picture_layer.cc
index f9df22cd..17c920f 100644
--- a/cc/layers/picture_layer.cc
+++ b/cc/layers/picture_layer.cc
@@ -195,7 +195,9 @@ void PictureLayer::LayerSpecificPropertiesToProto(
DropRecordingSourceContentIfInvalid();
proto::PictureLayerProperties* picture = proto->mutable_picture();
- recording_source_->ToProtobuf(picture->mutable_recording_source());
+ recording_source_->ToProtobuf(
+ picture->mutable_recording_source(),
+ layer_tree_host()->image_serialization_processor());
RegionToProto(*invalidation_.region(), picture->mutable_invalidation());
RectToProto(last_updated_visible_layer_rect_,
picture->mutable_last_updated_visible_layer_rect());
@@ -211,7 +213,9 @@ void PictureLayer::FromLayerSpecificPropertiesProto(
const proto::LayerProperties& proto) {
Layer::FromLayerSpecificPropertiesProto(proto);
const proto::PictureLayerProperties& picture = proto.picture();
- recording_source_->FromProtobuf(picture.recording_source());
+ recording_source_->FromProtobuf(
+ picture.recording_source(),
+ layer_tree_host()->image_serialization_processor());
Region new_invalidation = RegionFromProto(picture.invalidation());
invalidation_.Swap(&new_invalidation);
diff --git a/cc/layers/picture_layer_unittest.cc b/cc/layers/picture_layer_unittest.cc
index 1ce7567..7c35d55 100644
--- a/cc/layers/picture_layer_unittest.cc
+++ b/cc/layers/picture_layer_unittest.cc
@@ -15,6 +15,7 @@
#include "cc/playback/display_item_list_settings.h"
#include "cc/proto/layer.pb.h"
#include "cc/test/fake_display_list_recording_source.h"
+#include "cc/test/fake_image_serialization_processor.h"
#include "cc/test/fake_layer_tree_host.h"
#include "cc/test/fake_output_surface.h"
#include "cc/test/fake_picture_layer.h"
@@ -69,8 +70,14 @@ class TestSerializationPictureLayer : public PictureLayer {
FakeLayerTreeHostClient host_client(FakeLayerTreeHostClient::DIRECT_3D);
TestTaskGraphRunner task_graph_runner;
+ LayerTreeSettings settings;
+ scoped_ptr<FakeImageSerializationProcessor>
+ fake_image_serialization_processor =
+ make_scoped_ptr(new FakeImageSerializationProcessor);
scoped_ptr<FakeLayerTreeHost> host =
- FakeLayerTreeHost::Create(&host_client, &task_graph_runner);
+ FakeLayerTreeHost::Create(&host_client, &task_graph_runner, settings,
+ CompositorMode::SINGLE_THREADED,
+ fake_image_serialization_processor.get());
scoped_refptr<TestSerializationPictureLayer> layer =
TestSerializationPictureLayer::Create(recording_source_viewport_);
host->SetRootLayer(layer);
@@ -104,8 +111,14 @@ namespace {
TEST(PictureLayerTest, TestSetAllPropsSerializationDeserialization) {
FakeLayerTreeHostClient host_client(FakeLayerTreeHostClient::DIRECT_3D);
TestTaskGraphRunner task_graph_runner;
+ LayerTreeSettings settings;
+ scoped_ptr<FakeImageSerializationProcessor>
+ fake_image_serialization_processor =
+ make_scoped_ptr(new FakeImageSerializationProcessor);
scoped_ptr<FakeLayerTreeHost> host =
- FakeLayerTreeHost::Create(&host_client, &task_graph_runner);
+ FakeLayerTreeHost::Create(&host_client, &task_graph_runner, settings,
+ CompositorMode::SINGLE_THREADED,
+ fake_image_serialization_processor.get());
gfx::Size recording_source_viewport(256, 256);
scoped_refptr<TestSerializationPictureLayer> layer =
@@ -131,9 +144,16 @@ TEST(PictureLayerTest, TestSetAllPropsSerializationDeserialization) {
TEST(PictureLayerTest, TestSerializationDeserialization) {
FakeLayerTreeHostClient host_client(FakeLayerTreeHostClient::DIRECT_3D);
TestTaskGraphRunner task_graph_runner;
+ LayerTreeSettings settings;
+ settings.verify_property_trees = true;
+ settings.use_compositor_animation_timelines = true;
+ scoped_ptr<FakeImageSerializationProcessor>
+ fake_image_serialization_processor =
+ make_scoped_ptr(new FakeImageSerializationProcessor);
scoped_ptr<FakeLayerTreeHost> host =
- FakeLayerTreeHost::Create(&host_client, &task_graph_runner);
-
+ FakeLayerTreeHost::Create(&host_client, &task_graph_runner, settings,
+ CompositorMode::SINGLE_THREADED,
+ fake_image_serialization_processor.get());
gfx::Size recording_source_viewport(256, 256);
scoped_refptr<TestSerializationPictureLayer> layer =
TestSerializationPictureLayer::Create(recording_source_viewport);
diff --git a/cc/playback/clip_display_item.cc b/cc/playback/clip_display_item.cc
index 4ab8e5d..92166c1 100644
--- a/cc/playback/clip_display_item.cc
+++ b/cc/playback/clip_display_item.cc
@@ -18,6 +18,7 @@
#include "ui/gfx/skia_util.h"
namespace cc {
+class ImageSerializationProcessor;
ClipDisplayItem::ClipDisplayItem(
const gfx::Rect& clip_rect,
@@ -46,7 +47,9 @@ void ClipDisplayItem::SetNew(const gfx::Rect& clip_rect,
ClipDisplayItem::~ClipDisplayItem() {}
-void ClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
+void ClipDisplayItem::ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
proto->set_type(proto::DisplayItem::Type_Clip);
proto::ClipDisplayItem* details = proto->mutable_clip_item();
@@ -117,7 +120,9 @@ EndClipDisplayItem::EndClipDisplayItem(const proto::DisplayItem& proto) {
EndClipDisplayItem::~EndClipDisplayItem() {
}
-void EndClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
+void EndClipDisplayItem::ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
proto->set_type(proto::DisplayItem::Type_EndClip);
}
diff --git a/cc/playback/clip_display_item.h b/cc/playback/clip_display_item.h
index 97e877e..2715ce3 100644
--- a/cc/playback/clip_display_item.h
+++ b/cc/playback/clip_display_item.h
@@ -18,6 +18,7 @@
class SkCanvas;
namespace cc {
+class ImageSerializationProcessor;
class CC_EXPORT ClipDisplayItem : public DisplayItem {
public:
@@ -26,7 +27,9 @@ class CC_EXPORT ClipDisplayItem : public DisplayItem {
explicit ClipDisplayItem(const proto::DisplayItem& proto);
~ClipDisplayItem() override;
- void ToProtobuf(proto::DisplayItem* proto) const override;
+ void ToProtobuf(proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor)
+ const override;
void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override;
@@ -51,7 +54,9 @@ class CC_EXPORT EndClipDisplayItem : public DisplayItem {
explicit EndClipDisplayItem(const proto::DisplayItem& proto);
~EndClipDisplayItem() override;
- void ToProtobuf(proto::DisplayItem* proto) const override;
+ void ToProtobuf(proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor)
+ const override;
void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override;
diff --git a/cc/playback/clip_path_display_item.cc b/cc/playback/clip_path_display_item.cc
index 1a39af2..64ad813 100644
--- a/cc/playback/clip_path_display_item.cc
+++ b/cc/playback/clip_path_display_item.cc
@@ -14,6 +14,7 @@
#include "third_party/skia/include/core/SkCanvas.h"
namespace cc {
+class ImageSerializationProcessor;
ClipPathDisplayItem::ClipPathDisplayItem(const SkPath& clip_path,
SkRegion::Op clip_op,
@@ -49,7 +50,9 @@ void ClipPathDisplayItem::SetNew(const SkPath& clip_path,
antialias_ = antialias;
}
-void ClipPathDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
+void ClipPathDisplayItem::ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
proto->set_type(proto::DisplayItem::Type_ClipPath);
proto::ClipPathDisplayItem* details = proto->mutable_clip_path_item();
@@ -96,7 +99,9 @@ EndClipPathDisplayItem::EndClipPathDisplayItem(
EndClipPathDisplayItem::~EndClipPathDisplayItem() {
}
-void EndClipPathDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
+void EndClipPathDisplayItem::ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
proto->set_type(proto::DisplayItem::Type_EndClipPath);
}
diff --git a/cc/playback/clip_path_display_item.h b/cc/playback/clip_path_display_item.h
index 0ad1eff..f946c14 100644
--- a/cc/playback/clip_path_display_item.h
+++ b/cc/playback/clip_path_display_item.h
@@ -16,6 +16,7 @@
class SkCanvas;
namespace cc {
+class ImageSerializationProcessor;
class CC_EXPORT ClipPathDisplayItem : public DisplayItem {
public:
@@ -23,7 +24,9 @@ class CC_EXPORT ClipPathDisplayItem : public DisplayItem {
explicit ClipPathDisplayItem(const proto::DisplayItem& proto);
~ClipPathDisplayItem() override;
- void ToProtobuf(proto::DisplayItem* proto) const override;
+ void ToProtobuf(proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor)
+ const override;
void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override;
@@ -52,7 +55,9 @@ class CC_EXPORT EndClipPathDisplayItem : public DisplayItem {
return make_scoped_ptr(new EndClipPathDisplayItem());
}
- void ToProtobuf(proto::DisplayItem* proto) const override;
+ void ToProtobuf(proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor)
+ const override;
void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override;
diff --git a/cc/playback/compositing_display_item.cc b/cc/playback/compositing_display_item.cc
index 6828fcf..964406a0 100644
--- a/cc/playback/compositing_display_item.cc
+++ b/cc/playback/compositing_display_item.cc
@@ -21,6 +21,7 @@
#include "ui/gfx/skia_util.h"
namespace cc {
+class ImageSerializationProcessor;
CompositingDisplayItem::CompositingDisplayItem(
uint8_t alpha,
@@ -77,7 +78,9 @@ void CompositingDisplayItem::SetNew(uint8_t alpha,
lcd_text_requires_opaque_layer_ = lcd_text_requires_opaque_layer;
}
-void CompositingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
+void CompositingDisplayItem::ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
proto->set_type(proto::DisplayItem::Type_Compositing);
proto::CompositingDisplayItem* details = proto->mutable_compositing_item();
@@ -139,7 +142,9 @@ EndCompositingDisplayItem::EndCompositingDisplayItem(
EndCompositingDisplayItem::~EndCompositingDisplayItem() {
}
-void EndCompositingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
+void EndCompositingDisplayItem::ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
proto->set_type(proto::DisplayItem::Type_EndCompositing);
}
diff --git a/cc/playback/compositing_display_item.h b/cc/playback/compositing_display_item.h
index 4745208..d723ce1 100644
--- a/cc/playback/compositing_display_item.h
+++ b/cc/playback/compositing_display_item.h
@@ -20,6 +20,7 @@
class SkCanvas;
namespace cc {
+class ImageSerializationProcessor;
class CC_EXPORT CompositingDisplayItem : public DisplayItem {
public:
@@ -31,7 +32,9 @@ class CC_EXPORT CompositingDisplayItem : public DisplayItem {
explicit CompositingDisplayItem(const proto::DisplayItem& proto);
~CompositingDisplayItem() override;
- void ToProtobuf(proto::DisplayItem* proto) const override;
+ void ToProtobuf(proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor)
+ const override;
void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override;
@@ -67,7 +70,9 @@ class CC_EXPORT EndCompositingDisplayItem : public DisplayItem {
return make_scoped_ptr(new EndCompositingDisplayItem());
}
- void ToProtobuf(proto::DisplayItem* proto) const override;
+ void ToProtobuf(proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor)
+ const override;
void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override;
diff --git a/cc/playback/display_item.h b/cc/playback/display_item.h
index c4140f33..3f61adb 100644
--- a/cc/playback/display_item.h
+++ b/cc/playback/display_item.h
@@ -16,16 +16,19 @@
class SkCanvas;
namespace cc {
+class ImageSerializationProcessor;
namespace proto {
class DisplayItem;
-}
+} // namespace proto
class CC_EXPORT DisplayItem {
public:
virtual ~DisplayItem() {}
- virtual void ToProtobuf(proto::DisplayItem* proto) const = 0;
+ virtual void ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const = 0;
virtual void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const = 0;
diff --git a/cc/playback/display_item_list.cc b/cc/playback/display_item_list.cc
index 6f2f52c..be5b9d4 100644
--- a/cc/playback/display_item_list.cc
+++ b/cc/playback/display_item_list.cc
@@ -29,6 +29,7 @@
#include "ui/gfx/skia_util.h"
namespace cc {
+class ImageSerializationProcessor;
namespace {
@@ -56,7 +57,8 @@ scoped_refptr<DisplayItemList> DisplayItemList::Create(
}
scoped_refptr<DisplayItemList> DisplayItemList::CreateFromProto(
- const proto::DisplayItemList& proto) {
+ const proto::DisplayItemList& proto,
+ ImageSerializationProcessor* image_serialization_processor) {
gfx::Rect layer_rect = ProtoToRect(proto.layer_rect());
scoped_refptr<DisplayItemList> list =
DisplayItemList::Create(ProtoToRect(proto.layer_rect()),
@@ -64,8 +66,8 @@ scoped_refptr<DisplayItemList> DisplayItemList::CreateFromProto(
for (int i = 0; i < proto.items_size(); i++) {
const proto::DisplayItem& item_proto = proto.items(i);
- DisplayItemProtoFactory::AllocateAndConstruct(layer_rect, list.get(),
- item_proto);
+ DisplayItemProtoFactory::AllocateAndConstruct(
+ layer_rect, list.get(), item_proto, image_serialization_processor);
}
list->Finalize();
@@ -97,7 +99,9 @@ DisplayItemList::DisplayItemList(gfx::Rect layer_rect,
DisplayItemList::~DisplayItemList() {
}
-void DisplayItemList::ToProtobuf(proto::DisplayItemList* proto) {
+void DisplayItemList::ToProtobuf(
+ proto::DisplayItemList* proto,
+ ImageSerializationProcessor* image_serialization_processor) {
// The flattened SkPicture approach is going away, and the proto
// doesn't currently support serializing that flattened picture.
DCHECK(retain_individual_display_items_);
@@ -107,7 +111,7 @@ void DisplayItemList::ToProtobuf(proto::DisplayItemList* proto) {
DCHECK_EQ(0, proto->items_size());
for (const auto& item : items_)
- item.ToProtobuf(proto->add_items());
+ item.ToProtobuf(proto->add_items(), image_serialization_processor);
}
void DisplayItemList::Raster(SkCanvas* canvas,
diff --git a/cc/playback/display_item_list.h b/cc/playback/display_item_list.h
index bab4c3f..d8b14b5 100644
--- a/cc/playback/display_item_list.h
+++ b/cc/playback/display_item_list.h
@@ -28,6 +28,7 @@ class SkPictureRecorder;
namespace cc {
class DisplayItem;
class DrawingDisplayItem;
+class ImageSerializationProcessor;
namespace proto {
class DisplayItemList;
@@ -49,12 +50,14 @@ class CC_EXPORT DisplayItemList
// TODO(dtrainor): Pass in a list of possible DisplayItems to reuse
// (crbug.com/548434).
static scoped_refptr<DisplayItemList> CreateFromProto(
- const proto::DisplayItemList& proto);
+ const proto::DisplayItemList& proto,
+ ImageSerializationProcessor* image_serialization_processor);
// Creates a Protobuf representing the state of this DisplayItemList.
// TODO(dtrainor): Don't resend DisplayItems that were already serialized
// (crbug.com/548434).
- void ToProtobuf(proto::DisplayItemList* proto);
+ void ToProtobuf(proto::DisplayItemList* proto,
+ ImageSerializationProcessor* image_serialization_processor);
void Raster(SkCanvas* canvas,
SkPicture::AbortCallback* callback,
diff --git a/cc/playback/display_item_list_unittest.cc b/cc/playback/display_item_list_unittest.cc
index 60f9124..a6aac41 100644
--- a/cc/playback/display_item_list_unittest.cc
+++ b/cc/playback/display_item_list_unittest.cc
@@ -19,6 +19,7 @@
#include "cc/playback/float_clip_display_item.h"
#include "cc/playback/transform_display_item.h"
#include "cc/proto/display_item.pb.h"
+#include "cc/test/fake_image_serialization_processor.h"
#include "cc/test/skia_common.h"
#include "skia/ext/refptr.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -79,11 +80,15 @@ void ValidateDisplayItemListSerialization(const gfx::Size& layer_size,
scoped_refptr<DisplayItemList> list) {
list->Finalize();
+ scoped_ptr<FakeImageSerializationProcessor>
+ fake_image_serialization_processor =
+ make_scoped_ptr(new FakeImageSerializationProcessor);
+
// Serialize and deserialize the DisplayItemList.
proto::DisplayItemList proto;
- list->ToProtobuf(&proto);
- scoped_refptr<DisplayItemList> new_list =
- DisplayItemList::CreateFromProto(proto);
+ list->ToProtobuf(&proto, fake_image_serialization_processor.get());
+ scoped_refptr<DisplayItemList> new_list = DisplayItemList::CreateFromProto(
+ proto, fake_image_serialization_processor.get());
EXPECT_TRUE(
AreDisplayListDrawingResultsSame(gfx::Rect(layer_size), list, new_list));
diff --git a/cc/playback/display_item_proto_factory.cc b/cc/playback/display_item_proto_factory.cc
index 88d5066..0dedda3 100644
--- a/cc/playback/display_item_proto_factory.cc
+++ b/cc/playback/display_item_proto_factory.cc
@@ -15,12 +15,14 @@
#include "ui/gfx/geometry/rect.h"
namespace cc {
+class ImageSerializationProcessor;
// static
void DisplayItemProtoFactory::AllocateAndConstruct(
const gfx::Rect& visual_rect,
DisplayItemList* list,
- const proto::DisplayItem& proto) {
+ const proto::DisplayItem& proto,
+ ImageSerializationProcessor* image_serialization_processor) {
switch (proto.type()) {
case proto::DisplayItem::Type_Clip:
list->CreateAndAppendItem<ClipDisplayItem>(visual_rect, proto);
@@ -41,7 +43,8 @@ void DisplayItemProtoFactory::AllocateAndConstruct(
list->CreateAndAppendItem<EndCompositingDisplayItem>(visual_rect, proto);
return;
case proto::DisplayItem::Type_Drawing:
- list->CreateAndAppendItem<DrawingDisplayItem>(visual_rect, proto);
+ list->CreateAndAppendItem<DrawingDisplayItem>(
+ visual_rect, proto, image_serialization_processor);
return;
case proto::DisplayItem::Type_Filter:
list->CreateAndAppendItem<FilterDisplayItem>(visual_rect, proto);
diff --git a/cc/playback/display_item_proto_factory.h b/cc/playback/display_item_proto_factory.h
index edc6118..f881e79 100644
--- a/cc/playback/display_item_proto_factory.h
+++ b/cc/playback/display_item_proto_factory.h
@@ -11,6 +11,7 @@
#include "cc/playback/display_item_list.h"
namespace cc {
+class ImageSerializationProcessor;
namespace proto {
class DisplayItem;
@@ -18,9 +19,11 @@ class DisplayItem;
class DisplayItemProtoFactory {
public:
- static void AllocateAndConstruct(const gfx::Rect& visual_rect,
- DisplayItemList* list,
- const proto::DisplayItem& proto);
+ static void AllocateAndConstruct(
+ const gfx::Rect& visual_rect,
+ DisplayItemList* list,
+ const proto::DisplayItem& proto,
+ ImageSerializationProcessor* image_serialization_processor);
private:
DisplayItemProtoFactory() {}
diff --git a/cc/playback/display_list_recording_source.cc b/cc/playback/display_list_recording_source.cc
index d4e6a3e..52c8277 100644
--- a/cc/playback/display_list_recording_source.cc
+++ b/cc/playback/display_list_recording_source.cc
@@ -34,6 +34,7 @@ DEFINE_SCOPED_UMA_HISTOGRAM_AREA_TIMER(
} // namespace
namespace cc {
+class ImageSerializationProcessor;
DisplayListRecordingSource::DisplayListRecordingSource()
: slow_down_raster_scale_factor_for_debug_(0),
@@ -49,7 +50,8 @@ DisplayListRecordingSource::~DisplayListRecordingSource() {
}
void DisplayListRecordingSource::ToProtobuf(
- proto::DisplayListRecordingSource* proto) const {
+ proto::DisplayListRecordingSource* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
RectToProto(recorded_viewport_, proto->mutable_recorded_viewport());
SizeToProto(size_, proto->mutable_size());
proto->set_slow_down_raster_scale_factor_for_debug(
@@ -61,12 +63,15 @@ void DisplayListRecordingSource::ToProtobuf(
proto->set_clear_canvas_with_debug_color(clear_canvas_with_debug_color_);
proto->set_solid_color(static_cast<uint64_t>(solid_color_));
proto->set_background_color(static_cast<uint64_t>(background_color_));
- if (display_list_)
- display_list_->ToProtobuf(proto->mutable_display_list());
+ if (display_list_) {
+ display_list_->ToProtobuf(proto->mutable_display_list(),
+ image_serialization_processor);
+ }
}
void DisplayListRecordingSource::FromProtobuf(
- const proto::DisplayListRecordingSource& proto) {
+ const proto::DisplayListRecordingSource& proto,
+ ImageSerializationProcessor* image_serialization_processor) {
recorded_viewport_ = ProtoToRect(proto.recorded_viewport());
size_ = ProtoToSize(proto.size());
slow_down_raster_scale_factor_for_debug_ =
@@ -83,7 +88,8 @@ void DisplayListRecordingSource::FromProtobuf(
// DisplayListRecordingSource was null, wich can happen if |Clear()| is
// called.
if (proto.has_display_list()) {
- display_list_ = DisplayItemList::CreateFromProto(proto.display_list());
+ display_list_ = DisplayItemList::CreateFromProto(
+ proto.display_list(), image_serialization_processor);
FinishDisplayItemListUpdate();
} else {
display_list_ = nullptr;
diff --git a/cc/playback/display_list_recording_source.h b/cc/playback/display_list_recording_source.h
index 4fb2164..c69c114 100644
--- a/cc/playback/display_list_recording_source.h
+++ b/cc/playback/display_list_recording_source.h
@@ -19,11 +19,12 @@ namespace cc {
namespace proto {
class DisplayListRecordingSource;
-}
+} // namespace proto
class ContentLayerClient;
class DisplayItemList;
class DisplayListRasterSource;
+class ImageSerializationProcessor;
class Region;
class CC_EXPORT DisplayListRecordingSource {
@@ -43,8 +44,11 @@ class CC_EXPORT DisplayListRecordingSource {
DisplayListRecordingSource();
virtual ~DisplayListRecordingSource();
- void ToProtobuf(proto::DisplayListRecordingSource* proto) const;
- void FromProtobuf(const proto::DisplayListRecordingSource& proto);
+ void ToProtobuf(
+ proto::DisplayListRecordingSource* proto,
+ ImageSerializationProcessor* image_serialization_processor) const;
+ void FromProtobuf(const proto::DisplayListRecordingSource& proto,
+ ImageSerializationProcessor* image_serialization_processor);
bool UpdateAndExpandInvalidation(ContentLayerClient* painter,
Region* invalidation,
diff --git a/cc/playback/display_list_recording_source_unittest.cc b/cc/playback/display_list_recording_source_unittest.cc
index 1649566..3b619bb 100644
--- a/cc/playback/display_list_recording_source_unittest.cc
+++ b/cc/playback/display_list_recording_source_unittest.cc
@@ -9,6 +9,7 @@
#include "cc/proto/display_list_recording_source.pb.h"
#include "cc/test/fake_content_layer_client.h"
#include "cc/test/fake_display_list_recording_source.h"
+#include "cc/test/fake_image_serialization_processor.h"
#include "cc/test/skia_common.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -33,11 +34,15 @@ scoped_refptr<DisplayListRasterSource> CreateRasterSource(
void ValidateRecordingSourceSerialization(
FakeDisplayListRecordingSource* source) {
+ scoped_ptr<FakeImageSerializationProcessor>
+ fake_image_serialization_processor =
+ make_scoped_ptr(new FakeImageSerializationProcessor);
+
proto::DisplayListRecordingSource proto;
- source->ToProtobuf(&proto);
+ source->ToProtobuf(&proto, fake_image_serialization_processor.get());
FakeDisplayListRecordingSource new_source;
- new_source.FromProtobuf(proto);
+ new_source.FromProtobuf(proto, fake_image_serialization_processor.get());
EXPECT_TRUE(source->EqualsTo(new_source));
}
diff --git a/cc/playback/drawing_display_item.cc b/cc/playback/drawing_display_item.cc
index 36181ae..f8832cb 100644
--- a/cc/playback/drawing_display_item.cc
+++ b/cc/playback/drawing_display_item.cc
@@ -13,6 +13,7 @@
#include "base/values.h"
#include "cc/debug/picture_debug_util.h"
#include "cc/proto/display_item.pb.h"
+#include "cc/proto/image_serialization_processor.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkData.h"
#include "third_party/skia/include/core/SkMatrix.h"
@@ -29,7 +30,9 @@ DrawingDisplayItem::DrawingDisplayItem(skia::RefPtr<const SkPicture> picture) {
SetNew(std::move(picture));
}
-DrawingDisplayItem::DrawingDisplayItem(const proto::DisplayItem& proto) {
+DrawingDisplayItem::DrawingDisplayItem(
+ const proto::DisplayItem& proto,
+ ImageSerializationProcessor* image_serialization_processor) {
DCHECK_EQ(proto::DisplayItem::Type_Drawing, proto.type());
skia::RefPtr<SkPicture> picture;
@@ -37,8 +40,8 @@ DrawingDisplayItem::DrawingDisplayItem(const proto::DisplayItem& proto) {
if (details.has_picture()) {
SkMemoryStream stream(details.picture().data(), details.picture().size());
- // TODO(dtrainor, nyquist): Add an image decoder.
- picture = skia::AdoptRef(SkPicture::CreateFromStream(&stream, nullptr));
+ picture = skia::AdoptRef(SkPicture::CreateFromStream(
+ &stream, image_serialization_processor->GetPixelDeserializer()));
}
SetNew(std::move(picture));
@@ -55,7 +58,9 @@ void DrawingDisplayItem::SetNew(skia::RefPtr<const SkPicture> picture) {
picture_ = std::move(picture);
}
-void DrawingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
+void DrawingDisplayItem::ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
proto->set_type(proto::DisplayItem::Type_Drawing);
proto::DrawingDisplayItem* details = proto->mutable_drawing_item();
@@ -63,10 +68,8 @@ void DrawingDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
// Just use skia's serialize() method for now.
if (picture_) {
SkDynamicMemoryWStream stream;
-
- // TODO(dtrainor, nyquist): Add an SkPixelSerializer to not serialize images
- // more than once (crbug.com/548434).
- picture_->serialize(&stream, nullptr);
+ picture_->serialize(&stream,
+ image_serialization_processor->GetPixelSerializer());
if (stream.bytesWritten() > 0) {
SkAutoDataUnref data(stream.copyToData());
details->set_picture(data->data(), data->size());
diff --git a/cc/playback/drawing_display_item.h b/cc/playback/drawing_display_item.h
index 225bda4..8045904 100644
--- a/cc/playback/drawing_display_item.h
+++ b/cc/playback/drawing_display_item.h
@@ -17,16 +17,21 @@ class SkCanvas;
class SkPicture;
namespace cc {
+class ImageSerializationProcessor;
class CC_EXPORT DrawingDisplayItem : public DisplayItem {
public:
DrawingDisplayItem();
explicit DrawingDisplayItem(skia::RefPtr<const SkPicture> picture);
- explicit DrawingDisplayItem(const proto::DisplayItem& proto);
+ explicit DrawingDisplayItem(
+ const proto::DisplayItem& proto,
+ ImageSerializationProcessor* image_serialization_processor);
explicit DrawingDisplayItem(const DrawingDisplayItem& item);
~DrawingDisplayItem() override;
- void ToProtobuf(proto::DisplayItem* proto) const override;
+ void ToProtobuf(proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor)
+ const override;
void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_playback_rect,
SkPicture::AbortCallback* callback) const override;
diff --git a/cc/playback/filter_display_item.cc b/cc/playback/filter_display_item.cc
index 0c6ebe0a..af42baa 100644
--- a/cc/playback/filter_display_item.cc
+++ b/cc/playback/filter_display_item.cc
@@ -19,6 +19,7 @@
#include "ui/gfx/skia_util.h"
namespace cc {
+class ImageSerializationProcessor;
FilterDisplayItem::FilterDisplayItem(const FilterOperations& filters,
const gfx::RectF& bounds) {
@@ -45,7 +46,9 @@ void FilterDisplayItem::SetNew(const FilterOperations& filters,
bounds_ = bounds;
}
-void FilterDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
+void FilterDisplayItem::ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
proto->set_type(proto::DisplayItem::Type_Filter);
proto::FilterDisplayItem* details = proto->mutable_filter_item();
@@ -95,7 +98,9 @@ EndFilterDisplayItem::EndFilterDisplayItem(const proto::DisplayItem& proto) {
EndFilterDisplayItem::~EndFilterDisplayItem() {}
-void EndFilterDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
+void EndFilterDisplayItem::ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
proto->set_type(proto::DisplayItem::Type_EndFilter);
}
diff --git a/cc/playback/filter_display_item.h b/cc/playback/filter_display_item.h
index d4506ed..b385538 100644
--- a/cc/playback/filter_display_item.h
+++ b/cc/playback/filter_display_item.h
@@ -16,6 +16,7 @@
class SkCanvas;
namespace cc {
+class ImageSerializationProcessor;
class CC_EXPORT FilterDisplayItem : public DisplayItem {
public:
@@ -23,7 +24,9 @@ class CC_EXPORT FilterDisplayItem : public DisplayItem {
explicit FilterDisplayItem(const proto::DisplayItem& proto);
~FilterDisplayItem() override;
- void ToProtobuf(proto::DisplayItem* proto) const override;
+ void ToProtobuf(proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor)
+ const override;
void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override;
@@ -51,7 +54,9 @@ class CC_EXPORT EndFilterDisplayItem : public DisplayItem {
return make_scoped_ptr(new EndFilterDisplayItem());
}
- void ToProtobuf(proto::DisplayItem* proto) const override;
+ void ToProtobuf(proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor)
+ const override;
void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override;
diff --git a/cc/playback/float_clip_display_item.cc b/cc/playback/float_clip_display_item.cc
index 3601e9d..621c4d9 100644
--- a/cc/playback/float_clip_display_item.cc
+++ b/cc/playback/float_clip_display_item.cc
@@ -14,6 +14,7 @@
#include "ui/gfx/skia_util.h"
namespace cc {
+class ImageSerializationProcessor;
FloatClipDisplayItem::FloatClipDisplayItem(const gfx::RectF& clip_rect) {
SetNew(clip_rect);
@@ -35,7 +36,9 @@ void FloatClipDisplayItem::SetNew(const gfx::RectF& clip_rect) {
clip_rect_ = clip_rect;
}
-void FloatClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
+void FloatClipDisplayItem::ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
proto->set_type(proto::DisplayItem::Type_FloatClip);
proto::FloatClipDisplayItem* details = proto->mutable_float_clip_item();
@@ -71,7 +74,9 @@ EndFloatClipDisplayItem::EndFloatClipDisplayItem(
EndFloatClipDisplayItem::~EndFloatClipDisplayItem() {
}
-void EndFloatClipDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
+void EndFloatClipDisplayItem::ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
proto->set_type(proto::DisplayItem::Type_EndFloatClip);
}
diff --git a/cc/playback/float_clip_display_item.h b/cc/playback/float_clip_display_item.h
index 8c34c5f..41d9ace 100644
--- a/cc/playback/float_clip_display_item.h
+++ b/cc/playback/float_clip_display_item.h
@@ -17,6 +17,7 @@
class SkCanvas;
namespace cc {
+class ImageSerializationProcessor;
class CC_EXPORT FloatClipDisplayItem : public DisplayItem {
public:
@@ -24,7 +25,9 @@ class CC_EXPORT FloatClipDisplayItem : public DisplayItem {
explicit FloatClipDisplayItem(const proto::DisplayItem& proto);
~FloatClipDisplayItem() override;
- void ToProtobuf(proto::DisplayItem* proto) const override;
+ void ToProtobuf(proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor)
+ const override;
void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override;
@@ -51,7 +54,9 @@ class CC_EXPORT EndFloatClipDisplayItem : public DisplayItem {
return make_scoped_ptr(new EndFloatClipDisplayItem());
}
- void ToProtobuf(proto::DisplayItem* proto) const override;
+ void ToProtobuf(proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor)
+ const override;
void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override;
diff --git a/cc/playback/transform_display_item.cc b/cc/playback/transform_display_item.cc
index c4625ff..e3aa591 100644
--- a/cc/playback/transform_display_item.cc
+++ b/cc/playback/transform_display_item.cc
@@ -13,6 +13,7 @@
#include "third_party/skia/include/core/SkCanvas.h"
namespace cc {
+class ImageSerializationProcessor;
TransformDisplayItem::TransformDisplayItem(const gfx::Transform& transform)
: transform_(gfx::Transform::kSkipInitialization) {
@@ -35,7 +36,9 @@ void TransformDisplayItem::SetNew(const gfx::Transform& transform) {
transform_ = transform;
}
-void TransformDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
+void TransformDisplayItem::ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
proto->set_type(proto::DisplayItem::Type_Transform);
proto::TransformDisplayItem* details = proto->mutable_transform_item();
@@ -72,7 +75,9 @@ EndTransformDisplayItem::EndTransformDisplayItem(
EndTransformDisplayItem::~EndTransformDisplayItem() {
}
-void EndTransformDisplayItem::ToProtobuf(proto::DisplayItem* proto) const {
+void EndTransformDisplayItem::ToProtobuf(
+ proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor) const {
proto->set_type(proto::DisplayItem::Type_EndTransform);
}
diff --git a/cc/playback/transform_display_item.h b/cc/playback/transform_display_item.h
index 5b89136..7c1d934 100644
--- a/cc/playback/transform_display_item.h
+++ b/cc/playback/transform_display_item.h
@@ -15,6 +15,7 @@
class SkCanvas;
namespace cc {
+class ImageSerializationProcessor;
class CC_EXPORT TransformDisplayItem : public DisplayItem {
public:
@@ -22,7 +23,9 @@ class CC_EXPORT TransformDisplayItem : public DisplayItem {
explicit TransformDisplayItem(const proto::DisplayItem& proto);
~TransformDisplayItem() override;
- void ToProtobuf(proto::DisplayItem* proto) const override;
+ void ToProtobuf(proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor)
+ const override;
void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override;
@@ -49,7 +52,9 @@ class CC_EXPORT EndTransformDisplayItem : public DisplayItem {
return make_scoped_ptr(new EndTransformDisplayItem());
}
- void ToProtobuf(proto::DisplayItem* proto) const override;
+ void ToProtobuf(proto::DisplayItem* proto,
+ ImageSerializationProcessor* image_serialization_processor)
+ const override;
void Raster(SkCanvas* canvas,
const gfx::Rect& canvas_target_playback_rect,
SkPicture::AbortCallback* callback) const override;
diff --git a/cc/proto/image_serialization_processor.h b/cc/proto/image_serialization_processor.h
new file mode 100644
index 0000000..75b9936
--- /dev/null
+++ b/cc/proto/image_serialization_processor.h
@@ -0,0 +1,30 @@
+// Copyright 2016 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.
+
+#ifndef CC_PROTO_IMAGE_SERIALIZATION_PROCESSOR_H_
+#define CC_PROTO_IMAGE_SERIALIZATION_PROCESSOR_H_
+
+#include "third_party/skia/include/core/SkPicture.h"
+#include "third_party/skia/include/core/SkPixelSerializer.h"
+
+class SkPixelSerializer;
+
+namespace cc {
+
+// ImageSerializationProcessor provides functionality to serialize and
+// deserialize Skia images.
+class ImageSerializationProcessor {
+ public:
+ // The serializer returned from this function can be used to pass in to
+ // SkPicture::serialize(...) for serializing the SkPicture to a stream.
+ virtual SkPixelSerializer* GetPixelSerializer() = 0;
+
+ // Returns a function pointer valid to use for deserializing images when using
+ // SkPicture::CreateFromStream to create an SkPicture from a stream.
+ virtual SkPicture::InstallPixelRefProc GetPixelDeserializer() = 0;
+};
+
+} // namespace cc
+
+#endif // CC_PROTO_IMAGE_SERIALIZATION_PROCESSOR_H_
diff --git a/cc/test/fake_image_serialization_processor.cc b/cc/test/fake_image_serialization_processor.cc
new file mode 100644
index 0000000..c43b3e8
--- /dev/null
+++ b/cc/test/fake_image_serialization_processor.cc
@@ -0,0 +1,32 @@
+// Copyright 2016 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 "cc/test/fake_image_serialization_processor.h"
+
+#include "third_party/skia/include/core/SkPicture.h"
+
+namespace {
+bool NoopDecoder(const void* input, size_t input_size, SkBitmap* bitmap) {
+ return false;
+}
+}
+
+class SkPixelSerializer;
+
+namespace cc {
+
+FakeImageSerializationProcessor::FakeImageSerializationProcessor() {}
+
+FakeImageSerializationProcessor::~FakeImageSerializationProcessor() {}
+
+SkPixelSerializer* FakeImageSerializationProcessor::GetPixelSerializer() {
+ return nullptr;
+}
+
+SkPicture::InstallPixelRefProc
+FakeImageSerializationProcessor::GetPixelDeserializer() {
+ return &NoopDecoder;
+}
+
+} // namespace cc
diff --git a/cc/test/fake_image_serialization_processor.h b/cc/test/fake_image_serialization_processor.h
new file mode 100644
index 0000000..613e93b
--- /dev/null
+++ b/cc/test/fake_image_serialization_processor.h
@@ -0,0 +1,30 @@
+// Copyright 2016 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.
+
+#ifndef CC_TEST_FAKE_IMAGE_SERIALIZATION_PROCESSOR_H_
+#define CC_TEST_FAKE_IMAGE_SERIALIZATION_PROCESSOR_H_
+
+#include "base/macros.h"
+#include "cc/proto/image_serialization_processor.h"
+
+class SkPixelSerializer;
+
+namespace cc {
+
+class FakeImageSerializationProcessor : public ImageSerializationProcessor {
+ public:
+ FakeImageSerializationProcessor();
+ ~FakeImageSerializationProcessor();
+
+ // ImageSerializationProcessor implementation.
+ SkPixelSerializer* GetPixelSerializer() override;
+ SkPicture::InstallPixelRefProc GetPixelDeserializer() override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(FakeImageSerializationProcessor);
+};
+
+} // namespace cc
+
+#endif // CC_TEST_FAKE_IMAGE_SERIALIZATION_PROCESSOR_H_
diff --git a/cc/test/fake_layer_tree_host.cc b/cc/test/fake_layer_tree_host.cc
index 2a8d242..ca054a7 100644
--- a/cc/test/fake_layer_tree_host.cc
+++ b/cc/test/fake_layer_tree_host.cc
@@ -5,6 +5,7 @@
#include "cc/test/fake_layer_tree_host.h"
#include "cc/layers/layer.h"
+#include "cc/test/fake_image_serialization_processor.h"
#include "cc/test/test_task_graph_runner.h"
namespace cc {
@@ -56,6 +57,20 @@ scoped_ptr<FakeLayerTreeHost> FakeLayerTreeHost::Create(
return make_scoped_ptr(new FakeLayerTreeHost(client, &params, mode));
}
+scoped_ptr<FakeLayerTreeHost> FakeLayerTreeHost::Create(
+ FakeLayerTreeHostClient* client,
+ TestTaskGraphRunner* task_graph_runner,
+ const LayerTreeSettings& settings,
+ CompositorMode mode,
+ ImageSerializationProcessor* image_serialization_processor) {
+ LayerTreeHost::InitParams params;
+ params.client = client;
+ params.settings = &settings;
+ params.task_graph_runner = task_graph_runner;
+ params.image_serialization_processor = image_serialization_processor;
+ return make_scoped_ptr(new FakeLayerTreeHost(client, &params, mode));
+}
+
FakeLayerTreeHost::~FakeLayerTreeHost() {
client_->SetLayerTreeHost(NULL);
}
diff --git a/cc/test/fake_layer_tree_host.h b/cc/test/fake_layer_tree_host.h
index b0b9cde..11fe0d2 100644
--- a/cc/test/fake_layer_tree_host.h
+++ b/cc/test/fake_layer_tree_host.h
@@ -15,6 +15,7 @@
#include "cc/trees/tree_synchronizer.h"
namespace cc {
+class ImageSerializationProcessor;
class TestTaskGraphRunner;
class FakeLayerTreeHost : public LayerTreeHost {
@@ -31,7 +32,18 @@ class FakeLayerTreeHost : public LayerTreeHost {
TestTaskGraphRunner* task_graph_runner,
const LayerTreeSettings& settings,
CompositorMode mode);
-
+ static scoped_ptr<FakeLayerTreeHost> Create(
+ FakeLayerTreeHostClient* client,
+ TestTaskGraphRunner* task_graph_runner,
+ const LayerTreeSettings& settings,
+ CompositorMode mode,
+ InitParams params);
+ static scoped_ptr<FakeLayerTreeHost> Create(
+ FakeLayerTreeHostClient* client,
+ TestTaskGraphRunner* task_graph_runner,
+ const LayerTreeSettings& settings,
+ CompositorMode mode,
+ ImageSerializationProcessor* image_serialization_processor);
~FakeLayerTreeHost() override;
const RendererCapabilities& GetRendererCapabilities() const override;
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index b7646a8..ce09a69 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -128,6 +128,7 @@ scoped_ptr<LayerTreeHost> LayerTreeHost::CreateRemoteServer(
// remote mode.
DCHECK(!params->settings->use_external_begin_frame_source);
DCHECK(!params->external_begin_frame_source);
+ DCHECK(params->image_serialization_processor);
scoped_ptr<LayerTreeHost> layer_tree_host(
new LayerTreeHost(params, CompositorMode::REMOTE));
@@ -149,6 +150,7 @@ scoped_ptr<LayerTreeHost> LayerTreeHost::CreateRemoteClient(
// source on the client LayerTreeHost. crbug/576962
DCHECK(!params->settings->use_external_begin_frame_source);
DCHECK(!params->external_begin_frame_source);
+ DCHECK(params->image_serialization_processor);
scoped_ptr<LayerTreeHost> layer_tree_host(
new LayerTreeHost(params, CompositorMode::REMOTE));
@@ -193,6 +195,7 @@ LayerTreeHost::LayerTreeHost(InitParams* params, CompositorMode mode)
shared_bitmap_manager_(params->shared_bitmap_manager),
gpu_memory_buffer_manager_(params->gpu_memory_buffer_manager),
task_graph_runner_(params->task_graph_runner),
+ image_serialization_processor_(params->image_serialization_processor),
surface_id_namespace_(0u),
next_surface_sequence_(1u) {
DCHECK(task_graph_runner_);
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h
index 36807ff..453c75f 100644
--- a/cc/trees/layer_tree_host.h
+++ b/cc/trees/layer_tree_host.h
@@ -58,6 +58,7 @@ class AnimationRegistrar;
class AnimationHost;
class BeginFrameSource;
class HeadsUpDisplayLayer;
+class ImageSerializationProcessor;
class Layer;
class LayerTreeHostImpl;
class LayerTreeHostImplClient;
@@ -92,6 +93,7 @@ class CC_EXPORT LayerTreeHost : public MutatorHostClient {
LayerTreeSettings const* settings = nullptr;
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner;
scoped_ptr<BeginFrameSource> external_begin_frame_source;
+ ImageSerializationProcessor* image_serialization_processor = nullptr;
InitParams();
~InitParams();
@@ -418,6 +420,10 @@ class CC_EXPORT LayerTreeHost : public MutatorHostClient {
bool IsRemoteClient() const;
void BuildPropertyTreesForTesting();
+ ImageSerializationProcessor* image_serialization_processor() const {
+ return image_serialization_processor_;
+ }
+
protected:
LayerTreeHost(InitParams* params, CompositorMode mode);
void InitializeThreaded(
@@ -572,6 +578,8 @@ class CC_EXPORT LayerTreeHost : public MutatorHostClient {
gpu::GpuMemoryBufferManager* gpu_memory_buffer_manager_;
TaskGraphRunner* task_graph_runner_;
+ ImageSerializationProcessor* image_serialization_processor_;
+
std::vector<scoped_ptr<SwapPromise>> swap_promise_list_;
std::set<SwapPromiseMonitor*> swap_promise_monitor_;
diff --git a/cc/trees/layer_tree_host_unittest_remote_server.cc b/cc/trees/layer_tree_host_unittest_remote_server.cc
index d902cfa..9873dca 100644
--- a/cc/trees/layer_tree_host_unittest_remote_server.cc
+++ b/cc/trees/layer_tree_host_unittest_remote_server.cc
@@ -4,7 +4,9 @@
#include "cc/trees/layer_tree_host.h"
+#include "base/memory/scoped_ptr.h"
#include "base/thread_task_runner_handle.h"
+#include "cc/test/fake_image_serialization_processor.h"
#include "cc/test/test_task_graph_runner.h"
#include "cc/trees/layer_tree_host_client.h"
#include "cc/trees/proxy_common.h"
@@ -19,12 +21,16 @@ class LayerTreeHostTestRemoteServer : public testing::Test,
public RemoteProtoChannel,
public LayerTreeHostClient {
public:
- LayerTreeHostTestRemoteServer() : calls_received_(0) {
+ LayerTreeHostTestRemoteServer()
+ : calls_received_(0),
+ image_serialization_processor_(
+ make_scoped_ptr(new FakeImageSerializationProcessor)) {
LayerTreeHost::InitParams params;
params.client = this;
params.task_graph_runner = &task_graph_runner_;
params.settings = &settings_;
params.main_task_runner = base::ThreadTaskRunnerHandle::Get();
+ params.image_serialization_processor = image_serialization_processor_.get();
layer_tree_host_ = LayerTreeHost::CreateRemoteServer(this, &params);
}
@@ -66,6 +72,7 @@ class LayerTreeHostTestRemoteServer : public testing::Test,
LayerTreeSettings settings_;
scoped_ptr<LayerTreeHost> layer_tree_host_;
RemoteProtoChannel::ProtoReceiver* receiver_;
+ scoped_ptr<FakeImageSerializationProcessor> image_serialization_processor_;
private:
DISALLOW_COPY_AND_ASSIGN(LayerTreeHostTestRemoteServer);