• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2011 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/resources/content_layer_updater.h"
6 
7 #include "base/debug/trace_event.h"
8 #include "base/time/time.h"
9 #include "cc/debug/rendering_stats_instrumentation.h"
10 #include "cc/resources/layer_painter.h"
11 #include "third_party/skia/include/core/SkCanvas.h"
12 #include "third_party/skia/include/core/SkDevice.h"
13 #include "third_party/skia/include/core/SkPaint.h"
14 #include "third_party/skia/include/core/SkRect.h"
15 #include "third_party/skia/include/core/SkScalar.h"
16 #include "ui/gfx/rect_conversions.h"
17 #include "ui/gfx/rect_f.h"
18 
19 namespace cc {
20 
ContentLayerUpdater(scoped_ptr<LayerPainter> painter,RenderingStatsInstrumentation * stats_instrumentation,int layer_id)21 ContentLayerUpdater::ContentLayerUpdater(
22     scoped_ptr<LayerPainter> painter,
23     RenderingStatsInstrumentation* stats_instrumentation,
24     int layer_id)
25     : rendering_stats_instrumentation_(stats_instrumentation),
26       layer_id_(layer_id),
27       painter_(painter.Pass()),
28       layer_is_opaque_(false) {}
29 
~ContentLayerUpdater()30 ContentLayerUpdater::~ContentLayerUpdater() {}
31 
set_rendering_stats_instrumentation(RenderingStatsInstrumentation * rsi)32 void ContentLayerUpdater::set_rendering_stats_instrumentation(
33     RenderingStatsInstrumentation* rsi) {
34   rendering_stats_instrumentation_ = rsi;
35 }
36 
PaintContents(SkCanvas * canvas,gfx::Point origin,float contents_width_scale,float contents_height_scale,gfx::Rect * resulting_opaque_rect)37 void ContentLayerUpdater::PaintContents(SkCanvas* canvas,
38                                         gfx::Point origin,
39                                         float contents_width_scale,
40                                         float contents_height_scale,
41                                         gfx::Rect* resulting_opaque_rect) {
42   TRACE_EVENT0("cc", "ContentLayerUpdater::PaintContents");
43   canvas->save();
44   canvas->translate(SkFloatToScalar(-origin.x()),
45                     SkFloatToScalar(-origin.y()));
46 
47   SkBaseDevice* device = canvas->getDevice();
48   gfx::Rect content_rect(origin, gfx::Size(device->width(), device->height()));
49 
50   gfx::Rect layer_rect = content_rect;
51 
52   if (contents_width_scale != 1.f || contents_height_scale != 1.f) {
53     canvas->scale(SkFloatToScalar(contents_width_scale),
54                   SkFloatToScalar(contents_height_scale));
55 
56     layer_rect = gfx::ScaleToEnclosingRect(
57         content_rect, 1.f / contents_width_scale, 1.f / contents_height_scale);
58   }
59 
60   SkRect layer_sk_rect = SkRect::MakeXYWH(
61       layer_rect.x(), layer_rect.y(), layer_rect.width(), layer_rect.height());
62 
63   canvas->clipRect(layer_sk_rect);
64 
65   // If the layer has opaque contents then there is no need to
66   // clear the canvas before painting.
67   if (!layer_is_opaque_) {
68     TRACE_EVENT0("cc", "Clear");
69     canvas->drawColor(SK_ColorTRANSPARENT, SkXfermode::kSrc_Mode);
70   }
71 
72   gfx::RectF opaque_layer_rect;
73   painter_->Paint(canvas, layer_rect, &opaque_layer_rect);
74   canvas->restore();
75 
76   gfx::Rect opaque_content_rect = gfx::ToEnclosedRect(gfx::ScaleRect(
77       opaque_layer_rect, contents_width_scale, contents_height_scale));
78   *resulting_opaque_rect = opaque_content_rect;
79 
80   content_rect_ = content_rect;
81 }
82 
SetOpaque(bool opaque)83 void ContentLayerUpdater::SetOpaque(bool opaque) {
84   layer_is_opaque_ = opaque;
85 }
86 
87 }  // namespace cc
88