1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "SurfaceComposerClient" 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h> 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Errors.h> 239cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <utils/Log.h> 24d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian#include <utils/Singleton.h> 25a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/SortedVector.h> 26a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/String8.h> 27a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <utils/threads.h> 289cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 29c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IMemory.h> 30a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <binder/IServiceManager.h> 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian#include <ui/DisplayInfo.h> 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurface.h> 3590ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposer.h> 3690ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h> 3790ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/SurfaceComposerClient.h> 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 3941f673c9b3aac0d96e41c928845c39186d565212Mathias Agopian#include <private/gui/ComposerService.h> 4090ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <private/gui/LayerState.h> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 45b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(ComposerService); 467e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 47b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianComposerService::ComposerService() 48b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian: Singleton<ComposerService>() { 496652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden Mutex::Autolock _l(mLock); 506652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden connectLocked(); 516652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden} 526652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 536652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFaddenvoid ComposerService::connectLocked() { 54b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian const String16 name("SurfaceFlinger"); 55b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian while (getService(name, &mComposerService) != NO_ERROR) { 56b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian usleep(250000); 577e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian } 586652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden assert(mComposerService != NULL); 596652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 606652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden // Create the death listener. 616652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden class DeathObserver : public IBinder::DeathRecipient { 626652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ComposerService& mComposerService; 636652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden virtual void binderDied(const wp<IBinder>& who) { 646652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ALOGW("ComposerService remote (surfaceflinger) died [%p]", 656652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden who.unsafe_get()); 666652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mComposerService.composerServiceDied(); 676652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden } 686652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden public: 696652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden DeathObserver(ComposerService& mgr) : mComposerService(mgr) { } 706652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden }; 716652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 726652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mDeathObserver = new DeathObserver(*const_cast<ComposerService*>(this)); 736652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mComposerService->asBinder()->linkToDeath(mDeathObserver); 746652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden} 756652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden 766652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden/*static*/ sp<ISurfaceComposer> ComposerService::getComposerService() { 776652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ComposerService& instance = ComposerService::getInstance(); 786652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden Mutex::Autolock _l(instance.mLock); 796652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden if (instance.mComposerService == NULL) { 806652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ComposerService::getInstance().connectLocked(); 816652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden assert(instance.mComposerService != NULL); 826652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden ALOGD("ComposerService reconnected"); 836652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden } 846652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden return instance.mComposerService; 85b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 867e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 876652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFaddenvoid ComposerService::composerServiceDied() 886652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden{ 896652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden Mutex::Autolock _l(mLock); 906652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mComposerService = NULL; 916652b3edcb7ef5402c05db12f477ceb23c27d6ecAndy McFadden mDeathObserver = NULL; 92b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 937e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 947e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian// --------------------------------------------------------------------------- 957e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 96698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatic inline 97e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianint compare_type(const ComposerState& lhs, const ComposerState& rhs) { 98698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.client < rhs.client) return -1; 99698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.client > rhs.client) return 1; 100698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.state.surface < rhs.state.surface) return -1; 101698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.state.surface > rhs.state.surface) return 1; 102698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return 0; 103698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 104698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 105e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianstatic inline 106e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianint compare_type(const DisplayState& lhs, const DisplayState& rhs) { 107e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return compare_type(lhs.token, rhs.token); 108e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 109e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1107e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianclass Composer : public Singleton<Composer> 1117e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian{ 112698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian friend class Singleton<Composer>; 1137e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 114698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian mutable Mutex mLock; 115e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian SortedVector<ComposerState> mComposerStates; 116e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian SortedVector<DisplayState > mDisplayStates; 11728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t mForceSynchronous; 1182d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis bool mAnimation; 1197e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 120b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis Composer() : Singleton<Composer>(), 1212d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis mForceSynchronous(0), 1222d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis mAnimation(false) 12328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis { } 124d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 12528378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis void closeGlobalTransactionImpl(bool synchronous); 1262d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis void setAnimationTransactionImpl(); 127d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 128698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* getLayerStateLocked( 129698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id); 130d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 131e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& getDisplayStateLocked(const sp<IBinder>& token); 132e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 133698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianpublic: 134dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis sp<IBinder> createDisplay(const String8& displayName, bool secure); 1359d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown sp<IBinder> getBuiltInDisplay(int32_t id); 136d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 137698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setPosition(const sp<SurfaceComposerClient>& client, SurfaceID id, 13841b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian float x, float y); 139698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setSize(const sp<SurfaceComposerClient>& client, SurfaceID id, 140698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t w, uint32_t h); 141698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setLayer(const sp<SurfaceComposerClient>& client, SurfaceID id, 142698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian int32_t z); 143698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setFlags(const sp<SurfaceComposerClient>& client, SurfaceID id, 144698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t flags, uint32_t mask); 145698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setTransparentRegionHint( 146698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id, 147698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion); 148698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setAlpha(const sp<SurfaceComposerClient>& client, SurfaceID id, 149698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float alpha); 150698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setMatrix(const sp<SurfaceComposerClient>& client, SurfaceID id, 151698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdx, float dtdx, float dsdy, float dtdy); 152b8d69a55f1c187a35ac41e69de63251f5501b6f4Jamie Gennis status_t setOrientation(int orientation); 153f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis status_t setCrop(const sp<SurfaceComposerClient>& client, SurfaceID id, 154f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis const Rect& crop); 1558785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian status_t setLayerStack(const sp<SurfaceComposerClient>& client, 1568785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian SurfaceID id, uint32_t layerStack); 157d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 158e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian void setDisplaySurface(const sp<IBinder>& token, const sp<ISurfaceTexture>& surface); 159e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian void setDisplayLayerStack(const sp<IBinder>& token, uint32_t layerStack); 16000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian void setDisplayProjection(const sp<IBinder>& token, 16100e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian uint32_t orientation, 16200e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& layerStackRect, 16300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& displayRect); 164e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1652d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis static void setAnimationTransaction() { 1662d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis Composer::getInstance().setAnimationTransactionImpl(); 1672d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis } 1682d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 16928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis static void closeGlobalTransaction(bool synchronous) { 17028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis Composer::getInstance().closeGlobalTransactionImpl(synchronous); 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 172d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian}; 173d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 174d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer); 175d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 178dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> Composer::createDisplay(const String8& displayName, bool secure) { 179dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis return ComposerService::getComposerService()->createDisplay(displayName, 180dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis secure); 181e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 182e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 1839d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> Composer::getBuiltInDisplay(int32_t id) { 1849d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return ComposerService::getComposerService()->getBuiltInDisplay(id); 1859d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown} 1869d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown 18728378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid Composer::closeGlobalTransactionImpl(bool synchronous) { 188e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 189698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 190698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> transaction; 1918b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian Vector<DisplayState> displayTransaction; 19228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis uint32_t flags = 0; 193698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 194698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian { // scope for the lock 195698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 196e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian transaction = mComposerStates; 197e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mComposerStates.clear(); 1988b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian 199e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian displayTransaction = mDisplayStates; 200e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mDisplayStates.clear(); 20128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 20228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis if (synchronous || mForceSynchronous) { 20328378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis flags |= ISurfaceComposer::eSynchronous; 20428378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis } 2052d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis if (mAnimation) { 2062d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis flags |= ISurfaceComposer::eAnimation; 2072d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis } 2082d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 20928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = false; 2102d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis mAnimation = false; 211698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 212698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2138b33f032327f8de0dcc0e6d0d43ed80f834b51f6Mathias Agopian sm->setTransactionState(transaction, displayTransaction, flags); 214698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 215698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 2162d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid Composer::setAnimationTransactionImpl() { 2172d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis Mutex::Autolock _l(mLock); 2182d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis mAnimation = true; 2192d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis} 2202d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 221698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianlayer_state_t* Composer::getLayerStateLocked( 222698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id) { 223698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 224698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 225698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.client = client->mClient; 226698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.state.surface = id; 227698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 228e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ssize_t index = mComposerStates.indexOf(s); 229698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (index < 0) { 230698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian // we don't have it, add an initialized layer_state to our list 231e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian index = mComposerStates.add(s); 232698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 233698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 234e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ComposerState* const out = mComposerStates.editArray(); 235698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return &(out[index].state); 236698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 237698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 238698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client, 23941b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopian SurfaceID id, float x, float y) { 240698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 241698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 242698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 243698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 2443165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::ePositionChanged; 245698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->x = x; 246698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->y = y; 247698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 248698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 249698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 250698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client, 251698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, uint32_t w, uint32_t h) { 252698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 253698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 2563165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eSizeChanged; 257698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->w = w; 258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->h = h; 25928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 26028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis // Resizing a surface makes the transaction synchronous. 26128378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis mForceSynchronous = true; 26228378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis 263698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 264698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 265698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 266698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client, 267698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, int32_t z) { 268698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 269698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 271698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 2723165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eLayerChanged; 273698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->z = z; 274698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 275698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 276698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 277698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client, 278698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, uint32_t flags, 279698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 280698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 281698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 282698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 283698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 2843165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eVisibilityChanged; 285698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags &= ~mask; 286698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags |= (flags & mask); 287698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->mask |= mask; 288698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 289698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 290698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 291698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setTransparentRegionHint( 292698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id, 293698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 294698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 295698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 296698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 297698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 2983165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eTransparentRegionChanged; 299698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->transparentRegion = transparentRegion; 300698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 301698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 302698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 303698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client, 304698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, float alpha) { 305698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 306698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 307698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 308698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3093165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eAlphaChanged; 310698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->alpha = alpha; 311698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 312698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 313698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 3148785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopianstatus_t Composer::setLayerStack(const sp<SurfaceComposerClient>& client, 3158785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian SurfaceID id, uint32_t layerStack) { 3168785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian Mutex::Autolock _l(mLock); 3178785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 3188785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian if (!s) 3198785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return BAD_INDEX; 3203165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eLayerStackChanged; 3218785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian s->layerStack = layerStack; 3228785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return NO_ERROR; 3238785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian} 3248785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian 325698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client, 326698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, float dsdx, float dtdx, 327698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 328698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 329698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 330698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 331698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 3323165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eMatrixChanged; 333698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t::matrix22_t matrix; 334698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdx = dsdx; 335698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdx = dtdx; 336698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdy = dsdy; 337698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdy = dtdy; 338698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->matrix = matrix; 339698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 342f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatus_t Composer::setCrop(const sp<SurfaceComposerClient>& client, 343f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis SurfaceID id, const Rect& crop) { 344f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis Mutex::Autolock _l(mLock); 345f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis layer_state_t* s = getLayerStateLocked(client, id); 346f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis if (!s) 347f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return BAD_INDEX; 3483165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian s->what |= layer_state_t::eCropChanged; 349f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis s->crop = crop; 350f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return NO_ERROR; 351f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 352f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 353698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// --------------------------------------------------------------------------- 354698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 355e57f292595bec48f65c8088b00ff6beea01217e9Mathias AgopianDisplayState& Composer::getDisplayStateLocked(const sp<IBinder>& token) { 356e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState s; 357e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.token = token; 358e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian ssize_t index = mDisplayStates.indexOf(s); 359e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian if (index < 0) { 360e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian // we don't have it, add an initialized layer_state to our list 361e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what = 0; 362e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian index = mDisplayStates.add(s); 363e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian } 364e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian return mDisplayStates.editItemAt(index); 365e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 366e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 367e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplaySurface(const sp<IBinder>& token, 368e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian const sp<ISurfaceTexture>& surface) { 369e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(mLock); 370e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& s(getDisplayStateLocked(token)); 371e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.surface = surface; 372e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what |= DisplayState::eSurfaceChanged; 373e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 374e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 375e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid Composer::setDisplayLayerStack(const sp<IBinder>& token, 376e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian uint32_t layerStack) { 377e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(mLock); 378e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& s(getDisplayStateLocked(token)); 379e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.layerStack = layerStack; 380e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.what |= DisplayState::eLayerStackChanged; 381e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 382e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 38300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid Composer::setDisplayProjection(const sp<IBinder>& token, 38400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian uint32_t orientation, 38500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& layerStackRect, 38600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& displayRect) { 387e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Mutex::Autolock _l(mLock); 388e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian DisplayState& s(getDisplayStateLocked(token)); 389e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian s.orientation = orientation; 39000e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.viewport = layerStackRect; 39100e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.frame = displayRect; 39200e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian s.what |= DisplayState::eDisplayProjectionChanged; 393e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian mForceSynchronous = true; // TODO: do we actually still need this? 394e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 395e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 396e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// --------------------------------------------------------------------------- 397e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient() 399698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian : mStatus(NO_INIT), mComposer(Composer::getInstance()) 400edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 401edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 402edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 403698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() { 404e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 405d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (sm != 0) { 4067e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> conn = sm->createConnection(); 407d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (conn != 0) { 408d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient = conn; 409d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_ERROR; 410d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 411edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 412edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 413edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 414698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() { 415d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian dispose(); 416edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 417edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 418698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const { 419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 421edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 422698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const { 423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (mClient != 0) ? mClient->asBinder() : 0; 424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 425edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 426d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath( 427d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian const sp<IBinder::DeathRecipient>& recipient, 428698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian void* cookie, uint32_t flags) { 429e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian sp<ISurfaceComposer> sm(ComposerService::getComposerService()); 430d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian return sm->asBinder()->linkToDeath(recipient, cookie, flags); 431edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 432edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 433698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() { 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called more than once. 4357e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> client; 436d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Mutex::Autolock _lm(mLock); 437d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (mClient != 0) { 438d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian client = mClient; // hold ref while lock is held 439d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient.clear(); 440edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 441d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_INIT; 442edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 443edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 44401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface( 445285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const String8& name, 446285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t w, 447285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t h, 448285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian PixelFormat format, 449285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t flags) 450285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{ 45101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian sp<SurfaceControl> result; 452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus == NO_ERROR) { 4537e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian ISurfaceComposerClient::surface_data_t data; 4540ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian sp<ISurface> surface = mClient->createSurface(&data, name, 4559d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown w, h, format, flags); 456edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface != 0) { 457c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian result = new SurfaceControl(this, surface, data); 458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 460edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 462edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 463dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennissp<IBinder> SurfaceComposerClient::createDisplay(const String8& displayName, 464dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis bool secure) { 465dd3cb84cfbe8068790c6233b5829fae9c4a0ee93Jamie Gennis return Composer::getInstance().createDisplay(displayName, secure); 466e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 467e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 4689d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownsp<IBinder> SurfaceComposerClient::getBuiltInDisplay(int32_t id) { 4699d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return Composer::getInstance().getBuiltInDisplay(id); 4709d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown} 4719d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown 472698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(SurfaceID sid) { 473edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus != NO_ERROR) 474edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 475edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = mClient->destroySurface(sid); 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 478edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 479698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianinline Composer& SurfaceComposerClient::getComposer() { 480698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return mComposer; 481edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 482edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 483698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 484edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 485698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::openGlobalTransaction() { 486698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian // Currently a no-op 487edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48928378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennisvoid SurfaceComposerClient::closeGlobalTransaction(bool synchronous) { 49028378392fd5aa3e0a392c9eb64634055678c3987Jamie Gennis Composer::closeGlobalTransaction(synchronous); 491edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 492edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 4932d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennisvoid SurfaceComposerClient::setAnimationTransaction() { 4942d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis Composer::setAnimationTransaction(); 4952d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis} 4962d5e230292c27d59f4c096bc742a0a19abf811c1Jamie Gennis 497698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 498edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 499f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennisstatus_t SurfaceComposerClient::setCrop(SurfaceID id, const Rect& crop) { 500f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis return getComposer().setCrop(this, id, crop); 501f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis} 502f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis 50341b6aabf356d8a505da37b1d046bc9010028fe8bMathias Agopianstatus_t SurfaceComposerClient::setPosition(SurfaceID id, float x, float y) { 504698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setPosition(this, id, x, y); 505698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 507698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setSize(SurfaceID id, uint32_t w, uint32_t h) { 508698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setSize(this, id, w, h); 509698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 511698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setLayer(SurfaceID id, int32_t z) { 512698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setLayer(this, id, z); 513edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 514edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 515698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::hide(SurfaceID id) { 516698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 5173165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian layer_state_t::eLayerHidden, 5183165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian layer_state_t::eLayerHidden); 519698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 520edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 521380223bf1b340e7503177254a60d5982f95ab793Jeff Brownstatus_t SurfaceComposerClient::show(SurfaceID id) { 522698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 523698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 0, 5243165cc21cfea781988407b19bd83292b19f05f55Mathias Agopian layer_state_t::eLayerHidden); 525edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 526edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 527698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setFlags(SurfaceID id, uint32_t flags, 528698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 529698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, flags, mask); 530edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 531edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 532698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setTransparentRegionHint(SurfaceID id, 533698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 534698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setTransparentRegionHint(this, id, transparentRegion); 535edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 536edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 537698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setAlpha(SurfaceID id, float alpha) { 538698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setAlpha(this, id, alpha); 539edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 540edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5418785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopianstatus_t SurfaceComposerClient::setLayerStack(SurfaceID id, uint32_t layerStack) { 5428785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian return getComposer().setLayerStack(this, id, layerStack); 5438785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian} 5448785578391eacd4192333d7b0ce3afedd7d163e6Mathias Agopian 545698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setMatrix(SurfaceID id, float dsdx, float dtdx, 546698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 547698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy); 548edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 549edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 550698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 551698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 552e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplaySurface(const sp<IBinder>& token, 553e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian const sp<ISurfaceTexture>& surface) { 554e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Composer::getInstance().setDisplaySurface(token, surface); 555e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 556e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 557e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopianvoid SurfaceComposerClient::setDisplayLayerStack(const sp<IBinder>& token, 558e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian uint32_t layerStack) { 559e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian Composer::getInstance().setDisplayLayerStack(token, layerStack); 560e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 561e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 56200e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopianvoid SurfaceComposerClient::setDisplayProjection(const sp<IBinder>& token, 56300e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian uint32_t orientation, 56400e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& layerStackRect, 56500e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian const Rect& displayRect) { 56600e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian Composer::getInstance().setDisplayProjection(token, orientation, 56700e8c7a88a5b9c4104a71013a713acd3e4d3b77bMathias Agopian layerStackRect, displayRect); 568e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian} 569e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 570e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian// ---------------------------------------------------------------------------- 571e57f292595bec48f65c8088b00ff6beea01217e9Mathias Agopian 572698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::getDisplayInfo( 5739d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown const sp<IBinder>& display, DisplayInfo* info) 574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 5759d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return ComposerService::getComposerService()->getDisplayInfo(display, info); 576edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 577edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 5782a09bb321930e1f782599ec902bca1db58b9af77Jeff Brownvoid SurfaceComposerClient::blankDisplay(const sp<IBinder>& token) { 5792a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown ComposerService::getComposerService()->blank(token); 5802a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown} 5812a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown 5822a09bb321930e1f782599ec902bca1db58b9af77Jeff Brownvoid SurfaceComposerClient::unblankDisplay(const sp<IBinder>& token) { 5832a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown ComposerService::getComposerService()->unblank(token); 5842a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown} 5852a09bb321930e1f782599ec902bca1db58b9af77Jeff Brown 586698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 587698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 58874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient() 58974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) { 59074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 59174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 5929d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display) { 59374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 59474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 59574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 5969d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return s->captureScreen(display, &mHeap, 597bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, 0, 0, 598bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 0, -1UL); 59974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 60074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 6019d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display, 6029d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown uint32_t reqWidth, uint32_t reqHeight) { 60374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 60474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 60574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 6069d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return s->captureScreen(display, &mHeap, 607bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, reqWidth, reqHeight, 608bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 0, -1UL); 609bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian} 610bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 6119d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brownstatus_t ScreenshotClient::update(const sp<IBinder>& display, 6129d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown uint32_t reqWidth, uint32_t reqHeight, 613bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ) { 614bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 615bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian if (s == NULL) return NO_INIT; 616bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian mHeap = 0; 6179d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown return s->captureScreen(display, &mHeap, 618bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, reqWidth, reqHeight, 619bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian minLayerZ, maxLayerZ); 62074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 62174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 62274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() { 62374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 62474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 62574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 62674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const { 62774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeap->getBase(); 62874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 62974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 63074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const { 63174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mWidth; 63274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 63374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 63474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const { 63574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeight; 63674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 63774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 63874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const { 63974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mFormat; 64074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 64174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 64274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const { 64374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mWidth; 64474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 64574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 64674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const { 64774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeap->getSize(); 64874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 64974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 65074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ---------------------------------------------------------------------------- 651edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 652