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       painter_(painter.Pass()) {}
     27 
     28 ContentLayerUpdater::~ContentLayerUpdater() {}
     29 
     30 void ContentLayerUpdater::set_rendering_stats_instrumentation(
     31     RenderingStatsInstrumentation* rsi) {
     32   rendering_stats_instrumentation_ = rsi;
     33 }
     34 
     35 void ContentLayerUpdater::PaintContents(SkCanvas* canvas,
     36                                         gfx::Rect content_rect,
     37                                         float contents_width_scale,
     38                                         float contents_height_scale,
     39                                         gfx::Rect* resulting_opaque_rect) {
     40   TRACE_EVENT0("cc", "ContentLayerUpdater::PaintContents");
     41   canvas->save();
     42   canvas->translate(SkFloatToScalar(-content_rect.x()),
     43                     SkFloatToScalar(-content_rect.y()));
     44 
     45   gfx::Rect layer_rect = content_rect;
     46 
     47   if (contents_width_scale != 1.f || contents_height_scale != 1.f) {
     48     canvas->scale(SkFloatToScalar(contents_width_scale),
     49                   SkFloatToScalar(contents_height_scale));
     50 
     51     layer_rect = gfx::ScaleToEnclosingRect(
     52         content_rect, 1.f / contents_width_scale, 1.f / contents_height_scale);
     53   }
     54 
     55   SkPaint paint;
     56   paint.setAntiAlias(false);
     57   paint.setXfermodeMode(SkXfermode::kClear_Mode);
     58   SkRect layer_sk_rect = SkRect::MakeXYWH(
     59       layer_rect.x(), layer_rect.y(), layer_rect.width(), layer_rect.height());
     60   canvas->drawRect(layer_sk_rect, paint);
     61   canvas->clipRect(layer_sk_rect);
     62 
     63   gfx::RectF opaque_layer_rect;
     64   painter_->Paint(canvas, layer_rect, &opaque_layer_rect);
     65   canvas->restore();
     66 
     67   gfx::Rect opaque_content_rect = gfx::ToEnclosedRect(gfx::ScaleRect(
     68       opaque_layer_rect, contents_width_scale, contents_height_scale));
     69   *resulting_opaque_rect = opaque_content_rect;
     70 
     71   content_rect_ = content_rect;
     72 }
     73 
     74 }  // namespace cc
     75