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