1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
|
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/frame/top_container_background.h"
#include "chrome/browser/themes/theme_properties.h"
#include "chrome/browser/ui/color/chrome_color_id.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/tabs/tab_strip.h"
#include "chrome/grit/theme_resources.h"
#include "ui/base/theme_provider.h"
#include "ui/color/color_provider.h"
#include "ui/gfx/canvas.h"
TopContainerBackground::TopContainerBackground(BrowserView* browser_view)
: browser_view_(browser_view) {}
void TopContainerBackground::Paint(gfx::Canvas* canvas,
views::View* view) const {
PaintBackground(canvas, view, browser_view_);
}
bool TopContainerBackground::PaintThemeCustomImage(
gfx::Canvas* canvas,
const views::View* view,
const BrowserView* browser_view) {
const ui::ThemeProvider* const theme_provider = view->GetThemeProvider();
if (!theme_provider->HasCustomImage(IDR_THEME_TOOLBAR)) {
return false;
}
PaintThemeAlignedImage(canvas, view, browser_view,
theme_provider->GetImageSkiaNamed(IDR_THEME_TOOLBAR));
return true;
}
void TopContainerBackground::PaintThemeAlignedImage(
gfx::Canvas* canvas,
const views::View* view,
const BrowserView* browser_view,
gfx::ImageSkia* image) {
// Get the origin of this view and translate it to coordinate system of the
// BrowserView.
gfx::Point pos;
views::View::ConvertPointToTarget(view, browser_view, &pos);
// Add in the translation to account for positioning of the theme image
// relative of the origin of BrowserView.
pos.Offset(0, ThemeProperties::kFrameHeightAboveTabs);
// Make sure the the background will cover the entire clip path region.
// TODO(crbug.com/41344902): Remove the clip code and just use local bounds
// once the pixel canvas is enabled on all aura platforms.
SkPath clip_path = view->clip_path();
SkRect rect = clip_path.getBounds();
const gfx::Rect bounds =
!clip_path.isEmpty()
? gfx::Rect(rect.x(), rect.y(), rect.width(), rect.height())
: view->GetLocalBounds();
canvas->TileImageInt(*image, pos.x(), pos.y(), bounds.x(), bounds.y(),
bounds.width(), bounds.height(), 1.0f,
SkTileMode::kRepeat, SkTileMode::kMirror);
}
void TopContainerBackground::PaintBackground(gfx::Canvas* canvas,
const views::View* view,
const BrowserView* browser_view) {
bool painted = PaintThemeCustomImage(canvas, view, browser_view);
if (!painted) {
canvas->DrawColor(view->GetColorProvider()->GetColor(kColorToolbar));
}
}
|