1/* Copyright (C) 2007-2008 The Android Open Source Project
2**
3** This software is licensed under the terms of the GNU General Public
4** License version 2, as published by the Free Software Foundation, and
5** may be copied, distributed, and modified under those terms.
6**
7** This program is distributed in the hope that it will be useful,
8** but WITHOUT ANY WARRANTY; without even the implied warranty of
9** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10** GNU General Public License for more details.
11*/
12#ifndef _ANDROID_SKIN_FILE_H
13#define _ANDROID_SKIN_FILE_H
14
15#include "android/skin/image.h"
16#include "android/config-file.h"
17#include "android/framebuffer.h"
18
19/**  Layout
20 **/
21
22typedef struct SkinBackground {
23    SkinImage*  image;
24    SkinRect    rect;
25    char        valid;
26} SkinBackground;
27
28typedef struct SkinDisplay {
29    SkinRect      rect;      /* display rectangle    */
30    SkinRotation  rotation;  /* framebuffer rotation */
31    int           bpp;       /* bits per pixel, 32 or 16 */
32    char          valid;
33    QFrameBuffer  qfbuff[1];
34} SkinDisplay;
35
36typedef struct SkinButton {
37    struct SkinButton*  next;
38    const char*         name;
39    SkinImage*          image;
40    SkinRect            rect;
41    unsigned            keycode;
42} SkinButton;
43
44typedef struct SkinPart {
45    struct SkinPart*   next;
46    const char*        name;
47    SkinBackground     background[1];
48    SkinDisplay        display[1];
49    SkinButton*        buttons;
50    SkinRect           rect;    /* bounding box of all parts */
51} SkinPart;
52
53#define  SKIN_PART_LOOP_BUTTONS(part,button)              \
54    do {                                                  \
55        SkinButton*  __button = (part)->buttons;          \
56        while (__button != NULL) {                        \
57            SkinButton*  __button_next = __button->next;  \
58            SkinButton*  button        = __button;
59
60#define   SKIN_PART_LOOP_END             \
61            __button = __button_next;    \
62        }                                \
63    } while (0);
64
65typedef struct SkinLocation {
66    SkinPart*             part;
67    SkinPos               anchor;
68    SkinRotation          rotation;
69    struct SkinLocation*  next;
70} SkinLocation;
71
72typedef struct SkinLayout {
73    struct SkinLayout*  next;
74    const char*         name;
75    unsigned            color;
76    int                 event_type;
77    int                 event_code;
78    int                 event_value;
79    char                has_dpad_rotation;
80    SkinRotation        dpad_rotation;
81    SkinSize            size;
82    SkinLocation*       locations;
83    SkinImage*          onion_image;
84    int                 onion_alpha;
85    SkinRotation        onion_rotation;
86} SkinLayout;
87
88#define  SKIN_LAYOUT_LOOP_LOCS(layout,loc)               \
89    do {                                                 \
90        SkinLocation*  __loc = (layout)->locations;      \
91        while (__loc != NULL) {                          \
92            SkinLocation*  __loc_next = (__loc)->next;   \
93            SkinLocation*  loc        = __loc;
94
95#define  SKIN_LAYOUT_LOOP_END   \
96            __loc = __loc_next; \
97        }                       \
98    } while (0);
99
100extern SkinDisplay*   skin_layout_get_display( SkinLayout*  layout );
101
102extern SkinRotation   skin_layout_get_dpad_rotation( SkinLayout*  layout );
103
104typedef struct SkinFile {
105    int             version;  /* 1, 2 or 3 */
106    SkinPart*       parts;
107    SkinLayout*     layouts;
108    int             num_parts;
109    int             num_layouts;
110} SkinFile;
111
112#define  SKIN_FILE_LOOP_LAYOUTS(file,layout)             \
113    do {                                                 \
114        SkinLayout*  __layout = (file)->layouts;         \
115        while (__layout != NULL) {                       \
116            SkinLayout*  __layout_next = __layout->next; \
117            SkinLayout*  layout        = __layout;
118
119#define  SKIN_FILE_LOOP_END_LAYOUTS       \
120            __layout = __layout_next;     \
121        }                                 \
122    } while (0);
123
124#define  SKIN_FILE_LOOP_PARTS(file,part)                 \
125    do {                                                 \
126        SkinPart*   __part = (file)->parts;              \
127        while (__part != NULL) {                         \
128            SkinPart*  __part_next = __part->next;       \
129            SkinPart*  part        = __part;
130
131#define  SKIN_FILE_LOOP_END_PARTS  \
132            __part = __part_next;  \
133        }                          \
134    } while (0);
135
136extern SkinFile*  skin_file_create_from_aconfig( AConfig*   aconfig, const char*  basepath );
137extern void       skin_file_free( SkinFile*  file );
138
139#endif /* _ANDROID_SKIN_FILE_H */
140