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