// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/ui/ntp_background_util.h" #include <cmath> #include "base/logging.h" #include "chrome/browser/themes/theme_properties.h" #include "grit/theme_resources.h" #include "ui/base/theme_provider.h" #include "ui/gfx/canvas.h" #include "ui/gfx/image/image_skia.h" #include "ui/gfx/rect.h" #include "ui/gfx/skia_util.h" namespace { void PaintThemeBackground( gfx::Canvas* canvas, gfx::ImageSkia* ntp_background, int tiling, int alignment, const gfx::Rect& area, int tab_contents_height) { int x_pos = 0; int y_pos = 0; int width = area.width() + ntp_background->width(); int height = area.height() + ntp_background->height(); if (alignment & ThemeProperties::ALIGN_BOTTOM) { y_pos += area.height() + tab_contents_height - ntp_background->height(); } else if (alignment & ThemeProperties::ALIGN_TOP) { // no op } else { // ALIGN_CENTER y_pos += std::floor(area.height() + tab_contents_height / 2.0 - ntp_background->height() / 2.0 + 0.5); } if (alignment & ThemeProperties::ALIGN_RIGHT) { x_pos += area.width() - ntp_background->width(); } else if (alignment & ThemeProperties::ALIGN_LEFT) { // no op } else { // ALIGN_CENTER x_pos += std::floor(area.width() / 2.0 - ntp_background->width() / 2.0 + 0.5); } if (tiling != ThemeProperties::REPEAT && tiling != ThemeProperties::REPEAT_X) { width = ntp_background->width(); } else if (x_pos > 0) { x_pos = x_pos % ntp_background->width() - ntp_background->width(); } if (tiling != ThemeProperties::REPEAT && tiling != ThemeProperties::REPEAT_Y) { height = ntp_background->height(); } else if (y_pos > 0) { y_pos = y_pos % ntp_background->height() - ntp_background->height(); } x_pos += area.x(); y_pos += area.y(); canvas->TileImageInt(*ntp_background, x_pos, y_pos, width, height); } } // namespace // static void NtpBackgroundUtil::PaintBackgroundDetachedMode(ui::ThemeProvider* tp, gfx::Canvas* canvas, const gfx::Rect& area, int tab_contents_height) { // Draw the background to match the new tab page. canvas->FillRect(area, tp->GetColor(ThemeProperties::COLOR_NTP_BACKGROUND)); if (tp->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) { int tiling = tp->GetDisplayProperty(ThemeProperties::NTP_BACKGROUND_TILING); int alignment = tp->GetDisplayProperty( ThemeProperties::NTP_BACKGROUND_ALIGNMENT); gfx::ImageSkia* ntp_background = tp->GetImageSkiaNamed(IDR_THEME_NTP_BACKGROUND); PaintThemeBackground( canvas, ntp_background, tiling, alignment, area, tab_contents_height); } }