1e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian/*
2e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * Copyright (C) 2010 The Android Open Source Project
3e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian *
4e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
5e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * you may not use this file except in compliance with the License.
6e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * You may obtain a copy of the License at
7e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian *
8e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
9e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian *
10e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * Unless required by applicable law or agreed to in writing, software
11e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
12e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * See the License for the specific language governing permissions and
14e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * limitations under the License.
15e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian */
16e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
17e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian#ifndef ANDROID_NATIVE_WINDOW_H
18e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian#define ANDROID_NATIVE_WINDOW_H
19e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
20e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian#include <android/rect.h>
21e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
22e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian#ifdef __cplusplus
23e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopianextern "C" {
24e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian#endif
25e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
26e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian/*
27e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * Pixel formats that a window can use.
28e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian */
29e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopianenum {
30e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    WINDOW_FORMAT_RGBA_8888          = 1,
31e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    WINDOW_FORMAT_RGBX_8888          = 2,
32e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    WINDOW_FORMAT_RGB_565            = 4,
33e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian};
34e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
35e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopianstruct ANativeWindow;
36e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopiantypedef struct ANativeWindow ANativeWindow;
37e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
38e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopiantypedef struct ANativeWindow_Buffer {
39e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    // The number of pixels that are show horizontally.
40e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    int32_t width;
41e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
42e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    // The number of pixels that are shown vertically.
43e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    int32_t height;
44e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
45e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    // The number of *pixels* that a line in the buffer takes in
46e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    // memory.  This may be >= width.
47e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    int32_t stride;
48e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
49e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    // The format of the buffer.  One of WINDOW_FORMAT_*
50e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    int32_t format;
51e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
52e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    // The actual bits.
53e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    void* bits;
54e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
55e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    // Do not touch.
56e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian    uint32_t reserved[6];
57e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian} ANativeWindow_Buffer;
58e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
59e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian/**
60e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * Acquire a reference on the given ANativeWindow object.  This prevents the object
61e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * from being deleted until the reference is removed.
62e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian */
63e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopianvoid ANativeWindow_acquire(ANativeWindow* window);
64e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
65e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian/**
66e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * Remove a reference that was previously acquired with ANativeWindow_acquire().
67e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian */
68e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopianvoid ANativeWindow_release(ANativeWindow* window);
69e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
70e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian/*
71e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * Return the current width in pixels of the window surface.  Returns a
72e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * negative value on error.
73e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian */
74e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopianint32_t ANativeWindow_getWidth(ANativeWindow* window);
75e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
76e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian/*
77e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * Return the current height in pixels of the window surface.  Returns a
78e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * negative value on error.
79e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian */
80e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopianint32_t ANativeWindow_getHeight(ANativeWindow* window);
81e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
82e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian/*
83e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * Return the current pixel format of the window surface.  Returns a
84e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * negative value on error.
85e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian */
86e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopianint32_t ANativeWindow_getFormat(ANativeWindow* window);
87e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
88e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian/*
89e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * Change the format and size of the window buffers.
90e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian *
91e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * The width and height control the number of pixels in the buffers, not the
92e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * dimensions of the window on screen.  If these are different than the
93e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * window's physical size, then it buffer will be scaled to match that size
94e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * when compositing it to the screen.
95e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian *
96e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * For all of these parameters, if 0 is supplied then the window's base
97e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * value will come back in force.
98e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian *
99e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * width and height must be either both zero or both non-zero.
100e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian *
101e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian */
102e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopianint32_t ANativeWindow_setBuffersGeometry(ANativeWindow* window,
103e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian        int32_t width, int32_t height, int32_t format);
104e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
105e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian/**
106e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * Lock the window's next drawing surface for writing.
107e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * inOutDirtyBounds is used as an in/out parameter, upon entering the
108e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * function, it contains the dirty region, that is, the region the caller
109e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * intends to redraw. When the function returns, inOutDirtyBounds is updated
110e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * with the actual area the caller needs to redraw -- this region is often
111e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * extended by ANativeWindow_lock.
112e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian */
113e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopianint32_t ANativeWindow_lock(ANativeWindow* window, ANativeWindow_Buffer* outBuffer,
114e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian        ARect* inOutDirtyBounds);
115e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
116e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian/**
117e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * Unlock the window's drawing surface after previously locking it,
118e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian * posting the new buffer to the display.
119e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian */
120e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopianint32_t ANativeWindow_unlockAndPost(ANativeWindow* window);
121e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
122e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian#ifdef __cplusplus
123e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian};
124e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian#endif
125e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian
126e1c61d3cc8458ce9a15d8109f728e60f5248939dMathias Agopian#endif // ANDROID_NATIVE_WINDOW_H
127