Commit Graph

147 Commits

Author SHA1 Message Date
Raph Levien
371e5dbb3f 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
2015-11-30 15:08:41 -08:00
Seigo Nonaka
ff9d1a5484 Merge "Search all families instead of using mRanges for variation sequence." 2015-11-20 05:46:31 +00:00
Seigo Nonaka
3700f23508 Search all families instead of using mRanges for variation sequence.
To optimize the font family search, mRanges is used for narrowing down
the search range. However, mRanges is constructed from format 4 or
format 12 entries. So, if the font supports a variation sequence but doesn't
support the base character of the sequence, the font may not be listed in
mRanges.

The proper way to fix this issue is using format 14 subtable information
for mRanges construction. However, this is not a trivial work since currently
we rely on HarfBuzz for variation sequence lookup and it doesn't provide any
API for retrieving coverage information.

Thus, as the quick fix, iterate all font families in font fallback chain if
the variation sequence is specified.

Change-Id: I278da84be8fb8f553590e2e42ed450b7e4a34eca
2015-11-19 17:14:59 +09:00
Seigo Nonaka
77476fc5b9 Introduce FontCollection::hasVariationSelector method.
To implement Paint.hasGlyph(), we need a new method to ask the
FontCollection if it has a glyph for the code point and variation
selector pair.

Bug: 11256006
Change-Id: Ie4185c91bcaa4d01aee6beb97784b1f9d2a88f12
2015-11-19 17:01:46 +09:00
Seigo Nonaka
40ffbdf94c Fix invalid decrement range of KEYCAP handling in itemize.
This issue was introduced by I22ce0e9eadc941f84e3a9b23462f194e51dd7180.
Need to decrement the two utf16 chars in KEYCAP handling.

To add unit tests, this CL also addresses the Bug: 24184208 by
introducing self built fonts since there is no good example in system
installed fonts.

Bug: 24184208
Change-Id: I23fa008adbaced78a3cb96442a6bc8892ab84ce8
2015-11-13 14:39:06 +09:00
Seigo Nonaka
ac88812115 Add -Werror -Wall -Wextra to compiler option.
This is 2nd trial of I30a0914a4633bd93eb60957cdf378770f04d8428

- To suppress noisy unused parameter warnings, comment out unused
  arguments.
- Add -Werror for suppressing further warning.
- Add -Wall -Wextra for safety.
- Use "z" prefix for format string of size_t.

Verified that compile succeeded on all arm,arm64,mips,x86,x86_64.

Change-Id: I7ad208464486b8a35da53929cb1cfe541ed0052f
2015-10-28 04:52:49 +00:00
Bart Sears
07c8ad2b85 Revert "Add -Werror -Wall -Wextra to compiler option."
This reverts commit a816dfb3fa.

Change-Id: I2b4b10e8afedc85dbe2d07f3e47315652b65cd14
2015-10-28 03:16:55 +00:00
Seigo Nonaka
a816dfb3fa Add -Werror -Wall -Wextra to compiler option.
- To suppress noisy unused parameter warnings, comment out unused
  arguments.
- Add -Werror for suppressing further warning.
- Add -Wall -Wextra for safety.

Change-Id: I30a0914a4633bd93eb60957cdf378770f04d8428
2015-10-27 21:18:22 +09:00
Roozbeh Pournader
9a4c3535be Basic scaffolding for handling a language list.
The behavior hasn't changed much yet: all languages are ignored for
rendering text, except the very first supported language.

Change-Id: I1695fb985927ae5e28e4f59c1b531e4993af8688
2015-10-22 14:01:50 -07:00
Seigo Nonaka
0eb96541f6 Merge "Support Variation Selector in font selection." 2015-10-20 03:47:03 +00:00
Seigo Nonaka
2a099196e6 Support Variation Selector in font selection.
This CL contains the following changes:
- Add a variation selector argument into getFamilyForChar to be able to
  select fonts which support variation selector.
- In case no fonts support the codepoint and variation selector pair,
  add a fallback rule which selects font family with ignoring variation
  selector.
- Change FontCollection::itemize to not change the font family
  immediately preceding a variation selector.
- Introduce unit tests for variation selectors.

With this CL, TextView can render the variation selectors correctly.

Bug: 11256006
Change-Id: I22ce0e9eadc941f84e3a9b23462f194e51dd7180
2015-10-20 12:34:40 +09:00
Seigo Nonaka
aaec3837bf Remove MinikinFont::GetGlyph interface.
MinikinFont:GetGlyph is no longer used.
No behavior chnages are expected with this CL.

Change-Id: I13398503841ac06f930b04815017d4b33338efa1
2015-10-15 02:54:18 +00:00
Seigo Nonaka
ad9cb5909a Introduce FontFamily::hasVariationSelector
This CL introduces new method hasVariationSelector into FontFamily but it
is not used in production code. So no behavior changes are expected.

This CL contains the following changes:
- Introduce hasVariationSelector which returns true if the corresponding
  font has a glyph for a code point and variation selector pair.
- Introduce purgeHbFontCache since hb_face_t won't be released by
  keeping hb_font_t.
- Introduce unit tests with self-built font.

Change-Id: I659a6d03d9ec446b409e1fba2758452abb9f44fa
2015-10-12 18:53:45 +09:00
Keisuke Kuroyanagi
89e185c3a8 Merge "Refactoring: Introduce helper class to iterate runs." 2015-10-01 20:11:50 +00:00
Raph Levien
af68d9ae49 Merge "Explicitly set utf-8 encoding for hyb file verification" 2015-10-01 06:36:47 +00:00
Raph Levien
179d763488 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.

Change-Id: I65ac4536d3436586c2633e2b57554fc6ff16d3a8
2015-09-30 23:26:54 -07:00
Raph Levien
d277bd3287 Merge "Binary format for hyphenation patterns" 2015-10-01 04:53:44 +00:00
Raph Levien
96df754284 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

Change-Id: I7479a565a4a062fa319651c2c14c0fa18c5ceaea
2015-09-30 21:37:31 -07:00
Seigo Nonaka
52dfb07bde Extract hb_face_t object cache mechanism from Layout.cpp.
This CL does following things:
- Extract hb_face_t object cache mechanism from Layout.cpp to be able to
  use it from other cpp file, especially from FontFamily.cpp.
  To address Bug 11256006 and Bug 17759267, need to touch
  hb_face_t from FontFamily.
- Make hb_face_t cache mechanism thread-safe.
- Add unit tests for HbFaceCache test cases.

Bug: 11256006
Bug: 17759267
Change-Id: Ic183634ef34326793bd9a32167236611d0af34d6
2015-09-30 17:36:44 +09:00
Seigo Nonaka
0bf06e0c74 Merge "Introduce unit tests for FontCollection::itemize." 2015-09-30 03:33:13 +00:00
Keisuke Kuroyanagi
f6aa09df27 Refactoring: Introduce helper class to iterate runs.
This doesn't change current behavior. It's a preparation
for the following CLs.

Bug: 22408712
Change-Id: Ic018422254aa3904655f499194caad74f0c0fc5d
2015-09-29 16:05:15 -07:00
Seigo Nonaka
5debe07231 Introduce unit tests for FontCollection::itemize.
Introduced tests depend on installed font list in running device.
I verified these test passed  on Nexus 5(hammerhead), Nexus 6(shamu)
and Nexus 9(volantis).

Bug: 11256006
Bug: 17759267
Change-Id: I6f806370e17f6c6d3dad8df0cb70bb475a827873
2015-09-18 15:40:51 +09:00
Seigo Nonaka
0345da636e Resolve glyph ID by HarfBuzz function.
Currently codepoint to glyph ID resolution is done through MinikinFont
interface. To support variation selector, use HarfBuzz API instead of
calling this interface since one of its implementation Skia doesn't
support variation selector.

On the other hand, we don't want to get glyph horizontal advance values
by HarfBuzz since HarfBuzz doesn't return correct values when the hinting
is active.

Thus, use ot_font as a parent font and override
glyph_h_advance/glyph_h_origin functions as is.

With this change, MinikinFont::GetGlyph is no longer necessary but not
removing in this CL for easy reverting since removing interface requires
multi-repository commit.

This is a base work of b/11256006 and this patch doesn't provide any
user visible changes.

Bug: 11256006
Change-Id: I061172c0b674bb649ce8bc013ffecf38708bdc41
2015-09-11 16:44:37 +09:00
Seigo Nonaka
f09cf789ef Update word breaker to be aware tone mark and variation selector.
This CL does:
1. Move the getNextWordBreak/getPrevWordBreak function to a separate source file.
2. Adding "ForCache" suffix for function name for making clear these function is
   for layout cache.
3. Introduce unit tests for them.

Bug: 11256006
Change-Id: I4138751a4570915f1a0d6c8921f89700f8ec7f35
2015-08-29 08:02:44 +09:00
Raph Levien
4f1a868872 Add basic unit tests for Minikin
Initial unit tests for Minikin functionality. Also fixes an incorrect
Hangul case (uncovered in testing), and improves handling of broken
UTF-16.

Change-Id: I69b441d8e3b19ed06abcc56f13271abadf3d1010
2015-08-19 15:00:25 -07:00
Roozbeh Pournader
f191954337 Clean up use of printf() in Layout.cpp.
Reported externally at https://code.google.com/p/android/issues/detail?id=167715.
Bug: 21498085

Change-Id: I73f22de03b0151ce31a6b3070d051a2a701b33d2
2015-08-11 17:46:18 -07:00
Roozbeh Pournader
92603d1527 Support three-letter language codes in FontLanguage.
Also handle the case of weird language code that we don't understand
properly better, by treating them not equal to each other.

Change-Id: Iaccb251fa38d700932f6eadac254d3d1fa09b3ea
2015-08-07 22:16:25 -07:00
Roozbeh Pournader
36a78d6d47 Gold plate grapheme cluster breaks.
This tailors Unicode's Grapheme_Cluster_Break property to better
classify characters currently with the Control property value.

Also adds support for rule GB9b of UAX #29, needed since there are
now characters we are tailoring to be Prepend. The rule was
previously ommited in our implementation because there was no
characters in the Prepend class.

Bug: 15653110
Change-Id: If10da88df0980f7d676c8c0b950eda5fb8dbe741
2015-08-06 14:28:38 -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 1b3bfb2624.

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
Raph Levien
8726aff8cf Fix logspam and incorrect cluster offset
An incorrect cluster offset calculation was causing a lot of log
messages to appear. Separately, a confusion between #if and #ifdef was
causing unintended logging of line breaks. This patch fixes both.

Bug: 22178333
Change-Id: I2b3673ed66c784f5082fd127a8dc10bd3df6ed79
2015-06-29 14:21:10 -07:00
Raph Levien
5704594913 Disable letterspacing for connected scripts
The appearance of letterspacing with scripts with cursive connections
is poor, so we simply disable letterspacing for those scripts. There
may be some cases where some form of letterspacing is desirable, but
this gives the highest likelihood that the final result will be good
without requiring additional work from clients.

Bug: 21935803
Change-Id: Ie25266249ac3a2605aa89ef5132e8edbe3a06d35
2015-06-26 11:15:17 -07:00
Raph Levien
e5cb2f787c Separate additional penalty for last line with hyphen
A recent change added a penalty for a hyphen at the last line break,
which is visually undesirable. However, the penalty was assessed to
"widthScore", which broke the assumption (used for another
optimization) that widthScore increases monotonically. This patch
separates the penalty into a different parameter, restoring the
validity of the monotonicity assumption.

Bug: 22066119
Change-Id: I6a47a350ef3ceee2f00ee430d6954d0c307227f0
2015-06-24 14:08:45 -07:00
Roozbeh Pournader
072167f797 Merge "Use ASCII HYPHEN-MINUS when there's no HYPHEN in the font." into mnc-dev 2015-06-12 22:30:03 +00:00
Roozbeh Pournader
48e52a29af Use ASCII HYPHEN-MINUS when there's no HYPHEN in the font.
Previously, we just assumed the font in use had a U+2010 HYPHEN
character, resulting in a tofu (or an empty space) being shown when
U+2010 was not supported in the font used to render the hyphenated
word.

Now we try to fallback to U+002D HYPHEN-MINUS, which has a very good
chance of being available in at least any Latin font.

We still show a tofu when neither character is supported, to
intentionally alert that something is missing.

Bug: 20497913
Bug: 21088552
Bug: 21570828
Change-Id: Iff69bbc38836c03495e9124502b5207c39270da2
2015-06-12 15:23:10 -07:00
Raph Levien
6e2c0e826e Merge "Increase hyphenation penalty for short last line" into mnc-dev 2015-06-12 21:59:05 +00:00
Keisuke Kuroyanagi
8081d06133 Fix: getOffsetForAdvance can return worng offset.
searchStart was passed to getRunAdvance, but it can be
different from the start that has been used to initialize
Layout object. As a result, wrong index could be used in
getRunAdvance.

Bug: 21744454
Change-Id: Ibe83cc50ed6f0da2a1532318bc224502be350699
2015-06-10 17:45:46 +09:00
Raph Levien
19c69aef98 Increase hyphenation penalty for short last line
Tuning for hyphenation parameters. We discourage hyphenation on the
last line, but offset this penalty by also applying a penalty for
each line, which optimizes for minimizing the number of lines. Thus,
when hyphenation can reduce the number of lines, it increases the
chance they're used.

There's probably more tuning and refinement that can be done, but
testing suggests that the tunable parameters are appropriate.

Bug: 20883322

Change-Id: Ida7eaf8aced109e426694f5a386924a842d29c4b
2015-06-08 15:23:20 -07:00
Raph Levien
414664f969 Merge "Use context start correctly in getRunAdvance" into mnc-dev 2015-06-01 21:33:48 +00:00
Raph Levien
b77d0bd01b Use context start correctly in getRunAdvance
We were not taking context start into account when deciding whether
to split a ligature, which was causing inconsistent behavior. This
patch consistently references the widths array relative to the start
of the context.

Bug: 21549197
Change-Id: I7c71e10c1af84354fefe782fc0b87120016e6555
2015-06-01 14:27:00 -07:00
Raph Levien
e6fff385b6 Disable hyphenation for unreasonably long words
Very long words cause O(n^2) behavior. These are unlikely to happen in
real text, but do happen with synthetic strings, so in those cases we
just disable hyphenation.

Bug: 20790394
Change-Id: Idf957dd40b24efe1476f619f17093a48b5bc56f7
2015-06-01 12:46:47 -07:00
Roozbeh Pournader
e92a3c62b5 Support hyphenation frequency in Minikin.
Three hyphenation frequencies are now supported:

kHyphenationFrequency_None, which turns off both automatic
hyphenation and soft hyphens.

kHyphenationFrequency_Normal, which has aconservative amount of
hyphenation useful as a conservative default.

kHyphenationFrequency_Full, which has a typographic-quality amount of
hyphenation useful for running text and tight screens.

Bug: 21038249
Change-Id: I2800f718c887c9389a1a059d7ec07d7fa2ca1dee
2015-05-12 14:51:36 -07:00
John Reck
1be122da96 Move Bitmap to a different namespace
namespace naming collision. Move minikin's
Bitmap out of android:: and into minikin::

Change-Id: I5ae3925f81b848dc79576429ab55243b96f7fed2
2015-04-27 17:23:29 +00:00