Hi Graham,

first, keep in mind that the 'loca' table, as well as many other ones, are
simply never copied in the heap if the font file is already memory-mapped.
this happens if you use FT_New_Memory_Face, or even FT_New_Face if your
underlying stream implementation supports memory-mapped files (the Linux one
does). in these cases, all accesses are directly done from the original font
file memory. see the code in FT_Stream_ExtractFrame for details.

FT_Get_Char_Index is one of these functions that are heavily used by a
typical text rendering engine that uses FreeType, and modifying the
underlying cmap decoders to use a stream interface is certainly possible,
but is going to have a significant impact on text layout performance.

- David

2007/12/11, Graham Asher <[EMAIL PROTECTED]>:
>
> TrueType fonts contain several tables that vary in a linear way with the
> size of the font. Some of these, for example hmtx (horizontal metrics) are
> not loaded into the heap, but are accessed using the stream interface.
> Others, like cmap (which maps character codes to glyph indexes) and loca
> (which maps glyph indexes to glyph data) are loaded in their entirety into
> the heap.
>
> The fact that some of these tables are loaded into the heap means that for
> devices with a small amount of RAM there is always a font big enough to
> cause an out-of-memory error; the amount of heap used is O(N) where N is
> the
> number of glyphs. The font itself can be kept 'somewhere else' - in ROM,
> for
> instance - so the size of the font data itself is not at issue. On small
> devices RAM is typically in much shorter supply than ROM.
>
> An ideal solution to the problem is to make it a configurable option for
> all
> tables to be accessed via the stream interface and not loaded into the
> heap.
> I have already experimentally done this for the cmap table and it works
> perfectly, saving over 80K when loading a Japanese font. The technique is
> this:
>
> 1. Allow the cmap table to be loaded as normal.
>
> 2. Note its location in the file, and any other information needed to
> access
> it.
>
> 3. Unload the cmap table from the heap.
>
> 4. Replace FT_Get_Char_Index with a new function that reads the cmap via a
> stream interface.
>
> For the 'loca' table the only good way to prevent it from being loaded is
> to
> unload it then override the normal way of getting glyph data, using the
> incremental interface; however, it would be much nicer if there was a
> compile-time or perhaps run-time option that forced stream access to all
> variable-sized tables.
>
> I have had time to do this only with rather platform-specific code which
> unfortunately I can't show here because it is proprietary, but I just
> wanted
> to give my opinion that this would be a useful new feature for FreeType. I
> shall very probably not have time to do it myself, but someone more
> familiar
> with FreeType internals might be able to code it up very quickly in a way
> that fitted in with the existing architecture.
>
> Best regards,
>
> Graham Asher
>
>
>
>
> _______________________________________________
> Freetype-devel mailing list
> [email protected]
> http://lists.nongnu.org/mailman/listinfo/freetype-devel
>
_______________________________________________
Freetype-devel mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/freetype-devel

Reply via email to