shadow_layer_delegate.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/web_contents/aura/shadow_layer_delegate.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "third_party/skia/include/effects/SkGradientShader.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/compositor/layer.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/skia_util.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kShadowLightColor = SkColorSetARGB(0x0, 0, 0, 0); 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const SkColor kShadowDarkColor = SkColorSetARGB(0x70, 0, 0, 0); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kShadowThick = 7; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content { 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)ShadowLayerDelegate::ShadowLayerDelegate(ui::Layer* shadow_for) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : layer_(new ui::Layer(ui::LAYER_TEXTURED)) { 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_->set_delegate(this); 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_->SetBounds(gfx::Rect(-kShadowThick, 0, kShadowThick, 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) shadow_for->bounds().height())); 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) layer_->SetFillsBoundsOpaquely(false); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shadow_for->Add(layer_.get()); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ShadowLayerDelegate::~ShadowLayerDelegate() { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShadowLayerDelegate::OnPaintLayer(gfx::Canvas* canvas) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkPoint points[2]; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SkColor kShadowColors[2] = { kShadowLightColor, kShadowDarkColor }; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) points[0].iset(0, 0); 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) points[1].iset(kShadowThick, 0); 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) skia::RefPtr<SkShader> shader = skia::AdoptRef( 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkGradientShader::CreateLinear(points, kShadowColors, NULL, 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) arraysize(points), SkShader::kRepeat_TileMode)); 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect paint_rect = gfx::Rect(0, 0, kShadowThick, 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layer_->bounds().height()); 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) SkPaint paint; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) paint.setShader(shader.get()); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas->sk_canvas()->drawRect(gfx::RectToSkRect(paint_rect), paint); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShadowLayerDelegate::OnDelegatedFrameDamage( 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& damage_rect_in_dip) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ShadowLayerDelegate::OnDeviceScaleFactorChanged(float scale_factor) { 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)base::Closure ShadowLayerDelegate::PrepareForLayerBoundsChange() { 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return base::Bind(&base::DoNothing); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)