// Copyright (c) 2009 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/ntp_background_util.h"

#include "base/logging.h"
#include "chrome/browser/themes/browser_theme_provider.h"
#include "grit/theme_resources.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/skia_util.h"

namespace {

void PaintThemeBackground(
    gfx::Canvas* canvas, SkBitmap* 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 & BrowserThemeProvider::ALIGN_BOTTOM)
    y_pos += area.height() + tab_contents_height - ntp_background->height();

  if (alignment & BrowserThemeProvider::ALIGN_RIGHT) {
    x_pos += area.width() - ntp_background->width();
  } else if (alignment & BrowserThemeProvider::ALIGN_LEFT) {
    // no op
  } else {  // ALIGN_CENTER
    x_pos += area.width() / 2 - ntp_background->width() / 2;
  }

  if (tiling != BrowserThemeProvider::REPEAT &&
      tiling != BrowserThemeProvider::REPEAT_X) {
    width = ntp_background->width();
  } else if (x_pos > 0) {
    x_pos = x_pos % ntp_background->width() - ntp_background->width();
  }

  if (tiling != BrowserThemeProvider::REPEAT &&
      tiling != BrowserThemeProvider::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->FillRectInt(tp->GetColor(BrowserThemeProvider::COLOR_NTP_BACKGROUND),
                      area.x(), area.y(), area.width(), area.height());

  if (tp->HasCustomImage(IDR_THEME_NTP_BACKGROUND)) {
    int tiling = BrowserThemeProvider::NO_REPEAT;
    tp->GetDisplayProperty(BrowserThemeProvider::NTP_BACKGROUND_TILING,
                           &tiling);
    int alignment;
    if (tp->GetDisplayProperty(BrowserThemeProvider::NTP_BACKGROUND_ALIGNMENT,
        &alignment)) {
      SkBitmap* ntp_background = tp->GetBitmapNamed(IDR_THEME_NTP_BACKGROUND);

      PaintThemeBackground(
          canvas, ntp_background, tiling, alignment, area, tab_contents_height);
    }
  }
}
