-----------------------------------------------------------------------
-- GtkAda - Ada95 binding for Gtk+/Gnome --
-- --
-- Copyright (C) 2010, AdaCore --
-- --
-- This library 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 library 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. --
-- --
-- --
-- --
-- --
-- --
-- --
-- --
-----------------------------------------------------------------------
--
-- Image surfaces provide the ability to render to memory buffers either
-- allocated by Cairo or by the calling code. The supported image formats are
-- those defined in Cairo_Format.
--
--
-- 1.8.8
-- Cairo
package Cairo.Image_Surface is
-- Cairo_Format is used to identify the memory format of
-- image data.
--
-- New entries may be added in future versions.
type Cairo_Format is
(Cairo_Format_ARGB32,
-- Each pixel is a 32-bit quantity, with
-- alpha in the upper 8 bits, then red, then green, then blue.
-- The 32-bit quantities are stored native-endian. Pre-multiplied
-- alpha is used. (That is, 50 transparent red is 0x80800000,
-- not 0x80ff0000.)
Cairo_Format_RGB24,
-- Each pixel is a 32-bit quantity, with
-- the upper 8 bits unused. Red, Green, and Blue are stored
-- in the remaining 24 bits in that order.
Cairo_Format_A8,
-- Each pixel is a 8-bit quantity holding an alpha value.
Cairo_Format_A1,
-- Each pixel is a 1-bit quantity holding
-- an alpha value. Pixels are packed together into 32-bit
-- quantities. The ordering of the bits matches the
-- endianess of the platform. On a big-endian machine, the
-- first pixel is in the uppermost bit, on a little-endian
-- machine the first pixel is in the least-significant bit.
CAIRO_FORMAT_RGB16_565_Deprecated_Do_Not_Use
-- This value is deprecated
);
pragma Convention (C, Cairo_Format);
type Byte is range 0 .. 255;
type ARGB32_Data is record
Alpha : Byte;
Red : Byte;
Green : Byte;
Blue : Byte;
end record;
-- One pixel in ARGB32 format
type RGB24_Data is record
Red : Byte;
Green : Byte;
Blue : Byte;
end record;
-- One pixel in RGB24 format
type ARGB32_Array is array (Natural range <>) of ARGB32_Data;
type ARGB32_Array_Access is access ARGB32_Array;
type RGB24_Array is array (Natural range <>) of RGB24_Data;
type RGB24_Array_Access is access RGB24_Array;
type Byte_Array is array (Natural range <>) of Byte;
type Byte_Array_Access is access Byte_Array;
function Create
(Format : Cairo_Format;
Width : Gint;
Height : Gint)
return Cairo_Surface;
-- Format: Format of pixels in the surface to create
-- Width: Width of the surface, in pixels
-- Height: Height of the surface, in pixels
--
-- Creates an image surface of the specified format and
-- dimensions. Initially the surface contents are all
-- 0. (Specifically, within each pixel, each color or alpha channel
-- belonging to format will be 0. The contents of bits within a pixel,
-- but not belonging to the given format are undefined).
--
-- Return value: a pointer to the newly created surface. The caller
-- owns the surface and should call Cairo.Surface.Destroy when done
-- with it.
--
-- This function always returns a valid pointer, but it will return a
-- pointer to a "nil" surface if an error such as out of memory
-- occurs. You can use Cairo.Surface.Status to check for this.
function Cairo_Format_Stride_For_Width
(Format : Cairo_Format;
Width : Gint)
return Gint;
-- Format: A Cairo_Format value
-- Width: The desired Width of an image surface to be created.
--
-- This function provides a stride value that will respect all
-- alignment requirements of the accelerated image-rendering code
-- within cairo.
--
-- Return value: the appropriate stride to use given the desired
-- format and width, or -1 if either the format is invalid or the width
-- too large.
--
-- Since: 1.6
function Create_For_Data_Generic
(Data : System.Address;
Format : Cairo_Format;
Width : Gint;
Height : Gint;
Stride : Gint)
return Cairo_Surface;
-- Data: a pointer to a buffer supplied by the application in which
-- to write contents. This pointer must be suitably aligned for any
-- kind of variable, (for example, a pointer returned by malloc).
-- Format: the Format of pixels in the buffer
-- Width: the Width of the image to be stored in the buffer
-- Height: the Height of the image to be stored in the buffer
-- Stride: the number of bytes between the start of rows in the
-- buffer as allocated. This value should always be computed by
-- Cairo_Format_Stride_For_Width before allocating the data
-- buffer.
--
-- This function is a low-level binding to the C function: see also
-- Create_For_Data_[ARGB32|RGB24|A8|A1]
--
-- Creates an image surface for the provided pixel data. The output
-- buffer must be kept around until the Cairo_Surface is destroyed
-- or Cairo.Surface.Finish is called on the surface. The initial
-- contents of data will be used as the initial image contents; you
-- must explicitly clear the buffer, using, for example,
-- Cairo.Rectangle and Cairo.Fill if you want it cleared.
--
-- Note that the stride may be larger than Width*bytes_per_pixel to provide
-- proper alignment for each pixel and row. This alignment is required to
-- allow high-performance rendering within cairo. The correct way to obtain
-- a legal stride value is to call Cairo_Format_Stride_For_Width with the
-- desired format and maximum image width value, and the use the resulting
-- stride value to allocate the data and to create the image surface. See
-- Cairo_Format_Stride_For_Width for example code.
--
-- Return value: a pointer to the newly created surface. The caller
-- owns the surface and should call Cairo.Surface.Destroy when done
-- with it.
--
-- This function always returns a valid pointer, but it will return a
-- pointer to a "nil" surface in the case of an error such as out of
-- memory or an invalid stride value. In case of invalid stride value
-- the error status of the returned surface will be
-- Cairo_Status_Invalid_Stride. You can use
-- Cairo.Surface.Status to check for this.
--
-- See Cairo.Surface.Set_User_Data for a means of attaching a
-- destroy-notification fallback to the surface if necessary.
function Create_For_Data_ARGB32
(Data : ARGB32_Array_Access;
Width : Gint;
Height : Gint)
return Cairo_Surface;
-- Same as above, working on ARGB32 format.
function Create_For_Data_RGB24
(Data : RGB24_Array_Access;
Width : Gint;
Height : Gint)
return Cairo_Surface;
-- Same as above, working on RGB24 format.
function Create_For_Data_A8
(Data : Byte_Array_Access;
Width : Gint;
Height : Gint)
return Cairo_Surface;
-- Same as above, working on A8 format.
function Get_Data_Generic (Surface : Cairo_Surface) return System.Address;
-- Surface: a Cairo_Image_Surface
--
-- Get a pointer to the data of the image surface, for direct
-- inspection or modification.
--
-- Return value: a pointer to the image data of this surface or
-- System.Null_Address if surface is not an image surface, or if
-- Cairo.Surface.Finish has been called.
--
-- Since: 1.2
function Get_Format (Surface : Cairo_Surface) return Cairo_Format;
-- Surface: a Cairo_Image_Surface
--
-- Get the format of the surface.
--
-- Return value: the format of the surface
--
-- Since: 1.2
function Get_Width (Surface : Cairo_Surface) return Gint;
-- Surface: a Cairo_Image_Surface
--
-- Get the width of the image surface in pixels.
--
-- Return value: the width of the surface in pixels.
function Get_Height (Surface : Cairo_Surface) return Gint;
-- Surface: a Cairo_Image_Surface
--
-- Get the height of the image surface in pixels.
--
-- Return value: the height of the surface in pixels.
function Get_Stride (Surface : Cairo_Surface) return Gint;
-- Surface: a Cairo_Image_Surface
--
-- Get the stride of the image surface in bytes
--
-- Return value: the stride of the image surface in bytes (or 0 if
-- surface is not an image surface). The stride is the distance in
-- bytes from the beginning of one row of the image data to the
-- beginning of the next row.
--
-- Since: 1.2
private
for Byte'Size use 8;
-- Representation working with all endiannesses
BOP : constant := System.Bit_Order'Pos (System.Default_Bit_Order);
NBOP : constant := 1 - BOP;
for ARGB32_Data use record
Alpha at BOP * 3 + NBOP * 0 range 0 .. 7;
Red at BOP * 2 + NBOP * 1 range 0 .. 7;
Green at BOP * 1 + NBOP * 2 range 0 .. 7;
Blue at BOP * 0 + NBOP * 3 range 0 .. 7;
end record;
for RGB24_Data use record
Red at BOP * 2 + NBOP * 1 range 0 .. 7;
Green at BOP * 1 + NBOP * 2 range 0 .. 7;
Blue at BOP * 0 + NBOP * 3 range 0 .. 7;
end record;
for RGB24_Data'Size use 32;
pragma Import (C, Create, "cairo_image_surface_create");
pragma Import
(C, Cairo_Format_Stride_For_Width, "cairo_format_stride_for_width");
pragma Import
(C, Create_For_Data_Generic, "cairo_image_surface_create_for_data");
pragma Import (C, Get_Data_Generic, "cairo_image_surface_get_data");
pragma Import (C, Get_Format, "cairo_image_surface_get_format");
pragma Import (C, Get_Width, "cairo_image_surface_get_width");
pragma Import (C, Get_Height, "cairo_image_surface_get_height");
pragma Import (C, Get_Stride, "cairo_image_surface_get_stride");
end Cairo.Image_Surface;