58 Commits

Author SHA1 Message Date
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
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
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
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
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
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
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
Raph Levien
e65751d728 Add LineBreaker to Minikin
This patch adds a LineBreaker class to Minikin, which will be used for
computing line breaks in StaticLayout. The version in this patch
contains basically the same functionality that existed before, but
hopefully better performance and an interface that's suitable for more
sophisticated paragraph layout.

Note that this version contains a high quality strategy, which mostly
works but doesn't respect varying line width.

Change-Id: I02485d58b1e52856296a72cdd4efd963bc572933
2015-03-26 16:00:04 -07:00
Raph Levien
aa1337a41a HyphenEdit in support of hyphenation
Adds a "HyphenEdit" field to the Minikin Paint object, which represents
an edit to the text to add a hyphen (and, in the future, other edits to
support nonstandard hyphenation).

Change-Id: Ib4ee690b0fe2137e1d1e2c9251e5526b274ec3a7
2015-03-12 14:37:55 -07:00
Roozbeh Pournader
4c4af7f4dc Disable HarfBuzz's fallback to compatibility decompositions
Previously, HarfBuzz's default fallback to compatibility
decompositions resulted in Mathematical Alphanumeric Symbols getting
rendered as normal letters and digits when there was no font
available to render them. This patch disables that fallback, to
ensure they are displayed as tofus.

Based on a patch by Behdad Esfahbod.

Bug: 19202569
Change-Id: I357f172302448d4ab0b24efc86119f1977b5996b
2015-02-25 13:30:08 -08:00
Andreas Gampe
e91f4fd54e am 1503e1ff: am faf26d17: Minikin: Remove unused variables, fix init order
* commit '1503e1ff93656759019987cc51dd7cdab7b16c01':
  Minikin: Remove unused variables, fix init order
2014-12-04 20:44:11 +00:00
Andreas Gampe
faf26d176f Minikin: Remove unused variables, fix init order
For build-system CFLAGS clean-up, fix unused variables.

Reorder initializer list to initialize in the order of member
declarations.

Change-Id: I64358b2dcf0e39d0f4e18fdc3473de867f84fcba
2014-12-03 14:20:11 -08:00
Dan Albert
46e3118bfd am 8bbd29fc: am a4e238f7: Move frameworks/minikin over to libc++.
* commit '8bbd29fce5fb17fb86d9fd2f79028c949c66d20a':
  Move frameworks/minikin over to libc++.
2014-11-12 21:31:35 +00:00
Dan Albert
a4e238f757 Move frameworks/minikin over to libc++.
Bug: 15193147
Change-Id: I5e15c95415c39515340e2663acd5fd26666db720
2014-11-11 19:32:48 -08:00
Raph Levien
5a3a896405 am ff55a581: Snap advance widths to integers
* commit 'ff55a581fa07b52f3cffcf3fc825d297cf955ffe':
  Snap advance widths to integers
2014-09-04 00:16:27 +00:00
Raph Levien
ff55a581fa 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
Behdad Esfahbod
ddd99662c1 am 11c8920a: Allocate font vector on stack
* commit '11c8920a3fc1c5895e777f71c822501367eef69c':
  Allocate font vector on stack
2014-08-22 18:36:40 +00:00
Behdad Esfahbod
11c8920a3f 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
55f6f0cd86 am df03550a: Fix Layout initialization in the skipCache path
* commit 'df03550a40706a55ca1bfcb67da62765194cf98f':
  Fix Layout initialization in the skipCache path
2014-08-21 22:09:56 +00:00
Behdad Esfahbod
df03550a40 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
2f65c78209 am a33151e9: Speed up cache lookup
* commit 'a33151e9c78c5547eeadbaaa9168dad361df05e4':
  Speed up cache lookup
2014-08-21 20:39:33 +00:00
Behdad Esfahbod
a33151e9c7 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
f7a71d4b4e am a944efa7: Support fontFeatureSettings
* commit 'a944efa7a0e61169f56c0002b95e9d6951b1e86e':
  Support fontFeatureSettings
2014-07-30 21:42:58 +00:00
Behdad Esfahbod
a944efa7a0 Support fontFeatureSettings
Bug: 15246510
Change-Id: I544915d29b2be4fb9f82f1989188a3a918c50fbc
2014-07-30 17:29:00 -04:00
Behdad Esfahbod
6abdc7368f am 2d51f518: Merge "Remove CSS string doLayout entrypoint and supporting code" into lmp-dev
* commit '2d51f518d22eb897603c80f4df5149c711f705b2':
  Remove CSS string doLayout entrypoint and supporting code
2014-07-29 21:01:36 +00:00
Behdad Esfahbod
bff381b1be 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
b501846d80 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
94300c2146 Merge "Don't get stuck on invalid UTF-16" into lmp-dev 2014-07-24 15:37:54 +00:00
Behdad Esfahbod
abf2e7d050 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
675a078bdf 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
ded72d1e4a Remove deprecated API
It has been unused outside minikin.

Change-Id: Iaa2237767d81c77f90d0264e633375e601dd72f1
2014-07-24 19:18:14 -04:00
Behdad Esfahbod
801eb4ebad Merge "Revert "Don't pass invalid Unicode codepoint to Skia"" 2014-07-24 15:36:21 +00:00
Behdad Esfahbod
ca5b3e1676 Revert "Don't pass invalid Unicode codepoint to Skia"
After update to HarfBuzz 0.9.33 we don't need this anymore.  HarfBuzz takes care of invalid input and passes U+FFFD to us.

This reverts commit 29eb45e667be81d37f29fcce2adccb8c5e6d5ada.

Change-Id: Icfd0dc836a8d684fb1723fc215aa01f99639ff59
2014-07-25 17:31:46 +00:00
Behdad Esfahbod
7043f8f1fc Add letter-spacing support
Bug: 15594400
Change-Id: Ied94d7674be4097b0f44c9b0770d3294dc6433c1
2014-07-22 16:37:53 -04:00
Behdad Esfahbod
29eb45e667 Don't pass invalid Unicode codepoint to Skia
Bug: 15849380
Change-Id: Ib5285e57c5806bd399600fadd56e8bc809da323f
2014-07-11 11:30:06 -04:00
Raph Levien
05d59ee462 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
69f3585cf6 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
9c9cab6487 Merge "Provisionally enable "palt" OpenType feature" 2014-06-10 19:09:51 +00:00
Raph Levien
2b7da7bc2b 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
faadb4243e 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
06dec08ca2 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
ddcdc08c7c 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
014498ae2a 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
Raph Levien
23801bf449 Support for scaleX and skewX
Adds pseudo-css properties for scaleX and skewX, as well as paint flags,
and plumb them through to the MinikinPaint abstraction and to Harfbuzz,
to support nontrivial scale and stretch of text.

This is the Minikin part of the fix for bug 15186705 "Usability of the
suggestion strip in recent OTA's is severely reduced"

Change-Id: Ifa60355e086e4691ff92c5d50d84eb7cea0fea95
2014-06-03 17:05:51 -07:00
Raph Levien
7d4090fbe9 Language and variant selection
This patch adds a "lang" pseudo-CSS property and uses it both to select
an appropriate font and control the "locl" OpenType feature to get the
most appropriate rendering for the langauge and script.  In addition,
the "-minikin-variant" property selects between "compact" and "elegant"
variants of a font, as the former is needed for vertically cramped
spaces.

This is part of the fix for bug 15179652 "Japanese font isn't shown on
LMP".

Change-Id: I7fab23c12d4c797a6d339a16e497b79a3afe9df1
2014-05-29 15:16:32 -07:00
Raph Levien
e1a0422aae Fix for Minikin native crash
The context start offset wasn't being taken into account for
accumulating the advance values, leading in some cases to array index
overflow.

This is a fix for bug 15327918 "SIGSEGV in
android::MinikinFontSkia::GetSkTypeface()"

Change-Id: I9b646785724c9b72d862b822cd84661c106fbe52
2014-05-29 14:06:53 -07:00
Raph Levien
9c5d659d5f Fix for bug 15252902 native crash in Minikin
This is a fix for bug 15252902 "Crash observed on keep launch or
existing youtube app after playing video". It was doing the test for a
null font after trying to resolve the font in a cache, which caused a
crash when there was no font for the run. This patch just tests before
cache lookup.

Change-Id: Iee41f7ce6b69cb09438462b6aaa916f242da7b77
2014-05-27 15:40:17 +00:00
Raph Levien
ddfa014d55 Caching for layouts and harfbuzz faces
This patch adds caching for both layouts and for HarfBuzz face objects.
The granularity of the cache for layouts is words, so it splits the
input string at word boundaries (using a heuristic). There are is also
some refactoring to reduce the amount of allocation and copying, and
movement towards properly supporting contexts.

The size of the caches is a fixed number of entries; thus, it is
possible to consume a large amount of memory by filling the cache with
lots of large strings. This should be refined towards a scheme that
bounds the total memory used by the cache.

This patch fixes bug 15237293 "Regression: Measure performance is
significantly slower with minikin".

Change-Id: Ie8176857e2d78656ce5479a7c04969819ef2718d
2014-05-27 15:39:33 +00:00