// Copyright 2015 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 "extensions/browser/extension_icon_placeholder.h"

#include "base/memory/ptr_util.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "extensions/grit/extensions_browser_resources.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/gfx/canvas.h"
#include "ui/gfx/codec/png_codec.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/image/canvas_image_source.h"
#include "ui/gfx/image/image_skia.h"

namespace extensions {

namespace {

// Returns the FontStyle to use for the given icon |size|.
ui::ResourceBundle::FontStyle GetFontStyleForIconSize(
    extension_misc::ExtensionIcons size) {
  switch (size) {
    case extension_misc::EXTENSION_ICON_INVALID:
    case extension_misc::EXTENSION_ICON_BITTY:
      return ui::ResourceBundle::SmallFont;
    case extension_misc::EXTENSION_ICON_SMALLISH:
    case extension_misc::EXTENSION_ICON_SMALL:
      return ui::ResourceBundle::MediumFont;
    case extension_misc::EXTENSION_ICON_MEDIUM:
    case extension_misc::EXTENSION_ICON_LARGE:
    case extension_misc::EXTENSION_ICON_EXTRA_LARGE:
    case extension_misc::EXTENSION_ICON_GIGANTOR:
      return ui::ResourceBundle::LargeFont;
  }
  NOTREACHED();
  return ui::ResourceBundle::MediumFont;
}

// Returns the background image to use for the given icon |size|.
gfx::Image GetBackgroundImageForIconSize(extension_misc::ExtensionIcons size) {
  int resource_id = 0;
  // Right now, we have resources for a 19x19 (action) and a 48x48 (extensions
  // page icon). The implementation of the placeholder scales these correctly,
  // so it's not a big deal to use these for other sizes, but if it's something
  // that will be done frequently, we should probably make a devoted asset for
  // that size.
  switch (size) {
    case extension_misc::EXTENSION_ICON_INVALID:
    case extension_misc::EXTENSION_ICON_BITTY:
    case extension_misc::EXTENSION_ICON_SMALLISH:
    case extension_misc::EXTENSION_ICON_SMALL:
      resource_id = IDR_EXTENSION_ACTION_PLAIN_BACKGROUND;
      break;
    case extension_misc::EXTENSION_ICON_MEDIUM:
    case extension_misc::EXTENSION_ICON_LARGE:
    case extension_misc::EXTENSION_ICON_EXTRA_LARGE:
    case extension_misc::EXTENSION_ICON_GIGANTOR:
      resource_id = IDR_EXTENSION_ICON_PLAIN_BACKGROUND;
      break;
  }
  return ui::ResourceBundle::GetSharedInstance().GetImageNamed(resource_id);
}

}  // namespace

ExtensionIconPlaceholder::ExtensionIconPlaceholder(
    extension_misc::ExtensionIcons size,
    const std::string& letter)
    : gfx::CanvasImageSource(gfx::Size(size, size), false),
      icon_size_(size),
      letter_(base::UTF8ToUTF16(letter.substr(0, 1))),
      base_image_(GetBackgroundImageForIconSize(size)) {
}

ExtensionIconPlaceholder::~ExtensionIconPlaceholder() {
}

gfx::Image ExtensionIconPlaceholder::CreateImage(
    extension_misc::ExtensionIcons size,
    const std::string& name) {
  return gfx::Image(
      gfx::ImageSkia(std::make_unique<ExtensionIconPlaceholder>(size, name),
                     gfx::Size(size, size)));
}

void ExtensionIconPlaceholder::Draw(gfx::Canvas* canvas) {
  // Draw the background image, correctly scaled.
  canvas->DrawImageInt(*base_image_.ToImageSkia(), 0, 0,
                       base_image_.Size().width(), base_image_.Size().height(),
                       0, 0, size().width(), size().height(), true);
  gfx::Rect bounds(size().width(), size().height());
  // Draw the letter on top.
  canvas->DrawStringRectWithFlags(
      letter_, ui::ResourceBundle::GetSharedInstance().GetFontList(
                   GetFontStyleForIconSize(icon_size_)),
      SK_ColorWHITE, bounds, gfx::Canvas::TEXT_ALIGN_CENTER);
}

}  // namespace extensions
