/*
 * Android native system definitions
 *
 * Copyright 2013 Alexandre Julliard
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

/* Copy of some Android native structures to avoid depending on the Android source */
/* Hopefully these won't change too frequently... */

#ifndef __WINE_ANDROID_NATIVE_H
#define __WINE_ANDROID_NATIVE_H

/* Native window definitions */

typedef struct native_handle
{
    int version;
    int numFds;
    int numInts;
    int data[0];
} native_handle_t;

typedef const native_handle_t *buffer_handle_t;

struct android_native_base_t
{
    int magic;
    int version;
    void *reserved[4];
    void (*incRef)(struct android_native_base_t *base);
    void (*decRef)(struct android_native_base_t *base);
};

typedef struct android_native_rect_t
{
    int32_t left;
    int32_t top;
    int32_t right;
    int32_t bottom;
} android_native_rect_t;

struct ANativeWindowBuffer
{
    struct android_native_base_t common;
    int width;
    int height;
    int stride;
    int format;
    int usage;
    void *reserved[2];
    buffer_handle_t handle;
    void *reserved_proc[8];
};

struct ANativeWindow
{
    struct android_native_base_t common;
    uint32_t flags;
    int      minSwapInterval;
    int      maxSwapInterval;
    float    xdpi;
    float    ydpi;
    intptr_t oem[4];
    int (*setSwapInterval)(struct ANativeWindow *window, int interval);
    int (*dequeueBuffer_DEPRECATED)(struct ANativeWindow *window, struct ANativeWindowBuffer **buffer);
    int (*lockBuffer_DEPRECATED)(struct ANativeWindow *window, struct ANativeWindowBuffer *buffer);
    int (*queueBuffer_DEPRECATED)(struct ANativeWindow *window, struct ANativeWindowBuffer *buffer);
    int (*query)(const struct ANativeWindow *window, int what, int *value);
    int (*perform)(struct ANativeWindow *window, int operation, ... );
    int (*cancelBuffer_DEPRECATED)(struct ANativeWindow *window, struct ANativeWindowBuffer *buffer);
    int (*dequeueBuffer)(struct ANativeWindow *window, struct ANativeWindowBuffer **buffer, int *fenceFd);
    int (*queueBuffer)(struct ANativeWindow *window, struct ANativeWindowBuffer *buffer, int fenceFd);
    int (*cancelBuffer)(struct ANativeWindow *window, struct ANativeWindowBuffer *buffer, int fenceFd);
};

enum native_window_query
{
    NATIVE_WINDOW_WIDTH                     = 0,
    NATIVE_WINDOW_HEIGHT                    = 1,
    NATIVE_WINDOW_FORMAT                    = 2,
    NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS    = 3,
    NATIVE_WINDOW_QUEUES_TO_WINDOW_COMPOSER = 4,
    NATIVE_WINDOW_CONCRETE_TYPE             = 5,
    NATIVE_WINDOW_DEFAULT_WIDTH             = 6,
    NATIVE_WINDOW_DEFAULT_HEIGHT            = 7,
    NATIVE_WINDOW_TRANSFORM_HINT            = 8,
    NATIVE_WINDOW_CONSUMER_RUNNING_BEHIND   = 9
};

enum native_window_perform
{
    NATIVE_WINDOW_SET_USAGE                   = 0,
    NATIVE_WINDOW_CONNECT                     = 1,
    NATIVE_WINDOW_DISCONNECT                  = 2,
    NATIVE_WINDOW_SET_CROP                    = 3,
    NATIVE_WINDOW_SET_BUFFER_COUNT            = 4,
    NATIVE_WINDOW_SET_BUFFERS_GEOMETRY        = 5,
    NATIVE_WINDOW_SET_BUFFERS_TRANSFORM       = 6,
    NATIVE_WINDOW_SET_BUFFERS_TIMESTAMP       = 7,
    NATIVE_WINDOW_SET_BUFFERS_DIMENSIONS      = 8,
    NATIVE_WINDOW_SET_BUFFERS_FORMAT          = 9,
    NATIVE_WINDOW_SET_SCALING_MODE            = 10,
    NATIVE_WINDOW_LOCK                        = 11,
    NATIVE_WINDOW_UNLOCK_AND_POST             = 12,
    NATIVE_WINDOW_API_CONNECT                 = 13,
    NATIVE_WINDOW_API_DISCONNECT              = 14,
    NATIVE_WINDOW_SET_BUFFERS_USER_DIMENSIONS = 15,
    NATIVE_WINDOW_SET_POST_TRANSFORM_CROP     = 16
};

enum native_window_api
{
    NATIVE_WINDOW_API_EGL = 1,
    NATIVE_WINDOW_API_CPU = 2,
    NATIVE_WINDOW_API_MEDIA = 3,
    NATIVE_WINDOW_API_CAMERA = 4
};

enum android_pixel_format
{
    PF_RGBA_8888 = 1,
    PF_RGBX_8888 = 2,
    PF_RGB_888   = 3,
    PF_RGB_565   = 4,
    PF_BGRA_8888 = 5,
    PF_RGBA_5551 = 6,
    PF_RGBA_4444 = 7
};


/* Hardware module definitions */

struct hw_module_methods_t;
struct hw_device_t;
struct android_ycbcr;

struct hw_module_t
{
    uint32_t tag;
    uint16_t module_api_version;
    uint16_t hal_api_version;
    const char *id;
    const char *name;
    const char *author;
    struct hw_module_methods_t *methods;
    void *dso;
    void *reserved[32-7];
};

struct hw_module_methods_t
{
    int (*open)(const struct hw_module_t *module, const char *id, struct hw_device_t **device);
};

struct hw_device_t
{
    uint32_t tag;
    uint32_t version;
    struct hw_module_t *module;
    void *reserved[12];
    int (*close)(struct hw_device_t *device);
};

struct gralloc_module_t
{
    struct hw_module_t common;
    int (*registerBuffer)(struct gralloc_module_t const *module, buffer_handle_t handle);
    int (*unregisterBuffer)(struct gralloc_module_t const *module, buffer_handle_t handle);
    int (*lock)(struct gralloc_module_t const *module, buffer_handle_t handle, int usage, int l, int t, int w, int h, void **vaddr);
    int (*unlock)(struct gralloc_module_t const *module, buffer_handle_t handle);
    int (*perform)(struct gralloc_module_t const *module, int operation, ... );
    int (*lock_ycbcr)(struct gralloc_module_t const *module, buffer_handle_t handle, int usage, int l, int t, int w, int h, struct android_ycbcr *ycbcr);
    void *reserved_proc[6];
};

#define ANDROID_NATIVE_MAKE_CONSTANT(a,b,c,d) \
    (((unsigned)(a)<<24)|((unsigned)(b)<<16)|((unsigned)(c)<<8)|(unsigned)(d))

#define ANDROID_NATIVE_WINDOW_MAGIC \
    ANDROID_NATIVE_MAKE_CONSTANT('_','w','n','d')

#define ANDROID_NATIVE_BUFFER_MAGIC \
    ANDROID_NATIVE_MAKE_CONSTANT('_','b','f','r')

enum gralloc_usage
{
    GRALLOC_USAGE_SW_READ_NEVER         = 0x00000000,
    GRALLOC_USAGE_SW_READ_RARELY        = 0x00000002,
    GRALLOC_USAGE_SW_READ_OFTEN         = 0x00000003,
    GRALLOC_USAGE_SW_READ_MASK          = 0x0000000F,
    GRALLOC_USAGE_SW_WRITE_NEVER        = 0x00000000,
    GRALLOC_USAGE_SW_WRITE_RARELY       = 0x00000020,
    GRALLOC_USAGE_SW_WRITE_OFTEN        = 0x00000030,
    GRALLOC_USAGE_SW_WRITE_MASK         = 0x000000F0,
    GRALLOC_USAGE_HW_TEXTURE            = 0x00000100,
    GRALLOC_USAGE_HW_RENDER             = 0x00000200,
    GRALLOC_USAGE_HW_2D                 = 0x00000400,
    GRALLOC_USAGE_HW_COMPOSER           = 0x00000800,
    GRALLOC_USAGE_HW_FB                 = 0x00001000,
    GRALLOC_USAGE_HW_VIDEO_ENCODER      = 0x00010000,
    GRALLOC_USAGE_HW_CAMERA_WRITE       = 0x00020000,
    GRALLOC_USAGE_HW_CAMERA_READ        = 0x00040000,
    GRALLOC_USAGE_HW_CAMERA_ZSL         = 0x00060000,
    GRALLOC_USAGE_HW_CAMERA_MASK        = 0x00060000,
    GRALLOC_USAGE_HW_MASK               = 0x00071F00,
    GRALLOC_USAGE_EXTERNAL_DISP         = 0x00002000,
    GRALLOC_USAGE_PROTECTED             = 0x00004000,
    GRALLOC_USAGE_PRIVATE_0             = 0x10000000,
    GRALLOC_USAGE_PRIVATE_1             = 0x20000000,
    GRALLOC_USAGE_PRIVATE_2             = 0x40000000,
    GRALLOC_USAGE_PRIVATE_3             = 0x80000000,
    GRALLOC_USAGE_PRIVATE_MASK          = 0xF0000000,
};

#define GRALLOC_HARDWARE_MODULE_ID "gralloc"

extern int hw_get_module(const char *id, const struct hw_module_t **module);

#endif /* __WINE_ANDROID_NATIVE_H */
