1 #ifndef __al_included_allegro5_aintern_display_h
2 #define __al_included_allegro5_aintern_display_h
3 
4 #include "allegro5/allegro.h"
5 #include "allegro5/transformations.h"
6 #include "allegro5/display.h"
7 #include "allegro5/bitmap.h"
8 #include "allegro5/internal/aintern_events.h"
9 
10 #ifdef __cplusplus
11 extern "C" {
12 #endif
13 
14 typedef struct ALLEGRO_DISPLAY_INTERFACE ALLEGRO_DISPLAY_INTERFACE;
15 
16 struct ALLEGRO_DISPLAY_INTERFACE
17 {
18    int id;
19    ALLEGRO_DISPLAY *(*create_display)(int w, int h);
20    void (*destroy_display)(ALLEGRO_DISPLAY *display);
21    bool (*set_current_display)(ALLEGRO_DISPLAY *d);
22    void (*unset_current_display)(ALLEGRO_DISPLAY *d);
23    void (*clear)(ALLEGRO_DISPLAY *d, ALLEGRO_COLOR *color);
24    void (*draw_pixel)(ALLEGRO_DISPLAY *d, float x, float y, ALLEGRO_COLOR *color);
25    void (*flip_display)(ALLEGRO_DISPLAY *d);
26    void (*update_display_region)(ALLEGRO_DISPLAY *d, int x, int y,
27    	int width, int height);
28    bool (*acknowledge_resize)(ALLEGRO_DISPLAY *d);
29    bool (*resize_display)(ALLEGRO_DISPLAY *d, int width, int height);
30    void (*quick_size)(ALLEGRO_DISPLAY *d);
31    int (*get_orientation)(ALLEGRO_DISPLAY *d);
32 
33    ALLEGRO_BITMAP *(*create_bitmap)(ALLEGRO_DISPLAY *d,
34       int w, int h, int format, int flags);
35 
36    void (*set_target_bitmap)(ALLEGRO_DISPLAY *display, ALLEGRO_BITMAP *bitmap);
37    ALLEGRO_BITMAP *(*get_backbuffer)(ALLEGRO_DISPLAY *d);
38 
39    bool (*is_compatible_bitmap)(ALLEGRO_DISPLAY *display, ALLEGRO_BITMAP *bitmap);
40    void (*switch_out)(ALLEGRO_DISPLAY *display);
41    void (*switch_in)(ALLEGRO_DISPLAY *display);
42 
43    void (*draw_memory_bitmap_region)(ALLEGRO_DISPLAY *display, ALLEGRO_BITMAP *bitmap,
44       float sx, float sy, float sw, float sh, int flags);
45 
46    bool (*wait_for_vsync)(ALLEGRO_DISPLAY *display);
47 
48    bool (*set_mouse_cursor)(ALLEGRO_DISPLAY *display,
49       ALLEGRO_MOUSE_CURSOR *cursor);
50    bool (*set_system_mouse_cursor)(ALLEGRO_DISPLAY *display,
51       ALLEGRO_SYSTEM_MOUSE_CURSOR cursor_id);
52    bool (*show_mouse_cursor)(ALLEGRO_DISPLAY *display);
53    bool (*hide_mouse_cursor)(ALLEGRO_DISPLAY *display);
54 
55    void (*set_icons)(ALLEGRO_DISPLAY *display, int num_icons, ALLEGRO_BITMAP *bitmap[]);
56 
57    void (*set_window_position)(ALLEGRO_DISPLAY *display, int x, int y);
58    void (*get_window_position)(ALLEGRO_DISPLAY *display, int *x, int *y);
59    bool (*set_window_constraints)(ALLEGRO_DISPLAY *display, int min_w, int min_h, int max_w, int max_h);
60    bool (*get_window_constraints)(ALLEGRO_DISPLAY *display,  int *min_w, int *min_h, int *max_w, int *max_h);
61    bool (*set_display_flag)(ALLEGRO_DISPLAY *display, int flag, bool onoff);
62    void (*set_window_title)(ALLEGRO_DISPLAY *display, const char *title);
63 
64    void (*flush_vertex_cache)(ALLEGRO_DISPLAY *d);
65    void* (*prepare_vertex_cache)(ALLEGRO_DISPLAY *d, int num_new_vertices);
66 
67    void (*update_transformation)(ALLEGRO_DISPLAY* d, ALLEGRO_BITMAP *target);
68 
69    /* Unused */
70    void (*shutdown)(void);
71 
72    void (*acknowledge_drawing_halt)(ALLEGRO_DISPLAY *d);
73    void (*acknowledge_drawing_resume)(ALLEGRO_DISPLAY *d);
74 
75    void (*set_display_option)(ALLEGRO_DISPLAY *display, int option, int val);
76 
77    void (*clear_depth_buffer)(ALLEGRO_DISPLAY *display, float x);
78    void (*update_render_state)(ALLEGRO_DISPLAY *display);
79 
80    char *(*get_clipboard_text)(ALLEGRO_DISPLAY *display);
81    bool  (*set_clipboard_text)(ALLEGRO_DISPLAY *display, const char *text);
82    bool  (*has_clipboard_text)(ALLEGRO_DISPLAY *display);
83 
84    /* Issue #725 */
85    void (*apply_window_constraints)(ALLEGRO_DISPLAY *display, bool onoff);
86 };
87 
88 
89 struct ALLEGRO_OGL_EXTRAS;
90 
91 typedef struct ALLEGRO_BLENDER
92 {
93    int blend_op;
94    int blend_source;
95    int blend_dest;
96    int blend_alpha_op;
97    int blend_alpha_source;
98    int blend_alpha_dest;
99    ALLEGRO_COLOR blend_color;
100 } ALLEGRO_BLENDER;
101 
102 typedef struct _ALLEGRO_RENDER_STATE {
103    int write_mask;
104    int depth_test, depth_function;
105    int alpha_test, alpha_function, alpha_test_value;
106 } _ALLEGRO_RENDER_STATE;
107 
108 
109 /* These are settings Allegro itself doesn't really care about on its
110  * own, but which users may want to specify for a display anyway.
111  */
112 ALLEGRO_STATIC_ASSERT(aintern_display, ALLEGRO_DISPLAY_OPTIONS_COUNT <= 64);
113 typedef struct
114 {
115    int64_t required, suggested; /* Bitfields. */
116    int settings[ALLEGRO_DISPLAY_OPTIONS_COUNT];
117 
118    /* These are come in handy when creating a context. */
119    void *info;
120    int index, score;
121 } ALLEGRO_EXTRA_DISPLAY_SETTINGS;
122 
123 struct ALLEGRO_DISPLAY
124 {
125    /* Must be first, so the display can be used as event source. */
126    ALLEGRO_EVENT_SOURCE es;
127    ALLEGRO_DISPLAY_INTERFACE *vt;
128    int refresh_rate;
129    int flags;
130    int w, h;
131    int min_w, min_h;
132    int max_w, max_h;
133 
134    int backbuffer_format; /* ALLEGRO_PIXELFORMAT */
135 
136    ALLEGRO_EXTRA_DISPLAY_SETTINGS extra_settings;
137    struct ALLEGRO_OGL_EXTRAS *ogl_extras;
138 
139    /* A list of bitmaps created for this display, sub-bitmaps not included. */
140    _AL_VECTOR bitmaps;
141 
142    int num_cache_vertices;
143    bool cache_enabled;
144    int vertex_cache_size;
145    void* vertex_cache;
146    uintptr_t cache_texture;
147 
148    ALLEGRO_BLENDER cur_blender;
149 
150    ALLEGRO_SHADER* default_shader;
151 
152    ALLEGRO_TRANSFORM projview_transform;
153 
154    _ALLEGRO_RENDER_STATE render_state;
155 
156    _AL_VECTOR display_invalidated_callbacks;
157    _AL_VECTOR display_validated_callbacks;
158 
159    /* Issue #725 */
160    bool use_constraints;
161 
162    /* On Windows, menus take up the display's height so whenever doing a
163     * manual resize we need to add this number to the height for things
164     * to work correctly. See issue #860. */
165    int extra_resize_height;
166 };
167 
168 int  _al_score_display_settings(ALLEGRO_EXTRA_DISPLAY_SETTINGS *eds, ALLEGRO_EXTRA_DISPLAY_SETTINGS *ref);
169 void _al_fill_display_settings(ALLEGRO_EXTRA_DISPLAY_SETTINGS *eds);
170 void _al_set_color_components(int format, ALLEGRO_EXTRA_DISPLAY_SETTINGS *eds, int importance);
171 int  _al_deduce_color_format(ALLEGRO_EXTRA_DISPLAY_SETTINGS *eds);
172 int  _al_display_settings_sorter(const void *p0, const void *p1);
173 
174 int _al_get_suggested_display_option(ALLEGRO_DISPLAY *d,
175    int option, int default_value);
176 
177 /* This is called from the primitives addon and for shaders. */
178 AL_FUNC(void, _al_add_display_invalidated_callback, (ALLEGRO_DISPLAY *display,
179    void (*display_invalidated)(ALLEGRO_DISPLAY*)));
180 AL_FUNC(void, _al_add_display_validated_callback, (ALLEGRO_DISPLAY *display,
181    void (*display_validated)(ALLEGRO_DISPLAY*)));
182 AL_FUNC(void, _al_remove_display_invalidated_callback, (ALLEGRO_DISPLAY *display,
183    void (*display_invalidated)(ALLEGRO_DISPLAY*)));
184 AL_FUNC(void, _al_remove_display_validated_callback, (ALLEGRO_DISPLAY *display,
185    void (*display_validated)(ALLEGRO_DISPLAY*)));
186 
187 /* Defined in tls.c */
188 bool _al_set_current_display_only(ALLEGRO_DISPLAY *display);
189 void _al_set_new_display_settings(ALLEGRO_EXTRA_DISPLAY_SETTINGS *settings);
190 ALLEGRO_EXTRA_DISPLAY_SETTINGS *_al_get_new_display_settings(void);
191 
192 
193 #ifdef __cplusplus
194 }
195 #endif
196 
197 #endif
198