RFR: 8328896: Fontmetrics for large Fonts has zero width

Phil Race prr at openjdk.org
Thu Apr 18 17:27:56 UTC 2024


On Thu, 18 Apr 2024 04:03:38 GMT, Tejesh R <tr at openjdk.org> wrote:

>> The main problem here is that we do not curate what font point size we passed to freetype,
>> and would pass in one larger than freetype's maximum of FT_USHORT_MAX which is USHRT_MAX.
>> This isn't documented, SFAICS, and is checked a couple of calls deep from the specific API we use.
>> But generally anywhere near that size seems to cause freetype to choke as it uses signed 16.16
>> values, so 32767 is really the max.
>> But we have no need to go anywhere near that - 16384 seems like a plenty large enough pt size.
>> And we can request bigger sizes than that by making use of the transform.
>> At normal size ranges we use that just to account for rotation and decompose the glyph transform
>> into point size and that rotation.
>> 
>> But at large sizes - which are not usefully rendered anyway - there are no hints etc to be lost
>> from not specifying the target point size. So we can extend the range of sizes we allow.
>> 
>> If  this is still too large to be held decomposed into a pt size in the range less than 16384 and a scale of up to 32766 then we substitute the null scaler, as we generally do when values are out of range, such
>> a for a NaN transform.
>> 
>> These extreme values aren't useful.
>> 
>> In looking at this I did find that getGlyphPixelBounds doesn't follow the maximum image size we use
>> for rendering. Which is not useful and could lead to inconsistent results. I fixed that.
>> 
>> Also whilst macOS didn't have these problems it could be cleaned up a bit for consistency in the reported sizes for some cases.
>> 
>> The test is mainly around making sure that "sensible" things are returned for not sensible input.
>> There's no 100% right answer to these extreme unrenderable sizes.
>
> src/java.desktop/share/native/libfontmanager/freetypeScaler.c line 537:
> 
>> 535:     if (TOO_LARGE(dmat[0], ptsz) || TOO_LARGE(dmat[1], ptsz) ||
>> 536:         TOO_LARGE(dmat[2], ptsz) || TOO_LARGE(dmat[3], ptsz))
>> 537:     {
> 
> Suggestion:
> 
>      TOO_LARGE(dmat[2], ptsz) || TOO_LARGE(dmat[3], ptsz)) {

No, that was deliberate. We generally prefer the { on a new line if the conditional is multi-line.

Still looking for an actual "reviewer" review here.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/18703#discussion_r1571126135


More information about the client-libs-dev mailing list