• ANativeWindow是个什么东西


        公司经常组织一些培训,培训的都是些奇技淫巧。什么设计模式啦,开发策略啦,git啦,repo啦,另外就是培训一些开发流程的东东,例如CMMI啦。可是,却忘记了,程序员终究要归结到三个问题上:

        1.解决什么问题?

        2.为什么这样解决问题?

        3.有没有更好的解决方案?

        这些东东才是最核心的东东。但是却是一个程序员一辈子都无法完全掌握的东西。很多人以为写出了高难度的反射代码就是很牛,也有人认为利用C++模板来进行编程就多牛多牛,还有人觉得会写makefile文件,掌握了某种高难度语言很牛。但是我认为这些都不重要,重要的是要有思想。思考者比行动者在关键时候定大局。中国人的技术书籍缺乏的就是思想。在中国,可以肯定,没有几个人能写出像thinking in java这样的鸿篇巨著,更没有人能够超越 design pattern,来描述其思想。反之,像《自己动手写操作系统》,《21天学java》,《程序员的自我修养》,《面试宝典》,《C++面试一百例》, android内核开发要点等等等等一系列的书籍在中国却是层出不穷。为什么,因为缺乏思考,来不及思考,更或者懒得思考。然而,作为一名专业级的程序员,不思考就意味着退步,不学习就意味着淘汰。

       这几天一直在思考ANativeWindow是个什么东西,今天终于找到了,代码贴出来,大家参考一下。

      

    Cpp代码  收藏代码
    1. struct ANativeWindow  
    2. {  
    3. #ifdef __cplusplus  
    4.     ANativeWindow()  
    5.         : flags(0), minSwapInterval(0), maxSwapInterval(0), xdpi(0), ydpi(0)  
    6.     {  
    7.         common.magic = ANDROID_NATIVE_WINDOW_MAGIC;  
    8.         common.version = sizeof(ANativeWindow);  
    9.         memset(common.reserved, 0, sizeof(common.reserved));  
    10.     }  
    11.   
    12.     /* Implement the methods that sp<ANativeWindow> expects so that it 
    13.        can be used to automatically refcount ANativeWindow's. */  
    14.     void incStrong(const void* id) const {  
    15.         common.incRef(const_cast<android_native_base_t*>(&common));  
    16.     }  
    17.     void decStrong(const void* id) const {  
    18.         common.decRef(const_cast<android_native_base_t*>(&common));  
    19.     }  
    20. #endif  
    21.   
    22.     struct android_native_base_t common;  
    23.   
    24.     /* flags describing some attributes of this surface or its updater */  
    25.     const uint32_t flags;  
    26.   
    27.     /* min swap interval supported by this updated */  
    28.     const int   minSwapInterval;  
    29.   
    30.     /* max swap interval supported by this updated */  
    31.     const int   maxSwapInterval;  
    32.   
    33.     /* horizontal and vertical resolution in DPI */  
    34.     const float xdpi;  
    35.     const float ydpi;  
    36.   
    37.     /* Some storage reserved for the OEM's driver. */  
    38.     intptr_t    oem[4];  
    39.   
    40.     /* 
    41.      * Set the swap interval for this surface. 
    42.      * 
    43.      * Returns 0 on success or -errno on error. 
    44.      */  
    45.     int     (*setSwapInterval)(struct ANativeWindow* window,  
    46.                 int interval);  
    47.   
    48.     /* 
    49.      * Hook called by EGL to acquire a buffer. After this call, the buffer 
    50.      * is not locked, so its content cannot be modified. This call may block if 
    51.      * no buffers are available. 
    52.      * 
    53.      * The window holds a reference to the buffer between dequeueBuffer and 
    54.      * either queueBuffer or cancelBuffer, so clients only need their own 
    55.      * reference if they might use the buffer after queueing or canceling it. 
    56.      * Holding a reference to a buffer after queueing or canceling it is only 
    57.      * allowed if a specific buffer count has been set. 
    58.      * 
    59.      * Returns 0 on success or -errno on error. 
    60.      */  
    61.     int     (*dequeueBuffer)(struct ANativeWindow* window,  
    62.                 struct ANativeWindowBuffer** buffer);  
    63.   
    64.     /* 
    65.      * hook called by EGL to lock a buffer. This MUST be called before modifying 
    66.      * the content of a buffer. The buffer must have been acquired with 
    67.      * dequeueBuffer first. 
    68.      * 
    69.      * Returns 0 on success or -errno on error. 
    70.      */  
    71.     int     (*lockBuffer)(struct ANativeWindow* window,  
    72.                 struct ANativeWindowBuffer* buffer);  
    73.     /* 
    74.      * Hook called by EGL when modifications to the render buffer are done. 
    75.      * This unlocks and post the buffer. 
    76.      * 
    77.      * The window holds a reference to the buffer between dequeueBuffer and 
    78.      * either queueBuffer or cancelBuffer, so clients only need their own 
    79.      * reference if they might use the buffer after queueing or canceling it. 
    80.      * Holding a reference to a buffer after queueing or canceling it is only 
    81.      * allowed if a specific buffer count has been set. 
    82.      * 
    83.      * Buffers MUST be queued in the same order than they were dequeued. 
    84.      * 
    85.      * Returns 0 on success or -errno on error. 
    86.      */  
    87.     int     (*queueBuffer)(struct ANativeWindow* window,  
    88.                 struct ANativeWindowBuffer* buffer);  
    89.   
    90.     /* 
    91.      * hook used to retrieve information about the native window. 
    92.      * 
    93.      * Returns 0 on success or -errno on error. 
    94.      */  
    95.     int     (*query)(const struct ANativeWindow* window,  
    96.                 int what, int* value);  
    97.   
    98.     /* 
    99.      * hook used to perform various operations on the surface. 
    100.      * (*perform)() is a generic mechanism to add functionality to 
    101.      * ANativeWindow while keeping backward binary compatibility. 
    102.      * 
    103.      * DO NOT CALL THIS HOOK DIRECTLY.  Instead, use the helper functions 
    104.      * defined below. 
    105.      * 
    106.      *  (*perform)() returns -ENOENT if the 'what' parameter is not supported 
    107.      *  by the surface's implementation. 
    108.      * 
    109.      * The valid operations are: 
    110.      *     NATIVE_WINDOW_SET_USAGE 
    111.      *     NATIVE_WINDOW_CONNECT               (deprecated) 
    112.      *     NATIVE_WINDOW_DISCONNECT            (deprecated) 
    113.      *     NATIVE_WINDOW_SET_CROP 
    114.      *     NATIVE_WINDOW_SET_BUFFER_COUNT 
    115.      *     NATIVE_WINDOW_SET_BUFFERS_GEOMETRY  (deprecated) 
    116.      *     NATIVE_WINDOW_SET_BUFFERS_TRANSFORM 
    117.      *     NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP 
    118.      *     NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS 
    119.      *     NATIVE_WINDOW_SET_BUFFERS_FORMAT 
    120.      *     NATIVE_WINDOW_SET_SCALING_MODE 
    121.      *     NATIVE_WINDOW_LOCK                   (private) 
    122.      *     NATIVE_WINDOW_UNLOCK_AND_POST        (private) 
    123.      *     NATIVE_WINDOW_API_CONNECT            (private) 
    124.      *     NATIVE_WINDOW_API_DISCONNECT         (private) 
    125.      * 
    126.      */  
    127.   
    128.     int     (*perform)(struct ANativeWindow* window,  
    129.                 int operation, ... );  
    130.   
    131.     /* 
    132.      * Hook used to cancel a buffer that has been dequeued. 
    133.      * No synchronization is performed between dequeue() and cancel(), so 
    134.      * either external synchronization is needed, or these functions must be 
    135.      * called from the same thread. 
    136.      * 
    137.      * The window holds a reference to the buffer between dequeueBuffer and 
    138.      * either queueBuffer or cancelBuffer, so clients only need their own 
    139.      * reference if they might use the buffer after queueing or canceling it. 
    140.      * Holding a reference to a buffer after queueing or canceling it is only 
    141.      * allowed if a specific buffer count has been set. 
    142.      */  
    143.     int     (*cancelBuffer)(struct ANativeWindow* window,  
    144.                 struct ANativeWindowBuffer* buffer);  
    145.   
    146.   
    147.     void* reserved_proc[2];  
    148. };  
  • 相关阅读:
    Angular——事件指令
    Angular——数据绑定
    Angular——自定义指令
    Angular——表单指令
    Angular——引入模板指令
    Angular——内置指令
    Angular——基本使用
    Canvas——基本入门
    JS高级——面向对象方式解决tab栏切换问题
    JS高级——面向对象方式解决歌曲管理问题
  • 原文地址:https://www.cnblogs.com/xiaochao1234/p/4000101.html
Copyright © 2020-2023  润新知