diff options
-rw-r--r-- | include/surfaceflinger/Surface.h | 7 | ||||
-rw-r--r-- | libs/surfaceflinger_client/Surface.cpp | 21 |
2 files changed, 16 insertions, 12 deletions
diff --git a/include/surfaceflinger/Surface.h b/include/surfaceflinger/Surface.h index 67dc693..ac01ce5 100644 --- a/include/surfaceflinger/Surface.h +++ b/include/surfaceflinger/Surface.h @@ -145,15 +145,13 @@ public: uint32_t reserved[2]; }; - Surface(const Parcel& data); + static sp<Surface> readFromParcel( + const Parcel& data, const sp<Surface>& other); static bool isValid(const sp<Surface>& surface) { return (surface != 0) && surface->isValid(); } - static bool isSameSurface( - const sp<Surface>& lhs, const sp<Surface>& rhs); - bool isValid(); SurfaceID ID() const { return mToken; } uint32_t getFlags() const { return mFlags; } @@ -191,6 +189,7 @@ private: Surface(const Surface& rhs); Surface(const sp<SurfaceControl>& control); + Surface(const Parcel& data, const sp<IBinder>& ref); ~Surface(); diff --git a/libs/surfaceflinger_client/Surface.cpp b/libs/surfaceflinger_client/Surface.cpp index 01420fe..6fe4c4a 100644 --- a/libs/surfaceflinger_client/Surface.cpp +++ b/libs/surfaceflinger_client/Surface.cpp @@ -334,13 +334,13 @@ Surface::Surface(const sp<SurfaceControl>& surface) init(); } -Surface::Surface(const Parcel& parcel) +Surface::Surface(const Parcel& parcel, const sp<IBinder>& ref) : mBufferMapper(GraphicBufferMapper::get()), mClient(SurfaceClient::getInstance()), mSharedBufferClient(NULL), mInitCheck(NO_INIT) { - mSurface = interface_cast<ISurface>(parcel.readStrongBinder()); + mSurface = interface_cast<ISurface>(ref); mIdentity = parcel.readInt32(); mWidth = parcel.readInt32(); mHeight = parcel.readInt32(); @@ -349,6 +349,17 @@ Surface::Surface(const Parcel& parcel) init(); } +sp<Surface> Surface::readFromParcel( + const Parcel& data, const sp<Surface>& other) +{ + sp<Surface> result(other); + sp<IBinder> binder(data.readStrongBinder()); + if (other==0 || binder != other->mSurface->asBinder()) { + result = new Surface(data, binder); + } + return result; +} + void Surface::init() { android_native_window_t::setSwapInterval = setSwapInterval; @@ -443,12 +454,6 @@ status_t Surface::validate() const return NO_ERROR; } -bool Surface::isSameSurface(const sp<Surface>& lhs, const sp<Surface>& rhs) { - if (lhs == 0 || rhs == 0) - return false; - return lhs->mSurface->asBinder() == rhs->mSurface->asBinder(); -} - sp<ISurface> Surface::getISurface() const { return mSurface; } |