SurfaceComposerClient.cpp revision c10d9d90b2088a3304076e0dc4bf05cdbb5d45ab
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 34a67932fe6864ac346e7f78b86df11cf6c5344137Mathias Agopian#include <surfaceflinger/ISurface.h> 359cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/ISurfaceComposer.h> 367e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian#include <surfaceflinger/ISurfaceComposerClient.h> 379cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <surfaceflinger/SurfaceComposerClient.h> 389cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian 399cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <private/surfaceflinger/LayerState.h> 409cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian#include <private/surfaceflinger/SharedBufferStack.h> 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 46b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(ComposerService); 477e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 48b7e930db175c192464cebdeb49eb56cf6dd60114Mathias AgopianComposerService::ComposerService() 49b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian: Singleton<ComposerService>() { 50b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian const String16 name("SurfaceFlinger"); 51b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian while (getService(name, &mComposerService) != NO_ERROR) { 52b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian usleep(250000); 537e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian } 54b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian mServerCblkMemory = mComposerService->getCblk(); 55b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian mServerCblk = static_cast<surface_flinger_cblk_t volatile *>( 56b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian mServerCblkMemory->getBase()); 57b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 587e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 59b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansp<ISurfaceComposer> ComposerService::getComposerService() { 60b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian return ComposerService::getInstance().mComposerService; 61b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 627e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 63b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopiansurface_flinger_cblk_t const volatile * ComposerService::getControlBlock() { 64b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian return ComposerService::getInstance().mServerCblk; 65b7e930db175c192464cebdeb49eb56cf6dd60114Mathias Agopian} 667e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 677e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline sp<ISurfaceComposer> getComposerService() { 687e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return ComposerService::getComposerService(); 697e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian} 707e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 717e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianstatic inline surface_flinger_cblk_t const volatile * get_cblk() { 727e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian return ComposerService::getControlBlock(); 737e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian} 747e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 757e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian// --------------------------------------------------------------------------- 767e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 77698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// NOTE: this is NOT a member function (it's a friend defined with its 78698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// declaration). 79698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatic inline 80698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianint compare_type( const ComposerState& lhs, const ComposerState& rhs) { 81698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.client < rhs.client) return -1; 82698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.client > rhs.client) return 1; 83698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.state.surface < rhs.state.surface) return -1; 84698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (lhs.state.surface > rhs.state.surface) return 1; 85698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return 0; 86698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 87698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 887e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopianclass Composer : public Singleton<Composer> 897e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian{ 90698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian friend class Singleton<Composer>; 917e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 92698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian mutable Mutex mLock; 93698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SortedVector<ComposerState> mStates; 947e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian 95698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Composer() : Singleton<Composer>() { } 96d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 97698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian void closeGlobalTransactionImpl(); 98d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 99698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* getLayerStateLocked( 100698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id); 101d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 102698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianpublic: 103d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 104698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setPosition(const sp<SurfaceComposerClient>& client, SurfaceID id, 105698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian int32_t x, int32_t y); 106698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setSize(const sp<SurfaceComposerClient>& client, SurfaceID id, 107698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t w, uint32_t h); 108698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setLayer(const sp<SurfaceComposerClient>& client, SurfaceID id, 109698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian int32_t z); 110698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setFlags(const sp<SurfaceComposerClient>& client, SurfaceID id, 111698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t flags, uint32_t mask); 112698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setTransparentRegionHint( 113698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id, 114698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion); 115698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setAlpha(const sp<SurfaceComposerClient>& client, SurfaceID id, 116698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float alpha); 117698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setMatrix(const sp<SurfaceComposerClient>& client, SurfaceID id, 118698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdx, float dtdx, float dsdy, float dtdy); 119698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian status_t setFreezeTint( 120698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id, 121698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t tint); 122d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 123d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian static void closeGlobalTransaction() { 124d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Composer::getInstance().closeGlobalTransactionImpl(); 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 126d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian}; 127d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 128d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias AgopianANDROID_SINGLETON_STATIC_INSTANCE(Composer); 129d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 132698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid Composer::closeGlobalTransactionImpl() { 133698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 134698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 135698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Vector<ComposerState> transaction; 136698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 137698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian { // scope for the lock 138698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 139698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian transaction = mStates; 140698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian mStates.clear(); 141698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 142698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 143698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian sm->setTransactionState(transaction); 144698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 145698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 146698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianlayer_state_t* Composer::getLayerStateLocked( 147698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id) { 148698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 149698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState s; 150698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.client = client->mClient; 151698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s.state.surface = id; 152698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 153698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ssize_t index = mStates.indexOf(s); 154698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (index < 0) { 155698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian // we don't have it, add an initialized layer_state to our list 156698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian index = mStates.add(s); 157698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 158698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 159698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ComposerState* const out = mStates.editArray(); 160698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return &(out[index].state); 161698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 162698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 163698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setPosition(const sp<SurfaceComposerClient>& client, 164698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, int32_t x, int32_t y) { 165698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 166698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 167698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 168698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 169698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::ePositionChanged; 170698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->x = x; 171698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->y = y; 172698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 173698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 174698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 175698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setSize(const sp<SurfaceComposerClient>& client, 176698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, uint32_t w, uint32_t h) { 177698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 178698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 179698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 180698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 181698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eSizeChanged; 182698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->w = w; 183698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->h = h; 184698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 185698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 186698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 187698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setLayer(const sp<SurfaceComposerClient>& client, 188698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, int32_t z) { 189698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 190698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 191698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 192698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 193698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eLayerChanged; 194698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->z = z; 195698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 196698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 197698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 198698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFlags(const sp<SurfaceComposerClient>& client, 199698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, uint32_t flags, 200698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 201698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 202698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 203698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 204698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 205698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eVisibilityChanged; 206698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags &= ~mask; 207698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->flags |= (flags & mask); 208698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->mask |= mask; 209698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 210698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 211698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 212698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setTransparentRegionHint( 213698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const sp<SurfaceComposerClient>& client, SurfaceID id, 214698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 215698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 216698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 217698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 218698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 219698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eTransparentRegionChanged; 220698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->transparentRegion = transparentRegion; 221698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 222698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 223698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 224698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setAlpha(const sp<SurfaceComposerClient>& client, 225698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, float alpha) { 226698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 227698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 228698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 229698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 230698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eAlphaChanged; 231698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->alpha = alpha; 232698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 233698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 234698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 235698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setMatrix(const sp<SurfaceComposerClient>& client, 236698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, float dsdx, float dtdx, 237698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 238698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 239698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 240698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 241698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 242698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eMatrixChanged; 243698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t::matrix22_t matrix; 244698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdx = dsdx; 245698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdx = dtdx; 246698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dsdy = dsdy; 247698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian matrix.dtdy = dtdy; 248698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->matrix = matrix; 249698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 252698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t Composer::setFreezeTint(const sp<SurfaceComposerClient>& client, 253698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian SurfaceID id, uint32_t tint) { 254698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Mutex::Autolock _l(mLock); 255698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian layer_state_t* s = getLayerStateLocked(client, id); 256698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (!s) 257698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_INDEX; 258698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->what |= ISurfaceComposer::eFreezeTintChanged; 259698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian s->tint = tint; 260698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return NO_ERROR; 261698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 262698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 263698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// --------------------------------------------------------------------------- 264698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectSurfaceComposerClient::SurfaceComposerClient() 266698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian : mStatus(NO_INIT), mComposer(Composer::getInstance()) 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 270698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::onFirstRef() { 271dd3423c6247965bf67ea30c75e484a6f5d72b1a2Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 272d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (sm != 0) { 2737e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> conn = sm->createConnection(); 274d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (conn != 0) { 275d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient = conn; 276d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_ERROR; 277d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian } 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 281698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias AgopianSurfaceComposerClient::~SurfaceComposerClient() { 282d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian dispose(); 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 285698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::initCheck() const { 286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 289698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopiansp<IBinder> SurfaceComposerClient::connection() const { 290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (mClient != 0) ? mClient->asBinder() : 0; 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 293d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopianstatus_t SurfaceComposerClient::linkToComposerDeath( 294d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian const sp<IBinder::DeathRecipient>& recipient, 295698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian void* cookie, uint32_t flags) { 296d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 297d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian return sm->asBinder()->linkToDeath(recipient, cookie, flags); 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 300698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::dispose() { 301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // this can be called more than once. 3027e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian sp<ISurfaceComposerClient> client; 303d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian Mutex::Autolock _lm(mLock); 304d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian if (mClient != 0) { 305d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian client = mClient; // hold ref while lock is held 306d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mClient.clear(); 307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 308d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian mStatus = NO_INIT; 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 31101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface( 312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project DisplayID display, 313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t w, 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t h, 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project PixelFormat format, 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t flags) 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 318285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian String8 name; 319285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const size_t SIZE = 128; 320285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian char buffer[SIZE]; 321285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian snprintf(buffer, SIZE, "<pid_%d>", getpid()); 322285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian name.append(buffer); 323285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian 3240ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian return SurfaceComposerClient::createSurface(name, display, 325285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian w, h, format, flags); 326285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian} 327285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian 328285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopiansp<SurfaceControl> SurfaceComposerClient::createSurface( 329285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian const String8& name, 330285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian DisplayID display, 331285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t w, 332285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t h, 333285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian PixelFormat format, 334285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian uint32_t flags) 335285dbde2e0cd0057be070ded3be8f5f453147edcMathias Agopian{ 33601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian sp<SurfaceControl> result; 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus == NO_ERROR) { 3387e27f05739c8a2655cf0f7faea35614ce0a50278Mathias Agopian ISurfaceComposerClient::surface_data_t data; 3390ef4e15a6c12778daf464a4953d7e15e651f49acMathias Agopian sp<ISurface> surface = mClient->createSurface(&data, name, 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project display, w, h, format, flags); 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (surface != 0) { 342c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian result = new SurfaceControl(this, surface, data); 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return result; 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 348698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::destroySurface(SurfaceID sid) { 349edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mStatus != NO_ERROR) 350edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mStatus; 351edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = mClient->destroySurface(sid); 352edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 353edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 354edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 355698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianinline Composer& SurfaceComposerClient::getComposer() { 356698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return mComposer; 357edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 358edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 359698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 360edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 361698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::openGlobalTransaction() { 362698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian // Currently a no-op 363edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 364edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 365698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianvoid SurfaceComposerClient::closeGlobalTransaction() { 366698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian Composer::closeGlobalTransaction(); 367edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 368edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 369698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 370edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 371698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setFreezeTint(SurfaceID id, uint32_t tint) { 372698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFreezeTint(this, id, tint); 373edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 374edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 375698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setPosition(SurfaceID id, int32_t x, int32_t y) { 376698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setPosition(this, id, x, y); 377698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 378edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 379698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setSize(SurfaceID id, uint32_t w, uint32_t h) { 380698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setSize(this, id, w, h); 381698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 382edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 383698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setLayer(SurfaceID id, int32_t z) { 384698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setLayer(this, id, z); 385edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 386edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 387698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::hide(SurfaceID id) { 388698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 389698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerHidden, 390698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerHidden); 391698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian} 392edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 393698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::show(SurfaceID id, int32_t) { 394698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 395698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 0, 396698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerHidden); 397edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 398edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 399698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::freeze(SurfaceID id) { 400698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 401698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerFrozen, 402698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerFrozen); 403edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 404edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 405698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::unfreeze(SurfaceID id) { 406698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, 407698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 0, 408698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian ISurfaceComposer::eLayerFrozen); 409edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 410edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 411698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setFlags(SurfaceID id, uint32_t flags, 412698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t mask) { 413698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setFlags(this, id, flags, mask); 414edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 415edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 416698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setTransparentRegionHint(SurfaceID id, 417698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian const Region& transparentRegion) { 418698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setTransparentRegionHint(this, id, transparentRegion); 419edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 420edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 421698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setAlpha(SurfaceID id, float alpha) { 422698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setAlpha(this, id, alpha); 423edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 424edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 425698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::setMatrix(SurfaceID id, float dsdx, float dtdx, 426698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian float dsdy, float dtdy) { 427698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getComposer().setMatrix(this, id, dsdx, dtdx, dsdy, dtdy); 428edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 429edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 430698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 431698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 432698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::getDisplayInfo( 433698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian DisplayID dpy, DisplayInfo* info) 434edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 435698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (uint32_t(dpy)>=NUM_DISPLAY_MAX) 436698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_VALUE; 437698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 438698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 439698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile display_cblk_t const * dcblk = cblk->displays + dpy; 440698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 441698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->w = dcblk->w; 442698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->h = dcblk->h; 443698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->orientation = dcblk->orientation; 444698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->xdpi = dcblk->xdpi; 445698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->ydpi = dcblk->ydpi; 446698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->fps = dcblk->fps; 447698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian info->density = dcblk->density; 448698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return getPixelFormatInfo(dcblk->format, &(info->pixelFormatInfo)); 449edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 450edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 451698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayWidth(DisplayID dpy) 452edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 453698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (uint32_t(dpy)>=NUM_DISPLAY_MAX) 454698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_VALUE; 455698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 456698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile display_cblk_t const * dcblk = cblk->displays + dpy; 457698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return dcblk->w; 458edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 459edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 460698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayHeight(DisplayID dpy) 461edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 462698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (uint32_t(dpy)>=NUM_DISPLAY_MAX) 463698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_VALUE; 464698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 465698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile display_cblk_t const * dcblk = cblk->displays + dpy; 466698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return dcblk->h; 467edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 468edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 469698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getDisplayOrientation(DisplayID dpy) 470edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 471698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (uint32_t(dpy)>=NUM_DISPLAY_MAX) 472698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return BAD_VALUE; 473698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 474698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile display_cblk_t const * dcblk = cblk->displays + dpy; 475698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return dcblk->orientation; 476edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 477edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 478698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianssize_t SurfaceComposerClient::getNumberOfDisplays() 479edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 480698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian volatile surface_flinger_cblk_t const * cblk = get_cblk(); 481698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian uint32_t connected = cblk->connected; 482698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian int n = 0; 483698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian while (connected) { 484698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian if (connected&1) n++; 485698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian connected >>= 1; 486698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian } 487698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return n; 488edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 489edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 490698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian// ---------------------------------------------------------------------------- 491698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian 492698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::freezeDisplay(DisplayID dpy, uint32_t flags) 493edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 494698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 495698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return sm->freezeDisplay(dpy, flags); 496edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 497edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 498698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianstatus_t SurfaceComposerClient::unfreezeDisplay(DisplayID dpy, uint32_t flags) 499edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 500698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 501698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return sm->unfreezeDisplay(dpy, flags); 502edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 503edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 504698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopianint SurfaceComposerClient::setOrientation(DisplayID dpy, 505698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian int orientation, uint32_t flags) 506edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 507698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian sp<ISurfaceComposer> sm(getComposerService()); 508698c0873cf2e07bdc7fd1e72169aee2a19fa40d7Mathias Agopian return sm->setOrientation(dpy, orientation, flags); 509edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 510edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 511d4784a3b90f849e8732968d45886fb0c8f0d8cf3Mathias Agopian// ---------------------------------------------------------------------------- 51274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 51374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianScreenshotClient::ScreenshotClient() 51474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian : mWidth(0), mHeight(0), mFormat(PIXEL_FORMAT_NONE) { 51574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 51674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 51774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update() { 51874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 51974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 52074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 52174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return s->captureScreen(0, &mHeap, 522bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, 0, 0, 523bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 0, -1UL); 52474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 52574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 52674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight) { 52774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 52874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian if (s == NULL) return NO_INIT; 52974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 53074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return s->captureScreen(0, &mHeap, 531bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, reqWidth, reqHeight, 532bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 0, -1UL); 533bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian} 534bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian 535bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopianstatus_t ScreenshotClient::update(uint32_t reqWidth, uint32_t reqHeight, 536bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian uint32_t minLayerZ, uint32_t maxLayerZ) { 537bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian sp<ISurfaceComposer> s(ComposerService::getComposerService()); 538bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian if (s == NULL) return NO_INIT; 539bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian mHeap = 0; 540bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian return s->captureScreen(0, &mHeap, 541bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian &mWidth, &mHeight, &mFormat, reqWidth, reqHeight, 542bf2c6a6c8f1df40ac94e28b948754bb9739daacaMathias Agopian minLayerZ, maxLayerZ); 54374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 54474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 54574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid ScreenshotClient::release() { 54674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian mHeap = 0; 54774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 54874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 54974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianvoid const* ScreenshotClient::getPixels() const { 55074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeap->getBase(); 55174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 55274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 55374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getWidth() const { 55474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mWidth; 55574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 55674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 55774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getHeight() const { 55874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeight; 55974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 56074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 56174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias AgopianPixelFormat ScreenshotClient::getFormat() const { 56274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mFormat; 56374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 56474c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 56574c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopianuint32_t ScreenshotClient::getStride() const { 56674c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mWidth; 56774c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 56874c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 56974c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopiansize_t ScreenshotClient::getSize() const { 57074c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian return mHeap->getSize(); 57174c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian} 57274c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian 57374c40c0a273dbfd7d10617c4cc1b0c066bfc812eMathias Agopian// ---------------------------------------------------------------------------- 574edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 575edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 576