1 /*
2  * Copyright (C) 2007 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 _MINUI_H_
18 #define _MINUI_H_
19 
20 #include <sys/types.h>
21 
22 #include <functional>
23 #include <string>
24 #include <vector>
25 
26 //
27 // Graphics.
28 //
29 
30 struct GRSurface {
31   int width;
32   int height;
33   int row_bytes;
34   int pixel_bytes;
35   unsigned char* data;
36 };
37 
38 struct GRFont {
39   GRSurface* texture;
40   int char_width;
41   int char_height;
42 };
43 
44 enum GRRotation {
45   ROTATION_NONE = 0,
46   ROTATION_RIGHT = 1,
47   ROTATION_DOWN = 2,
48   ROTATION_LEFT = 3,
49 };
50 
51 int gr_init();
52 void gr_exit();
53 
54 int gr_fb_width();
55 int gr_fb_height();
56 
57 void gr_flip();
58 void gr_fb_blank(bool blank);
59 
60 void gr_clear();  // clear entire surface to current color
61 void gr_color(unsigned char r, unsigned char g, unsigned char b, unsigned char a);
62 void gr_fill(int x1, int y1, int x2, int y2);
63 
64 void gr_texticon(int x, int y, GRSurface* icon);
65 
66 const GRFont* gr_sys_font();
67 int gr_init_font(const char* name, GRFont** dest);
68 void gr_text(const GRFont* font, int x, int y, const char* s, bool bold);
69 int gr_measure(const GRFont* font, const char* s);
70 void gr_font_size(const GRFont* font, int* x, int* y);
71 
72 void gr_blit(GRSurface* source, int sx, int sy, int w, int h, int dx, int dy);
73 unsigned int gr_get_width(GRSurface* surface);
74 unsigned int gr_get_height(GRSurface* surface);
75 
76 // Set rotation, flips gr_fb_width/height if 90 degree rotation difference
77 void gr_rotate(GRRotation rotation);
78 
79 //
80 // Input events.
81 //
82 
83 struct input_event;
84 
85 using ev_callback = std::function<int(int fd, uint32_t epevents)>;
86 using ev_set_key_callback = std::function<int(int code, int value)>;
87 
88 int ev_init(ev_callback input_cb, bool allow_touch_inputs = false);
89 void ev_exit();
90 int ev_add_fd(int fd, ev_callback cb);
91 void ev_iterate_available_keys(const std::function<void(int)>& f);
92 void ev_iterate_touch_inputs(const std::function<void(int)>& action);
93 int ev_sync_key_state(const ev_set_key_callback& set_key_cb);
94 
95 // 'timeout' has the same semantics as poll(2).
96 //    0 : don't block
97 //  < 0 : block forever
98 //  > 0 : block for 'timeout' milliseconds
99 int ev_wait(int timeout);
100 
101 int ev_get_input(int fd, uint32_t epevents, input_event* ev);
102 void ev_dispatch();
103 int ev_get_epollfd();
104 
105 //
106 // Resources
107 //
108 
109 bool matches_locale(const std::string& prefix, const std::string& locale);
110 
111 // res_create_*_surface() functions return 0 if no error, else
112 // negative.
113 //
114 // A "display" surface is one that is intended to be drawn to the
115 // screen with gr_blit().  An "alpha" surface is a grayscale image
116 // interpreted as an alpha mask used to render text in the current
117 // color (with gr_text() or gr_texticon()).
118 //
119 // All these functions load PNG images from "/res/images/${name}.png".
120 
121 // Load a single display surface from a PNG image.
122 int res_create_display_surface(const char* name, GRSurface** pSurface);
123 
124 // Load an array of display surfaces from a single PNG image.  The PNG
125 // should have a 'Frames' text chunk whose value is the number of
126 // frames this image represents.  The pixel data itself is interlaced
127 // by row.
128 int res_create_multi_display_surface(const char* name, int* frames, int* fps,
129                                      GRSurface*** pSurface);
130 
131 // Load a single alpha surface from a grayscale PNG image.
132 int res_create_alpha_surface(const char* name, GRSurface** pSurface);
133 
134 // Load part of a grayscale PNG image that is the first match for the
135 // given locale.  The image is expected to be a composite of multiple
136 // translations of the same text, with special added rows that encode
137 // the subimages' size and intended locale in the pixel data.  See
138 // bootable/recovery/tools/recovery_l10n for an app that will generate
139 // these specialized images from Android resources.
140 int res_create_localized_alpha_surface(const char* name, const char* locale,
141                                        GRSurface** pSurface);
142 
143 // Return a list of locale strings embedded in |png_name|. Return a empty list in case of failure.
144 std::vector<std::string> get_locales_in_png(const std::string& png_name);
145 
146 // Free a surface allocated by any of the res_create_*_surface()
147 // functions.
148 void res_free_surface(GRSurface* surface);
149 
150 #endif
151