Merge pull request #2743 from fonttools/variable-colr-with-sweep-angle-bias

support proposed PaintSweepGradient's angles with +1.0 (180°) bias
This commit is contained in:
Cosimo Lupo 2022-08-15 14:00:22 +01:00 committed by GitHub
commit a8c09989bd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 21 additions and 14 deletions

View File

@ -452,13 +452,14 @@ class F2Dot14(BaseFixedValue):
class Angle(F2Dot14): class Angle(F2Dot14):
# angles are specified in degrees, and encoded as F2Dot14 fractions of half # angles are specified in degrees, and encoded as F2Dot14 fractions of half
# circle: e.g. 1.0 => 180, -0.5 => -90, -2.0 => -360, etc. # circle: e.g. 1.0 => 180, -0.5 => -90, -2.0 => -360, etc.
bias = 0.0
factor = 1.0/(1<<14) * 180 # 0.010986328125 factor = 1.0/(1<<14) * 180 # 0.010986328125
@classmethod @classmethod
def fromInt(cls, value): def fromInt(cls, value):
return super().fromInt(value) * 180 return (super().fromInt(value) + cls.bias) * 180
@classmethod @classmethod
def toInt(cls, value): def toInt(cls, value):
return super().toInt(value / 180) return super().toInt((value / 180) - cls.bias)
@classmethod @classmethod
def fromString(cls, value): def fromString(cls, value):
# quantize to nearest multiples of minimum fixed-precision angle # quantize to nearest multiples of minimum fixed-precision angle
@ -467,6 +468,11 @@ class Angle(F2Dot14):
def toString(cls, value): def toString(cls, value):
return nearestMultipleShortestRepr(value, cls.factor) return nearestMultipleShortestRepr(value, cls.factor)
class BiasedAngle(Angle):
# A bias of 1.0 is used in the representation of start and end angles
# of COLRv1 PaintSweepGradients to allow for encoding +360deg
bias = 1.0
class Version(SimpleValue): class Version(SimpleValue):
staticSize = 4 staticSize = 4
def read(self, reader, font, tableDict): def read(self, reader, font, tableDict):
@ -1773,6 +1779,7 @@ converterMapping = {
"Fixed": Fixed, "Fixed": Fixed,
"F2Dot14": F2Dot14, "F2Dot14": F2Dot14,
"Angle": Angle, "Angle": Angle,
"BiasedAngle": BiasedAngle,
"struct": Struct, "struct": Struct,
"Offset": Table, "Offset": Table,
"LOffset": LTable, "LOffset": LTable,

View File

@ -1755,8 +1755,8 @@ otData = [
('Offset24', 'ColorLine', None, None, 'Offset (from beginning of PaintSweepGradient table) to ColorLine subtable.'), ('Offset24', 'ColorLine', None, None, 'Offset (from beginning of PaintSweepGradient table) to ColorLine subtable.'),
('int16', 'centerX', None, None, 'Center x coordinate.'), ('int16', 'centerX', None, None, 'Center x coordinate.'),
('int16', 'centerY', None, None, 'Center y coordinate.'), ('int16', 'centerY', None, None, 'Center y coordinate.'),
('Angle', 'startAngle', None, None, 'Start of the angular range of the gradient.'), ('BiasedAngle', 'startAngle', None, None, 'Start of the angular range of the gradient.'),
('Angle', 'endAngle', None, None, 'End of the angular range of the gradient.'), ('BiasedAngle', 'endAngle', None, None, 'End of the angular range of the gradient.'),
]), ]),
# PaintVarSweepGradient # PaintVarSweepGradient
('PaintFormat9', [ ('PaintFormat9', [
@ -1764,8 +1764,8 @@ otData = [
('LOffset24To(VarColorLine)', 'ColorLine', None, None, 'Offset (from beginning of PaintVarSweepGradient table) to VarColorLine subtable.'), ('LOffset24To(VarColorLine)', 'ColorLine', None, None, 'Offset (from beginning of PaintVarSweepGradient table) to VarColorLine subtable.'),
('int16', 'centerX', None, None, 'Center x coordinate. VarIndexBase + 0.'), ('int16', 'centerX', None, None, 'Center x coordinate. VarIndexBase + 0.'),
('int16', 'centerY', None, None, 'Center y coordinate. VarIndexBase + 1.'), ('int16', 'centerY', None, None, 'Center y coordinate. VarIndexBase + 1.'),
('Angle', 'startAngle', None, None, 'Start of the angular range of the gradient. VarIndexBase + 2.'), ('BiasedAngle', 'startAngle', None, None, 'Start of the angular range of the gradient. VarIndexBase + 2.'),
('Angle', 'endAngle', None, None, 'End of the angular range of the gradient. VarIndexBase + 3.'), ('BiasedAngle', 'endAngle', None, None, 'End of the angular range of the gradient. VarIndexBase + 3.'),
('VarIndex', 'VarIndexBase', None, None, 'Base index into DeltaSetIndexMap.'), ('VarIndex', 'VarIndexBase', None, None, 'Base index into DeltaSetIndexMap.'),
]), ]),

View File

@ -400,8 +400,8 @@ COLR_V1_XML = [
" </ColorLine>", " </ColorLine>",
' <centerX value="259"/>', ' <centerX value="259"/>',
' <centerY value="300"/>', ' <centerY value="300"/>',
' <startAngle value="45.0"/>', ' <startAngle value="225.0"/>',
' <endAngle value="135.0"/>', ' <endAngle value="315.0"/>',
" </Paint>", " </Paint>",
' <Glyph value="glyph00011"/>', ' <Glyph value="glyph00011"/>',
" </Paint>", " </Paint>",

View File

@ -619,8 +619,8 @@ class COLRVariationMergerTest:
}, },
"centerX": 0, "centerX": 0,
"centerY": 0, "centerY": 0,
"startAngle": -360, "startAngle": 0,
"endAngle": 0, "endAngle": 360,
}, },
"Transform": (1.0, 0, 0, 1.0, 0, 0), "Transform": (1.0, 0, 0, 1.0, 0, 0),
}, },
@ -641,8 +641,8 @@ class COLRVariationMergerTest:
}, },
"centerX": 256, "centerX": 256,
"centerY": 0, "centerY": 0,
"startAngle": -360, "startAngle": 0,
"endAngle": 0, "endAngle": 360,
}, },
# Transform.xx below produces the same VarStore delta as the # Transform.xx below produces the same VarStore delta as the
# above PaintSweepGradient's centerX because, when Fixed16.16 # above PaintSweepGradient's centerX because, when Fixed16.16
@ -675,8 +675,8 @@ class COLRVariationMergerTest:
" </ColorLine>", " </ColorLine>",
' <centerX value="0"/>', ' <centerX value="0"/>',
' <centerY value="0"/>', ' <centerY value="0"/>',
' <startAngle value="-360.0"/>', ' <startAngle value="0.0"/>',
' <endAngle value="0.0"/>', ' <endAngle value="360.0"/>',
' <VarIndexBase value="0"/>', ' <VarIndexBase value="0"/>',
" </Paint>", " </Paint>",
" <Transform>", " <Transform>",