1cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten/* 2cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten * Copyright (C) 2011 The Android Open Source Project 3cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten * 4cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten * Licensed under the Apache License, Version 2.0 (the "License"); 5cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten * you may not use this file except in compliance with the License. 6cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten * You may obtain a copy of the License at 7cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten * 8cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten * http://www.apache.org/licenses/LICENSE-2.0 9cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten * 10cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten * Unless required by applicable law or agreed to in writing, software 11cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten * distributed under the License is distributed on an "AS IS" BASIS, 12cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten * See the License for the specific language governing permissions and 14cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten * limitations under the License. 15cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten */ 16cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten 17cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten#ifndef NATIVE_WINDOW_WRAPPER_H_ 18cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten 19cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten#define NATIVE_WINDOW_WRAPPER_H_ 20cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten 21cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten#include <surfaceflinger/Surface.h> 22cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten#include <gui/SurfaceTextureClient.h> 23cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten 24cc562a3576a6a8096626387472e05e8bee03352aGlenn Kastennamespace android { 25cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten 26cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten// Both Surface and SurfaceTextureClient are RefBase that implement the 27cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten// ANativeWindow interface, but at different addresses. ANativeWindow is not 28cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten// a RefBase but acts like one for use with sp<>. This wrapper converts a 29cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten// Surface or SurfaceTextureClient into a single reference-counted object 30cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten// that holds an sp reference to the underlying Surface or SurfaceTextureClient, 31cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten// It provides a method to get the ANativeWindow. 32cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten 33cc562a3576a6a8096626387472e05e8bee03352aGlenn Kastenstruct NativeWindowWrapper : RefBase { 34cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten NativeWindowWrapper( 35cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten const sp<Surface> &surface) : 36cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten mSurface(surface) { } 37cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten 38cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten NativeWindowWrapper( 39cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten const sp<SurfaceTextureClient> &surfaceTextureClient) : 40cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten mSurfaceTextureClient(surfaceTextureClient) { } 41cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten 42cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten sp<ANativeWindow> getNativeWindow() const { 43cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten if (mSurface != NULL) { 44cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten return mSurface; 45cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten } else { 46cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten return mSurfaceTextureClient; 47cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten } 48cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten } 49cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten 50cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten // If needed later we can provide a method to ask what kind of native window 51cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten 52cc562a3576a6a8096626387472e05e8bee03352aGlenn Kastenprivate: 53cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten // At most one of mSurface and mSurfaceTextureClient will be non-NULL 54cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten const sp<Surface> mSurface; 55cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten const sp<SurfaceTextureClient> mSurfaceTextureClient; 56cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten 57cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten DISALLOW_EVIL_CONSTRUCTORS(NativeWindowWrapper); 58cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten}; 59cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten 60cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten} // namespace android 61cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten 62cc562a3576a6a8096626387472e05e8bee03352aGlenn Kasten#endif // NATIVE_WINDOW_WRAPPER_H_ 63