(* ================================================================================ == == == ATTENTION: DO NOT LOAD ALL GRAPHICS ON CREATE OR ON SHOW BECAUSE THE == == COMPONENT SDL2FRAME IS NOT YET COMPLETED == == == ================================================================================ *) unit SDL2.Frame; interface uses Winapi.Windows, System.SysUtils, System.Classes, Vcl.Dialogs, Vcl.Controls, Vcl.ExtCtrls, Vcl.Forms, SDL2.Import; type TSDL2Frame = class(TPanel) private FSDLPantalla: PSDLPantalla; FFlags: UInt32; FRenderInfo: PSDL_RendererInfo; protected procedure CreateWnd; override; procedure DestroyWnd; override; public procedure Finalize; property SDLPantalla: PSDLPantalla read FSDLPantalla; published property Flags: UInt32 read FFlags write FFlags; end; procedure Register; // ------------------------------------ implementation // ------------------------------------ // ****************************************************************************** procedure Register; begin RegisterComponents('SDL2', [TSDL2Frame]); end; // ****************************************************************************** procedure TSDL2Frame.CreateWnd; begin inherited; if SDL_WasInit(SDL_INIT_VIDEO) <> SDL_INIT_VIDEO then SDL_InitSubSystem(SDL_INIT_VIDEO); New(FSDLPantalla); FSDLPantalla.Window := SDL_CreateWindowFrom(Pointer(WindowHandle)); if FSDLPantalla.Window <> nil then begin FSDLPantalla.Renderer := SDL_CreateRenderer(FSDLPantalla.Window, -1, 0); // no forzamos ningún tipo de render (0) para que el sistema coja el que pueda Hard-Soft if FSDLPantalla.Renderer <> nil then begin New(FRenderInfo); if SDL_GetRendererInfo(FSDLPantalla.Renderer, FRenderInfo) = 0 then begin FSDLPantalla.max_texture_width := FRenderInfo.max_texture_width; FSDLPantalla.max_texture_height := FRenderInfo.max_texture_height; FSDLPantalla.hardware := ((FRenderInfo.Flags and SDL_RENDERER_ACCELERATED) > 0); FSDLPantalla.render_name := FRenderInfo.name; // PAnsiChar(FRenderInfo.name); SDL_ShowWindow(FSDLPantalla.Window); if SDL_SetRenderDrawColor(FSDLPantalla.Renderer, 0, 0, 0, SDL_ALPHA_OPAQUE) = 0 then begin if SDL_RenderFillRect(FSDLPantalla.Renderer, nil) = 0 then FFlags := SDL_GetWindowFlags(FSDLPantalla.Window) else ShowMessage('Error clearing render context'); end else ShowMessage('Error setting render draw color'); end else ShowMessage('Error getting information about rendering context'); end else ShowMessage('Error crearting SDL2 Render'); end else ShowMessage('Error creating SDL2 Window.') end; // ****************************************************************************** procedure TSDL2Frame.Finalize; begin if FSDLPantalla.Renderer <> nil then begin SDL_DestroyRenderer(FSDLPantalla.Renderer); FSDLPantalla.Renderer := nil; end; if FSDLPantalla.Window <> nil then begin SDL_DestroyWindow(FSDLPantalla.Window); FSDLPantalla.Window := nil; end; Dispose(FSDLPantalla); end; // ****************************************************************************** procedure TSDL2Frame.DestroyWnd; begin Finalize; inherited; end; end.