Index: services/gfx/compositor/graph/node_def.cc |
diff --git a/services/gfx/compositor/graph/node_def.cc b/services/gfx/compositor/graph/node_def.cc |
index 826541204c48fef6bf048e75a5558fddaec3fc22..e364343f8a8d3391ef08fb46007820abed299984 100644 |
--- a/services/gfx/compositor/graph/node_def.cc |
+++ b/services/gfx/compositor/graph/node_def.cc |
@@ -12,6 +12,7 @@ |
#include "services/gfx/compositor/graph/scene_content.h" |
#include "services/gfx/compositor/graph/scene_def.h" |
#include "services/gfx/compositor/graph/snapshot.h" |
+#include "services/gfx/compositor/graph/transform_pair.h" |
#include "services/gfx/compositor/render/render_image.h" |
#include "third_party/skia/include/core/SkCanvas.h" |
#include "third_party/skia/include/core/SkColor.h" |
@@ -19,6 +20,7 @@ |
#include "third_party/skia/include/core/SkPaint.h" |
#include "third_party/skia/include/core/SkPoint.h" |
#include "third_party/skia/include/core/SkRect.h" |
+#include "third_party/skia/include/utils/SkMatrix44.h" |
namespace compositor { |
namespace { |
@@ -39,13 +41,13 @@ bool Contains(const SkRect& bounds, const SkPoint& point) { |
} // namespace |
NodeDef::NodeDef(uint32_t node_id, |
- mojo::TransformPtr content_transform, |
+ std::unique_ptr<TransformPair> content_transform, |
mojo::RectFPtr content_clip, |
mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
Combinator combinator, |
const std::vector<uint32_t>& child_node_ids) |
: node_id_(node_id), |
- content_transform_(content_transform.Pass()), |
+ content_transform_(std::move(content_transform)), |
content_clip_(content_clip.Pass()), |
hit_test_behavior_(hit_test_behavior.Pass()), |
combinator_(combinator), |
@@ -205,7 +207,7 @@ void NodeDef::RecordPicture(const SceneContent* content, |
if (must_save) { |
canvas->save(); |
if (content_transform_) |
- canvas->concat(content_transform_.To<SkMatrix>()); |
+ canvas->concat(content_transform_->forward()); |
if (content_clip_) |
canvas->clipRect(content_clip_->To<SkRect>()); |
} |
@@ -234,7 +236,7 @@ void NodeDef::RecordPictureInner(const SceneContent* content, |
bool NodeDef::HitTest(const SceneContent* content, |
const Snapshot* snapshot, |
const SkPoint& parent_point, |
- const SkMatrix& global_to_parent_transform, |
+ const SkMatrix44& global_to_parent_transform, |
mojo::Array<mojo::gfx::composition::HitPtr>* hits) const { |
DCHECK(content); |
DCHECK(snapshot); |
@@ -242,20 +244,12 @@ bool NodeDef::HitTest(const SceneContent* content, |
// TODO(jeffbrown): These calculations should probably be happening using |
// a 4x4 matrix instead. |
- SkPoint local_point = parent_point; |
- SkMatrix global_to_local_transform = global_to_parent_transform; |
+ SkPoint local_point(parent_point); |
+ SkMatrix global_to_local_transform(global_to_parent_transform); |
if (content_transform_) { |
- // TODO(jeffbrown): Cache the inverse transform. |
- // Defer matrix multiplications using a matrix stack. |
- SkMatrix inverse_transform; |
- if (!content_transform_.To<SkMatrix>().invert(&inverse_transform)) { |
- // Matrix is singular! |
- // Return [0,0,0][0,0,0][0,0,1] (all zeroes except last component). |
- // This causes all points to be mapped to (0,0) when transformed. |
- inverse_transform.setScale(0.f, 0.f); |
- } |
- inverse_transform.mapXY(parent_point.x(), parent_point.y(), &local_point); |
- global_to_local_transform.preConcat(inverse_transform); |
+ // TODO(jeffbrown): Defer matrix multiplications using a matrix stack. |
+ local_point = content_transform_->InverseMapPoint(parent_point); |
+ global_to_local_transform.preConcat(content_transform_->GetInverse()); |
} |
if (content_clip_ && !Contains(content_clip_->To<SkRect>(), local_point)) |
@@ -276,7 +270,7 @@ bool NodeDef::HitTestInner( |
const SceneContent* content, |
const Snapshot* snapshot, |
const SkPoint& local_point, |
- const SkMatrix& global_to_local_transform, |
+ const SkMatrix44& global_to_local_transform, |
mojo::Array<mojo::gfx::composition::HitPtr>* hits) const { |
DCHECK(content); |
DCHECK(snapshot); |
@@ -303,7 +297,7 @@ bool NodeDef::HitTestSelf( |
const SceneContent* content, |
const Snapshot* snapshot, |
const SkPoint& local_point, |
- const SkMatrix& global_to_local_transform, |
+ const SkMatrix44& global_to_local_transform, |
mojo::Array<mojo::gfx::composition::HitPtr>* hits) const { |
DCHECK(content); |
DCHECK(snapshot); |
@@ -330,7 +324,7 @@ bool NodeDef::HitTestSelf( |
RectNodeDef::RectNodeDef( |
uint32_t node_id, |
- mojo::TransformPtr content_transform, |
+ std::unique_ptr<TransformPair> content_transform, |
mojo::RectFPtr content_clip, |
mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
Combinator combinator, |
@@ -338,7 +332,7 @@ RectNodeDef::RectNodeDef( |
const mojo::RectF& content_rect, |
const mojo::gfx::composition::Color& color) |
: NodeDef(node_id, |
- content_transform.Pass(), |
+ std::move(content_transform), |
content_clip.Pass(), |
hit_test_behavior.Pass(), |
combinator, |
@@ -364,7 +358,7 @@ void RectNodeDef::RecordPictureInner(const SceneContent* content, |
ImageNodeDef::ImageNodeDef( |
uint32_t node_id, |
- mojo::TransformPtr content_transform, |
+ std::unique_ptr<TransformPair> content_transform, |
mojo::RectFPtr content_clip, |
mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
Combinator combinator, |
@@ -374,7 +368,7 @@ ImageNodeDef::ImageNodeDef( |
uint32 image_resource_id, |
mojo::gfx::composition::BlendPtr blend) |
: NodeDef(node_id, |
- content_transform.Pass(), |
+ std::move(content_transform), |
content_clip.Pass(), |
hit_test_behavior.Pass(), |
combinator, |
@@ -420,7 +414,7 @@ void ImageNodeDef::RecordPictureInner(const SceneContent* content, |
SceneNodeDef::SceneNodeDef( |
uint32_t node_id, |
- mojo::TransformPtr content_transform, |
+ std::unique_ptr<TransformPair> content_transform, |
mojo::RectFPtr content_clip, |
mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
Combinator combinator, |
@@ -428,7 +422,7 @@ SceneNodeDef::SceneNodeDef( |
uint32_t scene_resource_id, |
uint32_t scene_version) |
: NodeDef(node_id, |
- content_transform.Pass(), |
+ std::move(content_transform), |
content_clip.Pass(), |
hit_test_behavior.Pass(), |
combinator, |
@@ -492,7 +486,7 @@ bool SceneNodeDef::HitTestInner( |
const SceneContent* content, |
const Snapshot* snapshot, |
const SkPoint& local_point, |
- const SkMatrix& global_to_local_transform, |
+ const SkMatrix44& global_to_local_transform, |
mojo::Array<mojo::gfx::composition::HitPtr>* hits) const { |
DCHECK(content); |
DCHECK(snapshot); |
@@ -519,7 +513,7 @@ bool SceneNodeDef::HitTestInner( |
LayerNodeDef::LayerNodeDef( |
uint32_t node_id, |
- mojo::TransformPtr content_transform, |
+ std::unique_ptr<TransformPair> content_transform, |
mojo::RectFPtr content_clip, |
mojo::gfx::composition::HitTestBehaviorPtr hit_test_behavior, |
Combinator combinator, |
@@ -527,7 +521,7 @@ LayerNodeDef::LayerNodeDef( |
const mojo::RectF& layer_rect, |
mojo::gfx::composition::BlendPtr blend) |
: NodeDef(node_id, |
- content_transform.Pass(), |
+ std::move(content_transform), |
content_clip.Pass(), |
hit_test_behavior.Pass(), |
combinator, |