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