diff options
author | dtrainor <dtrainor@chromium.org> | 2015-10-23 13:13:55 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-10-23 20:14:52 +0000 |
commit | 543858f59534642b57822e34786ef337ad32014e (patch) | |
tree | c537d2b014dc0a273b6ce3068a39a702f209bd18 /cc/proto | |
parent | 6d45cf5e34c7dc627c7a2decf87dbaa30f06b966 (diff) | |
download | chromium_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.gn | 8 | ||||
-rw-r--r-- | cc/proto/skia_conversions.cc | 221 | ||||
-rw-r--r-- | cc/proto/skia_conversions.h | 36 | ||||
-rw-r--r-- | cc/proto/skia_conversions_unittest.cc | 73 | ||||
-rw-r--r-- | cc/proto/skregion.proto | 20 | ||||
-rw-r--r-- | cc/proto/skrrect.proto | 20 | ||||
-rw-r--r-- | cc/proto/skxfermode.proto | 46 |
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 |