[poppler] [PATCH] Fix Splash back-end FT_Load_Glyph flags
Albert Astals Cid
aacid at kde.org
Fri Oct 2 15:23:16 PDT 2009
A Dimecres, 30 de setembre de 2009, Benoit Jacob va escriure:
> Hi,
>
> Here on Opensuse 11.2 / KDE 4.3.1, Okular gave me very poor rendering
> of PDF files. Example:
> http://imagebin.ca/view/Z7jDxF.html
>
> The attached patch fixes it so it now looks like this:
> http://imagebin.ca/view/a_rIPp.html
>
> For comparison, here's how it looks in Evince.
> http://imagebin.ca/view/hoRjU3.html
>
> As you can see, my fix makes Okular render this document exactly like
> Evince does.
Actually it does not, see the attached images, but i agree they look much
closer now ;-)
>
> *** What it does ***
>
> This patch changes the flags that are passed to FT_Load_Glyph.
>
> First, notice that the Cairo back-end has a very simple logic for
> that: it always passes
>
> FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP
>
> By contrast, the Splash back-end used to have a much more complex
> logic, that was buggy and self-inconsistent.
>
> It was buggy because it did this (in the file splash/SplashFTFont.cc):
>
> // if we have the FT2 bytecode interpreter, autohinting won't be used
> #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
>
> the bug here is that this preprocessor define is irrelevant here. It
> only tells you that FreeType was built with support for the bytecode
> interpreter, but it doesn't tell that the bytecode interpreter is
> enabled in the user's configuration. Here on openSUSE 11.2, this
> define was defined but the bytecode interpreter was still disabled in
> the default user config.
>
> Notice however a very important fact here: it was actually the
> intention of whoever wrote this code to disable hinting UNLESS the
> bytecode interpreter is enabled. This means that my patch, which
> disables hinting, honors the spirit of this code except perhaps in the
> case where the bytecode interpreter is enabled; but that case never
> was appropriately handled.
>
> Replacing this #ifdef by just "#if 0" was enough to fix the rendering
> glitches that I observed.
>
> However, the code also was self-inconsistent, because the
> determination of the flags was done at 3 different places in the code,
> namely in SplashFTFont::makeGlyph(), in
> SplashFTFont::getGlyphAdvance() and in SplashFTFont::getGlyphPath(),
> and out of these 3 implementations, only the first two agreed, the 3rd
> one was inconsistent with them.
>
> To fix that, my patch introduces a method
> SplashFTFont::getFTLoadFlags() that centralizes the computation of
> these flags.
>
> Here's its code:
>
> FT_Int32 SplashFTFont::getFTLoadFlags() const
> {
> return aa ? FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP
>
> : FT_LOAD_DEFAULT;
>
> }
>
> As you can see, in the anti-aliasing case, it does the exact same
> thing as the Cairo back-end.
>
> I preserved the existing logic for the non-anti-aliasing case, as I
> don't have an opinion on these matters. The logic of using
> FT_LOAD_DEFAULT in that case is what was previously being done in the
> Splash back-end and I just kept it without asking questions.
Interesting findings, have you tried that with the autohinter enabled?
Albert
>
> Cheers,
> Benoit
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: okular-zoom.png
Type: image/png
Size: 2487 bytes
Desc: not available
Url : http://lists.freedesktop.org/archives/poppler/attachments/20091003/0f2817e8/attachment.png
-------------- next part --------------
A non-text attachment was scrubbed...
Name: evince-zoom.png
Type: image/png
Size: 2544 bytes
Desc: not available
Url : http://lists.freedesktop.org/archives/poppler/attachments/20091003/0f2817e8/attachment-0001.png
More information about the poppler
mailing list