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/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 
     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 
     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                                         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 
     83 void ContentLayerUpdater::SetOpaque(bool opaque) {
     84   layer_is_opaque_ = opaque;
     85 }
     86 
     87 }  // namespace cc
     88