We do this by using `totalSfntSize' as an initial reference, and extending
the buffer when required. This reduces rendering time considerably.
* include/freetype/internal/wofftypes.h (WOFF2_HeaderRec): Add
`totalSfntSize', rename `total_sfnt_size' to `actual_sfnt_size'.
* src/sfnt/sfwoff2.c (write_buf): Add parameter `dst_size' to keep track
of and update total size of stream.
(WRITE_SFNT_BUF, WRITE_SFNT_BUF_AT): Modify macros accordingly.
(pad4, store_loca, reconstruct_glyf, reconstruct_hmtx): Update parameters
to accept `sfnt_size'.
(woff2_open_font): Add variable `sfnt_size'. Use WOFF2 header field
`totalSfntSize' as initial reference (if value makes sense) and allocate
`totalSfntSize' bytes for the sfnt stream. `write_buf' handles
reallocation if and when required. Also resize the stream to
`actual_sfnt_size' after reconstruction.
Add necessary functions to reconstruct loca and hmtx tables (the 2
remaining tables that can have a transform). `woff2_open_font' is now
capable of loading a woff2 font face. This code may still need more
refining and better memory management.
* include/freetype/internal/wofftypes.h (WOFF2_HeaderRec): Add total (final)
size of sfnt stream.
(WOFF2_InfoRec): Add header checksum value.
* src/sfnt/sfobjs.c (sfnt_open_font): Change `face_instance_index' parameter
to its pointer so its value can be modified by `woff2_open_font'.
* src/sfnt/sfwoff2.c: (WRITE_SFNT_BUF_AT): New macro to write into sfnt
buffer at given position.
(write_buf): Add parameter `extend_buf' which allows caller to specify
whether buffer should be reallocated before copying data. Modify macro
`WRITE_SFNT_BUF' accordingly.
(pad4): New function to pad buffer to closest multiple of 4.
(store_loca): Store loca values (provided by `reconstruct_glyf') to output
stream.
(reconstruct_glyf): Calculate loca values and store them.
(reconstruct_hmtx): Reconstruct transformed hmtx table.
(reconstruct_font): Call `reconstruct_hmtx', write table record entries, and
calculate table checksums. Also calculate font checksum and update
`checksumAdjustment' entry in head table.
(woff2_open_font): Open stream for sfnt buffer, swap out input stream and
return.
* src/sfnt/sfwoff2.h (woff2_open_font): Modify parameter to accept pointer
to `face_index'.
Reconstruct `glyf' table if it is transformed in the uncompressed table
stream. Also add necessary structures, macros and functions.
* include/freetype/internal/wofftypes.h (WOFF2_InfoRec,
WOFF2_SubstreamRec, WOFF2_PointRec): New structures.
* src/sfnt/sfwoff2.c (READ_255USHORT, READ_BASE128): Use `FT_SET_ERROR'
to set implicit `error' variable.
(WRITE_SHORT): New macro.
(N_CONTOUR_STREAM, N_POINTS_STREAM, FLAG_STREAM, GLYPH_STREAM,
COMPOSITE_STREAM, BBOX_STREAM, INSTRUCTION_STREAM): New macros to refer
to substreams of the transformed `glyf' tables.
(Read255UShort, ReadBase128): Return errors set by `FT_READ_XXX' macros.
(with_sign, safe_int_addition): New functions to add sign to values
based on a flag and perform safe addition respectively.
(triplet_decode): Decode variable-length (flag, xCoordinate, yCoordinate)
triplet for a simple glyph. See
https://www.w3.org/TR/WOFF2/#triplet_decoding
(store_points): Store decoded points in the glyph buffer.
(compute_bbox): Derive bounding box for a glyph by computing the minimum
and maximum x and y coordinates in the outline.
(reconstruct_glyf): Main routine to reconstruct transformed `glyf' table.
(reconstruct_font): Call `reconstruct_glyf'.
* src/sfnt/sfwoff2.h: Add required constants.
* src/sfnt/woff2tags.h: Move out constants to `sfwoff2.h'.
Add structures and macro for WOFF 2 header and table directory.
* include/freetype/internal/wofftypes.h (WOFF2_HeaderRec,
WOFF2_TableRec_): New structures.
* include/freetype/tttags.h (TTAG_wOF2): New macro.