Commit Graph

167 Commits

Author SHA1 Message Date
Behdad Esfahbod 49901862e3 [otlayout] Guard against use of ReverseChain through Context 2013-10-17 19:48:51 +02:00
Behdad Esfahbod e714fe6d6a [otlayout] Simplify ligate_input()
Shouldn't change behavior at all, but is faster / more robust.
2013-10-17 13:49:51 +02:00
Behdad Esfahbod 6b65a76b40 [otlayout] Fix (Chain)Context recursion!
Previously we only supported recursive sublookups with
ascending indices.  We were also not correctly handling
non-1-to-1 recursed lookups.

Fix all that!

Fixes the three tests in test/shaping/tests/context-matching.tests,
which were derived from NotoSansBengali and NotoSansDevanagari
among others.
2013-10-14 18:54:51 +02:00
Behdad Esfahbod 6c48f20eea [otlayout] Add structs for JSTF table 2013-09-09 15:43:10 -04:00
Behdad Esfahbod 45f3d980c9 [OTLayout] Merge / templateize apply_string() 2013-05-04 16:04:04 -04:00
Behdad Esfahbod 780cd930a9 [OTLayout] Minor 2013-05-04 16:04:04 -04:00
Behdad Esfahbod 2e0c44f4be [OTLayout] Add is_inplace() method to GSUB 2013-05-04 16:04:04 -04:00
Behdad Esfahbod 5d59f99920 [OTLayout] Make MultipleSubst in-place for sequences of len=1 2013-05-02 15:39:16 -04:00
Behdad Esfahbod 54f84a6b85 [OTLayout] Whitespace 2013-05-02 15:39:16 -04:00
Behdad Esfahbod 0dc3a4e034 Obssesive optimization
Not measurable by any means, but conceptually this is faster since
the mask matches more often than the digest.
2013-04-17 23:04:03 -04:00
Behdad Esfahbod ee5464d17f [OTLayout] Move code around 2013-03-09 01:59:30 -05:00
Behdad Esfahbod 9c5a9ee967 [OTLayout] Rename process() to dispatch() 2013-03-09 01:55:04 -05:00
Behdad Esfahbod 99fa9ea020 Minor 2013-02-15 11:47:24 -05:00
Behdad Esfahbod 607feb7cff [OTLayout] Ignore default-ignorables when matching GSUB/GPOS
When matching lookups, be smart about default-ignorable characters.
In particular:

Do nothing specific about ZWNJ, but for the other default-ignorables:

If the lookup in question uses the ignorable character in a sequence,
then match it as we used to do.  However, if the sequence match will
fail because the default-ignorable blocked it, try skipping the
ignorable character and continue.

The most immediate thing it means is that if Lam-Alef forms a ligature,
then Lam-ZWJ-Alef will do to.  Finally!

One exception: when matching for GPOS, or for backtrack/lookahead of
GSUB, we ignore ZWNJ too.  That's the right thing to do.

It certainly is possible to build fonts that this feature will result
in undesirable glyphs, but it's hard to think of a real-world case
that that would happen.

This *does* break Indic shaping right now, since Indic Unicode has
specific rules for what ZWJ/ZWNJ mean, and skipping ZWJ is breaking
those rules.  That will be fixed in upcoming commits.
2013-02-14 12:57:50 -05:00
Behdad Esfahbod 407fc12466 [OTLayout] Remove bogus caching of glyph property 2013-02-13 11:13:06 -05:00
Behdad Esfahbod 8303593ba1 Minor
Use pointers instead of references, in preparation for upcoming change.
2012-12-04 17:08:41 -05:00
Behdad Esfahbod 3038ae6adb [OTLayout] Minor 2012-11-30 08:24:13 +02:00
Behdad Esfahbod b67881b171 [OTLayout] Remove operator() from Coverage 2012-11-24 19:13:55 -05:00
Behdad Esfahbod 4c4e8f0e75 [OTLayout] Reuse apply context for recursion 2012-11-24 01:13:20 -05:00
Behdad Esfahbod 26514d51b6 [OTLayout] More collect_glyphs() 2012-11-23 18:13:48 -05:00
Behdad Esfahbod c6fb843f2a [OTLayout] Templatize process_recurse_func 2012-11-23 18:04:08 -05:00
Behdad Esfahbod 9b34677f36 [OTLayout] Clean up closure() a bit 2012-11-23 17:55:40 -05:00
Behdad Esfahbod f48ec0e834 [OTLayout] Add process() tracing 2012-11-23 17:23:41 -05:00
Behdad Esfahbod ed2e135944 [OTLayout] More Extension templatizing 2012-11-23 17:10:40 -05:00
Behdad Esfahbod 7dddd4e72b [OTLayout] More templatizing Extension 2012-11-23 17:04:55 -05:00
Behdad Esfahbod 653eeb2645 Make Extension a template 2012-11-23 16:57:36 -05:00
Behdad Esfahbod 08f1eede1b Minor 2012-11-23 16:51:43 -05:00
Behdad Esfahbod be218c688c Pass this object to trace macros 2012-11-23 15:32:14 -05:00
Behdad Esfahbod c779d82b2f Fix warnings 2012-11-23 14:09:21 -05:00
Behdad Esfahbod ec35a72a44 [OTLayout] Port apply() operator to process() template 2012-11-22 16:33:46 -05:00
Behdad Esfahbod 2005fa5340 [OTLayout] Port would_apply() and get_coverage() to process() templates 2012-11-22 16:33:46 -05:00
Behdad Esfahbod 44fc237b53 [OTLayout] Port closure() to process() template 2012-11-22 16:33:46 -05:00
Behdad Esfahbod e8cfdd7fa8 Start implementing collect_glyphs() operation
Not functional yet.
2012-11-16 19:07:06 -08:00
Behdad Esfahbod 7d52e6601f Whitespace 2012-11-16 18:49:54 -08:00
Behdad Esfahbod 5a08ecf920 Implement hb_ot_layout_get_glyph_class() 2012-11-16 13:34:29 -08:00
Behdad Esfahbod 0bc7a38463 [OT] Fix ReverseChainingSubst
We should make it clear that we don't want output buffer in this case,
otherwise buffer->backtrack_len() would be wrong.
2012-10-29 22:02:45 -07:00
Behdad Esfahbod fabd3113a9 [OT] Port Arabic fallback shaping to synthetic GSUB
All of init/medi/fina/isol and rlig implemented.

Let there be dragons... ⻯
2012-09-06 00:51:44 -04:00
Behdad Esfahbod 1d3947a6bd Minor 2012-09-04 22:42:17 -04:00
Behdad Esfahbod b3b89b6658 [OT] Add SubstLookup serialize API 2012-09-04 21:28:33 -04:00
Behdad Esfahbod a930c68e9c [OT] More serialize. Implements all basic GSUB subtables 2012-09-04 19:16:09 -04:00
Behdad Esfahbod 1b38b4e817 Minor 2012-09-04 18:17:21 -04:00
Behdad Esfahbod 2bd9fe3598 Refactor 2012-09-04 15:15:19 -04:00
Behdad Esfahbod 2941683358 [OT] Implement serialize() for AlternateSubst 2012-09-03 23:31:14 -04:00
Behdad Esfahbod 1f07e3382a [OT] Implement serialize() for MultiSubst 2012-09-03 23:28:34 -04:00
Behdad Esfahbod 4912030dfb Minor 2012-09-03 21:00:48 -04:00
Behdad Esfahbod c61be03d6d [OT] A bit more serialize 2012-09-01 21:49:44 -04:00
Behdad Esfahbod abcc5ac1fd [OT] Improve serialize syntax
For some definition of improvement...
2012-09-01 21:30:17 -04:00
Behdad Esfahbod bc5be24014 [OT] Restart work on serialize() 2012-09-01 21:25:20 -04:00
Behdad Esfahbod 5e399a8a45 Minor 2012-08-29 10:40:49 -04:00
Behdad Esfahbod a177d027d1 [GSUB] Move ligation logic over 2012-08-28 23:18:22 -04:00
Behdad Esfahbod 191fa885d9 [GSUB] Merge Ligature and context input matching
Looks better now...
2012-08-28 22:58:55 -04:00
Behdad Esfahbod 93814ca7dc Start converging Ligature and match_input 2012-08-28 22:39:10 -04:00
Behdad Esfahbod 7c8e844d92 Use namespace for OpenType tables
Avoids USHORT, SHORT, ULONG, LONG clashes with Windows API.
2012-08-28 17:57:49 -04:00
Behdad Esfahbod 472f229a63 [GSUB] Generalize would_apply()
Fixes logic also, where before we were always matching if glyphs_len==1
and a ligature started with the glyph.
2012-08-07 22:25:24 -04:00
Behdad Esfahbod afbcc24be0 [GSUB] Wire the font, not just the face, down to substitute()
We need the font for glyph lookup during GSUB pauses in Indic shaper.
Could perhaps be avoided, but at this point, we don't mean to support
separate substitute()/position() entry points (anymore), so there is
no point in not providing the font to GSUB.
2012-08-02 08:36:40 -04:00
Behdad Esfahbod 22148b8c4a Use Coverage digests in would_apply 2012-08-02 03:51:51 -04:00
Behdad Esfahbod 6c459c8fef Minor 2012-08-02 03:45:53 -04:00
Behdad Esfahbod 0120ce9679 [GSUB/GPOS] Remove unused get_coverage() methods 2012-08-01 21:56:35 -04:00
Behdad Esfahbod 1336ecdf8e [GSUB/GPOS] Use Coverage digests as gatekeeper
Gives me a good 10% speedup for the Devanagari test case.  Less so
for less lookup-intensive tests.

For the Devanagari test case, the false positive rate of the GSUB digest
is 4%.
2012-08-01 21:46:36 -04:00
Behdad Esfahbod a878c58a8f [GSUB/GPOS] Add add_coverage() 2012-08-01 21:46:19 -04:00
Behdad Esfahbod 03b09214c0 [GSUB] Minor 2012-07-31 22:43:58 -04:00
Behdad Esfahbod c2e42c3db6 Minor 2012-07-30 19:54:50 -04:00
Behdad Esfahbod 03f67bc012 More refactoring glyph class access 2012-07-30 19:47:53 -04:00
Behdad Esfahbod 05bd1b6342 [GSUB/GPOS] Move glyph props matching around 2012-07-30 19:30:01 -04:00
Behdad Esfahbod 7fbbf86efe [GSUB] Minor 2012-07-30 18:36:42 -04:00
Behdad Esfahbod 6cdfd14bb1 Fix build on Mac 2012-07-30 17:22:17 -04:00
Behdad Esfahbod a973b5ce86 [GSUB] Further adjustments to mark-attachment vs ligation interaction
The d1d69ec52e change broke Kannada badly,
since it was ligating consonants, pushing matra out, and then ligating
with the matra.  Adjust for that.  See comments.
2012-07-30 01:47:46 -04:00
Behdad Esfahbod d1d69ec52e [GSUB] Don't ligate glyphs attached to different components of ligatures
This concludes the mark-attachment vs ligating interaction fixes (for now).
2012-07-30 00:51:47 -04:00
Behdad Esfahbod f24bcfbed1 Minor 2012-07-30 00:39:00 -04:00
Behdad Esfahbod fe20c0f84f [GSUB] Fix mark component stuff when ligatures form ligatures!
See comments.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=437633
2012-07-30 00:00:59 -04:00
Behdad Esfahbod 2ec3ba46a3 [GSUB/GPOS] Minor
Start squeezing more out of lig_id/lig_comp.
2012-07-29 22:16:15 -04:00
Behdad Esfahbod cb3d340631 [GSUB] Don't set new lig_id on mark ligatures
If two marks form a ligature, retain their previous lig_id, such that
the mark ligature can attach to ligature components...

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=676343

In fact, I noticed that we should not let ligatures form between glyphs
coming from different components of a previous ligature.  For example,
if the sequence is: LAM,SHADDA,LAM,FATHA,HEH, the LAM,LAM,HEH form a
ligature, putting SHADDA and FATHA next to eachother.  However, it would
be wrong to ligate them.  Uniscribe has this bug also.
2012-07-29 20:37:38 -04:00
Behdad Esfahbod 338fe662b5 [GSUB] Minor 2012-07-28 18:53:01 -04:00
Behdad Esfahbod e6f7479fe3 [GSUB] Simplify would-apply 2012-07-28 18:34:58 -04:00
Behdad Esfahbod dadede012e Minor 2012-07-28 18:13:09 -04:00
Behdad Esfahbod 0b99429ead [GSUB/GPOS] Add get_coverage() and use it to speed up main loop
And use it to speed up the hotspot by checking coverage directly in
the main loop, not 10 functions deep in.

Gives me a solid 20% boost with Indic test suite.  Less so for less
lookup-intensive scenarios.

Remove the "fast_path" hack from before.
2012-07-28 17:46:35 -04:00
Behdad Esfahbod ea278d3895 Partially switch ot shaper to shape_plan 2012-07-27 02:12:28 -04:00
Behdad Esfahbod ec8d249469 Make data members of various OpenType structs protected instead of private
Should fix warnings generated when building with -Wunused-private-field.
Based on patch from Jonathan Kew.
2012-07-24 15:40:37 -04:00
Behdad Esfahbod 74d1d88781 [GSUB] Fix would_apply() for LigatureSubst 2012-07-19 16:14:23 -04:00
Behdad Esfahbod e72b360ac6 Refactor / finish would_apply() operation
Untested.
2012-07-19 14:44:46 -04:00
Behdad Esfahbod 1feb8345a5 [GSUB] Allow 1-to-1 ligature substitutions!
Apparently Uniscribe allows these, and they are used in some Khmer fonts
shipped with Windows, namely, Daun Penh.
2012-07-16 13:23:40 -04:00
Behdad Esfahbod 6d08c7f1b3 Revert "Towards templatizing common Lookup types"
This reverts commit 727135f3a9.

This is work-in-progress.  Didn't mean to push it out just yet.
2012-07-11 18:01:27 -04:00
Behdad Esfahbod 727135f3a9 Towards templatizing common Lookup types 2012-07-11 18:00:28 -04:00
Behdad Esfahbod f211d5c291 More Oops! Fix fast-path with sub-type==0 2012-06-09 03:11:22 -04:00
Behdad Esfahbod b1de6aa1f3 Oops! 2012-06-09 03:07:59 -04:00
Behdad Esfahbod faf0f20253 Add sanitize() logic for fast-paths 2012-06-09 03:02:36 -04:00
Behdad Esfahbod 993c51915f Add fast-path to GSUB to check coverage
Shaves a good 10% off DejaVu Sans with simple Latin text for me.
Now, DejaVu is very ChainContext-intensive, but it's also a very
popular font!
2012-06-09 02:48:16 -04:00
Behdad Esfahbod 4952f0aa5b Minor 2012-06-09 01:43:20 -04:00
Behdad Esfahbod ec57e0c565 Set lig_comp for MultipleSubst components
To be used for correct mark attachment to first component of a
MultipleSubst output.  That's what Uniscribe does.
2012-06-08 21:47:23 -04:00
Behdad Esfahbod 3ec77d6ae0 Don't use replace_glyphs_be for MultipleSubst 2012-06-08 21:44:06 -04:00
Behdad Esfahbod 4b7192125f Minor 2012-06-08 21:41:46 -04:00
Behdad Esfahbod 28ce5fa454 Merge clusters when ligating 2012-06-08 20:17:06 -04:00
Behdad Esfahbod 2bb1761ccb Minor, use next_glyph() 2012-06-08 19:29:44 -04:00
Behdad Esfahbod 2a3d911fe0 Fix alignment-requirement missmatch
Detected by clang and lots of cmdline options.
2012-06-07 17:31:46 -04:00
Behdad Esfahbod ed2f1363a3 Fix substitution glyph class propagation
The old code was doing nothing.

Still got to find an example font+string that makes this matter, but
need this for fixing synthetic GDEF anyway.
2012-05-22 22:12:22 -04:00
Behdad Esfahbod 3f18236a03 Fix more warnings 2012-05-13 16:20:10 +02:00
Behdad Esfahbod 99c2695759 Add accessort to buffer for current info, current pos, and prev info 2012-05-13 15:45:18 +02:00
Behdad Esfahbod 5df809b655 [GSUB/GPOS] Remove context_length
The spec doesn't say contextual matching should be done this way,
and AOTS doesn't do it either.  It was inherited from old HarfBuzz.
Remove it.
2012-05-13 15:17:51 +02:00
Behdad Esfahbod cee7187447 [Indic] Move syllable tracking from Indic to generic layer
This is to incorporate it into GSUB/GPOS processing.
2012-05-11 11:41:39 +02:00
Behdad Esfahbod acea183e98 Add return annotation for APPLY 2012-05-11 02:33:11 +02:00