867 Commits

Author SHA1 Message Date
Ben Harris
7de0d19e5b U+0197 LATIN CAPITAL LETTER I WITH STROKE
With a small-cap glyph and appropriate mappings.  Hyperglot says that
adds nine more languages.
2025-09-07 11:19:40 +01:00
Ben Harris
08df83095e U+01B1 LATIN CAPITAL LETTER UPSILON
It's just an upside-down Omega.  Hyperglot says that gains us support
for five more languages.  The small-cap is just the already-existing
lower-case.
2025-09-07 11:13:45 +01:00
Ben Harris
8fcb685ee3 Added some useful African capitals
Not cities, but capital versions of some letters we already had in
lower-case for IPA.  Specifically:

U+0186 LATIN CAPITAL LETTER OPEN O
U+0189 LATIN CAPITAL LETTER AFRICAN D
U+0190 LATIN CAPITAL LETTER OPEN E
U+0196 LATIN CAPITAL LETTER IOTA
U+01B2 LATIN CAPITAL LETTER V WITH HOOK

Between them, Hyperglot thinks this gains us useful coverage of
languages with a few tens of millions of speakers, which seems like good
value to me.

The all also have small caps, and in the case of the African D all the
capital-D variants.
2025-09-07 10:56:12 +01:00
Ben Harris
b39bef99df Proper names for Wgrave, wgrave, Wacute, wacute, Ygrave, and ygrave
Turns out that these are in AGLFN.  No compatibility aliases because
they never appeared in a release with the wrong names.
2025-09-06 23:36:26 +01:00
Ben Harris
e4359c014a Redesign U+028B LATIN SMALL LETTER V WITH HOOK
The International Phonetic Association's preferred sans-serif font
doesn't give this character a serif at the top left, so Bedstead
shouldn't either.  Also the bottom-left corner of the letter is subtly
curved, so I've rounded off that corner a bit as well.  The result is
more like the IPA's ideal and also easier to design a capital version
of.
2025-09-06 22:25:23 +01:00
Ben Harris
a72de29bc5 More-consistent 'W' glyphs
Now all of the caps and small caps have a central peak four pixels
above the baseline, and all of the lower-case have a central peak
three pixels above the baseline.  The outer arms vary as necessary to
accommodate accents and for small caps.
2025-09-06 10:18:20 +01:00
Ben Harris
6d9c0733e4 Add W/w with grave and acute
Hyperglot says these are needed for Welsh, and they're trivial to
draw.

There seems to be some confusion around the proper shape for small-cap
W in Bedstead; I should investigate this in more detail.
2025-09-06 10:18:10 +01:00
Ben Harris
fd6977574e Add Y/y with grave
They're trivial and Hyperglot says they're necessary for writing Welsh.
2025-09-06 10:17:18 +01:00
Ben Harris
9faf29dd8c Add icircumflex.sc as an alias of Icircumflex
Spotted by Shaperglot.  I disagree with a lot of its complaints, but
in this it was entirely correct.
2025-09-04 22:00:02 +01:00
Ben Harris
912f9e1ff3 Try to generate more-symmetric stem hints
When generating hints for a symmetric glyph like 'v', it's helpful if
the hits are symmetric because that means that the hinted bitmap is
also likely to be symmetric.  This is particularly visible on
Microsoft Windows where the version of 'v' before this patch ended up
horribly distorted when rendered at 20 ppem in Bedstead Condensed.  To
try to avoid such horrors, we now select hints starting at the outside
edges of the character and working inwards, instead of going from left
to right or top to bottom.  This means that where hints conflict,
we'll tend to choose the ones towards the outside edge of the
character, rather than towards the top or left.

This changes the hinting for 50 glyphs, but all in ways that look
superficially reasonable.

For more complicated characters we probably still want to think about
hint substitution, but that still scares me.
2025-08-30 14:01:56 +01:00
Ben Harris
bb5d6c879b Update version to 3.252 bedstead-3.252 2025-05-27 22:24:01 +01:00
Ben Harris
247ffb0a77 Quick note on automated tools in CONTRIBUTING
It's apparent that the idea that you should disclose the use of such
tools is not as widespread as I'd thought, so I should make it
explicit.
2025-05-22 00:27:33 +01:00
Ben Harris
f94a7062e3 Switch from asctime() to strftime()
C23 marks asctime() as deprecated and it seems polite to keep up with
that.  Using strftime() isn't noticeably more complicated: the "%c"
specifier does what we want and we don't get a spurious newline that
we have to remove again.
2025-03-25 11:09:54 +00:00
Ben Harris
bcd1d5304a Replace the one use of sprintf() with snprintf()
It only acts on constant strings, so it can't actually overflow, but
this way I can assert() that it really doesn't.
2025-03-13 13:49:43 +00:00
Ben Harris
aea0b12ba2 Don't emit counter hints for horizontal stems
Microsoft Windows 11 pays some attention to counter hints, and the
results are disastrous.  Specifically, at awkward ppem, characters
with counter hints end up one pixel smaller that characters without
them.  That makes the counters the same size, and puts every
horizontal stem squarely on a pixel, but means that cap height is all
wobbly, which looks horrible.  Additionally, some characters ('2' and
'3', at least) end up grossly distorted, with the top of the character
either stretched way above the character cell or squashed down to the
centre line.

Turning off the counter hints solves these problems.  Windows does
then draw the 'B' with its centre-line below the centre rather than
above it, but that's not a regression from 002.009.  As far as I can
tell, FreeType 2.12.1 ignores counter hints entirely.  At least, the
output of ftlint at 11 ppem is the same before and after this change.

Vertical counter hints survive.  They're also ignored by FreeType
2.12.1 (as are all vertical stem hints), but they seem to have a
broadly positive effect in Windows.
2025-03-03 22:57:37 +00:00
Ben Harris
0d2296e4af Further SOURCE_DATE_EPOCH simplification
Rather than mucking about with errno, we can just take advantage of the
fact that on overflow, strtoull() is specified to return ULLONG_MAX,
which is guaranteed to be (much) bigger than the maximum
SOURCE_DATE_EPOCH that we can cope with.  So our usual range check can
cope with overflow as well.
2025-02-27 23:00:24 +00:00
Ben Harris
528c0542ed Handle SOURCE_DATE_EPOCH in unsigned long long, not unitmax_t
unsigned long long is guaranteed to be big enough.  No need to go
bigger.
2025-02-27 22:48:52 +00:00
Ben Harris
60136bf337 Slightly simplify SOURCE_DATE_EPOCH handling
Subtracting 30 years' worth of seconds from the date and then adding
2000 years is unnecessary when we can just add 1970 years instead.
2025-02-27 22:32:19 +00:00
Ben Harris
1ebb828fbc Add a "Unique font identifier" string (name ID 3)
This seems to be necessary for the font viewer in MS Windows 11 to
consider the font to be valid.  The semantics of this field are not
documented in the OpenType spec, but the Apple TrueType spec does at
least give an example.  I've roughly followed Apple's example, putting
together the full name, version number, and build date that we already
have to hand and include in the font.  Between them those should
uniquely identify reasonable builds of Bedstead fonts without adding
extra complexity or non-reproducibility.
2025-02-27 09:49:38 +00:00
Ben Harris
392971588a Policy on Git commit messages in CONTRIBUTING
I've never been comfortable with constructing or editing commit
messages that will appear under someone else's name, but on the other
hand I don't want to be forced either to use someone else's message
untouched or to remove their name from the "Author" field.  Allowing
myself to make clearly-marked edits seems to be a good compromise, and
square brackets are a common way of marking edits and editorial
comments.
2025-02-06 10:53:38 +00:00
Ben Harris
759f263d60 More portable handling of SOURCE_DATE_EPOCH
Now we don't make any assumption about being on a POSIX system, and
instead have our own implementation of gmtime().  This turns out to be
shorter than the comment explaining why the previous code was more or
less valid.

While I'm in the area, also fail if the year is after 9999, since
asctime() causes undefined behaviour in those cases.
2025-02-04 23:11:17 +00:00
Ben Harris
239363800f Update rom.ps for renaming of ccedilla.angular to ccedilla.square 2025-02-03 22:36:21 +00:00
Ben Harris
9f143e7c01 Update date at the head of bedstead.c 2025-02-03 09:39:10 +00:00
Ben Harris
2cb837fe6f Clarify 3.251 release notes
Better late than never.
2025-02-03 00:32:37 +00:00
Ben Harris
da2e1af9d4 Update version to 3.251 bedstead-3.251 2025-02-02 17:00:00 +00:00
Ben Harris
9b8a3dc4fd Rename "angular" cedilla as "square"
They both have angles, after all.  Also "square" sorts more
conveniently in the 'aalt' lookup.
2025-02-02 11:29:58 +00:00
Ben Harris
c6fac43ec3 Rough sketch of 3.251 release notes 2025-02-01 16:13:53 +00:00
Ben Harris
cf2fb8b610 Add private-use code points for new unmapped glyphs
Also turn seriffed Dcroats into aliases for the corresponding Eths to
slightly reduce the number of nominally distinct glyphs.
2025-02-01 10:43:49 +00:00
Ben Harris
4db92cb508 Add E with cedilla
That's a real cedilla, and hence gets the SAA5054 angular form.  It's
also the last Latin letter with a cedilla that isn't blocked by
something else.  At least, until Unicode adds a new one.
2025-01-30 21:18:45 +00:00
Ben Harris
0d8f1b4c6f Glyphs for G, K, L, N, and R with comma below
These are the remaining characters that Unicode calls "WITH CEDILLA" but
that the standard (and code charts) say should actually have a comma
below by default.
2025-01-30 21:07:41 +00:00
Ben Harris
ce2dc007ec Redesign Hcedilla and hcedilla
The Unicode code charts and all the fonts I have conveniently to hand
are agreed that the cedilla should be attached to the letter, usually
to the left leg.  So now it is in Bedstead as well.  This also allows
the body of the letter to return to its normal shape.
2025-01-30 20:34:52 +00:00
Ben Harris
1f2248de9a Add S with comma below
As with T, this is distinct from the cedilla version, but it's
visually identical in Bedstead except when you turn on 'cv96'.
2025-01-30 14:15:44 +00:00
Ben Harris
926cedd4bc Add T with comma below
If I'm going to insist that U+0162 and U+0163 really have cedillas, I
should have their unambiguously comma-below versions, U+021A and
U+021B, as well.
2025-01-30 14:11:02 +00:00
Ben Harris
6326c4362d Convert cedillas under D to commas
According to Unicode 16.0.0 (chapter 7), U+0327 COMBINING CEDILLA is
ambiguous.  It can mean an actual cedilla, but it can also mean a
comma below.  This also applies to precomposed characters containing
it.  Unicode recommends default forms for various letters and in
particular says that for D and T (upper- and lower-case) the comma
form should be the default.

However, Unicode now has a separate U+021A LATIN CAPITAL LETTER T WITH
COMMA BELOW and recommends its use for Romanian.  So I think the
recommendation to render U+0162 LATIN CAPITAL LETTER T WITH CEDILLA with
a comma below is no longer applicable.

I have now updated Bedstead so that U+1E10 LATIN CAPITAL LETTER D WITH
CEDILLA is treated as having a comma below instead.  In practice, this
just means that it's unaffected by 'cv96'

All references to capital letters above apply equally to the
corresponding small letters.
2025-01-30 14:02:11 +00:00
Ben Harris
2cee520a53 Sort elements of the FeatureIndices array by feature tag
The OpenType spec (version 1.9.1) says, "The FeatureRecord array
should be sorted alphabetically by feature tag."  Bedstead was instead
emitting them in the order in which they appeared in the gsub_features
array, which was determined by the order the lookups need to occur in.
In particular, the 'cvXX' lookups need to occur after the 'ssXX'
lookups so as to override them properly.

Fixing this required some care to keep all the indices straight, but I
think I've managed it.
2025-01-29 22:10:40 +00:00
Ben Harris
37dafb753a Add comments with feature tags for FeatureIndices 2025-01-29 21:40:32 +00:00
Ben Harris
689b4a76f4 Use a conventional lenof() macro for lengths of static arrays
It's slightly unconventional in that it casts the result to int, which
is fine for all our arrays and avoids warnings when we use it.
2025-01-29 13:57:28 +00:00
Ben Harris
72fb39b706 Add parameter labels for 'cvXX' features
This means that now each possible variant of a character covered by a
'cvXX' feature has a human-readable name.  I don't know of anything
that uses these, so they're somewhat untested.
2025-01-28 23:06:05 +00:00
Ben Harris
2e0b22b86f Small-cap and narrow forms of U+A780 (turned L) 2025-01-27 22:53:55 +00:00
Ben Harris
743dd15e67 Add white (outline) versions of card suits
The club and spade are one pixel taller than the black (filled) ones
because I couldn't come up with a convicing club in the smaller size.
2025-01-27 14:08:29 +00:00
Ben Harris
cd1ee0735b Redesign glottal-stop characters
Bedstead's various glottal-stop characters were originally based on
its question mark, because that character looks a bit like a question
mark without a dot.  However, while adding a Character Variant feature
for question marks I noticed that the glottal stop and question mark
in the Unicode code charts didn't match, which was why I left the
glottal stop out of that feature.

I've now also looked at the official IPA charts from the International
Phonetic Association, and it's clear that the glottal stop does not in
general match the question mark.  In particular, the join between the
rounded section and the stem is often smooth in a question mark but is
always a right angle in the glottal stop.  I've thus re-designed
Bedstead's glyphs to follow this pattern.  I've also shortened the
crossbar on the glottal stop derivatives that have them, since that
seems to better match DejaVu Sans, which is the sans-serif font
preferred by the IPA.
2025-01-19 00:49:30 +00:00
Ben Harris
87a044e871 Add U+23E8 DECIMAL EXPONENT SYMBOL
That seemed to be the only character needed by ALGOL 60 that I was
lacking.
2025-01-19 00:49:30 +00:00
Ben Harris
39474c8fc0 Add 'ss05' which maps all of U+0020..U+007E to SAA5055 glyphs
This seems appropriate for something that wants to treat these as ASCII
glyphs with their ambiguous semantics.

This uses the existing apostrophe.curly, and also adds grave.curly (an
alias for quotereversed) and bar.broken (an alias for brokenbar).  Of
course there are also 'cvXX' features to enable each one individually as
well.
2025-01-19 00:49:30 +00:00
Ben Harris
b5afc323ea Switch to a variadic macro for generating alternate substitutions 2025-01-19 00:49:30 +00:00
Ben Harris
9f2acba7bd Add character variant for curly apostrophe (SAA5051/2)
Unicode takes the position that U+0027 APOSTROPHE is always a straight
apostrophe and is you want a curly one you should use U+2019 RIGHT
SINGLE QUOTATION MARK (or U+02BC MODIFIER LETTER APOSTROPHE but let's
not get into that here).  Bedstead generally follows that, putting the
SAA5050 straight apostrophe at U+0027 and the SAA5055 curly one at
U+2019.

Older character standards, though, conflated those two and treated the
difference between them as one of font design.  In particular, ETS 300
706: May 1997, "Enhanced Teletext specification" treats position 2/7 as
being the same character in all national sub-sets of the Latin G0
primary set.  When coverting Teletext data to Unicode, ZVBI maps 2/7 to
U+0027 whichever national sub-set is in use.

This means that to faithfully display Teletext data in the way that an
SAA5051/2 would, Bedstead needs to interpret U+0027 as a curly
apostrophe.  I have accomplished this by adding a new "apostrophe.curly"
alias and including that in the 'ss01' and 'ss02' Stylistic Sets.  It
also, of course, gains a new Character Variant feature, 'cv07', so that
you can turn the curly apostrophe on and off independently.

This does cause me to wonder whether there should be a stylistic set to
map U+0020..U+007E onto the SAA5055 glyphs.
2025-01-19 00:49:30 +00:00
Ben Harris
c7ababa801 Rename parameters for CVXX macros to "V"
That makes things a little less verbose (for now).
2025-01-19 00:49:30 +00:00
Ben Harris
2e23f8f9c3 Fill in 'cv38' with far too many kinds of capital 'D' 2025-01-19 00:49:30 +00:00
Ben Harris
68e7796245 Add narrow small-cap J to 'cv42'
All the other J-based characters are either narrow already or
unsuitable for narrowing.
2025-01-19 00:49:30 +00:00
Ben Harris
11102ac014 Fill out 'cv44' with narrow capital Ls 2025-01-19 00:49:30 +00:00
Ben Harris
15ff246ea8 Fill out 'cv96' with all the angular cedillas
This collides with the small lower-case 't' of 'cv84' at U+0163 LATIN
SMALL LETTER T WITH CEDILLA, but I think all the combinations work.  I
do currently have both "uni0163.small.angular" and
"uni0163.angular.small" to ensure that you can apply each stylistic
set with the opposing character variant.  Maybe with more careful
interleaving I could get away with only one of those.
2025-01-19 00:49:30 +00:00