Added fonts while LO is running - propagating the changes

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


 Hello,

 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 
information.

 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 suse.cz


More information about the LibreOffice mailing list