Since I'm working with Paul on the glyph changes to the R graphics engine I'm 
quite interested in this so I had the idea to take out the guts from my Cairo 
package into a self-contained C code. Your request is good to bump is up on my 
stack. I already have code that draws text into OpenGL textures in Acinonyx, 
but properly it's only done on macOS so it may be worth combining both 
approaches to have a decent OpenGL text drawing library.

As for measurements, I didn't look at textshaping, but since both use 
Harfbuzz+FT they should be the same for the same font and scaling (in theory).

Cheers,
Simon



> On 25/09/2023, at 2:01 PM, Duncan Murdoch <murdoch.dun...@gmail.com> wrote:
> 
> I'm somewhat aware of how tricky it all is.  For now I'm going to do it in R 
> (usng textshaping for layout and base graphics on the ragg::agg_capture 
> device to draw to the bitmap).  I'll avoid allowing changes to happen in the 
> C++ code.
> 
> Eventually I'll see if I can translate the code into C++.  I know textshaping 
> has a C interface, but for the actual drawing I'll have to work something 
> else out.  Or maybe just leave it in R, and only try to write a new bitmap 
> when it's safe.
> 
> For future reference, will the measurements reported by 
> textshaping::shape_text() match the values used by your Cairo package, or are 
> equivalent measurements available elsewhere?
> 
> Duncan Murdoch
> 
> On 24/09/2023 6:55 p.m., Simon Urbanek wrote:
>> Duncan,
>> drawing text is one of the most complicated things you can do, so it really 
>> depends how for you want to go. You can do it badly with a simple cairo 
>> show_text API. The steps involved in doing it properly are detecting the 
>> direction of the language, finding fonts, finding glyphs (resolving 
>> ligatures), applying hints, drawing glyphs etc. Fortunately there are 
>> libraries that help with than, but even then it's non-trivial. Probably the 
>> most modern pipeline is icu + harfbuzz + freetype + fontconfig + cairo. This 
>> is implemented, e.g in 
>> https://github.com/s-u/Cairo/blob/master/src/cairotalk.c (the meat is in  
>> L608-) and for all but the drawing part there is an entire R package (in 
>> C++) devoted to this: https://github.com/r-lib/textshaping/tree/main/src -- 
>> Thomas Lin Pedersen is probably THE expert on this.
>> Cheers,
>> Simon
>>> On 24/09/2023, at 7:44 AM, Duncan Murdoch <murdoch.dun...@gmail.com> wrote:
>>> 
>>> I am in the process of updating the rgl package.  One thing I'd like to do 
>>> is to change text support in it when using OpenGL to display to be more 
>>> like the way text is drawn in WebGL displays (i.e. the ones rglwidget() 
>>> produces).
>>> 
>>> Currently in R, rgl uses the FTGL library to draw text.  That library is 
>>> unsupported these days, and uses the old fixed pipeline in OpenGL.
>>> 
>>> In WebGL, text is displayed by "shaders", programs that run on the GPU. 
>>> Javascript code prepares bitmap images of the text to display, then the 
>>> shader transfers parts of that bitmap to the output display.
>>> 
>>> I'd like to duplicate the WebGL process in the C++ code running the OpenGL 
>>> display in R.  The first step in this is to render a character vector full 
>>> of text into an in-memory raster, taking account of font, cex, etc.  (I 
>>> want one raster for the whole vector, with a recording of locations from 
>>> which the shader should get each component of it.)
>>> 
>>> It looks to me as though I could do this using the ragg::agg_capture device 
>>> in R code, but I'd prefer to do it all in C++ code because I may need to 
>>> make changes to the raster at times when it's not safe to call back to R, 
>>> e.g. if some user interaction requires the axis labels to be recomputed and 
>>> redrawn.
>>> 
>>> Does anyone with experience doing this kind of thing know of examples I can 
>>> follow, or have advice on how to proceed?  Or want to volunteer to help 
>>> with this?
>>> 
>>> Duncan Murdoch
>>> 
>>> ______________________________________________
>>> R-devel@r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>> 
> 

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to