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