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