summaryrefslogtreecommitdiffstats
path: root/cc/proto
diff options
context:
space:
mode:
authordtrainor <dtrainor@chromium.org>2015-10-23 13:13:55 -0700
committerCommit bot <commit-bot@chromium.org>2015-10-23 20:14:52 +0000
commit543858f59534642b57822e34786ef337ad32014e (patch)
treec537d2b014dc0a273b6ce3068a39a702f209bd18 /cc/proto
parent6d45cf5e34c7dc627c7a2decf87dbaa30f06b966 (diff)
downloadchromium_src-543858f59534642b57822e34786ef337ad32014e.zip
chromium_src-543858f59534642b57822e34786ef337ad32014e.tar.gz
chromium_src-543858f59534642b57822e34786ef337ad32014e.tar.bz2
Add Protobuf support for cc/playback skia usage
Add protobuf serialization to the following: - SkRegion::Op - SkXfermode::Mode - SkRRect These are used by cc/playback DisplayItem classes. In the short term, will just use Skia's flatten for: - SkColorFilter - SkPath - SkPicture BUG=541321 CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel Review URL: https://codereview.chromium.org/1399933004 Cr-Commit-Position: refs/heads/master@{#355865}
Diffstat (limited to 'cc/proto')
-rw-r--r--cc/proto/BUILD.gn8
-rw-r--r--cc/proto/skia_conversions.cc221
-rw-r--r--cc/proto/skia_conversions.h36
-rw-r--r--cc/proto/skia_conversions_unittest.cc73
-rw-r--r--cc/proto/skregion.proto20
-rw-r--r--cc/proto/skrrect.proto20
-rw-r--r--cc/proto/skxfermode.proto46
7 files changed, 421 insertions, 3 deletions
diff --git a/cc/proto/BUILD.gn b/cc/proto/BUILD.gn
index 2fce37e..acf5e9b 100644
--- a/cc/proto/BUILD.gn
+++ b/cc/proto/BUILD.gn
@@ -27,15 +27,17 @@ proto_library("proto_internal") {
visibility = [ ":cc_proto" ]
sources = [
- # TODO(dtrainor): Move the ui/gfx related protos to ui/gfx/proto once it is
- # possible to include protos from other directories/targets (see
- # crbug.com/542423).
+ # TODO(dtrainor): Move protos to their correct packages once it's possible
+ # to include protos from other directories/targets (crbug.com/542423).
"point.proto",
"pointf.proto",
"rect.proto",
"rectf.proto",
"size.proto",
"sizef.proto",
+ "skregion.proto",
+ "skrrect.proto",
+ "skxfermode.proto",
"transform.proto",
]
diff --git a/cc/proto/skia_conversions.cc b/cc/proto/skia_conversions.cc
new file mode 100644
index 0000000..84acdd4
--- /dev/null
+++ b/cc/proto/skia_conversions.cc
@@ -0,0 +1,221 @@
+// Copyright 2015 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/proto/skia_conversions.h"
+
+#include "base/logging.h"
+#include "cc/proto/gfx_conversions.h"
+#include "cc/proto/skrrect.pb.h"
+#include "third_party/skia/include/core/SkRRect.h"
+#include "ui/gfx/skia_util.h"
+
+namespace cc {
+
+namespace {
+
+void SkPointToProto(const SkPoint& point, proto::PointF* proto) {
+ PointFToProto(gfx::PointF(point.x(), point.y()), proto);
+}
+
+SkPoint ProtoToSkPoint(const proto::PointF& proto) {
+ gfx::PointF point = ProtoToPointF(proto);
+ return SkPoint::Make(point.x(), point.y());
+}
+
+} // namespace
+
+SkRegion::Op SkRegionOpFromProto(proto::SkRegion::Op op) {
+ switch (op) {
+ case proto::SkRegion::Op_Difference:
+ return SkRegion::Op::kDifference_Op;
+ case proto::SkRegion::Op_Intersect:
+ return SkRegion::Op::kIntersect_Op;
+ case proto::SkRegion::Op_Union:
+ return SkRegion::Op::kUnion_Op;
+ case proto::SkRegion::Op_XOR:
+ return SkRegion::Op::kXOR_Op;
+ case proto::SkRegion::Op_ReverseDifference:
+ return SkRegion::Op::kReverseDifference_Op;
+ case proto::SkRegion::Op_Replace:
+ return SkRegion::Op::kReplace_Op;
+ }
+ return SkRegion::Op::kDifference_Op;
+}
+
+proto::SkRegion::Op SkRegionOpToProto(SkRegion::Op op) {
+ switch (op) {
+ case SkRegion::Op::kDifference_Op:
+ return proto::SkRegion::Op_Difference;
+ case SkRegion::Op::kIntersect_Op:
+ return proto::SkRegion::Op_Intersect;
+ case SkRegion::Op::kUnion_Op:
+ return proto::SkRegion::Op_Union;
+ case SkRegion::Op::kXOR_Op:
+ return proto::SkRegion::Op_XOR;
+ case SkRegion::Op::kReverseDifference_Op:
+ return proto::SkRegion::Op_ReverseDifference;
+ case SkRegion::Op::kReplace_Op:
+ return proto::SkRegion::Op_Replace;
+ }
+ return proto::SkRegion::Op_Difference;
+}
+
+SkXfermode::Mode SkXfermodeModeFromProto(proto::SkXfermode::Mode mode) {
+ switch (mode) {
+ case proto::SkXfermode::Mode_Clear:
+ return SkXfermode::Mode::kClear_Mode;
+ case proto::SkXfermode::Mode_Src:
+ return SkXfermode::Mode::kSrc_Mode;
+ case proto::SkXfermode::Mode_Dst:
+ return SkXfermode::Mode::kDst_Mode;
+ case proto::SkXfermode::Mode_SrcOver:
+ return SkXfermode::Mode::kSrcOver_Mode;
+ case proto::SkXfermode::Mode_DstOver:
+ return SkXfermode::Mode::kDstOver_Mode;
+ case proto::SkXfermode::Mode_SrcIn:
+ return SkXfermode::Mode::kSrcIn_Mode;
+ case proto::SkXfermode::Mode_DstIn:
+ return SkXfermode::Mode::kDstIn_Mode;
+ case proto::SkXfermode::Mode_SrcOut:
+ return SkXfermode::Mode::kSrcOut_Mode;
+ case proto::SkXfermode::Mode_DstOut:
+ return SkXfermode::Mode::kDstOut_Mode;
+ case proto::SkXfermode::Mode_SrcATop:
+ return SkXfermode::Mode::kSrcATop_Mode;
+ case proto::SkXfermode::Mode_DstATop:
+ return SkXfermode::Mode::kDstATop_Mode;
+ case proto::SkXfermode::Mode_XOR:
+ return SkXfermode::Mode::kXor_Mode;
+ case proto::SkXfermode::Mode_Plus:
+ return SkXfermode::Mode::kPlus_Mode;
+ case proto::SkXfermode::Mode_Modulate:
+ return SkXfermode::Mode::kModulate_Mode;
+ case proto::SkXfermode::Mode_Screen:
+ return SkXfermode::Mode::kScreen_Mode;
+ case proto::SkXfermode::Mode_Overlay:
+ return SkXfermode::Mode::kOverlay_Mode;
+ case proto::SkXfermode::Mode_Darken:
+ return SkXfermode::Mode::kDarken_Mode;
+ case proto::SkXfermode::Mode_Lighten:
+ return SkXfermode::Mode::kLighten_Mode;
+ case proto::SkXfermode::Mode_ColorDodge:
+ return SkXfermode::Mode::kColorDodge_Mode;
+ case proto::SkXfermode::Mode_ColorBurn:
+ return SkXfermode::Mode::kColorBurn_Mode;
+ case proto::SkXfermode::Mode_HardLight:
+ return SkXfermode::Mode::kHardLight_Mode;
+ case proto::SkXfermode::Mode_SoftLight:
+ return SkXfermode::Mode::kSoftLight_Mode;
+ case proto::SkXfermode::Mode_Difference:
+ return SkXfermode::Mode::kDifference_Mode;
+ case proto::SkXfermode::Mode_Exclusion:
+ return SkXfermode::Mode::kExclusion_Mode;
+ case proto::SkXfermode::Mode_Multiply:
+ return SkXfermode::Mode::kMultiply_Mode;
+ case proto::SkXfermode::Mode_Hue:
+ return SkXfermode::Mode::kHue_Mode;
+ case proto::SkXfermode::Mode_Saturation:
+ return SkXfermode::Mode::kSaturation_Mode;
+ case proto::SkXfermode::Mode_Color:
+ return SkXfermode::Mode::kColor_Mode;
+ case proto::SkXfermode::Mode_Luminosity:
+ return SkXfermode::Mode::kLuminosity_Mode;
+ }
+ return SkXfermode::Mode::kClear_Mode;
+}
+
+proto::SkXfermode::Mode SkXfermodeModeToProto(SkXfermode::Mode mode) {
+ switch (mode) {
+ case SkXfermode::Mode::kClear_Mode:
+ return proto::SkXfermode::Mode_Clear;
+ case SkXfermode::Mode::kSrc_Mode:
+ return proto::SkXfermode::Mode_Src;
+ case SkXfermode::Mode::kDst_Mode:
+ return proto::SkXfermode::Mode_Dst;
+ case SkXfermode::Mode::kSrcOver_Mode:
+ return proto::SkXfermode::Mode_SrcOver;
+ case SkXfermode::Mode::kDstOver_Mode:
+ return proto::SkXfermode::Mode_DstOver;
+ case SkXfermode::Mode::kSrcIn_Mode:
+ return proto::SkXfermode::Mode_SrcIn;
+ case SkXfermode::Mode::kDstIn_Mode:
+ return proto::SkXfermode::Mode_DstIn;
+ case SkXfermode::Mode::kSrcOut_Mode:
+ return proto::SkXfermode::Mode_SrcOut;
+ case SkXfermode::Mode::kDstOut_Mode:
+ return proto::SkXfermode::Mode_DstOut;
+ case SkXfermode::Mode::kSrcATop_Mode:
+ return proto::SkXfermode::Mode_SrcATop;
+ case SkXfermode::Mode::kDstATop_Mode:
+ return proto::SkXfermode::Mode_DstATop;
+ case SkXfermode::Mode::kXor_Mode:
+ return proto::SkXfermode::Mode_XOR;
+ case SkXfermode::Mode::kPlus_Mode:
+ return proto::SkXfermode::Mode_Plus;
+ case SkXfermode::Mode::kModulate_Mode:
+ return proto::SkXfermode::Mode_Modulate;
+ case SkXfermode::Mode::kScreen_Mode:
+ return proto::SkXfermode::Mode_Screen;
+ case SkXfermode::Mode::kOverlay_Mode:
+ return proto::SkXfermode::Mode_Overlay;
+ case SkXfermode::Mode::kDarken_Mode:
+ return proto::SkXfermode::Mode_Darken;
+ case SkXfermode::Mode::kLighten_Mode:
+ return proto::SkXfermode::Mode_Lighten;
+ case SkXfermode::Mode::kColorDodge_Mode:
+ return proto::SkXfermode::Mode_ColorDodge;
+ case SkXfermode::Mode::kColorBurn_Mode:
+ return proto::SkXfermode::Mode_ColorBurn;
+ case SkXfermode::Mode::kHardLight_Mode:
+ return proto::SkXfermode::Mode_HardLight;
+ case SkXfermode::Mode::kSoftLight_Mode:
+ return proto::SkXfermode::Mode_SoftLight;
+ case SkXfermode::Mode::kDifference_Mode:
+ return proto::SkXfermode::Mode_Difference;
+ case SkXfermode::Mode::kExclusion_Mode:
+ return proto::SkXfermode::Mode_Exclusion;
+ case SkXfermode::Mode::kMultiply_Mode:
+ return proto::SkXfermode::Mode_Multiply;
+ case SkXfermode::Mode::kHue_Mode:
+ return proto::SkXfermode::Mode_Hue;
+ case SkXfermode::Mode::kSaturation_Mode:
+ return proto::SkXfermode::Mode_Saturation;
+ case SkXfermode::Mode::kColor_Mode:
+ return proto::SkXfermode::Mode_Color;
+ case SkXfermode::Mode::kLuminosity_Mode:
+ return proto::SkXfermode::Mode_Luminosity;
+ }
+ return proto::SkXfermode::Mode_Clear;
+}
+
+void SkRRectToProto(const SkRRect& rect, proto::SkRRect* proto) {
+ RectFToProto(gfx::SkRectToRectF(rect.rect()), proto->mutable_rect());
+
+ SkPointToProto(rect.radii(SkRRect::kUpperLeft_Corner),
+ proto->mutable_radii_upper_left());
+ SkPointToProto(rect.radii(SkRRect::kUpperRight_Corner),
+ proto->mutable_radii_upper_right());
+ SkPointToProto(rect.radii(SkRRect::kLowerRight_Corner),
+ proto->mutable_radii_lower_right());
+ SkPointToProto(rect.radii(SkRRect::kLowerLeft_Corner),
+ proto->mutable_radii_lower_left());
+}
+
+SkRRect ProtoToSkRRect(const proto::SkRRect& proto) {
+ SkRect parsed_rect = gfx::RectFToSkRect(ProtoToRectF(proto.rect()));
+ SkVector parsed_radii[4];
+ parsed_radii[SkRRect::kUpperLeft_Corner] =
+ ProtoToSkPoint(proto.radii_upper_left());
+ parsed_radii[SkRRect::kUpperRight_Corner] =
+ ProtoToSkPoint(proto.radii_upper_right());
+ parsed_radii[SkRRect::kLowerRight_Corner] =
+ ProtoToSkPoint(proto.radii_lower_right());
+ parsed_radii[SkRRect::kLowerLeft_Corner] =
+ ProtoToSkPoint(proto.radii_lower_left());
+ SkRRect rect;
+ rect.setRectRadii(parsed_rect, parsed_radii);
+ return rect;
+}
+
+} // namespace cc
diff --git a/cc/proto/skia_conversions.h b/cc/proto/skia_conversions.h
new file mode 100644
index 0000000..302e313c
--- /dev/null
+++ b/cc/proto/skia_conversions.h
@@ -0,0 +1,36 @@
+// Copyright 2015 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_SKIA_CONVERSIONS_H_
+#define CC_PROTO_SKIA_CONVERSIONS_H_
+
+#include "cc/base/cc_export.h"
+#include "cc/proto/skregion.pb.h"
+#include "cc/proto/skxfermode.pb.h"
+#include "third_party/skia/include/core/SkRegion.h"
+#include "third_party/skia/include/core/SkXfermode.h"
+
+class SkRegion;
+class SkRRect;
+class SkXferMode;
+
+namespace cc {
+
+namespace proto {
+class SkRRect;
+}
+
+CC_EXPORT SkRegion::Op SkRegionOpFromProto(proto::SkRegion::Op op);
+CC_EXPORT proto::SkRegion::Op SkRegionOpToProto(SkRegion::Op op);
+
+CC_EXPORT SkXfermode::Mode SkXfermodeModeFromProto(
+ proto::SkXfermode::Mode mode);
+CC_EXPORT proto::SkXfermode::Mode SkXfermodeModeToProto(SkXfermode::Mode mode);
+
+CC_EXPORT void SkRRectToProto(const SkRRect& rect, proto::SkRRect* proto);
+CC_EXPORT SkRRect ProtoToSkRRect(const proto::SkRRect& proto);
+
+} // namespace cc
+
+#endif // CC_PROTO_SKIA_CONVERSIONS_H_
diff --git a/cc/proto/skia_conversions_unittest.cc b/cc/proto/skia_conversions_unittest.cc
new file mode 100644
index 0000000..6785a0c
--- /dev/null
+++ b/cc/proto/skia_conversions_unittest.cc
@@ -0,0 +1,73 @@
+// Copyright 2015 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/proto/skia_conversions.h"
+
+#include "cc/proto/skregion.pb.h"
+#include "cc/proto/skrrect.pb.h"
+#include "cc/proto/skxfermode.pb.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkRRect.h"
+#include "third_party/skia/include/core/SkRegion.h"
+#include "third_party/skia/include/core/SkXfermode.h"
+
+namespace cc {
+namespace {
+
+TEST(SkiaProtoConversionsTest, SerializeDeserializeSkRegionOp) {
+ for (size_t i = 0; i < SkRegion::Op::kLastOp; i++) {
+ SkRegion::Op op = static_cast<SkRegion::Op>(i);
+ EXPECT_EQ(op, SkRegionOpFromProto(SkRegionOpToProto(op)));
+ }
+}
+
+TEST(SkiaProtoConversionsTest, SerializeDeserializeSkXfermodeMode) {
+ for (size_t i = 0; i < SkXfermode::Mode::kLastMode; i++) {
+ SkXfermode::Mode mode = static_cast<SkXfermode::Mode>(i);
+ EXPECT_EQ(mode, SkXfermodeModeFromProto(SkXfermodeModeToProto(mode)));
+ }
+}
+
+TEST(SkiaProtoConversionsTest, SerializeDeserializeSkRRect) {
+ SkRect rect = SkRect::MakeXYWH(0, 10, 15, 20);
+ SkVector radii[4];
+ radii[0] = SkVector::Make(0.1f, 0.2f);
+ radii[1] = SkVector::Make(0.3f, 0.4f);
+ radii[2] = SkVector::Make(0.5f, 0.6f);
+ radii[3] = SkVector::Make(0.7f, 0.8f);
+
+ SkRRect rrect;
+ rrect.setRectRadii(rect, radii);
+
+ // Test RRectToProto
+ proto::SkRRect proto;
+ SkRRectToProto(rrect, &proto);
+ EXPECT_EQ(rrect.rect().x(), proto.rect().origin().x());
+ EXPECT_EQ(rrect.rect().y(), proto.rect().origin().y());
+ EXPECT_EQ(rrect.rect().width(), proto.rect().size().width());
+ EXPECT_EQ(rrect.rect().height(), proto.rect().size().height());
+
+ EXPECT_EQ(rrect.radii(SkRRect::kUpperLeft_Corner).x(),
+ proto.radii_upper_left().x());
+ EXPECT_EQ(rrect.radii(SkRRect::kUpperLeft_Corner).y(),
+ proto.radii_upper_left().y());
+ EXPECT_EQ(rrect.radii(SkRRect::kUpperRight_Corner).x(),
+ proto.radii_upper_right().x());
+ EXPECT_EQ(rrect.radii(SkRRect::kUpperRight_Corner).y(),
+ proto.radii_upper_right().y());
+ EXPECT_EQ(rrect.radii(SkRRect::kLowerRight_Corner).x(),
+ proto.radii_lower_right().x());
+ EXPECT_EQ(rrect.radii(SkRRect::kLowerRight_Corner).y(),
+ proto.radii_lower_right().y());
+ EXPECT_EQ(rrect.radii(SkRRect::kLowerLeft_Corner).x(),
+ proto.radii_lower_left().x());
+ EXPECT_EQ(rrect.radii(SkRRect::kLowerLeft_Corner).y(),
+ proto.radii_lower_left().y());
+
+ // Test ProtoToRRect
+ EXPECT_EQ(rrect, ProtoToSkRRect(proto));
+}
+
+} // namespace
+} // namespace cc
diff --git a/cc/proto/skregion.proto b/cc/proto/skregion.proto
new file mode 100644
index 0000000..1f6b337
--- /dev/null
+++ b/cc/proto/skregion.proto
@@ -0,0 +1,20 @@
+// Copyright 2015 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.
+
+syntax = "proto2";
+
+option optimize_for = LITE_RUNTIME;
+
+package cc.proto;
+
+message SkRegion {
+ enum Op {
+ Op_Difference = 0;
+ Op_Intersect = 1;
+ Op_Union = 2;
+ Op_XOR = 3;
+ Op_ReverseDifference = 4;
+ Op_Replace = 5;
+ }
+} \ No newline at end of file
diff --git a/cc/proto/skrrect.proto b/cc/proto/skrrect.proto
new file mode 100644
index 0000000..28a8be4
--- /dev/null
+++ b/cc/proto/skrrect.proto
@@ -0,0 +1,20 @@
+// Copyright 2015 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.
+
+syntax = "proto2";
+
+import "pointf.proto";
+import "rectf.proto";
+
+option optimize_for = LITE_RUNTIME;
+
+package cc.proto;
+
+message SkRRect {
+ optional cc.proto.RectF rect = 1;
+ optional cc.proto.PointF radii_upper_left = 2;
+ optional cc.proto.PointF radii_upper_right = 3;
+ optional cc.proto.PointF radii_lower_right = 4;
+ optional cc.proto.PointF radii_lower_left = 5;
+}
diff --git a/cc/proto/skxfermode.proto b/cc/proto/skxfermode.proto
new file mode 100644
index 0000000..b0b3963
--- /dev/null
+++ b/cc/proto/skxfermode.proto
@@ -0,0 +1,46 @@
+// Copyright 2015 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.
+
+syntax = "proto2";
+
+option optimize_for = LITE_RUNTIME;
+
+package cc.proto;
+
+message SkXfermode {
+ enum Mode {
+ Mode_Clear = 0;
+ Mode_Src = 1;
+ Mode_Dst = 2;
+ Mode_SrcOver = 3;
+ Mode_DstOver = 4;
+ Mode_SrcIn = 5;
+ Mode_DstIn = 6;
+ Mode_SrcOut = 7;
+ Mode_DstOut = 8;
+ Mode_SrcATop = 9;
+ Mode_DstATop = 10;
+ Mode_XOR = 11;
+ Mode_Plus = 12;
+ Mode_Modulate = 13;
+
+ Mode_Screen = 14;
+
+ Mode_Overlay = 15;
+ Mode_Darken = 16;
+ Mode_Lighten = 17;
+ Mode_ColorDodge = 18;
+ Mode_ColorBurn = 19;
+ Mode_HardLight = 20;
+ Mode_SoftLight = 21;
+ Mode_Difference = 22;
+ Mode_Exclusion = 23;
+ Mode_Multiply = 24;
+
+ Mode_Hue = 25;
+ Mode_Saturation = 26;
+ Mode_Color = 27;
+ Mode_Luminosity = 28;
+ }
+} \ No newline at end of file