527 Commits

Author SHA1 Message Date
Khaled Hosny
9feaab13aa [feaLib] Support stylistic set featureNames
Does not handle featureNames for cvXX features, but it shouldn’t be hard
for someone to extend the code to support them if inclined to do so.
2016-03-18 14:08:00 +04:00
Khaled Hosny
53dc98be55 [feaLib] Fix parsing name records
Don’t override supplied encoding and language ids.
2016-03-18 14:06:33 +04:00
Masaya Nakamura
1adb1ad9e8 [feaLib] Fix typo in testdata/spec9e.*
Feature File Spec itself was fixed in https://github.com/adobe-type-tools/afdko/pull/110
2016-03-17 09:44:20 +09:00
Adrien Tétar
5e64857b97 feaLib: support string input 2016-03-15 20:01:29 +01:00
Sascha Brawer
4680701b6e Merge pull request #545 from khaledhosny/fea-lookupflag
Fix handling of default lookupflag
2016-03-15 09:12:44 -07:00
Khaled Hosny
4e316cd337 [feaLib] Support name table 2016-03-15 17:49:02 +04:00
Khaled Hosny
8d1930a27a Fix handling of default lookupflag
According to the spec:
> The lookupflag attribute defaults to 0 at the start of a feature
> block.
>
> The lookupflag attribute stays the same until explicitly changed, until
> a lookup reference statement is encountered that changes it, until the
> script is changed, or until the end of the feature.

This is an attempt to fix this by resetting the lookupflag at the start
and end of feature/lookup blacks. I’m not sure if resetting it in lookup
blocks is correct (my reading of the spec suggests it is not), but one
needs to test this against makeotf and see how it behaves here.
2016-03-13 00:43:10 +04:00
Sascha Brawer
809698611e [feaLib] Fix SequenceIndex in ChainContextPos
In the long term, we might want to make a different low-level API
for building ChainContextPos lookups; for now, this should fix the
current bug with SequenceIndex.

Resolves https://github.com/behdad/fonttools/issues/517.
2016-02-09 15:38:18 +01:00
Sascha Brawer
873f3570af [feaLib] Emit ChainContextPos before dependent SinglePos
There should be no semantic difference from this change,
since dependent lookups (the chain targets) are never directly
invoked by a feature. But the output of feaLib becomes more
similar to the output of makeotf, which helps debugging.
2016-02-09 09:25:54 +01:00
Sascha Brawer
5ab852277d [feaLib] Emit context-free contextual chains to SinglePos
Before this change, we had only emitted a SinglePos (GPOS type 1) lookup
for a statement like `pos A' B' 20`; after this change, we always emit a
chain rule even if there is no context. There is a semantic difference if
the rule is preceded by a `ignore pos` statement. Omitting context-free
contextual chains was actually not a (premature) optimization, but an
artifact that came from the representation of glyph patterns.

https://github.com/behdad/fonttools/issues/516
2016-02-09 09:00:06 +01:00
Sascha Brawer
bd6bea0f7f [feaLib] Allow non-disjoint markClasses
After this change, feaLib generates the exact same output as makeotf
for the test case in `bug453.fea`. Before this change, feaLib had
rejected the input as malformed.

Our new behavior is in blatant violation of the OpenType Feature File
Syntax specification, which writes: "NOTE! If a GDEF table is not
explicitly defined in the feature file, [...] all mark glyph classes
must be disjoint". However:

1. makeotf does not enforce this constraint;
2. existing feature files happily define non-disjoint markClasses;
3. existing tools such as the Glyphs font editor generate feature files
   with non-disjoint markClasses;
4. it is not obvious what the intention of this constraint would be.

Therefore, fewLib now follows the makeotf implementation, intentionally
ignoring what is mandated by the specification. I've proposed a spec change
at https://github.com/adobe-type-tools/afdko/issues/106.

Resolves https://github.com/behdad/fonttools/issues/453.
2016-02-08 10:27:31 +01:00
Sascha Brawer
d03ce3c119 [feaLib] Add unit test for the ignore pos statement
There are no examples for `ignore pos` in the OpenType Feature File
Syntax specification, therefore using a made-up example for the test.
The output from feaLib is identical to what makeotf generates.

Resolves https://github.com/behdad/fonttools/issues/503.
2016-02-06 12:13:03 +01:00
Sascha Brawer
b5d1124f43 [feaLib] Handle the ignore pos statement
https://github.com/behdad/fonttools/issues/503
2016-02-06 11:14:27 +01:00
Sascha Brawer
4a23f8eb85 [feaLib] Add unit test with spec section 5.f.ii, example 4
This is another test case for the `ignore sub` statement.
After the recent changes to feaLib, the output is now identical
to the output generated by makeotf.

https://github.com/behdad/fonttools/issues/503
2016-02-05 15:55:53 +01:00
Sascha Brawer
ec9077a566 [feaLib] Merge SingleSubst chain targets
This makes the output of feaLib more compact, using a similar technique
as seems to be used by makeotf.

After this change, feaLib generates output that more similar to makeotf:

* For the test cases in `bug512.fea` and `bug463.fea`, feaLib now
  generates the exact same output as makeotf v2.0.90.

* For the test cases in `GSUB_6.fea`, it is hard to say because makeotf
  crashes on the test file; our test contains language constructs that
  are valid according to the spec, but didn't yet get implemented by makeotf.
  When commenting out those constructs, feaLib generates the exact same
  output as makeotf v2.0.90.

* For the test cases in `feature_aalt.fea`, the output of feaLib is now
  structually the same as the output of makeotf v2.0.90.  However, two
  lookups are in different order. feaLib's ordering reflects the order
  of statements in the compiled input source; no idea why makeotf would
  want to reverse the ordering. Since this ordering difference only
  affects the _targets_ of chain substitutions, there is no semantic
  difference.

Resolves https://github.com/behdad/fonttools/issues/512.
2016-02-05 15:12:07 +01:00
Sascha Brawer
1ddfe24338 [feaLib] Support multiple chain contexts after ignore sub
Although this construct is in violation of the `ignore sub` grammar
given by the current OpenType Feature File syntax specification,
the very same specification document illustrates (in example 3
of section 5.f.ii) the `ignore sub` statement with a comma-separated
list of backgrack/input/lookahead triples.

See https://github.com/adobe-type-tools/afdko/issues/105 for a request
to amend the OpenType Feature File syntax specification.

After this code change, feaLib can now parse testdata/spec5f_ii_3.fea;
the output is identical to what is generated by Adobe's makeotf tool.

https://github.com/behdad/fonttools/issues/503
2016-02-05 11:02:29 +01:00
Sascha Brawer
a862f70880 [feaLib] Add unit test for spec section 5.f.ii, example 2
Output is identical to makeotf.
2016-02-05 08:35:18 +01:00
Sascha Brawer
27e23f9a95 [feaLib] Emit context-free chains to single substitutions
Resolves https://github.com/behdad/fonttools/issues/509
2016-02-04 16:45:05 +01:00
Sascha Brawer
dba1d6666b [feaLib] Emit chains to LigatureSubst even without backtrack or lookahead
https://github.com/behdad/fonttools/issues/506
2016-02-04 15:31:29 +01:00
Sascha Brawer
ea4a4e34b3 [feaLib] Reverse lookup order for chained single substitutions
This makes feaLib's output more similar to output from makeotf.
Resolves https://github.com/behdad/fonttools/issues/507.
2016-02-04 15:07:47 +01:00
Sascha Brawer
3d6cf0d8e6 [feaLib] Reverse lookup order for chained multiple substitutions
https://github.com/behdad/fonttools/issues/507
2016-02-04 14:46:22 +01:00
Sascha Brawer
7574260bed [feaLib] Reverse lookup order for chained alternate substitutions
For this construct, makeotf throws an error: "Contextual alternate
rule not yet supported". If it had been implemented, we speculate
that the ordering would likely be the same as with other contextual
substitutions (the chain comes before, not after, the dependent lookup).

https://github.com/behdad/fonttools/issues/507
2016-02-04 14:34:45 +01:00
Sascha Brawer
e8a4b341f3 [feaLib] Reverse lookup order for chained ligature substitutions
https://github.com/behdad/fonttools/issues/507
2016-02-04 14:24:48 +01:00
Sascha Brawer
ab7b86005e [feaLib] Implement the ignore substitution statement
https://github.com/behdad/fonttools/issues/503
2016-02-04 11:39:03 +01:00
Sascha Brawer
aae350c84a [feaLib] Change semantics of script statement
Before this change, the `script` statement had inherited global
defaults. After this change, it overrides them. The new behavior
matches the behavior of makeotf v2.0.90.

Resolves https://github.com/behdad/fonttools/issues/505.

For the test case of https://github.com/behdad/fonttools/issues/501,
which was about an unrelated problem, feaLib now produces the exact
same output as makeotf v2.0.90.
2016-02-04 10:31:33 +01:00
Sascha Brawer
f9a236f54e [feaLib] Allow script and language statements in named lookup blocks
Although the specification writes the exact opposite, makeotf does
accept script and language statements inside named lookup blocks.
Since Glyphs.app (and possibly other tools, too) produce feature files
that make use of this syntax, enforcing the spec would break existing
files.

Resolves https://github.com/behdad/fonttools/issues/501.
2016-02-04 09:52:20 +01:00
Sascha Brawer
a3f70370fe [feaLib] Add a unit test for compiling enum pos statements
Example from section 6b.ii of the OpenType Feature File specification.
2016-02-04 09:23:46 +01:00
Sascha Brawer
a1fa968576 [feaLib] Use a different approach to synthesizing feature aalt
Resolves https://github.com/behdad/fonttools/issues/502.
2016-02-03 17:38:38 +01:00
Sascha Brawer
edb1ed0fcc [feaLib] Synthesize alternate substitutions for feature aalt
After this change, feaLib synthesizes the same lookups as makeotf v2.0.90
for `feature aalt` in the example of section 8.a of the OpenType Feature
File specification.
2016-02-03 15:17:37 +01:00
Sascha Brawer
bf79ceb2f2 [feaLib] Disallow lookup blocks inside feature aalt
The new behavior matches how makeotf v2.0.90 interprets
the OpenType Feature File Specification.
2016-02-03 11:39:50 +01:00
Sascha Brawer
faeba0c0c0 [feaLib] Support lookups with mixed glyph/class-based kerning
Resolves https://github.com/behdad/fonttools/issues/456
2016-02-02 18:24:48 +01:00
Sascha Brawer
c64019b3c6 [otlLib] Move building of class-based PairPos sutables from feaLib to otlLib 2016-02-02 15:17:01 +01:00
Sascha Brawer
f9e859c213 [otlLib] Move helper for building ClassDef tables from feaLib to otlLib 2016-02-02 10:48:47 +01:00
Sascha Brawer
0f609592bb [otlLib] Build multiple glyph-based PairPos subtables when needed
Before this change, feaLib would group glyph-based pair positionings
by value formats. After this change, this logic happens in otlLib.
But clients can still do their own grouping if they wish, by calling
the buildPairPosGlyphsSubtable() method directly.
2016-02-02 10:30:33 +01:00
Sascha Brawer
5095aa9ecf [otlLib] Move building of glyph-based PairPos subtables from feaLib to otlLib 2016-02-02 09:35:31 +01:00
Sascha Brawer
4ee17824e1 [feaLib] Use global scope for glyph classes; allow re-definitions
Resolves https://github.com/behdad/fonttools/issues/496
2016-02-01 18:29:41 +01:00
Sascha Brawer
befce507a8 [feaLib] Use global scope for lookup names
Resolves https://github.com/behdad/fonttools/issues/461
2016-02-01 14:39:32 +01:00
Cosimo Lupo
c4d2ebca66 remove deprecated use of 'quiet' option in test modules 2016-02-01 13:39:39 +00:00
Cosimo Lupo
ac56990aad replace all uses of codecs.open with py23.open 2016-01-26 15:45:27 +00:00
Sascha Brawer
ab8f9ee785 [feaLib] Add test case for bug 463
https://github.com/behdad/fonttools/issues/463
2016-01-26 12:45:56 +01:00
Sascha Brawer
6dcddd9e36 [feaLib] Compile test files to binary tables in addition to XML
https://github.com/behdad/fonttools/issues/463
2016-01-26 12:39:41 +01:00
Sascha Brawer
b2e663a1fc [feaLib] Compile lookups after assigning lookup indices
Before this change, feaLib had assigned a lookup index at the same
time as compiling each lookup. For chains, the implicit assumption was
that the chain's targets would always come before the contexual chain.
Normally this was indeed the case, but feaLib (and also makeotf)
sometimes merge several chain targets into one single lookup,
and then this assumption was not true anymore.

In the new version, the lookups get compiled in a separate pass,
after assigning lookup indices.

https://github.com/behdad/fonttools/issues/463
2016-01-26 12:09:52 +01:00
Sascha Brawer
f5af1cf682 [feaLib] Minor: Remove obsolete import statement 2016-01-25 19:46:02 +01:00
Sascha Brawer
c09e8862c0 [feaLib] Handle contextual chained SinglePos rules
Resolves https://github.com/behdad/fonttools/issues/485.
2016-01-25 16:27:18 +01:00
Sascha Brawer
a7c0b5c78f [feaLib] Implement chained contextual single positioning
https://github.com/behdad/fonttools/issues/485
2016-01-25 15:10:40 +01:00
Sascha Brawer
312136356a [feaLib] Raise FeatureLibError for not-yet-implemented construct 2016-01-25 12:26:23 +01:00
Sascha Brawer
82a444d659 [feaLib] Parse glyph patterns with multiple values
For example, we now recognize `pos one' 1 two' 2 three' 3;`
as a SinglePos statement, like makeotf does.

https://github.com/behdad/fonttools/issues/485
2016-01-25 12:18:17 +01:00
Behdad Esfahbod
58b49a1a42 [otlLib] change buildDevice API to take dict
Makes more sense.  feaLib can be simplified by storing a dict
as well, but for now just cast.
2016-01-22 19:45:56 +01:00
Behdad Esfahbod
4e13a2268e [otlLib] One more rename 2016-01-22 19:38:20 +01:00
Behdad Esfahbod
aea0ce9ae1 [otlLib] Adapt names to newly agreed scheme 2016-01-22 19:32:45 +01:00