The R Project SVN R

Rev

Rev 81629 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

/*
 *  GraphApp
 *  --------
 *  Common cross-platform graphics application routines.
 *  Version 2.4 (c) Lachlan Patrick 1996-1998.
 *  This header file is designed to be platform-independent.
 *
 *  Copyright 2006-8    The R Foundation
 *  Copyright 2013-23   The R Core Team
 *
 */

/*
 *  Common cross-platform graphics routines library.
 */

#ifndef _GRAPHAPP_H
#define _GRAPHAPP_H 240

/*
 *  Assume C declarations for C++
 */

#ifdef __cplusplus
extern "C" {
#endif /* begin normal C declarations */

/*
 *  Definition of some constants.
 */

#include <stdio.h>
#include <stdlib.h>

#ifndef Pi
#define Pi 3.14159265359
#endif

/*
 *  Types.
 */

typedef unsigned char GAbyte;

#ifndef objptr
  typedef struct { int kind; } gui_obj;
  typedef gui_obj * objptr;
#endif

typedef unsigned long rgb;    /* red-green-blue colour value */

typedef objptr font;          /* font of certain size and style */
typedef objptr cursor;        /* mouse cursor shape */

typedef objptr drawing;       /* bitmap, window or control */

typedef drawing bitmap;       /* platform-specific bitmap */
typedef drawing window;       /* on-screen window */
typedef drawing control;      /* buttons, text-fields, scrollbars */

typedef control label;        /* text label */
typedef control button;       /* push button */
typedef control checkbox;     /* check-box */
typedef control radiobutton;  /* radio button */
typedef control radiogroup;   /* group of radio buttons */
typedef control field;        /* one-line text field */
typedef control textbox;      /* multi-line text box */
typedef control scrollbar;    /* scroll-bar */
typedef control listbox;      /* list of text */
typedef control progressbar;  /* progress bar */

typedef control menubar;      /* contains menus */
typedef control menu;         /* pull-down menu contains menuitems */
typedef control menuitem;     /* a single item in a pull-down menu */

/*
 *  Structures.
 */

typedef struct point point;
typedef struct rect rect;
typedef struct drawstruct drawstruct;
typedef struct drawstruct *drawstate;
typedef struct imagedata imagedata;
typedef struct imagedata *image;

struct point
{
    int x, y;
};

struct rect
{
    int x, y;       /* top-left point inside rect */
    int width, height;  /* width and height of rect */
};

struct drawstruct
{
    drawing dest;
    rgb hue;
    int mode;
    point   p;
    int linewidth;
    font    fnt;
    cursor  crsr;
};

struct imagedata {
    int     depth;
    int     width;
    int     height;
    int     cmapsize;
    rgb *   cmap;
    GAbyte *  pixels;
};

/*
 *  Call-backs.
 */

typedef void (*voidfn)(void);
typedef void (*timerfn)(void *data);
typedef void (*actionfn)(control c);
typedef void (*drawfn)(control c, rect r);
typedef void (*mousefn)(control c, int buttons, point xy);
typedef void (*intfn)(control c, int argument);
typedef void (*keyfn)(control c, int key);
typedef void (*menufn)(menuitem m);
typedef void (*scrollfn)(scrollbar s, int position);
typedef void (*dropfn)(control c, char *data);
typedef void (*imfn)(control c, font *f, point *xy);

/*
 *  Mouse buttons state (bit-fields).
 */

#define NoButton    0x0000
#define LeftButton  0x0001
#define MiddleButton    0x0002
#define RightButton 0x0004

/*
 *  ANSI character codes.
 */

#define BELL    0x07
#define BKSP    0x08
#define VTAB    0x0B
#define FF  0x0C
#define ESC 0x1B

/*
 *  Edit-key codes.
 */

#define INS 0x2041
#define DEL 0x2326
#define HOME    0x21B8
#define END 0x2198
#define PGUP    0x21DE
#define PGDN    0x21DF
#define ENTER   0x2324

/*
 *  Cursor-key codes.
 */

#define LEFT    0x2190
#define UP  0x2191
#define RIGHT   0x2192
#define DOWN    0x2193

/*
 *  Function-key codes.
 */

#define F1  0x276C
#define F2  0x276D
#define F3  0x276E
#define F4  0x276F
#define F5  0x2770
#define F6  0x2771
#define F7  0x2772
#define F8  0x2773
#define F9  0x2774
#define F10 0x2775

/*
 *  Redefined functions.
 */
#define REDEFINE_FUNC_NAMES
#define addpt      GA_addpt
#define subpt      GA_subpt
#define equalpt    GA_equalpt
#define newmenu    GA_newmenu
#define newcontrol GA_newcontrol
#define newwindow  GA_newwindow
/* #define gettext    GA_gettext */
#define settext    GA_settext

#define R_REMAP
#ifdef R_REMAP
#define BringToTop      GA_BringToTop
#define GetCurrentWinPos    GA_GetCurrentWinPos
#define activatecontrol     GA_activatecontrol
#define add_context     GAI_add_context
#define add_strings     GA_add_strings
#define addstatusbar        GA_addstatusbar
#define addto       GA_addto
#define addtooltip      GA_addtooltip
#define adjust_menu     GAI_adjust_menu
#define app_cleanup     GA_appcleanup
#define apperror        GA_apperror
#define apply_to_list       GAI_apply_to_list
#define askUserPass     GA_askUserPass
#define askcdstring     GA_askcdstring
#define askchangedir        GA_askchangedir
#define askfilename     GA_askfilename
#define askfilenames        GA_askfilenames
#define askfilenamewithdir  GA_askfilenamewithdir
#define askfilesave     GA_askfilesave
#define askfilesavewithdir  GA_askfilesavewithdir
#define askok       GA_askok
#define askokcancel     GA_askokcancel
#define askpassword     GA_askpassword
#define askstring       GA_askstring
#define askyesno        GA_askyesno
#define askyesnocancel      GA_askyesnocancel
#define bitblt      GA_bitblt
#define bitmaptoimage       GA_bitmaptoimage
#define bottomleft      GA_bottomleft
#define bottomright     GA_bottomright
#define brighter        GA_brighter
#define changelistbox       GA_changelistbox
#define changescrollbar     GA_changescrollbar
#define char_to_string      GAI_char_to_string
#define check       GA_check
#define checklimittext      GA_checklimittext
#define clear       GA_clear
#define cleartext       GA_cleartext
#define clickbutton            GA_clickbutton
#define clipboardhastext        GA_clipboardhastext
#define clipr       GA_clipr
#define compare_strings     GAI_compare_strings
#define convert32to8        GA_convert32to8
#define convert8to32        GA_convert8to32
#define copy_string     GAI_copy_string
#define copydrawstate       GA_copydrawstate
#define copyimage       GA_copyimage
#define copyrect        GA_copyrect
#define copystringtoclipboard       GA_copystringtoclipboard
#define copytext        GA_copytext
#define copytoclipboard     GA_copytoclipboard
#define countFilenames      GA_countFilenames
#define createbitmap        GA_createbitmap
#define createcursor        GA_createcursor
#define currentcursor       GA_currentcursor
#define currentdrawing      GA_currentdrawing
#define currentfont     GA_currentfont
#define currentlinewidth        GA_currentlinewidth
#define currentmode     GA_currentmode
#define currentpoint        GA_currentpoint
#define currentrgb      GA_currentrgb
#define currenttime     GA_currenttime
#define cuttext     GA_cuttext
#define darker      GA_darker
#define decrease_refcount   GAI_decrease_refcount
#define default_font_charset    GAI_default_font_charset
#define del_all_contexts    GAI_del_all_contexts
#define del_context     GAI_del_context
#define del_string      GAI_del_string
#define delay       GA_delay
#define deletion_traversal  GAI_deletion_traversal
#define delimage        GA_delimage
#define delobj      GA_delobj
#define delstatusbar        GA_delstatusbar
#define deviceheight        GA_deviceheight
#define deviceheightmm      GA_deviceheightmm
#define devicepixelsx       GA_devicepixelsx
#define devicepixelsy       GA_devicepixelsy
#define devicewidth     GA_devicewidth
#define devicewidthmm       GA_devicewidthmm
#define dialog_bg       GA_dialog_bg
#define disable     GA_disable
#define divpt       GA_divpt
#define doevent     GA_doevent
#define draw        GA_draw
#define drawall     GA_drawall
#define drawarc     GA_drawarc
#define drawbrighter        GA_drawbrighter
#define drawdarker      GA_drawdarker
#define drawellipse     GA_drawellipse
#define drawgreyscale       GA_drawgreyscale
#define drawimage       GA_drawimage
#define drawline        GA_drawline
#define drawmonochrome      GA_drawmonochrome
#define drawpoint       GA_drawpoint
#define drawpolygon     GA_drawpolygon
#define drawrect        GA_drawrect
#define drawroundrect       GA_drawroundrect
#define drawstr     GA_drawstr
#define drawtext        GA_drawtext
#define drawto      GA_drawto
#define enable      GA_enable
#define equalr      GA_equalr
#define execapp     GA_execapp
#define exitapp     GA_exitapp
#define fillarc     GA_fillarc
#define fillellipse     GA_fillellipse
#define fillpolygon     GA_fillpolygon
#define fillrect        GA_fillrect
#define fillroundrect       GA_fillroundrect
#define find_object     GAI_find_object
#define find_next_valid_sibling GAI_find_next_valid_sibling
#define find_prev_valid_sibling GAI_find_prev_valid_sibling
#define finddialog      GA_finddialog
#define finish_contexts     GAI_finish_contexts
#define finish_events       GAI_finish_events
#define finish_objects      GAI_finish_objects
#define fix_brush       GAI_fix_brush
#define flashcontrol        GA_flashcontrol
#define float_to_string     GAI_float_to_string
#define fontascent      GA_fontascent
#define fontdescent     GA_fontdescent
#define fontheight      GA_fontheight
#define fontwidth       GA_fontwidth
#define gabeep      GA_gabeep
#define gamainloop      GA_gamainloop
#define gbitblt     GA_gbitblt
#define gchangemenubar      GA_gchangemenubar
#define gchangepopup        GA_gchangepopup
#define gchangescrollbar        GA_gchangescrollbar
#define gcharmetric     GA_gcharmetric
#define gcopy       GA_gcopy
#define gcopyalpha      GA_gcopyalpha
#define gdrawellipse        GA_gdrawellipse
#define gdrawline       GA_gdrawline
#define gdrawpolyline       GA_gdrawpolyline
#define gdrawrect       GA_gdrawrect
#define gdrawstr        GA_gdrawstr
#define gdrawstr1       GA_gdrawstr1
#define gdrawwcs        GA_gdrawwcs
#define getHandle       GA_getHandle
#define getSysFontSize      GA_getSysFontSize
#define get_context     GAI_get_context
#define get_grey_pixel      GAI_get_grey_pixel
#define get_image_pixel     GAI_get_image_pixel
#define get_modeless        GAI_get_modeless
#define get_monochrome_pixel    GAI_get_monochrome_pixel
#define getbackground       GA_getbackground
#define getbitmapdata       GA_getbitmapdata
#define getbitmapdata2      GA_getbitmapdata2
#define getcliprect     GA_getcliprect
#define getcurrentline      GA_getcurrentline
#define getdata     GA_getdata
#define getforeground       GA_getforeground
#define getkeystate     GA_getkeystate
#define getlimittext        GA_getlimittext
#define getlinelength       GA_getlinelength
#define getlistitem     GA_getlistitem
#define getpalette      GA_getpalette
#define getpalettesize      GA_getpalettesize
#define getpastelength      GA_getpastelength
#define getpixel        GA_getpixel
#define getpixels       GA_getpixels
#define getseltext      GA_getseltext
#define getstringfromclipboard      GA_getstringfromclipboard
#define gettextfont     GA_gettextfont
#define getvalue        GA_getvalue
#define gfillellipse        GA_gfillellipse
#define gfillpolygon        GA_gfillpolygon
#define gfillrect       GA_gfillrect
#define ggetcliprect        GA_ggetcliprect
#define ggetkeystate        GA_ggetkeystate
#define ggetmodified        GA_ggetmodified
#define ggetpixel       GA_ggetpixel
#define ghasfixedwidth      GA_ghasfixedwidth
#define ginvert     GA_ginvert
#define gmenubar        GA_gmenubar
#define gnewfont        GA_gnewfont
#define gnewfont2       GA_gnewfont2
#define goldfillellipse     GA_goldfillellipse
#define gpopup      GA_gpopup
#define gprintf     GA_gprintf
#define growr       GA_growr
#define gscroll     GA_gscroll
#define gsetcliprect        GA_gsetcliprect
#define gsetcursor      GA_gsetcursor
#define gsetpolyfillmode    GA_gsetpolyfillmode
#define gsetmodified        GA_gsetmodified
#define gsetpixel       GA_gsetpixel
#define gstrrect        GA_gstrrect
#define gstrsize        GA_gstrsize
#define gstrwidth       GA_gstrwidth
#define gwcharmetric        GA_gwcharmetric
#define gwcswidth       GA_gwcswidth
#define gwdrawstr1      GA_gwdrawstr1
#define handle_control      GAI_handle_control
#define handle_findreplace  GAI_handle_findreplace
#define handle_menu_id      GAI_handle_menu_id
#define handle_menu_key     GAI_handle_menu_key
#define has_transparent_pixels  GAI_has_transparent_pixels
#define hide            GA_hide
#define hide_window     GAI_hide_window
#define highlight       GA_highlight
#define imagedepth      GA_imagedepth
#define imageheight     GA_imageheight
#define imagetobitmap       GA_imagetobitmap
#define imagewidth      GA_imagewidth
#define increase_refcount   GAI_increase_refcount
#define init_contexts       GAI_init_contexts
#define init_cursors        GAI_init_cursors
#define init_events     GAI_init_events
#define init_fonts      GAI_init_fonts
#define init_menus      GAI_init_menus
#define init_objects        GAI_init_objects
#define initapp         GA_initapp
#define inserttext      GA_inserttext
#define insetr          GA_insetr
#define int_to_string       GAI_int_to_string
#define invertrect      GA_invertrect
#define isTopmost       GA_isTopmost
#define ischecked       GA_ischecked
#define isenabled       GA_isenabled
#define ishighlighted       GA_ishighlighted
#define isiconic        GA_isiconic
#define ismdi           GA_ismdi
#define isselected      GA_isselected
#define isUnicodeWindow     GA_isUnicodeWindow
#define isvisible       GA_isvisible
#define lineto          GA_lineto
#define load_gif        GAI_load_gif
#define loadbitmap      GA_loadbitmap
#define loadcursor      GA_loadcursor
#define loadimage       GA_loadimage
#define memalloc        GAI_memalloc
#define memexpand       GAI_memexpand
#define memfree     GAI_memfree
#define memjoin     GAI_memjoin
#define memlength       GAI_memlength
#define memrealloc      GAI_memrealloc
#define midpt       GA_midpt
#define modeless_active     GA_modeless_active
#define move_to_front       GAI_move_to_front
#define moveto      GA_moveto
#define mulpt       GA_mulpt
#define myAppendMenu        GA_myAppendMenu
#define myGetSysColor       GA_myGetSysColor
#define myMessageBox        GA_myMessageBox
#define nametorgb       GA_nametorgb
#define new_font_object     GA_new_font_object
#define new_object      GAI_new_object
#define new_string      GAI_new_string
#define newbitmap       GA_newbitmap
#define newbutton       GA_newbutton
#define newcheckbox     GA_newcheckbox
#define newcursor       GA_newcursor
#define newdrawing      GA_newdrawing
#define newdropfield        GA_newdropfield
#define newdroplist     GA_newdroplist
#define newfield        GA_newfield
#define newfield_no_border      GA_newfield_no_border
#define newfont     GA_newfont
#define newimage        GA_newimage
#define newimagebutton      GA_newimagebutton
#define newimagecheckbox        GA_newimagecheckbox
#define newlabel        GA_newlabel
#define newlistbox      GA_newlistbox
#define newmdimenu      GA_newmdimenu
#define newmenubar      GA_newmenubar
#define newmenuitem     GA_newmenuitem
#define newmetafile     GA_newmetafile
#define newmultilist        GA_newmultilist
#define newpassword     GA_newpassword
#define newpicture      GA_newpicture
#define newpoint        GA_newpoint
#define newpopup        GA_newpopup
#define newprinter      GA_newprinter
#define newprogressbar      GA_newprogressbar
#define newradiobutton      GA_newradiobutton
#define newradiogroup       GA_newradiogroup
#define newrect     GA_newrect
#define newrichtextarea     GA_newrichtextarea
#define newscrollbar        GA_newscrollbar
#define newsubmenu      GA_newsubmenu
#define newtextarea     GA_newtextarea
#define newtextbox      GA_newtextbox
#define newtoolbar      GA_newtoolbar
#define newtoolbutton       GA_newtoolbutton
#define nextpage        GA_nextpage
#define objdepth        GA_objdepth
#define objheight       GA_objheight
#define objrect     GA_objrect
#define objwidth        GA_objwidth
#define oldfillellipse      GA_oldfillellipse
#define parentwindow        GA_parentwindow
#define pastetext       GA_pastetext
#define peekevent       GA_peekevent
#define protect_object      GAI_protect_object
#define ptinr       GA_ptinr
#define raddpt      GA_raddpt
#define rcanon      GA_rcanon
#define rcenter     GA_rcenter
#define rdiv        GA_rdiv
#define redraw      GA_redraw
#define remove_context      GAI_remove_context
#define remove_menu_item    GA_remove_menu_item
#define replacedialog       GA_replacedialog
#define resetdrawstate      GA_resetdrawstate
#define resize          GA_resize
#define restoredrawstate    GA_restoredrawstate
#define rgbtoname       GA_rgbtoname
#define rgbtonum        GA_rgbtonum
#define rinr        GA_rinr
#define rmove       GA_rmove
#define rmul        GA_rmul
#define rpt     GA_rpt
#define rsubpt      GA_rsubpt
#define rxr     GA_rxr
#define save_gif        GAI_save_gif
#define saveimage       GA_saveimage
#define scaleimage      GA_scaleimage
#define screen_coords       GA_screen_coords
#define scrollcaret     GA_scrollcaret
#define scrollrect      GA_scrollrect
#define scrolltext      GA_scrolltext
#define selecttext      GA_selecttext
#define selecttextex        GA_selecttextex
#define setaction       GA_setaction
#define setbackground       GA_setbackground
#define setbitmapdata       GA_setbitmapdata
#define setcaret        GA_setcaret
#define setcliprect     GA_setcliprect
#define setclose        GA_setclose
#define setcursor       GA_setcursor
#define setdata     GA_setdata
#define setdel      GA_setdel
#define setdrawmode     GA_setdrawmode
#define setdrawstate        GA_setdrawstate
#define setdrop     GA_setdrop
#define setfont     GA_setfont
#define setforeground       GA_setforeground
#define sethit      GA_sethit
#define setimage        GA_setimage
#define setim       GA_setim
#define setkeyaction        GA_setkeyaction
#define setkeydown      GA_setkeydown
#define setlimittext        GA_setlimittext
#define setlinewidth        GA_setlinewidth
#define setlistitem     GA_setlistitem
#define setmousedown        GA_setmousedown
#define setmousedrag        GA_setmousedrag
#define setmousemove        GA_setmousemove
#define setmouserepeat      GA_setmouserepeat
#define setmousetimer       GA_setmousetimer
#define setmouseup      GA_setmouseup
#define setonfocus      GA_setonfocus
#define setpalette      GA_setpalette
#define setpixel        GA_setpixel
#define setpixels       GA_setpixels
#define setprogressbar      GA_setprogressbar
#define setprogressbarrange     GA_setprogressbarrange
#define setredraw       GA_setredraw
#define setresize       GA_setresize
#define setrgb      GA_setrgb
#define setstatus       GA_setstatus
#define settextfont     GA_settextfont
#define settimer        GA_settimer
#define settimerfn      GA_settimerfn
#define setuserfilter       GA_setuserfilter
#define setvalue        GA_setvalue
#define show        GA_show
#define showcaret   GA_showcaret
#define show_window     GAI_show_window
#define simple_window       GAI_simple_window
#define sortpalette     GA_sortpalette
#define startgraphapp       GA_startgraphapp
#define stepprogressbar     GA_stepprogressbar
#define string_diff     GAI_string_diff
#define string_length       GAI_string_length
#define strrect     GA_strrect
#define strsize     GA_strsize
#define strwidth        GA_strwidth
#define textheight      GA_textheight
#define textselection       GA_textselection
#define textselectionex     GA_textselectionex
#define texturerect     GA_texturerect
#define to_c_string     GAI_to_c_string
#define to_dos_string       GAI_to_dos_string
#define toolbar_hide        GA_toolbar_hide
#define toolbar_show        GA_toolbar_show
#define topleft     GA_topleft
#define topright        GA_topright
#define tree_search     GA_tree_search
#define uncheck     GA_uncheck
#define undotext        GA_undotext
#define unhighlight     GA_unhighlight
#define updatestatus        GA_updatestatus
#define waitevent       GA_waitevent

#define ColorName       GA_ColorName
#define Courier         GA_Courier
#define FixedFont       GA_FixedFont
#define Helvetica       GA_Helvetica
#define MDIFrame        GA_MDIFrame
#define MDIStatus       GA_MDIStatus
#define MDIToolbar      GA_MDIToolbar
#define SystemFont      GA_SystemFont
#define Times           GA_Times
#define TopmostDialogs      GA_TopmostDialogs
#define active_windows      GAI_active_windows
#define app_control_proc    GAI_app_control_proc
#define app_control_procedure   GAI_app_control_procedure
#define app_doc_proc        GAI_app_doc_proc
#define app_drawstate       GAI_app_drawstate
#define app_initialised     GAI_app_initialised
#define app_name        GAI_app_name
#define app_timer_proc      GAI_app_timer_proc
#define app_timer_procedure GAI_app_timer_procedure
#define app_win_proc        GAI_app_win_proc
#define app_work_proc       GAI_app_work_proc
#define child_id        GAI_child_id
#define current         GAI_current
#define current_menu        GAI_current_menu
#define current_menubar     GAI_current_menubar
#define current_window      GAI_current_window
#define dc          GAI_dc
#define edit_control_proc   GAI_edit_control_proc
#define edit_control_procedure  GAI_edit_control_procedure
#define hAccel          GAI_hAccel
#define hwndClient      GA_hwndClient
#define hwndFrame       GAI_hwndFrame
#define hwndMain        GAI_hwndMain
#define is_NT           GA_isNT
#define keystate        GAI_keystate
#define menus_active        GAI_menus_active
#define prev_instance       GAI_prev_instance
#define the_brush       GAI_the_brush
#define the_pen         GAI_the_pen
#define this_instance       GAI_this_instance
#define win_rgb         GAI_win_rgb

#define ArrowCursor     GA_ArrowCursor
#define BlankCursor     GA_BlankCursor
#define CaretCursor     GA_CaretCursor
#define CrossCursor     GA_CrossCursor
#define HandCursor      GA_HandCursor
#define TextCursor      GA_TextCursor
#define WatchCursor     GA_WatchCursor

#define cam_image       GA_cam_image
#define color_image     GA_color_image
#define console1_image      GA_console1_image
#define console_image       GA_console_image
#define copy1_image     GA_copy1_image
#define copy_image      GA_copy_image
#define copypaste_image     GA_copypaste_image
#define cut_image       GA_cut_image
#define erase_image     GA_erase_image
#define help_image      GA_help_image
#define open1_image     GA_open1_image
#define open_image      GA_open_image
#define paste1_image        GA_paste1_image
#define paste_image     GA_paste_image
#define print_image     GA_print_image
#define save_image      GA_save_image
#define stop_image      GA_stop_image

#define askfilenameW        GA_askfilenameW
#define askfilenamesW       GA_askfilenamesW
#define askfilesaveW        GA_askfilesaveW
#define gcopyalpha2     GA_gcopyalpha2
#define gdrawimage      GA_gdrawimage
#define gfillpolypolygon    GA_gfillpolypolygon
#define gmaskimage      GAI_gmaskimage
#define gstrwidth1      GA_gstrwidth1
#define setuserfilterW      GA_setuserfilterW
#endif

/*
 *  General functions.
 */

int initapp(int argc, char *argv[]);
void    exitapp(void);

void    drawall(void);
int peekevent(void);
void    waitevent(void);
int doevent(void);
void    mainloop(void);

int execapp(char *cmd);

/*void  beep(void);*/

/*
 *  Point and rectangle arithmetic.
 */

point   newpoint(int x, int y);
rect    newrect(int left, int top, int width, int height);
rect    rpt(point min, point max);

#define pt(x,y)         newpoint((x),(y))
#define rect(x,y,w,h)   newrect((x),(y),(w),(h))

point   topleft(rect r);
point   bottomright(rect r);
point   topright(rect r);
point   bottomleft(rect r);

point   addpt(point p1, point p2);
point   subpt(point p1, point p2);
point   midpt(point p1, point p2);
point   mulpt(point p1, int i);
point   divpt(point p1, int i);
rect    rmove(rect r, point p);
rect    raddpt(rect r, point p);
rect    rsubpt(rect r, point p);
rect    rmul(rect r, int i);
rect    rdiv(rect r, int i);
rect    growr(rect r, int w, int h);
rect    insetr(rect r, int i);
rect    rcenter(rect r1, rect r2);
int ptinr(point p, rect r);
int rinr(rect r1, rect r2);
int rxr(rect r1, rect r2);
int equalpt(point p1, point p2);
int equalr(rect r1, rect r2);
rect    clipr(rect r1, rect r2);
rect    rcanon(rect r);

/*
 *  Colour functions and constants.
 */

#define rgb(r,g,b)    ((((rgb)r)<<16)|(((rgb)g)<<8)|((rgb)b))
#define getalpha(col) (((col)>>24)&0x00FFUL)
#define getred(col)   (((col)>>16)&0x00FFUL)
#define getgreen(col) (((col)>>8)&0x00FFUL)
#define getblue(col)  ((col)&0x00FFUL)

void    setrgb(rgb c);
#define setcolor(c)  setrgb(c)
#define setcolour(c) setrgb(c)

/* changed to avoid clashes with w32api 2.0 */
#define gaRed       0x00FF0000UL
#define gaGreen     0x0000FF00UL
#define gaBlue      0x000000FFUL


#define Transparent     0xFFFFFFFFUL

#define Black       0x00000000UL
#define White       0x00FFFFFFUL
#define Yellow      0x00FFFF00UL
#define Magenta     0x00FF00FFUL
#define Cyan        0x0000FFFFUL

#define Grey        0x00808080UL
#define Gray        0x00808080UL
#define LightGrey   0x00C0C0C0UL
#define LightGray   0x00C0C0C0UL
#define DarkGrey    0x00404040UL
#define DarkGray    0x00404040UL

#define DarkBlue    0x00000080UL
#define DarkGreen   0x00008000UL
#define DarkRed     0x008B0000UL/* changed to match rgb */
#define LightBlue   0x0080C0FFUL
#define LightGreen  0x0080FF80UL
#define LightRed    0x00FFC0FFUL
#define Pink        0x00FFAFAFUL
#define Brown       0x00603000UL
#define Orange      0x00FF8000UL
#define Purple      0x00C000FFUL
#define Lime        0x0080FF00UL

/*
 *  Context functions for bitmaps, windows, controls.
 */

void    addto(control dest);
void    drawto(drawing dest);
void    setlinewidth(int width);

/*
 *  Transfer modes for drawing operations, S=source, D=destination.
 *  The modes are arranged so that, for example, (~D)|S == notDorS.
 */

void    setdrawmode(int mode);

#define Zeros    0x00
#define DnorS    0x01
#define DandnotS 0x02
#define notS     0x03
#define notDandS 0x04
#define notD     0x05
#define DxorS    0x06
#define DnandS   0x07
#define DandS    0x08
#define DxnorS   0x09
#define GA_D     0x0A
#define DornotS  0x0B
#define GA_S     0x0C
#define notDorS  0x0D
#define DorS     0x0E
#define Ones     0x0F

/*
 *  Drawing functions.
 */

void    bitblt(drawing dest, drawing src, point dp, rect sr, int mode);

void    scrollrect(point dp, rect sr);
void    copyrect(drawing src, point dp, rect sr);
void    texturerect(drawing src, rect r);
void    invertrect(rect r);

rgb getpixel(point p);
void    setpixel(point p, rgb c);

/*
 *  Drawing using the current colour.
 */

void    moveto(point p);
void    lineto(point p);

void    drawpoint(point p);
void    drawline(point p1, point p2);
void    drawrect(rect r);
void    fillrect(rect r);
void    drawarc(rect r, int start_angle, int end_angle);
void    fillarc(rect r, int start_angle, int end_angle);
void    drawellipse(rect r);
void    fillellipse(rect r);
void    drawroundrect(rect r);
void    fillroundrect(rect r);
void    drawpolygon(point *p, int n);
void    fillpolygon(point *p, int n);

/*
 *  Drawing text, selecting fonts.
 */

font    newfont(const char *name, int style, int size);
void    setfont(font f);

int fontwidth(font f);
int fontheight(font f);
int fontascent(font f);
int fontdescent(font f);

#define getascent(f)    fontascent(f)
#define getdescent(f)   fontdescent(f)

int strwidth(font f, const char *s);
point   strsize(font f, const char *s);
rect    strrect(font f, const char *s);

int drawstr(point p, const char *str);
int textheight(int width, const char *text);
const char *drawtext(rect r, int alignment, const char *text);
int gprintf(const char *fmt, ...);

/*
 *  Text styles and alignments.
 */

#define Plain       0x0000
#define Bold        0x0001
#define Italic      0x0002
#define BoldItalic  0x0003
#define SansSerif   0x0004
#define FixedWidth  0x0008
#define Wide        0x0010
#define Narrow      0x0020

#define AlignTop        0x0000
#define AlignBottom     0x0100
#define VJustify        0x0200
#define VCenter         0x0400
#define VCentre         0x0400
#define AlignLeft       0x0000
#define AlignRight      0x1000
#define Justify         0x2000
#define Center          0x4000
#define Centre          0x4000
#define AlignCenter     0x4000
#define AlignCentre     0x4000
#define Underline       0x0800

/*
 *  Find the current state of drawing.
 */

drawing currentdrawing(void);
rgb currentrgb(void);
#define currentcolor() currentrgb()
#define currentcolour() currentrgb()
int currentmode(void);
point   currentpoint(void);
int currentlinewidth(void);
font    currentfont(void);
cursor  currentcursor(void);

/*
 *  Find current keyboard state.
 */

int getkeystate(void);

#define AltKey  0x0001
#define CmdKey  0x0001
#define CtrlKey     0x0002
#define OptionKey   0x0002
#define ShiftKey    0x0004

/*
 *  Bitmaps.
 */

bitmap  newbitmap(int width, int height, int depth);
bitmap  loadbitmap(const char *name);
bitmap  imagetobitmap(image img);
bitmap  createbitmap(int width, int height, int depth, GAbyte *data);
void    setbitmapdata(bitmap b, GAbyte data[]);
void    getbitmapdata(bitmap b, GAbyte data[]);
void    getbitmapdata2(bitmap b, GAbyte **data);

/*
 *  Images.
 */

image   newimage(int width, int height, int depth);
image   copyimage(image img);
void    delimage(image img);

int     imagedepth(image img);
int     imagewidth(image img);
int     imageheight(image img);

void    setpixels(image img, GAbyte pixels[]);
GAbyte *    getpixels(image img);

void    setpalette(image img, int length, rgb cmap[]);
rgb *   getpalette(image img);
int getpalettesize(image img);

image   scaleimage(image src, rect dr, rect sr);
image   convert32to8(image img);
image   convert8to32(image img);
void    sortpalette(image img);

image   loadimage(const char *filename);
void    saveimage(image img, const char *filename);

void    drawimage(image img, rect dr, rect sr);
void    drawmonochrome(image img, rect dr, rect sr);
void    drawgreyscale(image img, rect dr, rect sr);
#define drawgrayscale drawgreyscale
void    drawdarker(image img, rect dr, rect sr);
void    drawbrighter(image img, rect dr, rect sr);

/*
 *  Windows.
 */

window  newwindow(const char *name, rect r, long flags);
void    show(window w);
void    hide(window w);
rect    GetCurrentWinPos(window obj);

/*
 *  Window creation flags.
 */

#define SimpleWindow    0x00000000L

#define Menubar     0x00000010L
#define Titlebar    0x00000020L
#define Closebox    0x00000040L
#define Resize      0x00000080L
#define Maximize    0x00000100L
#define Minimize    0x00000200L
#define HScrollbar  0x00000400L
#define VScrollbar  0x00000800L
#define CanvasSize  0x00400000L

#define Modal       0x00001000L
#define Floating    0x00002000L
#define Centered    0x00004000L
#define Centred     0x00004000L

#define Workspace   0x00010000L
#define Document    0x00020000L
#define ChildWindow 0x00040000L

#define TrackMouse  0x00080000L

#define UsePalette  0x00100000L
#define UseUnicode  0x00200000L

#define SetUpCaret  0x00400000L

#define StandardWindow  (Titlebar|Closebox|Resize|Maximize|Minimize)

/*
 *  Functions which work for bitmaps, windows and controls.
 */

int objdepth(objptr obj);
rect    objrect(objptr obj);
int objwidth(objptr obj);
int objheight(objptr obj);
void    delobj(objptr obj);

#define getdepth(obj)   objdepth((objptr)(obj))
#define getrect(obj)    objrect((objptr)(obj))
#define getwidth(obj)   objwidth((objptr)(obj))
#define getheight(obj)  objheight((objptr)(obj))
#define del(obj)    delobj((objptr)(obj))

/*
 *  Setting window and control callback functions.
 */

void    setaction(control c, actionfn fn);
void    sethit(control c, intfn fn);
void    setdel(control c, actionfn fn);
void    setclose(control c, actionfn fn);

void    setredraw(control c, drawfn fn);
void    setresize(control c, drawfn fn);

void    setkeydown(control c, keyfn fn);
void    setkeyaction(control c, keyfn fn);

void    setmousedown(control c, mousefn fn);
void    setmousedrag(control c, mousefn fn);
void    setmouseup(control c, mousefn fn);
void    setmousemove(control c, mousefn fn);
void    setmouserepeat(control c, mousefn fn);

void    setdrop(control c, dropfn fn);

void    setonfocus(control c, actionfn fn);

void    setim(control c, imfn fn);

/*
 *  Using windows and controls.
 */

void    clear(control c);
void    draw(control c);
void    redraw(control c);
void    resize(control c, rect r);

void    show(control c);
void    hide(control c);
int isvisible(control c);

void    enable(control c);
void    disable(control c);
int isenabled(control c);

void    check(control c);
void    uncheck(control c);
int ischecked(control c);

void    highlight(control c);
void    unhighlight(control c);
int ishighlighted(control c);

void    flashcontrol(control c);
void    activatecontrol(control c);

/*
 *  Changing the state of a control.
 */

void    settext(control c, const char *newtext);
char *  GA_gettext(control c);
#define setname(c,newname) settext(c,newname)
#define getname(c) GA_gettext(c)

void    settextfont(control c, font f);
font    gettextfont(control c);

void    setforeground(control c, rgb fg);
rgb getforeground(control c);
void    setbackground(control c, rgb bg);
rgb getbackground(control c);

void    setvalue(control c, int value);
int getvalue(control c);
void    setdata(control c, void *data);
void *  getdata(control c);

window  parentwindow(control c);

/*
 *  Control states.
 */

#define GA_Visible  0x0001L
#define GA_Enabled  0x0002L
#define GA_Checked  0x0004L
#define GA_Highlighted  0x0008L
#define GA_Armed    0x0010L
#define GA_Focus    0x0020L

/*
 *  Create buttons, scrollbars, controls etc on the current window.
 */

control   newcontrol(const char *text, rect r);

drawing   newdrawing(rect r, drawfn fn);
drawing   newpicture(image img, rect r);

button    newbutton(const char *text, rect r, actionfn fn);
button    newimagebutton(image img, rect r, actionfn fn);
void      setimage(control c, image img);

checkbox  newcheckbox(const char *text, rect r, actionfn fn);
checkbox  newimagecheckbox(image img, rect r, actionfn fn);

radiobutton newradiobutton(const char *text, rect r, actionfn fn);
radiogroup  newradiogroup(void);

scrollbar newscrollbar(rect r, int max, int pagesize, scrollfn fn);
void      changescrollbar(scrollbar s, int where, int max, int size);

label     newlabel(const char *text, rect r, int alignment);
field     newfield(const char *text, rect r);
field     newpassword(const char *text, rect r);
textbox   newtextbox(const char *text, rect r);
textbox   newtextarea(const char *text, rect r);
textbox   newrichtextarea(const char *text, rect r);

listbox   newlistbox(const char *list[], rect r, scrollfn fn, actionfn dble);
listbox   newdroplist(const char *list[], rect r, scrollfn fn);
listbox   newdropfield(const char *list[], rect r, scrollfn fn);
listbox   newmultilist(const char *list[], rect r, scrollfn fn, actionfn dble);
int   isselected(listbox b, int index);
void      setlistitem(listbox b, int index);
int   getlistitem(listbox b);
void      changelistbox(listbox b, const char *new_list[]);

progressbar newprogressbar(rect r, int pmin, int pmax, int incr, int smooth);
void setprogressbar(progressbar obj, int n);
void stepprogressbar(progressbar obj, int n);
void setprogressbarrange(progressbar obj, int pbmin, int pbmax);


menubar   newmenubar(actionfn adjust_menus);
menu      newsubmenu(menu parent, const char *name);
menu      newmenu(const char *name);
menuitem  newmenuitem(const char *name, int key, menufn fn);

/*
 *  Text editing functions.
 */

void  undotext(textbox t);
void  cuttext(textbox t);
void  copytext(textbox t);
void  cleartext(textbox t);
void  pastetext(textbox t);
void  inserttext(textbox t, const char *text);
void  selecttext(textbox t, long start, long end);
void  textselection(textbox t, long *start, long *end);

/*
 *  Dialogs.
 */

#define YES    1
#define NO    -1
#define CANCEL 0

void    apperror(const char *errstr);
void    askok(const char *info);
int askokcancel(const char *question);
int askyesno(const char *question);
int askyesnocancel(const char *question);
char *  askstring(const char *question, const char *default_string);
char *  askpassword(const char *question, const char *default_string);
char *  askfilename(const char *title, const char *default_name);
char *  askfilenamewithdir(const char *title, const char *default_name, const char *dir);
char *  askfilesave(const char *title, const char *default_name);
char *  askUserPass(const char *title);
void    clickbutton(window w, button b);

/*
 *  Time functions.
 */

int settimer(unsigned millisec);
void    settimerfn(timerfn timeout, void *data);
int setmousetimer(unsigned millisec);
void    delay(unsigned millisec);
long    currenttime(void);

/*
 *  Cursors.
 */

cursor  newcursor(point hotspot, image img);
cursor  createcursor(point offset, GAbyte *white_mask, GAbyte *black_shape);
cursor  loadcursor(const char *name);
void    setcursor(cursor c);

/*
 *  Change the drawing state.
 */

drawstate copydrawstate(void);
void    setdrawstate(drawstate saved_state);
void    restoredrawstate(drawstate saved_state);
void    resetdrawstate(void);

/*
 *  Caret-related functions.
 */
 
void    setcaret(control c, int x, int y, int width, int height);
void    showcaret(control c, int showing);

/*
 *  Library supplied variables.
 */

#include <R_ext/libextern.h>
#undef LibExtern
#ifdef GA_DLL_BUILD
# define LibExtern extern
#else
# define LibExtern extern LibImport
#endif

LibExtern font      FixedFont;  /* fixed-width font */
LibExtern cursor    ArrowCursor;    /* normal arrow cursor */
LibExtern cursor    BlankCursor;    /* invisible cursor */
LibExtern cursor    WatchCursor;    /* wait for the computer */
LibExtern cursor    CaretCursor;    /* insert text */
LibExtern cursor    TextCursor; /* insert text */
LibExtern cursor    HandCursor; /* hand pointer */
LibExtern cursor    CrossCursor;    /* cross pointer */
LibExtern font      SystemFont; /* system font */
LibExtern font      Times;  /* times roman font (serif) */
LibExtern font      Helvetica;  /* helvetica font (sans serif) */
LibExtern font      Courier;    /* courier font (fixed width) */

#undef LibExtern
#undef extern

#ifdef __cplusplus
}
#endif /* end normal C declarations */


#ifdef __cplusplus

/* begin C++ declarations */

/*
 *  Point and rectangle arithmetic.
 */

inline point operator +  (point p, point p2)  {p.x+=p2.x; p.y+=p2.y; return p;}
inline point operator -  (point p, point p2)  {p.x-=p2.x; p.y-=p2.y; return p;}
inline point operator += (point& p, point p2) {p.x+=p2.x; p.y+=p2.y; return p;}
inline point operator -= (point& p, point p2) {p.x-=p2.x; p.y-=p2.y; return p;}

inline rect operator +  (rect r, point p)  {r.x+=p.x; r.y+=p.y; return r;}
inline rect operator -  (rect r, point p)  {r.x-=p.x; r.y-=p.y; return r;}
inline rect operator += (rect& r, point p) {r.x+=p.x; r.y+=p.y; return r;}
inline rect operator -= (rect& r, point p) {r.x-=p.x; r.y-=p.y; return r;}

inline rect operator +  (rect r, int i)    {return insetr(r,-i);}
inline rect operator -  (rect r, int i)    {return insetr(r,i);}
inline rect operator ++ (rect& r)          {return r=insetr(r,-1);}
inline rect operator -- (rect& r)          {return r=insetr(r,1);}
inline rect operator += (rect& r, int i)   {return r=insetr(r,-i);}
inline rect operator -= (rect& r, int i)   {return r=insetr(r,i);}

inline int operator == (point p1, point p2) {return equalpt(p1,p2);}
inline int operator == (rect r1, rect r2)   {return equalr(r1,r2);}
inline int operator != (point p1, point p2) {return !equalpt(p1,p2);}
inline int operator != (rect r1, rect r2)   {return !equalr(r1,r2);}

#endif /* end C++ declarations */

#endif /* Common cross-platform graphics library. */