summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
Diffstat (limited to 'content')
-rw-r--r--content/common/DEPS1
-rw-r--r--content/common/cc_messages.cc261
-rw-r--r--content/common/cc_messages.h119
-rw-r--r--content/common/cc_messages_unittest.cc431
-rw-r--r--content/content_common.gypi1
-rw-r--r--content/content_tests.gypi1
-rw-r--r--content/public/common/common_param_traits.cc21
-rw-r--r--content/public/common/common_param_traits.h8
8 files changed, 843 insertions, 0 deletions
diff --git a/content/common/DEPS b/content/common/DEPS
index 5a35a26..2d409fc 100644
--- a/content/common/DEPS
+++ b/content/common/DEPS
@@ -1,4 +1,5 @@
include_rules = [
+ "+cc",
"+media/base",
"+sandbox/linux/seccomp-legacy",
]
diff --git a/content/common/cc_messages.cc b/content/common/cc_messages.cc
index a8243f6..6c1c440 100644
--- a/content/common/cc_messages.cc
+++ b/content/common/cc_messages.cc
@@ -309,4 +309,265 @@ void ParamTraits<WebKit::WebTransformationMatrix>::Log(
l->append(") ");
}
+void ParamTraits<cc::RenderPass>::Write(
+ Message* m, const param_type& p) {
+ WriteParam(m, p.id);
+ WriteParam(m, p.output_rect);
+ WriteParam(m, p.damage_rect);
+ WriteParam(m, p.transform_to_root_target);
+ WriteParam(m, p.has_transparent_background);
+ WriteParam(m, p.has_occlusion_from_outside_target_surface);
+ WriteParam(m, p.filters);
+ // TODO(danakj): filter isn't being serialized.
+ WriteParam(m, p.background_filters);
+ WriteParam(m, p.shared_quad_state_list.size());
+ WriteParam(m, p.quad_list.size());
+
+ for (size_t i = 0; i < p.shared_quad_state_list.size(); ++i)
+ WriteParam(m, *p.shared_quad_state_list[i]);
+
+ size_t shared_quad_state_index = 0;
+ for (size_t i = 0; i < p.quad_list.size(); ++i) {
+ const cc::DrawQuad* quad = p.quad_list[i];
+
+ switch (quad->material) {
+ case cc::DrawQuad::CHECKERBOARD:
+ WriteParam(m, *cc::CheckerboardDrawQuad::MaterialCast(quad));
+ break;
+ case cc::DrawQuad::DEBUG_BORDER:
+ WriteParam(m, *cc::DebugBorderDrawQuad::MaterialCast(quad));
+ break;
+ case cc::DrawQuad::IO_SURFACE_CONTENT:
+ WriteParam(m, *cc::IOSurfaceDrawQuad::MaterialCast(quad));
+ break;
+ case cc::DrawQuad::TEXTURE_CONTENT:
+ WriteParam(m, *cc::TextureDrawQuad::MaterialCast(quad));
+ break;
+ case cc::DrawQuad::RENDER_PASS:
+ WriteParam(m, *cc::RenderPassDrawQuad::MaterialCast(quad));
+ break;
+ case cc::DrawQuad::SOLID_COLOR:
+ WriteParam(m, *cc::SolidColorDrawQuad::MaterialCast(quad));
+ break;
+ case cc::DrawQuad::TILED_CONTENT:
+ WriteParam(m, *cc::TileDrawQuad::MaterialCast(quad));
+ break;
+ case cc::DrawQuad::STREAM_VIDEO_CONTENT:
+ WriteParam(m, *cc::StreamVideoDrawQuad::MaterialCast(quad));
+ break;
+ case cc::DrawQuad::YUV_VIDEO_CONTENT:
+ WriteParam(m, *cc::YUVVideoDrawQuad::MaterialCast(quad));
+ break;
+ case cc::DrawQuad::INVALID:
+ break;
+ }
+
+ const cc::ScopedPtrVector<cc::SharedQuadState>& sqs_list =
+ p.shared_quad_state_list;
+
+ // This is an invalid index.
+ size_t bad_index = sqs_list.size();
+
+ // Null shared quad states should not occur.
+ DCHECK(quad->shared_quad_state);
+ if (!quad->shared_quad_state) {
+ WriteParam(m, bad_index);
+ continue;
+ }
+
+ // SharedQuadStates should appear in the order they are used by DrawQuads.
+ // Find the SharedQuadState for this DrawQuad.
+ while (shared_quad_state_index < sqs_list.size() &&
+ quad->shared_quad_state != sqs_list[shared_quad_state_index])
+ ++shared_quad_state_index;
+
+ DCHECK_LT(shared_quad_state_index, sqs_list.size());
+ if (shared_quad_state_index >= sqs_list.size()) {
+ WriteParam(m, bad_index);
+ continue;
+ }
+
+ DCHECK_LT(shared_quad_state_index, p.shared_quad_state_list.size());
+ WriteParam(m, shared_quad_state_index);
+ }
+}
+
+template<typename QuadType>
+static scoped_ptr<cc::DrawQuad> ReadDrawQuad(const Message* m,
+ PickleIterator* iter) {
+ scoped_ptr<QuadType> quad = QuadType::Create();
+ if (!ReadParam(m, iter, quad.get()))
+ return scoped_ptr<QuadType>(NULL).template PassAs<cc::DrawQuad>();
+ return quad.template PassAs<cc::DrawQuad>();
+}
+
+bool ParamTraits<cc::RenderPass>::Read(
+ const Message* m, PickleIterator* iter, param_type* p) {
+ cc::RenderPass::Id id(-1, -1);
+ gfx::Rect output_rect;
+ gfx::RectF damage_rect;
+ WebKit::WebTransformationMatrix transform_to_root_target;
+ bool has_transparent_background;
+ bool has_occlusion_from_outside_target_surface;
+ WebKit::WebFilterOperations filters;
+ WebKit::WebFilterOperations background_filters;
+ size_t shared_quad_state_list_size;
+ size_t quad_list_size;
+
+ if (!ReadParam(m, iter, &id) ||
+ !ReadParam(m, iter, &output_rect) ||
+ !ReadParam(m, iter, &damage_rect) ||
+ !ReadParam(m, iter, &transform_to_root_target) ||
+ !ReadParam(m, iter, &has_transparent_background) ||
+ !ReadParam(m, iter, &has_occlusion_from_outside_target_surface) ||
+ !ReadParam(m, iter, &filters) ||
+ !ReadParam(m, iter, &background_filters) ||
+ !ReadParam(m, iter, &shared_quad_state_list_size) ||
+ !ReadParam(m, iter, &quad_list_size))
+ return false;
+
+ p->SetAll(id,
+ output_rect,
+ damage_rect,
+ transform_to_root_target,
+ has_transparent_background,
+ has_occlusion_from_outside_target_surface,
+ filters,
+ NULL, // TODO(danakj): filter isn't being serialized.
+ background_filters);
+
+ for (size_t i = 0; i < shared_quad_state_list_size; ++i) {
+ scoped_ptr<cc::SharedQuadState> state(cc::SharedQuadState::Create());
+ if (!ReadParam(m, iter, state.get()))
+ return false;
+ p->shared_quad_state_list.append(state.Pass());
+ }
+
+ size_t last_shared_quad_state_index = 0;
+ for (size_t i = 0; i < quad_list_size; ++i) {
+ cc::DrawQuad::Material material;
+ PickleIterator temp_iter = *iter;
+ if (!ReadParam(m, &temp_iter, &material))
+ return false;
+
+ scoped_ptr<cc::DrawQuad> draw_quad;
+ switch (material) {
+ case cc::DrawQuad::CHECKERBOARD:
+ draw_quad = ReadDrawQuad<cc::CheckerboardDrawQuad>(m, iter);
+ break;
+ case cc::DrawQuad::DEBUG_BORDER:
+ draw_quad = ReadDrawQuad<cc::DebugBorderDrawQuad>(m, iter);
+ break;
+ case cc::DrawQuad::IO_SURFACE_CONTENT:
+ draw_quad = ReadDrawQuad<cc::IOSurfaceDrawQuad>(m, iter);
+ break;
+ case cc::DrawQuad::TEXTURE_CONTENT:
+ draw_quad = ReadDrawQuad<cc::TextureDrawQuad>(m, iter);
+ break;
+ case cc::DrawQuad::RENDER_PASS:
+ draw_quad = ReadDrawQuad<cc::RenderPassDrawQuad>(m, iter);
+ break;
+ case cc::DrawQuad::SOLID_COLOR:
+ draw_quad = ReadDrawQuad<cc::SolidColorDrawQuad>(m, iter);
+ break;
+ case cc::DrawQuad::TILED_CONTENT:
+ draw_quad = ReadDrawQuad<cc::TileDrawQuad>(m, iter);
+ break;
+ case cc::DrawQuad::STREAM_VIDEO_CONTENT:
+ draw_quad = ReadDrawQuad<cc::StreamVideoDrawQuad>(m, iter);
+ break;
+ case cc::DrawQuad::YUV_VIDEO_CONTENT:
+ draw_quad = ReadDrawQuad<cc::YUVVideoDrawQuad>(m, iter);
+ break;
+ case cc::DrawQuad::INVALID:
+ break;
+ }
+ if (!draw_quad)
+ return false;
+
+ size_t shared_quad_state_index;
+ if (!ReadParam(m, iter, &shared_quad_state_index) ||
+ shared_quad_state_index >= p->shared_quad_state_list.size())
+ return false;
+ // SharedQuadState indexes should be in ascending order.
+ if (shared_quad_state_index < last_shared_quad_state_index)
+ return false;
+ last_shared_quad_state_index = shared_quad_state_index;
+
+ draw_quad->shared_quad_state =
+ p->shared_quad_state_list[shared_quad_state_index];
+
+ p->quad_list.append(draw_quad.Pass());
+ }
+
+ return true;
+}
+
+void ParamTraits<cc::RenderPass>::Log(
+ const param_type& p, std::string* l) {
+ l->append("RenderPass((");
+ LogParam(p.id, l);
+ l->append("), ");
+ LogParam(p.output_rect, l);
+ l->append(", ");
+ LogParam(p.damage_rect, l);
+ l->append(", ");
+ LogParam(p.transform_to_root_target, l);
+ l->append(", ");
+ LogParam(p.has_transparent_background, l);
+ l->append(", ");
+ LogParam(p.has_occlusion_from_outside_target_surface, l);
+ l->append(", ");
+ LogParam(p.filters, l);
+ l->append(", ");
+ // TODO(danakj): filter isn't being serialized.
+ LogParam(p.background_filters, l);
+ l->append(", ");
+
+ l->append("[");
+ for (size_t i = 0; i < p.shared_quad_state_list.size(); ++i) {
+ if (i)
+ l->append(", ");
+ LogParam(*p.shared_quad_state_list[i], l);
+ }
+ l->append("], [");
+ for (size_t i = 0; i < p.quad_list.size(); ++i) {
+ if (i)
+ l->append(", ");
+ const cc::DrawQuad* quad = p.quad_list[i];
+ switch (quad->material) {
+ case cc::DrawQuad::CHECKERBOARD:
+ LogParam(*cc::CheckerboardDrawQuad::MaterialCast(quad), l);
+ break;
+ case cc::DrawQuad::DEBUG_BORDER:
+ LogParam(*cc::DebugBorderDrawQuad::MaterialCast(quad), l);
+ break;
+ case cc::DrawQuad::IO_SURFACE_CONTENT:
+ LogParam(*cc::IOSurfaceDrawQuad::MaterialCast(quad), l);
+ break;
+ case cc::DrawQuad::TEXTURE_CONTENT:
+ LogParam(*cc::TextureDrawQuad::MaterialCast(quad), l);
+ break;
+ case cc::DrawQuad::RENDER_PASS:
+ LogParam(*cc::RenderPassDrawQuad::MaterialCast(quad), l);
+ break;
+ case cc::DrawQuad::SOLID_COLOR:
+ LogParam(*cc::SolidColorDrawQuad::MaterialCast(quad), l);
+ break;
+ case cc::DrawQuad::TILED_CONTENT:
+ LogParam(*cc::TileDrawQuad::MaterialCast(quad), l);
+ break;
+ case cc::DrawQuad::STREAM_VIDEO_CONTENT:
+ LogParam(*cc::StreamVideoDrawQuad::MaterialCast(quad), l);
+ break;
+ case cc::DrawQuad::YUV_VIDEO_CONTENT:
+ LogParam(*cc::YUVVideoDrawQuad::MaterialCast(quad), l);
+ break;
+ case cc::DrawQuad::INVALID:
+ break;
+ }
+ }
+ l->append("])");
+}
+
} // namespace IPC
diff --git a/content/common/cc_messages.h b/content/common/cc_messages.h
index 4e5d337..b896a2f 100644
--- a/content/common/cc_messages.h
+++ b/content/common/cc_messages.h
@@ -4,6 +4,19 @@
//
// IPC Messages sent between compositor instances.
+#include "cc/checkerboard_draw_quad.h"
+#include "cc/debug_border_draw_quad.h"
+#include "cc/draw_quad.h"
+#include "cc/io_surface_draw_quad.h"
+#include "cc/render_pass.h"
+#include "cc/render_pass_draw_quad.h"
+#include "cc/shared_quad_state.h"
+#include "cc/solid_color_draw_quad.h"
+#include "cc/stream_video_draw_quad.h"
+#include "cc/texture_draw_quad.h"
+#include "cc/tile_draw_quad.h"
+#include "cc/video_layer_impl.h"
+#include "cc/yuv_video_draw_quad.h"
#include "content/common/content_export.h"
#include "ipc/ipc_message_macros.h"
#include "third_party/WebKit/Source/Platform/chromium/public/WebFilterOperation.h"
@@ -51,6 +64,14 @@ struct ParamTraits<WebKit::WebTransformationMatrix> {
static void Log(const param_type& p, std::string* l);
};
+template <>
+struct CONTENT_EXPORT ParamTraits<cc::RenderPass> {
+ typedef cc::RenderPass param_type;
+ static void Write(Message* m, const param_type& p);
+ static bool Read(const Message* m, PickleIterator* iter, param_type* r);
+ static void Log(const param_type& p, std::string* l);
+};
+
} // namespace IPC
#endif // CONTENT_COMMON_CC_MESSAGES_H_
@@ -61,4 +82,102 @@ struct ParamTraits<WebKit::WebTransformationMatrix> {
#undef IPC_MESSAGE_EXPORT
#define IPC_MESSAGE_EXPORT CONTENT_EXPORT
+IPC_ENUM_TRAITS(cc::DrawQuad::Material)
+IPC_ENUM_TRAITS(cc::IOSurfaceDrawQuad::Orientation)
IPC_ENUM_TRAITS(WebKit::WebFilterOperation::FilterType)
+
+IPC_STRUCT_TRAITS_BEGIN(cc::RenderPass::Id)
+ IPC_STRUCT_TRAITS_MEMBER(layer_id)
+ IPC_STRUCT_TRAITS_MEMBER(index)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::VideoLayerImpl::FramePlane)
+ IPC_STRUCT_TRAITS_MEMBER(resourceId)
+ IPC_STRUCT_TRAITS_MEMBER(size)
+ IPC_STRUCT_TRAITS_MEMBER(format)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::DrawQuad)
+ IPC_STRUCT_TRAITS_MEMBER(material)
+ IPC_STRUCT_TRAITS_MEMBER(rect)
+ IPC_STRUCT_TRAITS_MEMBER(opaque_rect)
+ IPC_STRUCT_TRAITS_MEMBER(visible_rect)
+ IPC_STRUCT_TRAITS_MEMBER(needs_blending)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::CheckerboardDrawQuad)
+ IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+ IPC_STRUCT_TRAITS_MEMBER(color)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::DebugBorderDrawQuad)
+ IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+ IPC_STRUCT_TRAITS_MEMBER(color)
+ IPC_STRUCT_TRAITS_MEMBER(width)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::IOSurfaceDrawQuad)
+ IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+ IPC_STRUCT_TRAITS_MEMBER(io_surface_size)
+ IPC_STRUCT_TRAITS_MEMBER(io_surface_texture_id)
+ IPC_STRUCT_TRAITS_MEMBER(orientation)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::RenderPassDrawQuad)
+ IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+ IPC_STRUCT_TRAITS_MEMBER(is_replica)
+ IPC_STRUCT_TRAITS_MEMBER(mask_resource_id)
+ IPC_STRUCT_TRAITS_MEMBER(contents_changed_since_last_frame)
+ IPC_STRUCT_TRAITS_MEMBER(mask_tex_coord_scale_x)
+ IPC_STRUCT_TRAITS_MEMBER(mask_tex_coord_scale_y)
+ IPC_STRUCT_TRAITS_MEMBER(mask_tex_coord_offset_x)
+ IPC_STRUCT_TRAITS_MEMBER(mask_tex_coord_offset_y)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::SolidColorDrawQuad)
+ IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+ IPC_STRUCT_TRAITS_MEMBER(color)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::StreamVideoDrawQuad)
+ IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+ IPC_STRUCT_TRAITS_MEMBER(texture_id)
+ IPC_STRUCT_TRAITS_MEMBER(matrix)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::TextureDrawQuad)
+ IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+ IPC_STRUCT_TRAITS_MEMBER(resource_id)
+ IPC_STRUCT_TRAITS_MEMBER(premultiplied_alpha)
+ IPC_STRUCT_TRAITS_MEMBER(uv_rect)
+ IPC_STRUCT_TRAITS_MEMBER(flipped)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::TileDrawQuad)
+ IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+ IPC_STRUCT_TRAITS_MEMBER(resource_id)
+ IPC_STRUCT_TRAITS_MEMBER(tex_coord_rect)
+ IPC_STRUCT_TRAITS_MEMBER(texture_size)
+ IPC_STRUCT_TRAITS_MEMBER(swizzle_contents)
+ IPC_STRUCT_TRAITS_MEMBER(left_edge_aa)
+ IPC_STRUCT_TRAITS_MEMBER(top_edge_aa)
+ IPC_STRUCT_TRAITS_MEMBER(right_edge_aa)
+ IPC_STRUCT_TRAITS_MEMBER(bottom_edge_aa)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::YUVVideoDrawQuad)
+ IPC_STRUCT_TRAITS_PARENT(cc::DrawQuad)
+ IPC_STRUCT_TRAITS_MEMBER(tex_scale)
+ IPC_STRUCT_TRAITS_MEMBER(y_plane)
+ IPC_STRUCT_TRAITS_MEMBER(u_plane)
+ IPC_STRUCT_TRAITS_MEMBER(v_plane)
+IPC_STRUCT_TRAITS_END()
+
+IPC_STRUCT_TRAITS_BEGIN(cc::SharedQuadState)
+ IPC_STRUCT_TRAITS_MEMBER(content_to_target_transform)
+ IPC_STRUCT_TRAITS_MEMBER(visible_content_rect)
+ IPC_STRUCT_TRAITS_MEMBER(clipped_rect_in_target)
+ IPC_STRUCT_TRAITS_MEMBER(clip_rect)
+ IPC_STRUCT_TRAITS_MEMBER(is_clipped)
+ IPC_STRUCT_TRAITS_MEMBER(opacity)
+IPC_STRUCT_TRAITS_END()
diff --git a/content/common/cc_messages_unittest.cc b/content/common/cc_messages_unittest.cc
new file mode 100644
index 0000000..7225b68
--- /dev/null
+++ b/content/common/cc_messages_unittest.cc
@@ -0,0 +1,431 @@
+// Copyright (c) 2012 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/common/cc_messages.h"
+
+#include <string.h>
+
+#include "ipc/ipc_message.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using cc::CheckerboardDrawQuad;
+using cc::DebugBorderDrawQuad;
+using cc::DrawQuad;
+using cc::IOSurfaceDrawQuad;
+using cc::RenderPass;
+using cc::RenderPassDrawQuad;
+using cc::ResourceProvider;
+using cc::SharedQuadState;
+using cc::SolidColorDrawQuad;
+using cc::TextureDrawQuad;
+using cc::TileDrawQuad;
+using cc::StreamVideoDrawQuad;
+using cc::VideoLayerImpl;
+using cc::YUVVideoDrawQuad;
+using WebKit::WebFilterOperation;
+using WebKit::WebFilterOperations;
+using WebKit::WebTransformationMatrix;
+
+class CCMessagesTest : public testing::Test {
+ protected:
+ void Compare(const RenderPass* a, const RenderPass* b) {
+ EXPECT_EQ(a->id, b->id);
+ EXPECT_EQ(a->output_rect.ToString(), b->output_rect.ToString());
+ EXPECT_EQ(a->damage_rect.ToString(), b->damage_rect.ToString());
+ EXPECT_EQ(a->transform_to_root_target, b->transform_to_root_target);
+ EXPECT_EQ(a->has_transparent_background, b->has_transparent_background);
+ EXPECT_EQ(a->has_occlusion_from_outside_target_surface,
+ b->has_occlusion_from_outside_target_surface);
+ EXPECT_EQ(a->filters, b->filters);
+ EXPECT_EQ(a->filter, b->filter);
+ EXPECT_EQ(a->background_filters, b->background_filters);
+ }
+
+ void Compare(const SharedQuadState* a, const SharedQuadState* b) {
+ EXPECT_EQ(a->content_to_target_transform, b->content_to_target_transform);
+ EXPECT_EQ(a->visible_content_rect, b->visible_content_rect);
+ EXPECT_EQ(a->clipped_rect_in_target, b->clipped_rect_in_target);
+ EXPECT_EQ(a->clip_rect, b->clip_rect);
+ EXPECT_EQ(a->is_clipped, b->is_clipped);
+ EXPECT_EQ(a->opacity, b->opacity);
+ }
+
+ void Compare(const DrawQuad* a, const DrawQuad* b) {
+ ASSERT_NE(DrawQuad::INVALID, a->material);
+ ASSERT_EQ(a->material, b->material);
+ EXPECT_EQ(a->rect.ToString(), b->rect.ToString());
+ EXPECT_EQ(a->opaque_rect.ToString(), b->opaque_rect.ToString());
+ EXPECT_EQ(a->visible_rect.ToString(), b->visible_rect.ToString());
+ EXPECT_EQ(a->needs_blending, b->needs_blending);
+
+ Compare(a->shared_quad_state, b->shared_quad_state);
+
+ switch (a->material) {
+ case DrawQuad::CHECKERBOARD:
+ Compare(CheckerboardDrawQuad::MaterialCast(a),
+ CheckerboardDrawQuad::MaterialCast(b));
+ break;
+ case DrawQuad::DEBUG_BORDER:
+ Compare(DebugBorderDrawQuad::MaterialCast(a),
+ DebugBorderDrawQuad::MaterialCast(b));
+ break;
+ case DrawQuad::IO_SURFACE_CONTENT:
+ Compare(IOSurfaceDrawQuad::MaterialCast(a),
+ IOSurfaceDrawQuad::MaterialCast(b));
+ break;
+ case DrawQuad::RENDER_PASS:
+ Compare(RenderPassDrawQuad::MaterialCast(a),
+ RenderPassDrawQuad::MaterialCast(b));
+ break;
+ case DrawQuad::TEXTURE_CONTENT:
+ Compare(TextureDrawQuad::MaterialCast(a),
+ TextureDrawQuad::MaterialCast(b));
+ break;
+ case DrawQuad::TILED_CONTENT:
+ Compare(TileDrawQuad::MaterialCast(a),
+ TileDrawQuad::MaterialCast(b));
+ break;
+ case DrawQuad::SOLID_COLOR:
+ Compare(SolidColorDrawQuad::MaterialCast(a),
+ SolidColorDrawQuad::MaterialCast(b));
+ break;
+ case DrawQuad::STREAM_VIDEO_CONTENT:
+ Compare(StreamVideoDrawQuad::MaterialCast(a),
+ StreamVideoDrawQuad::MaterialCast(b));
+ break;
+ case DrawQuad::YUV_VIDEO_CONTENT:
+ Compare(YUVVideoDrawQuad::MaterialCast(a),
+ YUVVideoDrawQuad::MaterialCast(b));
+ break;
+ case DrawQuad::INVALID:
+ break;
+ }
+ }
+
+ void Compare(const CheckerboardDrawQuad* a, const CheckerboardDrawQuad* b) {
+ EXPECT_EQ(a->color, b->color);
+ }
+
+ void Compare(const DebugBorderDrawQuad* a, const DebugBorderDrawQuad* b) {
+ EXPECT_EQ(a->color, b->color);
+ EXPECT_EQ(a->width, b->width);
+ }
+
+ void Compare(const IOSurfaceDrawQuad* a, const IOSurfaceDrawQuad* b) {
+ EXPECT_EQ(a->io_surface_size.ToString(), b->io_surface_size.ToString());
+ EXPECT_EQ(a->io_surface_texture_id, b->io_surface_texture_id);
+ EXPECT_EQ(a->orientation, b->orientation);
+ }
+
+ void Compare(const RenderPassDrawQuad* a, const RenderPassDrawQuad* b) {
+ EXPECT_EQ(a->is_replica, b->is_replica);
+ EXPECT_EQ(a->mask_resource_id, b->mask_resource_id);
+ EXPECT_EQ(a->contents_changed_since_last_frame,
+ b->contents_changed_since_last_frame);
+ EXPECT_EQ(a->mask_tex_coord_scale_x, b->mask_tex_coord_scale_x);
+ EXPECT_EQ(a->mask_tex_coord_scale_y, b->mask_tex_coord_scale_y);
+ EXPECT_EQ(a->mask_tex_coord_offset_x, b->mask_tex_coord_offset_x);
+ EXPECT_EQ(a->mask_tex_coord_offset_y, b->mask_tex_coord_offset_y);
+ }
+
+ void Compare(const SolidColorDrawQuad* a, const SolidColorDrawQuad* b) {
+ EXPECT_EQ(a->color, b->color);
+ }
+
+ void Compare(const StreamVideoDrawQuad* a, const StreamVideoDrawQuad* b) {
+ EXPECT_EQ(a->texture_id, b->texture_id);
+ EXPECT_EQ(a->matrix, b->matrix);
+ }
+
+ void Compare(const TextureDrawQuad* a, const TextureDrawQuad* b) {
+ EXPECT_EQ(a->resource_id, b->resource_id);
+ EXPECT_EQ(a->premultiplied_alpha, b->premultiplied_alpha);
+ EXPECT_EQ(a->uv_rect, b->uv_rect);
+ EXPECT_EQ(a->flipped, b->flipped);
+ }
+
+ void Compare(const TileDrawQuad* a, const TileDrawQuad* b) {
+ EXPECT_EQ(a->resource_id, b->resource_id);
+ EXPECT_EQ(a->tex_coord_rect, b->tex_coord_rect);
+ EXPECT_EQ(a->texture_size, b->texture_size);
+ EXPECT_EQ(a->swizzle_contents, b->swizzle_contents);
+ EXPECT_EQ(a->left_edge_aa, b->left_edge_aa);
+ EXPECT_EQ(a->top_edge_aa, b->top_edge_aa);
+ EXPECT_EQ(a->right_edge_aa, b->right_edge_aa);
+ EXPECT_EQ(a->bottom_edge_aa, b->bottom_edge_aa);
+ }
+
+ void Compare(const YUVVideoDrawQuad* a, const YUVVideoDrawQuad* b) {
+ EXPECT_EQ(a->tex_scale, b->tex_scale);
+ EXPECT_EQ(a->y_plane.resourceId, b->y_plane.resourceId);
+ EXPECT_EQ(a->y_plane.size.ToString(), b->y_plane.size.ToString());
+ EXPECT_EQ(a->y_plane.format, b->y_plane.format);
+ EXPECT_EQ(a->u_plane.resourceId, b->u_plane.resourceId);
+ EXPECT_EQ(a->u_plane.size.ToString(), b->u_plane.size.ToString());
+ EXPECT_EQ(a->u_plane.format, b->u_plane.format);
+ EXPECT_EQ(a->v_plane.resourceId, b->v_plane.resourceId);
+ EXPECT_EQ(a->v_plane.size.ToString(), b->v_plane.size.ToString());
+ EXPECT_EQ(a->v_plane.format, b->v_plane.format);
+ }
+};
+
+TEST_F(CCMessagesTest, AllQuads) {
+ IPC::Message msg(1, 2, IPC::Message::PRIORITY_NORMAL);
+
+ WebTransformationMatrix arbitrary_matrix;
+ arbitrary_matrix.scale(3);
+ arbitrary_matrix.translate(-5, 20);
+ arbitrary_matrix.rotate(15);
+ gfx::Rect arbitrary_rect1(-5, 9, 3, 15);
+ gfx::Rect arbitrary_rect2(40, 23, 11, 7);
+ gfx::Rect arbitrary_rect3(7, -53, 22, 19);
+ gfx::Size arbitrary_size1(15, 19);
+ gfx::Size arbitrary_size2(3, 99);
+ gfx::Size arbitrary_size3(75, 1281);
+ gfx::RectF arbitrary_rectf1(4.2f, -922.1f, 15.6f, 29.5f);
+ gfx::SizeF arbitrary_sizef1(15.2f, 104.6f);
+ float arbitrary_float1 = 0.7f;
+ float arbitrary_float2 = 0.3f;
+ float arbitrary_float3 = 0.9f;
+ float arbitrary_float4 = 0.1f;
+ bool arbitrary_bool1 = true;
+ bool arbitrary_bool2 = false;
+ int arbitrary_int = 5;
+ SkColor arbitrary_color = SkColorSetARGB(25, 36, 47, 58);
+ IOSurfaceDrawQuad::Orientation arbitrary_orientation =
+ IOSurfaceDrawQuad::UNFLIPPED;
+ RenderPass::Id arbitrary_id(10, 14);
+ ResourceProvider::ResourceId arbitrary_resourceid = 55;
+
+ VideoLayerImpl::FramePlane arbitrary_plane1;
+ arbitrary_plane1.resourceId = arbitrary_resourceid;
+ arbitrary_plane1.size = arbitrary_size1;
+ arbitrary_plane1.format = arbitrary_int;
+
+ VideoLayerImpl::FramePlane arbitrary_plane2;
+ arbitrary_plane2.resourceId = arbitrary_resourceid;
+ arbitrary_plane2.size = arbitrary_size2;
+ arbitrary_plane2.format = arbitrary_int;
+
+ VideoLayerImpl::FramePlane arbitrary_plane3;
+ arbitrary_plane3.resourceId = arbitrary_resourceid;
+ arbitrary_plane3.size = arbitrary_size3;
+ arbitrary_plane3.format = arbitrary_int;
+
+ WebFilterOperations arbitrary_filters1;
+ arbitrary_filters1.append(WebFilterOperation::createGrayscaleFilter(
+ arbitrary_float1));
+
+ WebFilterOperations arbitrary_filters2;
+ arbitrary_filters2.append(WebFilterOperation::createBrightnessFilter(
+ arbitrary_float2));
+
+ scoped_ptr<SharedQuadState> shared_state1_in = SharedQuadState::Create();
+ shared_state1_in->SetAll(arbitrary_matrix,
+ arbitrary_rect1,
+ arbitrary_rect2,
+ arbitrary_rect3,
+ arbitrary_bool1,
+ arbitrary_float1);
+ scoped_ptr<SharedQuadState> shared_state1_cmp = shared_state1_in->Copy();
+
+ scoped_ptr<CheckerboardDrawQuad> checkerboard_in =
+ CheckerboardDrawQuad::Create();
+ checkerboard_in->SetAll(shared_state1_in.get(),
+ arbitrary_rect1,
+ arbitrary_rect2,
+ arbitrary_rect3,
+ arbitrary_bool1,
+ arbitrary_color);
+ scoped_ptr<DrawQuad> checkerboard_cmp = checkerboard_in->Copy(
+ checkerboard_in->shared_quad_state);
+
+ scoped_ptr<DebugBorderDrawQuad> debugborder_in =
+ DebugBorderDrawQuad::Create();
+ debugborder_in->SetAll(shared_state1_in.get(),
+ arbitrary_rect3,
+ arbitrary_rect1,
+ arbitrary_rect2,
+ arbitrary_bool1,
+ arbitrary_color,
+ arbitrary_int);
+ scoped_ptr<DrawQuad> debugborder_cmp = debugborder_in->Copy(
+ debugborder_in->shared_quad_state);
+
+ scoped_ptr<IOSurfaceDrawQuad> iosurface_in =
+ IOSurfaceDrawQuad::Create();
+ iosurface_in->SetAll(shared_state1_in.get(),
+ arbitrary_rect2,
+ arbitrary_rect3,
+ arbitrary_rect1,
+ arbitrary_bool1,
+ arbitrary_size1,
+ arbitrary_int,
+ arbitrary_orientation);
+ scoped_ptr<DrawQuad> iosurface_cmp = iosurface_in->Copy(
+ iosurface_in->shared_quad_state);
+
+ scoped_ptr<RenderPassDrawQuad> renderpass_in =
+ RenderPassDrawQuad::Create();
+ renderpass_in->SetAll(shared_state1_in.get(),
+ arbitrary_rect1,
+ arbitrary_rect2,
+ arbitrary_rect3,
+ arbitrary_bool1,
+ arbitrary_id,
+ arbitrary_bool2,
+ arbitrary_resourceid,
+ arbitrary_rect1,
+ arbitrary_float1,
+ arbitrary_float2,
+ arbitrary_float3,
+ arbitrary_float4);
+ scoped_ptr<RenderPassDrawQuad> renderpass_cmp = renderpass_in->Copy(
+ renderpass_in->shared_quad_state, renderpass_in->render_pass_id);
+
+ scoped_ptr<SharedQuadState> shared_state2_in = SharedQuadState::Create();
+ shared_state2_in->SetAll(arbitrary_matrix,
+ arbitrary_rect2,
+ arbitrary_rect3,
+ arbitrary_rect1,
+ arbitrary_bool1,
+ arbitrary_float2);
+ scoped_ptr<SharedQuadState> shared_state2_cmp = shared_state2_in->Copy();
+
+ scoped_ptr<SharedQuadState> shared_state3_in = SharedQuadState::Create();
+ shared_state3_in->SetAll(arbitrary_matrix,
+ arbitrary_rect3,
+ arbitrary_rect1,
+ arbitrary_rect2,
+ arbitrary_bool1,
+ arbitrary_float3);
+ scoped_ptr<SharedQuadState> shared_state3_cmp = shared_state3_in->Copy();
+
+ scoped_ptr<SolidColorDrawQuad> solidcolor_in =
+ SolidColorDrawQuad::Create();
+ solidcolor_in->SetAll(shared_state1_in.get(),
+ arbitrary_rect3,
+ arbitrary_rect1,
+ arbitrary_rect2,
+ arbitrary_bool1,
+ arbitrary_color);
+ scoped_ptr<DrawQuad> solidcolor_cmp = solidcolor_in->Copy(
+ solidcolor_in->shared_quad_state);
+
+ scoped_ptr<StreamVideoDrawQuad> streamvideo_in =
+ StreamVideoDrawQuad::Create();
+ streamvideo_in->SetAll(shared_state1_in.get(),
+ arbitrary_rect2,
+ arbitrary_rect3,
+ arbitrary_rect1,
+ arbitrary_bool1,
+ arbitrary_int,
+ arbitrary_matrix);
+ scoped_ptr<DrawQuad> streamvideo_cmp = streamvideo_in->Copy(
+ streamvideo_in->shared_quad_state);
+
+ scoped_ptr<YUVVideoDrawQuad> yuvvideo_in =
+ YUVVideoDrawQuad::Create();
+ yuvvideo_in->SetAll(shared_state1_in.get(),
+ arbitrary_rect1,
+ arbitrary_rect2,
+ arbitrary_rect3,
+ arbitrary_bool1,
+ arbitrary_sizef1,
+ arbitrary_plane1,
+ arbitrary_plane2,
+ arbitrary_plane3);
+ scoped_ptr<DrawQuad> yuvvideo_cmp = yuvvideo_in->Copy(
+ yuvvideo_in->shared_quad_state);
+
+ scoped_ptr<RenderPass> pass_in = RenderPass::Create();
+ pass_in->SetAll(arbitrary_id,
+ arbitrary_rect1,
+ arbitrary_rectf1,
+ arbitrary_matrix,
+ arbitrary_bool1,
+ arbitrary_bool2,
+ arbitrary_filters1,
+ NULL, // TODO(danakj): filter is not serialized.
+ arbitrary_filters2);
+
+ pass_in->shared_quad_state_list.append(shared_state1_in.Pass());
+ pass_in->quad_list.append(checkerboard_in.PassAs<DrawQuad>());
+ pass_in->quad_list.append(debugborder_in.PassAs<DrawQuad>());
+ pass_in->quad_list.append(iosurface_in.PassAs<DrawQuad>());
+ pass_in->quad_list.append(renderpass_in.PassAs<DrawQuad>());
+ pass_in->shared_quad_state_list.append(shared_state2_in.Pass());
+ pass_in->shared_quad_state_list.append(shared_state3_in.Pass());
+ pass_in->quad_list.append(solidcolor_in.PassAs<DrawQuad>());
+ pass_in->quad_list.append(streamvideo_in.PassAs<DrawQuad>());
+ pass_in->quad_list.append(yuvvideo_in.PassAs<DrawQuad>());
+
+ scoped_ptr<RenderPass> pass_cmp = RenderPass::Create();
+ pass_cmp->SetAll(arbitrary_id,
+ arbitrary_rect1,
+ arbitrary_rectf1,
+ arbitrary_matrix,
+ arbitrary_bool1,
+ arbitrary_bool2,
+ arbitrary_filters1,
+ NULL, // TODO(danakj): filter is not serialized.
+ arbitrary_filters2);
+
+ pass_cmp->shared_quad_state_list.append(shared_state1_cmp.Pass());
+ pass_cmp->quad_list.append(checkerboard_cmp.PassAs<DrawQuad>());
+ pass_cmp->quad_list.append(debugborder_cmp.PassAs<DrawQuad>());
+ pass_cmp->quad_list.append(iosurface_cmp.PassAs<DrawQuad>());
+ pass_cmp->quad_list.append(renderpass_cmp.PassAs<DrawQuad>());
+ pass_cmp->shared_quad_state_list.append(shared_state2_cmp.Pass());
+ pass_cmp->shared_quad_state_list.append(shared_state3_cmp.Pass());
+ pass_cmp->quad_list.append(solidcolor_cmp.PassAs<DrawQuad>());
+ pass_cmp->quad_list.append(streamvideo_cmp.PassAs<DrawQuad>());
+ pass_cmp->quad_list.append(yuvvideo_cmp.PassAs<DrawQuad>());
+
+ // Make sure the in and cmp RenderPasses match.
+ Compare(pass_cmp.get(), pass_in.get());
+ ASSERT_EQ(3u, pass_in->shared_quad_state_list.size());
+ ASSERT_EQ(7u, pass_in->quad_list.size());
+ for (size_t i = 0; i < 3; ++i) {
+ Compare(pass_cmp->shared_quad_state_list[i],
+ pass_in->shared_quad_state_list[i]);
+ }
+ for (size_t i = 0; i < 7; ++i)
+ Compare(pass_cmp->quad_list[i], pass_in->quad_list[i]);
+ for (size_t i = 1; i < 7; ++i) {
+ bool same_shared_quad_state_cmp =
+ pass_cmp->quad_list[i]->shared_quad_state ==
+ pass_cmp->quad_list[i - 1]->shared_quad_state;
+ bool same_shared_quad_state_in =
+ pass_in->quad_list[i]->shared_quad_state ==
+ pass_in->quad_list[i - 1]->shared_quad_state;
+ EXPECT_EQ(same_shared_quad_state_cmp, same_shared_quad_state_in);
+ }
+
+ IPC::ParamTraits<RenderPass>::Write(&msg, *pass_in);
+
+ scoped_ptr<RenderPass> pass_out = RenderPass::Create();
+ PickleIterator iter(msg);
+ EXPECT_TRUE(IPC::ParamTraits<RenderPass>::Read(&msg, &iter, pass_out.get()));
+
+ // Make sure the out and cmp RenderPasses match.
+ Compare(pass_cmp.get(), pass_out.get());
+ ASSERT_EQ(3u, pass_out->shared_quad_state_list.size());
+ ASSERT_EQ(7u, pass_out->quad_list.size());
+ for (size_t i = 0; i < 3; ++i) {
+ Compare(pass_cmp->shared_quad_state_list[i],
+ pass_out->shared_quad_state_list[i]);
+ }
+ for (size_t i = 0; i < 7; ++i)
+ Compare(pass_cmp->quad_list[i], pass_out->quad_list[i]);
+ for (size_t i = 1; i < 7; ++i) {
+ bool same_shared_quad_state_cmp =
+ pass_cmp->quad_list[i]->shared_quad_state ==
+ pass_cmp->quad_list[i - 1]->shared_quad_state;
+ bool same_shared_quad_state_out =
+ pass_out->quad_list[i]->shared_quad_state ==
+ pass_out->quad_list[i - 1]->shared_quad_state;
+ EXPECT_EQ(same_shared_quad_state_cmp, same_shared_quad_state_out);
+ }
+}
diff --git a/content/content_common.gypi b/content/content_common.gypi
index 8d46684..40427d5 100644
--- a/content/content_common.gypi
+++ b/content/content_common.gypi
@@ -409,6 +409,7 @@
],
}, { # OS!="ios"
'dependencies': [
+ '../cc/cc.gyp:cc',
'../gpu/gpu.gyp:gles2_implementation',
'../gpu/gpu.gyp:gpu_ipc',
'../ipc/ipc.gyp:ipc',
diff --git a/content/content_tests.gypi b/content/content_tests.gypi
index 1ce3c41..4a5438b 100644
--- a/content/content_tests.gypi
+++ b/content/content_tests.gypi
@@ -339,6 +339,7 @@
'browser/web_contents/web_drag_source_mac_unittest.mm',
'browser/webui/web_ui_message_handler_unittest.cc',
'common/android/address_parser_unittest.cc',
+ 'common/cc_messages_unittest.cc',
'common/mac/attributed_string_coder_unittest.mm',
'common/mac/font_descriptor_unittest.mm',
'common/gpu/gpu_info_unittest.cc',
diff --git a/content/public/common/common_param_traits.cc b/content/public/common/common_param_traits.cc
index 7a0200a..2b37363 100644
--- a/content/public/common/common_param_traits.cc
+++ b/content/public/common/common_param_traits.cc
@@ -151,6 +151,27 @@ void ParamTraits<gfx::Size>::Log(const gfx::Size& p, std::string* l) {
l->append(base::StringPrintf("(%d, %d)", p.width(), p.height()));
}
+void ParamTraits<gfx::SizeF>::Write(Message* m, const gfx::SizeF& p) {
+ ParamTraits<float>::Write(m, p.width());
+ ParamTraits<float>::Write(m, p.height());
+}
+
+bool ParamTraits<gfx::SizeF>::Read(const Message* m,
+ PickleIterator* iter,
+ gfx::SizeF* p) {
+ float w, h;
+ if (!ParamTraits<float>::Read(m, iter, &w) ||
+ !ParamTraits<float>::Read(m, iter, &h))
+ return false;
+ p->set_width(w);
+ p->set_height(h);
+ return true;
+}
+
+void ParamTraits<gfx::SizeF>::Log(const gfx::SizeF& p, std::string* l) {
+ l->append(base::StringPrintf("(%f, %f)", p.width(), p.height()));
+}
+
void ParamTraits<gfx::Vector2d>::Write(Message* m, const gfx::Vector2d& v) {
m->WriteInt(v.x());
m->WriteInt(v.y());
diff --git a/content/public/common/common_param_traits.h b/content/public/common/common_param_traits.h
index ce5a668..208af3f 100644
--- a/content/public/common/common_param_traits.h
+++ b/content/public/common/common_param_traits.h
@@ -83,6 +83,14 @@ struct CONTENT_EXPORT ParamTraits<gfx::Size> {
};
template <>
+struct CONTENT_EXPORT ParamTraits<gfx::SizeF> {
+ typedef gfx::SizeF param_type;
+ static void Write(Message* m, const param_type& p);
+ static bool Read(const Message* m, PickleIterator* iter, param_type* r);
+ static void Log(const param_type& p, std::string* l);
+};
+
+template <>
struct CONTENT_EXPORT ParamTraits<gfx::Vector2d> {
typedef gfx::Vector2d param_type;
static void Write(Message* m, const param_type& p);