@ -17,6 +17,7 @@
// CHANGELOG
// (minor and older changes stripped away, please see git history for details)
// 2022-11-30: Renderer: Restoring using al_draw_indexed_prim() when Allegro version is >= 5.2.5.
// 2022-10-11: Using 'nullptr' instead of 'NULL' as per our switch to C++11.
// 2022-09-26: Inputs: Renamed ImGuiKey_ModXXX introduced in 1.87 to ImGuiMod_XXX (old names still supported).
// 2022-01-26: Inputs: replaced short-lived io.AddKeyModsEvent() (added two weeks ago) with io.AddKeyEvent() using ImGuiKey_ModXXX flags. Sorry for the confusion.
@ -37,6 +38,7 @@
// 2018-11-30: Misc: Setting up io.BackendPlatformName/io.BackendRendererName so they can be displayed in the About Window.
// 2018-06-13: Platform: Added clipboard support (from Allegro 5.1.12).
// 2018-06-13: Renderer: Use draw_data->DisplayPos and draw_data->DisplaySize to setup projection matrix and clipping rectangle.
// 2018-06-13: Renderer: Stopped using al_draw_indexed_prim() as it is buggy in Allegro's DX9 backend.
// 2018-06-13: Renderer: Backup/restore transform and clipping rectangle.
// 2018-06-11: Misc: Setup io.BackendFlags ImGuiBackendFlags_HasMouseCursors flag + honor ImGuiConfigFlags_NoMouseCursorChange flag.
// 2018-04-18: Misc: Renamed file from imgui_impl_a5.cpp to imgui_impl_allegro5.cpp.
@ -57,12 +59,26 @@
# include <allegro5/allegro_windows.h>
# endif
# define ALLEGRO_HAS_CLIPBOARD (ALLEGRO_VERSION_INT >= ((5 << 24) | (1 << 16) | (12 << 8))) // Clipboard only supported from Allegro 5.1.12
# define ALLEGRO_HAS_DRAW_INDEXED_PRIM (ALLEGRO_VERSION_INT >= ((5 << 24) | (2 << 16) | ( 5 << 8))) // DX9 implementation of al_draw_indexed_prim() got fixed in Allegro 5.2.5
// Visual Studio warnings
# ifdef _MSC_VER
# pragma warning (disable: 4127) // condition expression is constant
# endif
struct ImDrawVertAllegro
{
ImVec2 pos ;
ImVec2 uv ;
ALLEGRO_COLOR col ;
} ;
// FIXME-OPT: Unfortunately Allegro doesn't support 32-bit packed colors so we have to convert them to 4 float as well..
// FIXME-OPT: Consider inlining al_map_rgba()?
// see https://github.com/liballeg/allegro5/blob/master/src/pixels.c#L554
// and https://github.com/liballeg/allegro5/blob/master/include/allegro5/internal/aintern_pixels.h
# define DRAW_VERT_IMGUI_TO_ALLEGRO(DST, SRC) { (DST)->pos = (SRC)->pos; (DST)->uv = (SRC)->uv; unsigned char* c = (unsigned char*)&(SRC)->col; (DST)->col = al_map_rgba(c[0], c[1], c[2], c[3]); }
// Allegro Data
struct ImGui_ImplAllegro5_Data
{
@ -73,6 +89,9 @@ struct ImGui_ImplAllegro5_Data
ALLEGRO_VERTEX_DECL * VertexDecl ;
char * ClipboardTextData ;
ImVector < ImDrawVertAllegro > BufVertices ;
ImVector < int > BufIndices ;
ImGui_ImplAllegro5_Data ( ) { memset ( ( void * ) this , 0 , sizeof ( * this ) ) ; }
} ;
@ -81,13 +100,6 @@ struct ImGui_ImplAllegro5_Data
// FIXME: multi-context support is not well tested and probably dysfunctional in this backend.
static ImGui_ImplAllegro5_Data * ImGui_ImplAllegro5_GetBackendData ( ) { return ImGui : : GetCurrentContext ( ) ? ( ImGui_ImplAllegro5_Data * ) ImGui : : GetIO ( ) . BackendPlatformUserData : nullptr ; }
struct ImDrawVertAllegro
{
ImVec2 pos ;
ImVec2 uv ;
ALLEGRO_COLOR col ;
} ;
static void ImGui_ImplAllegro5_SetupRenderState ( ImDrawData * draw_data )
{
// Setup blending
@ -132,34 +144,40 @@ void ImGui_ImplAllegro5_RenderDrawData(ImDrawData* draw_data)
{
const ImDrawList * cmd_list = draw_data - > CmdLists [ n ] ;
// FIXME-OPT: Unfortunately Allegro doesn't support 32-bit packed colors so we have to convert them to 4 float as well..
static ImVector < ImDrawVertAllegro > vertices ;
ImVector < ImDrawVertAllegro > & vertices = bd - > BufVertices ;
# if ALLEGRO_HAS_DRAW_INDEXED_PRIM
vertices . resize ( cmd_list - > VtxBuffer . Size ) ;
for ( int i = 0 ; i < cmd_list - > VtxBuffer . Size ; i + + )
{
const ImDrawVert * src_v = & cmd_list - > VtxBuffer [ i ] ;
ImDrawVertAllegro * dst_v = & vertices [ i ] ;
dst_v - > pos = src_v - > pos ;
dst_v - > uv = src_v - > uv ;
unsigned char * c = ( unsigned char * ) & src_v - > col ;
dst_v - > col = al_map_rgba ( c [ 0 ] , c [ 1 ] , c [ 2 ] , c [ 3 ] ) ;
DRAW_VERT_IMGUI_TO_ALLEGRO ( dst_v , src_v ) ;
}
const int * indices = nullptr ;
if ( sizeof ( ImDrawIdx ) = = 2 )
{
// FIXME-OPT: Unfortunately Allegro doesn't support 16-bit indices.. You can '#define ImDrawIdx int' in imconfig.h to request Dear ImGui to output 32-bit indices.
// FIXME-OPT: Allegro doesn't support 16-bit indices.
// You can '#define ImDrawIdx int' in imconfig.h to request Dear ImGui to output 32-bit indices.
// Otherwise, we convert them from 16-bit to 32-bit at runtime here, which works perfectly but is a little wasteful.
static ImVector < int > indices_converted ;
indices_converted . resize ( cmd_list - > IdxBuffer . Size ) ;
bd - > BufIndices . resize ( cmd_list - > IdxBuffer . Size ) ;
for ( int i = 0 ; i < cmd_list - > IdxBuffer . Size ; + + i )
indices_converted [ i ] = ( int ) cmd_list - > IdxBuffer . Data [ i ] ;
indices = indices_converted . Data ;
bd - > BufIndices [ i ] = ( int ) cmd_list - > IdxBuffer . Data [ i ] ;
indices = bd - > BufIndices . Data ;
}
else if ( sizeof ( ImDrawIdx ) = = 4 )
{
indices = ( const int * ) cmd_list - > IdxBuffer . Data ;
}
# else
// Allegro's implementation of al_draw_indexed_prim() for DX9 was broken until 5.2.5. Unindex buffers ourselves while converting vertex format.
vertices . resize ( cmd_list - > IdxBuffer . Size ) ;
for ( int i = 0 ; i < cmd_list - > IdxBuffer . Size ; i + + )
{
const ImDrawVert * src_v = & cmd_list - > VtxBuffer [ cmd_list - > IdxBuffer [ i ] ] ;
ImDrawVertAllegro * dst_v = & vertices [ i ] ;
DRAW_VERT_IMGUI_TO_ALLEGRO ( dst_v , src_v ) ;
}
# endif
// Render command lists
ImVec2 clip_off = draw_data - > DisplayPos ;
@ -186,9 +204,11 @@ void ImGui_ImplAllegro5_RenderDrawData(ImDrawData* draw_data)
// Apply scissor/clipping rectangle, Draw
ALLEGRO_BITMAP * texture = ( ALLEGRO_BITMAP * ) pcmd - > GetTexID ( ) ;
al_set_clipping_rectangle ( clip_min . x , clip_min . y , clip_max . x - clip_min . x , clip_max . y - clip_min . y ) ;
if ( pcmd - > ElemCount > 0 ) {
# if ALLEGRO_HAS_DRAW_INDEXED_PRIM
al_draw_indexed_prim ( & vertices [ 0 ] , bd - > VertexDecl , texture , & indices [ pcmd - > IdxOffset ] , pcmd - > ElemCount , ALLEGRO_PRIM_TRIANGLE_LIST ) ;
}
# else
al_draw_prim ( & vertices [ 0 ] , bd - > VertexDecl , texture , pcmd - > IdxOffset , pcmd - > IdxOffset + pcmd - > ElemCount , ALLEGRO_PRIM_TRIANGLE_LIST ) ;
# endif
}
}
}