The R Project SVN R

Rev

Rev 6292 | Rev 6458 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6292 Rev 6430
Line 37... Line 37...
37
#include "windows.h"
37
#include "windows.h"
38
 
38
 
39
extern console RConsole;
39
extern console RConsole;
40
extern int AllDevicesKilled;
40
extern int AllDevicesKilled;
41
 
41
 
-
 
42
 
42
	/********************************************************/
43
	/********************************************************/
43
	/* This device driver has been documented so that it be	*/
44
	/* This device driver has been documented so that it be	*/
44
	/* used as a template for new drivers 			*/
45
	/* used as a template for new drivers 			*/
45
	/********************************************************/
46
	/********************************************************/
46
 
47
 
47
#define MM_PER_INCH	25.4	/* mm -> inch conversion */
48
#define MM_PER_INCH	25.4	/* mm -> inch conversion */
48
 
49
 
49
#define TRACEDEVGA(a)
50
#define TRACEDEVGA(a)
50
#define NOBM(a) if(!xd->kind){a;}
51
#define NOBM(a) if(xd->kind==SCREEN){a;}
51
#define CLIP if (xd->clip.width>0) gsetcliprect(_d,xd->clip)
52
#define CLIP if (xd->clip.width>0) gsetcliprect(_d,xd->clip)
52
#define DRAW(a) {drawing _d=xd->gawin;CLIP;a;NOBM(_d=xd->bm;CLIP;a;)}
53
#define DRAW(a) {drawing _d=xd->gawin;CLIP;a;NOBM(_d=xd->bm;CLIP;a;)}
53
#define SHOW  gbitblt(xd->gawin,xd->bm,pt(0,0),getrect(xd->bm));
54
#define SHOW  gbitblt(xd->gawin,xd->bm,pt(0,0),getrect(xd->bm));
54
 
55
 
55
        /********************************************************/
56
        /********************************************************/
Line 63... Line 64...
63
	/* common to all device types (see Graphics.h)		*/
64
	/* common to all device types (see Graphics.h)		*/
64
	/* so go in the GPar structure rather than this device- */
65
	/* so go in the GPar structure rather than this device- */
65
	/* specific structure					*/
66
	/* specific structure					*/
66
	/********************************************************/
67
	/********************************************************/
67
 
68
 
-
 
69
enum DeviceKinds {SCREEN=0, PRINTER, METAFILE, PNG, JPEG};
-
 
70
 
68
typedef struct {
71
typedef struct {
69
    /* R Graphics Parameters */
72
    /* R Graphics Parameters */
70
    /* local device copy so that we can detect */
73
    /* local device copy so that we can detect */
71
    /* when parameter changes */
74
    /* when parameter changes */
72
    int   col;			/* Color */
75
    int   col;			/* Color */
Line 77... Line 80...
77
    double fontangle;
80
    double fontangle;
78
 
81
 
79
    /* X11 Driver Specific */
82
    /* X11 Driver Specific */
80
    /* parameters with copy per x11 device */
83
    /* parameters with copy per x11 device */
81
 
84
 
82
    int   kind;
85
    enum DeviceKinds kind;
83
    int   windowWidth;		/* Window width (pixels) */
86
    int   windowWidth;		/* Window width (pixels) */
84
    int   windowHeight;		/* Window height (pixels) */
87
    int   windowHeight;		/* Window height (pixels) */
85
    int   resize;		/* Window resized */
88
    int   resize;		/* Window resized */
86
    window gawin;		/* Graphics window */
89
    window gawin;		/* Graphics window */
-
 
90
  /*FIXME: we should have union for this stuff and
-
 
91
    maybe change gawin to canvas*/
-
 
92
  /* SCREEN section*/
87
    popup locpopup, grpopup;
93
    popup locpopup, grpopup;
88
    button  stoploc;
94
    button  stoploc;
89
    menubar mbar, mbarloc;
95
    menubar mbar, mbarloc;
90
    menu  msubsave;
96
    menu  msubsave;
-
 
97
    menuitem mpng, mjpeg50, mjpeg75, mjpeg100;
91
    menuitem mgif, mps, mwm, mclpbm, mclpwm, mprint, mclose;
98
    menuitem mps, mwm, mclpbm, mclpwm, mprint, mclose;
92
    menuitem mrec, madd, mreplace, mprev, mnext, mclear, msvar, mgvar;
99
    menuitem mrec, madd, mreplace, mprev, mnext, mclear, msvar, mgvar;
93
    int   recording, replaying, needsave;
100
    int   recording, replaying, needsave;
94
    bitmap bm;
101
    bitmap bm;
-
 
102
  /* PNG and JPEG section */
-
 
103
    FILE *fp;
-
 
104
    int quality;
-
 
105
  /*Used to rescale font size so that bitmap devices have 72dpi */
-
 
106
    int truedpi, wanteddpi; 
95
    rgb   fgcolor;		/* Foreground color */
107
    rgb   fgcolor;		/* Foreground color */
96
    rgb   bgcolor;		/* Background color */
108
    rgb   bgcolor;		/* Background color */
97
    rect  clip;			/* The clipping rectangle */
109
    rect  clip;			/* The clipping rectangle */
98
    int   usefixed;
110
    int   usefixed;
99
    font  fixedfont;
111
    font  fixedfont;
Line 165... Line 177...
165
static double pixelHeight(drawing  d);
177
static double pixelHeight(drawing  d);
166
static double pixelWidth(drawing d);
178
static double pixelWidth(drawing d);
167
static void SetColor(int, DevDesc *);
179
static void SetColor(int, DevDesc *);
168
static void SetFont(int, int, double, DevDesc *);
180
static void SetFont(int, int, double, DevDesc *);
169
static void SetLinetype(int, double, DevDesc *);
181
static void SetLinetype(int, double, DevDesc *);
-
 
182
static int Load_Rbitmap_Dll();
-
 
183
void Unload_Rbitmap_Dll();
-
 
184
static void SaveAsPng(DevDesc *dd,char *fn);
-
 
185
static void SaveAsJpeg(DevDesc *dd,int quality,char *fn);
-
 
186
static void SaveAsBitmap(DevDesc *dd);
170
void  ProcessEvents();
187
void  ProcessEvents();
171
 
188
 
172
 
-
 
173
static void SaveAsGif(DevDesc *dd, char *fn)
-
 
174
{
-
 
175
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
-
 
176
    image img;
-
 
177
    int   l;
-
 
178
 
-
 
179
    l = strlen(fn);
-
 
180
    if ((l < 5) || strcmpi(&fn[l - 4], ".gif")) {
-
 
181
	R_ShowMessage("File extension must be .gif");
-
 
182
	return;
-
 
183
    }
-
 
184
    img = bitmaptoimage(xd->bm);
-
 
185
    if (!img) {
-
 
186
	R_ShowMessage("Insufficient memory to copy graphics device");
-
 
187
	return;
-
 
188
    }
-
 
189
    saveimage(img, fn);
-
 
190
    del(img);
-
 
191
}
-
 
192
 
-
 
193
 
-
 
194
static void PrivateCopyDevice(DevDesc *dd,DevDesc *ndd, char *name)
189
static void PrivateCopyDevice(DevDesc *dd,DevDesc *ndd, char *name)
195
{
190
{
196
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
191
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
197
    gsetcursor(xd->gawin, WatchCursor);
192
    gsetcursor(xd->gawin, WatchCursor);
198
    gsetVar(install(".Device"),
193
    gsetVar(install(".Device"),
Line 268... Line 263...
268
   if (PSDeviceDriver(ndd, fn, paper, family, bg, fg,
263
   if (PSDeviceDriver(ndd, fn, paper, family, bg, fg,
269
		      GConvertXUnits(1.0, NDC, INCHES, dd),
264
		      GConvertXUnits(1.0, NDC, INCHES, dd),
270
		      GConvertYUnits(1.0, NDC, INCHES, dd),
265
		      GConvertYUnits(1.0, NDC, INCHES, dd),
271
		      (double)0, dd->gp.ps, 0, 1))
266
		      (double)0, dd->gp.ps, 0, 1))
272
    /* horizontal=F, onefile=F, pagecentre=T */
267
    /* horizontal=F, onefile=F, pagecentre=T */
273
        PrivateCopyDevice(dd, ndd, "postscript");
268
     PrivateCopyDevice(dd, ndd, "postscript");
274
}
269
}
275
 
270
 
276
 
271
 
277
 
272
 
278
			/* Pixel Dimensions (Inches) */
273
			/* Pixel Dimensions (Inches) */
Line 358... Line 353...
358
	if (oops[0]) {
353
	if (oops[0]) {
359
	    optclosefile();
354
	    optclosefile();
360
	    strcat(oops, optfile());
355
	    strcat(oops, optfile());
361
	    strcat(oops, " will be ignored.");
356
	    strcat(oops, " will be ignored.");
362
	    R_ShowMessage(oops);
357
	    R_ShowMessage(oops);
363
	    for (i = 0; i < fontnum; i++) winfree(fontname);
358
	    for (i = 0; i < fontnum; i++) free(fontname);
364
	    RStandardFonts();
359
	    RStandardFonts();
365
	    notdone = 0;
360
	    notdone = 0;
366
	}
361
	}
367
	if (fontnum == MAXFONT) {
362
	if (fontnum == MAXFONT) {
368
	    optclosefile();
363
	    optclosefile();
Line 377... Line 372...
377
{
372
{
378
    xd->fontface = 1;
373
    xd->fontface = 1;
379
    xd->fontsize = 12;
374
    xd->fontsize = 12;
380
    xd->fontangle = 0.0;
375
    xd->fontangle = 0.0;
381
    xd->usefixed = 0;
376
    xd->usefixed = 0;
382
    xd->font = gnewfont(xd->gawin, fontname[0], fontstyle[0], 12, 0.0);
377
    xd->font = gnewfont(xd->gawin, fontname[0], fontstyle[0], 
-
 
378
			MulDiv(12,xd->wanteddpi,xd->truedpi), 0.0);
383
    if (!xd->font) {
379
    if (!xd->font) {
384
	xd->usefixed = 1;
380
	xd->usefixed = 1;
385
	xd->font = xd->fixedfont = FixedFont;
381
	xd->font = xd->fixedfont = FixedFont;
386
	if (!xd->fixedfont)
382
	if (!xd->fixedfont)
387
	    return 0;
383
	    return 0;
Line 390... Line 386...
390
}
386
}
391
 
387
 
392
 
388
 
393
 
389
 
394
 /* Set the font size and face */
390
 /* Set the font size and face */
395
			/* If the font of this size and at that the specified */
391
/* If the font of this size and at that the specified */
396
			/* rotation is not present it is loaded. */
392
/* rotation is not present it is loaded. */
397
			/* 0 = plain text, 1 = bold */
393
/* 0 = plain text, 1 = bold */
398
			/* 2 = oblique, 3 = bold-oblique */
394
/* 2 = oblique, 3 = bold-oblique */
399
 
395
 
400
#define SMALLEST 8
396
#define SMALLEST 8
401
#define LARGEST 64
397
#define LARGEST 64
402
 
398
 
403
static void SetFont(int face, int size, double rot, DevDesc *dd)
399
static void SetFont(int face, int size, double rot, DevDesc *dd)
404
{
400
{
405
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
401
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
406
 
402
 
407
    if (face < 1 || face > fontnum)
403
    if (face < 1 || face > fontnum)
408
	face = 1;
404
	face = 1;
409
    size = 2 * size / 2;
405
    size = MulDiv(12,xd->wanteddpi,xd->truedpi);
410
    if (size < SMALLEST)
406
    if (size < SMALLEST)
411
	size = SMALLEST;
407
	size = SMALLEST;
412
    if (size > LARGEST)
408
    if (size > LARGEST)
413
	size = LARGEST;
409
	size = LARGEST;
414
    if (!xd->usefixed &&
410
    if (!xd->usefixed &&
Line 526... Line 522...
526
static void HelpClose(window w)
522
static void HelpClose(window w)
527
{
523
{
528
    if (AllDevicesKilled) return;
524
    if (AllDevicesKilled) return;
529
    {
525
    {
530
	DevDesc *dd = (DevDesc *) getdata(w);
526
	DevDesc *dd = (DevDesc *) getdata(w);
531
 
-
 
532
	KillDevice(dd);
527
	KillDevice(dd);
533
    }
528
    }
534
}
529
}
535
 
530
 
536
static void HelpExpose(window w,rect r)
531
static void HelpExpose(window w,rect r)
Line 579... Line 574...
579
  xd->clicked = 2;
574
  xd->clicked = 2;
580
}
575
}
581
 
576
 
582
void  fixslash(char *);
577
void  fixslash(char *);
583
 
578
 
584
static void menugif(control m)
579
static void menufilebitmap(control m)
585
{
580
{
586
    DevDesc *dd = (DevDesc *) getdata(m);
581
    DevDesc *dd = (DevDesc *) getdata(m);
587
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
582
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
588
    char *fn;
583
    char *fn;
589
 
-
 
-
 
584
    if (m==xd->mpng) {
590
    setuserfilter("Gif files (*.gif)\0*.gif\0\0");
585
      setuserfilter("Png files (*.png)\0*.png\0\0");
591
    fn = askfilesave("Gif file", "");
586
      fn = askfilesave("Png file", "");
-
 
587
    } else { 
-
 
588
      setuserfilter("Jpeg files (*.jpeg,*jpg)\0*.jpeg;*.jpg\0\0");
-
 
589
      fn = askfilesave("Jpeg file", "");
-
 
590
    }
592
    if (!fn) return;
591
    if (!fn) return;
593
    fixslash(fn);
592
    fixslash(fn);
594
    gsetcursor(xd->gawin, WatchCursor);
593
    gsetcursor(xd->gawin, WatchCursor);
595
    show(xd->gawin);
594
    show(xd->gawin);
-
 
595
    if (m==xd->mpng) SaveAsPng(dd,fn);
-
 
596
    else if (m==xd->mjpeg50) SaveAsJpeg(dd,50,fn);
-
 
597
    else if (m==xd->mjpeg75) SaveAsJpeg(dd,75,fn);
596
    SaveAsGif(dd,fn);
598
    else SaveAsJpeg(dd,100,fn);
597
    gsetcursor(xd->gawin, ArrowCursor);
599
    gsetcursor(xd->gawin, ArrowCursor);
598
    show(xd->gawin);
600
    show(xd->gawin);
599
}
601
}
600
 
602
 
601
 
603
 
Line 958... Line 960...
958
	disable(xd->mclear);
960
	disable(xd->mclear);
959
    }
961
    }
960
    if (dd->displayList != R_NilValue) {
962
    if (dd->displayList != R_NilValue) {
961
	enable(xd->madd);
963
	enable(xd->madd);
962
	enable(xd->mprint);
964
	enable(xd->mprint);
963
	enable(xd->mgif);
965
	enable(xd->mpng);
-
 
966
	enable(xd->mjpeg50);
-
 
967
	enable(xd->mjpeg75);
-
 
968
	enable(xd->mjpeg100);
964
	enable(xd->mwm);
969
	enable(xd->mwm);
965
	enable(xd->mps);
970
	enable(xd->mps);
966
	enable(xd->mclpwm);
971
	enable(xd->mclpwm);
967
    } else {
972
    } else {
968
	disable(xd->madd);
973
	disable(xd->madd);
969
	disable(xd->mprint);
974
	disable(xd->mprint);
970
	disable(xd->msubsave);
975
	disable(xd->msubsave);
971
	disable(xd->mgif);
976
	disable(xd->mpng);
-
 
977
	disable(xd->mjpeg50);
-
 
978
	disable(xd->mjpeg75);
-
 
979
	disable(xd->mjpeg100);
972
	disable(xd->mwm);
980
	disable(xd->mwm);
973
	disable(xd->mps);
981
	disable(xd->mps);
974
	disable(xd->mclpwm);
982
	disable(xd->mclpwm);
975
    }
983
    }
976
    draw(xd->mbar);
984
    draw(xd->mbar);
Line 993... Line 1001...
993
	/* of course :)						*/
1001
	/* of course :)						*/
994
	/********************************************************/
1002
	/********************************************************/
995
 
1003
 
996
#define MCHECK(m) {if(!(m)) {del(xd->gawin); return 0;}}
1004
#define MCHECK(m) {if(!(m)) {del(xd->gawin); return 0;}}
997
 
1005
 
-
 
1006
static int setupScreenDevice(DevDesc *dd, x11Desc *xd, int w, int h) 
-
 
1007
{
-
 
1008
  menu  m;
-
 
1009
  int   iw, ih;
-
 
1010
  double dw, dh, d;
-
 
1011
 
-
 
1012
  xd->kind = SCREEN;
-
 
1013
  dw = w / pixelWidth(NULL);
-
 
1014
  dh = h / pixelHeight(NULL);
-
 
1015
  if ((dw / devicewidth(NULL)) > 0.85) {
-
 
1016
    d = dh / dw;
-
 
1017
    dw = 0.85 * devicewidth(NULL);
-
 
1018
    dh = d * dw;
-
 
1019
  }
-
 
1020
  if ((dh / deviceheight(NULL)) > 0.85) {
-
 
1021
    d = dw / dh;
-
 
1022
    dh = 0.85 * deviceheight(NULL);
-
 
1023
    dw = d * dh;
-
 
1024
  }
-
 
1025
  iw = dw + 0.5;
-
 
1026
  ih = dh + 0.5;
-
 
1027
  if (!(xd->gawin = newwindow("R Graphics",
-
 
1028
			     rect(devicewidth(NULL) - iw - 5, 0, iw, ih),
-
 
1029
			     Document | StandardWindow | Menubar))) {
-
 
1030
    return 0;
-
 
1031
  }
-
 
1032
 
-
 
1033
  addto(xd->gawin);
-
 
1034
  gsetcursor(xd->gawin, ArrowCursor);
-
 
1035
  if (ismdi() && (RguiMDI & RW_TOOLBAR)) {
-
 
1036
    int btsize = 24;
-
 
1037
    rect r = rect(2, 2, btsize, btsize);
-
 
1038
    control bt, tb;
-
 
1039
    
-
 
1040
    MCHECK(tb = newtoolbar(btsize + 4));
-
 
1041
    gsetcursor(tb, ArrowCursor);
-
 
1042
    addto(tb);
-
 
1043
    
-
 
1044
    MCHECK(bt = newtoolbutton(cam_image, r, menuclpwm));
-
 
1045
    MCHECK(addtooltip(bt, "Copy to the clipboard as a metafile"));
-
 
1046
    gsetcursor(bt, ArrowCursor);
-
 
1047
    setdata(bt, (void *) dd);
-
 
1048
    r.x += (btsize + 6);
-
 
1049
    
-
 
1050
    MCHECK(bt = newtoolbutton(print_image, r, menuprint));
-
 
1051
    MCHECK(addtooltip(bt, "Print"));
-
 
1052
    gsetcursor(bt, ArrowCursor);
-
 
1053
    setdata(bt, (void *) dd);
-
 
1054
    r.x += (btsize + 6);
-
 
1055
 
-
 
1056
    MCHECK(bt = newtoolbutton(console_image, r, menuconsole));
-
 
1057
    MCHECK(addtooltip(bt, "Return focus to console"));
-
 
1058
    gsetcursor(bt, ArrowCursor);
-
 
1059
    setdata(bt, (void *) dd);
-
 
1060
    r.x += (btsize + 6);
-
 
1061
 
-
 
1062
    MCHECK(xd->stoploc = newtoolbutton(stop_image, r, menustop));
-
 
1063
    MCHECK(addtooltip(xd->stoploc, "Stop locator"));
-
 
1064
    gsetcursor(bt, ArrowCursor);
-
 
1065
    setdata(xd->stoploc,(void *) dd);
-
 
1066
    hide(xd->stoploc);
-
 
1067
  } else
-
 
1068
    xd->stoploc = NULL;
-
 
1069
 
-
 
1070
  /* First we prepare 'locator' menubar and popup */
-
 
1071
  addto(xd->gawin);
-
 
1072
  MCHECK(xd->mbarloc = newmenubar(NULL));
-
 
1073
  MCHECK(newmenu("Stop"));
-
 
1074
  MCHECK(m = newmenuitem("Stop locator", 0, menustop));
-
 
1075
  setdata(m, (void *) dd);
-
 
1076
  MCHECK(xd->locpopup = newpopup(NULL));
-
 
1077
  MCHECK(m = newmenuitem("Stop", 0, menustop));
-
 
1078
  setdata(m, (void *) dd);
-
 
1079
  MCHECK(newmenuitem("Continue", 0, NULL));
-
 
1080
  
-
 
1081
  /* Normal menubar */
-
 
1082
  MCHECK(xd->mbar = newmenubar(mbarf));
-
 
1083
  MCHECK(m = newmenu("File"));
-
 
1084
  MCHECK(xd->msubsave = newsubmenu(m, "Save as"));
-
 
1085
  MCHECK(xd->mwm = newmenuitem("Metafile", 0, menuwm));
-
 
1086
  MCHECK(xd->mps = newmenuitem("Postscript", 0, menups));
-
 
1087
  MCHECK(xd->mpng = newmenuitem("Png", 0, menufilebitmap));
-
 
1088
  MCHECK(newsubmenu(xd->msubsave,"Jpeg"));
-
 
1089
  MCHECK(xd->mjpeg50 = newmenuitem("50% quality", 0, menufilebitmap));
-
 
1090
  MCHECK(xd->mjpeg75 = newmenuitem("75% quality", 0, menufilebitmap));
-
 
1091
  MCHECK(xd->mjpeg100 = newmenuitem("100% quality", 0, menufilebitmap));
-
 
1092
  MCHECK(newsubmenu(m, "Copy to the clipboard"));
-
 
1093
  MCHECK(xd->mclpbm = newmenuitem("as a Bitmap\tCTRL+C", 0, menuclpbm));
-
 
1094
  MCHECK(xd->mclpwm = newmenuitem("as a Metafile\tCTRL+W", 0, menuclpwm));
-
 
1095
  addto(m);
-
 
1096
  MCHECK(newmenuitem("-", 0, NULL));
-
 
1097
  MCHECK(xd->mprint = newmenuitem("Print\tCTRL+P", 0, menuprint));
-
 
1098
  MCHECK(newmenuitem("-", 0, NULL));
-
 
1099
  MCHECK(xd->mclose = newmenuitem("close Device", 0, menuclose));
-
 
1100
  MCHECK(newmenu("History"));
-
 
1101
  MCHECK(xd->mrec = newmenuitem("Recording", 0, menurec));
-
 
1102
  MCHECK(newmenuitem("-", 0, NULL));
-
 
1103
  MCHECK(xd->madd = newmenuitem("Add\tINS", 0, menuadd));
-
 
1104
  MCHECK(xd->mreplace = newmenuitem("Replace", 0, menureplace));
-
 
1105
  MCHECK(newmenuitem("-", 0, NULL));
-
 
1106
  MCHECK(xd->mprev = newmenuitem("Previous\tPgUp", 0, menuprev));
-
 
1107
  MCHECK(xd->mnext = newmenuitem("Next\tPgDown", 0, menunext));
-
 
1108
  MCHECK(newmenuitem("-", 0, NULL));
-
 
1109
  MCHECK(xd->msvar = newmenuitem("Save to variable", 0, menusvar));
-
 
1110
  MCHECK(xd->mgvar = newmenuitem("Get from variable", 0, menugvar));
-
 
1111
  MCHECK(newmenuitem("-", 0, NULL));
-
 
1112
  MCHECK(xd->mclear = newmenuitem("Clear history", 0, menuclear));
-
 
1113
  newmdimenu();
-
 
1114
 
-
 
1115
  /* Normal popup */
-
 
1116
  MCHECK(xd->grpopup = newpopup(NULL));
-
 
1117
  MCHECK(m = newmenuitem("Copy as metafile", 0, menuclpwm));
-
 
1118
  setdata(m, (void *) dd);
-
 
1119
  MCHECK(m = newmenuitem("Copy as bitmap", 0, menuclpbm));
-
 
1120
  setdata(m, (void *) dd);
-
 
1121
  MCHECK(newmenuitem("-", 0, NULL));
-
 
1122
  MCHECK(m = newmenuitem("Save as metafile", 0, menuwm));
-
 
1123
  setdata(m, (void *) dd);
-
 
1124
  MCHECK(m = newmenuitem("Save as postscript", 0, menups));
-
 
1125
  setdata(m, (void *) dd);
-
 
1126
  MCHECK(newmenuitem("-", 0, NULL));
-
 
1127
  MCHECK(m = newmenuitem("Print", 0, menuprint));
-
 
1128
  setdata(m, (void *) dd);
-
 
1129
  gchangepopup(xd->gawin, xd->grpopup);
-
 
1130
 
-
 
1131
  MCHECK(xd->bm = newbitmap(getwidth(xd->gawin), getheight(xd->gawin), 
-
 
1132
			    getdepth(xd->gawin)));
-
 
1133
 
-
 
1134
  addto(xd->gawin);
-
 
1135
  setdata(xd->mbar, (void *) dd);
-
 
1136
  setdata(xd->mpng, (void *) dd);
-
 
1137
  setdata(xd->mjpeg50, (void *) dd);
-
 
1138
  setdata(xd->mjpeg75, (void *) dd);
-
 
1139
  setdata(xd->mjpeg100, (void *) dd);
-
 
1140
  setdata(xd->mps, (void *) dd);
-
 
1141
  setdata(xd->mwm, (void *) dd);
-
 
1142
  setdata(xd->mclpwm, (void *) dd);
-
 
1143
  setdata(xd->mclpbm, (void *) dd);
-
 
1144
  setdata(xd->mprint, (void *) dd);
-
 
1145
  setdata(xd->mclose, (void *) dd);
-
 
1146
  setdata(xd->mrec, (void *) dd);
-
 
1147
  setdata(xd->mprev, (void *) dd);
-
 
1148
  setdata(xd->mnext, (void *) dd);
-
 
1149
  setdata(xd->mgvar, (void *) dd);
-
 
1150
  setdata(xd->madd, (void *) dd);
-
 
1151
  setdata(xd->mreplace, (void *) dd);
-
 
1152
  show(xd->gawin);
-
 
1153
  show(xd->gawin);
-
 
1154
  setresize(xd->gawin, HelpResize);
-
 
1155
  setredraw(xd->gawin, HelpExpose);
-
 
1156
  setmousedown(xd->gawin, HelpMouseClick);
-
 
1157
  setkeydown(xd->gawin, NHelpKeyIn);
-
 
1158
  setkeyaction(xd->gawin, CHelpKeyIn);
-
 
1159
  setclose(xd->gawin, HelpClose);
-
 
1160
  xd->recording = 0;
-
 
1161
  xd->replaying = 0;
-
 
1162
 
-
 
1163
  return 1;
-
 
1164
}
998
 
1165
 
999
static int X11_Open(DevDesc *dd, x11Desc *xd, char *dsp,
1166
static int X11_Open(DevDesc *dd, x11Desc *xd, char *dsp,
1000
                    double w, double h)
1167
                    double w, double h)
1001
{
1168
{
1002
    /* if have to bail out with "error" then must */
-
 
1003
    /* free(dd) and free(xd) */
-
 
1004
 
-
 
1005
    int   iw, ih;
-
 
1006
    double dw, dh, d;
-
 
1007
    rect  rr;
1169
    rect  rr;
1008
 
1170
 
1009
    if (!fontinitdone)
1171
    if (!fontinitdone)
1010
	RFontInit();
1172
	RFontInit();
1011
 
1173
 
1012
    /* Foreground and Background Colors */
1174
    /* Foreground and Background Colors */
1013
 
-
 
1014
    xd->bg = dd->dp.bg = R_RGB(255, 255, 255);
1175
    xd->bg = dd->dp.bg = R_RGB(255, 255, 255);
1015
    xd->fg = dd->dp.fg = R_RGB(0, 0, 0);
1176
    xd->fg = dd->dp.fg = R_RGB(0, 0, 0);
1016
    xd->col = dd->dp.col = xd->fg;
1177
    xd->col = dd->dp.col = xd->fg;
1017
 
1178
 
1018
    xd->fgcolor = Black;
1179
    xd->fgcolor = Black;
1019
    xd->bgcolor = White;
1180
    xd->bgcolor = White;
1020
    /* Try to create a simple window */
-
 
1021
    /* Want to know about exposures */
-
 
1022
    /* and window-resizes and locations */
-
 
-
 
1181
 
1023
    if (!dsp[0]) {
1182
    if (!dsp[0]) {
1024
	xd->kind = 0;
-
 
1025
	dw = w / pixelWidth(NULL);
-
 
1026
	dh = h / pixelHeight(NULL);
-
 
1027
	if ((dw / devicewidth(NULL)) > 0.85) {
-
 
1028
	    d = dh / dw;
-
 
1029
	    dw = 0.85 * devicewidth(NULL);
-
 
1030
	    dh = d * dw;
-
 
1031
	}
-
 
1032
	if ((dh / deviceheight(NULL)) > 0.85) {
-
 
1033
	    d = dw / dh;
-
 
1034
	    dh = 0.85 * deviceheight(NULL);
-
 
1035
	    dw = d * dh;
-
 
1036
	}
-
 
1037
	iw = dw + 0.5;
-
 
1038
	ih = dh + 0.5;
-
 
1039
	if ((xd->gawin = newwindow("R Graphics",
-
 
1040
				rect(devicewidth(NULL) - iw - 5, 0, iw, ih),
-
 
1041
 
-
 
1042
				   Document | StandardWindow | Menubar))) {
-
 
1043
	    menu  m;
-
 
1044
            gsetcursor(xd->gawin, ArrowCursor);
-
 
1045
            if (ismdi() && (RguiMDI & RW_TOOLBAR)) {
-
 
1046
                int btsize = 24;
-
 
1047
                rect r = rect(2, 2, btsize, btsize);
1183
      if (!setupScreenDevice(dd, xd, w, h)) return 0;
1048
                control bt, tb;
-
 
1049
 
-
 
1050
                MCHECK(tb = newtoolbar(btsize + 4));
-
 
1051
		gsetcursor(tb, ArrowCursor);
-
 
1052
                addto(tb);
-
 
1053
 
-
 
1054
                MCHECK(bt = newtoolbutton(cam_image, r, menuclpwm));
-
 
1055
                MCHECK(addtooltip(bt, "Copy to the clipboard as a metafile"));
-
 
1056
		gsetcursor(bt, ArrowCursor);
-
 
1057
		setdata(bt, (void *) dd);
-
 
1058
                r.x += (btsize + 6);
-
 
1059
 
-
 
1060
                MCHECK(bt = newtoolbutton(print_image, r, menuprint));
-
 
1061
                MCHECK(addtooltip(bt, "Print"));
-
 
1062
		gsetcursor(bt, ArrowCursor);
-
 
1063
                setdata(bt, (void *) dd);
-
 
1064
                r.x += (btsize + 6);
-
 
1065
 
-
 
1066
                MCHECK(bt = newtoolbutton(console_image, r, menuconsole));
-
 
1067
                MCHECK(addtooltip(bt, "Return focus to console"));
-
 
1068
		gsetcursor(bt, ArrowCursor);
-
 
1069
                setdata(bt, (void *) dd);
-
 
1070
                r.x += (btsize + 6);
-
 
1071
 
-
 
1072
                MCHECK(xd->stoploc = newtoolbutton(stop_image, r, menustop));
-
 
1073
                MCHECK(addtooltip(xd->stoploc, "Stop locator"));
-
 
1074
		gsetcursor(bt, ArrowCursor);
-
 
1075
                setdata(xd->stoploc,(void *) dd);
-
 
1076
                hide(xd->stoploc);
-
 
1077
            } else
-
 
1078
                xd->stoploc = NULL;
-
 
1079
 
-
 
1080
	    /* First we prepare 'locator' menubar and popup */
-
 
1081
            addto(xd->gawin);
-
 
1082
	    MCHECK(xd->mbarloc = newmenubar(NULL));
-
 
1083
	    MCHECK(newmenu("Stop"));
-
 
1084
	    MCHECK(m = newmenuitem("Stop locator", 0, menustop));
-
 
1085
            setdata(m, (void *) dd);
-
 
1086
	    MCHECK(xd->locpopup = newpopup(NULL));
-
 
1087
	    MCHECK(m = newmenuitem("Stop", 0, menustop));
-
 
1088
            setdata(m, (void *) dd);
-
 
1089
	    MCHECK(newmenuitem("Continue", 0, NULL));
-
 
1090
 
-
 
1091
	    /* Normal menubar */
-
 
1092
	    MCHECK(xd->mbar = newmenubar(mbarf));
-
 
1093
	    MCHECK(m = newmenu("File"));
-
 
1094
	    MCHECK(xd->msubsave = newsubmenu(m, "Save as"));
-
 
1095
	    MCHECK(xd->mgif = newmenuitem("Gif", 0, menugif));
-
 
1096
	    MCHECK(xd->mwm = newmenuitem("Metafile", 0, menuwm));
-
 
1097
	    MCHECK(xd->mps = newmenuitem("Postscript", 0, menups));
-
 
1098
	    MCHECK(newsubmenu(m, "Copy to the clipboard"));
-
 
1099
	    MCHECK(xd->mclpbm = newmenuitem("as a Bitmap\tCTRL+C", 0,
-
 
1100
					    menuclpbm));
-
 
1101
	    MCHECK(xd->mclpwm = newmenuitem("as a Metafile\tCTRL+W", 0,
-
 
1102
					    menuclpwm));
-
 
1103
	    addto(m);
-
 
1104
	    MCHECK(newmenuitem("-", 0, NULL));
-
 
1105
	    MCHECK(xd->mprint = newmenuitem("Print\tCTRL+P", 0, menuprint));
-
 
1106
	    MCHECK(newmenuitem("-", 0, NULL));
-
 
1107
	    MCHECK(xd->mclose = newmenuitem("close Device", 0, menuclose));
-
 
1108
	    MCHECK(newmenu("History"));
-
 
1109
	    MCHECK(xd->mrec = newmenuitem("Recording", 0, menurec));
-
 
1110
	    MCHECK(newmenuitem("-", 0, NULL));
-
 
1111
	    MCHECK(xd->madd = newmenuitem("Add\tINS", 0, menuadd));
-
 
1112
	    MCHECK(xd->mreplace = newmenuitem("Replace", 0, menureplace));
-
 
1113
	    MCHECK(newmenuitem("-", 0, NULL));
-
 
1114
	    MCHECK(xd->mprev = newmenuitem("Previous\tPgUp", 0, menuprev));
-
 
1115
	    MCHECK(xd->mnext = newmenuitem("Next\tPgDown", 0, menunext));
-
 
1116
	    MCHECK(newmenuitem("-", 0, NULL));
-
 
1117
	    MCHECK(xd->msvar = newmenuitem("Save to variable", 0, menusvar));
-
 
1118
	    MCHECK(xd->mgvar = newmenuitem("Get from variable", 0, menugvar));
-
 
1119
	    MCHECK(newmenuitem("-", 0, NULL));
-
 
1120
	    MCHECK(xd->mclear = newmenuitem("Clear history", 0, menuclear));
-
 
1121
	    newmdimenu();
-
 
1122
 
-
 
1123
	    /* Normal popup */
-
 
1124
	    MCHECK(xd->grpopup = newpopup(NULL));
-
 
1125
	    MCHECK(m = newmenuitem("Copy as metafile", 0, menuclpwm));
-
 
1126
            setdata(m, (void *) dd);
-
 
1127
	    MCHECK(m = newmenuitem("Copy as bitmap", 0, menuclpbm));
-
 
1128
            setdata(m, (void *) dd);
-
 
1129
	    MCHECK(newmenuitem("-", 0, NULL));
-
 
1130
	    MCHECK(m = newmenuitem("Save as metafile", 0, menuwm));
-
 
1131
            setdata(m, (void *) dd);
-
 
1132
	    MCHECK(m = newmenuitem("Save as postscript", 0, menups));
-
 
1133
            setdata(m, (void *) dd);
-
 
1134
	    MCHECK(newmenuitem("-", 0, NULL));
-
 
1135
	    MCHECK(m = newmenuitem("Print", 0, menuprint));
-
 
1136
            setdata(m, (void *) dd);
-
 
1137
            gchangepopup(xd->gawin, xd->grpopup);
-
 
1138
	}
-
 
1139
    } else if (!strcmp(dsp, "win.print")) {
1184
    } else if (!strcmp(dsp, "win.print")) {
1140
	xd->kind = 1;
1185
	xd->kind = PRINTER;
1141
	xd->gawin = newprinter(MM_PER_INCH * w, MM_PER_INCH * h);
1186
	xd->gawin = newprinter(MM_PER_INCH * w, MM_PER_INCH * h);
1142
	if (!xd->gawin)
1187
	if (!xd->gawin)
1143
	    return 0;
1188
	    return 0;
-
 
1189
    } else if (!strncmp(dsp, "png:", 4)) {
-
 
1190
        xd->kind = PNG ;
-
 
1191
	if (!Load_Rbitmap_Dll()) {
-
 
1192
	  warning("Impossible to load Rbitmap.dll");
-
 
1193
	  return 0;
-
 
1194
	}
-
 
1195
	/*
-
 
1196
	  Observe that given actual graphapp implementation 256 is 
-
 
1197
	  irrilevant,i.e., depth of the bitmap is the one of graphic card
-
 
1198
	  if required depth > 1
-
 
1199
	*/
-
 
1200
	if (((xd->gawin = newbitmap(w,h,256)) == NULL) || 
-
 
1201
	    ((xd->fp=fopen(&dsp[4],"wb")) == NULL )) {
-
 
1202
	  if (xd->gawin != NULL) del(xd->gawin);
-
 
1203
	  if (xd->fp != NULL) fclose(xd->fp);
-
 
1204
	  return 0;
-
 
1205
	}
-
 
1206
    } else if (!strncmp(dsp, "jpeg:", 5)) {
-
 
1207
        char *p = strchr(&dsp[5], ':');
-
 
1208
        xd->kind = JPEG ;
-
 
1209
	if (!p) return 0;
-
 
1210
	if (!Load_Rbitmap_Dll()) {
-
 
1211
	  warning("Impossible to load Rbitmap.dll");
-
 
1212
	  return 0;
-
 
1213
	}
-
 
1214
	*p = '\0';
-
 
1215
	xd->quality = atoi(&dsp[5]);
-
 
1216
	if (((xd->gawin = newbitmap(w,h,256)) == NULL) || 
-
 
1217
	    ((xd->fp=fopen(p+1,"wb")) == NULL )) {
-
 
1218
	  if (xd->gawin != NULL) del(xd->gawin);
-
 
1219
	  if (xd->fp != NULL) fclose(xd->fp);
-
 
1220
	  return 0;
-
 
1221
	}
1144
    } else {
1222
    } else {
1145
/*
1223
	/*
1146
 *         win.metafile[:] in memory (for the clipboard)
1224
	 * win.metafile[:] in memory (for the clipboard)
1147
 *         win.metafile:filename
1225
	 * win.metafile:filename
1148
 *         anything else return 0
1226
	 * anything else return 0
1149
 */
1227
	 */
1150
	char  *s = "win.metafile";
1228
	char  *s = "win.metafile";
1151
	int   ls = strlen(s);
1229
	int   ls = strlen(s);
1152
	int   ld = strlen(dsp);
1230
	int   ld = strlen(dsp);
1153
 
1231
 
1154
	if (ls > ld)
1232
	if (ls > ld)
1155
	    return 0;
1233
	    return 0;
1156
	if (strncmp(dsp, s, ls) || (dsp[ls] && (dsp[ls] != ':')))
1234
	if (strncmp(dsp, s, ls) || (dsp[ls] && (dsp[ls] != ':')))
1157
	    return 0;
1235
	    return 0;
1158
	xd->gawin = newmetafile((ld > ls) ? &dsp[ls + 1] : "",
1236
	xd->gawin = newmetafile((ld > ls) ? &dsp[ls + 1] : "",
1159
				rect(0, 0, MM_PER_INCH * w, MM_PER_INCH * h));
1237
				rect(0, 0, MM_PER_INCH * w, MM_PER_INCH * h));
1160
	xd->kind = 2;
1238
	xd->kind = METAFILE;
1161
	if (!xd->gawin)
1239
	if (!xd->gawin)
1162
	    return 0;
1240
	    return 0;
1163
    }
1241
    }
1164
    if (!SetBaseFont(xd)) {
1242
    if (!SetBaseFont(xd)) {
1165
	Rprintf("can't find any fonts\n");
1243
	Rprintf("can't find any fonts\n");
1166
	del(xd->gawin);
1244
	del(xd->gawin);
-
 
1245
	if (xd->kind==SCREEN) del(xd->bm);
1167
	return 0;
1246
	return 0;
1168
    }
1247
    }
1169
    rr = getrect(xd->gawin);
1248
    rr = getrect(xd->gawin);
1170
    iw = xd->windowWidth = rr.width;
1249
    xd->windowWidth = rr.width;
1171
    ih = xd->windowHeight = rr.height;
1250
    xd->windowHeight = rr.height;
1172
    xd->clip = rr;
1251
    xd->clip = rr;
-
 
1252
    xd->truedpi = devicepixelsy(xd->gawin);
-
 
1253
    if ((xd->kind==PNG) || (xd->kind==JPEG)) 
-
 
1254
      xd->wanteddpi = 72 ;
-
 
1255
    else
-
 
1256
      xd->wanteddpi = xd->truedpi;
1173
    setdata(xd->gawin, (void *) dd);
1257
    setdata(xd->gawin, (void *) dd);
1174
    if (!xd->kind) {
-
 
1175
	xd->bm = newbitmap(iw, ih, getdepth(xd->gawin));
-
 
1176
	if (!xd->bm) {
-
 
1177
	    del(xd->gawin);
-
 
1178
	    return 0;
-
 
1179
	}
-
 
1180
	addto(xd->gawin);
-
 
1181
	setdata(xd->mbar, (void *) dd);
-
 
1182
	setdata(xd->mgif, (void *) dd);
-
 
1183
	setdata(xd->mps, (void *) dd);
-
 
1184
	setdata(xd->mwm, (void *) dd);
-
 
1185
	setdata(xd->mclpwm, (void *) dd);
-
 
1186
	setdata(xd->mclpbm, (void *) dd);
-
 
1187
	setdata(xd->mprint, (void *) dd);
-
 
1188
	setdata(xd->mclose, (void *) dd);
-
 
1189
	setdata(xd->mrec, (void *) dd);
-
 
1190
	setdata(xd->mprev, (void *) dd);
-
 
1191
	setdata(xd->mnext, (void *) dd);
-
 
1192
	setdata(xd->mgvar, (void *) dd);
-
 
1193
	setdata(xd->madd, (void *) dd);
-
 
1194
	setdata(xd->mreplace, (void *) dd);
-
 
1195
	show(xd->gawin);
-
 
1196
	show(xd->gawin);
-
 
1197
	setresize(xd->gawin, HelpResize);
-
 
1198
	setredraw(xd->gawin, HelpExpose);
-
 
1199
	setmousedown(xd->gawin, HelpMouseClick);
-
 
1200
	setkeydown(xd->gawin, NHelpKeyIn);
-
 
1201
	setkeyaction(xd->gawin, CHelpKeyIn);
-
 
1202
	setclose(xd->gawin, HelpClose);
-
 
1203
	xd->recording = 0;
-
 
1204
	xd->replaying = 0;
-
 
1205
    }
-
 
1206
    xd->needsave = 0;
1258
    xd->needsave = 0;
1207
    return 1;
1259
    return 1;
1208
}
1260
}
1209
 
1261
 
1210
	/********************************************************/
1262
	/********************************************************/
Line 1286... Line 1338...
1286
	dd->dp.left = dd->gp.left = 0.0;
1338
	dd->dp.left = dd->gp.left = 0.0;
1287
	dd->dp.right = dd->gp.right = iw = xd->windowWidth;
1339
	dd->dp.right = dd->gp.right = iw = xd->windowWidth;
1288
	dd->dp.bottom = dd->gp.bottom = ih = xd->windowHeight;
1340
	dd->dp.bottom = dd->gp.bottom = ih = xd->windowHeight;
1289
	dd->dp.top = dd->gp.top = 0.0;
1341
	dd->dp.top = dd->gp.top = 0.0;
1290
	xd->resize = 0;
1342
	xd->resize = 0;
1291
	if (!xd->kind) {
1343
	if (xd->kind==SCREEN) {
1292
	    del(xd->bm);
1344
	    del(xd->bm);
1293
	    xd->bm = newbitmap(iw, ih, getdepth(xd->gawin));
1345
	    xd->bm = newbitmap(iw, ih, getdepth(xd->gawin));
1294
	    if (!xd->bm) {
1346
	    if (!xd->bm) {
1295
		R_ShowMessage("Insufficient memory for resize. Killing device");
1347
		R_ShowMessage("Insufficient memory for resize. Killing device");
1296
		KillDevice(dd);
1348
		KillDevice(dd);
Line 1309... Line 1361...
1309
 
1361
 
1310
static void X11_NewPage(DevDesc *dd)
1362
static void X11_NewPage(DevDesc *dd)
1311
{
1363
{
1312
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
1364
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
1313
 
1365
 
1314
    if ((xd->kind == 1) && xd->needsave)
1366
    if ((xd->kind == PRINTER) && xd->needsave)
1315
	nextpage(xd->gawin);
1367
	nextpage(xd->gawin);
1316
    if ((xd->kind == 2) && xd->needsave)
1368
    if ((xd->kind == METAFILE) && xd->needsave)
1317
	error("A metafile can store only one figure.");
1369
	error("A metafile can store only one figure.");
-
 
1370
    if ((xd->kind == PNG) && xd->needsave)
-
 
1371
	error("A png file can store only one figure.");
-
 
1372
    if ((xd->kind == JPEG) && xd->needsave)
-
 
1373
	error("A jpeg file can store only one figure.");
1318
    if (!xd->kind) {
1374
    if (xd->kind==SCREEN) {
1319
	if (xd->recording && xd->needsave)
1375
	if (xd->recording && xd->needsave)
1320
	    AddtoPlotHistory(savedDisplayList, &savedGPar, 0);
1376
	    AddtoPlotHistory(savedDisplayList, &savedGPar, 0);
1321
	if (xd->replaying)
1377
	if (xd->replaying)
1322
	    xd->needsave = 0;
1378
	    xd->needsave = 0;
1323
	else
1379
	else
Line 1325... Line 1381...
1325
    }
1381
    }
1326
    xd->bg = dd->dp.bg;
1382
    xd->bg = dd->dp.bg;
1327
    xd->bgcolor = rgb(R_RED(xd->bg),
1383
    xd->bgcolor = rgb(R_RED(xd->bg),
1328
		      R_GREEN(xd->bg),
1384
		      R_GREEN(xd->bg),
1329
		      R_BLUE(xd->bg));
1385
		      R_BLUE(xd->bg));
1330
    if (xd->kind)
1386
    if (xd->kind!=SCREEN) {
-
 
1387
      xd->needsave = 1;
1331
       xd->clip = getrect(xd->gawin);
1388
      xd->clip = getrect(xd->gawin);
1332
    else
1389
    } else {
1333
       xd->clip = getrect(xd->bm);
1390
      xd->clip = getrect(xd->bm);
-
 
1391
    }
1334
    DRAW(gfillrect(_d, xd->bgcolor, getrect(_d)));
1392
    DRAW(gfillrect(_d, xd->bgcolor, getrect(_d)));
1335
    if (xd->kind)
-
 
1336
	xd->needsave = 1;
-
 
1337
}
1393
}
1338
 
1394
 
1339
	/********************************************************/
1395
	/********************************************************/
1340
	/* device_Close is called when the device is killed	*/
1396
	/* device_Close is called when the device is killed	*/
1341
	/* this function is responsible for destroying any 	*/
1397
	/* this function is responsible for destroying any 	*/
Line 1346... Line 1402...
1346
 
1402
 
1347
static void X11_Close(DevDesc *dd)
1403
static void X11_Close(DevDesc *dd)
1348
{
1404
{
1349
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
1405
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
1350
 
1406
 
1351
    if (!xd->kind) {
1407
    if (xd->kind==SCREEN) {
1352
	hide(xd->gawin);
1408
	hide(xd->gawin);
1353
	del(xd->bm);
1409
	del(xd->bm);
-
 
1410
    } else if ((xd->kind == PNG) || (xd->kind == JPEG) ) {
-
 
1411
      SaveAsBitmap(dd);
1354
    }
1412
    } 
1355
    del(xd->font);
1413
    del(xd->font);
1356
    del(xd->gawin);
1414
    del(xd->gawin);
-
 
1415
/* 
1357
    doevent();			/* this is needed since the GraphApp delayed
1416
 * this is needed since the GraphApp delayed clean-up 
1358
				   clean-up */
-
 
1359
    /* ,i.e, I want free all resources NOW */
1417
 * ,i.e, I want free all resources NOW 
-
 
1418
*/
-
 
1419
    doevent();			
1360
    winfree(xd);
1420
    free(xd);
1361
}
1421
}
1362
 
1422
 
1363
	/********************************************************/
1423
	/********************************************************/
1364
	/* device_Activate is called when a device becomes the 	*/
1424
	/* device_Activate is called when a device becomes the 	*/
1365
	/* active device.  in this case it is used to change the*/
1425
	/* active device.  in this case it is used to change the*/
Line 1374... Line 1434...
1374
{
1434
{
1375
    char  t[50];
1435
    char  t[50];
1376
    char  num[3];
1436
    char  num[3];
1377
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
1437
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
1378
 
1438
 
1379
    if (xd->replaying || xd->kind)
1439
    if (xd->replaying || (xd->kind!=SCREEN))
1380
	return;
1440
	return;
1381
    strcpy(t, (char *) title);
1441
    strcpy(t, (char *) title);
1382
    strcat(t, ": Device ");
1442
    strcat(t, ": Device ");
1383
    sprintf(num, "%i", deviceNumber(dd) + 1);
1443
    sprintf(num, "%i", deviceNumber(dd) + 1);
1384
    strcat(t, num);
1444
    strcat(t, num);
Line 1398... Line 1458...
1398
{
1458
{
1399
    char  t[50];
1459
    char  t[50];
1400
    char  num[3];
1460
    char  num[3];
1401
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
1461
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
1402
 
1462
 
1403
    if (xd->replaying || xd->kind)
1463
    if (xd->replaying || (xd->kind!=SCREEN))
1404
	return;
1464
	return;
1405
    strcpy(t, (char *) title);
1465
    strcpy(t, (char *) title);
1406
    strcat(t, ": Device ");
1466
    strcat(t, ": Device ");
1407
    sprintf(num, "%i", deviceNumber(dd) + 1);
1467
    sprintf(num, "%i", deviceNumber(dd) + 1);
1408
    strcat(t, num);
1468
    strcat(t, num);
Line 1638... Line 1698...
1638
    SetFont(dd->gp.font, size, rot, dd);
1698
    SetFont(dd->gp.font, size, rot, dd);
1639
    SetColor(dd->gp.col, dd);
1699
    SetColor(dd->gp.col, dd);
1640
#ifdef NOCLIPTEXT
1700
#ifdef NOCLIPTEXT
1641
    gsetcliprect(xd->gawin, getrect(xd->gawin));
1701
    gsetcliprect(xd->gawin, getrect(xd->gawin));
1642
    gdrawstr(xd->gawin, xd->font, xd->fgcolor, pt(x, y), str);
1702
    gdrawstr(xd->gawin, xd->font, xd->fgcolor, pt(x, y), str);
1643
    if (!xd->kind) {
1703
    if (xd->kind==SCREEN) {
1644
	gsetcliprect(xd->bm, getrect(xd->bm));
1704
	gsetcliprect(xd->bm, getrect(xd->bm));
1645
	gdrawstr(xd->bm, xd->font, xd->fgcolor, pt(x, y), str);
1705
	gdrawstr(xd->bm, xd->font, xd->fgcolor, pt(x, y), str);
1646
    }
1706
    }
1647
#else
1707
#else
1648
    DRAW(gdrawstr(_d, xd->font, xd->fgcolor, pt(x, y), str));
1708
    DRAW(gdrawstr(_d, xd->font, xd->fgcolor, pt(x, y), str));
Line 1658... Line 1718...
1658
 
1718
 
1659
static int X11_Locator(double *x, double *y, DevDesc *dd)
1719
static int X11_Locator(double *x, double *y, DevDesc *dd)
1660
{
1720
{
1661
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
1721
    x11Desc *xd = (x11Desc *) dd->deviceSpecific;
1662
 
1722
 
1663
    if (xd->kind)
1723
    if (xd->kind!=SCREEN)
1664
	return 0;
1724
	return 0;
1665
    xd->locator = 1;
1725
    xd->locator = 1;
1666
    xd->clicked = 0;
1726
    xd->clicked = 0;
1667
    show(xd->gawin);
1727
    show(xd->gawin);
1668
    addto(xd->gawin);
1728
    addto(xd->gawin);
Line 1777... Line 1837...
1777
    int   ps;
1837
    int   ps;
1778
    x11Desc *xd;
1838
    x11Desc *xd;
1779
    rect  rr;
1839
    rect  rr;
1780
 
1840
 
1781
    /* allocate new device description */
1841
    /* allocate new device description */
1782
    if (!(xd = (x11Desc *) winmalloc(sizeof(x11Desc))))
1842
    if (!(xd = (x11Desc *) malloc(sizeof(x11Desc))))
1783
	return 0;
1843
	return 0;
1784
 
1844
 
1785
    /* from here on, if need to bail out with "error", must also */
1845
    /* from here on, if need to bail out with "error", must also */
1786
    /* free(xd) */
1846
    /* free(xd) */
1787
 
1847
 
Line 1797... Line 1857...
1797
    dd->dp.ps = ps;
1857
    dd->dp.ps = ps;
1798
 
1858
 
1799
    /* Start the Device Driver and Hardcopy.  */
1859
    /* Start the Device Driver and Hardcopy.  */
1800
 
1860
 
1801
    if (!X11_Open(dd, xd, display, width, height)) {
1861
    if (!X11_Open(dd, xd, display, width, height)) {
1802
	winfree(xd);
1862
	free(xd);
1803
	return 0;
1863
	return 0;
1804
    }
1864
    }
1805
    /* Set up Data Structures  */
1865
    /* Set up Data Structures  */
1806
 
1866
 
1807
    dd->dp.open = X11_Open;
1867
    dd->dp.open = X11_Open;
Line 1824... Line 1884...
1824
    dd->dp.metricInfo = X11_MetricInfo;
1884
    dd->dp.metricInfo = X11_MetricInfo;
1825
 
1885
 
1826
    /* set graphics parameters that must be set by device driver */
1886
    /* set graphics parameters that must be set by device driver */
1827
    /* Window Dimensions in Pixels */
1887
    /* Window Dimensions in Pixels */
1828
    rr = getrect(xd->gawin);
1888
    rr = getrect(xd->gawin);
1829
    dd->dp.left = (xd->kind == 1) ? rr.x : 0;	/* left */
1889
    dd->dp.left = (xd->kind == PRINTER) ? rr.x : 0;	/* left */
1830
    dd->dp.right = dd->dp.left + rr.width;	/* right */
1890
    dd->dp.right = dd->dp.left + rr.width;	/* right */
1831
    dd->dp.top = (xd->kind == 1) ? rr.y : 0;	/* top */
1891
    dd->dp.top = (xd->kind == PRINTER) ? rr.y : 0;	/* top */
1832
    dd->dp.bottom = dd->dp.top + rr.height;	/* bottom */
1892
    dd->dp.bottom = dd->dp.top + rr.height;	/* bottom */
1833
 
1893
 
1834
 
1894
 
1835
    /* Nominal Character Sizes in Pixels */
1895
    /* Nominal Character Sizes in Pixels */
1836
    dd->dp.cra[0] = fontwidth(xd->font);
1896
    dd->dp.cra[0] = fontwidth(xd->font);
Line 1864... Line 1924...
1864
 
1924
 
1865
    xd->resize = 0;
1925
    xd->resize = 0;
1866
    xd->locator = 0;
1926
    xd->locator = 0;
1867
    dd->deviceSpecific = (void *) xd;
1927
    dd->deviceSpecific = (void *) xd;
1868
    dd->displayListOn = 1;
1928
    dd->displayListOn = 1;
1869
    if (RConsole && xd->kind) show(RConsole);
1929
    if (RConsole && (xd->kind!=SCREEN)) show(RConsole);
1870
    return 1;
1930
    return 1;
1871
}
1931
}
1872
 
1932
 
1873
SEXP do_saveDevga(SEXP call, SEXP op, SEXP args, SEXP env)
1933
SEXP do_saveDevga(SEXP call, SEXP op, SEXP args, SEXP env)
1874
{
1934
{
Line 1891... Line 1951...
1891
    type = CADDR(args);
1951
    type = CADDR(args);
1892
    if (!isString(type) || LENGTH(type) != 1)
1952
    if (!isString(type) || LENGTH(type) != 1)
1893
	errorcall(call, "invalid filename argument");
1953
	errorcall(call, "invalid filename argument");
1894
    tp = CHAR(STRING(type)[0]);
1954
    tp = CHAR(STRING(type)[0]);
1895
 
1955
 
1896
    if(!strcmp(tp, "gif")) {
1956
    if(!strcmp(tp, "png")) {
1897
	SaveAsGif(dd, fn);
1957
	SaveAsPng(dd, fn);
-
 
1958
    } else if(!strcmp(tp, "jpeg") || !strcmp(tp,"jpg")) {
-
 
1959
      /*Default quality suggested in libjpeg*/
-
 
1960
        SaveAsJpeg(dd, 75, fn); 
1898
    } else if (!strcmp(tp, "wmf")) {
1961
    } else if (!strcmp(tp, "wmf")) {
1899
	sprintf(display, "win.metafile:%s", fn);
1962
	sprintf(display, "win.metafile:%s", fn);
1900
	SaveAsWin(dd, display);
1963
	SaveAsWin(dd, display);
1901
    } else if (!strcmp(tp, "ps")) {
1964
    } else if (!strcmp(tp, "ps")) {
1902
	SaveAsPostscript(dd, fn);
1965
	SaveAsPostscript(dd, fn);
1903
    } else
1966
    } else
1904
	errorcall(call, "unknown type");
1967
	errorcall(call, "unknown type");
1905
    return R_NilValue;
1968
    return R_NilValue;
1906
}
1969
}
-
 
1970
 
-
 
1971
 
-
 
1972
/* Rbitmap  */
-
 
1973
#define BITMAP_DLL_NAME "\\BIN\\RBITMAP.DLL\0"
-
 
1974
typedef int (*R_SaveAsBitmap)();
-
 
1975
static R_SaveAsBitmap R_SaveAsPng, R_SaveAsJpeg;
-
 
1976
static int RbitmapAlreadyLoaded=0;
-
 
1977
static HINSTANCE hRbitmapDll;
-
 
1978
 
-
 
1979
static int Load_Rbitmap_Dll()
-
 
1980
{    
-
 
1981
 if (!RbitmapAlreadyLoaded) {
-
 
1982
   char szFullPath[PATH_MAX];
-
 
1983
   strcpy(szFullPath, R_HomeDir());
-
 
1984
   strcat(szFullPath, BITMAP_DLL_NAME);
-
 
1985
   if (((hRbitmapDll = LoadLibrary(szFullPath)) != NULL) && 
-
 
1986
       ((R_SaveAsPng=
-
 
1987
	 (R_SaveAsBitmap)GetProcAddress(hRbitmapDll,"R_SaveAsPng")) 
-
 
1988
	!= NULL) &&
-
 
1989
       ((R_SaveAsJpeg=
-
 
1990
	 (R_SaveAsBitmap)GetProcAddress(hRbitmapDll,"R_SaveAsJpeg")) 
-
 
1991
	!= NULL)) {
-
 
1992
     RbitmapAlreadyLoaded = 1;
-
 
1993
   } else {	
-
 
1994
     if (hRbitmapDll != NULL) FreeLibrary(hRbitmapDll);
-
 
1995
     RbitmapAlreadyLoaded= -1;
-
 
1996
   }
-
 
1997
 }
-
 
1998
 return (RbitmapAlreadyLoaded>0);    
-
 
1999
}
-
 
2000
 
-
 
2001
void Unload_Rbitmap_Dll()
-
 
2002
{
-
 
2003
    if (RbitmapAlreadyLoaded) FreeLibrary(hRbitmapDll);
-
 
2004
    RbitmapAlreadyLoaded = 0;
-
 
2005
}
-
 
2006
 
-
 
2007
static unsigned long privategetpixel(void *d,int i, int j) {
-
 
2008
  return ggetpixel((bitmap)d,pt(j,i));
-
 
2009
}
-
 
2010
 
-
 
2011
/* This is the device version */
-
 
2012
static void SaveAsBitmap(DevDesc *dd)
-
 
2013
{
-
 
2014
  x11Desc *xd = (x11Desc *) dd->deviceSpecific;
-
 
2015
  if (xd->kind==PNG) 
-
 
2016
    R_SaveAsPng(xd->gawin,xd->windowWidth, xd->windowHeight,
-
 
2017
		privategetpixel,0,xd->fp) ;
-
 
2018
  else
-
 
2019
    R_SaveAsJpeg(xd->gawin, xd->windowWidth, xd->windowHeight,
-
 
2020
		 privategetpixel,0,xd->quality,xd->fp) ;
-
 
2021
  fclose(xd->fp);
-
 
2022
}
-
 
2023
 
-
 
2024
/* This is the menu item version */
-
 
2025
static void SaveAsPng(DevDesc *dd,char *fn)
-
 
2026
{
-
 
2027
  FILE *fp;
-
 
2028
  x11Desc *xd = (x11Desc *) dd->deviceSpecific;
-
 
2029
  if (!Load_Rbitmap_Dll()) {
-
 
2030
    R_ShowMessage("Impossible to load Rbitmap.dll");
-
 
2031
    return;
-
 
2032
  }
-
 
2033
  if ((fp=fopen(fn,"wb"))==NULL) {
-
 
2034
    char msg[MAX_PATH+32];
-
 
2035
 
-
 
2036
    strcpy(msg,"Impossible to open ");
-
 
2037
    strncat(msg,fn,MAX_PATH);
-
 
2038
    R_ShowMessage(msg);
-
 
2039
    return;
-
 
2040
  }
-
 
2041
  R_SaveAsPng(xd->bm,xd->windowWidth, xd->windowHeight,
-
 
2042
	      privategetpixel,0,fp) ;
-
 
2043
  fclose(fp);
-
 
2044
}
-
 
2045
 
-
 
2046
static void SaveAsJpeg(DevDesc *dd,int quality,char *fn)
-
 
2047
{
-
 
2048
  FILE *fp;
-
 
2049
  x11Desc *xd = (x11Desc *) dd->deviceSpecific;
-
 
2050
  if (!Load_Rbitmap_Dll()) {
-
 
2051
    R_ShowMessage("Impossible to load Rbitmap.dll");
-
 
2052
    return;
-
 
2053
  }
-
 
2054
  if ((fp=fopen(fn,"wb"))==NULL) {
-
 
2055
    char msg[MAX_PATH+32];
-
 
2056
    strcpy(msg,"Impossible to open ");
-
 
2057
    strncat(msg,fn,MAX_PATH);
-
 
2058
    R_ShowMessage(msg);
-
 
2059
    return;
-
 
2060
  }
-
 
2061
  R_SaveAsJpeg(xd->bm,xd->windowWidth, xd->windowHeight,
-
 
2062
	      privategetpixel,0,quality,fp) ;
-
 
2063
  fclose(fp);
-
 
2064
}
-
 
2065
 
-
 
2066
 
-
 
2067
 
-
 
2068