• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <compositionengine/DisplayColorProfile.h>
20 #include <compositionengine/RenderSurface.h>
21 #include <compositionengine/impl/Output.h>
22 #include <ui/Rect.h>
23 #include <unordered_map>
24 
25 namespace android {
26 
27 struct ScreenCaptureOutputArgs {
28     const compositionengine::CompositionEngine& compositionEngine;
29     const compositionengine::Output::ColorProfile& colorProfile;
30     ui::LayerStack layerStack;
31     Rect sourceCrop;
32     std::shared_ptr<renderengine::ExternalTexture> buffer;
33     ftl::Optional<DisplayIdVariant> displayIdVariant;
34     ui::Size reqBufferSize;
35     float sdrWhitePointNits;
36     float displayBrightnessNits;
37     // Counterintuitively, when targetBrightness > 1.0 then dim the scene.
38     float targetBrightness;
39     float layerAlpha;
40     bool regionSampling;
41     bool treat170mAsSrgb;
42     bool dimInGammaSpaceForEnhancedScreenshots;
43     bool isSecure = false;
44     bool isProtected = false;
45     bool enableLocalTonemapping = false;
46 };
47 
48 // ScreenCaptureOutput is used to compose a set of layers into a preallocated buffer.
49 //
50 // SurfaceFlinger passes instances of ScreenCaptureOutput to CompositionEngine in calls to
51 // SurfaceFlinger::captureLayers and SurfaceFlinger::captureDisplay.
52 class ScreenCaptureOutput : public compositionengine::impl::Output {
53 public:
54     ScreenCaptureOutput(const Rect sourceCrop, ftl::Optional<DisplayIdVariant> displayIdVariant,
55                         const compositionengine::Output::ColorProfile& colorProfile,
56                         float layerAlpha, bool regionSampling,
57                         bool dimInGammaSpaceForEnhancedScreenshots, bool enableLocalTonemapping);
58 
59     void updateColorProfile(const compositionengine::CompositionRefreshArgs&) override;
60 
61     std::vector<compositionengine::LayerFE::LayerSettings> generateClientCompositionRequests(
62             bool supportsProtectedContent, ui::Dataspace outputDataspace,
63             std::vector<compositionengine::LayerFE*>& outLayerFEs) override;
64 
65 protected:
getSkipColorTransform()66     bool getSkipColorTransform() const override { return false; }
67     renderengine::DisplaySettings generateClientCompositionDisplaySettings(
68             const std::shared_ptr<renderengine::ExternalTexture>& buffer) const override;
69 
70 private:
71     std::unordered_map<int32_t, aidl::android::hardware::graphics::composer3::Luts> generateLuts();
72     const Rect mSourceCrop;
73     const ftl::Optional<DisplayIdVariant> mDisplayIdVariant;
74     const compositionengine::Output::ColorProfile& mColorProfile;
75     const float mLayerAlpha;
76     const bool mRegionSampling;
77     const bool mDimInGammaSpaceForEnhancedScreenshots;
78     const bool mEnableLocalTonemapping;
79 };
80 
81 std::shared_ptr<ScreenCaptureOutput> createScreenCaptureOutput(ScreenCaptureOutputArgs);
82 
83 } // namespace android
84