raster support in graphics devices
Hi, Thanks for the fix. I hope the quartz bugs are not related to a bad configuration on my side (I don't have access to another Mac to test it). I was quite happy with this proof-of-concept of filling patterns for rectangles, and I was wondering if perhaps you had considered adding a similar tiling option to grid.raster (at the C level)? Best regards, baptiste 2009/12/6 Paul Murrell <p.murrell at auckland.ac.nz>:
Hi baptiste auguie wrote:
Hi again, I found two possible bugs related to grid.raster, one with the quartz device and the other with pdf. In my example I was playing with the idea of using grid.raster to create a filling pattern for rectangles. The pdf output does not seem to respect the clipping (it may have nothing to do with grid.raster though), whilst the quartz device with pdf file output often crashes for more than 4 different raster objects (but not always). I'm afraid I couldn't pinpoint the exact circumstance of the crash with a more concise example.
Thanks again for the report. I have committed a fix for the PDF clipping. Still looking at the Quartz crashes. Paul
Thanks in advance for any insights,
baptiste
### Start example ###
library(grid)
## create a motif
grid45 <- function(..., width=0.5, height=0.5){
?x11(width=width, height=height)
?grid.polygon(...)
?m <- grid.cap()
?dev.off()
?invisible(m)
}
.grid45 <- grid45()
## grid.raster(.grid45)
tile.motif <- function(m, nx=10, ny=nx){
?cols <- matrix(rep(m, nx), ncol=ncol(m)*nx, byrow=F)
?matrix(rep(t(cols), ny), nrow=nrow(cols)*ny, byrow=T)
}
## quartz()
## grid.raster(tile.motif(.grid45, 2, 3))
patternGrob <- function(x=unit(0.5, "npc"), y=unit(0.5, "npc"),
? ? ? ? ? ? ? ? ? ? ? ?width=unit(1, "npc"), height=unit(1, "npc"),
? ? ? ? ? ? ? ? ? ? ? ?motif=matrix("white"), AR=1,
? ? ? ? ? ? ? ? ? ? ? ?motif.width=unit(5, "mm"),
? ? ? ? ? ? ? ? ? ? ? ?motif.height=AR*motif.width,
? ? ? ? ? ? ? ? ? ? ? ?pattern.offset=c(0, 0), # unimplemented
? ? ? ? ? ? ? ? ? ? ? ?default.units="npc",
? ? ? ? ? ? ? ? ? ? ? ?clip=TRUE, # testing purposes
? ? ? ? ? ? ? ? ? ? ? ?gp=gpar(fill=NA), ...)
?{
? ?grob(x=x, y=y, width=width, height=height,
? ? ? ? motif=motif, motif.width=motif.width,
? ? ? ? motif.height=motif.height, clip=clip, gp=gp, ..., cl="pattern")
?}
widthDetails.pattern <- function(x) x$width
heightDetails.pattern <- function(x) x$height
drawDetails.pattern <- function(x, recording=TRUE){
## ? calculate the number of tiles
?nx <- ceiling(convertUnit(x$width, "in", value=TRUE) /
? ? ? ? ? ? ? ?convertUnit(x$motif.width, "in", value=TRUE)) + 1
?ny <- ceiling(convertUnit(x$height, "in", axisFrom = "y", value=TRUE) /
? ? ? ? ? ? ? ?convertUnit(x$motif.height, "in", axisFrom = "y",
value=TRUE)) + 1
?width <- convertUnit(x$width, "in")
?height <- convertUnit(x$height, "in", axisFrom = "y")
## ? clip the raster
?pushViewport(viewport(x=x$x, y=x$y,
? ? ? ? ?width=x$width, height=x$height, clip=x$clip))
?grid.raster(tile.motif(x$motif, nx, ny), width=nx*x$motif.width,
? ? ? ? ? ? ? ? ? ? ? ? height=ny*x$motif.height)
?upViewport()
## ? overlay the rectangle
?grid.rect(x=x$x, y=x$y,
? ? ? ? ?width=x$width, height=x$height,
? ? ? ? ?just="center", gp=x$gp)
}
g <- patternGrob(x=0.7, width=unit(0.3, "npc"),
? ? ? ? ? ? ? ? ?height=unit(5.2, "cm"),
? ? ? ? ? ? ? ? ?clip=TRUE, motif=.grid45)
## interactive use: OK
quartz()
grid.newpage()
grid.draw(g)
## png: OK
png(file="pngClip.png")
grid.newpage()
grid.draw(g)
dev.off()
## pdf: clipping does not occur
pdf(file="pdfClip.pdf")
grid.newpage()
grid.draw(g)
dev.off()
## quartz pdf: OK, but see below
quartz(file="quartzClip.pdf", type="pdf")
grid.newpage()
grid.draw(g)
dev.off()
g1 <- patternGrob(x=0.2, width=unit(0.2, "npc"),
? ? ? ? ? ? ? ? ?height=unit(5.2, "cm"),
? ? ? ? ? ? ? ? ?clip=TRUE, motif=.grid45)
g2 <- patternGrob(x=0.4, width=unit(0.2, "npc"),
? ? ? ? ? ? ? ? ?height=unit(5.2, "cm"),
? ? ? ? ? ? ? ? ?clip=TRUE, motif=.grid45)
g3 <- patternGrob(x=0.6, width=unit(0.2, "npc"),
? ? ? ? ? ? ? ? ?height=unit(5.2, "cm"),
? ? ? ? ? ? ? ? ?clip=TRUE, motif=.grid45)
g4 <- patternGrob(x=0.8, width=unit(0.2, "npc"),
? ? ? ? ? ? ? ? ?height=unit(5.2, "cm"),
? ? ? ? ? ? ? ? ?clip=TRUE, motif=.grid45)
quartz(file="quartzClip2.pdf", type="pdf")
grid.newpage()
grid.draw(g1)
grid.draw(g2)
grid.draw(g3)
grid.draw(g4)
dev.off()
?*** caught segfault ***
address 0x15dda018, cause 'memory not mapped'
Traceback:
?1: dev.off()
?sessionInfo()
R version 2.11.0 Under development (unstable) (2009-11-30 r50622)
i386-apple-darwin9.8.0
locale:
[1] en_GB.UTF-8/en_GB.UTF-8/C/C/en_GB.UTF-8/en_GB.UTF-8
attached base packages:
[1] grid ? ? ?stats ? ? graphics ?grDevices utils ? ? datasets ?methods
[8] base
2009/12/2 Paul Murrell <p.murrell at auckland.ac.nz>:
Hi baptiste auguie wrote:
Very nice, thank you for this great addition to R graphics! I can't wait to see lattice and ggplot2 functions that use rasterGrob to display images. The pdf output is so much better in every way! Incidentally, I ran into a segfault with grid.cap on the quartz device, but maybe it's normal at this stage.
This may be due to the fact that I tested the changes on Mac OS X 10.6 (looks like you have 10.5 ?), plus the fact that I am feeling my way a bit on the Mac. ?I have access to a 10.4 machine so I will try to take a look there. ?Thanks for the report. Paul
This works fine:
library(grid)
x11()
grid.text("test")
cap <- grid.cap()
This doesn't:
library(grid)
quartz()
grid.text("test")
cap <- grid.cap()
?*** caught segfault ***
address 0x18330001, cause 'memory not mapped'
Traceback:
?1: .Call(fnname, ..., PACKAGE = "grid")
?2: grid.Call("L_cap")
?3: grid.cap()
Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
[R.app GUI 1.30 (5527) i386-apple-darwin9.8.0]
sessionInfo()
R version 2.11.0 Under development (unstable) (2009-11-30 r50622) i386-apple-darwin9.8.0 locale: [1] en_GB.UTF-8/en_GB.UTF-8/C/C/en_GB.UTF-8/en_GB.UTF-8 attached base packages: [1] stats ? ? graphics ?grDevices utils ? ? datasets ?methods ? base Best regards, baptiste 2009/12/1 Paul Murrell <p.murrell at auckland.ac.nz>:
Hi This is for developers of extension packages that provide extra *graphics devices* for R. In the *development* version of R, support has been added to the graphics engine for sending raster images (bitmaps) to a graphics device. ?This consists mainly of two new device functions: ?dev_Raster() and dev_Cap(). The R_GE_version constant (in GraphicsEngine.h) has been bumped up to 6 as a marker of this change. This means that, at a minimum, all graphics devices should be updated to provide dummy implementations of these new functions that just say the feature is not yet implemented (see for example the PicTeX and XFig devices in the 'grDevices' package). A full implementation of dev_Raster() should be able to draw a raster image (provided as an array of 32-bit R colors) at any size, possibly (bilinear) interpolated (otherwise nearest-neighbour), at any orientation, and with a per-pixel alpha channel. ?Where these are not natively supported by a device, the graphics engine provides some routines for scaling and rotating raster images (see for example the X11 device). ?The dev_Cap() function should return a representation of a raster image captured from the current device. ?This will only make sense for some devices (see for example the Cairo device in the 'grDevices' package). A little more information and a couple of small examples are provided at http://developer.r-project.org/Raster/raster-RFC.html Paul -- Dr Paul Murrell Department of Statistics The University of Auckland Private Bag 92019 Auckland New Zealand 64 9 3737599 x85392 paul at stat.auckland.ac.nz http://www.stat.auckland.ac.nz/~paul/
______________________________________________ R-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
-- Dr Paul Murrell Department of Statistics The University of Auckland Private Bag 92019 Auckland New Zealand 64 9 3737599 x85392 paul at stat.auckland.ac.nz http://www.stat.auckland.ac.nz/~paul/
-- Dr Paul Murrell Department of Statistics The University of Auckland Private Bag 92019 Auckland New Zealand 64 9 3737599 x85392 paul at stat.auckland.ac.nz http://www.stat.auckland.ac.nz/~paul/