[Rd] raster support in graphics devices

baptiste auguie baptiste.auguie at googlemail.com
Sun Dec 6 21:59:12 CET 2009


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/
>



More information about the R-devel mailing list