278 Commits

Author SHA1 Message Date
Seigo Nonaka
fbbc5a6b36 Make SparseBitSet serializable.
To share the calculated coverage information across the processes, make
SparseBitSet serializable.

Bug: 34042446
Test: minikin_tests passes
Change-Id: I0463138adcf234739bb3ce1cdadf382021921f3e
2017-03-13 14:07:55 -07:00
Roozbeh Pournader
d78f260a98 Customizable min suffix/prefix length for hyphenation in Minikin
With this change, different languages can have a different minimum
length for suffix and prefixes when hyphenating. Previously, the
defaults used for English, 2 and 3, were used for every language.

Bug: 35712376
Test: Minikin unit tests were updated and the pass
Change-Id: Iffaf11c6b208c57d28d45b17246e177572dc1210
2017-03-06 16:12:53 -08:00
Roozbeh Pournader
c7ef4000c1 Correct hyphenation for various complex cases
This adds better support for Arabic script languages, Armenian,
Catalan, Hebrew, Kannada, Malayalam, Polish, Tamil, and Telugu by
adding various hyphenation types and edits appropriate for the
locales.

For Arabic script languages, soft hyphens act transparently with
regard to joining: If a line is broken at a soft hyphen where the two
characters around the soft hyphen were joining each other before,
they will continue to appear joining if the line is broken at the
soft hyphen and a hyphen glyph is inserted.  This is needed for
Central Asian languages such as Uighur.

For Armenian, U+058A ARMENIAN HYPHEN is used for line breaks caused
by either automatic hyphenation or soft hyphens.

For Catalan, nonstandard line breaks are implemented for "l·l", which
hyphenates as "l-/l".

For Polish, when there is a line break at a hyphen, the hyphen is
repeated at the next line.

For the South Indic languages, when breaks happen due to soft breaks
or automatic hyphenation, no visible hyphen is inserted, although a
penalty is added.

For Hebrew, support for using U+05BE HEBREW PUNCTUATION MAQAF has
been implemented, but it's turned off pending confirmation of
desirability.

Also, hard hyphens, which previously had no penalty added for
breaking the line after them, now have the same penalty as an
automatic or soft break, with the difference that no hyphen is
inserted when they break.

Finally, some bugs have been fixed with hyphenating multiscript and
multi-font words.

Bug: 19950445
Bug: 19955011
Bug: 25623243
Bug: 26154469
Bug: 26154471
Bug: 33387871
Bug: 33560754
Bug: 33752592
Bug: 33754204
Test: Unit tests added, plus thorough manual testing
Change-Id: Iaccf776ce8d1d434ee8b1c534ff3659d80fdc338
2017-03-02 15:26:13 -08:00
Seigo Nonaka
dfbc6e3742 Remove MinikinRefCounted and use shared_ptr instead
Let's use shared_ptr since manual ref counting can be a bug-prone and
using the global mutex inside destructor is not useful for some time.

To remove raw pointer manipulation, needed to change Layout
constructors. Layout is no longer copyable and need to pass
FontCollection to constructor.

Bug: 28119474
Test: minikin_tests passed
Test: hwui_unit_tests passed
Test: No performance regression in minikin_perftest.
Change-Id: I8824593206ecba74cbc9731e298f045e1ae442a3
2017-02-24 17:11:32 +09:00
Seigo Nonaka
39654bb644 Call hb_font_set_variation if font variations are provided.
Test: None
Change-Id: I203d9ba7e1a1fcfdb10cd6a711d9a35136cbddd6
2017-02-22 10:56:04 +09:00
Seigo Nonaka
22462be735 Pass region code to HarfBuzz.
Keep the region code and pass it to HarfBuzz during doing layout.

Test: minikin_tests
Bug: 30746293
Change-Id: I7c908701ca677238f663c82c597f8615d190e055
2017-02-15 20:29:38 +09:00
Roozbeh Pournader
90d8b567ef Add U+202F NARROW NO-BREAK SPACE to the sticky white list
Mongolian fonts need to shape across U+202F NARROW NO-BREAK SPACE
(NNBSP). But if the first font in the fallback chain supports NNBSP,
it would break Mongolian shaping since the text would be broken into
three font runs. By making NNBSP sticky, we make sure Mongolian text
is kept in one font run and is shaped properly.

See http://www.unicode.org/L2/L2017/17036-mongolian-suffix.pdf for
background. The proposed character in the proposal was not accepted
for encoding by the Unicode Techincal Committee, but the document
explains in more detail why this change in needed.

Bug: 34344220
Test: manual
Change-Id: I344a63f383fa5485875603570025eac3c4eb2574
2017-02-14 21:29:18 +00:00
Seigo Nonaka
065c46a665 Introduce createCollectionWithVariation.
This is 2nd attempt of I08e9b74192f8af1d045f1276498fa4e60d73863e.
The original CL was reverted due to conflicting with another CL submitted
before.

Here is the original commit message of reverted change.

This lays the groundwork for variation settings support.
Since we should regard different variations of a font as different fonts, we
need to create new typefaces. To reuse the same instance of MinikinFont, as
much as possible, FontFamily::createFamilyWithVariation now reuses an
existence instance, while incrementing the reference count.

Test: minikin_tests
Bug: 33062398
Change-Id: Ib25bf1bb5a5191e15a6523954146521464c91906
2017-01-31 13:19:56 +09:00
Seigo Nonaka
41718c770d Remove FontFamily.addFont and make FontFamily immutable.
This is 2nd attempt of 41e02e96131c1ec66d013e4615348be013518dc4
The difference is adding clearElementsEithLock to Font class which
is necessary to delete Fonts object outside of minikin. This method
should be removed once http://b/28119474 is fixed.

Here is original commit message of reverted change.

This lays the groundwork for making SparseBitSet serializable.
FontFamily.addFont is only used when the FontFamily is constructed.
Thus, instead of calling FontFamily.addFont multiple time, passes
Font list to the constructor. By this change, FontFamily can be
immutable now.

By making FontFamily immutable, We can create FontFamily with
pre-calculated SparseBitSet.

Bug: 34042446
Bug: 28119474
Bug: 34378805
Test: minikin_tests has passed
Change-Id: Ice433931196f5ae79a1a7ee0c98020f914aeb5f2
2017-01-20 17:59:42 +09:00
Siyamed Sinir
cc0352cc67 Revert "Remove FontFamily.addFont and make FontFamily immutable."
This reverts commit 41e02e96131c1ec66d013e4615348be013518dc4.

Bug: 34378805
Change-Id: I8f1ee00b365c8b17c6140e9e286fbea082e31364
2017-01-20 02:01:21 +00:00
Siyamed Sinir
e1d0fe1e93 Merge "Revert "Introduce createCollectionWithVariation."" 2017-01-20 01:59:54 +00:00
Siyamed Sinir
1c7b026154 Revert "Introduce createCollectionWithVariation."
This reverts commit 90e6b1885d44c33b1da9477a85dc7dd066acd33f.

Bug: 34378805
Change-Id: I22b683f774813724f220b1b8584ab188f3cf4fa7
2017-01-20 01:13:24 +00:00
Siyamed Sinir
22e7e464af Merge "Revert "Reduce memory usage of FontCollection."" 2017-01-12 20:19:57 +00:00
Siyamed Sinir
1d753f6fe9 Revert "Reduce memory usage of FontCollection."
This reverts commit c4b989fc812af6c94018bad2e30ed6a006e2f8f5.

Test: Manually tested
Bug: 34247671
Change-Id: I0510009b2deac784770f26059681b1980800abc8
2017-01-12 20:13:11 +00:00
TreeHugger Robot
646a6f8035 Merge "Introduce createCollectionWithVariation." 2017-01-12 16:59:26 +00:00
Seigo Nonaka
0decbb3686 Fix inverse condition of forColorEmoji.
We should override the advance function only when the glyph is came
from color bitmap. This was introduced by
Ia88cb670ca9e0bb352bccef22c5ea3a789bcc1da.

Bug: 21705974
Test: ran minikin_tests
Change-Id: I3489d75ace8bffdd9035a5986a2641313feef04d
2017-01-12 18:35:27 +09:00
Seigo Nonaka
90e6b1885d Introduce createCollectionWithVariation.
This lays the groundwork for variation settings support.
Since we should regard different variations of a font as different fonts, we
need to create new typefaces. To reuse the same instance of MinikinFont, as
much as possible, FontFamily::createFamilyWithVariation now reuses an
existence instance, while incrementing the reference count.

Test: minikin_tests
Bug: 33062398
Change-Id: I08e9b74192f8af1d045f1276498fa4e60d73863e
2017-01-12 18:26:46 +09:00
Seigo Nonaka
dfab450f81 Merge "Use HarfBuzz metric implementation for emoji font." 2017-01-12 08:18:25 +00:00
Seigo Nonaka
a559cfd5df Merge "Fix GraphemeBreak test failures." 2017-01-12 08:17:32 +00:00
TreeHugger Robot
bdb50a7cc5 Merge "Remove FontFamily.addFont and make FontFamily immutable." 2017-01-12 07:43:53 +00:00
Seigo Nonaka
212f327e3d Merge "Reduce memory usage of FontCollection." 2017-01-12 06:02:58 +00:00
Seigo Nonaka
41e02e9613 Remove FontFamily.addFont and make FontFamily immutable.
This lays the groundwork for making SparseBitSet serializable.
FontFamily.addFont is only used when the FontFamily is constructed.
Thus, instead of calling FontFamily.addFont multiple time, passes
Font list to the constructor. By this change, FontFamily can be
immutable now.

By making FontFamily immutable, We can create FontFamily with
pre-calculated SparseBitSet.

Bug: 34042446
Test: minikin_tests has passed
Change-Id: I2576789fba6cb27687e920e2488e8bedbcf7d36f
2017-01-12 13:27:00 +09:00
Seigo Nonaka
8a805cd265 Fix GraphemeBreak test failures.
GraphemeBreak.tailoring/GraphemeBreak.genderBalancedEmoji start failing
after ICU update to 58. The failure is around Rule GB9 in Unicode Standard
Annex #29. GB9 forbids breaks before extending characters and before ZWJ.
However the implementation in minikin only checks for extending characters.
It used to work with Unicode 8.0 since ZWJ had the Grapheme_Cluster_Break
property of Extend in Unicode 8.0 but it no longer has that property in
Uniocde 9.0.
Thus, we need to check for ZWJ explicitly.

At the same time, this removes manually added PREPEND characters case from
tailoredGraphemeClusterBreak which is already supported in ICU 58.

Test: minikin_tests passes
Bug: 34117643
Change-Id: Ib46d48bebe4a866208e050d7defc715c61fcbeb1
2017-01-11 17:40:27 +09:00
Seigo Nonaka
afc31403d5 Merge "Tune line breaking for justification" 2017-01-11 08:24:09 +00:00
Seigo Nonaka
58ee6af0c3 Use HarfBuzz metric implementation for emoji font.
To avoid lock contention in Skia, use HarfBuzz implementation
for retrieving boundary box and advance information from font.

Bug: 21705974
Test: Manually done

Change-Id: Ia88cb670ca9e0bb352bccef22c5ea3a789bcc1da
2017-01-11 17:21:40 +09:00
Mark Salyzyn
77baca2bda resolve merge conflicts of dff2a9d to master
Test: compile
Bug: 30465923
Change-Id: I9bcbf910e90a9160ed2fd2f75c5d72dba6ad6fcf
2017-01-10 08:22:04 -08:00
Mark Salyzyn
39ab40115f minikin: use log/log.h when utilizing ALOG macros
Use log/log.h to harden code against liblog changes.

Test: compile
Bug: 30465923
Change-Id: I3dea82e76d28d9ef52d7c0f11e038c4298863eb9
2017-01-09 13:33:48 -08:00
Seigo Nonaka
c4b989fc81 Reduce memory usage of FontCollection.
Since switching to 64-bit devices, size_t is now a 64-bit integer.
FontCollection::Range uses two size_t integers but they just point to an index
in mFamilies. To reduce the memory usage, this CL changes the size_t integers to
uint8_t.

The maximum size of each integer in Range is the size of FontCollection::mFamilies.
The largest this can go is the system font list plus a user defined family, which
has 91 families. So an 8-bit integer should be enough.

With this change, about 84 KiB of memory will be saved per font collection. Since
eight font collections are created during bootstrap, about 670 KiB of memory will
be saved with this CL.

Bug: 33562608
Test: Ran FontCollection.collectionAllocationSizeTest on a 64-bit device.
      On my Nexus 5X, it changed from 327358 to 241342.

Change-Id: I9e01d237c9adcb05e200932401cb1a4780049f86
2017-01-06 17:27:14 +09:00
Seigo Nonaka
3a74bcd0b4 Tune line breaking for justification
Add an "mJustified" for justification, and tune the line breaking to
produce good results. Major differences for fully justified text include:
- Space can be shrunk in justified text.
- Hyphenation should be more aggressive in justified text.

Also adds a penalty for the last line being very short. This is tuned
to be more aggressive for ragged right than for justified text.

This is based on a patch by Raph Levien (raph@google.com).

Bug: 31707212
Test: Manually tested with Icbfab2faa11a6a0b52e6f0a77a9c9b5ef6e191da
Change-Id: If366f82800831ccc247ec07b7bc28ca4c6ae0ed6
2017-01-02 22:51:40 +09:00
Mark Salyzyn
32c12c0ac8 resolve merge conflicts of 2377a00 to master
Test: build
Bug: 26552300
Bug: 31289077
Change-Id: I6181ae7e84f9bdcbed50841c70d07f6906a10eb7
2016-12-28 13:51:49 -08:00
Mark Salyzyn
555d84c6f9 minikin: Replace cutils/log.h with android/log.h or log/log.h
- replace cutils/log.h with android/log.h (main buffer logging)
- replace cutils/log.h with log.log.h (+SafetyNet logging)
- define LOG_TAG before use.

Test: compile
Bug: 26552300
Bug: 31289077
Change-Id: I7a4803dd66f31b7103e09e5ff5b8fa523fa0fd60
2016-12-27 10:10:18 -08:00
Yirui Huang
d478da324d Change language score calculation
Change language score calculation in the calculation of the font family.
Instead of language and script matching, a match in subtag is added.
In addition, a match in subtag has a higher priority than a match in
script. The score levels are divided into 5 score levels and the limit
of the number of font languages is changed to 12 from 17. Multiple
languages selection rule could to be added in the future.

Bug: 31608997
Test: Done by unittests.
Change-Id: I1e7177095f604fd1794bc99ca36c705dcb4c56e7
2016-12-06 18:17:54 +09:00
yirui
e1d7f6168a Parse Emoji subtag and store it to FontLanguage
Parse Emoji subtag and store into 4 different styles: default, text,
color and empty. Replace hasEmojiFlag function with getEmojiStyle to
get effective status according to script and subtag. However, score
calculation for the font selection needs to be completed in the next
stage. No performance regression is observed with this CL.

Bug: 31608997
Test: Done by unittests.
Change-Id: I923243641c946248dd5a0aa9fb9c940515310d34
2016-11-21 06:24:26 +00:00
Seigo Nonaka
fd77b01ff2 Clean Up: Removing unused interface GetTable from MinikinFont.
This is 2nd attempt of Ifcd7a348d7fb5af081192899dbcdfc7fb4eebbf9

After Id766ab16a8d342bf7322a90e076e801271d527d4, GetTable is no longer
used in production due to poor performance and it is now only used in
tests. This CL removes GetTable interface from MinikinFont and update
tests code to use new interfaces, GetFontData, GetFontSize and
GetFontIndex.

Bug: 27860101
Test: Manually done
Change-Id: Ib48973ff25cdc61a4c666d28128266df0aaea83e
2016-11-17 17:36:51 +09:00
Seigo Nonaka
acd401d029 Implement word spacing
Add a wordSpacing paint parameter, which will be used for
justification.

Bug: 31707212
Test: ran minikin_tests
Change-Id: I91224ab8ef882ac0c87425c28ab731fead283612
2016-11-16 17:36:26 +09:00
Seigo Nonaka
160fdd1f16 Merge "Fix lookup order for VS in itemization." 2016-11-07 07:28:37 +00:00
Seigo Nonaka
8d7ed7374b Revert "Clean Up: Removing unused interface GetTable from MinikinFont."
This reverts commit 1d525df4f0849a980c3204d5e4d41cbcc42f4ad6.

This causes a crash on Android Auto.

Bug: 32374752
Change-Id: Ia2ff77bf9a12351c6949f79ef6fa2d8016e3022d
2016-10-25 00:49:52 +00:00
Seigo Nonaka
1d525df4f0 Clean Up: Removing unused interface GetTable from MinikinFont.
After Id766ab16a8d342bf7322a90e076e801271d527d4, GetTable is no longer
used in production due to poor performance and it is now only used in
tests. This CL removes GetTable interface from MinikinFont and update
tests code to use new interfaces, GetFontData, GetFontSize and
GetFontIndex.

Bug: 27860101
Test: Manually done

Change-Id: Ifcd7a348d7fb5af081192899dbcdfc7fb4eebbf9
2016-10-18 08:16:18 +00:00
Seigo Nonaka
4a4e6574c0 Fix lookup order for VS in itemization.
This is partial revert of Iced1349e3ca750821d8882c551551f65bb569794.

Due to sorting of target family vectors, the font family order from XML
settings file is broken. Making unique operation stable doesn't fix the
issue completely since some font families are appended for the fallback
which also breaks the original order.

By this change, itemization becomes 3x slower than before if variation
selector is appended.

Bug: 29585939
Change-Id: I7c1a8a57f04111a30cd41a5cd5bec25fcfb3972e
2016-09-15 16:23:40 +09:00
Dan Willemsen
d7f177ca30 Merge "Rename libicuuc-host/libicui18n-host to libicuuc/libicui18n" am: 00b9a21209 am: acad3df882 am: f58fc7b5ff
am: 229f35a43a

Change-Id: I85ee278323a578fcf941651161b46ef0559098cc
2016-09-13 04:32:28 +00:00
Dan Willemsen
229f35a43a Merge "Rename libicuuc-host/libicui18n-host to libicuuc/libicui18n" am: 00b9a21209 am: acad3df882
am: f58fc7b5ff

Change-Id: I346fddaa5822eee2371d877a8bdeb055b6244c0d
2016-09-13 03:58:51 +00:00
Dan Willemsen
00b9a21209 Merge "Rename libicuuc-host/libicui18n-host to libicuuc/libicui18n" 2016-09-13 03:47:02 +00:00
Elliott Hughes
57e469e6f8 Switch minikin to std::unique_ptr. am: 6261d82459 am: e716bdbd48 am: 2583c5c86b
am: bb3df55710

Change-Id: I56cce90607bce82d337d4da3b4ac5f167c7cc1b4
2016-09-13 01:50:14 +00:00
Elliott Hughes
bb3df55710 Switch minikin to std::unique_ptr. am: 6261d82459 am: e716bdbd48
am: 2583c5c86b

Change-Id: I9c0b81d55e01b08b053a7031a214626351244607
2016-09-13 01:29:45 +00:00
Elliott Hughes
6261d82459 Switch minikin to std::unique_ptr.
Bug: http://b/22403888
Change-Id: I9e18496fcc38ad2e6b922455daa9f2a46778ec55
2016-09-12 15:29:35 -07:00
Dan Willemsen
ccfc696dfc Rename libicuuc-host/libicui18n-host to libicuuc/libicui18n
These modules can be named the same between the target and host
libraries, which simplifies references to them, particularly in
Soong.

To prevent accidentally loading the system copy of the library,
we still rename the installed name to be libicu*-host.so. But
modules do not need to know that in order to build against them.

Change-Id: Ic38499bb236ace75333a84f23798af023e14cf5f
2016-09-12 14:37:02 -07:00
Chih-Hung Hsieh
47b905f684 Fix google-explicit-constructor warnings in minikin
* Add explicit keyword to conversion constructors,
  or add NOLINT(implicit) for implicit converters.
Bug: 28341362
Test: build with WITH_TIDY=1

Change-Id: I0c7b90f9bb953a9f2e4f0fb2032fa65ac604b9ca
2016-08-15 13:58:52 -07:00
Roozbeh Pournader
b830102259 Revert "Lookup glyph from color emoji font before and after ZWJ." am: 1aa0c40db9 am: de728a34c9
am: f83d57f7e5

Change-Id: Iebf945839891cc1ab561cf424ef917ac15e08842
2016-08-11 23:40:20 +00:00
Roozbeh Pournader
1aa0c40db9 Revert "Lookup glyph from color emoji font before and after ZWJ."
This reverts commit 9431bb96406121d2eb3fda8ca8209edc434f96a0.

Bug: 30815709
Change-Id: I057d9bcd05246e58894abb4e9633bd10f6fab211
2016-08-11 21:03:00 +00:00
Seigo Nonaka
9431bb9640 Lookup glyph from color emoji font before and after ZWJ.
Unicode recommends that the zwj sequences should be emoji presentation
even if they don't have the proper U+FE0F. Thus always lookup the glyph
for the code point before and after zwj as if they have a U+FE0F
variation selector.

Bug: 30056627
Change-Id: I03958a92337eaba4a8dd9c5be824b2665aa4a103
2016-07-13 14:12:06 -07:00