History log of /frameworks/base/core/java/android/text/TextLine.java
Revision Date Author Comments (<<< Hide modified files) (Show modified files >>>)
c08d43c4d79392fa0e229b7e6fc4b4892074bc75 13-Jan-2016 Raph Levien <raph@google.com> Merge "Fix measurement to respect grapheme and span boundaries" into mnc-dr1.5-dev am: 36c5ab3542 am: 50c22adc25
am: 243efe13a4

* commit '243efe13a44faf3617e2df409fa8f4bd30078a5d':
Fix measurement to respect grapheme and span boundaries
909c7bca570b6f50650d0872e2037389b29252e3 01-Dec-2015 Raph Levien <raph@google.com> Fix measurement to respect grapheme and span boundaries

When measuring in TextLine (important for cursor positioning), the
substring measured must neither be too short (it can't just be the
substring up to the measure limit, but must include additional
characters if they form a ligature) nor too long (it can't extend
beyond the end of the CharacterStyle span, otherwise the measurement
fails to account for the fact that the CharacterStyle span boundary
breaks the ligature). This patch gets it just right.

Bug: 25375561
Change-Id: I36e1c4bdc66424d3b611cf54031756cf54cf3fec
/frameworks/base/core/java/android/text/TextLine.java
112d9c7f116bec0a52badde81bd778e59e88cb63 07-Aug-2015 Roozbeh Pournader <roozbeh@google.com> Remove EmojiFactory and its mentions from frameworks.

Bug: 18134313
Bug: 20158206
Change-Id: If46cdbd9d558e6592280b2b95f00b87d04de70a2
/frameworks/base/core/java/android/text/TextLine.java
ea2b4a40f7236172398ebcaa273612e00340d847 21-Jul-2015 Raph Levien <raph@google.com> Respect style boundaries when measuring text

The existing implementation of handleText() in TextLine laid out
text to the end of the context. However, in cases where the text is
broken into multiple style spans, it's only valid to lay out up to
the end of the style span. This can lead to inconsistent
measurements, especially in the presence of legitimate zero-width
characters such as bidi control characters and zero width space.

This patch changes the invocation of getRunAdvance to measure only
within the style span.

Bug: 22589743
Change-Id: I027f5e77db27ddf9596ef20adcad7e62a82b41de
/frameworks/base/core/java/android/text/TextLine.java
edb27f14ec03d9f4e1dd3959e81f58d4f1389971 01-Jun-2015 Raph Levien <raph@google.com> Revert "Revert "Use getRunAdvance to position cursor""

This reverts commit 5730c974800a0ffed59a041d9e249a5c42e417db.
/frameworks/base/core/java/android/text/TextLine.java
5730c974800a0ffed59a041d9e249a5c42e417db 01-Jun-2015 Raph Levien <raph@google.com> Revert "Use getRunAdvance to position cursor"

This reverts commit cb5499c85097450c48f66f6c08a35bab2ad5ab12.

Bug: 21549197
/frameworks/base/core/java/android/text/TextLine.java
cb5499c85097450c48f66f6c08a35bab2ad5ab12 29-May-2015 Raph Levien <raph@google.com> Use getRunAdvance to position cursor

TextLine used to use getTextRunAdvances on a substring to compute a
cursor position, but this had a number of problems, especially when
the substring is a wider than the full string (as can happen in
certain Tamil ligatures).

This patch changes the implementation to use getRunAdvance, which was
explicitly designed for this use case.

We should also change Layout.getHorizontal to use the dual
getOffsetForAdvance, but that's basically a performance optimization,
the functionality should be basically equivalent.

Bug: 21125816
Change-Id: I669b85eaecfbf6f7aa6c6a9dddbf1a210eb94571
/frameworks/base/core/java/android/text/TextLine.java
26d443aee4ee5a8791417b4ca09e8c78ba8dc78b 30-Mar-2015 Raph Levien <raph@google.com> Revert "Fix build: Revert "Record hyphens from Minikin and draw them""

This reverts commit 5a6eeb3cbe0896ddf4bdccc0b1a81d7aac49821e and
fixes the underlying issue (needed to @hide getHyphen() for subclasses
of Layout, not just the base class), and layoutlib changes for
checkbuild.

Change-Id: I7a2b5f20ae014ea8e224d8c4079cf9131e17e1c1
/frameworks/base/core/java/android/text/TextLine.java
5a6eeb3cbe0896ddf4bdccc0b1a81d7aac49821e 30-Mar-2015 Ed Heyl <edheyl@google.com> Fix build: Revert "Record hyphens from Minikin and draw them"

This reverts commit 27fb878c04e18d3bdd6c42ed347194a7c816ed97.

Change-Id: I2b3390cb0b258a2e1a38ad72ae9686177d6ffdb8
/frameworks/base/core/java/android/text/TextLine.java
71cbc72e70a6f0e086535c51e35262eb3a4d4bd9 20-Mar-2015 Raph Levien <raph@google.com> Record hyphens from Minikin and draw them

This patch plumbs up hyphens computed in Minikin's LineBreaker,
records them in a new column in StaticLayout, and draws them.
DynamicLayout mirrors the new column, and TextLine is also changed to
make sure the hyphen is only drawn for the last run in a line.

There is a rather primitive mechanism for loading hyphenation
patterns, for testing only at this point.

Change-Id: Ib208568c0f6cff12cf834047500ec1da9ea9f430
/frameworks/base/core/java/android/text/TextLine.java
893d6fe48d37f71e683f722457bea646994a10bf 16-Jan-2015 Svet Ganov <svetoslavganov@google.com> Fixing a memory leak: activities are leaked.

TextLine was not fully cleared before recycling it which leads to
activity leaks if the activity happens: to register a text watcher.

bug:19045507

Change-Id: Ife0f7ce29865bd30ca2dfe8795023f51f275d659
/frameworks/base/core/java/android/text/TextLine.java
051910b9f998030dacb8a0722588cc715813fde1 16-Jun-2014 Raph Levien <raph@google.com> Clean up dirFlags / bidiFlags confusion

The dirFlags and bidiFlags enums are distinct, and have different
meanings. The former is a determined direction for a run of text, while
the latter is a request for the bidi algorithm. They have been used
interchangeably, and this has caused some problems, notably running the
bidi algorithm needlessly when the direction for a run is already
determined.

This patch cleans up the confusion, by always naming each occurrence
explicitly "boolean isRtl" or "int bidiFlags" (the previous code often
just used "int flags", which added to the confusion), and converts
between the meanings when a function takes an isRtl argument but passes
it to another function expecting bidiFlags.

Fixes b/15089607 Clean up bidi flag mess

Change-Id: I410b6604376e853dd12c255e7f5a9d2b9a310dd9
/frameworks/base/core/java/android/text/TextLine.java
776abc24cdd18610232a50b997cce3cffa74609b 07-Mar-2014 Adam Lesinski <adamlesinski@google.com> Uses VMRuntime.newUnpaddedArray for ideal array sizes

Bug:13028925

Change-Id: I0a9301248b10a339afbdc5e4ffe3310ac4fa1fb7
/frameworks/base/core/java/android/text/TextLine.java
da12f389eb4be0c08ca3fa9ca7663f4977858df5 15-Mar-2013 Fabrice Di Meglio <fdimeglio@google.com> Revert "Clean Paint.mBidiFlags as it is no longer used"

This reverts commit 6d9fe5bd22b531bfce69b146254a4791c76acddc.
/frameworks/base/core/java/android/text/TextLine.java
6d9fe5bd22b531bfce69b146254a4791c76acddc 12-Feb-2013 Fabrice Di Meglio <fdimeglio@google.com> Clean Paint.mBidiFlags as it is no longer used

See bug #7623824

Change-Id: Ie2f9422821f6dcc73c99e8695f448e966b587b1d
/frameworks/base/core/java/android/text/TextLine.java
42ef515d185d4fc038d602172789cc264f1d9960 23-Oct-2012 Raph Levien <raph@google.com> Fix for bug: Gmail (and other places): cursor placed on top of letter

This patch fixes bug 7346656. In this particular case, the text line in
the EditText was split into multiple spans, with the boundary between
the "r" and "," in "r,". These were being drawn as two separate runs,
but measured as a single run, leading to inconsistent measurements
because this is a kern pair in Roboto.

The fix is to eliminate the special-case code for measuring. This will
actually improve efficiency, as the value computed in one pass is now
more likely to be reused in another.

Change-Id: I04142a0ec98f280fc1027c7cbdbf903e3096f8e4
/frameworks/base/core/java/android/text/TextLine.java
4ffb879f4866f7d51070bfc9d10e7a2fdac62d4c 13-Mar-2012 Gilles Debunne <debunne@google.com> New SpanSet class extracted from TextLine.

Change-Id: I424dbd7ff0693fd465b6c83ebabba221b2eca6fe
/frameworks/base/core/java/android/text/TextLine.java
fc997b4f7867005bd0f1461822b494c79c1231ea 13-Dec-2011 Gilles Debunne <debunne@google.com> NPE in GMail / TextLine

Bug 5753061

https://android-git.corp.google.com/g/#/c/154756/1 revealed an
other bug in SpanSet. The fitered (non empty) spans were added
in their original position instead of being indexed by count.

The nullation on recycle hence left null holes in the array.

Change-Id: If5c1435cee9a2cb88a608aa8e5f4f2f23382154c
/frameworks/base/core/java/android/text/TextLine.java
c3fb7a11ad72c5e51ff93e1ad6958f843af0d5b1 12-Dec-2011 Gilles Debunne <debunne@google.com> Prevent a memory leak in TextLine.

Bug 5740435

The new SpanSet cached objects should be recycled when the TextLine is
recycled to prevent a reference to their span, which may lead to the
entire activity.

Change-Id: I4469e418a228bd71eb8be1d43ed86de49baba165
/frameworks/base/core/java/android/text/TextLine.java
c1f44830809f0a8526855f13822702ea756214fa 09-Dec-2011 Gilles Debunne <debunne@google.com> Re-use SpanSets in TextLine

TextLine objects are already stored in a pool to limit allocation.

Associate SpanSet objects to each TextLine to further limit the
allocation of these and re-use their internal arrays (re-sized if needed).

Drastically reduces new objects allocation during rendering.

Priority code removed in init: priorities are already handled by getSpans.

This is a duplicate of the already accepted
https://android-git.corp.google.com/g/#/c/153970/
but without the dependency on an other CL.

Change-Id: Iaa7e2f7a8ea4337c8d60c3a9a620e9e3e60caf12
/frameworks/base/core/java/android/text/TextLine.java
8a439ac7a34d6b83782a672f3d6aa90fa262409c 27-Oct-2011 Gilles Debunne <debunne@google.com> Performance improvement in TextView

Using a SpanSet to minimize the number the calls to getSpans.

This is a cherry pick of 145653 in ICS-MR1

Change-Id: I0a6e1fc7bd7a89325c2925bf98d59626d5e12995
/frameworks/base/core/java/android/text/TextLine.java
52edaa9cfb612bd20b0f718dc95e576f55d9367e 26-Sep-2011 Gilles Debunne <debunne@google.com> Merge "Bug 5250788: TextView gets slower as the text length grows"
8a5137a5aeba39cbc2c57c83ef79241b446d0cb7 23-Sep-2011 Fabrice Di Meglio <fdimeglio@google.com> Fix bug #5349461 TextView: text that ends with an ImageSpan causes line height to shrink to ImageSpan height

- save current metrics values before updating them

Change-Id: I2d88dd7d30e8e01d0c5e2328973f256b689672b2
/frameworks/base/core/java/android/text/TextLine.java
945ee9b1661e60e0074d4f16f61fc147c728c6bf 20-Sep-2011 Gilles Debunne <debunne@google.com> Bug 5250788: TextView gets slower as the text length grows

getSpans was called too many times in handleRun. Pre-compute the
subset of intersected spans and iterate over a subset of it instead.

Moving the instanceof test in getSpans after the other tests also
speeds things up a lot.

On a text with ~300 words, all with a span attached, getSpans went down
from 78% to 14% of the CPU usage.

Change-Id: I59bc44f610e9a548e0dcec68b180934da9e5c559
/frameworks/base/core/java/android/text/TextLine.java
c9fd978da60f76c0576150c55629a034e1fa19fb 09-Sep-2011 Gilles Debunne <debunne@google.com> Bug 5281947: add to dictionnary option promoted in suggestions.

When several SuggestionSpans are available at a given position, their
content are merged, in creation time order.

As a result, the IME's suggestions are picked before the spell check, and
no add to dictionnary option is created.

This CL modifies the comparator to make easy correction spans appear first
(Voice IME), then misspelled words and then regular suggestions.

Also avoids the creation of a new comparator and length hash map on every display.

Change-Id: I1f9f031a6fdcbbc09f248a192b83051092765f8e
/frameworks/base/core/java/android/text/TextLine.java
e6d368218918f911b1954296dab25bf84147b4c6 30-Aug-2011 Luca Zanolin <zano@google.com> Add EditTextShortcutSpan to provide edit short cut in the text view.

At the moment, EditTextShortcutSpan allows only the deletion of the text. In the future, we may decide to add extra functionality,
like "retry" where all the text is removed and a specific IME is triggered.

Fix the underline. The underline is not defined in thickness, and not as a multiplier of the default underline thickness.

Change the behaviour of SuggestionRangeSpan to match the specification.

Change-Id: I80437d9887c7a2ff8f62c38afbb0cb7add7ee9c8
/frameworks/base/core/java/android/text/TextLine.java
8059e0903e36cbb5cf8b5c5d5d653acc9bbc8402 11-Aug-2011 Fabrice Di Meglio <fdimeglio@google.com> Fix bug #3388534 Long file names are improperly displayed when played

- force ellipsising when there are more lines found than maxLines
- do not care about lines when we have reached maxLines
- also fix relayouting when changing maxLines thru setMaxLines()
- do not allow START / MIDDLE ellipsis when there are multiple lines
(and print a log accordingly)

Change-Id: I90f5a7f5200a220aceee01fb7300bec2c4c3a075
/frameworks/base/core/java/android/text/TextLine.java
dd8f5ed79c7baed35b3f04e4778aff7867653255 11-Aug-2011 Gilles Debunne <debunne@google.com> Added support for colored / thick underlined text.

Change-Id: Ib0e259dd20546855899bf091f694e41e7051fecb
/frameworks/base/core/java/android/text/TextLine.java
61ccc6a203e1b0fb235a4eed2b40e0c080f57f0c 09-Aug-2011 Fabrice Di Meglio <fdimeglio@google.com> Merge changes I46744e51,I1f566cce

* changes:
Solidify and optimize Paint text related APIs
Add more optimizations for Text measuring / breaking / getting advances
15c097a1c23105cdc0dd66dd5605ff35467d7118 08-Aug-2011 Fabrice Di Meglio <fdimeglio@google.com> Add more optimizations for Text measuring / breaking / getting advances

- do not go to native if this is not needed (empty or null text)
- do expandMetricsFromPaint() in TextLine when needed instead of calling handleText()
with emty string just for doing expandMetricsFromPaint()

Change-Id: I1f566ccef66cbc990ebbb77ef149899119e37e84
/frameworks/base/core/java/android/text/TextLine.java
850dffa01ba9111799f24800ae8550eca457d757 08-Aug-2011 Fabrice Di Meglio <fdimeglio@google.com> Follow up to TextView's baseline is correctly computed for empty text

Was bug http://code.google.com/p/android/issues/detail?id=15598

- optimize https://android-git.corp.google.com/g/#/c/107901/1

Change-Id: I20abd82a97adc71f04a5afba54eb679f708236f8
/frameworks/base/core/java/android/text/TextLine.java
bc7cdb6783d059249133b1c0baf52c305c6b4a33 27-May-2011 Romain Guy <romainguy@google.com> Remove extraneous log.

Change-Id: I91b248410d69836c7a3b56eb0867224ccb4a5336
/frameworks/base/core/java/android/text/TextLine.java
f483e514d4ed3b93cc5ba22beb9c85efcda75535 29-Apr-2011 Gilles Debunne <debunne@google.com> TextView's baseline is correctly computed for empty text.

Bug http://code.google.com/p/android/issues/detail?id=15598

Change-Id: I3aae29b55dc92acca3883b8d14e01dc1c79c2243
/frameworks/base/core/java/android/text/TextLine.java
1e3ac18e7ad03e02819f3e1a89d6a80a2bb7645f 08-Mar-2011 Gilles Debunne <debunne@google.com> Empty spans are not considered in text layout/rendering process.

Bug http://code.google.com/p/android/issues/detail?id=14786

Empty spans are affecting the text before and after them. See the
comment in TextUtils.removeEmptySpans for details.

Change-Id: I40376c32fd56a17efde6219f9b2593e4b4ab1ba1
/frameworks/base/core/java/android/text/TextLine.java
f902d7bc49797ec277b4576c921dfffa15d741dd 25-Jan-2011 Gilles Debunne <debunne@google.com> TextLine cache is used, even for long lines of text.

Bug 3381368

The 250 characters limit is passed for long URLs. There are only 3
TextLine objects, so their total size is not an issue. Recycle long
lines as well to make sure we fill the cache and avoid object creation.

Change-Id: I843bf623594312a0fcf0edbb13b7cd64cce0ddd1
/frameworks/base/core/java/android/text/TextLine.java
0bb000931bb841e75903d655552d1626ae158707 03-Dec-2010 Gilles Debunne <debunne@google.com> Fix in vertical measurement in text lines with different text sizes

The last span of the TextLine was defining the FontMetrics, instead of
min/maxing the different values.

Bug 3220698

Change-Id: I7394b1699a15aeee4cc38462d561faf329d3e1f6
/frameworks/base/core/java/android/text/TextLine.java
673e42fafd4088970ec95e1f13c61dc83132c74e 26-Aug-2010 Chet Haase <chet@google.com> Fix for end events from Sequencer objects

Change-Id: I8947d8b016b880f9f54f2bf6ab22b4e188cdb29a
/frameworks/base/core/java/android/text/TextLine.java
cc3ec6cdb2b892eb29513e72d8b205acbe997b25 23-Jun-2010 Gilles Debunne <debunne@google.com> New cursor controller in TextViews.

Editable TextView now display a cursor controller under the insertion
point so that it can be precisely moved.

Change-Id: Ia2e6ddc57d249647ff6683e10e4226db3df27223
/frameworks/base/core/java/android/text/TextLine.java
345cb03315a0813ec57e44f97fc3fa4af6b3c309 17-Jun-2010 Gilles Debunne <debunne@google.com> Index out of range problem in TextLine.

Recent refactoring for bidi introduced an index shift in the getOffsetBeforeAfter
method. This problem appears for multi-line text input only, when the text line
mStart index is not 0.

As a result, moving the cursor using the trackball in a multi-line EditText crashes.

Change-Id: I1f121f0f9272ef7d338399f369ba6d77e1ca71c5
/frameworks/base/core/java/android/text/TextLine.java
0c702b88c5d0d4380930b920f5be6e66dd95a0d8 14-May-2010 Doug Felt <dougfelt@google.com> Move shaping to native.

Add internal API (getTextRunAdvances) to Paint, use when measuring.
Add internal API (getTextRunCursor) to Paint, use when determining
valid cursor positions.

Remove java-level shaping code. Remove 'prep' code in TextLine
(except for replacement text) since shaping now is done on the fly as
needed in native.

Provide explicit shaping context bounds to internal text measuring,
cursor movement, and rendering APIs.

Update for to changes in external API in ushape.h.

Change-Id: I146958b624802ce8553125e5c3c6c03031bc9608
/frameworks/base/core/java/android/text/TextLine.java
c982f60e982c1d2df9f115ed9a5c3ef3643d0892 25-May-2010 Doug Felt <dougfelt@google.com> Fix alignment issues with RTL paragraphs.

Also remove unused debugging code that depends on junit.
Remove trailing whitespace in changed code.

Change-Id: Ie02d1b8220c599a672ee6e91af0fba634e0f620c
/frameworks/base/core/java/android/text/TextLine.java
f47d7405bbcb25d7cdf89ebb059f41520fe9ab87 22-Apr-2010 Doug Felt <dougfelt@google.com> Modify Canvas drawText to run bidi and shape.

Adds drawTextRun as internal API on Canvas and GraphicsOperations.
Adds implementation to implementors of GraphicsOperations.

Adds state and API on Paint to control the bidi algorithm when used
by Canvas. This API is currently hidden.

The drawText changes are incomplete since shaping is not yet available
in the native code.

Change-Id: I4368048aef9545df0953a349381771603e04b619
/frameworks/base/core/java/android/text/TextLine.java
0b9d2ca6b6fc4574898cfff6acdee821d4723a96 07-May-2010 Doug Felt <dougfelt@google.com> Fix selection off-by-one bug.

The wrong value was used to measure the width of unidirectional text.

Change-Id: I57752c111641ca1cc951e0647b60c79f5a9493ad
/frameworks/base/core/java/android/text/TextLine.java
e8e45f2c05cb3b6d23f30c8f96d8e0b3699cea7a 29-Mar-2010 Doug Felt <dougfelt@google.com> Refactor Styled utility functions into reusable objects.

This takes utility functions from Styled and a few other classes and
incorporates them into two new utility classes, TextLine and
MeasuredText. The main point of this is to support shaping by skia,
to experiment with how this will look, this also introduces
character-based Arabic shaping.

MeasuredText is used by code that determines line breaks by generating
and examining character widths in logical order. Factoring the code
in this way makes it usable by the ellipsize functions in TextUtils as
well as by StaticLayout. This class takes over the caching of widths
and chars arrays that was previously performed by StyledText. A small
number of MeasuredText objects are themselves cached by the class and
accesed using static obtain and recycle methods. Generally only these
few cached instances are ever created.

TextLine is used by code that draws or measures text on a line. This
unifies the line measuring and rendering code, and pushes assumptions
about how rtl text is treated closer to the points where skia code is
invoked. TextLine implements the functions that were previously
provided by Styled, working on member arrays rather than
explicitly-passed arguments. It implements the same kind of static
cache as MeasuredText.

TextLine and MeasureText simulate arabic glyph generation and shaping
by using ArabicShaping, ported with very minor changes from ICU4J's
ArabicShaping. This class generates shaped Arabic glyphs and Lam-Alef
ligatures using Unicode presentation forms. ArabicShaping is not
intended to be permanent, but to be replaced by real shaping from the
skia layer. It is introduced in order to emulate the behavior of real
shaping so that higher level code dealing with rendering shaped text
and cursor movement over ligatures can be developed and tested; it
also provides basic-level support for Arabic.

Since cursor movement depends on conjuncts whose formation is
font-dependent, cursor movement code that was formerly in Layout and
StaticLayout was moved into TextLine so that it can work on the shaped
text.

Other than these changes, the other major change is a rework of the
ellipsize utility functions to combine multiple branches into fewer
branches with additional state.

Updated copyright notices on new files.

Change-Id: I492cb58b51f5aaf6f14cb1419bdbed49eac5ba29
/frameworks/base/core/java/android/text/TextLine.java