From p.murrell at auckland.ac.nz  Sun Dec  6 21:26:52 2009
From: p.murrell at auckland.ac.nz (Paul Murrell)
Date: Mon, 07 Dec 2009 09:26:52 +1300
Subject: [Rd] raster support in graphics devices
In-Reply-To: <de4e29f50912031310j598729f3g9a188d6a270cb91c@mail.gmail.com>
References: <4B146EC6.2000502@auckland.ac.nz>	
	<de4e29f50912011038v33c3503dmb732dbd0d8ffd456@mail.gmail.com>	
	<4B15A5C0.4060400@auckland.ac.nz>
	<de4e29f50912031310j598729f3g9a188d6a270cb91c@mail.gmail.com>
Message-ID: <4B1C138C.5080204@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/



[Rd] raster support in graphics devices
Paul Murrell