1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/chromeos/wm_overview_favicon.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/wm_ipc.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/wm_overview_snapshot.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "skia/ext/image_operations.h"
1221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "third_party/cros/chromeos_wm_ipc_enums.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "third_party/skia/include/core/SkBitmap.h"
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/x/x11_util.h"
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/image_view.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/label.h"
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "views/layout/grid_layout.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing std::vector;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !defined(OS_CHROMEOS)
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#error This file is only meant to be compiled for ChromeOS
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace chromeos {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenconst int WmOverviewFavicon::kIconSize = 32;
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenWmOverviewFavicon::WmOverviewFavicon()
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : WidgetGtk(TYPE_WINDOW),
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      favicon_view_(NULL) {
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WmOverviewFavicon::Init(WmOverviewSnapshot* snapshot) {
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MakeTransparent();
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  favicon_view_ = new views::ImageView();
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WidgetGtk::Init(NULL, gfx::Rect(0, 0, 0, 0));
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  SetContentsView(favicon_view_);
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set the window type
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  vector<int> params;
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  params.push_back(ui::GetX11WindowFromGtkWidget(
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GTK_WIDGET(snapshot->GetNativeView())));
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  WmIpc::instance()->SetWindowType(
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      GetNativeView(),
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      WM_IPC_WINDOW_CHROME_TAB_FAV_ICON,
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      &params);
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid WmOverviewFavicon::SetFavicon(const SkBitmap& image) {
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CHECK(favicon_view_) << "Init not called before setting favicon.";
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SkBitmap icon;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  if (image.width() && image.height()) {
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    float aspect_ratio = static_cast<float>(image.width()) / image.height();
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int new_width = kIconSize;
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int new_height = kIconSize;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (aspect_ratio > 1.0f) {
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new_height = kIconSize / aspect_ratio;
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    } else {
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      new_width = kIconSize * aspect_ratio;
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (new_width && new_height) {
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      icon = skia::ImageOperations::Resize(
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          image, skia::ImageOperations::RESIZE_BOX,
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          new_width, new_height);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  favicon_view_->SetImage(icon);
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reset the bounds to the size of the image.
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  SetBounds(gfx::Rect(icon.width(), icon.height()));
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace chromeos
80