
-- ----------------------------------------------------------------- --
--                                                                   --
-- This is free software; you can redistribute it and/or             --
-- modify it under the terms of the GNU General Public               --
-- License as published by the Free Software Foundation; either      --
-- version 2 of the License, or (at your option) any later version.  --
--                                                                   --
-- This software is distributed in the hope that it will be useful,  --
-- but WITHOUT ANY WARRANTY; without even the implied warranty of    --
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU --
-- General Public License for more details.                          --
--                                                                   --
-- You should have received a copy of the GNU General Public         --
-- License along with this library; if not, write to the             --
-- Free Software Foundation, Inc., 59 Temple Place - Suite 330,      --
-- Boston, MA 02111-1307, USA.                                       --
--                                                                   --
-- ----------------------------------------------------------------- --

-- ----------------------------------------------------------------- --
-- This is a translation, to the Ada programming language, of the    --
-- original C test files written by Sam Lantinga - www.libsdl.org    --
-- translation made by Antonio F. Vargas - www.adapower.net/~avargas --
-- ----------------------------------------------------------------- --

with GNAT.OS_Lib;
with SDL.Types; use SDL.Types;
with SDL.Error; use SDL.Error;
with SDL_Framebuffer;
with Ada.Text_IO; use Ada.Text_IO;

package body  TestPalette_Sprogs is

   package It renames Interfaces;
   package Er  renames SDL.Error;

   use type C.int;
   use type Vd.Surface_ptr;

   package Fb renames SDL_Framebuffer;
   
   use Random_Integer;


   --  ======================================
   procedure sdlerr (when_err : String) is
   begin
      Put_Line ("SDL error: " & when_err & " : " & Er.Get_Error);
      GNAT.OS_Lib.OS_Exit (1);
   end sdlerr;

   --  ======================================
      
   --  create a background surface
   function make_bg (screen : Vd.Surface_ptr; startcol : C.int)
      return Vd.Surface_ptr
   is
      bg : Vd.Surface_ptr := Vd.CreateRGBSurface (
              Vd.SWSURFACE, screen.w, screen.h,
              8, 0, 0, 0, 0);
   begin
      if bg = null then
         sdlerr ("creating background surface");
      end if;

      --  set the palette to the logical screen palette so that blits
      --  won't be translated
      Vd.SetColors (bg, screen.format.palette.colors, 0, 256);

      --  Make a wavy background pattern using colours 0-63
      if Vd.LockSurface (bg) < 0 then
         sdlerr ("locking background");
      end if;
      for i in Natural range 0 .. Natural (SCRH - 1) loop
         declare
            p    : Fb.Framebuffer_8bPointer;
            d : C.int;
         begin
            p := Fb.Goto_Line_Unchecked (bg, i);
            d := 0;
            for j in Natural range 0 .. Natural (SCRW - 1) loop
               declare
                  v : C.int := C.int'Max (d, -2);
                  use Interfaces;
               begin
                  v := C.int'Min (v, 2);
                  if i > 0 then -- ?
                     v := v
                          + C.int (Fb.Prev_Line_Unchecked (bg, p).all)
                          + 65
                          - startcol;
                  end if;
                  Fb.Go_Right_Unchecked (p, j).all := Uint8 (
                     startcol + C.int (
                        (Unsigned_32 (v) and Unsigned_32 (63))));
                  d := d
                       + C.int (
                           It.Shift_Right (
                              It.Unsigned_32 (Random (Integer_Generator)),
                              3)
                           mod 3)
                       - 1;
               end;
            end loop;
         end;
      end loop;
      Vd.UnlockSurface (bg);
      return bg;
   end make_bg;

   --  ======================================
   --  Return a surface flipped horisontally. Only works for 8bpp;
   --  extensions to arbitrary bitness is left as an exercise for
   --  reader.
   function hflip (s : Vd.Surface_ptr) return Vd.Surface_ptr
   is
      z : Vd.Surface_ptr := Vd.CreateRGBSurface (Vd.SWSURFACE,
                                               s.w, s.h, 8,
                                               0, 0, 0, 0);
   begin
      --  copy palette
      Vd.SetColors (z, s.format.palette.colors,
                                0, s.format.palette.ncolors);
      if (Vd.LockSurface (s) < 0) or (Vd.LockSurface (z) < 0) then
         sdlerr ("locking flip images");
      end if;
      for i in Natural range  0 .. Natural (s.h - 1) loop
         declare
            from : Fb.Framebuffer_8bPointer := Fb.Goto_Line_Unchecked (s, i);
            to   : Fb.Framebuffer_8bPointer := Fb.Goto_Line_End_Unchecked (z, i);
         begin
            for j in Natural range 0 .. Natural (s.w - 1) loop
               Fb.Go_Left_Unchecked (to, j).all := Fb.Go_Right_Unchecked (from,j).all;
            end loop;
            Vd.UnlockSurface (z);
            Vd.UnlockSurface (s);
         end;
      end loop;
      return z;
   end hflip;
   --  ======================================

end TestPalette_Sprogs;

