diff options
author | Po Lu <luangruo@yahoo.com> | 2023-10-30 15:32:58 +0800 |
---|---|---|
committer | Po Lu <luangruo@yahoo.com> | 2023-10-30 15:33:27 +0800 |
commit | ecc8870981ef1a802f9504b1d0f261d19ab372b1 (patch) | |
tree | ef80cdae1f4a47e2740c17b91503384fd8242ca3 /src/sfnt.c | |
parent | bdec2d2d464919572ae948ba8150e014aa649191 (diff) | |
download | emacs-ecc8870981ef1a802f9504b1d0f261d19ab372b1.tar.gz |
Ascertain font spacing from post table if present
* src/sfnt.c (sfnt_table_names): Introduce name of post table.
(sfnt_read_post_table): New function.
(main): New tests.
* src/sfnt.h (struct sfnt_post_table): New struct.
* src/sfntfont.c (sfnt_enum_font_1): Read post table, and set
spacing from its is_fixed_pitch value.
(sfntfont_list_1): Compare spacing between both fonts if
supplied in the font spec.
(sfntfont_open): Set FONT_FILE_INDEX as well as
FONT_FULLNAME_INDEX.
Diffstat (limited to 'src/sfnt.c')
-rw-r--r-- | src/sfnt.c | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/sfnt.c b/src/sfnt.c index 7559055e8c2..8ec19290859 100644 --- a/src/sfnt.c +++ b/src/sfnt.c @@ -158,6 +158,7 @@ static uint32_t sfnt_table_names[] = [SFNT_TABLE_CVAR] = 0x63766172, [SFNT_TABLE_AVAR] = 0x61766172, [SFNT_TABLE_OS_2] = 0x4f532f32, + [SFNT_TABLE_POST] = 0x706f7374, }; /* Swap values from TrueType to system byte order. */ @@ -15474,6 +15475,69 @@ sfnt_read_OS_2_table (int fd, struct sfnt_offset_subtable *subtable) +/* PostScript metadata retrieval. + + TrueType fonts electively incorporate a table of miscellaneous + information concerning such matters as the underline position or + whether the font is fixed pitch. This table also assigns + human-readable names to glyphs, subject to the table format, but + these names are not read by the functions defined below. */ + +/* Read the header of a post table from the given font FD. Refer to + the table directory SUBTABLE for its location. + + Return the post table header if successful, NULL otherwise. */ + +TEST_STATIC struct sfnt_post_table * +sfnt_read_post_table (int fd, struct sfnt_offset_subtable *subtable) +{ + struct sfnt_post_table *post; + struct sfnt_table_directory *directory; + ssize_t rc; + + /* Search for the post table within SUBTABLE. */ + + directory = sfnt_find_table (subtable, SFNT_TABLE_POST); + + if (!directory) + return NULL; + + /* Although the size of the table is affected by its format, this + function is meant to read only its header; guarantee that the + directory is that large. */ + + if (directory->length < sizeof *post) + return NULL; + + /* Seek to the location given in the directory. */ + if (lseek (fd, directory->offset, SEEK_SET) == (off_t) -1) + return NULL; + + post = xmalloc (sizeof *post); + rc = read (fd, post, sizeof *post); + + if (rc == -1 || rc != sizeof *post) + { + xfree (post); + return NULL; + } + + /* Byte swap the data retrieved. */ + sfnt_swap32 (&post->format); + sfnt_swap32 (&post->italic_angle); + sfnt_swap16 (&post->underline_position); + sfnt_swap16 (&post->underline_thickness); + sfnt_swap32 (&post->is_fixed_pitch); + sfnt_swap32 (&post->min_mem_type_42); + sfnt_swap32 (&post->max_mem_type_42); + sfnt_swap32 (&post->min_mem_type_1); + sfnt_swap32 (&post->max_mem_type_1); + + return post; +} + + + #ifdef TEST struct sfnt_test_dcontext @@ -19359,6 +19423,7 @@ main (int argc, char **argv) struct sfnt_avar_table *avar; struct sfnt_cvar_table *cvar; struct sfnt_OS_2_table *OS_2; + struct sfnt_post_table *post; sfnt_fixed scale; char *fancy; int *advances; @@ -19495,6 +19560,7 @@ main (int argc, char **argv) gvar = sfnt_read_gvar_table (fd, font); avar = sfnt_read_avar_table (fd, font); OS_2 = sfnt_read_OS_2_table (fd, font); + post = sfnt_read_post_table (fd, font); cvar = NULL; hmtx = NULL; @@ -19515,6 +19581,17 @@ main (int argc, char **argv) fprintf (stderr, "OS/2 table found!\nach_vendor_id: %.4s\n", OS_2->ach_vendor_id); + if (post) + fprintf (stderr, "post table: format: %g; italic-angle: %g;\n" + "underline_position: %"PRIi16"; underline_thickness: %" + PRIi16";\n" + "is_fixed_pitch: %"PRIu32"\n", + sfnt_coerce_fixed (post->format), + sfnt_coerce_fixed (post->italic_angle), + post->underline_position, + post->underline_thickness, + post->is_fixed_pitch); + if (fvar) { fprintf (stderr, "FVAR table found!\n" @@ -20178,6 +20255,7 @@ main (int argc, char **argv) xfree (avar); xfree (cvar); xfree (OS_2); + xfree (post); return 0; } |