From gregory_r_warnes at groton.pfizer.com  Mon Jul  7 20:50:38 2003
From: gregory_r_warnes at groton.pfizer.com (gregory_r_warnes@groton.pfizer.com)
Date: Mon Jul  7 19:50:36 2003
Subject: [Rd] feature enhancement request & patch:
	dev.control(displaylist='en (PR#3424)
Message-ID: <200307071750.h67HocJH025538@pubhealth.ku.dk>

This message is in MIME format. Since your mail reader does not understand
this format, some or all of this message may not be legible.

------_=_NextPart_000_01C344B0.28BC0750
Content-Type: text/plain; charset="windows-1252"


Summary:

Currently R provides 
	> dev.control(displaylist='inhbit') 
to turn *off* the recording of graphics operations in a device, but there is
no method to explicitly turn it on.   

Attached is a patch which provides support for 
	> dev.control(displaylist='enable') 
to explicitly turn on recording of graphics operations.

Background:

I'm using R in a non-interactive context and want to be able to use dev.copy
to copy the graph from one device to another so that I can create graphs in
a number of output formats without re-running the sequence of plot commands
(which include some expensive computations).  

Unfortunately, this does not currently work for many graphics devices since
they have recording of graphics operations turned off by default, and there
is no way to turn it on.  The attached patch provides a modified dev.control
and support functions to allow display recording to be turned on.

With the attached, the following text produces 3 copies of the original plot
in the 3 different output formats:

	postscript(file="heatmap.eps", onefile=FALSE)
	dev.control(displaylist='enable')

	heatmap( matrix(rnorm(100),ncol=5))

	dev.copy(bitmap,file="heatmap.png", res=100); dev.off()
	dev.copy(pdf,file="heatmap.pdf", onefile=F); dev.off()

	dev.off()

I've tested this patch on today's R-patched under Solaris 8 with
postscript(), pdf(), bitmap(), and x11() and it appears to work correctly.

As an aside, I wonder if it might be a good idea to change the parameter to
dev.control to make it more mnemonic and easier to use.  For example, the
parameter could be 'record' and take a boolean argument instead of a
arbitrary string.    Further, it would be convenient for my use if the
'record' parameter was an optional parameter for the device creation
commands.  Thus one could do

	postscript(file="heatmap.eps", onefile=FALSE, record=TRUE)
	heatmap(...)
	...

-Greg

 <<dev_control.patch>> 


LEGAL NOTICE
Unless expressly stated otherwise, this message is confidential and may be privileged. It is intended for the addressee(s) only. Access to this E-mail by anyone else is unauthorized. If you are not an addressee, any disclosure or copying of the contents of this E-mail or any action taken (or not taken) in reliance on it is unauthorized and may be unlawful. If you are not an addressee, please inform the sender immediately.

------_=_NextPart_000_01C344B0.28BC0750
Content-Type: application/octet-stream;
	name="dev_control.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
	filename="dev_control.patch"

diff -ur R-patched/src/library/base/R/device.R =
R-patched-grw/src/library/base/R/device.R=0A=
--- R-patched/src/library/base/R/device.R	2002-05-28 06:45:11.000000000 =
-0400=0A=
+++ R-patched-grw/src/library/base/R/device.R	2003-07-07 =
12:00:33.000000000 -0400=0A=
@@ -180,9 +180,12 @@=0A=
 {=0A=
     if(!missing(displaylist)) {=0A=
 	if(displaylist =3D=3D "inhibit") {=0A=
-            if(dev.cur() > 1) .Internal(dev.control())=0A=
+            if(dev.cur() > 1) .Internal(dev.control(FALSE))=0A=
             else stop("dev.control() called without an open graphics =
device")=0A=
-	} else stop("displaylist should be inhibit")=0A=
+	} else if(displaylist =3D=3D "enable") {=0A=
+            if(dev.cur() > 1) .Internal(dev.control(TRUE))=0A=
+            else stop("dev.control() called without an open graphics =
device")=0A=
+        } else stop("displaylist should be inhibit")=0A=
     }=0A=
     invisible()=0A=
 }=0A=
diff -ur R-patched/src/library/base/man/dev2.Rd =
R-patched-grw/src/library/base/man/dev2.Rd=0A=
--- R-patched/src/library/base/man/dev2.Rd	2002-05-28 =
06:45:12.000000000 -0400=0A=
+++ R-patched-grw/src/library/base/man/dev2.Rd	2003-07-07 =
12:00:18.000000000 -0400=0A=
@@ -17,8 +17,7 @@=0A=
     For \code{dev.print}, this includes \code{which} and by default =
any=0A=
     \code{\link{postscript}} arguments.}=0A=
   \item{which}{A device number specifying the device to copy to}=0A=
-  \item{displaylist}{A character string: the only valid value is=0A=
-    \code{"inhibit"}.}=0A=
+  \item{displaylist}{A character string: \code{"inhibit"} or =
\code{"enable"}.}=0A=
 }=0A=
 \description{=0A=
   \code{dev.copy} copies the graphics contents of the current =
device=0A=
@@ -35,7 +34,8 @@=0A=
 =0A=
   \code{dev.control} allows the user to control the recording of=0A=
   graphics operations in a device.  If \code{displaylist} is =
\code{"inhibit"}=0A=
-  then recording is turned off.=0A=
+  then recording is turned off.  If \code{displaylist} is =
\code{"enable"} =0A=
+  recording is turned on.=0A=
 }=0A=
 \value{=0A=
   \code{dev.copy} returns the name and number of the device which =
has=0A=
diff -ur R-patched/src/main/graphics.c =
R-patched-grw/src/main/graphics.c=0A=
--- R-patched/src/main/graphics.c	2003-02-04 10:19:52.000000000 =
-0500=0A=
+++ R-patched-grw/src/main/graphics.c	2003-07-07 11:16:39.000000000 =
-0400=0A=
@@ -6121,3 +6121,12 @@=0A=
     else=0A=
 	dd->displayListOn =3D FALSE;=0A=
 }=0A=
+=0A=
+void enableDisplayList(DevDesc *dd)=0A=
+{=0A=
+    GEinitDisplayList((GEDevDesc*) dd);=0A=
+    if (dd->newDevStruct)=0A=
+	((GEDevDesc*) dd)->dev->displayListOn =3D TRUE;=0A=
+    else=0A=
+	dd->displayListOn =3D TRUE;=0A=
+}=0A=
diff -ur R-patched/src/main/names.c R-patched-grw/src/main/names.c=0A=
--- R-patched/src/main/names.c	2003-03-22 21:13:18.000000000 -0500=0A=
+++ R-patched-grw/src/main/names.c	2003-07-07 11:48:45.000000000 =
-0400=0A=
@@ -716,7 +716,7 @@=0A=
 =0A=
 /* Graphics */=0A=
 =0A=
-{"dev.control",	do_devcontrol,	0,	111,	0,	{PP_FUNCALL, PREC_FN,	=
0}},=0A=
+{"dev.control",	do_devcontrol,	0,	111,	1,	{PP_FUNCALL, PREC_FN,	=
0}},=0A=
 {"dev.copy",	do_devcopy,	0,	111,	1,	{PP_FUNCALL, PREC_FN,	0}},=0A=
 {"dev.cur",	do_devcur,	0,	111,	0,	{PP_FUNCALL, PREC_FN,	0}},=0A=
 /*=0A=
diff -ur R-patched/src/main/plot.c R-patched-grw/src/main/plot.c=0A=
--- R-patched/src/main/plot.c	2003-02-25 18:08:41.000000000 -0500=0A=
+++ R-patched-grw/src/main/plot.c	2003-07-07 11:47:16.000000000 =
-0400=0A=
@@ -51,9 +51,13 @@=0A=
 =0A=
 SEXP do_devcontrol(SEXP call, SEXP op, SEXP args, SEXP env)=0A=
 {=0A=
+    int listFlag =3D LOGICAL(CAR(args))[0];=0A=
     checkArity(op, args);=0A=
-    inhibitDisplayList(CurrentDevice());=0A=
-    return R_NilValue;=0A=
+    if(listFlag)=0A=
+      enableDisplayList(CurrentDevice());=0A=
+    else=0A=
+      inhibitDisplayList(CurrentDevice());=0A=
+    return ScalarLogical(listFlag);=0A=
 }=0A=
 =0A=
 SEXP do_devcopy(SEXP call, SEXP op, SEXP args, SEXP env)=0A=

------_=_NextPart_000_01C344B0.28BC0750--


[Rd] feature enhancement request & patch: dev.control(displaylist='en (PR#3424)
gregory_r_warnes@groton.pfizer.com