From p.murrell at auckland.ac.nz  Mon Dec 14 03:50:20 2009
From: p.murrell at auckland.ac.nz (Paul Murrell)
Date: Mon, 14 Dec 2009 15:50:20 +1300
Subject: [Rd] raster support in graphics devices
In-Reply-To: <de4e29f50912061259y283eb4abp14bb3f1637d6113@mail.gmail.com>
References: <4B146EC6.2000502@auckland.ac.nz>	
	<de4e29f50912011038v33c3503dmb732dbd0d8ffd456@mail.gmail.com>	
	<4B15A5C0.4060400@auckland.ac.nz>	
	<de4e29f50912031310j598729f3g9a188d6a270cb91c@mail.gmail.com>	
	<4B1C138C.5080204@auckland.ac.nz>
	<de4e29f50912061259y283eb4abp14bb3f1637d6113@mail.gmail.com>
Message-ID: <4B25A7EC.8090102@auckland.ac.nz>

Hi


baptiste auguie wrote:
> 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 have not been able to get hold of a 10.5 (Leopard) Mac either.  Keen 
to hear confirmation from anyone else with this problem.


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


I have thought a bit about drawing the same image multiple times (more 
in the context of using a bitmap for a plotting symbol).  I imagine 
something like being able to "add" a raster image to a device and then 
simply "refer" to that image (e.g., by name) is needed.  Still thinking 
about the right way to go about that though.

Paul


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

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