15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/renderer/compositor_bindings/web_layer_impl.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/bind.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/animation/animation.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/region.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/layer.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/layers/layer_position_constraint.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCompositingReasons.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebFloatPoint.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebFloatRect.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebLayerPositionConstraint.h"
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/platform/WebLayerScrollClient.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h"
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/utils/SkMatrix44.h"
2090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "webkit/renderer/compositor_bindings/web_animation_impl.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "webkit/renderer/compositor_bindings/web_filter_operations_impl.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "webkit/renderer/compositor_bindings/web_to_cc_animation_delegate_adapter.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using cc::Animation;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using cc::Layer;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebLayer;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebFloatPoint;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebVector;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebRect;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebSize;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebColor;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using WebKit::WebFilterOperations;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace webkit {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebLayerImpl::WebLayerImpl() : layer_(Layer::Create()) {}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebLayerImpl::WebLayerImpl(scoped_refptr<Layer> layer) : layer_(layer) {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebLayerImpl::~WebLayerImpl() {
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->ClearRenderSurface();
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->set_layer_animation_delegate(NULL);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int WebLayerImpl::id() const { return layer_->id(); }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::invalidateRect(const WebKit::WebFloatRect& rect) {
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetNeedsDisplayRect(rect);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::invalidate() { layer_->SetNeedsDisplay(); }
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::addChild(WebLayer* child) {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->AddChild(static_cast<WebLayerImpl*>(child)->layer());
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::insertChild(WebLayer* child, size_t index) {
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->InsertChild(static_cast<WebLayerImpl*>(child)->layer(), index);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::replaceChild(WebLayer* reference, WebLayer* new_layer) {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->ReplaceChild(static_cast<WebLayerImpl*>(reference)->layer(),
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       static_cast<WebLayerImpl*>(new_layer)->layer());
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::removeFromParent() { layer_->RemoveFromParent(); }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::removeAllChildren() { layer_->RemoveAllChildren(); }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setAnchorPoint(const WebFloatPoint& anchor_point) {
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetAnchorPoint(anchor_point);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebFloatPoint WebLayerImpl::anchorPoint() const {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_->anchor_point();
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setAnchorPointZ(float anchor_point_z) {
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetAnchorPointZ(anchor_point_z);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float WebLayerImpl::anchorPointZ() const { return layer_->anchor_point_z(); }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setBounds(const WebSize& size) { layer_->SetBounds(size); }
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebSize WebLayerImpl::bounds() const { return layer_->bounds(); }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setMasksToBounds(bool masks_to_bounds) {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetMasksToBounds(masks_to_bounds);
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebLayerImpl::masksToBounds() const { return layer_->masks_to_bounds(); }
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setMaskLayer(WebLayer* maskLayer) {
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetMaskLayer(
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      maskLayer ? static_cast<WebLayerImpl*>(maskLayer)->layer() : 0);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setReplicaLayer(WebLayer* replica_layer) {
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetReplicaLayer(
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      replica_layer ? static_cast<WebLayerImpl*>(replica_layer)->layer() : 0);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setOpacity(float opacity) { layer_->SetOpacity(opacity); }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)float WebLayerImpl::opacity() const { return layer_->opacity(); }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setOpaque(bool opaque) { layer_->SetContentsOpaque(opaque); }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebLayerImpl::opaque() const { return layer_->contents_opaque(); }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setPosition(const WebFloatPoint& position) {
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetPosition(position);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebFloatPoint WebLayerImpl::position() const { return layer_->position(); }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setSublayerTransform(const SkMatrix44& matrix) {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform sub_layer_transform;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sub_layer_transform.matrix() = matrix;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetSublayerTransform(sub_layer_transform);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SkMatrix44 WebLayerImpl::sublayerTransform() const {
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_->sublayer_transform().matrix();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setTransform(const SkMatrix44& matrix) {
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Transform transform;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  transform.matrix() = matrix;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetTransform(transform);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)SkMatrix44 WebLayerImpl::transform() const {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_->transform().matrix();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setDrawsContent(bool draws_content) {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetIsDrawable(draws_content);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebLayerImpl::drawsContent() const { return layer_->DrawsContent(); }
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setPreserves3D(bool preserve3D) {
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetPreserves3d(preserve3D);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setUseParentBackfaceVisibility(
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool use_parent_backface_visibility) {
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->set_use_parent_backface_visibility(use_parent_backface_visibility);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setBackgroundColor(WebColor color) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetBackgroundColor(color);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebColor WebLayerImpl::backgroundColor() const {
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_->background_color();
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setFilters(const WebFilterOperations& filters) {
162eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const WebFilterOperationsImpl& filters_impl =
163eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      static_cast<const WebFilterOperationsImpl&>(filters);
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  layer_->SetFilters(filters_impl.AsFilterOperations());
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setBackgroundFilters(const WebFilterOperations& filters) {
168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const WebFilterOperationsImpl& filters_impl =
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      static_cast<const WebFilterOperationsImpl&>(filters);
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  layer_->SetBackgroundFilters(filters_impl.AsFilterOperations());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setFilter(SkImageFilter* filter) {
17490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  layer_->SetFilter(skia::SharePtr(filter));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setDebugName(WebKit::WebString name) {
17890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  layer_->SetDebugName(UTF16ToASCII(name));
17990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
18190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)void WebLayerImpl::setCompositingReasons(
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    WebKit::WebCompositingReasons reasons) {
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  layer_->SetCompositingReasons(reasons);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setAnimationDelegate(
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      WebKit::WebAnimationDelegate* delegate) {
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  animation_delegate_adapter_.reset(
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      new WebToCCAnimationDelegateAdapter(delegate));
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  layer_->set_layer_animation_delegate(animation_delegate_adapter_.get());
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebLayerImpl::addAnimation(WebKit::WebAnimation* animation) {
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_->AddAnimation(
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<WebAnimationImpl*>(animation)->CloneToAnimation());
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::removeAnimation(int animation_id) {
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->RemoveAnimation(animation_id);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::removeAnimation(
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    int animation_id,
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebAnimation::TargetProperty target_property) {
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->layer_animation_controller()->RemoveAnimation(
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      animation_id,
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      static_cast<Animation::TargetProperty>(target_property));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::pauseAnimation(int animation_id, double time_offset) {
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->PauseAnimation(animation_id, time_offset);
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::suspendAnimations(double monotonic_time) {
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SuspendAnimations(monotonic_time);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::resumeAnimations(double monotonic_time) {
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->ResumeAnimations(monotonic_time);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebLayerImpl::hasActiveAnimation() { return layer_->HasActiveAnimation(); }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setForceRenderSurface(bool force_render_surface) {
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetForceRenderSurface(force_render_surface);
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setScrollPosition(WebKit::WebPoint position) {
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetScrollOffset(gfx::Point(position).OffsetFromOrigin());
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebKit::WebPoint WebLayerImpl::scrollPosition() const {
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return gfx::PointAtOffsetFromOrigin(layer_->scroll_offset());
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setMaxScrollPosition(WebSize max_scroll_position) {
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetMaxScrollOffset(max_scroll_position);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebSize WebLayerImpl::maxScrollPosition() const {
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_->max_scroll_offset();
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setScrollable(bool scrollable) {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetScrollable(scrollable);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebLayerImpl::scrollable() const { return layer_->scrollable(); }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setHaveWheelEventHandlers(bool have_wheel_event_handlers) {
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetHaveWheelEventHandlers(have_wheel_event_handlers);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebLayerImpl::haveWheelEventHandlers() const {
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_->have_wheel_event_handlers();
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setShouldScrollOnMainThread(
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool should_scroll_on_main_thread) {
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetShouldScrollOnMainThread(should_scroll_on_main_thread);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebLayerImpl::shouldScrollOnMainThread() const {
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return layer_->should_scroll_on_main_thread();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setNonFastScrollableRegion(const WebVector<WebRect>& rects) {
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cc::Region region;
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < rects.size(); ++i)
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    region.Union(rects[i]);
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetNonFastScrollableRegion(region);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebVector<WebRect> WebLayerImpl::nonFastScrollableRegion() const {
2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t num_rects = 0;
2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (cc::Region::Iterator region_rects(layer_->non_fast_scrollable_region());
2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       region_rects.has_rect();
2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       region_rects.next())
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_rects;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebVector<WebRect> result(num_rects);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t i = 0;
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (cc::Region::Iterator region_rects(layer_->non_fast_scrollable_region());
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       region_rects.has_rect();
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       region_rects.next()) {
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result[i] = region_rects.rect();
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++i;
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setTouchEventHandlerRegion(const WebVector<WebRect>& rects) {
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  cc::Region region;
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < rects.size(); ++i)
2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    region.Union(rects[i]);
2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetTouchEventHandlerRegion(region);
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebVector<WebRect> WebLayerImpl::touchEventHandlerRegion() const {
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t num_rects = 0;
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (cc::Region::Iterator region_rects(layer_->touch_event_handler_region());
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       region_rects.has_rect();
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       region_rects.next())
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++num_rects;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WebVector<WebRect> result(num_rects);
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  size_t i = 0;
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (cc::Region::Iterator region_rects(layer_->touch_event_handler_region());
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       region_rects.has_rect();
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)       region_rects.next()) {
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    result[i] = region_rects.rect();
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ++i;
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return result;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setIsContainerForFixedPositionLayers(bool enable) {
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  layer_->SetIsContainerForFixedPositionLayers(enable);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebLayerImpl::isContainerForFixedPositionLayers() const {
322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return layer_->IsContainerForFixedPositionLayers();
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static WebKit::WebLayerPositionConstraint ToWebLayerPositionConstraint(
326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const cc::LayerPositionConstraint& constraint) {
327c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  WebKit::WebLayerPositionConstraint web_constraint;
328c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_constraint.isFixedPosition = constraint.is_fixed_position();
329c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_constraint.isFixedToRightEdge = constraint.is_fixed_to_right_edge();
330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  web_constraint.isFixedToBottomEdge = constraint.is_fixed_to_bottom_edge();
331c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return web_constraint;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
334c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static cc::LayerPositionConstraint ToLayerPositionConstraint(
335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const WebKit::WebLayerPositionConstraint& web_constraint) {
336c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  cc::LayerPositionConstraint constraint;
337c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  constraint.set_is_fixed_position(web_constraint.isFixedPosition);
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  constraint.set_is_fixed_to_right_edge(web_constraint.isFixedToRightEdge);
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  constraint.set_is_fixed_to_bottom_edge(web_constraint.isFixedToBottomEdge);
340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return constraint;
341c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void WebLayerImpl::setPositionConstraint(
344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const WebKit::WebLayerPositionConstraint& constraint) {
345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  layer_->SetPositionConstraint(ToLayerPositionConstraint(constraint));
346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
347c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
348c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)WebKit::WebLayerPositionConstraint WebLayerImpl::positionConstraint() const {
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return ToWebLayerPositionConstraint(layer_->position_constraint());
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebLayerImpl::setScrollClient(
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebLayerScrollClient* scroll_client) {
3547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (scroll_client) {
3557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    layer_->set_did_scroll_callback(
3567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        base::Bind(&WebKit::WebLayerScrollClient::didScroll,
3577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                   base::Unretained(scroll_client)));
3587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  } else {
3597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    layer_->set_did_scroll_callback(base::Closure());
3607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  }
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool WebLayerImpl::isOrphan() const { return !layer_->layer_tree_host(); }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochvoid WebLayerImpl::setWebLayerClient(WebKit::WebLayerClient* client) {
366bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  web_layer_client_ = client;
367bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
368bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Layer* WebLayerImpl::layer() const { return layer_.get(); }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace webkit
372