1. with Allegro.Bitmaps;                   use Allegro.Bitmaps; 
  2. with Objects;                           use Objects; 
  3. with Processes;                         use Processes; 
  4. with Widgets.Containers.Windows;        use Widgets.Containers.Windows; 
  5.  
  6. private with Ada.Real_Time; 
  7.  
  8. package Renderers is 
  9.  
  10.     type Renderer is new Object and Process with private; 
  11.     type A_Renderer is access all Renderer'Class; 
  12.  
  13.     -- Create a Renderer object that draws 'win' to the screen at a maximum 
  14.     -- frequency of 'fps'. 
  15.     function Create_Renderer( win : not null A_Window; 
  16.                               fps : Positive ) return A_Renderer; 
  17.     pragma Postcondition( Create_Renderer'Result /= null ); 
  18.  
  19.     -- Copies the renderer. Its window widget is not copied, just re-referenced. 
  20.     function Copy( src : A_Renderer ) return A_Renderer; 
  21.     pragma Postcondition( Copy'Result /= src or else src = null ); 
  22.  
  23.     -- Deletes the renderer. 
  24.     procedure Delete( this : in out A_Renderer ); 
  25.     pragma Postcondition( this = null ); 
  26.  
  27.     -- Instructs renderers to draw a software mouse. 
  28.     procedure Use_Software_Mouse; 
  29.  
  30. private 
  31.  
  32.     use Ada.Real_Time; 
  33.  
  34.     -- Set by calling Use_Software_Mouse. The application should set this during 
  35.     -- allegro initialization if it determines the mouse must be drawn in 
  36.     -- software mode. Ideally this flag should be part of the drawing API. 
  37.     using_sw_mouse : Boolean := False; 
  38.  
  39.     type Page_Index is mod 2; 
  40.     type Page_Array is array(Page_Index) of A_Bitmap; 
  41.  
  42.     ---------------------------------------------------------------------------- 
  43.  
  44.     type Renderer is new Object and Process with 
  45.         record 
  46.             win        : A_Window := null; 
  47.             videoPages : Page_Array; 
  48.             drawPage   : Page_Index := Page_Array'Last; 
  49.             frameDelta : Time_Span := Time_Span_Zero; 
  50.             lastFrame  : Time := Time_First; 
  51.         end record; 
  52.  
  53.     procedure Adjust( this : access Renderer ); 
  54.  
  55.     procedure Construct( this : access Renderer; 
  56.                          win  : A_Window; 
  57.                          fps  : Positive ); 
  58.  
  59.     procedure Delete( this : in out Renderer ); 
  60.  
  61.     -- Draws a new frame to vpage. 
  62.     procedure Draw_Frame( this  : access Renderer; 
  63.                           vpage : A_Bitmap; 
  64.                           dt    : Time_Span ); 
  65.  
  66.     function Get_Process_Name( this : access Renderer ) return String; 
  67.  
  68.     procedure Tick( this : access Renderer; upTime, dt : Time_Span ); 
  69.  
  70. end Renderers;