From xie at yihui.name  Wed Feb 22 00:38:07 2017
From: xie at yihui.name (Yihui Xie)
Date: Tue, 21 Feb 2017 17:38:07 -0600
Subject: [Rd] [FORGED] Re: Replaying a recorded plot (mixed base and
 grid) from pdf() in cairo_pdf() crashes R
In-Reply-To: <8f40e0c8-874b-f992-b5c5-38a46810ccf9@stat.auckland.ac.nz>
References: <CANROs4dy7xvbYRAXHMQbrBjQiYrYgETUpBAAyPBk-rzOaNoWCA@mail.gmail.com>
	<CANROs4cd=EhVBsn25njQv7Uea+UHy=FqL18A-wOQ7pehmjXFjg@mail.gmail.com>
	<03c36881-6487-7446-2fc4-90458106cd68@stat.auckland.ac.nz>
	<8f40e0c8-874b-f992-b5c5-38a46810ccf9@stat.auckland.ac.nz>
Message-ID: <CANROs4dY8akRAwhg7gL0t3O=hXN5ZRLSYx4+=FvAX__B+18sTg@mail.gmail.com>

Thanks a lot! I don't use cairo_pdf() very often. I discovered this
problem because a user reported an issue with cairo_pdf() in knitr,
and I found it was reproducible without using knitr.

Regards,
Yihui
--
https://yihui.name


On Tue, Feb 21, 2017 at 5:32 PM, Paul Murrell <paul at stat.auckland.ac.nz> wrote:
> Hi
>
> I decided to blame cairo_pdf().
>
> There is a fix in r-devel (r72242) that works for the reported case, plus
> some basic sanity checks.
>
> I could not complete 'make check-devel' because it was failing on
> reg-tests-1d.R ...
>
>> stopifnot(length(fd) == 10, identical(fd, format(dct <- as.POSIXct(dlt))))
> Error: identical(fd, format(dct <- as.POSIXct(dlt))) is not TRUE
>
> ... anyone else seeing that ?
>
> I would appreciate confirmation from a heavier user of cairo_pdf() that I
> have not broken anything.
>
> Paul
>
>
> On 21/02/17 08:27, Paul Murrell wrote:
>>
>> Hi
>>
>> This appears to be happening (at least) because cairo_pdf() delays
>> initialising a Cairo surface until BM_NewPage(), rather than
>> initiliasing a Cairo surface in BM_Open(), and replayPlot() triggers
>> some activity (set clip region) on the device BEFORE a new page is
>> started (so the pointer to the Cairo surface is null, so BOOM).
>>
>> Not sure yet whether to blame replayPlot() for not starting with a new
>> page operation OR to blame cairo_pdf() for not initialising a Cairo
>> surface at device startup.
>>
>> If anyone who knows more about Cairo (or cairo_pdf()) wants to point out
>> a good reason for the way cairo_pdf() currently works, please don't hold
>> back.
>>
>> Paul
>>
>> On 21/02/17 05:30, Yihui Xie wrote:
>>>
>>> A quick follow-up: I just used cairo_pdf() as the recording device,
>>> and it crashes R as well, so it is probably not relevant to pdf() but
>>> an issue specific to cairo_pdf().
>>>
>>> cairo_pdf()
>>> dev.control('enable')
>>>
>>> library("grid")
>>> plot(1)
>>> grid.text("A")
>>>
>>> res = recordPlot()
>>> dev.off()
>>>
>>> cairo_pdf()
>>> replayPlot(res)
>>> dev.off()
>>>
>>>
>>> Regards,
>>> Yihui
>>> --
>>> https://yihui.name
>>>
>>>
>>> On Mon, Feb 20, 2017 at 10:24 AM, Yihui Xie <xie at yihui.name> wrote:
>>>>
>>>> Hi,
>>>>
>>>> I wonder if this is expected or I'm doing a wrong thing.
>>>>
>>>> pdf()
>>>> dev.control('enable')
>>>>
>>>> library("grid")
>>>> plot(1)
>>>> grid.text("A")
>>>>
>>>> res = recordPlot()
>>>> dev.off()
>>>>
>>>> cairo_pdf()
>>>> replayPlot(res)
>>>> dev.off()
>>>>
>>>>
>>>>  *** caught segfault ***
>>>> address 0x4, cause 'memory not mapped'
>>>>
>>>>
>>>>> sessionInfo()
>>>>
>>>> R version 3.3.2 (2016-10-31)
>>>> Platform: x86_64-apple-darwin13.4.0 (64-bit)
>>>> Running under: macOS Sierra 10.12.3
>>>>
>>>> locale:
>>>> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
>>>>
>>>> attached base packages:
>>>> [1] stats     graphics  grDevices utils     datasets  methods   base
>>>>
>>>> loaded via a namespace (and not attached):
>>>> [1] tools_3.3.2 yaml_2.1.14
>>>>
>>>> Regards,
>>>> Yihui
>>>> --
>>>> https://yihui.name
>>>
>>>
>>> ______________________________________________
>>> 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/



[Rd] [FORGED] Re: Replaying a recorded plot (mixed base and grid) from pdf() in cairo_pdf() crashes R
Yihui Xie