Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1287)

Unified Diff: chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.cc

Issue 2263863002: Remove implementation of Panels on OSes other than ChromeOS. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: CR feedback Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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, &current_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());
-}
« no previous file with comments | « chrome/browser/ui/views/panels/taskbar_window_thumbnailer_win.h ('k') | chrome/browser/ui/views/panels/x11_panel_resizer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698