Home | History | Annotate | Download | only in ui
      1 // Copyright (c) 2012 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 "chrome/browser/ui/ntp_background_util.h"
      6 
      7 #include <cmath>
      8 
      9 #include "base/logging.h"
     10 #include "chrome/browser/themes/theme_properties.h"
     11 #include "grit/theme_resources.h"
     12 #include "ui/base/theme_provider.h"
     13 #include "ui/gfx/canvas.h"
     14 #include "ui/gfx/image/image_skia.h"
     15 #include "ui/gfx/rect.h"
     16 #include "ui/gfx/skia_util.h"
     17 
     18 namespace {
     19 
     20 void PaintThemeBackground(
     21     gfx::Canvas* canvas, gfx::ImageSkia* ntp_background, int tiling,
     22     int alignment, const gfx::Rect& area, int tab_contents_height) {
     23   int x_pos = 0;
     24   int y_pos = 0;
     25   int width = area.width() + ntp_background->width();
     26   int height = area.height() + ntp_background->height();
     27 
     28   if (alignment & ThemeProperties::ALIGN_BOTTOM) {
     29     y_pos += area.height() + tab_contents_height - ntp_background->height();
     30   } else if (alignment & ThemeProperties::ALIGN_TOP) {
     31     // no op
     32   } else {  // ALIGN_CENTER
     33     y_pos += std::floor(area.height() + tab_contents_height / 2.0 -
     34         ntp_background->height() / 2.0 + 0.5);
     35   }
     36 
     37   if (alignment & ThemeProperties::ALIGN_RIGHT) {
     38     x_pos += area.width() - ntp_background->width();
     39   } else if (alignment & ThemeProperties::ALIGN_LEFT) {
     40     // no op
     41   } else {  // ALIGN_CENTER
     42     x_pos +=
     43         std::floor(area.width() / 2.0 - ntp_background->width() / 2.0 + 0.5);
     44   }
     45 
     46   if (tiling != ThemeProperties::REPEAT &&
     47       tiling != ThemeProperties::REPEAT_X) {
     48     width = ntp_background->width();
     49   } else if (x_pos > 0) {
     50     x_pos = x_pos % ntp_background->width() - ntp_background->width();
     51   }
     52 
     53   if (tiling != ThemeProperties::REPEAT &&
     54       tiling != ThemeProperties::REPEAT_Y) {
     55     height = ntp_background->height();
     56   } else if (y_pos > 0) {
     57     y_pos = y_pos % ntp_background->height() - ntp_background->height();
     58   }
     59 
     60   x_pos += area.x();
     61   y_pos += area.y();
     62 
     63   canvas->TileImageInt(*ntp_background, x_pos, y_pos, width, height);
     64 }
     65 
     66 }  // namespace
     67 
     68 // static
     69 void NtpBackgroundUtil::PaintBackgroundDetachedMode(ui::ThemeProvider* tp,
     70                                                     gfx::Canvas* canvas,
     71                                                     const gfx::Rect& area,
     72                                                     int tab_contents_height) {
     73   // Draw the background to match the new tab page.
     74   canvas->FillRect(area, tp->GetColor(ThemeProperties::COLOR_NTP_BACKGROUND));
     75 
     76   if (tp->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) {
     77     int tiling = tp->GetDisplayProperty(ThemeProperties::NTP_BACKGROUND_TILING);
     78     int alignment = tp->GetDisplayProperty(
     79         ThemeProperties::NTP_BACKGROUND_ALIGNMENT);
     80     gfx::ImageSkia* ntp_background =
     81         tp->GetImageSkiaNamed(IDR_THEME_NTP_BACKGROUND);
     82 
     83     PaintThemeBackground(
     84         canvas, ntp_background, tiling, alignment, area, tab_contents_height);
     85   }
     86 }
     87