1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "cc/blink/web_content_layer_impl.h"
6
7#include "cc/layers/content_layer.h"
8#include "cc/layers/picture_layer.h"
9#include "third_party/WebKit/public/platform/WebContentLayerClient.h"
10#include "third_party/WebKit/public/platform/WebFloatPoint.h"
11#include "third_party/WebKit/public/platform/WebFloatRect.h"
12#include "third_party/WebKit/public/platform/WebRect.h"
13#include "third_party/WebKit/public/platform/WebSize.h"
14#include "third_party/skia/include/utils/SkMatrix44.h"
15
16using cc::ContentLayer;
17using cc::PictureLayer;
18
19namespace cc_blink {
20
21WebContentLayerImpl::WebContentLayerImpl(blink::WebContentLayerClient* client)
22    : client_(client), ignore_lcd_text_change_(false) {
23  if (WebLayerImpl::UsingPictureLayer())
24    layer_ = make_scoped_ptr(new WebLayerImpl(PictureLayer::Create(this)));
25  else
26    layer_ = make_scoped_ptr(new WebLayerImpl(ContentLayer::Create(this)));
27  layer_->layer()->SetIsDrawable(true);
28  can_use_lcd_text_ = layer_->layer()->can_use_lcd_text();
29}
30
31WebContentLayerImpl::~WebContentLayerImpl() {
32  if (WebLayerImpl::UsingPictureLayer())
33    static_cast<PictureLayer*>(layer_->layer())->ClearClient();
34  else
35    static_cast<ContentLayer*>(layer_->layer())->ClearClient();
36}
37
38blink::WebLayer* WebContentLayerImpl::layer() {
39  return layer_.get();
40}
41
42void WebContentLayerImpl::setDoubleSided(bool double_sided) {
43  layer_->layer()->SetDoubleSided(double_sided);
44}
45
46void WebContentLayerImpl::setDrawCheckerboardForMissingTiles(bool enable) {
47  layer_->layer()->SetDrawCheckerboardForMissingTiles(enable);
48}
49
50void WebContentLayerImpl::PaintContents(
51    SkCanvas* canvas,
52    const gfx::Rect& clip,
53    ContentLayerClient::GraphicsContextStatus graphics_context_status) {
54  if (!client_)
55    return;
56
57  client_->paintContents(
58      canvas,
59      clip,
60      can_use_lcd_text_,
61      graphics_context_status == ContentLayerClient::GRAPHICS_CONTEXT_ENABLED
62          ? blink::WebContentLayerClient::GraphicsContextEnabled
63          : blink::WebContentLayerClient::GraphicsContextDisabled);
64}
65
66void WebContentLayerImpl::DidChangeLayerCanUseLCDText() {
67  // It is important to make this comparison because the LCD text status
68  // here can get out of sync with that in the layer.
69  if (can_use_lcd_text_ == layer_->layer()->can_use_lcd_text())
70    return;
71
72  // LCD text cannot be enabled once disabled.
73  if (layer_->layer()->can_use_lcd_text() && ignore_lcd_text_change_)
74    return;
75
76  can_use_lcd_text_ = layer_->layer()->can_use_lcd_text();
77  ignore_lcd_text_change_ = true;
78  layer_->invalidate();
79}
80
81bool WebContentLayerImpl::FillsBoundsCompletely() const {
82  return false;
83}
84
85}  // namespace cc_blink
86