Re: [Rd] raster support in graphics devices

From: baptiste auguie <baptiste.auguie_at_googlemail.com>
Date: Thu, 03 Dec 2009 22:10:10 +0100

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 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()

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

______________________________________________

R-devel_at_r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel
pngClip.png
Received on Thu 03 Dec 2009 - 21:51:01 GMT

This archive was generated by hypermail 2.2.0 : Wed 09 Dec 2009 - 01:51:05 GMT