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 ¶ms); 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