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