Index: chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.cc |
diff --git a/chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.cc b/chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.cc |
deleted file mode 100644 |
index a5ba542d020561df59b60e3154c106980db4ab91..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.cc |
+++ /dev/null |
@@ -1,217 +0,0 @@ |
-// Copyright (c) 2012 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/ui/views/panels/taskbar_window_thumbnailer_win.h" |
- |
-#include <dwmapi.h> |
- |
-#include <algorithm> |
- |
-#include "base/logging.h" |
-#include "base/win/scoped_hdc.h" |
-#include "skia/ext/image_operations.h" |
-#include "ui/gfx/canvas.h" |
-#include "ui/gfx/gdi_util.h" |
- |
-namespace { |
- |
-HBITMAP GetNativeBitmapFromSkBitmap(const SkBitmap& bitmap) { |
- int width = bitmap.width(); |
- int height = bitmap.height(); |
- |
- BITMAPV4HEADER native_bitmap_header; |
- gfx::CreateBitmapV4Header(width, height, &native_bitmap_header); |
- |
- HDC dc = ::GetDC(NULL); |
- void* bits; |
- HBITMAP native_bitmap = ::CreateDIBSection(dc, |
- reinterpret_cast<BITMAPINFO*>(&native_bitmap_header), |
- DIB_RGB_COLORS, |
- &bits, |
- NULL, |
- 0); |
- DCHECK(native_bitmap); |
- ::ReleaseDC(NULL, dc); |
- bitmap.copyPixelsTo(bits, width * height * 4, width * 4); |
- return native_bitmap; |
-} |
- |
-void EnableCustomThumbnail(HWND hwnd, bool enable) { |
- BOOL enable_value = enable; |
- ::DwmSetWindowAttribute(hwnd, |
- DWMWA_FORCE_ICONIC_REPRESENTATION, |
- &enable_value, |
- sizeof(enable_value)); |
- ::DwmSetWindowAttribute(hwnd, |
- DWMWA_HAS_ICONIC_BITMAP, |
- &enable_value, |
- sizeof(enable_value)); |
-} |
- |
-} // namespace |
- |
- |
-TaskbarWindowThumbnailerWin::TaskbarWindowThumbnailerWin( |
- HWND hwnd, TaskbarWindowThumbnailerDelegateWin* delegate) |
- : hwnd_(hwnd), |
- delegate_(delegate) { |
- ui::HWNDSubclass::AddFilterToTarget(hwnd_, this); |
-} |
- |
-TaskbarWindowThumbnailerWin::~TaskbarWindowThumbnailerWin() { |
- ui::HWNDSubclass::RemoveFilterFromAllTargets(this); |
-} |
- |
-void TaskbarWindowThumbnailerWin::Start() { |
- EnableCustomThumbnail(hwnd_, true); |
-} |
- |
-void TaskbarWindowThumbnailerWin::Stop() { |
- capture_bitmap_.reset(); |
- EnableCustomThumbnail(hwnd_, false); |
-} |
- |
-void TaskbarWindowThumbnailerWin::CaptureSnapshot() { |
- if (!capture_bitmap_) |
- capture_bitmap_.reset(CaptureWindowImage()); |
-} |
- |
-void TaskbarWindowThumbnailerWin::InvalidateSnapshot() { |
- capture_bitmap_.reset(); |
- |
- // The snapshot feeded to the system could be cached. Invalidate it. |
- ::DwmInvalidateIconicBitmaps(hwnd_); |
-} |
- |
-void TaskbarWindowThumbnailerWin::ReplaceWindow(HWND new_hwnd) { |
- // Stop serving the custom thumbnail for the old window. |
- EnableCustomThumbnail(hwnd_, false); |
- ui::HWNDSubclass::RemoveFilterFromAllTargets(this); |
- |
- hwnd_ = new_hwnd; |
- |
- // Start serving the custom thumbnail to the new window. |
- ui::HWNDSubclass::AddFilterToTarget(hwnd_, this); |
- EnableCustomThumbnail(hwnd_, true); |
-} |
- |
-bool TaskbarWindowThumbnailerWin::FilterMessage(HWND hwnd, |
- UINT message, |
- WPARAM w_param, |
- LPARAM l_param, |
- LRESULT* l_result) { |
- DCHECK_EQ(hwnd_, hwnd); |
- switch (message) { |
- case WM_DWMSENDICONICTHUMBNAIL: |
- return OnDwmSendIconicThumbnail(HIWORD(l_param), |
- LOWORD(l_param), |
- l_result); |
- case WM_DWMSENDICONICLIVEPREVIEWBITMAP: |
- return OnDwmSendIconicLivePreviewBitmap(l_result); |
- } |
- return false; |
-} |
- |
-bool TaskbarWindowThumbnailerWin::OnDwmSendIconicThumbnail( |
- int width, int height, LRESULT* l_result) { |
- CaptureSnapshot(); |
- |
- SkBitmap* thumbnail_bitmap = capture_bitmap_.get(); |
- |
- // Scale the image if needed. |
- SkBitmap scaled_bitmap; |
- if (capture_bitmap_->width() != width || |
- capture_bitmap_->height() != height) { |
- double x_scale = static_cast<double>(width) / capture_bitmap_->width(); |
- double y_scale = static_cast<double>(height) / capture_bitmap_->height(); |
- double scale = std::min(x_scale, y_scale); |
- width = capture_bitmap_->width() * scale; |
- height = capture_bitmap_->height() * scale; |
- scaled_bitmap = skia::ImageOperations::Resize( |
- *capture_bitmap_, skia::ImageOperations::RESIZE_GOOD, width, height); |
- thumbnail_bitmap = &scaled_bitmap; |
- } |
- |
- HBITMAP native_bitmap = GetNativeBitmapFromSkBitmap(*thumbnail_bitmap); |
- ::DwmSetIconicThumbnail(hwnd_, native_bitmap, 0); |
- ::DeleteObject(native_bitmap); |
- |
- *l_result = 0; |
- return true; |
-} |
- |
-bool TaskbarWindowThumbnailerWin::OnDwmSendIconicLivePreviewBitmap( |
- LRESULT* l_result) { |
- CaptureSnapshot(); |
- |
- HBITMAP native_bitmap = GetNativeBitmapFromSkBitmap(*capture_bitmap_); |
- ::DwmSetIconicLivePreviewBitmap(hwnd_, native_bitmap, NULL, 0); |
- ::DeleteObject(native_bitmap); |
- *l_result = 0; |
- return true; |
-} |
- |
-SkBitmap* TaskbarWindowThumbnailerWin::CaptureWindowImage() const { |
- std::vector<HWND> snapshot_hwnds; |
- if (delegate_) |
- snapshot_hwnds = delegate_->GetSnapshotWindowHandles(); |
- if (snapshot_hwnds.empty()) |
- snapshot_hwnds.push_back(hwnd_); |
- |
- int enclosing_x = 0; |
- int enclosing_y = 0; |
- int enclosing_right = 0; |
- int enclosing_bottom = 0; |
- for (std::vector<HWND>::const_iterator iter = snapshot_hwnds.begin(); |
- iter != snapshot_hwnds.end(); ++iter) { |
- RECT bounds; |
- if (!::GetWindowRect(*iter, &bounds)) |
- continue; |
- if (iter == snapshot_hwnds.begin()) { |
- enclosing_x = bounds.left; |
- enclosing_y = bounds.top; |
- enclosing_right = bounds.right; |
- enclosing_bottom = bounds.bottom; |
- } else { |
- if (bounds.left < enclosing_x) |
- enclosing_x = bounds.left; |
- if (bounds.top < enclosing_y) |
- enclosing_y = bounds.top; |
- if (bounds.right > enclosing_right) |
- enclosing_right = bounds.right; |
- if (bounds.bottom > enclosing_bottom) |
- enclosing_bottom = bounds.bottom; |
- } |
- } |
- |
- int width = enclosing_right - enclosing_x; |
- int height = enclosing_bottom - enclosing_y; |
- if (!width || !height) |
- return NULL; |
- |
- gfx::Canvas canvas(gfx::Size(width, height), 1.0f, false); |
- { |
- skia::ScopedPlatformPaint scoped_platform_paint(canvas.sk_canvas()); |
- HDC target_dc = scoped_platform_paint.GetPlatformSurface(); |
- for (std::vector<HWND>::const_iterator iter = snapshot_hwnds.begin(); |
- iter != snapshot_hwnds.end(); ++iter) { |
- HWND current_hwnd = *iter; |
- RECT current_bounds; |
- if (!::GetWindowRect(current_hwnd, ¤t_bounds)) |
- continue; |
- base::win::ScopedGetDC source_dc(current_hwnd); |
- ::BitBlt(target_dc, |
- current_bounds.left - enclosing_x, |
- current_bounds.top - enclosing_y, |
- current_bounds.right - current_bounds.left, |
- current_bounds.bottom - current_bounds.top, |
- source_dc, |
- 0, |
- 0, |
- SRCCOPY); |
- ::ReleaseDC(current_hwnd, source_dc); |
- } |
- } |
- return new SkBitmap(canvas.ExtractImageRep().sk_bitmap()); |
-} |