Commit Graph

6649 Commits

Author SHA1 Message Date
Nikhil Ramakrishnan f67786de4d [woff2] Check whether known tag is in array bounds.
If table tag is not 0x3f, we expect a value between 0 and 62. If this is
not the case, exit with errors.

* src/sfnt/sfwoff2/c: Check whether table tag makes sense.

* src/sfnt/woff2tags.c: Return 0 if tag is out of bounds.
2019-08-22 16:46:03 +05:30
Nikhil Ramakrishnan 933c185b7e [woff2] More formatting and documentation.
* include/freetype/internal/wofftypes.h, src/sfnt/sfwoff2.c: Implement
formatting changes suggested as

  https://lists.nongnu.org/archive/html/freetype-devel/2019-08/msg00052.html
2019-08-21 20:21:02 +05:30
Nikhil Ramakrishnan 25774f3da5 * src/sfnt/sfwoff2.c: Improve trace comments.
Add tracing levels for comments, and more formatting.
2019-08-17 14:57:59 +05:30
Nikhil Ramakrishnan 3f35a033b6 [woff2] Formatting.
* src/sfnt/sfobjs.c, src/sfnt/sfwoff2.c: Better formatting.
2019-08-14 17:39:55 +05:30
Nikhil Ramakrishnan 73dc5ef018 [woff2] Support hmtx reconstruction when glyf is untransformed.
`reconstruct_hmtx' requires `info->x_mins' and `info->num_glyphs' to
reconstruct the hmtx table. In case glyf is not transformed, we call
`get_x_mins' which does the necessary work.

(get_x_mins): New function.
(reconstruct_font): Call get_x_mins.
2019-08-14 02:36:27 +05:30
Nikhil Ramakrishnan b25c352ed4 [sfnt] Support `face->num_faces' for WOFF2 fonts.
Set correct value of `face->num_faces' for WOFF2 fonts. This is being
handled separately because we only load the tables for the requested
font face in `woff2_open_font' and create a single-face sfnt stream.

The full discussion is at:

  https://lists.gnu.org/archive/html/freetype-devel/2019-08/msg00000.html

* src/sfnt/sfobjs.c (sfnt_open_font): Add parameter `woff2_num_faces'.
(sfnt_init_face): Introduce var `woff2_num_faces', and change
`face->root.num_faces' if `woff2_num_faces' is set.

* src/sfnt/sfwoff2.c (woff2_open_font): Validate requested face index
and handle negative face indices.

* src/sfnt/sfwoff2.h (woff2_open_font): Add parameter `num_faces' to
declaration.
2019-08-05 01:53:00 +05:30
Nikhil Ramakrishnan af7d2967d5 [woff2] Improve memory and error handling.
Free up memory after use, and improve error handling.

* src/sfnt/sfwoff2.c: Implement changes.
2019-07-28 19:38:05 +05:30
Nikhil Ramakrishnan befd05c060 Avoid too many calls to `FT_REALLOC'.
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.
2019-07-18 01:50:16 +05:30
Nikhil Ramakrishnan b9414b4dc6 Reconstruct loca, hmtx and swap out stream.
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'.
2019-07-16 02:45:03 +05:30
Nikhil Ramakrishnan f5a1a74c8d [woff2] Reconstruct transformed `glyf' table.
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'.
2019-07-13 03:14:17 +05:30
Nikhil Ramakrishnan 7bf104e759 [woff2] Copy un-transformed tables to sfnt stream.
Copy un-transformed tables to the sfnt stream.

* src/sfnt/sfwoff2.c: (WRITE_SFNT_BUF): New macro.
(write_buf): New function. Extend memory of `dst' buffer and copy bytes
from `src'.
(compute_ULong_sum): New function. Calculate checksum of table.
(woff2_uncompress): Change `FT_Byte* sfnt' to `FT_Byte** sfnt_bytes'.
This has been done because we reallocate memory to `sfnt' multiple
times, which may change the pointer value of `sfnt'. This new pointer
must be propogated back to the caller. Same reason for using a double
pointer in `write_buf'.

* src/sfnt/woff2tags.h: Define default max size to prevent overflow.
2019-07-06 18:05:18 +05:30
Nikhil Ramakrishnan c325089c2f [woff2] Create stream for uncompressed buffer.
Uncompressed buffer is now an `FT_Stream'.

Perform basic checks and start iterating over tables.

* src/sfnt/sfwoff2.c (stream_close, find_table, read_num_hmetrics): New
functions.
(reconstruct_font): Modify params and iterate over tables.
2019-07-05 01:09:52 +05:30
Nikhil Ramakrishnan 0d0bd49be5 [woff2] Handle TTCs and start reconstructing font.
We `handle' TTCs by modifying the `indices' array to point to only those
tables that are part of the requested `face_index'.

Set and use `num_tables' in `WOFF2_TtcFont'.

Start reconstruction of font.

* src/sfnt/sfwoff2.c (reconstruct_font): New function.
2019-07-01 01:29:30 +05:30
Nikhil Ramakrishnan 045c6b1162 [woff2] Get known tags from function.
Change `KnownTags' to a function (`woff2_known_tags'). This avoids
introducing a global constant array. This function returns the specified
index without *any* checks. The caller must ensure that `index' is
within array limits.

* src/sfnt/sfwoff2.c (woff2_open_font): Change `KnownTags[...]' notation
to `woff2_known_tags( ... )'.

* src/sfnt/woff2tags.c: Perform changes.

* src/sfnt/woff2tags.h: Update definitions.
2019-06-30 20:01:20 +05:30
Nikhil Ramakrishnan 6cb1146433 * src/sfnt/sfwoff2.c: Minor. 2019-06-30 19:32:27 +05:30
Nikhil Ramakrishnan f6c4d58ec8 Uncompress Brotli streams and face_index support.
WOFF2 compressed stream is now uncompressed if Brotli is available. This
data is stored in a separate buffer (uncompressed_buf) because it does
not contain direct table data. Certain tables have transformations
applied to them, and they must be reconstructed before we can write
those tables to the SFNT stream.

`face_index' is now being passed as a parameter to `woff2_open_font'.

* src/sfnt/sfobjs.c (sfnt_open_font): Add parameter
`face_instance_index'.

* src/sfnt/sfwoff2.c (woff2_uncompress): New function.
(woff2_open_font): Call `woff2_uncompress'.

* src/sfnt/sfwoff2.h (woff2_open_font): Modify declaration.
2019-06-30 04:36:44 +05:30
Nikhil Ramakrishnan 6d3d309ae6 * builds/unix/configure.raw: Change argument name to brotli. 2019-06-30 04:15:55 +05:30
Nikhil Ramakrishnan 8e05ab3e2e Add Brotli dependency and required checks.
Brotli is required for decompressing WOFF2 font directory streams.
The library is thus being added as an optional dependency for FreeType.

* builds/unix/configure.raw: Add checks for `libbrotlidec'.

* devel/ftoption.h, include/freetype/config/ftoption.h
(FT_CONFIG_OPTION_USE_BROTLI): New macro.
2019-06-28 01:01:17 +05:30
Nikhil Ramakrishnan 47f009d703 [woff2] Write SFNT Offset table. 2019-06-24 01:07:18 +05:30
Nikhil Ramakrishnan eb229dfabf * src/sfnt/sfwoff2.c: #undef macros. 2019-06-18 23:32:55 +05:30
Nikhil Ramakrishnan e635053045 [woff2] Read table and collection directory.
* include/freetype/internal/wofftypes.h (WOFF2_TtcFontRec): New
structure.
(WOFF2_HeaderRec): Add more fields.

* src/sfnt/woff2.c (READ_255USHORT, READ_BASE128, ROUND4): New macros.
(Read255UShort, CollectionHeaderSize, compute_first_table_offset): New
functions.
(woff2_open_font): Add functionality to read table directory and
collection directory (if present).
2019-06-16 19:09:09 +05:30
Nikhil Ramakrishnan d614e8afbc [sfnt] Include `woff2tags.c' for building.
* src/sfnt/rules.mk: Add `woff2tags.c'.

* src/sfnt/sfnt.c: Include `woff2tags.c'.
2019-06-16 19:09:08 +05:30
Nikhil Ramakrishnan f1083eae5e [sfnt] Add WOFF2 constants.
Add constants required for WOFF2, and known table tags as defined in the
specification. See

  https://www.w3.org/TR/WOFF2/#table_dir_format

for details.

* src/sfnt/woff2tags.c, src/sfnt/woff2tags.h: New files.
2019-06-16 19:09:08 +05:30
Nikhil Ramakrishnan 1b7f95bf70 Read WOFF 2 header.
Check for WOFF2 tag, call `woff2_open_font', and implement it to read
header according to specification.

* include/freetype/internal/fttrace.h: Add `sfwoff2.c'.

* src/sfnt/rules.mk: Add `sfwoff2.c'.

* src/sfnt/sfnt.c: Include `sfwoff2.c'.

* src/sfnt/sfobjs.c: Check for `wOF2' tag and call `woff2_open_font'.

* src/sfnt/sfwoff2.c, src/sfnt/sfwoff2.h: New files.
2019-06-16 19:09:07 +05:30
Nikhil Ramakrishnan c26c91aa39 Add structures for WOFF2.
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.
2019-06-16 19:09:07 +05:30
Werner Lemberg 47ca5cb69d [autofit] Disable hinting if no blue zones are available (#56450).
* src/autofit/afglobal.c (af_face_global_get_metrics): Start again
(with dummy hinter module) if no blue zones are present.

* src/autofit/aflatin.c (af_latin_metrics_init_blues): Change
signature to return error code.
If no blue zones are found, update `glyph_styles' array to hold
AF_STYLE_NONE_DFLT instead of the current style.
(af_latin_metrics_init): Return internal error code if no blue zones
are found.
2019-06-16 15:33:32 +02:00
Werner Lemberg 82e4090431 Towards better VMS support.
More to come.

* builds/vms/LIBS.OPT_IA64, builds/vms/_LINK.OPT_IA64,
builds/vms/vmslib.dat: New files provided by Jouk Jansen
<joukj@hrem.nano.tudelft.nl>.

* builds/vms/ftconfig.h: Update, also from Jouk.
2019-06-16 10:11:46 +02:00
Werner Lemberg 3736b28af9 * src/autofit/aflatin.c (af_latin_metrics_init_widths): Minor. 2019-06-13 13:45:05 +02:00
Werner Lemberg 8acd9800ed Add memory access macro summary. 2019-06-13 11:12:26 +02:00
Alexei Podtelezhnikov e7ac9288ac [smooth] Restore the span buffering for direct mode only.
The buffer size FT_MAX_GRAY_SPANS is set to 10 spans, which should be
enough to cover the entire scanline for simple glyphs in most cases:
each slightly slanted edge needs up to two spans, plus a filling span
in-between.  This is not new, we used to do it before cb4388783c.

* src/smooth/ftgrays.c (gray_TWorker): Add `spans' and `num_spans'.
(gray_hline, gray_sweep): Implement the span buffering.
(gray_raster_render): Use negative `num_spans' to avoid the direct
mode.
2019-06-13 00:17:36 -04:00
Alexei Podtelezhnikov 59e0c6f92e * include/freetype/ftmodapi.h (FT_DebugHook_Func): Return error.
Fix a warning by adding a return value as in `TT_RunIns',
which should not be a compatibility issue.
2019-06-12 22:30:21 -04:00
Alexei Podtelezhnikov bdac4cbe6f Rendering considerations. 2019-06-12 21:58:35 -04:00
Alexei Podtelezhnikov d1b16325e2 * src/truetype/ttobjs.c (tt_check_trickyness_family): Add `const'. 2019-06-11 21:43:47 -04:00
Moazin Khatti 6a92b1fadd [gzip] Add support for `gzip' encoded header (#9812). 2019-06-11 21:29:52 +05:00
Alexei Podtelezhnikov 78c02bc110 [type1,type42] Use `const' for string literals.
* include/freetype/internal/psaux.h (PS_Table_FuncsRec): Updated.
* include/freetype/internal/t1types.h (T1_EncodingRec): Updated.
* src/psaux/psobjs.[ch] (ps_table_add): Updated.
* src/type1/t1load.c (T1_Open_Face, parse_encoding): Updated.
* src/type42/t42objs.c (T42_Open_Face): Updated.
* src/type42/t42parse.c (t42_parse_encoding): Updated.

* src/cff/cffobjs.c (cff_face_init): Minor.
2019-06-10 23:09:49 -04:00
Alexei Podtelezhnikov afaf3f1de9 [bdf,pcf] Use `const' for string literals.
* src/bdf/bdf.h (bdf_property_t): Updated `name'.
* src/bdf/bdflib.c (_bdf_list_split,bdf_create_property,
_bdf_add_property,_bdf_ato*): Updated.
* src/bdf/bdfdrivr.c (bdf_interpret_style): Updated.
* src/pcf/pcfread.c (pcf_intrpret_style): Ditto.
2019-06-10 22:27:39 -04:00
Werner Lemberg 7fde521bd9 Update CHANGES file. 2019-06-10 15:37:33 +02:00
Philip Race 711b593e4b * src/base/ftinit.c (FT_Set_Default_Properties): Fix crash.
Terminate loop at end of environment.
2019-06-07 09:15:28 +02:00
Alexei Podtelezhnikov c949ab0757 Minor. 2019-06-04 20:17:05 -04:00
Alexei Podtelezhnikov e13c1f46dc Solidify VC2005 builds.
* include/freetype/internal/ftcalc.h (FT_MSB) [_MSC_VER]: Explicitly
declare `_BitScanReverse' intrinsic.
* builds/windows/visualc/freetype.vcproj [Debug]: Disable intrinsics.
2019-05-31 22:31:47 -04:00
Nikhil Ramakrishnan 7b275a5af1 [sfnt] Separate WOFF sources and headers.
Move WOFF sources and headers to separate files.

* include/freetype/internal/wofftypes.h, src/sfnt/sfwoff.c,
src/sfnt/sfwoff.h: New files.

* include/freetype/internal/fttrace.h: Register `sfwoff.c'.

* include/freetype/internal/internal.h: Define
FT_INTERNAL_WOFF_TYPES_H.

* include/freetype/internal/sfnt.h: Include FT_INTERNAL_WOFF_TYPES_H.

* include/freetype/internal/tttypes.h: Move out WOFF structures.

* src/sfnt/rules.mk: Add `sfwoff.c'.

* src/sfnt/sfnt.c: Include `sfwoff.c'.

* src/sfnt/sfobjs.c: Include `sfwoff.h', move out WOFF sources.
2019-05-30 23:57:34 +05:30
Werner Lemberg f0de218ced [base] Fix `make multi'.
Reported by Nikhil.

* src/base/fterrors.c: Include FT_INTERNAL_DEBUG_H.
2019-05-30 08:43:45 +02:00
Ben Wagner f37083edf0 [truetype] Fix copy-and-paste error (#56409).
* src/truetype/ttgload.c (load_truetype_glyph): Use correct indices
into `unrounded' array for phantom points.
2019-05-29 08:15:38 +02:00
Werner Lemberg 49079ce297 [truetype] Fix 32bit builds (#56404).
Patch suggested by Ben Wagner <bungeman@google.com>.

* src/truetype/ttgxvar.c (FT_fixedToInt, FT_fixedToFdot6): Remove
harmful cast to unsigned type.
2019-05-29 08:08:53 +02:00
Werner Lemberg 9159128a92 Silence gcc 7's fall-through warnings in `switch' blocks.
Instead of an intentionally missing `break' statement there must be a
comment line containing `fall through' (and nothing else) right before the
next `case' statement.

See

  https://stackoverflow.com/questions/45129741/gcc-7-wimplicit-fallthrough-warnings-and-portable-way-to-clear-them
2019-05-29 07:51:59 +02:00
Ben Wagner 86d997e5b1 * src/truetype/ttgload.c (TT_Process_Simple_Glyph): Improve accuracy. 2019-05-26 09:37:41 -04:00
Nikhil Ramakrishnan e55f969869 * src/sfnt/sfobjs.h: Minor. 2019-05-25 20:56:54 +05:30
Werner Lemberg 306d2f6ccb [truetype] Draw glyphs without deltas in variation font (#56374).
* src/truetype/ttgxvar.c (TT_Vary_Apply_Glyph_Deltas): Always fill
`unrounded' array.
2019-05-23 14:41:57 +02:00
Werner Lemberg c3be6f06b7 src/truetype/ttinterp.c: Give order of operations for some instructions. 2019-05-21 11:23:36 +02:00
Werner Lemberg 262fce445a * src/truetype/ttinterp.c (opcode_name): Improve mnemonics. 2019-05-21 09:58:51 +02:00