12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/layers/content_layer_client.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/resources/bitmap_content_layer_updater.h"
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "cc/test/fake_rendering_stats_instrumentation.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "cc/test/geometry_test_utils.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "skia/ext/platform_canvas.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/rect_conversions.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace cc {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockContentLayerClient : public ContentLayerClient {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  explicit MockContentLayerClient(const gfx::Rect& opaque_layer_rect)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : opaque_layer_rect_(opaque_layer_rect) {}
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void PaintContents(
24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      SkCanvas* canvas,
25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      const gfx::Rect& clip,
26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      gfx::RectF* opaque,
27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)      ContentLayerClient::GraphicsContextStatus gc_status) OVERRIDE {
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    *opaque = gfx::RectF(opaque_layer_rect_);
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void DidChangeLayerCanUseLCDText() OVERRIDE {}
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual bool FillsBoundsCompletely() const OVERRIDE { return false; }
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect opaque_layer_rect_;
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(ContentLayerTest, ContentLayerPainterWithDeviceScale) {
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float contents_scale = 2.f;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect content_rect(10, 10, 100, 100);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect opaque_rect_in_layer_space(5, 5, 20, 20);
4190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  gfx::Rect opaque_rect_in_content_space = gfx::ScaleToEnclosingRect(
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      opaque_rect_in_layer_space, contents_scale, contents_scale);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  MockContentLayerClient client(opaque_rect_in_layer_space);
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeRenderingStatsInstrumentation stats_instrumentation;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_refptr<BitmapContentLayerUpdater> updater =
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      BitmapContentLayerUpdater::Create(
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          ContentLayerPainter::Create(&client).PassAs<LayerPainter>(),
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          &stats_instrumentation,
4990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)          0);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect resulting_opaque_rect;
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  updater->PrepareToUpdate(content_rect,
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           gfx::Size(256, 256),
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           contents_scale,
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                           contents_scale,
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                           &resulting_opaque_rect);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  EXPECT_EQ(opaque_rect_in_content_space.ToString(),
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)            resulting_opaque_rect.ToString());
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace cc
64