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_content_layer_impl.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/base/switches.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/picture_layer.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebContentLayerClient.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebFloatPoint.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebFloatRect.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/utils/SkMatrix44.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using cc::ContentLayer; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using cc::PictureLayer; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace webkit { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static bool usingPictureLayer() { 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return cc::switches::IsImplSidePaintingEnabled(); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)WebContentLayerImpl::WebContentLayerImpl(blink::WebContentLayerClient* client) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : client_(client), 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ignore_lcd_text_change_(false) { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (usingPictureLayer()) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_ = make_scoped_ptr(new WebLayerImpl(PictureLayer::Create(this))); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_ = make_scoped_ptr(new WebLayerImpl(ContentLayer::Create(this))); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_->layer()->SetIsDrawable(true); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) can_use_lcd_text_ = layer_->layer()->can_use_lcd_text(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WebContentLayerImpl::~WebContentLayerImpl() { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (usingPictureLayer()) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<PictureLayer*>(layer_->layer())->ClearClient(); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static_cast<ContentLayer*>(layer_->layer())->ClearClient(); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebLayer* WebContentLayerImpl::layer() { return layer_.get(); } 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentLayerImpl::setDoubleSided(bool double_sided) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_->layer()->SetDoubleSided(double_sided); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentLayerImpl::setDrawCheckerboardForMissingTiles(bool enable) { 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_->layer()->SetDrawCheckerboardForMissingTiles(enable); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentLayerImpl::PaintContents(SkCanvas* canvas, 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect clip, 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::RectF* opaque) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!client_) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebFloatRect web_opaque; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // For picture layers, always record with LCD text. PictureLayerImpl 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // will turn this off later during rasterization. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool use_lcd_text = usingPictureLayer() || can_use_lcd_text_; 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) client_->paintContents(canvas, clip, use_lcd_text, web_opaque); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *opaque = web_opaque; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebContentLayerImpl::DidChangeLayerCanUseLCDText() { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // It is important to make this comparison because the LCD text status 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // here can get out of sync with that in the layer. 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (can_use_lcd_text_ == layer_->layer()->can_use_lcd_text()) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LCD text cannot be enabled once disabled. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (layer_->layer()->can_use_lcd_text() && ignore_lcd_text_change_) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) can_use_lcd_text_ = layer_->layer()->can_use_lcd_text(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ignore_lcd_text_change_ = true; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) layer_->invalidate(); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace webkit 85