> I have been going through the WOFF2 specifications, and there a lot
> of optional fields in various tables.
> 
> For example, the header size is fixed (48 bytes), but the table
> directory (https://www.w3.org/TR/WOFF2/#table_dir_format) has
> 2 optional fields, `tag' and `transformLength'.  In addition, the
> data type 255UInt16 can be one to three bytes and UIntBase128 can be
> *upto* 5 bytes long.
> 
> My question is, how can reading these variable-length streams be
> handled with `FT_FRAME_ENTER' and supporting macros?

You can't.

> `FT_FRAME_ENTER' requires a fixed frame size, which I believe is
> always the number of bytes the cursor traverses by the time
> `FT_FRAME_EXIT' is called (please correct me if I am wrong about
> this).

Correct.

> This would mean that if I take the frame size to be the sum of the
> upper bounds of the sizes of all possible fields, I will be
> overshooting in most cases.  Is there a correct solution to this
> that I'm missing?

You have to split the handling into fixed-size and variable-size
parts.  For the fixed-size stuff you can use `FT_FRAME_*'; for the
remaining part you should probably use `FT_NEXT_*', together with
manual checking whether there is sufficient input.  Example:

  if ( p + 8 <= limit )
    return FT_THROW( Invalid_Table );
  foo = FT_NEXT_ULONG( p );
  bar = FT_NEXT_ULONG( p );

Have a look at `TT_Load_Simple_Glyph' for some real-world code.


    Werner
_______________________________________________
Freetype-devel mailing list
Freetype-devel@nongnu.org
https://lists.nongnu.org/mailman/listinfo/freetype-devel

Reply via email to