/* * Copyright (C) 2007 The Android Open Source Project * Copyright (C) 2013 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef NATIVEWINDOW_FAKE_SURFACE_COMPOSER_H #define NATIVEWINDOW_FAKE_SURFACE_COMPOSER_H #include #include #include #include #include #include #include #include #include #include #include class nsIWidget; namespace android { // --------------------------------------------------------------------------- class GraphicProducerWrapper; class IGraphicBufferAlloc; enum { eTransactionNeeded = 0x01, eTraversalNeeded = 0x02, eDisplayTransactionNeeded = 0x04, eTransactionMask = 0x07 }; class FakeSurfaceComposer : public BinderService, public BnSurfaceComposer { public: static char const* getServiceName() { return "FakeSurfaceComposer"; } // Instantiate FakeSurfaceComposer and register to service manager. // If service manager is not present, wait until service manager becomes present. static void instantiate(); #if ANDROID_VERSION >= 19 virtual void destroyDisplay(const sp& display); #endif #if ANDROID_VERSION >= 21 virtual status_t captureScreen(const sp& display, const sp& producer, Rect sourceCrop, uint32_t reqWidth, uint32_t reqHeight, uint32_t minLayerZ, uint32_t maxLayerZ, bool useIdentityTransform, Rotation rotation = eRotateNone); #elif ANDROID_VERSION >= 19 virtual status_t captureScreen(const sp& display, const sp& producer, uint32_t reqWidth, uint32_t reqHeight, uint32_t minLayerZ, uint32_t maxLayerZ); #else virtual status_t captureScreen(const sp& display, const sp& producer, uint32_t reqWidth, uint32_t reqHeight, uint32_t minLayerZ, uint32_t maxLayerZ, bool isCpuConsumer); #endif private: FakeSurfaceComposer(); // We're reference counted, never destroy FakeSurfaceComposer directly virtual ~FakeSurfaceComposer(); /* ------------------------------------------------------------------------ * IBinder interface */ virtual status_t onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags); /* ------------------------------------------------------------------------ * ISurfaceComposer interface */ virtual sp createConnection(); virtual sp createGraphicBufferAlloc(); virtual sp createDisplay(const String8& displayName, bool secure); virtual sp getBuiltInDisplay(int32_t id); virtual void setTransactionState(const Vector& state, const Vector& displays, uint32_t flags); virtual void bootFinished(); virtual bool authenticateSurfaceTexture( const sp& bufferProducer) const; virtual sp createDisplayEventConnection(); #if ANDROID_VERSION >= 21 virtual void setPowerMode(const sp& display, int mode); virtual status_t getDisplayConfigs(const sp& display, Vector* configs); virtual status_t getDisplayStats(const sp& display, DisplayStatInfo* stats); virtual int getActiveConfig(const sp& display); virtual status_t setActiveConfig(const sp& display, int id); virtual status_t clearAnimationFrameStats(); virtual status_t getAnimationFrameStats(FrameStats* outStats) const; #elif ANDROID_VERSION >= 17 // called when screen needs to turn off virtual void blank(const sp& display); // called when screen is turning back on virtual void unblank(const sp& display); virtual status_t getDisplayInfo(const sp& display, DisplayInfo* info); #endif void getPrimaryDisplayInfo(DisplayInfo* info); /* ------------------------------------------------------------------------ * Transactions */ uint32_t setDisplayStateLocked(const DisplayState& s); void captureScreenImp(const sp& producer, uint32_t reqWidth, uint32_t reqHeight, const sp& wrapper); sp mPrimaryDisplay; struct DisplayDeviceState { enum { NO_LAYER_STACK = 0xFFFFFFFF, }; DisplayDeviceState() : type(-1), displayId(-1), width(0), height(0) { } DisplayDeviceState(int type) : type(type), displayId(-1), layerStack(NO_LAYER_STACK), orientation(0), width(0), height(0) { viewport.makeInvalid(); frame.makeInvalid(); } bool isValid() const { return type >= 0; } int type; int displayId; sp surface; uint32_t layerStack; Rect viewport; Rect frame; uint8_t orientation; uint32_t width, height; String8 displayName; bool isSecure; }; // access must be protected by mStateLock mutable Mutex mStateLock; DefaultKeyedVector, DisplayDeviceState> mDisplays; friend class DestroyDisplayRunnable; }; // --------------------------------------------------------------------------- }; // namespace android #endif // NATIVEWINDOW_FAKE_SURFACE_COMPOSER_H