187 Commits

Author SHA1 Message Date
Bill Yi
d166b937e4 Merge commit '408d44a0834d88a9ed4060dbeb8223fcd321f5d0' into HEAD 2016-02-17 09:50:45 -08:00
Dan Albert
09481597e4 Fix warnings.
Bug: http://b/26936282
Change-Id: I91b3bc246a4a8c45bde223cfc25df18ae9af8c5b
2016-02-11 20:40:58 -08:00
Stephen Hines
900a7c36fb Disable unsigned integer overflow sanitization until libc++ is fixed.
Bug: http://b/26781196
Bug: http://b/25884483
Bug: http://b/26432628

Although this issue was first only manifesting on Fugu, it now affects
N9 and N6p as well. This change disables unsigned overflow sanitization
on all platforms. The real fix for libc++ (r257368) can't be committed
until we have updated Clang at least one more time.

Change-Id: I71e9c50d25ae4566d4c06f348183c4b22a4bb60a
2016-01-26 00:49:26 -08:00
Raph Levien
408d44a083 Reject fonts with invalid ranges in cmap am: f5d2fa97bb am: 8d10d3a0f9 am: 97ef1a4890 am: 0d004fc9b6 am: 5936f34f86 am: f76c8acaf6
am: 95a63d665b  -s ours

* commit '95a63d665b622d4e7002b1c09603a0d50f0b8947':
  Reject fonts with invalid ranges in cmap
2016-01-15 22:11:58 +00:00
Raph Levien
95a63d665b Reject fonts with invalid ranges in cmap am: f5d2fa97bb am: 8d10d3a0f9 am: 97ef1a4890 am: 0d004fc9b6 am: 5936f34f86
am: f76c8acaf6

* commit 'f76c8acaf67dc263dddc9f9691f6e87d2450c013':
  Reject fonts with invalid ranges in cmap
2016-01-15 21:50:24 +00:00
Raph Levien
f76c8acaf6 Reject fonts with invalid ranges in cmap am: f5d2fa97bb am: 8d10d3a0f9 am: 97ef1a4890 am: 0d004fc9b6
am: 5936f34f86

* commit '5936f34f8604542b6ab2714195c69456974e2590':
  Reject fonts with invalid ranges in cmap
2016-01-15 21:45:37 +00:00
Raph Levien
5936f34f86 Reject fonts with invalid ranges in cmap am: f5d2fa97bb am: 8d10d3a0f9 am: 97ef1a4890
am: 0d004fc9b6

* commit '0d004fc9b6e9f438ba67a0188e1072247a7618a9':
  Reject fonts with invalid ranges in cmap
2016-01-15 21:43:03 +00:00
Raph Levien
0d004fc9b6 Reject fonts with invalid ranges in cmap am: f5d2fa97bb am: 8d10d3a0f9
am: 97ef1a4890

* commit '97ef1a4890fddf0945f06c644a8a27bf834df3f1':
  Reject fonts with invalid ranges in cmap
2016-01-15 21:40:23 +00:00
Raph Levien
97ef1a4890 Reject fonts with invalid ranges in cmap am: f5d2fa97bb
am: 8d10d3a0f9

* commit '8d10d3a0f9d87d90839da17e20a1812aaaa1e754':
  Reject fonts with invalid ranges in cmap
2016-01-15 21:36:37 +00:00
Raph Levien
8d10d3a0f9 Reject fonts with invalid ranges in cmap
am: f5d2fa97bb

* commit 'f5d2fa97bbdbf5075e293fb641cd2e5dbaa29cfa':
  Reject fonts with invalid ranges in cmap
2016-01-15 21:28:10 +00:00
Raph Levien
2dd7d8f92e Tailor grapheme boundaries so sequence emoji are one grapheme - DO NOT MERGE
am: c4e24421ec

* commit 'c4e24421ecb8b4532bde4e759625107367cd60e3':
  Tailor grapheme boundaries so sequence emoji are one grapheme - DO NOT MERGE
2016-01-13 23:17:11 +00:00
Raph Levien
c4e24421ec Tailor grapheme boundaries so sequence emoji are one grapheme - DO NOT MERGE
Make it so it's not possible to position the cursor inside an emoji
formed by a sequence including zero-width joiners.

Bug: 25368653
Change-Id: I67ec0874cd1505f3c82ab91492ffc3d39a52fae6
2016-01-13 14:12:56 -08:00
Raph Levien
f5d2fa97bb Reject fonts with invalid ranges in cmap
A corrupt or malicious font may have a negative size in its cmap
range, which in turn could lead to memory corruption. This patch
detects the case and rejects the font, and also includes an assertion
in the sparse bit set implementation if we missed any such case.

External issue:
https://code.google.com/p/android/issues/detail?id=192618

Bug: 26413177
Change-Id: Icc0c80e4ef389abba0964495b89aa0fae3e9f4b2
2016-01-07 21:39:25 +00:00
Andreas Gampe
473628753d Minikin: Disable sanitizer on x86
am: 251f4772fb

* commit '251f4772fb6996b5b8555fa94dd67f97a0377650':
  Minikin: Disable sanitizer on x86
2016-01-07 04:45:20 +00:00
Andreas Gampe
251f4772fb Minikin: Disable sanitizer on x86
Disable unsigned-integer-overflow sanitizer on x86, as it crashes.

Bug: 25884483
Bug: 26432628
Change-Id: Ia658ed56a6c81660a36edf71f7116118056aa917
2016-01-06 20:28:52 -08:00
Dan Austin
7521326d4f Enable integer sanitization in libminikin
am: da13d5e835

* commit 'da13d5e835bf4657246e2410dcf29c0b4a61887b':
  Enable integer sanitization in libminikin
2016-01-06 20:42:47 +00:00
Dan Austin
da13d5e835 Enable integer sanitization in libminikin
Enable signed and unsigned integer sanitization in libminikin.

Bug: 25884483
Change-Id: I98905827174d16138d20bb443fe2e1d7228ea1a3
2016-01-06 12:30:12 -08:00
Dan Austin
8c5fc9931f Revert "Enable integer sanitization in libminikin."
am: 2ffc286102

* commit '2ffc28610290d221109105ba17969db83b317ca1':
  Revert "Enable integer sanitization in libminikin."
2016-01-06 18:36:33 +00:00
Dan Austin
2ffc286102 Revert "Enable integer sanitization in libminikin."
This reverts commit 147ce0acb9ccb2c7594e47512ac0f5d68eafb580.

Change-Id: Iecd1f61a5fdf5955d871a920cb243553857d46ff
2016-01-06 18:31:38 +00:00
Dan Austin
ea647a237d Enable integer sanitization in libminikin.
am: 147ce0acb9

* commit '147ce0acb9ccb2c7594e47512ac0f5d68eafb580':
  Enable integer sanitization in libminikin.
2016-01-06 17:06:22 +00:00
Dan Austin
147ce0acb9 Enable integer sanitization in libminikin.
Enable signed and unsigned integer sanitization in libminikin.

Bug: 25884483
Change-Id: I53abf6affea8e2bb3a5abd381a9f19003a306b36
2016-01-05 17:36:31 -08:00
Dan Austin
6dc8b89df4 Refactored unsigned long negations
am: 10fbe684fb

* commit '10fbe684fbabfb51112bcd44e7f2a80d5c9807cb':
  Refactored unsigned long negations
2015-12-14 09:12:42 -08:00
Dan Austin
10fbe684fb Refactored unsigned long negations
Replaced two instances of negating an unsigned long, which was
resulting in aborts from unsigned integer sanitization with the
equivalent logical not-add 1.

Bug: 25884483
Change-Id: Ic7498e0af638dcd438ce69803021d3cdc3acd4f6
2015-12-11 16:33:23 -08:00
Raph Levien
10cd33807c Avoid integer overflows in parsing fonts am: 1fd1c39021 am: fa84e49423 am: 47e7a9b486 am: e275a0a2bd am: bc9873b55a
am: 4b48ea9558

* commit '4b48ea95580e818840c8d39439575aeed50e2239':
  Avoid integer overflows in parsing fonts
2015-12-08 19:54:42 +00:00
Raph Levien
4b48ea9558 Avoid integer overflows in parsing fonts am: 1fd1c39021 am: fa84e49423 am: 47e7a9b486 am: e275a0a2bd
am: bc9873b55a

* commit 'bc9873b55a20b2ae64260add695e4b1a81014ce6':
  Avoid integer overflows in parsing fonts
2015-12-08 11:36:58 -08:00
Raph Levien
bc9873b55a Avoid integer overflows in parsing fonts am: 1fd1c39021 am: fa84e49423 am: 47e7a9b486
am: e275a0a2bd

* commit 'e275a0a2bdd2c06b84e154a3c2c34b8a133048ff':
  Avoid integer overflows in parsing fonts
2015-12-08 19:33:14 +00:00
Raph Levien
e275a0a2bd Avoid integer overflows in parsing fonts am: 1fd1c39021 am: fa84e49423
am: 47e7a9b486

* commit '47e7a9b48626fcc5d15f18994f0382c7b490fd9b':
  Avoid integer overflows in parsing fonts
2015-12-08 11:29:31 -08:00
Raph Levien
47e7a9b486 Avoid integer overflows in parsing fonts am: 1fd1c39021
am: fa84e49423

* commit 'fa84e494232565cf5141bfb6736652fca6c710c2':
  Avoid integer overflows in parsing fonts
2015-12-08 19:22:49 +00:00
Raph Levien
fa84e49423 Avoid integer overflows in parsing fonts
am: 1fd1c39021

* commit '1fd1c390217da22a54b49e9a91bc79b0323e6a73':
  Avoid integer overflows in parsing fonts
2015-12-08 19:17:40 +00:00
Raph Levien
1fd1c39021 Avoid integer overflows in parsing fonts
A malformed TTF can cause size calculations to overflow. This patch
checks the maximum reasonable value so that the total size fits in 32
bits. It also adds some explicit casting to avoid possible technical
undefined behavior when parsing sized unsigned values.

Bug: 25645298
Change-Id: Id4716132041a6f4f1fbb73ec4e445391cf7d9616
(cherry picked from commit 371e5dbb3f61fbfb653eed4fa2e452f8978419ff)
2015-12-07 17:58:12 +00:00
Raph Levien
7aee6297e4 Suppress linebreaks in emoji ZWJ sequences - DO NOT MERGE am: d40c0c59e4 -s ours
am: 3871933e15  -s ours

* commit '3871933e1542292598e2ffdb88ac770342093d63':
  Suppress linebreaks in emoji ZWJ sequences - DO NOT MERGE
2015-11-18 19:59:22 +00:00
Raph Levien
16698c880e Accept variation selector in emoji sequences - DO NOT MERGE am: 6e98debfaf -s ours
am: 29af616a2b  -s ours

* commit '29af616a2b4b07cfd2cb6b02c9d887b665a82a3f':
  Accept variation selector in emoji sequences - DO NOT MERGE
2015-11-18 19:59:17 +00:00
Raph Levien
3871933e15 Suppress linebreaks in emoji ZWJ sequences - DO NOT MERGE
am: d40c0c59e4  -s ours

* commit 'd40c0c59e446196c0beff54968913205f7f6fe28':
  Suppress linebreaks in emoji ZWJ sequences - DO NOT MERGE
2015-11-18 19:52:27 +00:00
Raph Levien
29af616a2b Accept variation selector in emoji sequences - DO NOT MERGE
am: 6e98debfaf  -s ours

* commit '6e98debfaf50ad0d301fef2d2b656ba175b2e02c':
  Accept variation selector in emoji sequences - DO NOT MERGE
2015-11-18 19:52:21 +00:00
Raph Levien
d40c0c59e4 Suppress linebreaks in emoji ZWJ sequences - DO NOT MERGE
Due to the way emoji ZWJ sequences are defined, the ICU line breaking
algorithm determines that there are valid line breaks inside the
sequence. This patch suppresses these line breaks.

Bug: 25433289
Change-Id: I225ebebc0f4186e4b8f48fee399c4a62b3f0218a
2015-11-18 10:41:09 -08:00
Raph Levien
6e98debfaf Accept variation selector in emoji sequences - DO NOT MERGE
This patch basically ignores variation selectors for the purpose of
itemization into font runs. This allows GSUB to be applied when input
sequences contain variation selectors.

Bug: 25368653
Change-Id: I9c1d325ae0cd322c21b7e850d0ec4d73551b2372
2015-11-18 10:41:03 -08:00
Raph Levien
5001f2ae48 Suppress linebreaks in emoji ZWJ sequences - DO NOT MERGE
Due to the way emoji ZWJ sequences are defined, the ICU line breaking
algorithm determines that there are valid line breaks inside the
sequence. This patch suppresses these line breaks.

Bug: 25433289
Change-Id: I225ebebc0f4186e4b8f48fee399c4a62b3f0218a
2015-11-03 05:16:31 +00:00
Raph Levien
34c39bcde6 Accept variation selector in emoji sequences - DO NOT MERGE
This patch basically ignores variation selectors for the purpose of
itemization into font runs. This allows GSUB to be applied when input
sequences contain variation selectors.

Bug: 25368653
Change-Id: I9c1d325ae0cd322c21b7e850d0ec4d73551b2372
2015-10-29 12:30:57 -07:00
Roozbeh Pournader
4f26d11436 Complete half-done cherry-picking of Android.mk. DO NOT MERGE
The previous commit, 9036c194b04f921f35a7b7c064f88bba565c63b3, was
incompletely cherry-picked. This adds the missing parts.

Bug: 24570591
Change-Id: I1097c60587fb8a88cfe6b8ffed5b1689d9bdd429
2015-10-14 19:37:47 -07:00
Raph Levien
7635ac1324 Explicitly set utf-8 encoding for hyb file verification
Not all platforms default to UTF-8 encoding, so we set it explicitly.
This patch should fix build breakages resulting from failed verification
of binary hyb files for hyphenation patterns.

Bug: 24570591
Change-Id: I65ac4536d3436586c2633e2b57554fc6ff16d3a8
(cherry picked from commit 179d763488f9e4ddcc94e3e844bfb0d796974f97)
2015-10-14 16:32:17 -07:00
Raph Levien
9036c194b0 Binary format for hyphenation patterns
In the current state, hyphenation in all languages than Sanskrit seems
to work (case-folding edge cases). Thus, we just disable Sanskrit.
Packed tries are implemented, but not the finite state machine
(space/speed tradeoff).

This commit contains a throw-away test app, which runs on the host.
I think I want to replace it with unit tests, but I'm including it in
the CL because it's useful during development.

Bug: 21562869
Bug: 21826930
Bug: 23317038
Bug: 23317904
Bug: 24570591
Change-Id: I7479a565a4a062fa319651c2c14c0fa18c5ceaea
(cherry picked from commit 96df754284ff81f0a25e7edd486bf7bd85a59fdf)
2015-10-14 16:26:37 -07:00
Raph Levien
2be7eeef68 Improve fallback where explicit variant is not given
In computing scores for which fallback font to choose, a match of a
variant given explicitly in the xml config file scores higher than a
family with no explicit variant. One consequence is that U+2010
HYPHEN is chosen from the Naskh Arabic font in the fallback case.

This patch scores families with no variants as a match (effectively
the same as if the xml file specified both variants). Thus, it will
choose the first matching font (Roboto), which is a better choice.

This patch also revises the list of "sticky" characters to include
various hyphens, so Arabic (and potentially other scripts) text that
includes hyphens can access the script-specific variants matched to
the underlying text.

Bug: 22824219
Change-Id: I6ec1043037f89cad50ca99ac24c473395546bcdf
2015-07-29 14:36:33 -07:00
Raph Levien
322e328216 Merge "Revert "Allow clusters to start with zero-width characters"" into mnc-dev 2015-07-21 16:55:08 +00:00
Raph Levien
4d86b85e69 Revert "Allow clusters to start with zero-width characters"
This reverts commit 1b3bfb262437625ca4e6efb93b7b90543d6b5ec3.

Bug: 22589743
Bug: 22121742
Change-Id: I7b482ffb8a0ee174ddc804aa890de45bdbd758e3
2015-07-21 16:08:08 +00:00
Raph Levien
8a83b1a4ef Consistently apply break opportunities in text spans
It's essential not to apply a break opportunity within a replacement
span, otherwise things can happen such as displaying the span twice.
The old code tested this case based on zero-width characters.
However, this test was both imprecise, and also in some cases read
uninitialized values from the mCharWidths array, which in turn led
to inconsistent line breaking of the same text.

This patch applies all line break opportunities (as identified by
ICU) within text (as opposed to replacement spans), and also applies
break opportunities at the beginning and end of replacement spans,
but avoids breaks within a replacement span.

Bug: 20138621
Change-Id: I36baeb44d6808356649e1bb69ca57f093fc8c723
2015-07-20 15:37:54 -07:00
Roozbeh Pournader
7f0d04161b Use ICU to lowercase words to hyphenate.
Previously, the standard C tolower() function was used, which
didn't support any characters beyond the basic ASCII letters.

Bug: 22506121
Change-Id: Ibb81121caa29be44fbb59aa98891e9faafc57592
2015-07-15 16:31:07 -07:00
Roozbeh Pournader
de1bd61f00 Add missing hyphen-like characters.
This adds various hyphen-like characters missed in the previous
patch, that should disallow automatic hyphenation of words containing
them.

Bug: 22484266
Change-Id: Ie972cb50384dbe0aa1ab5ec50286b75f9877953a
2015-07-15 10:59:59 -07:00
Roozbeh Pournader
9793a7eda4 Avoid re-hyphenating already-hyphenated phrases.
Previously, automatic hyphenation blindly took almost every line
breaking opportunity as a word break, so words like "low-budget" were
treated as two separate words, "low-", and "budget", each
automatically hyphenated.

This patch makes sure the subwords in already-hyphenated phrases are
not passed to the automatic hyphenator, while keeping the possibility
of a potential line break where a hyphen already exists.

Bug: 22484266
Bug: 22287425
Change-Id: Ie46dbdd70e993d64a9b9cf44b4ae93b21459dbc2
2015-07-14 13:04:49 -07:00
Raph Levien
2685aef48e Add HyphenEdit to layout cache
We bypass the word layout cache for "complex" cases, which includes
things like OpenType features. We were counting a hyphen edit as such
a case, but the problem is that we measure a _lot_ of these when
doing layout with hyphenation.

This patch adds plumbing for hyphen edits to the layout cache, so
that word fragments with hyphens can be cached as well.

Bug: 22378829

Change-Id: Idba4df4faa14f48a5faccc8a7a7955a36c19ef27
2015-07-09 17:38:58 -07:00
Raph Levien
1b3bfb2624 Allow clusters to start with zero-width characters
The logic in getRunAdvance() assumed that any zero-width character was
part of the preceding cluster, which is valid most of the time. However,
characters such as ZWNBSP (U+FEFF) renders as a zero width glyph
and is also a grapheme cluster boundary. This patch adds a clause to
handle that case.

Bug: 22121742
Change-Id: Iad79a7d988bded1ef05f0fd7905d20669ea22051
2015-06-30 10:15:43 -07:00