1e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian/*
2e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * Copyright (C) 2007 The Android Open Source Project
3e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *
4e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
5e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * you may not use this file except in compliance with the License.
6e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * You may obtain a copy of the License at
7e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *
8e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
9e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian *
10e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * Unless required by applicable law or agreed to in writing, software
11e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
12e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * See the License for the specific language governing permissions and
14e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian * limitations under the License.
15e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian */
16e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
17e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#ifndef ANDROID_GUI_SURFACE_CONTROL_H
18e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#define ANDROID_GUI_SURFACE_CONTROL_H
19e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
20e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <stdint.h>
21e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <sys/types.h>
22e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
23e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/KeyedVector.h>
24e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/RefBase.h>
25e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <utils/threads.h>
26e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
27d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav#include <ui/FrameStats.h>
28e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <ui/PixelFormat.h>
29e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <ui/Region.h>
30e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
31e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#include <gui/ISurfaceComposerClient.h>
32e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
33e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopiannamespace android {
34e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
35e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------------
36e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
37e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianclass IGraphicBufferProducer;
38e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianclass Surface;
39e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianclass SurfaceComposerClient;
40e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
41e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian// ---------------------------------------------------------------------------
42e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
43e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianclass SurfaceControl : public RefBase
44e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian{
45e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianpublic:
46e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    static bool isValid(const sp<SurfaceControl>& surface) {
47e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian        return (surface != 0) && surface->isValid();
48e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    }
494d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
50e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    bool isValid() {
514d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian        return mHandle!=0 && mClient!=0;
52e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    }
534d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian
54e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    static bool isSameSurface(
55e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian            const sp<SurfaceControl>& lhs, const sp<SurfaceControl>& rhs);
56d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
57e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    // release surface data from java
58e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    void        clear();
59d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
60e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t    setLayerStack(int32_t layerStack);
61e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t    setLayer(int32_t layer);
62d6480c020b050c777ec1db2dd9c16fccfc47b47bRamanan Rajeswaran    status_t    setPosition(float x, float y);
63e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t    setSize(uint32_t w, uint32_t h);
64e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t    hide();
65e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t    show();
66e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t    setFlags(uint32_t flags, uint32_t mask);
67e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t    setTransparentRegionHint(const Region& transparent);
68e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t    setAlpha(float alpha=1.0f);
69e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t    setMatrix(float dsdx, float dtdx, float dsdy, float dtdy);
70e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t    setCrop(const Rect& crop);
71e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
72e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    static status_t writeSurfaceToParcel(
73e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian            const sp<SurfaceControl>& control, Parcel* parcel);
74e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
75e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    sp<Surface> getSurface() const;
76e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
77d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    status_t clearLayerFrameStats() const;
78d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav    status_t getLayerFrameStats(FrameStats* outStats) const;
79d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
80e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopianprivate:
81e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    // can't be copied
82e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    SurfaceControl& operator = (SurfaceControl& rhs);
83e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    SurfaceControl(const SurfaceControl& rhs);
84e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
85e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    friend class SurfaceComposerClient;
86e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    friend class Surface;
87e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
88e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    SurfaceControl(
89e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian            const sp<SurfaceComposerClient>& client,
904d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian            const sp<IBinder>& handle,
914d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian            const sp<IGraphicBufferProducer>& gbp);
92e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
93e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    ~SurfaceControl();
94e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
95e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    status_t validate() const;
96e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    void destroy();
97d85084b2b65828442eafaff9b811e9b6c9ca9fadSvetoslav
98e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    sp<SurfaceComposerClient>   mClient;
994d9b822e2c18142e55fe2611aa6cd7dc7d4a62c6Mathias Agopian    sp<IBinder>                 mHandle;
100e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    sp<IGraphicBufferProducer>  mGraphicBufferProducer;
101e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    mutable Mutex               mLock;
102e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian    mutable sp<Surface>         mSurfaceData;
103e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian};
104e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
105e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian}; // namespace android
106e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian
107e3c697fb929c856b59fa56a8e05a2a7eba187c3dMathias Agopian#endif // ANDROID_GUI_SURFACE_CONTROL_H
108