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