--  Programmed by Jedidiah Barber
--  Released into the public domain


with

    Ada.Strings.Unbounded;

private with

    Interfaces.C.Strings;


package FLTK.Images.Pixmaps is


    type Pixmap is new Image with private;

    type Pixmap_Reference (Data : not null access Pixmap'Class) is limited null record
        with Implicit_Dereference => Data;


    type Header is record
        Width, Height, Colors, Per_Pixel : Positive;
    end record;

    type Color_Kind is (Colorful, Monochrome, Greyscale, Symbolic);

    type Color_Definition is record
        Name  : Ada.Strings.Unbounded.Unbounded_String;
        Kind  : Color_Kind;
        Value : Ada.Strings.Unbounded.Unbounded_String;
    end record;

    type Color_Definition_Array is array (Positive range <>) of Color_Definition;

    type Pixmap_Data is array (Positive range <>, Positive range <>) of Character;




    package Forge is

        --  Unlike Bitmaps or RGB_Images, you do NOT have to keep this data around.
        --  A copy will be allocated and deallocated internally.

        function Create
               (Values : in Header;
                Colors : in Color_Definition_Array;
                Pixels : in Pixmap_Data)
            return Pixmap
        with Pre =>
            Colors'Length = Values.Colors and
            Pixels'Length (1) = Values.Height and
            (for all Definition of Colors =>
                Ada.Strings.Unbounded.Length (Definition.Name) = Values.Per_Pixel) and
            Pixels'Length (2) = Values.Width * Values.Per_Pixel;

    end Forge;




    --  Copying  --

    function Copy
           (This          : in Pixmap;
            Width, Height : in Natural)
        return Pixmap'Class;

    function Copy
           (This : in Pixmap)
        return Pixmap'Class;




    --  Colors  --

    procedure Color_Average
           (This   : in out Pixmap;
            Col    : in     Color;
            Amount : in     Blend);

    procedure Desaturate
           (This : in out Pixmap);




    --  Activity  --

    procedure Uncache
           (This : in out Pixmap);




    --  Drawing  --

    procedure Draw
           (This : in Pixmap;
            X, Y : in Integer);

    procedure Draw
           (This           : in Pixmap;
            X, Y, W, H     : in Integer;
            Clip_X, Clip_Y : in Integer := 0);


private


    type Pixmap is new Image with record
        Loose_Ptr : access Interfaces.C.Strings.chars_ptr_array;
    end record;

    overriding procedure Finalize
           (This : in out Pixmap);


    pragma Inline (Color_Average);
    pragma Inline (Desaturate);

    pragma Inline (Uncache);

    pragma Inline (Copy);
    pragma Inline (Draw);


end FLTK.Images.Pixmaps;