You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
432 lines
20 KiB
432 lines
20 KiB
------------------------------------------------------------------------------
|
|
-- --
|
|
-- Copyright (C) 2015-2016, AdaCore --
|
|
-- --
|
|
-- Redistribution and use in source and binary forms, with or without --
|
|
-- modification, are permitted provided that the following conditions are --
|
|
-- met: --
|
|
-- 1. Redistributions of source code must retain the above copyright --
|
|
-- notice, this list of conditions and the following disclaimer. --
|
|
-- 2. Redistributions in binary form must reproduce the above copyright --
|
|
-- notice, this list of conditions and the following disclaimer in --
|
|
-- the documentation and/or other materials provided with the --
|
|
-- distribution. --
|
|
-- 3. Neither the name of the copyright holder nor the names of its --
|
|
-- contributors may be used to endorse or promote products derived --
|
|
-- from this software without specific prior written permission. --
|
|
-- --
|
|
-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS --
|
|
-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT --
|
|
-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR --
|
|
-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT --
|
|
-- HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, --
|
|
-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT --
|
|
-- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, --
|
|
-- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY --
|
|
-- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT --
|
|
-- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE --
|
|
-- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. --
|
|
-- --
|
|
------------------------------------------------------------------------------
|
|
|
|
with System;
|
|
|
|
package HAL.Bitmap is
|
|
|
|
type Orientation_Mode is
|
|
(Default,
|
|
Portrait,
|
|
Landscape);
|
|
|
|
subtype Actual_Orientation is Orientation_Mode range Portrait .. Landscape;
|
|
|
|
type Bitmap_Color_Mode is
|
|
(ARGB_8888,
|
|
RGB_888,
|
|
RGB_565,
|
|
ARGB_1555,
|
|
ARGB_4444,
|
|
L_8,
|
|
AL_44,
|
|
AL_88,
|
|
L_4,
|
|
A_8,
|
|
A_4,
|
|
M_1 -- Monochrome
|
|
) with Size => 4;
|
|
|
|
function Bits_Per_Pixel (Mode : Bitmap_Color_Mode) return Positive is
|
|
(case Mode is
|
|
when ARGB_8888 => 32,
|
|
when RGB_888 => 24,
|
|
when RGB_565 | ARGB_1555 | ARGB_4444 | AL_88 => 16,
|
|
when L_8 | AL_44 | A_8 => 8,
|
|
when L_4 | A_4 => 4,
|
|
when M_1 => 1);
|
|
|
|
type Point is record
|
|
X : Natural;
|
|
Y : Natural;
|
|
end record;
|
|
|
|
type Point_Array is array (Natural range <>) of Point;
|
|
|
|
function "+" (P1, P2 : Point) return Point
|
|
is ((P1.X + P2.X, P1.Y + P2.Y));
|
|
|
|
function "-" (P1, P2 : Point) return Point
|
|
is ((P1.X - P2.X, P1.Y - P2.Y));
|
|
|
|
type Rect is record
|
|
Position : Point;
|
|
Width : Natural;
|
|
Height : Natural;
|
|
end record;
|
|
|
|
type Bitmap_Color is record
|
|
Alpha : UInt8;
|
|
Red : UInt8;
|
|
Green : UInt8;
|
|
Blue : UInt8;
|
|
end record with Size => 32;
|
|
|
|
for Bitmap_Color use record
|
|
Blue at 0 range 0 .. 7;
|
|
Green at 1 range 0 .. 7;
|
|
Red at 2 range 0 .. 7;
|
|
Alpha at 3 range 0 .. 7;
|
|
end record;
|
|
|
|
type Bitmap_Buffer is interface;
|
|
|
|
type Any_Bitmap_Buffer is access all Bitmap_Buffer'Class;
|
|
|
|
function Width (Buffer : Bitmap_Buffer) return Natural is abstract;
|
|
-- Width of the buffer. Note that it's the user-visible width
|
|
-- (see below for the meaning of the Swapped value).
|
|
|
|
function Height (Buffer : Bitmap_Buffer) return Natural is abstract;
|
|
-- Height of the buffer. Note that it's the user-visible height
|
|
-- (see below for the meaning of the Swapped value).
|
|
|
|
function Swapped (Buffer : Bitmap_Buffer) return Boolean is abstract;
|
|
-- If Swapped return True, operations on this buffer will consider:
|
|
-- Width0 = Height
|
|
-- Height0 = Width
|
|
-- Y0 = Buffer.Width - X - 1
|
|
-- X0 = Y
|
|
--
|
|
-- As an example, the Bitmap buffer that corresponds to a 240x320
|
|
-- swapped display (to display images in landscape mode) with have
|
|
-- the following values:
|
|
-- Width => 320
|
|
-- Height => 240
|
|
-- Swapped => True
|
|
-- So Put_Pixel (Buffer, 30, 10, Color) will place the pixel at
|
|
-- Y0 = 320 - 30 - 1 = 289
|
|
-- X0 = 10
|
|
|
|
function Color_Mode (Buffer : Bitmap_Buffer) return Bitmap_Color_Mode is abstract;
|
|
-- The buffer color mode. Note that not all color modes are supported by
|
|
-- the hardware acceleration (if any), so you need to check your actual
|
|
-- hardware to optimize buffer transfers.
|
|
|
|
function Mapped_In_RAM (Buffer : Bitmap_Buffer) return Boolean is abstract;
|
|
-- Return True is the bitmap is storred in the CPU address space
|
|
|
|
function Memory_Address (Buffer : Bitmap_Buffer) return System.Address is abstract
|
|
with Pre'Class => Buffer.Mapped_In_RAM;
|
|
-- Return the address of the bitmap in the CPU address space. If the bitmap
|
|
-- is not in the CPU address space, the result is undefined.
|
|
|
|
procedure Set_Source (Buffer : in out Bitmap_Buffer;
|
|
ARGB : Bitmap_Color) is abstract;
|
|
-- Set the source color for the following drawing operations
|
|
|
|
procedure Set_Source (Buffer : in out Bitmap_Buffer;
|
|
Native : UInt32) is abstract;
|
|
-- Set the source color for the following drawing operations
|
|
|
|
function Source
|
|
(Buffer : Bitmap_Buffer)
|
|
return Bitmap_Color is abstract;
|
|
-- Current source color in ARGB format
|
|
|
|
function Source
|
|
(Buffer : Bitmap_Buffer)
|
|
return UInt32 is abstract;
|
|
-- Current source color in native format
|
|
|
|
procedure Set_Pixel
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Pt : Point) is abstract;
|
|
-- Set pixel with current source color
|
|
|
|
procedure Set_Pixel
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Pt : Point;
|
|
Color : Bitmap_Color) is abstract;
|
|
-- Set pixel with Color and update source color
|
|
|
|
procedure Set_Pixel
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Pt : Point;
|
|
Native : UInt32) is abstract;
|
|
-- Set pixel with low level native pixel value Color and update source color
|
|
|
|
procedure Set_Pixel_Blend
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Pt : Point) is abstract;
|
|
|
|
function Pixel
|
|
(Buffer : Bitmap_Buffer;
|
|
Pt : Point)
|
|
return Bitmap_Color is abstract;
|
|
-- Return ARGB pixel value
|
|
|
|
function Pixel
|
|
(Buffer : Bitmap_Buffer;
|
|
Pt : Point)
|
|
return UInt32 is abstract;
|
|
-- Return raw pixel value
|
|
|
|
procedure Draw_Line
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Start, Stop : Point;
|
|
Thickness : Natural := 1;
|
|
Fast : Boolean := True) is abstract;
|
|
-- If fast is set, then the line thickness uses squares to draw, while
|
|
-- if not set, then the line will be composed of circles, much slower to
|
|
-- draw but providing nicer line cap.
|
|
|
|
procedure Fill
|
|
(Buffer : in out Bitmap_Buffer) is abstract;
|
|
-- Fill the entire buffer with the source color
|
|
|
|
procedure Fill_Rect
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Area : Rect) is abstract;
|
|
-- Fill the specified area of the buffer with the source color
|
|
|
|
procedure Copy_Rect
|
|
(Src_Buffer : Bitmap_Buffer'Class;
|
|
Src_Pt : Point;
|
|
Dst_Buffer : in out Bitmap_Buffer;
|
|
Dst_Pt : Point;
|
|
Bg_Buffer : Bitmap_Buffer'Class;
|
|
Bg_Pt : Point;
|
|
Width : Natural;
|
|
Height : Natural;
|
|
Synchronous : Boolean) is abstract;
|
|
|
|
procedure Copy_Rect
|
|
(Src_Buffer : Bitmap_Buffer'Class;
|
|
Src_Pt : Point;
|
|
Dst_Buffer : in out Bitmap_Buffer;
|
|
Dst_Pt : Point;
|
|
Width : Natural;
|
|
Height : Natural;
|
|
Synchronous : Boolean) is abstract;
|
|
|
|
procedure Copy_Rect_Blend
|
|
(Src_Buffer : Bitmap_Buffer;
|
|
Src_Pt : Point;
|
|
Dst_Buffer : in out Bitmap_Buffer'Class;
|
|
Dst_Pt : Point;
|
|
Width : Natural;
|
|
Height : Natural;
|
|
Synchronous : Boolean) is abstract;
|
|
|
|
procedure Draw_Vertical_Line
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Pt : Point;
|
|
Height : Integer) is abstract;
|
|
|
|
procedure Draw_Horizontal_Line
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Pt : Point;
|
|
Width : Integer) is abstract;
|
|
|
|
procedure Draw_Rect
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Area : Rect;
|
|
Thickness : Natural := 1) is abstract;
|
|
-- Draws a rectangle
|
|
|
|
procedure Draw_Rounded_Rect
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Area : Rect;
|
|
Radius : Natural;
|
|
Thickness : Natural := 1) is abstract;
|
|
|
|
procedure Fill_Rounded_Rect
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Area : Rect;
|
|
Radius : Natural) is abstract;
|
|
|
|
procedure Draw_Circle
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Center : Point;
|
|
Radius : Natural) is abstract;
|
|
|
|
procedure Fill_Circle
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Center : Point;
|
|
Radius : Natural) is abstract;
|
|
|
|
procedure Cubic_Bezier
|
|
(Buffer : in out Bitmap_Buffer;
|
|
P1, P2, P3, P4 : Point;
|
|
N : Positive := 20;
|
|
Thickness : Natural := 1) is abstract;
|
|
|
|
procedure Bezier
|
|
(Buffer : in out Bitmap_Buffer;
|
|
Input_Points : Point_Array;
|
|
N : Positive := 20;
|
|
Thickness : Natural := 1) is abstract;
|
|
|
|
function Buffer_Size (Buffer : Bitmap_Buffer) return Natural is abstract;
|
|
|
|
Transparent : constant Bitmap_Color := (000, 000, 000, 000);
|
|
Dark_Red : constant Bitmap_Color := (255, 139, 000, 000);
|
|
Brown : constant Bitmap_Color := (255, 165, 042, 042);
|
|
Firebrick : constant Bitmap_Color := (255, 178, 034, 034);
|
|
Crimson : constant Bitmap_Color := (255, 220, 020, 060);
|
|
Red : constant Bitmap_Color := (255, 255, 000, 000);
|
|
Tomato : constant Bitmap_Color := (255, 255, 099, 071);
|
|
Coral : constant Bitmap_Color := (255, 255, 127, 080);
|
|
Indian_Red : constant Bitmap_Color := (255, 205, 092, 092);
|
|
Light_Coral : constant Bitmap_Color := (255, 240, 128, 128);
|
|
Dark_Salmon : constant Bitmap_Color := (255, 233, 150, 122);
|
|
Salmon : constant Bitmap_Color := (255, 250, 128, 114);
|
|
Light_Salmon : constant Bitmap_Color := (255, 255, 160, 122);
|
|
Dark_Orange : constant Bitmap_Color := (255, 255, 140, 000);
|
|
Orange : constant Bitmap_Color := (255, 255, 165, 000);
|
|
Light_Orange : constant Bitmap_Color := (255, 255, 069, 000);
|
|
Gold : constant Bitmap_Color := (255, 255, 215, 000);
|
|
Dark_Golden_Rod : constant Bitmap_Color := (255, 184, 134, 011);
|
|
Golden_Rod : constant Bitmap_Color := (255, 218, 165, 032);
|
|
Pale_Golden_Rod : constant Bitmap_Color := (255, 238, 232, 170);
|
|
Dark_Khaki : constant Bitmap_Color := (255, 189, 183, 107);
|
|
Khaki : constant Bitmap_Color := (255, 240, 230, 140);
|
|
Olive : constant Bitmap_Color := (255, 128, 128, 000);
|
|
Yellow : constant Bitmap_Color := (255, 255, 255, 000);
|
|
Yellow_Green : constant Bitmap_Color := (255, 154, 205, 050);
|
|
Dark_Olive_Green : constant Bitmap_Color := (255, 085, 107, 047);
|
|
Olive_Drab : constant Bitmap_Color := (255, 107, 142, 035);
|
|
Lawn_Green : constant Bitmap_Color := (255, 124, 252, 000);
|
|
Chart_Reuse : constant Bitmap_Color := (255, 127, 255, 000);
|
|
Green_Yellow : constant Bitmap_Color := (255, 173, 255, 047);
|
|
Dark_Green : constant Bitmap_Color := (255, 000, 100, 000);
|
|
Green : constant Bitmap_Color := (255, 000, 255, 000);
|
|
Maroon : constant Bitmap_Color := (255, 128, 000, 000);
|
|
Forest_Green : constant Bitmap_Color := (255, 034, 139, 034);
|
|
Lime : constant Bitmap_Color := (255, 000, 255, 000);
|
|
Lime_Green : constant Bitmap_Color := (255, 050, 205, 050);
|
|
Light_Green : constant Bitmap_Color := (255, 144, 238, 144);
|
|
Pale_Green : constant Bitmap_Color := (255, 152, 251, 152);
|
|
Dark_Sea_Green : constant Bitmap_Color := (255, 143, 188, 143);
|
|
Medium_Spring_Green : constant Bitmap_Color := (255, 000, 250, 154);
|
|
Spring_Green : constant Bitmap_Color := (255, 000, 255, 127);
|
|
Sea_Green : constant Bitmap_Color := (255, 046, 139, 087);
|
|
Medium_Aqua_Marine : constant Bitmap_Color := (255, 102, 205, 170);
|
|
Medium_Sea_Green : constant Bitmap_Color := (255, 060, 179, 113);
|
|
Light_Sea_Green : constant Bitmap_Color := (255, 032, 178, 170);
|
|
Dark_Slate_Gray : constant Bitmap_Color := (255, 047, 079, 079);
|
|
Teal : constant Bitmap_Color := (255, 000, 128, 128);
|
|
Dark_Cyan : constant Bitmap_Color := (255, 000, 139, 139);
|
|
Aqua : constant Bitmap_Color := (255, 000, 255, 255);
|
|
Cyan : constant Bitmap_Color := (255, 000, 255, 255);
|
|
Light_Cyan : constant Bitmap_Color := (255, 224, 255, 255);
|
|
Dark_Turquoise : constant Bitmap_Color := (255, 000, 206, 209);
|
|
Turquoise : constant Bitmap_Color := (255, 064, 224, 208);
|
|
Medium_Turquoise : constant Bitmap_Color := (255, 072, 209, 204);
|
|
Pale_Turquoise : constant Bitmap_Color := (255, 175, 238, 238);
|
|
Aqua_Marine : constant Bitmap_Color := (255, 127, 255, 212);
|
|
Powder_Blue : constant Bitmap_Color := (255, 176, 224, 230);
|
|
Cadet_Blue : constant Bitmap_Color := (255, 095, 158, 160);
|
|
Steel_Blue : constant Bitmap_Color := (255, 070, 130, 180);
|
|
Corn_Flower_Blue : constant Bitmap_Color := (255, 100, 149, 237);
|
|
Deep_Sky_Blue : constant Bitmap_Color := (255, 000, 191, 255);
|
|
Dodger_Blue : constant Bitmap_Color := (255, 030, 144, 255);
|
|
Light_Blue : constant Bitmap_Color := (255, 173, 216, 230);
|
|
Sky_Blue : constant Bitmap_Color := (255, 135, 206, 235);
|
|
Light_Sky_Blue : constant Bitmap_Color := (255, 135, 206, 250);
|
|
Midnight_Blue : constant Bitmap_Color := (255, 025, 025, 112);
|
|
Navy : constant Bitmap_Color := (255, 000, 000, 128);
|
|
Dark_Blue : constant Bitmap_Color := (255, 000, 000, 139);
|
|
Medium_Blue : constant Bitmap_Color := (255, 000, 000, 205);
|
|
Blue : constant Bitmap_Color := (255, 000, 000, 255);
|
|
Royal_Blue : constant Bitmap_Color := (255, 065, 105, 225);
|
|
Blue_Violet : constant Bitmap_Color := (255, 138, 043, 226);
|
|
Indigo : constant Bitmap_Color := (255, 075, 000, 130);
|
|
Dark_Slate_Blue : constant Bitmap_Color := (255, 072, 061, 139);
|
|
Slate_Blue : constant Bitmap_Color := (255, 106, 090, 205);
|
|
Medium_Slate_Blue : constant Bitmap_Color := (255, 123, 104, 238);
|
|
Medium_Purple : constant Bitmap_Color := (255, 147, 112, 219);
|
|
Dark_Magenta : constant Bitmap_Color := (255, 139, 000, 139);
|
|
Dark_Violet : constant Bitmap_Color := (255, 148, 000, 211);
|
|
Dark_Orchid : constant Bitmap_Color := (255, 153, 050, 204);
|
|
Medium_Orchid : constant Bitmap_Color := (255, 186, 085, 211);
|
|
Purple : constant Bitmap_Color := (255, 128, 000, 128);
|
|
Thistle : constant Bitmap_Color := (255, 216, 191, 216);
|
|
Plum : constant Bitmap_Color := (255, 221, 160, 221);
|
|
Violet : constant Bitmap_Color := (255, 238, 130, 238);
|
|
Magenta : constant Bitmap_Color := (255, 255, 000, 255);
|
|
Orchid : constant Bitmap_Color := (255, 218, 112, 214);
|
|
Medium_Violet_Red : constant Bitmap_Color := (255, 199, 021, 133);
|
|
Pale_Violet_Red : constant Bitmap_Color := (255, 219, 112, 147);
|
|
Deep_Pink : constant Bitmap_Color := (255, 255, 020, 147);
|
|
Hot_Pink : constant Bitmap_Color := (255, 255, 105, 180);
|
|
Light_Pink : constant Bitmap_Color := (255, 255, 182, 193);
|
|
Pink : constant Bitmap_Color := (255, 255, 192, 203);
|
|
Antique_White : constant Bitmap_Color := (255, 250, 235, 215);
|
|
Beige : constant Bitmap_Color := (255, 245, 245, 220);
|
|
Bisque : constant Bitmap_Color := (255, 255, 228, 196);
|
|
Blanched_Almond : constant Bitmap_Color := (255, 255, 235, 205);
|
|
Wheat : constant Bitmap_Color := (255, 245, 222, 179);
|
|
Corn_Silk : constant Bitmap_Color := (255, 255, 248, 220);
|
|
Lemon_Chiffon : constant Bitmap_Color := (255, 255, 250, 205);
|
|
Light_Yellow : constant Bitmap_Color := (255, 255, 255, 224);
|
|
Saddle_Brown : constant Bitmap_Color := (255, 139, 069, 019);
|
|
Sienna : constant Bitmap_Color := (255, 160, 082, 045);
|
|
Chocolate : constant Bitmap_Color := (255, 210, 105, 030);
|
|
Peru : constant Bitmap_Color := (255, 205, 133, 063);
|
|
Sandy_Brown : constant Bitmap_Color := (255, 244, 164, 096);
|
|
Burly_Wood : constant Bitmap_Color := (255, 222, 184, 135);
|
|
Tan : constant Bitmap_Color := (255, 210, 180, 140);
|
|
Rosy_Brown : constant Bitmap_Color := (255, 188, 143, 143);
|
|
Moccasin : constant Bitmap_Color := (255, 255, 228, 181);
|
|
Navajo_White : constant Bitmap_Color := (255, 255, 222, 173);
|
|
Peach_Puff : constant Bitmap_Color := (255, 255, 218, 185);
|
|
Misty_Rose : constant Bitmap_Color := (255, 255, 228, 225);
|
|
Lavender_Blush : constant Bitmap_Color := (255, 255, 240, 245);
|
|
Linen : constant Bitmap_Color := (255, 250, 240, 230);
|
|
Old_Lace : constant Bitmap_Color := (255, 253, 245, 230);
|
|
Papaya_Whip : constant Bitmap_Color := (255, 255, 239, 213);
|
|
Sea_Shell : constant Bitmap_Color := (255, 255, 245, 238);
|
|
Mint_Cream : constant Bitmap_Color := (255, 245, 255, 250);
|
|
Slate_Gray : constant Bitmap_Color := (255, 112, 128, 144);
|
|
Light_Slate_Gray : constant Bitmap_Color := (255, 119, 136, 153);
|
|
Light_Steel_Blue : constant Bitmap_Color := (255, 176, 196, 222);
|
|
Lavender : constant Bitmap_Color := (255, 230, 230, 250);
|
|
Floral_White : constant Bitmap_Color := (255, 255, 250, 240);
|
|
Alice_Blue : constant Bitmap_Color := (255, 240, 248, 255);
|
|
Ghost_White : constant Bitmap_Color := (255, 248, 248, 255);
|
|
Honeydew : constant Bitmap_Color := (255, 240, 255, 240);
|
|
Ivory : constant Bitmap_Color := (255, 255, 255, 240);
|
|
Azure : constant Bitmap_Color := (255, 240, 255, 255);
|
|
Snow : constant Bitmap_Color := (255, 255, 250, 250);
|
|
Black : constant Bitmap_Color := (255, 000, 000, 000);
|
|
Dim_Grey : constant Bitmap_Color := (255, 105, 105, 105);
|
|
Grey : constant Bitmap_Color := (255, 128, 128, 128);
|
|
Gray : constant Bitmap_Color := (255, 190, 190, 190);
|
|
Dark_Grey : constant Bitmap_Color := (255, 169, 169, 169);
|
|
Silver : constant Bitmap_Color := (255, 192, 192, 192);
|
|
Light_Grey : constant Bitmap_Color := (255, 211, 211, 211);
|
|
Gainsboro : constant Bitmap_Color := (255, 220, 220, 220);
|
|
White_Smoke : constant Bitmap_Color := (255, 245, 245, 245);
|
|
White : constant Bitmap_Color := (255, 255, 255, 255);
|
|
|
|
end HAL.Bitmap;
|
|
|