88 Commits

Author SHA1 Message Date
Raph Levien
48e5307447 Add error logging on invalid cmap - DO NOT MERGE
This patch logs instances of fonts with invalid cmap tables.

Bug: 25645298
Bug: 26413177
Change-Id: I183985e9784a97a2b4307a22e036382b1fc90e5e
2016-02-12 17:09:01 +00:00
Raph Levien
ca8ac8acda 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
Raph Levien
6299a6ba13 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 183c9ec2800baa2ce099ee260c6cbc6121cf1274)
2015-12-07 17:58:12 +00:00
Raph Levien
d5804e3937 Fine-tune fake-bolding condition
The old logic for fake bolding results in no fake bolding for a bold
span on a light weight (300) because the target weight (600 in this
case) didn't meet the condition. This patch fine-tunes the threshold
to enable fake bolding for this.

Bug: 17587185

Change-Id: I04abd00a74240cbed79c417f81486aa2158b2806
2014-09-22 18:21:34 +00:00
Raph Levien
6740536e39 Snap advance widths to integers
Fractional advance widths were causing subtle problems with text
positioning when the same text was drawn with different spans in the
hwui renderer. Quantizing the coordinates on layout (as opposed to
waiting until the renderer draws the glyphs) solves the problem.

This patch also fixes a discrepancy between x position and advance
widths when letterspacing.

Bug: 17347779
Change-Id: Ia705944047408c2839d5ad078eefd6bbec446872
2014-09-03 10:42:52 -07:00
Raph Levien
997c799e3e Try Unicode decomposition for selecting fallback font
This patch finds an appropriate fallback font in the case where no font
directly maps the requested character, but a font does exist for the
character's canonical decomposition. This yields correct rendering of
compatibility characters such as U+FA70.

Bug: 15816880
Bug: 16856221
Change-Id: Idff8ed6b942fec992a0815a32028b95af091d0ee
2014-08-26 22:20:16 -07:00
Behdad Esfahbod
56c7fb8c06 Allocate font vector on stack
This reduces another allocation (last one?) we were doing when
fulfilling shaping requests from the cache.

Bug: 17111260
Change-Id: Ieb8ae1ccfcaacedb257e1e9263777f10623aaf98
2014-08-21 19:25:06 -04:00
Behdad Esfahbod
6da7796cbe Fix Layout initialization in the skipCache path
C++ local var initialization always tricks me.  Previously, Layout
didn't have a constructor, which meant that defining it on the stack
left mAdvance uninitialized.  This was not an issue when we were doing
"new Layout()", since that invokes zero-initialization, but was an
issue for the skipCache path that was allocating layout on stack by
just "Layout l" instead of "Layout l = Layout()".  To avoid surprises,
add a constructors that clears everything.

Also adds reset() method to reset the layout for reuse.

Change-Id: I3e02f00da9dd7d360abe13f63c310f6882292d0a
2014-08-21 17:26:04 -04:00
Behdad Esfahbod
288c915963 Speed up cache lookup
Avoid copying the string for cache lookup.

Bug: 17111260
Change-Id: Ic220bfc991fc6b3dada197304aabdf72a8941bd7
2014-08-21 14:00:25 -04:00
Behdad Esfahbod
f952161b87 Choose same font for Emoji keycap and its base character
The U+20E3 COMBINING KEYCAP is used in our fonts to generate an emoji
rendering of ASCII numbers and letters through GSUB.  For that to work
we need to choose the same (Emoji) font for the character coming
*before* the COMBINING KEYCAP character.

This is a special-case of a broader need to choose fonts per grapheme
cluster as opposed to per character, but for now, special-case U+20E3.

Bug: 7557244
Change-Id: I958e5a01068df8495bbb9bc3b9ed871cea1838b6
2014-08-08 15:37:28 -04:00
Behdad Esfahbod
5986f6048a Support fontFeatureSettings
Bug: 15246510
Change-Id: I544915d29b2be4fb9f82f1989188a3a918c50fbc
2014-07-30 17:29:00 -04:00
Behdad Esfahbod
9802b0dc8e Fix examples build
Was broken after recent CSS removal.

Change-Id: I160fbc73286b21336d6f3943ff92d7d150dff74b
2014-07-29 16:57:00 -04:00
Behdad Esfahbod
d50c99df4e Merge "Remove CSS string doLayout entrypoint and supporting code" into lmp-dev 2014-07-27 22:35:46 +00:00
Behdad Esfahbod
83d5a3c53d Initialize MinikinPaint members
We are stack-allocating MinikinPaint objects in Minikin clients, and
without a constructor adding new members to the struct cannot be done
without updating all clients (only one right now!).

Change-Id: I4170f16498bb6b07cb795495011aca58087ed0bd
2014-07-29 16:26:49 -04:00
Behdad Esfahbod
c924dd126d Remove CSS string doLayout entrypoint and supporting code
All usage is ported to the new doLayout() API now.

Bug: 16651112
Change-Id: I2c959138a69853b5e30098889d771fe5f4cfaa66
2014-07-29 15:51:12 -04:00
Behdad Esfahbod
09f1901d6b Add doLayout variant that does NOT take css string
New API removes CSS string and directly takes needed objects.

Bug: 16651112
Change-Id: Ie5f7c2ab05be6cbd77cae0a5fd6bb453771ada59
2014-07-29 12:46:07 -04:00
Behdad Esfahbod
41b1aa18d7 Merge "Don't get stuck on invalid UTF-16" into lmp-dev 2014-07-24 15:37:54 +00:00
Behdad Esfahbod
b8208bc19c Don't get stuck on invalid UTF-16
Replaces invalid unicode with replacement character U+FFFD and always
makes forward progress.

Bug: 15849380

Change-Id: Ic59ef6c64b0f5c4450bcae61597adcc269d6e7c5
2014-07-25 19:13:10 +00:00
Behdad Esfahbod
a5bb91190e Towards CSS removal
Extract language from FontStyle during shaping.  Don't attach CSS
to LayoutContext.

Change-Id: Ie621d3415410178d0d15fa7b810eb8e412342ab6
2014-07-24 20:26:03 -04:00
Behdad Esfahbod
f0a1e5b2da Remove deprecated API
It has been unused outside minikin.

Change-Id: Iaa2237767d81c77f90d0264e633375e601dd72f1
2014-07-24 19:18:14 -04:00
Behdad Esfahbod
8e7a3dae37 Add letter-spacing support
Bug: 15594400
Change-Id: Ied94d7674be4097b0f44c9b0770d3294dc6433c1
2014-07-22 16:37:53 -04:00
Behdad Esfahbod
4422f4dd94 Don't pass invalid Unicode codepoint to Skia
Bug: 15849380
Change-Id: Ib5285e57c5806bd399600fadd56e8bc809da323f
2014-07-11 11:30:06 -04:00
Behdad Esfahbod
a8e7eb6316 Merge "Use __builtin_clzl if element is long" 2014-07-10 21:09:47 +00:00
Behdad Esfahbod
329ae0639e Use __builtin_clzl if element is long
Change-Id: I50a112739847fa826088854f6d172a188ff4cfb3
2014-07-10 17:48:37 -04:00
Elliott Hughes
fbe7ebf529 Switch minikin to the new icu.
Change-Id: I29a59edfe6102257c9f308aac1b4348ef7a18db7
2014-07-10 10:39:07 -07:00
Raph Levien
156acb18f5 Assign non-coverage font runs to base font
When a run has no cmap coverage in any font, use the base font. Most of
the time, this will cause rendering of the .notdef glyph, which is
preferable to displaying nothing. In some cases, Harfbuzz may be able to
decompose the characters (not in the cmap) to ones that are, in which
case we'll render those, as long as they're in the base font.

Bug: 6629748
Bug: 15816880
Change-Id: Ibb1b9242c83626e0c7db363ad65ce44a967a005e
2014-07-09 09:18:15 -07:00
Mike Reed
f8134eff00 setConfig is deprecated
Change-Id: Iffad3ef724b565d5d8fed17722630fd74cda9234
2014-07-07 10:59:40 -04:00
Raph Levien
67ea671fe4 Disable "palt" OpenType feature
Proper Japanese layout requires sophisticated rules for spacing
punctuation, not just turning on the "palt" (proportional alternate)
feature. Until we can support the whole set, roll back palt.

Change-Id: If2359c529b70b1dd45dddc00e5f4aa1c91f8b0e9
2014-06-26 14:34:27 -07:00
Raph Levien
22e41754f6 Add purgeCaches() method
Expose a method to purge caches used for TextLayout, useful for low
memory conditions.

Change-Id: I92f41afe987b7be4af5ca0a0c50fb51be35a2758
2014-06-25 23:02:52 +00:00
Raph Levien
3d28a3fceb Implement grapheme cluster breaking
This patch includes an implementation of grapheme cluster breaking,
which is especially useful for repositioning the cursor for left and
right arrow key presses. The implementation is closely based on Unicode
TR29, and uses the ICU grapheme cluster break property, but is tailored
to more closely match the existing implementation and expected behavior.

Part of a fix for b/15653110 Improve behavior of arrow keys in EditText

Change-Id: I8eb742f77039c9ab7b2838285018cf8a8fc88343
2014-06-19 09:49:50 -07:00
Raph Levien
bb601b67dd Make font runs less sticky
Fixes b/15734816 In the text "Wi-Fi", "-Fi" appears bolder than "Wi"

The problem was caused by "stickiness" in choosing fonts, where layout
would prefer using a font used for preceding characters as long as it
mapped the following characters in a run, in favor of the "best match"
rules. This patch adds a whitelist for making the stickiness more
conservative, only applying it for characters necessary for correct
shaping (ZWJ and ZWNJ in particular) and basic punctuation, where it is
desirable to match the style of the preceding text.

Change-Id: I1cf116879f074a5a71c351846707bfdd07b0d320
2014-06-19 09:03:01 -07:00
Raph Levien
3276dee361 am e68467e9: Tighten requirements for fake bold
* commit 'e68467e971390f0c79992cd938a870093a3d6412':
  Tighten requirements for fake bold
2014-06-12 22:31:15 +00:00
Raph Levien
cca62d1a8b am 15651697: (-s ours) Support for fake bold and italics
* commit '1565169734dbed6d59cc10f2a7de01f8601533e0':
  Support for fake bold and italics
2014-06-12 18:07:59 +00:00
Raph Levien
fc118a91b4 am b1eae5ea: (-s ours) Add baseFont method to FontCollection
* commit 'b1eae5ea1f0f1303d155ee550f9aa94acd0127c5':
  Add baseFont method to FontCollection
2014-06-12 18:02:23 +00:00
Raph Levien
e68467e971 Tighten requirements for fake bold
The simple predicate for fake bold (2 or more grades darker than
requested) was applying it to thin (100 weight) when normal was
requested. This patch tightens the predicate to also require that
the requested weight be in the bold range.

Fix for bug 15588352 "sans-serif-thin doesn't work on lockscreen"

Change-Id: Id9988bd149a9c8a7c943e3b221f7fb4b37fb6ddb
(cherry picked from commit 9f9f3b1ef40f7358dca6acd9dfef686cedefb6aa)
2014-06-12 16:29:24 +00:00
Raph Levien
92207c3e83 Merge "Fix missing text on nonexistent font file" 2014-06-11 21:23:31 +00:00
Raph Levien
9f9f3b1ef4 Tighten requirements for fake bold
The simple predicate for fake bold (2 or more grades darker than
requested) was applying it to thin (100 weight) when normal was
requested. This patch tightens the predicate to also require that
the requested weight be in the bold range.

Fix for bug 15588352 "sans-serif-thin doesn't work on lockscreen"

Change-Id: Id9988bd149a9c8a7c943e3b221f7fb4b37fb6ddb
2014-06-12 09:23:21 -07:00
Raph Levien
bd36ec766a Fix missing text on nonexistent font file
Fix for bug 15570313 "Missing text on nonexistent font file"

This patch makes sure that the lastChar and mInstances arrays are in
sync with each other even when a FontFamily being added has no valid
fonts in it. Previously, when they got out of sync, unicode coverage
calculation would be wrong, resulting in missing text.

Change-Id: I69c727ef69e2c61e2b2d6b81d5a28c806327f865
2014-06-11 16:03:49 -07:00
Raph Levien
1565169734 Support for fake bold and italics
This patch adds support for computing when fake bold and fake italics
are needed (because the styles are requested but not provided by the
matching FontFamily), and providing them as part of the layout result.

Part of the fix for bug 15436379 Fake bold doesn't fully work (Minikin)

Change-Id: I180c034b559837943673b5c272c8e890178dff0d
2014-06-11 12:42:44 -07:00
Raph Levien
b1eae5ea1f Add baseFont method to FontCollection
This patch adds a method to retrieve the base font from a
FontCollection, which is useful when querying global font metrics.

Part of the fix for bug 15467288 "Inconsistent line heights on
Minikin builds"

Change-Id: I268ae5128d0852a020d746bc22af81fc1a623228
2014-06-11 12:42:32 -07:00
Raph Levien
1c7b403ad8 Merge "Provisionally enable "palt" OpenType feature" 2014-06-10 19:09:51 +00:00
Raph Levien
9a5f713add Support for fake bold and italics
This patch adds support for computing when fake bold and fake italics
are needed (because the styles are requested but not provided by the
matching FontFamily), and providing them as part of the layout result.

Part of the fix for bug 15436379 Fake bold doesn't fully work (Minikin)

Change-Id: I180c034b559837943673b5c272c8e890178dff0d
2014-06-10 11:59:29 -07:00
Raph Levien
4043f6f6d9 Provisionally enable "palt" OpenType feature
We want to test configurations where the Noto Japanese font will have
its "palt" feature (to select tighter spacing in kana) will be enabled
for framework but not WebView or Chrome rendering of Japanese text. This
patch simply hardcodes this feature on.

This is also a first step towards more general setting of OpenType
features. The hardcoded feature list will grow into one set by
parameters which will eventually be plumbed up to Java.

Change-Id: Ie284e0487a1434155c8ac1cb68ddc4fc4b3c018a
2014-06-07 08:23:25 -07:00
Raph Levien
89566f0ada Add baseFont method to FontCollection
This patch adds a method to retrieve the base font from a
FontCollection, which is useful when querying global font metrics.

Part of the fix for bug 15467288 "Inconsistent line heights on
Minikin builds"

Change-Id: I268ae5128d0852a020d746bc22af81fc1a623228
2014-06-06 17:03:33 +00:00
Qiwen Zhao
621d437b92 reset sha1 3f1ea5d with history 2014-06-05 21:44:58 -07:00
Raph Levien
80556a83ad am 89339973: Fix unmatching type
* commit '893399732b64203133c22ad3c1f3535e46bf35a7':
  Fix unmatching type
2014-06-05 20:04:26 +00:00
Raph Levien
d963b2d5e6 am 448b0fd7: Support for scaleX and skewX
* commit '448b0fd720d7ba902b9be224a287d08abe3ebea8':
  Support for scaleX and skewX
2014-06-05 20:04:26 +00:00
Raph Levien
3f1ea5da2e Support for context in API
This patch completes support for adding context for complex script
layout, for example when a string with joins straddles two spans.

Part of the fix for 15431028: "Properly support context for joining
scripts (Minikin)"

Change-Id: I65b0833be92eb477aa531bbef0ac6eddeb3a962a
2014-06-05 12:23:21 -07:00
Raph Levien
3164d1a77e Make paint flags consistently uint32_t
Change internal plumbing of paint flags (including CssParse) to uint32_t
consistently, to match the type used in the client. This will probably
prevent compiler warnings. Also renames "float" to "double" to avoid
confusion about precision.

Change-Id: I80374712c4067ca9e7711cc2d4ec33c440ab9c7c
2014-06-05 09:26:43 -07:00
Raph Levien
893399732b Fix unmatching type
Missed a slightly mismatched type (int vs int32_t) from a previous code
review.

Change-Id: Ib56775a3a1a6ec3763da7f7432186954251cc048
2014-06-04 11:16:15 -07:00