1 /*
2  * Copyright (C) 2009 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ANDROID_ANDROID_NATIVES_H
18 #define ANDROID_ANDROID_NATIVES_H
19 
20 #include <sys/types.h>
21 #include <string.h>
22 
23 #include <hardware/gralloc.h>
24 #include <system/window.h>
25 
26 // ---------------------------------------------------------------------------
27 
28 /* FIXME: this is legacy for pixmaps */
29 typedef struct egl_native_pixmap_t
30 {
31     int32_t     version;    /* must be 32 */
32     int32_t     width;
33     int32_t     height;
34     int32_t     stride;
35     uint8_t*    data;
36     uint8_t     format;
37     uint8_t     rfu[3];
38     union {
39         uint32_t    compressedFormat;
40         int32_t     vstride;
41     };
42     int32_t     reserved;
43 } egl_native_pixmap_t;
44 
45 /*****************************************************************************/
46 
47 #ifdef __cplusplus
48 
49 #include <utils/RefBase.h>
50 
51 namespace android {
52 
53 /*
54  * This helper class turns a ANativeXXX object type into a C++
55  * reference-counted object; with proper type conversions.
56  */
57 template <typename NATIVE_TYPE, typename TYPE, typename REF>
58 class ANativeObjectBase : public NATIVE_TYPE, public REF
59 {
60 public:
61     // Disambiguate between the incStrong in REF and NATIVE_TYPE
incStrong(const void * id)62     void incStrong(const void* id) const {
63         REF::incStrong(id);
64     }
decStrong(const void * id)65     void decStrong(const void* id) const {
66         REF::decStrong(id);
67     }
68 
69 protected:
70     typedef ANativeObjectBase<NATIVE_TYPE, TYPE, REF> BASE;
ANativeObjectBase()71     ANativeObjectBase() : NATIVE_TYPE(), REF() {
72         NATIVE_TYPE::common.incRef = incRef;
73         NATIVE_TYPE::common.decRef = decRef;
74     }
getSelf(NATIVE_TYPE * self)75     static inline TYPE* getSelf(NATIVE_TYPE* self) {
76         return static_cast<TYPE*>(self);
77     }
getSelf(NATIVE_TYPE const * self)78     static inline TYPE const* getSelf(NATIVE_TYPE const* self) {
79         return static_cast<TYPE const *>(self);
80     }
getSelf(android_native_base_t * base)81     static inline TYPE* getSelf(android_native_base_t* base) {
82         return getSelf(reinterpret_cast<NATIVE_TYPE*>(base));
83     }
getSelf(android_native_base_t const * base)84     static inline TYPE const * getSelf(android_native_base_t const* base) {
85         return getSelf(reinterpret_cast<NATIVE_TYPE const*>(base));
86     }
incRef(android_native_base_t * base)87     static void incRef(android_native_base_t* base) {
88         ANativeObjectBase* self = getSelf(base);
89         self->incStrong(self);
90     }
decRef(android_native_base_t * base)91     static void decRef(android_native_base_t* base) {
92         ANativeObjectBase* self = getSelf(base);
93         self->decStrong(self);
94     }
95 };
96 
97 } // namespace android
98 #endif // __cplusplus
99 
100 /*****************************************************************************/
101 
102 #endif /* ANDROID_ANDROID_NATIVES_H */
103