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