The R Project SVN R

Rev

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

Rev 6098 Rev 6192
Line 44... Line 44...
44
	/* used as a template for new drivers 			*/
44
	/* used as a template for new drivers 			*/
45
	/********************************************************/
45
	/********************************************************/
46
 
46
 
47
#define MM_PER_INCH	25.4	/* mm -> inch conversion */
47
#define MM_PER_INCH	25.4	/* mm -> inch conversion */
48
 
48
 
49
#define TRACEDEVGA(a)  
49
#define TRACEDEVGA(a)
50
#define NOBM(a) if(!xd->kind){a;}
50
#define NOBM(a) if(!xd->kind){a;}
51
#define CLIP if (xd->clip.width>0) gsetcliprect(_d,xd->clip)
51
#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;)}
52
#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));
53
#define SHOW  gbitblt(xd->gawin,xd->bm,pt(0,0),getrect(xd->bm));
54
 
54
 
Line 205... Line 205...
205
    KillDevice(ndd);
205
    KillDevice(ndd);
206
    gsetcursor(xd->gawin, ArrowCursor);
206
    gsetcursor(xd->gawin, ArrowCursor);
207
    show(xd->gawin);
207
    show(xd->gawin);
208
}
208
}
209
 
209
 
210
static void SaveAsWin(DevDesc *dd, char *display) 
210
static void SaveAsWin(DevDesc *dd, char *display)
211
{
211
{
212
    DevDesc *ndd = (DevDesc *) malloc(sizeof(DevDesc));
212
    DevDesc *ndd = (DevDesc *) malloc(sizeof(DevDesc));
213
    if (!ndd) {
213
    if (!ndd) {
214
	R_ShowMessage("No enough memory to copy graphics window");
214
	R_ShowMessage("No enough memory to copy graphics window");
215
	return;
215
	return;
Line 217... Line 217...
217
    ndd->displayList = R_NilValue;
217
    ndd->displayList = R_NilValue;
218
    GInit(&ndd->dp);
218
    GInit(&ndd->dp);
219
    if (X11DeviceDriver(ndd, display,
219
    if (X11DeviceDriver(ndd, display,
220
			 GConvertXUnits(1.0, NDC, INCHES, dd),
220
			 GConvertXUnits(1.0, NDC, INCHES, dd),
221
			 GConvertYUnits(1.0, NDC, INCHES, dd),
221
			 GConvertYUnits(1.0, NDC, INCHES, dd),
222
			 dd->gp.ps)) 
222
			 dd->gp.ps))
223
        PrivateCopyDevice(dd,ndd,display);
223
        PrivateCopyDevice(dd,ndd,display);
224
}
224
}
225
    
225
 
226
 
226
 
227
static void SaveAsPostscript(DevDesc *dd, char *fn)
227
static void SaveAsPostscript(DevDesc *dd, char *fn)
228
{
228
{
229
   SEXP s = findVar(install(".PostScript.Options"), R_GlobalEnv);
229
   SEXP s = findVar(install(".PostScript.Options"), R_GlobalEnv);
230
   DevDesc *ndd = (DevDesc *) malloc(sizeof(DevDesc));
230
   DevDesc *ndd = (DevDesc *) malloc(sizeof(DevDesc));
Line 262... Line 262...
262
        if(!strcmp("fg",CHAR(STRING(names)[i]))) {
262
        if(!strcmp("fg",CHAR(STRING(names)[i]))) {
263
           strcpy(fg,CHAR(STRING(VECTOR(s)[i])[0]));
263
           strcpy(fg,CHAR(STRING(VECTOR(s)[i])[0]));
264
           done += 1;
264
           done += 1;
265
        }
265
        }
266
      }
266
      }
267
   }   
267
   }
268
   if (PSDeviceDriver(ndd, fn, paper, family, bg, fg,
268
   if (PSDeviceDriver(ndd, fn, paper, family, bg, fg,
269
		      GConvertXUnits(1.0, NDC, INCHES, dd),
269
		      GConvertXUnits(1.0, NDC, INCHES, dd),
270
		      GConvertYUnits(1.0, NDC, INCHES, dd),
270
		      GConvertYUnits(1.0, NDC, INCHES, dd),
271
		      (double)0, dd->gp.ps, 0, 1)) 
271
		      (double)0, dd->gp.ps, 0, 1))
272
    /* horizontal=F, onefile=F, pagecentre=T */
272
    /* horizontal=F, onefile=F, pagecentre=T */
273
        PrivateCopyDevice(dd, ndd, "postscript");
273
        PrivateCopyDevice(dd, ndd, "postscript");
274
}
274
}
275
 
275
 
276
 
276
 
Line 568... Line 568...
568
	} else
568
	} else
569
	    xd->clicked = 2;
569
	    xd->clicked = 2;
570
    }
570
    }
571
}
571
}
572
 
572
 
573
static void menustop(control m) 
573
static void menustop(control m)
574
{
574
{
575
  DevDesc *dd = (DevDesc *) getdata(m);
575
  DevDesc *dd = (DevDesc *) getdata(m);
576
  x11Desc *xd = (x11Desc *) dd->deviceSpecific;
576
  x11Desc *xd = (x11Desc *) dd->deviceSpecific;
577
  if (!xd->locator) 
577
  if (!xd->locator)
578
     return;
578
     return;
579
  xd->clicked = 2;
579
  xd->clicked = 2;
580
}
580
}
581
 
581
 
582
void  fixslash(char *);
582
void  fixslash(char *);
Line 620... Line 620...
620
    setuserfilter("Enhanced metafiles (*.emf)\0*.emf\0All files (*.*)\0*.*\0\0");
620
    setuserfilter("Enhanced metafiles (*.emf)\0*.emf\0All files (*.*)\0*.*\0\0");
621
    fn = askfilesave("Enhanced metafiles", "");
621
    fn = askfilesave("Enhanced metafiles", "");
622
    if (!fn) return;
622
    if (!fn) return;
623
    fixslash(fn);
623
    fixslash(fn);
624
    sprintf(display, "win.metafile:%s", fn);
624
    sprintf(display, "win.metafile:%s", fn);
625
    SaveAsWin(dd,display);    
625
    SaveAsWin(dd,display);
626
}
626
}
627
 
627
 
628
 
628
 
629
 
629
 
630
static void menuclpwm(control m)
630
static void menuclpwm(control m)
631
{
631
{
632
    DevDesc *dd = (DevDesc *) getdata(m);
632
    DevDesc *dd = (DevDesc *) getdata(m);
633
    SaveAsWin(dd,"win.metafile");        
633
    SaveAsWin(dd,"win.metafile");
634
}
634
}
635
 
635
 
636
static void menuclpbm(control m)
636
static void menuclpbm(control m)
637
{
637
{
638
    DevDesc *dd = (DevDesc *) getdata(m);
638
    DevDesc *dd = (DevDesc *) getdata(m);
Line 645... Line 645...
645
}
645
}
646
 
646
 
647
static void menuprint(control m)
647
static void menuprint(control m)
648
{
648
{
649
    DevDesc *dd = (DevDesc *) getdata(m);
649
    DevDesc *dd = (DevDesc *) getdata(m);
650
    SaveAsWin(dd,"win.print");        
650
    SaveAsWin(dd,"win.print");
651
}
651
}
652
 
652
 
653
 
653
 
654
 
654
 
655
static void menuclose(control m)
655
static void menuclose(control m)
Line 994... Line 994...
994
	/********************************************************/
994
	/********************************************************/
995
 
995
 
996
#define MCHECK(m) {if(!(m)) {del(xd->gawin); return 0;}}
996
#define MCHECK(m) {if(!(m)) {del(xd->gawin); return 0;}}
997
 
997
 
998
 
998
 
999
static int X11_Open(DevDesc *dd, x11Desc *xd, char *dsp, 
999
static int X11_Open(DevDesc *dd, x11Desc *xd, char *dsp,
1000
                    double w, double h)
1000
                    double w, double h)
1001
{
1001
{
1002
    /* if have to bail out with "error" then must */
1002
    /* if have to bail out with "error" then must */
1003
    /* free(dd) and free(xd) */
1003
    /* free(dd) and free(xd) */
1004
 
1004
 
Line 1044... Line 1044...
1044
            gsetcursor(xd->gawin, ArrowCursor);
1044
            gsetcursor(xd->gawin, ArrowCursor);
1045
            if (ismdi() && (RguiMDI & RW_TOOLBAR)) {
1045
            if (ismdi() && (RguiMDI & RW_TOOLBAR)) {
1046
                int btsize = 24;
1046
                int btsize = 24;
1047
                rect r = rect(2, 2, btsize, btsize);
1047
                rect r = rect(2, 2, btsize, btsize);
1048
                control bt, tb;
1048
                control bt, tb;
1049
                
-
 
-
 
1049
 
1050
                MCHECK(tb = newtoolbar(btsize + 4));
1050
                MCHECK(tb = newtoolbar(btsize + 4));
1051
		gsetcursor(tb, ArrowCursor);
1051
		gsetcursor(tb, ArrowCursor);
1052
                addto(tb);
1052
                addto(tb);
1053
 
1053
 
1054
                MCHECK(bt = newtoolbutton(cam_image, r, menuclpwm));
1054
                MCHECK(bt = newtoolbutton(cam_image, r, menuclpwm));
Line 1070... Line 1070...
1070
                r.x += (btsize + 6);
1070
                r.x += (btsize + 6);
1071
 
1071
 
1072
                MCHECK(xd->stoploc = newtoolbutton(stop_image, r, menustop));
1072
                MCHECK(xd->stoploc = newtoolbutton(stop_image, r, menustop));
1073
                MCHECK(addtooltip(xd->stoploc, "Stop locator"));
1073
                MCHECK(addtooltip(xd->stoploc, "Stop locator"));
1074
		gsetcursor(bt, ArrowCursor);
1074
		gsetcursor(bt, ArrowCursor);
1075
                setdata(xd->stoploc,(void *) dd);            
1075
                setdata(xd->stoploc,(void *) dd);
1076
                hide(xd->stoploc);
1076
                hide(xd->stoploc);
1077
            } else
1077
            } else
1078
                xd->stoploc = NULL;
1078
                xd->stoploc = NULL;
1079
 
1079
 
1080
	    /* First we prepare 'locator' menubar and popup */
1080
	    /* First we prepare 'locator' menubar and popup */
Line 1325... Line 1325...
1325
    }
1325
    }
1326
    xd->bg = dd->dp.bg;
1326
    xd->bg = dd->dp.bg;
1327
    xd->bgcolor = rgb(R_RED(xd->bg),
1327
    xd->bgcolor = rgb(R_RED(xd->bg),
1328
		      R_GREEN(xd->bg),
1328
		      R_GREEN(xd->bg),
1329
		      R_BLUE(xd->bg));
1329
		      R_BLUE(xd->bg));
1330
    if (xd->kind) 
1330
    if (xd->kind)
1331
       xd->clip = getrect(xd->gawin);
1331
       xd->clip = getrect(xd->gawin);
1332
    else
1332
    else
1333
       xd->clip = getrect(xd->bm);
1333
       xd->clip = getrect(xd->bm);
1334
    DRAW(gfillrect(_d, xd->bgcolor, getrect(_d)));
1334
    DRAW(gfillrect(_d, xd->bgcolor, getrect(_d)));
1335
    if (xd->kind)
1335
    if (xd->kind)
Line 1642... Line 1642...
1642
    gdrawstr(xd->gawin, xd->font, xd->fgcolor, pt(x, y), str);
1642
    gdrawstr(xd->gawin, xd->font, xd->fgcolor, pt(x, y), str);
1643
    if (!xd->kind) {
1643
    if (!xd->kind) {
1644
	gsetcliprect(xd->bm, getrect(xd->bm));
1644
	gsetcliprect(xd->bm, getrect(xd->bm));
1645
	gdrawstr(xd->bm, xd->font, xd->fgcolor, pt(x, y), str);
1645
	gdrawstr(xd->bm, xd->font, xd->fgcolor, pt(x, y), str);
1646
    }
1646
    }
1647
#else      
1647
#else
1648
    DRAW(gdrawstr(_d, xd->font, xd->fgcolor, pt(x, y), str));
1648
    DRAW(gdrawstr(_d, xd->font, xd->fgcolor, pt(x, y), str));
1649
#endif
1649
#endif
1650
}
1650
}
1651
 
1651
 
1652
	/********************************************************/
1652
	/********************************************************/
Line 1682... Line 1682...
1682
    addto(xd->gawin);
1682
    addto(xd->gawin);
1683
    gchangemenubar(xd->mbar);
1683
    gchangemenubar(xd->mbar);
1684
    if (xd->stoploc) {
1684
    if (xd->stoploc) {
1685
      hide(xd->stoploc);
1685
      hide(xd->stoploc);
1686
      show(xd->gawin);
1686
      show(xd->gawin);
1687
    }    
1687
    }
1688
    gsetcursor(xd->gawin, ArrowCursor);
1688
    gsetcursor(xd->gawin, ArrowCursor);
1689
    gchangepopup(xd->gawin, xd->grpopup);
1689
    gchangepopup(xd->gawin, xd->grpopup);
1690
    addto(xd->gawin);
1690
    addto(xd->gawin);
1691
    setstatus("R Graphics");
1691
    setstatus("R Graphics");
1692
    xd->locator = 0;
1692
    xd->locator = 0;
Line 1883... Line 1883...
1883
	errorcall(call, "invalid device number");
1883
	errorcall(call, "invalid device number");
1884
    dd = GetDevice(device);
1884
    dd = GetDevice(device);
1885
    if(!dd) errorcall(call, "invalid device");
1885
    if(!dd) errorcall(call, "invalid device");
1886
    filename = CADR(args);
1886
    filename = CADR(args);
1887
    if (!isString(filename) || LENGTH(filename) != 1)
1887
    if (!isString(filename) || LENGTH(filename) != 1)
1888
	errorcall(call, "invalid filename argument\n");
1888
	errorcall(call, "invalid filename argument");
1889
    fn = CHAR(STRING(filename)[0]);
1889
    fn = CHAR(STRING(filename)[0]);
1890
    fixslash(fn);
1890
    fixslash(fn);
1891
    type = CADDR(args);
1891
    type = CADDR(args);
1892
    if (!isString(type) || LENGTH(type) != 1)
1892
    if (!isString(type) || LENGTH(type) != 1)
1893
	errorcall(call, "invalid filename argument\n");
1893
	errorcall(call, "invalid filename argument");
1894
    tp = CHAR(STRING(type)[0]);
1894
    tp = CHAR(STRING(type)[0]);
1895
    Rprintf("device %d fn %s tp %s\n", device, fn, tp);
1895
    Rprintf("device %d fn %s tp %s\n", device, fn, tp);
1896
    
1896
 
1897
    if(!strcmp(tp, "gif")) {
1897
    if(!strcmp(tp, "gif")) {
1898
	SaveAsGif(dd, fn);
1898
	SaveAsGif(dd, fn);
1899
    } else if (!strcmp(tp, "wmf")) {
1899
    } else if (!strcmp(tp, "wmf")) {
1900
	sprintf(display, "win.metafile:%s", fn);
1900
	sprintf(display, "win.metafile:%s", fn);
1901
	SaveAsWin(dd, display);
1901
	SaveAsWin(dd, display);
1902
    } else if (!strcmp(tp, "ps")) {
1902
    } else if (!strcmp(tp, "ps")) {
1903
	SaveAsPostscript(dd, fn);
1903
	SaveAsPostscript(dd, fn);
1904
    } else 
1904
    } else
1905
	errorcall(call, "unknown type\n");
1905
	errorcall(call, "unknown type");
1906
    return R_NilValue;
1906
    return R_NilValue;
1907
}
1907
}