Added fonts while LO is running - propagating the changes

Lubos Lunak l.lunak at
Mon Sep 10 08:24:27 PDT 2012


 I have implemented basic .docx support for embedded fonts, which temporarily 
adds the embedded fonts to the list of fonts used by the running LO instance, 
but I struggle to actually propagate the change to all parts of LO. While for 
example rendering the actual documents works (because the fonts are added 
before the document is created), I cannot find a reasonably good way of 
updating e.g. the font combobox or the RMB->Character dialog.

 The problems seem to stem from the fact that some font information is cached 
per OutputDevice and that SwDocShell has a font list as well 
(SID_ATTR_CHAR_FONTLIST). I'm unsure how to tell these to refresh their 

 Actual adding of the font is done using OutputDevice::AddTempDevFont(), which 
however updates only the one OutputDevice instance. I've also added a call to 
OutputDevice::ImplUpdateAllFontData(), but that one

- triggers a warning in ImplFontCache::Invalidate() about the font items 
refcount not being zero, because some of the fonts are already used by the 
time of the call. Looking at the assert, I would intuitively say it is bogus, 
since a cache shouldn't care if some of its cached items are also used 
elsewhere, and remove the assert. However, not being quite new to this 
codebase anymore, I can't rule out that e.g. the ImplFontCache class is not 
actually a font cache and therefore the Invalidate() function not only needs 
to invalidate the stored items but also delete them for whatever reason.

- does not really work until I change the "if ( GetOutDevType() == 
OUTDEV_PRINTER || mpPDFWriter )" condition in 
OutputDevice::ImplUpdateFontData() to "if( true )" to actually update the 
font information stored in OutputDevices. Repo history does not help and I 
have no idea why that font information updating should happen only in those 
selected cases.

 I've tried also propagating a DATACHANGED_FONTS event (similarly like done in 
OutputDevice::EndFontSubstitution()) to update information, but that doesn't 
work for the SwDocShell case, because it is not a window, therefore it 
doesn't get the event (as far as I understand this).  The embedded fonts are 
added after SwDocShell for the document is created but before SwEditWin 
(which I think would get the event) for the document is created, so 
SwDocShell has the old font list.

 Does somebody have any idea about any of these?

 Lubos Lunak
 l.lunak at

More information about the LibreOffice mailing list