[Rd] A problem about the Japanese font of OSX

Ei-ji Nakama nakama at ki.rim.or.jp
Fri May 23 07:57:51 CEST 2008


Many Japanese were troubled with the setting of the font.

I added the following to .Rprofile first.

setHook(packageEvent("grDevices", "onLoad"),
                     function(...){
                       grDevices::quartzFonts(sans=grDevices::quartzFont(
                         c("Hiragino Kaku Gothic Pro W3",
                           "Hiragino Kaku Gothic Pro W6",
                           "Hiragino Kaku Gothic Pro W3",
                           "Hiragino Kaku Gothic Pro W6")))
                       grDevices::quartz.options(family="sans")
)

However, it was not reflected in family of the default.
If I appoint it with `quartz(family="sans")', which was able to use Japanese.
Therefore I added hook.

attach(NULL, name = "MacJapanEnv")
assign("familyset_hook",
        function() { if(names(dev.cur())=="quartz") par(family="sans")},
        pos="MacJapanEnv")
setHook("plot.new", get("familyset_hook", pos="MacJapanEnv"))

However, the following practice caused a problem.

> plot(1:5,1:5)
> legend("bottomright",legend=c("a","b"),lwd=1,col=1:2)

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000014
0x900031c8 in strlen ()
(gdb) bt
#0  0x900031c8 in strlen ()
#1  0x907bf19c in CFStringCreateWithCString ()
#2  0x0221bc58 in RQuartz_FindFont (fontface=-2147483648,
fontfamily=0xbfffc3c0 "sans") at devQuartz.c:533
#3  0x0221bd0c in RQuartz_Font (gc=0xbfffc378, dd=0x17) at devQuartz.c:548
#4  0x0221c184 in RQuartz_Set (ctx=0x2155eb0, gc=0xbfffc378, flags=8)
at devQuartz.c:623
#5  0x0221cc3c in RQuartz_StrWidth (text=0x1ff7e20 "a", gc=0xbfffc378,
dd=0x212cd60) at devQuartz.c:736

Reference of fontface seems to watch the thing which R must not sometimes watch.

--- R-patched.orig/src/library/grDevices/src/devQuartz.c
2008-05-01 00:45:39.000000000 +0900
+++ R-patched/src/library/grDevices/src/devQuartz.c     2008-05-22
13:16:46.000000000 +0900
@@ -529,7 +529,7 @@
         int i;
         for(i = 0; i < length(names); i++)
             if(0 == strcmp(fontfamily, CHAR(STRING_ELT(names, i)))) break;
-        if(i < length(names))
+        if(i < length(names) && fontface > 0)
             fontName = CFStringCreateWithCString(kCFAllocatorDefault,

CHAR(STRING_ELT(VECTOR_ELT(db, i), fontface - 1)),
                                                 kCFStringEncodingUTF8);

There was not the problem in the Japanese environment if this added a change.

-- 
EI-JI Nakama <nakama at ki.rim.or.jp>
"\u4e2d\u9593\u6804\u6cbb" <nakama at ki.rim.or.jp>



More information about the R-devel mailing list