----------------------------------------------------------------------- -- GtkAda - Ada95 binding for Gtk+/Gnome -- -- -- -- Copyright (C) 1998-2000 E. Briot, J. Brobecker and A. Charlet -- -- Copyright (C) 2000-2002 ACT-Europe -- -- -- -- 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. -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ----------------------------------------------------------------------- -- -- -- A graphic context is a structure that describes all the attributes -- used by the drawing functions in Gdk. -- The colors, line styles, Fill styles and so on are defined through -- this structure. -- -- On X11 systems, this structure is stored directly on the XServer, -- which speeds up the transfer of the drawing attributes a lot. Instead -- of transferring all of them every time you call one of the drawing -- functions, you simply specify which GC you want to use. -- -- Thus, it is recommended to create as many GCs as you need, instead -- of creating a single one that is modified every time you need to -- modify one of the attributes. -- -- On Unix machines, you should have a look at the external utility 'xgc' -- which demonstrates all the basic settings of the graphic contexts. -- -- -- 1.3.6 -- Gdk, the low-level API -- create_gc.adb -- Gtk.GC with Glib; use Glib; with Gdk.Color; with Gdk.Font; with Gdk.Rectangle; with Gdk.Region; package Gdk.GC is subtype Gdk_GC is Gdk.Gdk_GC; -- A graphic context that contain all the information to draw graphics -- on the screen. -- Creating these GC is more efficient than passing a lot of parameters -- to each of the drawing functions, since these GC are stored on the -- server side and do not need to be pass through the network. type Gdk_GC_Values is new Gdk.C_Proxy; -- A structure used on the client side to store the same information -- as the GC. Creating a GC from this structure is more efficient than -- calling a lot of functions to modify the GC directly, since there is -- a single call to the server. type Gdk_Cap_Style is (Cap_Not_Last, Cap_Butt, Cap_Round, Cap_Projecting); pragma Convention (C, Gdk_Cap_Style); type Gdk_Fill is (Solid, Tiled, Stippled, Opaque_Stippled); pragma Convention (C, Gdk_Fill); type Gdk_Function is (Copy, Invert, Gdk_Xor, Clear, Gdk_And, And_Reverse, And_Invert, Noop, Gdk_Or, Equiv, Or_Reverse, Copy_Invert, Or_Invert, Nand, Set); pragma Convention (C, Gdk_Function); type Gdk_Join_Style is (Join_Miter, Join_Round, Join_Bevel); pragma Convention (C, Gdk_Join_Style); type Gdk_Line_Style is (Line_Solid, Line_On_Off_Dash, Line_Double_Dash); pragma Convention (C, Gdk_Line_Style); type Gdk_Subwindow_Mode is (Clip_By_Children, Include_Inferiors); pragma Convention (C, Gdk_Subwindow_Mode); type Gdk_GC_Values_Mask is mod 2 ** 32; GC_Foreground : constant Gdk_GC_Values_Mask := 2 ** 0; GC_Background : constant Gdk_GC_Values_Mask := 2 ** 1; GC_Font : constant Gdk_GC_Values_Mask := 2 ** 2; GC_Function : constant Gdk_GC_Values_Mask := 2 ** 3; GC_Fill : constant Gdk_GC_Values_Mask := 2 ** 4; GC_Tile : constant Gdk_GC_Values_Mask := 2 ** 5; GC_Stipple : constant Gdk_GC_Values_Mask := 2 ** 6; GC_Clip_Mask : constant Gdk_GC_Values_Mask := 2 ** 7; GC_Subwindow : constant Gdk_GC_Values_Mask := 2 ** 8; GC_Ts_X_Origin : constant Gdk_GC_Values_Mask := 2 ** 9; GC_Tx_Y_Origin : constant Gdk_GC_Values_Mask := 2 ** 10; GC_Clip_X_Origin : constant Gdk_GC_Values_Mask := 2 ** 11; GC_Clip_Y_Origin : constant Gdk_GC_Values_Mask := 2 ** 12; GC_Exposures : constant Gdk_GC_Values_Mask := 2 ** 13; GC_Line_Width : constant Gdk_GC_Values_Mask := 2 ** 14; GC_Line_Style : constant Gdk_GC_Values_Mask := 2 ** 15; GC_Cap_Style : constant Gdk_GC_Values_Mask := 2 ** 16; GC_Join_Style : constant Gdk_GC_Values_Mask := 2 ** 17; Null_GC : constant Gdk_GC := null; Null_GC_Values : constant Gdk_GC_Values := null; ------------ -- Gdk_GC -- ------------ procedure Gdk_New (GC : out Gdk_GC; Drawable : Gdk.Gdk_Drawable); -- Create a new graphic context. -- The window must have been realized first (so that it is associated -- with some resources on the Xserver). -- The GC can then be used for any window that has the same root window, -- and same color depth as Window. -- See the manual page for XCreateGC on Unix systems for more information. procedure Gdk_New (GC : out Gdk_GC; Drawable : Gdk.Gdk_Drawable; Values : Gdk_GC_Values; Values_Mask : Gdk_GC_Values_Mask); -- Create a new graphic context. -- It is directly created with the values set in Values, and whose -- associated field has been set in Values_Mask. -- This is faster than calling the simple Gdk_New function and each of -- other functions in this package, since each of them requires a call -- to the server. function Get_Type return Glib.GType; -- Return the internal value associated with Gdk_GC. procedure Destroy (GC : Gdk_GC); -- Free the memory allocated on the server for the graphic context. -- Graphic contexts are never freed automatically by GtkAda, this is -- the user responsibility to do so. -- This procedure is deprecated. Use Unref instead. procedure Ref (GC : Gdk_GC); -- Increment the reference counting for the graphic context. procedure Unref (GC : Gdk_GC); -- Decrement the reference counting for the graphic context. -- When this reaches 0, the graphic context is destroyed. procedure Get_Values (GC : Gdk_GC; Values : Gdk_GC_Values); -- Get the values set in the GC. -- This copies the values from the server to client, allowing faster -- modifications. Values can then be copied back to the server by -- creating a new graphic context with the function Gdk_New above. -- Values should have been allocated first with a call to Gdk_New. procedure Set_Values (GC : Gdk_GC; Values : Gdk_GC_Values; Mask : Gdk_GC_Values_Mask); -- Set the values in the GC. -- Mask indicates which values should be taken from Values and set in GC. procedure Set_Foreground (GC : Gdk_GC; Color : Gdk.Color.Gdk_Color); -- Set the foreground color for the graphic context. -- This color is the one that is used by most drawing functions. procedure Set_Background (GC : Gdk_GC; Color : Gdk.Color.Gdk_Color); -- Set the background color for the graphic context. procedure Set_Font (GC : Gdk_GC; Font : Gdk.Font.Gdk_Font); -- Set the font used by the graphic context. -- This font is used by the function Gdk.Drawable.Draw_Text. procedure Set_Function (GC : Gdk_GC; Func : Gdk_Function); -- Set the function in the graphic context. -- This function specifies how the points are put on the screen, ie -- if GtkAda how GtkAda should mix the point already on the screen -- and the new point being put. -- Note that setting the function to Gdk_Xor is not the right way -- to do animation. You should instead save the background pixmap, -- put the image, and then restore the background. -- -- In general, there are three basic steps to drawing: reading the source -- pixels, reading the destination pixels, and writing the destination -- pixels. Some functions only perform the third step (Set and Clear), -- some do not need the middle step (Copy), whereas most require the three -- steps, and thus can be much slower. procedure Set_Fill (GC : Gdk_GC; Fill : Gdk_Fill); -- Set the pattern used for filling the polygons. procedure Set_Tile (GC : Gdk_GC; Tile : Gdk.Gdk_Pixmap); procedure Set_Stipple (GC : Gdk_GC; Stipple : Gdk.Gdk_Pixmap); procedure Set_Ts_Origin (GC : Gdk_GC; X, Y : Gint); -- Set the Tile and Stipple origin in the graphic context. procedure Set_Clip_Origin (GC : Gdk_GC; X, Y : Gint); -- Set the origin of the clip mask. -- See the functions Set_Clip_Rectangle, Set_Clip_Region and -- Gdk.Bitmap.Set_Clip_Mask for more explanation. procedure Set_Clip_Mask (GC : Gdk.GC.Gdk_GC; Mask : Gdk.Gdk_Bitmap); -- If Mask is set to Null_Bitmap, then no clip_mask is used for drawing. -- Points will be drawn through this GC only where the bits are set to 1 -- in the mask. See also the function Set_Clip_Origin for -- how to move the mask inside the GC. procedure Set_Clip_Rectangle (GC : Gdk_GC; Rectangle : Gdk.Rectangle.Gdk_Rectangle); procedure Set_Clip_Rectangle (GC : Gdk_GC; Rectangle : Gdk.Rectangle.Gdk_Rectangle_Access := null); -- Set the clip rectangle. -- Only the points that are drawn inside this rectangle will be displayed -- on the screen. The clip origin is modified automatically. -- See Set_Clip_Mask to delete the current clip mask. procedure Set_Clip_Region (GC : Gdk_GC; Region : Gdk.Region.Gdk_Region); -- Define a clip region on the screen. -- This is just like Set_Clip_Rectangle, except that a region is a more -- complex region, that can be the intersection or union of multiple -- rectangles. Note that the Clip_Origin can have an influence on this -- function. procedure Set_Subwindow (GC : Gdk_GC; Mode : Gdk_Subwindow_Mode); -- Set the subwindow mode for the graphic context. -- This specifies whether the drawing routines should be clipped to -- the specific window they are drawn into, or if they should extend -- to subwindows as well. procedure Set_Exposures (GC : Gdk_GC; Exposures : Boolean); -- Exposures indicates whether you want "expose" and "noexpose" events to -- be reported when calling Copy_Area and Copy_Plane with this GC. -- You should disable this if you don't need the event and want to optimize -- your application. -- If Exposures is True, then any call to Copy_Area or Draw_Pixmap will -- generate an expose event. Otherwise, these will generate a no_expose -- event. procedure Set_Line_Attributes (GC : Gdk_GC; Line_Width : Gint; Line_Style : Gdk_Line_Style; Cap_Style : Gdk_Cap_Style; Join_Style : Gdk_Join_Style); -- Set the line attributes for this GC. -- Line_Width is the width of the line. If its value is 0, the line is as -- thin as possible, possibly even more so than if the width is 1. It is -- also faster to draw a line with width 0 than any other line width. -- -- Line_Style specifies whether the line should be solid or dashed. -- With Line_On_Off_Dash, the colors are alternatively the foreground -- color, and blank. With Line_Double_Dash, the colors are -- alternatively the foreground and background colors. -- -- Cap_Style specifies how the line should end, either flat or rounded. -- -- Join_Style specifies how two consecutive lines drawn by Draw_Lines are -- connected. procedure Set_Dashes (Gc : Gdk_GC; Dash_Offset : Gint; Dash_List : Guchar_Array); -- Specify the dash pattern when the line's style is anything but solid. -- The values in the array alternatively give the length (in pixels) of -- the plain dash, the empty dash, the second plain dash, ... None of -- these values can be 0. If there is an odd number of items in Dash_List, -- this is equivalent to giving the array concatenated with itself. -- Dash_Offset specifies the phase of the pattern to start with. procedure Copy (Dst_GC : Gdk_GC; Src_GC : Gdk_GC); -- Copy a Src_GC to Dst_GC. procedure Set_Colormap (Gc : Gdk_GC; Colormap : Gdk.Gdk_Colormap); function Get_Colormap (Gc : Gdk_GC) return Gdk.Gdk_Colormap; procedure Set_Rgb_Fg_Color (Gc : Gdk_GC; Color : Gdk.Color.Gdk_Color); procedure Set_Rgb_Bg_Color (Gc : Gdk_GC; Color : Gdk.Color.Gdk_Color); ---------------------- -- Gdk_Color_Values -- ---------------------- function Gdk_New return Gdk_GC_Values; -- Allocate a new Values structure on the client. -- Note that this function allocates a C structure, and thus needs to -- be freed with a call to Free below. procedure Free (Values : Gdk_GC_Values); -- Free the C structure associated with Values. procedure Set_Foreground (Values : Gdk_GC_Values; Color : Gdk.Color.Gdk_Color); -- Same as Set_Foreground, but on the client side procedure Set_Background (Values : Gdk_GC_Values; Color : Gdk.Color.Gdk_Color); -- Same as Set_Background, but on the client side procedure Set_Font (Values : Gdk_GC_Values; Font : Gdk.Font.Gdk_Font); -- Same as Set_Font, but on the client side procedure Set_Function (Values : Gdk_GC_Values; Func : Gdk_Function); -- Same as Set_Function, but on the client side procedure Set_Fill (Values : Gdk_GC_Values; Fill : Gdk_Fill); -- Same as Set_Fill, but on the client side procedure Set_Ts_Origin (Values : Gdk_GC_Values; X, Y : Gint); -- Same as Set_Ts_Origin, but on the client side procedure Set_Clip_Origin (Values : Gdk_GC_Values; X, Y : Gint); -- Same as Set_Clip_Origin, but on the client side procedure Set_Subwindow (Values : Gdk_GC_Values; Mode : Gdk_Subwindow_Mode); -- Same as Set_Subwindow, but on the client side procedure Set_Exposures (Values : Gdk_GC_Values; Exposures : Boolean); -- Same as Set_Exposures, but on the client side procedure Set_Line_Attributes (Values : Gdk_GC_Values; Line_Width : Gint; Line_Style : Gdk_Line_Style; Cap_Style : Gdk_Cap_Style; Join_Style : Gdk_Join_Style); -- Same as Set_Line_Attributes, but on the client side private pragma Import (C, Get_Type, "gdk_gc_get_type"); pragma Import (C, Copy, "gdk_gc_copy"); pragma Import (C, Destroy, "gdk_gc_unref"); pragma Import (C, Free, "ada_gdk_gc_free_values"); pragma Import (C, Get_Values, "gdk_gc_get_values"); pragma Import (C, Set_Values, "gdk_gc_set_values"); pragma Import (C, Ref, "gdk_gc_ref"); pragma Import (C, Unref, "gdk_gc_unref"); pragma Import (C, Set_Clip_Rectangle, "gdk_gc_set_clip_rectangle"); pragma Import (C, Set_Clip_Region, "gdk_gc_set_clip_region"); pragma Import (C, Set_Stipple, "gdk_gc_set_stipple"); pragma Import (C, Set_Tile, "gdk_gc_set_tile"); pragma Import (C, Set_Clip_Mask, "gdk_gc_set_clip_mask"); pragma Import (C, Set_Colormap, "gdk_gc_set_colormap"); pragma Import (C, Get_Colormap, "gdk_gc_get_colormap"); pragma Import (C, Set_Rgb_Fg_Color, "gdk_gc_set_rgb_fg_color"); pragma Import (C, Set_Rgb_Bg_Color, "gdk_gc_set_rgb_bg_color"); end Gdk.GC;