From baptiste.auguie at googlemail.com  Sun Dec  6 21:59:12 2009
From: baptiste.auguie at googlemail.com (baptiste auguie)
Date: Sun, 6 Dec 2009 21:59:12 +0100
Subject: [Rd] raster support in graphics devices
In-Reply-To: <4B1C138C.5080204@auckland.ac.nz>
References: <4B146EC6.2000502@auckland.ac.nz>
	<de4e29f50912011038v33c3503dmb732dbd0d8ffd456@mail.gmail.com>
	<4B15A5C0.4060400@auckland.ac.nz>
	<de4e29f50912031310j598729f3g9a188d6a270cb91c@mail.gmail.com>
	<4B1C138C.5080204@auckland.ac.nz>
Message-ID: <de4e29f50912061259y283eb4abp14bb3f1637d6113@mail.gmail.com>

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



[Rd] raster support in graphics devices
baptiste auguie