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
1790ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#ifndef ANDROID_GUI_SURFACE_H
1890ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#define ANDROID_GUI_SURFACE_H
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdint.h>
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <sys/types.h>
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
23aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis#include <utils/KeyedVector.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/RefBase.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/threads.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/PixelFormat.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <ui/Region.h>
29076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
308f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian#include <gui/SurfaceTextureClient.h>
3190ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurface.h>
3290ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#include <gui/ISurfaceComposerClient.h>
339cce325fae8adcf7560a28eef394489f09bad74dMathias Agopian
34e4e8cf1f19002be418aad1b89fa6bb8aeabf9f65Mathias Agopian#define ANDROID_VIEW_SURFACE_JNI_ID    "mNativeSurface"
35e4e8cf1f19002be418aad1b89fa6bb8aeabf9f65Mathias Agopian
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
401e7fa9e945d98eab76ff92f37c25040429a6c0a0tedboclass ISurfaceTexture;
410926f50664c739eaee60341f8e8c694dc9a4f3ebMathias Agopianclass Surface;
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass SurfaceComposerClient;
43076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
44076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian// ---------------------------------------------------------------------------
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
4662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianclass SurfaceControl : public RefBase
4762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian{
4862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianpublic:
4962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    static bool isValid(const sp<SurfaceControl>& surface) {
5001b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        return (surface != 0) && surface->isValid();
5162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    }
5201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    bool isValid() {
5301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        return mToken>=0 && mClient!=0;
5401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    }
5501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    static bool isSameSurface(
5601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian            const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs);
5762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
5862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    uint32_t    getIdentity() const { return mIdentity; }
5962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
6062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    // release surface data from java
6162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    void        clear();
6262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
639d4e3d2f42e93e2d12bacabe97d307d30c3c20ddJeff Brown    status_t    setLayerStack(int32_t layerStack);
6462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setLayer(int32_t layer);
6562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setPosition(int32_t x, int32_t y);
6662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setSize(uint32_t w, uint32_t h);
6762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    hide();
68380223bf1b340e7503177254a60d5982f95ab793Jeff Brown    status_t    show();
6962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setFlags(uint32_t flags, uint32_t mask);
7062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setTransparentRegionHint(const Region& transparent);
7162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setAlpha(float alpha=1.0f);
7262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    status_t    setMatrix(float dsdx, float dtdx, float dsdy, float dtdy);
73f15a83f5814219c167f87cb8aaea622fc8493499Jamie Gennis    status_t    setCrop(const Rect& crop);
7462185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
7501b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    static status_t writeSurfaceToParcel(
7601b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian            const sp<SurfaceControl>& control, Parcel* parcel);
7701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
7801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    sp<Surface> getSurface() const;
7901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
8062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopianprivate:
8101b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    // can't be copied
8201b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    SurfaceControl& operator = (SurfaceControl& rhs);
8301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    SurfaceControl(const SurfaceControl& rhs);
8401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
8562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class SurfaceComposerClient;
8662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    friend class Surface;
8701b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
8801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    SurfaceControl(
8901b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian            const sp<SurfaceComposerClient>& client,
9062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian            const sp<ISurface>& surface,
91c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian            const ISurfaceComposerClient::surface_data_t& data);
9262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
9362185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    ~SurfaceControl();
9401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
95963abad79ae64dae9bf4c32bfb110d9e6314c857Mathias Agopian    status_t validate() const;
9662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    void destroy();
9762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
9862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    sp<SurfaceComposerClient>   mClient;
9962185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    sp<ISurface>                mSurface;
10062185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    SurfaceID                   mToken;
10162185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    uint32_t                    mIdentity;
10262185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian    mutable Mutex               mLock;
10301b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian
10401b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian    mutable sp<Surface>         mSurfaceData;
10562185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian};
10662185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
10762185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian// ---------------------------------------------------------------------------
10862185b7335e85211dc4d0e2003354eb3ea2e66efMathias Agopian
1098f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopianclass Surface : public SurfaceTextureClient
110076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian{
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    struct SurfaceInfo {
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t    w;
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t    h;
115076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        uint32_t    s;
116076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian        uint32_t    usage;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        PixelFormat format;
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        void*       bits;
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        uint32_t    reserved[2];
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    };
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
122bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    explicit Surface(const sp<ISurfaceTexture>& st);
123bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg
124c10d9d90b2088a3304076e0dc4bf05cdbb5d45abMathias Agopian    static status_t writeToParcel(const sp<Surface>& control, Parcel* parcel);
125bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg
126aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    static sp<Surface> readFromParcel(const Parcel& data);
12740b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian    static bool isValid(const sp<Surface>& surface) {
12801b766839e06c32540cef100e3a7710d12cf1eefMathias Agopian        return (surface != 0) && surface->isValid();
12940b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian    }
130ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
131ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    bool        isValid();
132ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    uint32_t    getIdentity() const { return mIdentity; }
1331e7fa9e945d98eab76ff92f37c25040429a6c0a0tedbo    sp<ISurfaceTexture> getSurfaceTexture();
13440b7f6e0433b89c27b2fe5a1c0c47f67b42eceb2Mathias Agopian
135ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // the lock/unlock APIs must be used from the same thread
1368f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian    status_t    lock(SurfaceInfo* info, Region* dirty = NULL);
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t    unlockAndPost();
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
13947d8730a2463f38a695ab95b533b0d9728f266a3Mathias Agopian    sp<IBinder> asBinder() const;
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
141b296533607232357597b255679db29470ab5925dMathias Agopianprivate:
142ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // this is just to be able to write some unit tests
143ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    friend class Test;
144b296533607232357597b255679db29470ab5925dMathias Agopian    friend class SurfaceControl;
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
146b296533607232357597b255679db29470ab5925dMathias Agopian    // can't be copied
147b296533607232357597b255679db29470ab5925dMathias Agopian    Surface& operator = (Surface& rhs);
148b296533607232357597b255679db29470ab5925dMathias Agopian    Surface(const Surface& rhs);
149076b1cc3a9b90aa5b381a1ed268ca0b548444c9bMathias Agopian
150bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    explicit Surface(const sp<SurfaceControl>& control);
151a0c30e924193da57723fd53b710ce6be24fb26f5Mathias Agopian    Surface(const Parcel& data, const sp<IBinder>& ref);
152b296533607232357597b255679db29470ab5925dMathias Agopian    ~Surface();
153b296533607232357597b255679db29470ab5925dMathias Agopian
154b296533607232357597b255679db29470ab5925dMathias Agopian    /*
155b296533607232357597b255679db29470ab5925dMathias Agopian     *  private stuff...
156b296533607232357597b255679db29470ab5925dMathias Agopian     */
157bd050ab2af1421d527d1a80ce59dd8d9940a838cTed Bonkenburg    void init(const sp<ISurfaceTexture>& surfaceTexture);
158b296533607232357597b255679db29470ab5925dMathias Agopian
159455d18d4c26a823bff62ca14771986cca52d3462Mathias Agopian    static void cleanCachedSurfacesLocked();
160aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis
1618f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian    virtual int query(int what, int* value) const;
1628f9dbf9e13b927de2524116c30544f7dfbbbf56cMathias Agopian
163ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian    // constants
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    sp<ISurface>                mSurface;
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t                    mIdentity;
166ba5972ffdc7179dd9a387f22032eb18666d97917Mathias Agopian
167aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    // A cache of Surface objects that have been deserialized into this process.
168aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    static Mutex sCachedSurfacesLock;
169aca4e2287939b4ce3d9e9aced64c5c9641333503Jamie Gennis    static DefaultKeyedVector<wp<IBinder>, wp<Surface> > sCachedSurfaces;
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
17490ac799241f077a7b7e6c1875fd933864c8dd2a7Mathias Agopian#endif // ANDROID_GUI_SURFACE_H
175