From baptiste.auguie at googlemail.com  Thu Dec  3 22:10:10 2009
From: baptiste.auguie at googlemail.com (baptiste auguie)
Date: Thu, 3 Dec 2009 22:10:10 +0100
Subject: [Rd] raster support in graphics devices
In-Reply-To: <4B15A5C0.4060400@auckland.ac.nz>
References: <4B146EC6.2000502@auckland.ac.nz>
	<de4e29f50912011038v33c3503dmb732dbd0d8ffd456@mail.gmail.com>
	<4B15A5C0.4060400@auckland.ac.nz>
Message-ID: <de4e29f50912031310j598729f3g9a188d6a270cb91c@mail.gmail.com>

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

 *** 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/
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: quartzClip.pdf
Type: application/pdf
Size: 26671 bytes
Desc: not available
URL: <https://stat.ethz.ch/pipermail/r-devel/attachments/20091203/cd012176/attachment-0002.pdf>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pdfClip.pdf
Type: application/pdf
Size: 1950816 bytes
Desc: not available
URL: <https://stat.ethz.ch/pipermail/r-devel/attachments/20091203/cd012176/attachment-0003.pdf>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: pngClip.png
Type: image/png
Size: 30763 bytes
Desc: not available
URL: <https://stat.ethz.ch/pipermail/r-devel/attachments/20091203/cd012176/attachment-0001.png>


[Rd] raster support in graphics devices
baptiste auguie