package Claw.Low_Level.GDI is
    --
    -- CLAW - Class Library for Ada and Windows.
    --
    -- This is the place where various commonly used low-level routines
    -- are collected.
    --
    -- This child package deals with GDI-related routines:
    --
    --		Drawing, paths, bitmap manipulation, metafiles, etc.
    --
    --
    -- Copyright 1996, 1997  R.R. Software, Inc.
    -- P.O. Box 1512, Madison WI  53701
    -- All rights reserved.
    --

    use Claw.Win32;

    type Void_Record_Type is record
	-- Dummy record type for various routines.
	null;
    end record;
    type Void_Ptr_Type is access all Void_Record_Type;
    subtype DIB_Info_Header_Ptr_Type is Void_Ptr_Type;

    type Constant_Access_Point_Type is access constant Claw.Point_Type;
    type Constant_Access_Int_Type is access constant Claw.Int;

    Dummy : Float := 1.0; -- Variable to convince J/A 3.0.7 that floating point is in use.

    function Select_Object (Dc   : HDc;
			    Tool : Tool_Handle_Type) return Tool_Handle_Type;
    pragma Import (StdCall, Select_Object, "SelectObject");

    function Select_Brush (Dc      :	Hdc;
			   Object  :	HBrush) return HBrush;
    pragma Import (StdCall, Select_Brush, "SelectObject");

    function Get_Stock_Brush (Index :	Int) return HBrush;
    pragma Import (StdCall, Get_Stock_Brush, "GetStockObject");

    function Create_Solid_Brush (Color   :	Claw.Colors.Color_Type) return Hbrush;
    pragma Import (StdCall, Create_Solid_Brush, "CreateSolidBrush");

    function Create_Hatch_Brush (Index :	Int;
				 Color :	Claw.Colors.Color_Type) return Hbrush;
    pragma Import (StdCall, Create_Hatch_Brush, "CreateHatchBrush");

    function Create_Pattern_Brush(H : in HBitmap) return HBrush;
    pragma Import (StdCall, Create_Pattern_Brush, "CreatePatternBrush");

    function Delete_Brush (Object :	Hbrush) return Bool;
    pragma Import (StdCall, Delete_Brush, "DeleteObject");

    function Select_Pen   (Dc      :	Hdc;
			   Object  :	HPen) return HPen;
    pragma Import (StdCall, Select_Pen, "SelectObject");

    function Get_Stock_Pen(Index   :	Int) return HPen;
    pragma Import (StdCall, Get_Stock_Pen, "GetStockObject");

    function Create_Pen (Pen_Style:	Int;
			 Width   :	Int;
			 Color   :	Claw.Colors.Color_Type) return Hpen;
    pragma Import (StdCall, Create_Pen, "CreatePen");

    function Delete_Pen (Object  :	Hpen) return Bool;
    pragma Import (StdCall, Delete_Pen, "DeleteObject");

    function Select_Font  (Dc      :	Hdc;
			   Object  :	HFont) return HFont;
    pragma Import (StdCall, Select_Font, "SelectObject");

    function Get_Stock_Font(Index   :	Int) return HFont;
    pragma Import (StdCall, Get_Stock_Font, "GetStockObject");

    function Create_Font (Height     : Int;
			  Width      : Int;
			  Escapement : Int;
			  Orientation: Int;
			  Weight     : Int;
			  Is_Italic  : DWord;
			  Underline  : DWord;
			  Strike_Out : DWord;
			  Character_Set : DWord;
			  Precision  : DWord;
			  Clip_Precision : DWord;
			  Quality    : DWord;
			  Pitch_Font : DWord;
			  Typeface_Name : Lpcstr) return HFont;
    pragma Import (StdCall, Create_Font, "CreateFontA");

    function Delete_Font  (Object  :	Hfont) return Bool;
    pragma Import (StdCall, Delete_Font, "DeleteObject");

    function Select_Bitmap (Dc     :	Hdc;
			    Object :	HBitmap) return HBitmap;
    pragma Import (StdCall, Select_Bitmap, "SelectObject");

    function Delete_Bitmap (Object :	HBitmap) return Bool;
    pragma Import (StdCall, Delete_Bitmap, "DeleteObject");

    function Get_Bk_Color (Dc   :	Hdc) return Claw.Colors.Color_Type;
    pragma Import (StdCall, Get_Bk_Color, "GetBkColor");

    function Get_Bk_Mode (Dc	:	Hdc) return Int;
    pragma Import (StdCall, Get_Bk_Mode, "GetBkMode");

    function Get_Text_Color (Dc	:	Hdc) return Claw.Colors.Color_Type;
    pragma Import (StdCall, Get_Text_Color, "GetTextColor");

    function Set_Bk_Color (Dc     :	Hdc;
			   Color  :	Claw.Colors.Color_Type) return Claw.Colors.Color_Type;
    pragma Import (StdCall, Set_Bk_Color, "SetBkColor");

    function Set_Bk_Mode (Dc      :	Hdc;
			  Bk_Mode :	Int) return Int;
    pragma Import (StdCall, Set_Bk_Mode, "SetBkMode");

    function Set_Text_Color (Dc    :	Hdc;
			     Color :	Claw.Colors.Color_Type) return Claw.Colors.Color_Type;
    pragma Import (StdCall, Set_Text_Color, "SetTextColor");

    function Get_Nearest_Color (Handle : in Claw.Win32.HDc;
				Color  : in Claw.Colors.Color_Type)
	      return Claw.Colors.Color_Type;
    pragma Import (StdCall, Get_Nearest_Color, "GetNearestColor");

    function Text_Out (Dc      :	Hdc;
		       X,
		       Y       :	Long;
		       Str     :	Lpcstr;
		       Count   :	Int) return Bool;
    pragma Import (StdCall, Text_Out, "TextOutA");

    ETO_OPAQUE : UInt := 16#002#;
    ETO_CLIPPED : UInt := 16#004#;
    ETO_GLYPH_INDEX : UInt := 16#010#; -- Windows 4.0 only.

    function Ext_Text_Out (Dc      :	Hdc;
			   X,
			   Y       :	Long;
			   Options :	UInt;
			   Rect    :	access Rectangle_Type;
			   Str     :	Lpcstr;
			   Count   :	Int;
			   Zero    :	Long := 0) return Bool;
    pragma Import (StdCall, Ext_Text_Out, "ExtTextOutA");

    function Get_Current_Position_Ex (Dc : HDc;
				      Pt : access Point_Type) return Bool;
    pragma Import (StdCall, Get_Current_Position_Ex, "GetCurrentPositionEx");

    function Set_Text_Align (Dc    :	Hdc;
			     Align :	UInt) return UInt;
    pragma Import (StdCall, Set_Text_Align, "SetTextAlign");

    function Get_Text_Align (Dc    :	Hdc) return UInt;
    pragma Import (StdCall, Get_Text_Align, "GetTextAlign");

    function Set_Text_Justification(Dc      :	Hdc;
 			   	    ExtraSpace :     UInt;
				    Breaks  :	     UInt) return Bool;
    pragma Import (StdCall, Set_Text_Justification, "SetTextJustification");



	--Line and Curve functions

    function Line_to(Dc    : in Hdc;
		     X, Y  : in Long) return Bool;
    pragma Import (StdCall, Line_to, "LineTo");

    function Move_To_Ex (Dc : in HDc;
			 nX, nY : in Long;
			 Pt : access Point_Type) return Bool;
    pragma Import (StdCall, Move_To_Ex, "MoveToEx");

    function Angle_Arc (Dc:		in Hdc;
			X,
			Y:		in Int;
			Radius:		in DWord;
			Start_Angle,
			Sweep_Angle:	in Float) return Bool;
    pragma Import (StdCall, Angle_Arc, "AngleArc");

    function Arc_To (Dc:	in Hdc;
		     Left,
		     Right,
		     Top,
		     Bottom:	in Int;
		     X1,
		     Y1,
		     X2,
		     Y2:	in Int) return Bool;
    pragma Import (StdCall, Arc_To, "ArcTo");

    function Get_Arc_Direction (Dc:	in Hdc) return Int;
    pragma Import (StdCall, Get_Arc_Direction, "GetArcDirection");

    function Poly_Bezier (Dc:		in Hdc;
			  Ppt:		in Constant_Access_Point_Type;
			--/\ points to 1st element of array of points
			  Points:	in DWord) return Bool;
    pragma Import (StdCall, Poly_Bezier, "PolyBezier");

    function Poly_Bezier_To (Dc:	in Hdc;
			     Ppt:	in Constant_Access_Point_Type;
			--/\ points to 1st element of array of points
			     Points:	in DWord) return Bool;
    pragma Import (StdCall, Poly_Bezier_To, "PolyBezierTo");

    function Poly_Draw (Dc:	    in Hdc;
			Ppt:	    in Constant_Access_Point_Type;
			--/\ points to 1st element of array of points
			Types:	    in Void_Ptr_Type;
			--/\ points to 1st element of array of bytes
			Count:	    in Int) return Bool;
    pragma Import (StdCall, Poly_Draw, "PolyDraw");

    function Poly_Line (Dc:	    in Hdc;
			Ppt:	    in Constant_Access_Point_Type;
			--/\ points to 1st element of array of points
			Points:	    in Int) return Bool;
    pragma Import (StdCall, Poly_Line, "Polyline");

    function Poly_Line_To (Dc:		in Hdc;
			   Ppt:		in Constant_Access_Point_Type;
			   --/\ points to 1st element of array of points
			   Points:	in Int) return Bool;
    pragma Import (StdCall, Poly_Line_To, "PolylineTo");

    function Poly_Polyline (Dc:		    in Hdc;
			    Ppt:	    in Constant_Access_Point_Type;
			    --/\ points to 1st element of array of points
			    Poly_Points:    access DWord;
			    --/\ points to 1st element of array of values
			    Count:	    in DWord) return Bool;
    pragma Import (StdCall, Poly_Polyline, "PolyPolyline");

    function Set_Arc_Direction (Dc:		in Hdc;
				Arc_Direction:	in Int) return Int;
    pragma Import (StdCall, Set_Arc_Direction, "SetArcDirection");


	--Higher level draw routines:
	--
    function Arc (Dc      :	Hdc;
		  X1,
		  Y1,
		  X2,
		  Y2,
		  X3,
		  Y3,
		  X4,
		  Y4      :	Long) return Bool;
    pragma Import (StdCall, Arc, "Arc");

    function Chord(Dc      :	HDc;
		   X1,
		   Y1,
		   X2,
		   Y2,
		   X3,
		   Y3,
		   X4,
		   Y4      :	Long) return Bool;
    pragma Import (StdCall, Chord, "Chord");

    function Ellipse (Dc   :	Hdc;
		      X1,
		      Y1,
		      X2,
		      Y2   :	Long) return Bool;
    pragma Import (StdCall, Ellipse, "Ellipse");

    function Pie (Dc      :	Hdc;
		  X1,
		  Y1,
		  X2,
		  Y2,
		  X3,
		  Y3,
		  X4,
		  Y4      :	Long) return Bool;
    pragma Import (StdCall, Pie, "Pie");

    function Rectangle(Dc      :	Hdc;
 		       X1,
		       Y1,
		       X2,
		       Y2      :	Long) return Bool;
    pragma Import (StdCall, Rectangle, "Rectangle");

    function Round_Rect(Dc      :	Hdc;
			X1,
			Y1,
			X2,
			Y2,
			X3,
			Y3      :	Long) return Bool;
    pragma Import (StdCall, Round_Rect, "RoundRect");

    function Polygon (Dc:	in Hdc;
		      Points:	in Constant_Access_Point_Type;
			--Actually points to 1st item in array
		      Count:	in Int)	return Bool;
    pragma Import (StdCall, Polygon, "Polygon");

    function Poly_Polygon (Dc:		in Hdc;
			   Points:	in Constant_Access_Point_Type;
			    --/\ Points to 1st item in Points array
			   Poly_Counts:	access Int;
			    --/\ Points to 1st item in Poly_Counts array
			   Count:	in Int)	return Bool;
    pragma Import (StdCall, Poly_Polygon, "PolyPolygon");

    function Draw_Focus_Rect (Dc      : in Hdc;
			      Rect    : access Rectangle_Type) return Bool;
    pragma Import (StdCall, Draw_Focus_Rect, "DrawFocusRect");


    -- Palettes:
    function Select_Palette(Dc      :	     Hdc;
			    Object  :	     HPalette;
			    bForceBackground:Bool) return HPalette;
    pragma Import (StdCall, Select_Palette, "SelectPalette");

    function Get_Stock_Palette(Index   :	Int) return HPalette;
    pragma Import (StdCall, Get_Stock_Palette, "GetStockObject");

    function Delete_Palette (Object  :		HPalette) return Bool;
    pragma Import (StdCall, Delete_Palette, "DeleteObject");

    function Resize_Palette (Handle : in Claw.Win32.HPalette;
			     new_count : in UInt) return BOOL;
    pragma Import (StdCall, Resize_Palette, "ResizePalette");

    function Get_Nearest_Palette_Index (Handle:in Claw.Win32.HPalette;
					Color :in Claw.Colors.Color_Type)
	      return UInt;
    pragma Import (StdCall, Get_Nearest_Palette_Index, "GetNearestPaletteIndex");

    function Realize_Palette (Handle : in HDc) return Uint;
    pragma Import (StdCall, Realize_Palette, "RealizePalette");

    -- Regions:
    function Select_Region(Dc      :	Hdc;
			   Object  :	HRegion) return HRegion;
    pragma Import (StdCall, Select_Region, "SelectObject");

    function Create_Rectangular_Region(Left, Right, Top, Bottom : in Int)
	return HRegion;
    pragma Import (StdCall, Create_Rectangular_Region, "CreateRectRgn");

    function Create_Elliptic_Region(Left, Right, Top, Bottom : in Int)
	return HRegion;
    pragma Import (StdCall, Create_Elliptic_Region, "CreateEllipticRgn");

    function Create_Rounded_Rectangular_Region(Left, Right, Top, Bottom : in Int;
				       Ellipse_Width, Ellipse_Height: in Int)
	return HRegion;
    pragma Import (StdCall, Create_Rounded_Rectangular_Region,"CreateRoundRectRgn");

    function Delete_Region (Object  : HRegion) return Bool;
    pragma Import (StdCall, Delete_Region, "DeleteObject");

    function Select_Clip_Rgn (The_Hdc:	in Hdc;
			      Hrgn:	in HRegion) return Int;
    pragma Import (StdCall, Select_Clip_Rgn, "SelectClipRgn");

    function Offset_Clip_Rgn (The_Hdc:	in Hdc;
			      X_Offset:	in Int;
			      Y_Offset:	in Int) return Int;
    pragma Import (StdCall, Offset_Clip_Rgn, "OffsetClipRgn");

    function Create_Polygon_Rgn (P:   	    in Constant_Access_Point_Type; -- Really a point list.
				 Count:	    in Int;
				 Fill_Mode: in Claw.Codes.Fill_Modes) return HRegion;
    pragma Import (StdCall, Create_Polygon_Rgn, "CreatePolygonRgn");

    function Create_Poly_Polygon_Rgn (PPt:	    Constant_Access_Point_Type; -- Really a point list.
				      PolyCounts:   Constant_Access_Int_Type; -- Really a int list.
				      Count:	    in     Int;
				      PolyFillMode: in     Claw.Codes.Fill_Modes) return HRegion;
    pragma Import (StdCall, Create_Poly_Polygon_Rgn, "CreatePolyPolygonRgn");

    function Ext_Create_Region (X_Form:	    access Claw.Win32.X_Form_Type;
			    	Count:	    in     DWord;
			    	Rgn_Data:   Void_Ptr_Type) return HRegion;
    pragma Import (StdCall, Ext_Create_Region, "ExtCreateRegion");

    function Equal_Rgn (Src_Rgn_1:	in HRegion;
			Src_Rgn_2:	in HRegion) return Bool;
    pragma Import (StdCall, Equal_Rgn, "EqualRgn");

    function Combine_Rgn (Dest:	    	in HRegion;
			  Src1:	    	in HRegion;
			  Src2:	    	in HRegion;
			  CombineMode:	in Int) return Int;
    pragma Import (StdCall, Combine_Rgn, "CombineRgn");

    function Fill_Rgn (The_Hdc:	    in Hdc;
		       Rgn:	    in HRegion;
		       Brush:	    in HBrush) return Bool;
    pragma Import (StdCall, Fill_Rgn, "FillRgn");

    function Frame_Rgn (The_Hdc:    in Hdc;
		    	Rgn:	    in HRegion;
		    	Brush:	    in HBrush;
		    	Width:	    in Int;
		    	Height:	    in Int) return Bool;
    pragma Import (StdCall, Frame_Rgn, "FrameRgn");

    function Invert_Rgn (The_Hdc:   in Hdc;
		     	 Rgn:	    in HRegion) return Bool;
    pragma Import (StdCall, Invert_Rgn, "InvertRgn");

    function Offset_Rgn (Rgn:	in HRegion;
		     	 X_Offset:	in Int;
		     	 Y_Offset:	in Int) return Int;
    pragma Import (StdCall, Offset_Rgn, "OffsetRgn");

    function Paint_Rgn (The_Hdc:    in Hdc;
		    	Rgn:	    in HRegion) return Bool;
    pragma Import (StdCall, Paint_Rgn, "PaintRgn");

    function Pt_In_Region (Rgn:	    in HRegion;
			   X:	    in Int;
			   Y:	    in Int) return Bool;
    pragma Import (StdCall, Pt_In_Region, "PtInRegion");

    function Rect_In_Region (Rgn:	in     HRegion;
			     Prc:	access Rectangle_Type) return Bool;
    pragma Import (StdCall, Rect_In_Region, "RectInRegion");

    function Invalidate_Rgn (Wnd:	in HWnd;
			     Rgn:	in HRegion;
			     Erase:	in Bool) return Bool;
    pragma Import (StdCall, Invalidate_Rgn, "InvalidateRgn");

    function Validate_Rgn (Wnd:	    in HWnd;
		   	   Rgn:	    in HRegion) return Bool;
    pragma Import (StdCall, Validate_Rgn, "ValidateRgn");

    function Ext_Select_Clip_Rgn (The_Hdc:  in Hdc;
				  Rgn:	    in HRegion;
				  Mode:	    in Int) return Int;
    pragma Import (StdCall, Ext_Select_Clip_Rgn, "ExtSelectClipRgn");

    function Get_Clip_Rgn (The_Hdc:	in Hdc;
			   Rgn:		in HRegion) return Int;
    pragma Import (StdCall, Get_Clip_Rgn, "GetClipRgn");

    function Get_Meta_Rgn (The_Hdc:	in Hdc;
			   Rgn:		in HRegion) return Int;
    pragma Import (StdCall, Get_Meta_Rgn, "GetMetaRgn");

    function Set_Meta_Rgn (The_Hdc:	in Hdc) return Int;
    pragma Import (StdCall, Set_Meta_Rgn, "SetMetaRgn");

    function Get_Poly_Fill_Mode (The_Hdc:	in Hdc) return Claw.Codes.Fill_Modes;
    pragma Import (StdCall, Get_Poly_Fill_Mode, "GetPolyFillMode");

    function Set_Poly_Fill_Mode (The_Hdc:	    in Hdc;
				 Poly_Fill_Mode:    in Claw.Codes.Fill_Modes) return Claw.Codes.Fill_Modes;
    pragma Import (StdCall, Set_Poly_Fill_Mode, "SetPolyFillMode");

    function Get_Region_Data (Rgn:	in     HRegion;
			      Count:    in     Int;
			      Rgn_Data: Void_Ptr_Type) return DWord;
		--Rgn_Data should be the 'Access of the Header field of a
		--Claw.Region_Data_Type, which contains the rectangle records
		--after the header.
    pragma Import (StdCall, Get_Region_Data, "GetRegionData");

    function Get_Rgn_Box (Rgn:	in HRegion;
			  Prc:	access Rectangle_Type) return Int;
    pragma Import (StdCall, Get_Rgn_Box, "GetRgnBox");

    -- DC:
    function Create_Compatible_DC (DC : in HDc) return HDc;
    pragma Import (StdCall, Create_Compatible_DC, "CreateCompatibleDC");

    function Delete_DC (DC : in HDc) return Bool;
    pragma Import (StdCall, Delete_DC, "DeleteDC");

    function Release_DC (Wnd : in HWnd;
			 DC : in HDc) return Bool;
    pragma Import (StdCall, Release_DC, "ReleaseDC");

    function Get_DC (Wnd : in HWnd) return HDc;
    pragma Import (StdCall, Get_DC, "GetDC");

    function Get_Window_DC (Wnd : in HWnd) return HDc;
    pragma Import (StdCall, Get_Window_DC, "GetWindowDC");

    function Create_DC (Driver : in Lpcstr; -- Documentation is conflicted; better set it.
			Device : in Lpcstr;
			Port   : in DWord := 0; -- not used in Win32.
			Devmode : in DWord := 0) return HDc;
    pragma Import (StdCall, Create_DC, "CreateDCA");

    function Save_DC (Wnd : in HWnd) return Claw.Int;
    pragma Import (StdCall, Save_DC, "SaveDC");

    function Restore_DC (Wnd : in HWnd;
			 Save_Cnt : in Claw.Int) return Bool;
    pragma Import (StdCall, Restore_DC, "RestoreDC");

    function Start_Page (DC : in HDc) return Int;
    pragma Import (StdCall, Start_Page, "StartPage");

    function End_Page (DC : in HDc) return Int;
    pragma Import (StdCall, End_Page, "EndPage");

    type Doc_Info_Type is record
	Size	 : Claw.Int := 20;
	Doc_Name : Lpcstr;
	Output_File : Lpcstr; -- null unless directing to a file.
	Data_Type: Lpcstr := null; -- Always null except on Windows 95; can't find
				   -- any documentation as to what it ought to be if not
				   -- null.
	FWType	 : Claw.DWord := 0; -- Used only on Windows 95, best ignored.
    end record;

    function Start_Doc (DC : in HDc;
			DocInfo : access Doc_Info_Type) return Int;
    pragma Import (StdCall, Start_Doc, "StartDocA");

    function End_Doc (DC : in HDc) return Int;
    pragma Import (StdCall, End_Doc, "EndDoc");

    function Abort_Doc (DC : in HDc) return Int;
    pragma Import (StdCall, Abort_Doc, "AbortDoc");

    type Abort_Proc_Type is access function (DC : in HDc;
					     Error : in Claw.Int) return Bool;
    pragma Convention (StdCall, Abort_Proc_Type);
	-- Error can be 0 (no error) or SP_OUTOFDISK (can wait).
	-- Return True to continue and False to abort.

    function Set_Abort_Proc (DC : in HDc;
			     Proc : in Abort_Proc_Type) return Int;
    pragma Import (StdCall, Set_Abort_Proc, "SetAbortProc");

    SP_ERROR	: constant Claw.Int := -1;
    SP_APPABORT : constant Claw.Int := -2;
    SP_USERABORT: constant Claw.Int := -3;
    SP_OUTOFDISK: constant Claw.Int := -4;
    SP_OUTOFMEMORY: constant Claw.Int := -5;


    type GDC_ints is new claw.int;
    for GDC_ints'size use 32;

    TECHNOLOGY_index    : constant  GDC_ints := 2;   -- Device classification
    CURVECAPS_index     : constant  GDC_ints := 28;  -- Curve capabilities
    LINECAPS_index      : constant  GDC_ints := 30;  -- Line capabilities
    POLYGONALCAPS_index : constant  GDC_ints := 32;  -- Polygonal capabilities
    TEXTCAPS_index      : constant  GDC_ints := 34;  -- Text capabilities
    CLIPCAPS_index      : constant  GDC_ints := 36;  -- Clipping capabilities
    RASTERCAPS_index    : constant  GDC_ints := 38;  -- Bitblt capabilities

    function Get_Device_Caps (Dc: in Claw.Win32.HDc; index : in GDC_ints) return int;
    pragma Import (StdCall, Get_Device_Caps, "GetDeviceCaps");

    function Get_Text_Extent_Point (Dc: in Claw.Win32.HDc;
				    Text : in Claw.Win32.Lpcstr;
				    Count : in Claw.Int;
				    Size  : access Size_Type) return Bool;
    pragma Import (StdCall, Get_Text_Extent_Point, "GetTextExtentPoint32A");

    function Get_Tabbed_Text_Extent_Point_no_Tabs (Dc: in Claw.Win32.HDc;
						   Text : in Claw.Win32.Lpcstr;
						   Count : in Claw.Int;
						   TCount : in Claw.Int := 0;
						   T_Arr : in Claw.Dword := 0
						) return Claw.DWord;
    pragma Import (StdCall, Get_Tabbed_Text_Extent_Point_no_Tabs, "GetTabbedTextExtentA");

    function Get_Tabbed_Text_Extent_Point (Dc: in Claw.Win32.HDc;
					   Text : in Claw.Win32.Lpcstr;
					   Count : in Claw.Int;
					   Tab_Count : in Claw.Int;
					   Tab_Array : access Claw.Int) return Claw.DWord;
    pragma Import (StdCall, Get_Tabbed_Text_Extent_Point, "GetTabbedTextExtentA");

    function Get_System_Metrics(Index   :	Int) return Int;
    pragma Import (StdCall, Get_System_Metrics, "GetSystemMetrics");

    -- Coordinate systems routines:

    function Client_To_Screen (Wnd:	in     HWnd;
			       Point:	access Claw.Point_Type) return Bool;
    pragma Import (StdCall, Client_To_Screen, "ClientToScreen");

    function Screen_To_Client (Wnd:	in     HWnd;
			       Point:	access Claw.Point_Type) return Bool;
    pragma Import (StdCall, Screen_To_Client, "ScreenToClient");

    function Map_Window_Points (Wnd_From:	in     HWnd;
				Wnd_To:		in     HWnd;
				Points:		access Point_Type; -- Really a point list.
				Num:		in     UInt) return Int;
    pragma Import (StdCall, Map_Window_Points, "MapWindowPoints");

    function Set_Map_Mode (The_Hdc:	in Hdc;
			   Map_Mode:	in Int) return Int;
    pragma Import (StdCall, Set_Map_Mode, "SetMapMode");

    function Get_Map_Mode (The_Hdc:	in Hdc) return Int;
    pragma Import (StdCall, Get_Map_Mode, "GetMapMode");

    function Get_Window_Ext_Ex (The_Hdc:    in Hdc;
				Size:	    access Claw.Size_Type) return Bool;
    pragma Import (StdCall, Get_Window_Ext_Ex, "GetWindowExtEx");

    function Set_Window_Ext_Ex (The_Hdc:    in     Hdc;
				X_Extent:   in     Int;
				Y_Extent:   in     Int;
				Size:	    access Claw.Size_Type) return Bool;
    pragma Import (StdCall, Set_Window_Ext_Ex, "SetWindowExtEx");

    function Scale_Window_Ext_Ex (The_Hdc:	in     Hdc;
				  X_Num:	in     Int;
				  X_Demon:	in     Int;
				  Y_Num:	in     Int;
				  Y_Demon:	in     Int;
				  Size:		access Claw.Size_Type) return Bool;
    pragma Import (StdCall, Scale_Window_Ext_Ex, "ScaleWindowExtEx");

    function Scale_Viewport_Ext_Ex (The_Hdc:	in     Hdc;
				    X_Num:	in     Int;
				    X_Demon:	in     Int;
				    Y_Num:	in     Int;
				    Y_Demon:	in     Int;
				    Size:	access Claw.Size_Type) return Bool;
    pragma Import (StdCall, Scale_Viewport_Ext_Ex, "ScaleViewportExtEx");

    function Get_Viewport_Ext_Ex (The_Hdc:  in Hdc;
				  Size:	    access Claw.Size_Type) return Bool;
    pragma Import (StdCall, Get_Viewport_Ext_Ex, "GetViewportExtEx");

    function Set_Viewport_Ext_Ex (The_Hdc:	in     Hdc;
				  X_Extent:	in     Int;
				  Y_Extent:	in     Int;
				  Size:		access Claw.Size_Type) return Bool;
    pragma Import (StdCall, Set_Viewport_Ext_Ex, "SetViewportExtEx");

    function DP_To_LP (The_Hdc:		in     Hdc;
		       Points:		access Claw.Point_Type; -- Really a list
		       Count:		in     Int) return Bool;
    pragma Import (StdCall, DP_To_LP, "DPtoLP");

    function LP_To_DP (The_Hdc:		in     Hdc;
		       Points:		access Claw.Point_Type; -- Really a list
		       Count:		in     Int) return Bool;
    pragma Import (StdCall, LP_To_DP, "LPtoDP");

    function Set_Window_Org_Ex (The_Hdc:    in     Hdc;
				X:	    in     Int;
				Y:	    in     Int;
				Point:	    access Claw.Point_Type) return Bool;
    pragma Import (StdCall, Set_Window_Org_Ex, "SetWindowOrgEx");

    function Get_Window_Org_Ex (The_Hdc:    in     Hdc;
				Point:	    access Claw.Point_Type) return Bool;
    pragma Import (StdCall, Get_Window_Org_Ex, "GetWindowOrgEx");

    function Set_Viewport_Org_Ex (The_Hdc:  in     Hdc;
				  X:	    in     Int;
				  Y:	    in     Int;
				  Point:    access Claw.Point_Type) return Bool;
    pragma Import (StdCall, Set_Viewport_Org_Ex, "SetViewportOrgEx");

    function Get_Viewport_Org_Ex (The_Hdc:  in     Hdc;
				  Point:    access Claw.Point_Type) return Bool;
    pragma Import (StdCall, Get_Viewport_Org_Ex, "GetViewportOrgEx");

    function Offset_Window_Org_Ex (The_Hdc:	in     Hdc;
				   X_Offset:	in     Int;
				   Y_Offset:	in     Int;
				   Point:	access Claw.Point_Type) return Bool;
    pragma Import (StdCall, Offset_Window_Org_Ex, "OffsetWindowOrgEx");

    function Offset_Viewport_Org_Ex (The_Hdc:	in     Hdc;
				     X_Offset:	in     Int;
				     Y_Offset:	in     Int;
				     Point:	access Claw.Point_Type) return Bool;
    pragma Import (StdCall, Offset_Viewport_Org_Ex, "OffsetViewportOrgEx");

    function Pt_Visible (The_Hdc:   in Hdc;
			 X:	    in Int;
			 Y:	    in Int) return Bool;
    pragma Import (StdCall, Pt_Visible, "PtVisible");

    function Set_Graphics_Mode (The_Hdc:    in Hdc;
				Mode:	    in Int) return Int;
    pragma Import (StdCall, Set_Graphics_Mode, "SetGraphicsMode");

    function Get_Graphics_Mode (The_Hdc:    in Hdc) return Int;
    pragma Import (StdCall, Get_Graphics_Mode, "GetGraphicsMode");

    function Set_World_Transform (The_Hdc:  in     Hdc;
				  XForm:    access Claw.Win32.X_Form_Type) return Bool;
    pragma Import (StdCall, Set_World_Transform, "SetWorldTransform");

    function Get_World_Transform (The_Hdc:    in     Hdc;
				  XForm:      access Claw.Win32.X_Form_Type) return Bool;
    pragma Import (StdCall, Get_World_Transform, "GetWorldTransform");

    function Modify_World_Transform (The_Hdc:	in     Hdc;
				     XForm:	access Claw.Win32.X_Form_Type;
				     Mode:	in     DWord) return Bool;
    pragma Import (StdCall, Modify_World_Transform, "ModifyWorldTransform");

    function Combine_Transform (Result:	access Claw.Win32.X_Form_Type;
				XForm1: access Claw.Win32.X_Form_Type;
				XForm2: access Claw.Win32.X_Form_Type) return Bool;
    pragma Import (StdCall, Combine_Transform, "CombineTransform");


    -- Path-related routines:

    function Abort_Path (The_Hdc:	in Hdc) return Bool;
    pragma Import (StdCall, Abort_Path, "AbortPath");

    function Begin_Path (The_Hdc:	in Hdc) return Bool;
    pragma Import (StdCall, Begin_Path, "BeginPath");

    function Close_Figure (The_Hdc:	in Hdc) return Bool;
    pragma Import (StdCall, Close_Figure, "CloseFigure");

    function End_Path (The_Hdc:	in Hdc) return Bool;
    pragma Import (StdCall, End_Path, "EndPath");

    function Stroke_Path (The_Hdc:	in Hdc) return Bool;
    pragma Import (StdCall, Stroke_Path, "StrokePath");

    function Flatten_Path (The_Hdc:	in Hdc) return Bool;
    pragma Import (StdCall, Flatten_Path, "FlattenPath");

    function Fill_Path (The_Hdc:	in Hdc) return Bool;
    pragma Import (StdCall, Fill_Path, "FillPath");


    type Byte_List_Type is array (Integer range <>) of aliased Byte;

    function Get_Path (The_Hdc:	    in     Hdc;
		       Points:	    access Point_Type; -- Really a point list.
		       Types:	    access Byte; -- Really a byte list.
		       Size:	    in     Int) return Int;
    pragma Import (StdCall, Get_Path, "GetPath");

    function Get_Path_Size (The_Hdc:	    in     Hdc;
			    Points:	    in	   Int := 0;
			    Types:	    in	   Int := 0;
			    Size:	    in     Int := 0) return Int;
    pragma Import (StdCall, Get_Path_Size, "GetPath");
	-- Get Path Size returns the size of a Path; only the first parameter
	-- is used.

    function Path_To_Region (The_Hdc:	in Hdc) return HRegion;
    pragma Import (StdCall, Path_To_Region, "PathToRegion");

    function Get_Miter_Limit (The_Hdc:	in     Hdc;
			      Limit:	access Float) return Bool;
    pragma Import (StdCall, Get_Miter_Limit, "GetMiterLimit");

    function Set_Miter_Limit (The_Hdc:	    in     Hdc;
			      New_Limit:    in     Float;
			      Old_Limit:    access Float) return Bool;
    pragma Import (StdCall, Set_Miter_Limit, "SetMiterLimit");

    function Stroke_And_Fill_Path (The_Hdc:	in Hdc) return Bool;
    pragma Import (StdCall, Stroke_And_Fill_Path, "StrokeAndFillPath");

    function Select_Clip_Path (The_Hdc:	in Hdc;
    			       Mode:	in Int) return Bool;
    pragma Import (StdCall, Select_Clip_Path, "SelectClipPath");

    function Widen_Path (The_Hdc:	in Hdc) return Bool;
    pragma Import (StdCall, Widen_Path, "WidenPath");

    -- Bitmap-related routines:

    function Create_Bitmap (Width       : Int;   -- note width comes first
			    Height      : Int;
			    Planes      : UInt;
			    Pixel_Width : Uint;
			    Data_Ptr    : Pixel_Byte_Ptr_Type) return HBitmap;
    pragma Import (StdCall, Create_Bitmap, "CreateBitmap");

    function Create_DIB_Pattern_Brush_Pt (
    			DIB_Packed:	in DIB_Info_Header_Ptr_Type;
				--Points to header, color table and bits
			Usage:		in     UInt) return HBrush;
    pragma Import (StdCall, Create_DIB_Pattern_Brush_Pt, "CreateDIBPatternBrushPt");

    function Stretch_DIBits (The_Hdc:	    in Hdc;
			     X_Dest:	    in Int;
			     Y_Dest:	    in Int;
			     Dest_Width:    in Int;
			     Dest_Height:   in Int;
			     X_Src:	    in Int;
			     Y_Src:	    in Int;
			     Src_Width:	    in Int;
			     Src_Height:    in Int;
			     Bits:	    in Pixel_Byte_Ptr_Type;
			     Bits_Info:	    in  DIB_Info_Header_Ptr_Type;
				--/\ really points to header AND color table
			     Usage:	    UInt;
			     Rop:	    DWord) return Int;
    pragma Import (StdCall, Stretch_DIBits, "StretchDIBits");

    function Create_DIBitmap (The_Hdc:	    in  Hdc;
			      BMIH:	    in  DIB_Info_Header_Ptr_Type;
			      WInit:	    in  DWord;
			      Bit_Init:	    in  Pixel_Byte_Ptr_Type;
			      BMI:	    in  DIB_Info_Header_Ptr_Type;
				--/\ really points to header AND color table
			      Usage:	    in  UInt) return HBitmap;
    pragma Import (StdCall, Create_DIBitmap, "CreateDIBitmap");

    function Set_DIBits (The_Hdc:	in Hdc;
			 Bitmap:	in HBitmap;
			 Start_Scan:	in UInt;
			 Scan_Lines:	in UInt;
			 Bits:		in Pixel_Byte_Ptr_Type;
			 BMI:		in DIB_Info_Header_Ptr_Type;
				--/\ really points to header AND color table
			 Color_Use:	in UInt) return Int;
    pragma Import (StdCall, Set_DIBits, "SetDIBits");

    function Get_DIBits (The_Hdc:	in Hdc;
			 Bitmap:	in HBitmap;
			 Start_Scan:	in UInt;
			 Scan_Lines:	in UInt;
			 Bits:		in Pixel_Byte_Ptr_Type;
			 BPI:		in DIB_Info_Header_Ptr_Type;
				--/\ really points to header AND color table
			 Usage:		in UInt) return Int;
    pragma Import (StdCall, Get_DIBits, "GetDIBits");

--    function Create_Bitmap_Indirect (Bitmap:	access DDB_Info_Type)
--				return HBitmap;
--    pragma Import (StdCall, Create_Bitmap_Indirect, "CreateBitmapIndirect");

    function Create_Compatible_Bitmap (The_Hdc:	in Hdc;
				       Width:	in Int;
				       Height:	in Int) return HBitmap;
    pragma Import (StdCall, Create_Compatible_Bitmap, "CreateCompatibleBitmap");

    function Pat_Blt (The_Hdc:	in Hdc;
		      X_Left:	in Int;
		      Y_Left:	in Int;
		      Width:	in Int;
		      Height:	in Int;
		      Rop:	DWord) return Bool;
    pragma Import (StdCall, Pat_Blt, "PatBlt");

    function Bit_Blt (The_Hdc:	in Hdc;
		      X_Dest:	in Int;
		      Y_Dest:	in Int;
		      Width:	in Int;
		      Height:	in Int;
		      Src_DC:	in Hdc;
		      X_Src:	in Int;
		      Y_Src:	in Int;
		      Rop:	in DWord) return Bool;
    pragma Import (StdCall, Bit_Blt, "BitBlt");

    function Stretch_Blt (Dest:		    in Hdc;
			  X_Origin_Dest:    in Int;
			  Y_Origin_Dest:    in Int;
			  Width_Dest:	    in Int;
			  Height_Dest:	    in Int;
			  Src:		    in Hdc;
			  X_Origin_Src:	    in Int;
			  Y_Origin_Src:	    in Int;
			  Width_Src:	    in Int;
			  Height_Src:	    in Int;
			  Rop:		    in DWord) return Bool;
    pragma Import (StdCall, Stretch_Blt, "StretchBlt");

    function Get_Stretch_Blt_Mode (The_Hdc:	    in Hdc) return Int;
    pragma Import (StdCall, Get_Stretch_Blt_Mode, "GetStretchBltMode");

    function Set_Stretch_Blt_Mode (The_Hdc:	    in Hdc;
				   Stretch_Mode:    in Int) return Int;
    pragma Import (StdCall, Set_Stretch_Blt_Mode, "SetStretchBltMode");

    function Load_Bitmap (Instance:	in HInstance;
			  Bitmap_Name:	in Lpcstr) return HBitmap;
    pragma Import (StdCall, Load_Bitmap, "LoadBitmapA");

    function Create_DIB_Section (The_Hdc:	in   Hdc;
				 Bmi:		in   DIB_Info_Header_Ptr_Type;
				 Usage:		in   UInt;
				 Ptr_Bits:	access Pixel_Byte_Ptr_Type;
				 Section:	in   UInt;
				 Offset:	in   DWord) return HBitmap;
    pragma Import (StdCall, Create_DIB_Section, "CreateDIBSection");

    function Get_Bitmap_Dimension_Ex (Bitmap:	in HBitmap;
				      Dim:	access Claw.Size_Type) return Bool;
    pragma Import (StdCall, Get_Bitmap_Dimension_Ex, "GetBitmapDimensionEx");

    function Get_DIB_Color_Table (The_Hdc:	in Hdc;
				  Start_Index:	in UInt;
				  Entries:	in UInt;
				  Colors:       access Claw.Colors.DIB_Color_Type) return UInt;
				    --/\ Points to 1st in list
    pragma Import (StdCall, Get_DIB_Color_Table, "GetDIBColorTable");

    function Get_Pixel (The_Hdc:	in Hdc;
			X_Pos:		in Int;
			Y_Pos:		in Int) return Claw.Colors.Color_Type;
    pragma Import (StdCall, Get_Pixel, "GetPixel");

    function Mask_Blt (Dest:		in Hdc;
		       X_Dest:		in Int;
		       Y_Dest:		in Int;
		       Width:		in Int;
		       Height:		in Int;
		       Src_Hdc:		in Hdc;
		       X_Src:		in Int;
		       Y_Src:		in Int;
		       Mask:		in HBitmap;
		       X_Mask:		in Int;
		       Y_Mask:		in Int;
		       Rop:		in DWord) return Bool;
    pragma Import (StdCall, Mask_Blt, "MaskBlt");

    function Plg_Blt (Dest:		in Hdc;
		      The_Points:	in Constant_Access_Point_Type;
			--/\ Points to array of 3 points
		      Src:		in Hdc;
		      X_Src:		in Int;
		      Y_Src:		in Int;
		      Width:		in Int;
		      Height:		in Int;
		      Mask:		in HBitmap;
		      X_Mask:		in Int;
		      Y_Mask:		in Int) return Bool;
    pragma Import (StdCall, Plg_Blt, "PlgBlt");

    function Set_Bitmap_Dimension_Ex (Bitmap:	in HBitmap;
				      Width:	in Int;
				      Height:	in Int;
				      Size:	access Claw.Size_Type) return Bool;
    pragma Import (StdCall, Set_Bitmap_Dimension_Ex, "SetBitmapDimensionEx");

    type Constant_Access_DIB_Color_Type is access constant Claw.Colors.DIB_Color_Type;

    function Set_DIB_Color_Table (The_Hdc:	in Hdc;
				  Start_Index:	in UInt;
				  Entries:	in UInt;
				  Colors:       Constant_Access_DIB_Color_Type) return UInt;
				    --/\ Points to 1st in list
    pragma Import (StdCall, Set_DIB_Color_Table, "SetDIBColorTable");

    function Set_DIBits_To_Device (The_Hdc:	in Hdc;
				   X_Dest:	in Int;
				   Y_Dest:	in Int;
				   Width:	in DWord;
				   Height:	in DWord;
				   X_Src:	in Int;
				   Y_Src:	in Int;
				   Start_Scan:	in UInt;
				   Scan_Lines:	in UInt;
				   Bits:	in Pixel_Byte_Ptr_Type;
				   BMI:		in DIB_Info_Header_Ptr_Type;
				    --/\ really points to header AND color table
				   Color_Use:	in UInt) return Int;
    pragma Import (StdCall, Set_DIBits_To_Device, "SetDIBitsToDevice");

    function Set_Pixel (The_Hdc:	in Hdc;
			X:		in Int;
			Y:		in Int;
			Color:		in Claw.Colors.Color_Type) return Claw.Colors.Color_Type;
    pragma Import (StdCall, Set_Pixel, "SetPixel");

    function Set_Pixel_V (The_Hdc:	in Hdc;
			  X:		in Int;
			  Y:		in Int;
			  Color:	in Claw.Colors.Color_Type) return Bool;
    pragma Import (StdCall, Set_Pixel_V, "SetPixelV");

    function Ext_Flood_Fill (The_Hdc:	in Hdc;
			     X_Start:	in Int;
			     Y_Start:	in Int;
			     Color:	in Claw.Colors.Color_Type;
			     Fill_Type:	in UInt) return Bool;
    pragma Import (StdCall, Ext_Flood_Fill, "ExtFloodFill");

    -- Icon operations:

    function Copy_Icon (Icon:	in HIcon) return HIcon;
    pragma Import (StdCall, Copy_Icon, "CopyIcon");

    function Destroy_Icon (Icon:	in HIcon) return Bool;
    pragma Import (StdCall, Destroy_Icon, "DestroyIcon");

    function Draw_Icon (Dc:	in HDc;
			X:	in Int;
			Y:	in Int;
			Icon:	in HIcon) return Bool;
    pragma Import (StdCall, Draw_Icon, "DrawIcon");

    DI_MASK  : constant Uint := 1;
    DI_IMAGE : constant Uint := 2;
    DI_NORMAL: constant Uint := 3;
    DI_COMPAT: constant Uint := 4;
    DI_DEFAULTSIZE: constant Uint := 8;

    function Draw_Icon_Ex (Dc:		in HDc;
			   X:		in Int;
			   Y:		in Int;
			   Icon:	in HIcon;
			   Width:	in Int;
			   Height:	in Int;
			   Step:	in UInt;
			   Background:  in HBrush;
			   Flags:	in UInt -- DI_xxxx
					) return Bool;
    pragma Import (StdCall, Draw_Icon_Ex, "DrawIconEx");
	-- Windows 4.x and later only.

    function Load_Icon1 (Instance: in HInstance;
			 Name:	   in LpCStr) return HIcon;
    pragma Import (StdCall, Load_Icon1, "LoadIconA");

    function Load_Icon2 (Instance: in HInstance;
			 Code:	   in UInt) return HIcon;
    pragma Import (StdCall, Load_Icon2, "LoadIconA");

    function Load_Icon (Instance: in HInstance;
			Name:	  in LpCStr) return HIcon renames Load_Icon1;
    function Load_Icon (Instance: in HInstance;
			Code:	  in UInt) return HIcon renames Load_Icon2;

    function Load_Icon_Image1 (Instance: in HInstance;
			       Name:	 in LpCStr;
			       UType:	 in UInt := 1; -- Icon.
			       Width:	 in Int;
			       Height:	 in Int;
			       Flags:	 in UInt) return HIcon;
    pragma Import (StdCall, Load_Icon_Image1, "LoadImageA");
	-- Many functions are available only on Windows 4.x and later.

    function Load_Icon_Image2 (Instance: in HInstance;
			       Code:	 in UInt;	-- OIC_xxx value.
			       UType:	 in UInt := 1; -- Icon.
			       Height:	 in Int;
			       Width:	 in Int;
			       Flags:	 in UInt) return HIcon;
    pragma Import (StdCall, Load_Icon_Image2, "LoadImageA");
	-- Many functions are available only on Windows 4.x and later.

    function Load_Icon_Image (Instance: in HInstance;
			      Name:	in LpCStr;
			      UType:	in UInt := 1; -- Icon.
			      Width:	in Int;
			      Height:	in Int;
			      Flags:	in UInt) return HIcon renames Load_Icon_Image1;
    function Load_Icon_Image (Instance: in HInstance;
			      Code:	in UInt;
			      UType:	in UInt := 1; -- Icon.
			      Width:	in Int;
			      Height:	in Int;
			      Flags:	in UInt) return HIcon renames Load_Icon_Image2;

end Claw.Low_Level.GDI;