blob: 92f352524e519519e946dfa118689fc4910a9e6f [file] [log] [blame]
[email protected]c9bc8f12012-12-15 22:20:091// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/snapshot/snapshot.h"
6
dcheng18ec0b542016-04-26 19:28:537#include <memory>
dcheng4de264f2015-12-30 02:07:298#include <utility>
9
[email protected]2e6f39e2014-05-15 19:36:3610#include "base/bind.h"
danakjf20f4502017-09-26 17:13:3111#include "components/viz/common/frame_sinks/copy_output_request.h"
[email protected]2e6f39e2014-05-15 19:36:3612#include "third_party/skia/include/core/SkBitmap.h"
jaekyune4f9eed2015-02-24 02:06:5813#include "ui/android/view_android.h"
14#include "ui/android/window_android.h"
15#include "ui/android/window_android_compositor.h"
jinsukkim61bc73e742017-03-14 00:36:1516#include "ui/base/layout.h"
[email protected]1a8376c72014-06-20 22:37:1417#include "ui/gfx/geometry/point_conversions.h"
[email protected]cec12322014-06-17 09:47:5618#include "ui/gfx/geometry/rect_conversions.h"
[email protected]2e6f39e2014-05-15 19:36:3619#include "ui/snapshot/snapshot_async.h"
[email protected]c9bc8f12012-12-15 22:20:0920
21namespace ui {
22
jinsukkim8f74b8e72017-01-10 01:35:1723// Sync versions are not supported in Android. Callers should fall back
24// to the async version.
[email protected]c9bc8f12012-12-15 22:20:0925bool GrabViewSnapshot(gfx::NativeView view,
eseckler7233c1a72017-01-25 15:07:5426 const gfx::Rect& snapshot_bounds,
27 gfx::Image* image) {
28 return GrabWindowSnapshot(view->GetWindowAndroid(), snapshot_bounds, image);
[email protected]c9bc8f12012-12-15 22:20:0929}
30
31bool GrabWindowSnapshot(gfx::NativeWindow window,
eseckler7233c1a72017-01-25 15:07:5432 const gfx::Rect& snapshot_bounds,
33 gfx::Image* image) {
[email protected]2e6f39e2014-05-15 19:36:3634 return false;
35}
36
Bo Liu76c92642019-03-13 01:18:3137static std::unique_ptr<viz::CopyOutputRequest> CreateCopyRequest(
38 gfx::NativeView view,
[email protected]2e6f39e2014-05-15 19:36:3639 const gfx::Rect& source_rect,
Fady Samueldfecb7d2017-07-26 11:41:0440 viz::CopyOutputRequest::CopyOutputRequestCallback callback) {
41 std::unique_ptr<viz::CopyOutputRequest> request =
Yuri Wiitalab9ad27a2017-09-06 19:13:5042 std::make_unique<viz::CopyOutputRequest>(
43 viz::CopyOutputRequest::ResultFormat::RGBA_BITMAP,
44 std::move(callback));
Bo Liu76c92642019-03-13 01:18:3145 float scale = ui::GetScaleFactorForNativeView(view);
jinsukkim8f74b8e72017-01-10 01:35:1746 request->set_area(gfx::ScaleToEnclosingRect(source_rect, scale));
Bo Liu76c92642019-03-13 01:18:3147 return request;
48}
49
50static void MakeAsyncCopyRequest(
51 gfx::NativeWindow window,
52 const gfx::Rect& source_rect,
53 std::unique_ptr<viz::CopyOutputRequest> copy_request) {
54 if (!window->GetCompositor())
55 return;
56 window->GetCompositor()->RequestCopyOfOutputOnRootLayer(
57 std::move(copy_request));
[email protected]c9bc8f12012-12-15 22:20:0958}
59
[email protected]c051d5a52014-01-08 23:54:5160void GrabWindowSnapshotAndScaleAsync(
[email protected]75a3f1b2013-12-27 00:13:4361 gfx::NativeWindow window,
[email protected]2e6f39e2014-05-15 19:36:3662 const gfx::Rect& source_rect,
[email protected]75a3f1b2013-12-27 00:13:4363 const gfx::Size& target_size,
[email protected]2e6f39e2014-05-15 19:36:3664 const GrabWindowSnapshotAsyncCallback& callback) {
Bo Liu76c92642019-03-13 01:18:3165 MakeAsyncCopyRequest(
66 window, source_rect,
67 CreateCopyRequest(window, source_rect,
68 base::BindOnce(&SnapshotAsync::ScaleCopyOutputResult,
69 callback, target_size)));
[email protected]75a3f1b2013-12-27 00:13:4370}
71
eseckler7233c1a72017-01-25 15:07:5472void GrabWindowSnapshotAsync(gfx::NativeWindow window,
73 const gfx::Rect& source_rect,
74 const GrabWindowSnapshotAsyncCallback& callback) {
75 MakeAsyncCopyRequest(
76 window, source_rect,
Bo Liu76c92642019-03-13 01:18:3177 CreateCopyRequest(
78 window, source_rect,
79 base::BindOnce(&SnapshotAsync::RunCallbackWithCopyOutputResult,
80 callback)));
[email protected]2e6f39e2014-05-15 19:36:3681}
82
eseckler7233c1a72017-01-25 15:07:5483void GrabViewSnapshotAsync(gfx::NativeView view,
84 const gfx::Rect& source_rect,
85 const GrabWindowSnapshotAsyncCallback& callback) {
Bo Liu76c92642019-03-13 01:18:3186 std::unique_ptr<viz::CopyOutputRequest> copy_request =
87 view->MaybeRequestCopyOfView(CreateCopyRequest(
88 view, source_rect,
89 base::BindOnce(&SnapshotAsync::RunCallbackWithCopyOutputResult,
90 callback)));
91 if (!copy_request)
92 return;
93
94 MakeAsyncCopyRequest(view->GetWindowAndroid(), source_rect,
95 std::move(copy_request));
[email protected]c051d5a52014-01-08 23:54:5196}
97
[email protected]c9bc8f12012-12-15 22:20:0998} // namespace ui