83691 Commits

Author SHA1 Message Date
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
6100fa5441 am 1391c37e: Fix ZWJ not working for Indic fonts
* commit '1391c37ea908bff79222109f4351d361c2910372':
  Fix ZWJ not working for Indic fonts
2014-05-29 22:38:30 +00:00
Raph Levien
bef68b94ed am 7d4090fb: Language and variant selection
* commit '7d4090fbe937014d79bb996c03e763d2557d238d':
  Language and variant selection
2014-05-29 22:38:29 +00:00
Raph Levien
1391c37ea9 Fix ZWJ not working for Indic fonts
This is a fix for bug 15185229 ZWJ not working in Sinhala and Kannada.

Indic fonts (unlike Arabic) require the entire string, including ZWJ,
to be passed to Harfbuzz; it's not enough for the ZWJ to be present in
the context. The solution is to be "sticky" in font itemization,
continuing to use the same font as long as it has Unicode coverage.

Change-Id: I7673bc56fbda09f1e1a4582e8d88342343b706f1
2014-05-29 15:16:32 -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
ac1f6e260c am e1a0422a: Fix for Minikin native crash
* commit 'e1a0422aae785f6ed213ba0bb0139edc30502d7a':
  Fix for Minikin native crash
2014-05-29 21:27:39 +00: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
1c75d0afe7 am 9c5d659d: Fix for bug 15252902 native crash in Minikin
* commit '9c5d659d5fdfb149f786335f39b20e55c71d949b':
  Fix for bug 15252902 native crash in Minikin
2014-05-27 15:51:43 +00:00
Raph Levien
4d33c6c9ca am ddfa014d: Caching for layouts and harfbuzz faces
* commit 'ddfa014d55c11da8e73580b639917f2e2a441add':
  Caching for layouts and harfbuzz faces
2014-05-27 15:51:42 +00:00
Raph Levien
f043d36367 am 2d546464: (-s ours) Merge "Do BiDi algorithm for text layout" into lmp-preview-dev
* commit '2d546464055f7a6964ca87ca7c7b4f175ea4101b':
  Do BiDi algorithm for text layout
2014-05-27 15:51:42 +00: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
Raph Levien
2d54646405 Merge "Do BiDi algorithm for text layout" into lmp-preview-dev 2014-05-27 15:36:36 +00:00
Raph Levien
5261296f2a Do BiDi algorithm for text layout
This is a fix for bug 15130102 "Language name for Hebrew displayed the
wrong way around on keyboard".

This patch extends the previous BiDi support (when the direction for the
entire string was given by the caller) to run the BiDi algorithm
(provided by ICU) over the string to break it into BiDi runs. Thus, it
handles mixed LTR and RTL strings in a single layout, and also respects
heuristics for inferring the paragraph direction from the string.

Change-Id: Ia4b869de3c139c5a7d16b8ce7766870b98a815ea
(cherry picked from commit 4b3a941128454e55893d65433a835e78a9e9781d)
2014-05-27 14:44:32 +00:00
Raph Levien
b69befa658 am b1f16e88: Fix native crash in Latin-1 typefaces
* commit 'b1f16e880b39439054918774f8e53da2d4d0a133':
  Fix native crash in Latin-1 typefaces
2014-05-24 14:52:56 +00:00
The Android Automerger
2447f21d86 am 4cfcd710: merge in master-release history after reset to 4841666ebe6aba70a957ee47ed26dbc3e63d189c
* commit '4cfcd71064d22a8844267e785c842149e755287c':
  Fix incomplete refcounting and locking
2014-05-24 14:52:56 +00:00
Raph Levien
b1f16e880b Fix native crash in Latin-1 typefaces
This is a fix for bug 15171911 Timely crashes (native crash in
libminikin) when I go to add a new alarm

This patch fixes an off-by-one error that caused typefaces with only one
page of Unicode coverage (ASCII or Latin-1) to have nPages = 0 instead
of the correct value of 1 in the corresponding FontCollection.

Change-Id: Id8be0c9e5713b8af22d863992921ee6382416a34
2014-05-23 22:44:35 -07:00
Raph Levien
6bbcf44f68 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.

Change-Id: Ie8176857e2d78656ce5479a7c04969819ef2718d
2014-05-22 16:30:33 -07:00
The Android Automerger
4cfcd71064 merge in master-release history after reset to 4841666ebe6aba70a957ee47ed26dbc3e63d189c 2014-05-22 07:22:04 -07:00
The Android Automerger
e3cdd19310 merge in master-release history after reset to 4841666ebe6aba70a957ee47ed26dbc3e63d189c 2014-05-22 05:50:25 -07:00
The Android Automerger
a28d0645ce merge in master-release history after reset to 4841666ebe6aba70a957ee47ed26dbc3e63d189c 2014-05-21 05:50:20 -07:00
The Android Automerger
904698cdda merge in master-release history after reset to 4841666ebe6aba70a957ee47ed26dbc3e63d189c 2014-05-20 05:50:09 -07:00
Raph Levien
8893e8692b Fix incomplete refcounting and locking
These changes were supposed to be committed in the previous patch
"Better refcounting and locking" but seem to have gotten lost in a
rebase. It fixes a memory leak and some possible race conditions.

Change-Id: I54ca1e37500ec49756fe317cc6d6d03da9911501
2014-05-19 16:24:51 -07:00
Raph Levien
e9ee256331 Do BiDi algorithm for text layout
This patch extends the previous BiDi support (when the direction for the
entire string was given by the caller) to run the BiDi algorithm
(provided by ICU) over the string to break it into BiDi runs. Thus, it
handles mixed LTR and RTL strings in a single layout, and also respects
heuristics for inferring the paragraph direction from the string.

Change-Id: Ia4b869de3c139c5a7d16b8ce7766870b98a815ea
2014-05-19 14:53:57 -07:00
Raph Levien
4841666ebe Fix incomplete refcounting and locking
These changes were supposed to be committed in the previous patch
"Better refcounting and locking" but seem to have gotten lost in a
rebase. It fixes a memory leak and some possible race conditions.

Change-Id: I54ca1e37500ec49756fe317cc6d6d03da9911501
2014-05-19 14:01:37 -07:00
Leon Scroggins III
521c14790b Remove references to SkFloatToScalar.
The macro has been deprecated, now that SkScalar is never fixed point.

Fixes minikin build.

Change-Id: I02838a7fa167c5cf58ad225f3f2f52659495492c
2014-05-15 10:52:56 -04:00
Raph Levien
686d245a0f Initial BiDi support
This patch contains a very basic implementation of BiDi. It respects the
BiDi flags passed in as an explicit parameter (through the
"-minikin-bidi" pseudo-CSS property), but doesn't yet do its own BiDi
run detection. It also takes some shortcuts (marked as TODO) that are
based on reasonable assumptions of the current font stack, but not
universally valid.

Even with these shortcomings, it seems to display RTL text from TextView
correctly.

Change-Id: I223433923c4eb06f90c0327e86bfbe0aff71d4f5
2014-05-14 15:56:05 -07:00
Raph Levien
df405e1da1 Fix 64-bit cleanliness problem
This patch fixes a problem where int and ssize_t were being conflated.

Change-Id: I642a4ee1d59d81723034fdfe33bd8ca29a5dc322
2014-05-14 12:33:09 -07:00
Raph Levien
7b250767bc Fix build breakage in sample code
This updates the Skia sample implementation to implement GetBounds,
but the FreeType implementation is NYI (to be fixed in future commit).

Change-Id: I24eda14d5fb11c2a1e81394ad8c779de3292dd79
2014-05-14 11:01:32 -07:00
Raph Levien
02b919bc17 Better refcounting and locking
All major externally accessible objects (especially FontFamily and
FontCollection) are now reference counted. In addition, there is a
global lock intended to make operations thread-safe.

WIP notice: in this version of the patch, not all external API entry
points are protected by the lock. That should be fixed.

Change-Id: I14106196e99eb101e8bf1bcb4b81359759d2086c
2014-05-12 10:28:15 -07:00
Raph Levien
eee04fd1e5 A basket of features: itemization, bounds, refcount
This patch improves script run itemization and also exposes metrics
and bounds for layouts. In addition, there is a fair amount of internal
cleanup, including ref counting, and making the MinikinFont abstraction
strong enough to support both FreeType and Skia implementations. There
is also a sample implementation using Skia, in the sample directory.

As part of its functionality, his patch measures the bounds of the
layout and gives access through Layout::GetBounds().  The corresponding
method is not implemented in the FreeType-only implementation of
MinikinFont, so that will probably have to be fixed.

Change-Id: Ib1a3fe9d7c90519ac651fb4aa957848e4bb758ec
2014-05-12 09:08:15 -07:00
Kenny Root
014dae7e78 Use canonical UniquePtr.h file
Change-Id: I00953971034a7d00ca165accdab528d2b8ff27a7
2013-09-11 23:24:24 -07:00
Kenny Root
0ab6d024ff Use canonical UniquePtr.h header
Change-Id: Id50e9d6fe2f08d3121b168b45791a8e8fb045d7f
2013-09-11 15:02:30 -07:00
Victoria Lease
79497ccc90 Use shared ft2 lib, deal with libpng/zlib deps
Bug: 9603326
Change-Id: I7df1f68fa3a44b37b1b279387f4ddfe942928bb0
2013-06-27 15:43:55 -07:00
Raph Levien
c905bdf4be Fix build breakage
The MinikinFont class was missing a destructor. The build error was
not caught because incremental builds didn't see fit to relink after
I deleted one of the source files (that contained the impl of this
destructor).

Change-Id: Ic72d56fe28316cd2b2f808910e34ca6f177a1220
2013-06-14 14:12:07 -07:00
Raph Levien
8d9541c5fb Introduce MinikinFont abstraction
This commit removes the direct dependency on FreeType and replaces it
with a MinikinFont abstraction, which is designed to support both
FreeType and Skia fonts (and possibly others in the future).

Also adds a "total advance" to the Layout, with an API for retrieving
it.

Change-Id: If20f92db9a43fd15b0fe9794b761ba00fb21338c
2013-06-14 11:22:35 -07:00
Raph Levien
c1a6032ce6 Initial commit of Minikin library
This is the initial draft of Minikin, a library intended to perform text
layout functions. This version does basic weight selection and font runs
for scripts, and also has a simple renderer for drawing into bitmaps,
but is lacking measurement, line breaking, and a number of other
important features. It also lacks caching and other performance
refinements.

Change-Id: I789a2e47d11d71202dc84b4751b51a5e2cd9c451
2013-04-25 12:23:57 -07:00
Chad Jones
cd404cb5e1 Initial empty repository 2013-04-19 10:28:48 -07:00