Home | History | Annotate | Download | only in resources
      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/SkPaint.h"
     13 #include "third_party/skia/include/core/SkRect.h"
     14 #include "third_party/skia/include/core/SkScalar.h"
     15 #include "ui/gfx/rect_conversions.h"
     16 #include "ui/gfx/rect_f.h"
     17 
     18 namespace cc {
     19 
     20 ContentLayerUpdater::ContentLayerUpdater(
     21     scoped_ptr<LayerPainter> painter,
     22     RenderingStatsInstrumentation* stats_instrumentation,
     23     int layer_id)
     24     : rendering_stats_instrumentation_(stats_instrumentation),
     25       layer_id_(layer_id),
     26       layer_is_opaque_(false),
     27       layer_fills_bounds_completely_(false),
     28       painter_(painter.Pass()) {}
     29 
     30 ContentLayerUpdater::~ContentLayerUpdater() {}
     31 
     32 void ContentLayerUpdater::set_rendering_stats_instrumentation(
     33     RenderingStatsInstrumentation* rsi) {
     34   rendering_stats_instrumentation_ = rsi;
     35 }
     36 
     37 void ContentLayerUpdater::PaintContents(SkCanvas* canvas,
     38                                         const gfx::Rect& content_rect,
     39                                         float contents_width_scale,
     40                                         float contents_height_scale,
     41                                         gfx::Rect* resulting_opaque_rect) {
     42   TRACE_EVENT0("cc", "ContentLayerUpdater::PaintContents");
     43   if (!canvas)
     44     return;
     45   canvas->save();
     46   canvas->translate(SkFloatToScalar(-content_rect.x()),
     47                     SkFloatToScalar(-content_rect.y()));
     48 
     49   // The |canvas| backing should be sized to hold the |content_rect|.
     50   DCHECK_EQ(content_rect.width(), canvas->getBaseLayerSize().width());
     51   DCHECK_EQ(content_rect.height(), canvas->getBaseLayerSize().height());
     52 
     53   gfx::Rect layer_rect = content_rect;
     54   if (contents_width_scale != 1.f || contents_height_scale != 1.f) {
     55     canvas->scale(SkFloatToScalar(contents_width_scale),
     56                   SkFloatToScalar(contents_height_scale));
     57 
     58     layer_rect = gfx::ScaleToEnclosingRect(
     59         content_rect, 1.f / contents_width_scale, 1.f / contents_height_scale);
     60   }
     61 
     62   SkRect layer_sk_rect = SkRect::MakeXYWH(
     63       layer_rect.x(), layer_rect.y(), layer_rect.width(), layer_rect.height());
     64 
     65   canvas->clipRect(layer_sk_rect);
     66 
     67   // If the layer has opaque contents or will fill the bounds completely there
     68   // is no need to clear the canvas before painting.
     69   if (!layer_is_opaque_ && !layer_fills_bounds_completely_) {
     70     TRACE_EVENT0("cc", "Clear");
     71     canvas->drawColor(SK_ColorTRANSPARENT, SkXfermode::kSrc_Mode);
     72   }
     73 
     74   gfx::RectF opaque_layer_rect;
     75   painter_->Paint(canvas, layer_rect, &opaque_layer_rect);
     76   canvas->restore();
     77 
     78   gfx::Rect opaque_content_rect = gfx::ToEnclosedRect(gfx::ScaleRect(
     79       opaque_layer_rect, contents_width_scale, contents_height_scale));
     80   *resulting_opaque_rect = opaque_content_rect;
     81 
     82   content_rect_ = content_rect;
     83 }
     84 
     85 void ContentLayerUpdater::SetOpaque(bool opaque) {
     86   layer_is_opaque_ = opaque;
     87 }
     88 
     89 void ContentLayerUpdater::SetFillsBoundsCompletely(bool fills_bounds) {
     90   layer_fills_bounds_completely_ = fills_bounds;
     91 }
     92 
     93 }  // namespace cc
     94