diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java index fcff9a2e5fcac..756e9a0e2f2ac 100644 --- a/core/java/android/text/TextLine.java +++ b/core/java/android/text/TextLine.java @@ -852,6 +852,18 @@ class TextLine { return runIsRtl ? -ret : ret; } + private int adjustHyphenEdit(int start, int limit, int hyphenEdit) { + int result = hyphenEdit; + // Only draw hyphens on first or last run in line. Disable them otherwise. + if (start > 0) { // not the first run + result &= ~Paint.HYPHENEDIT_MASK_START_OF_LINE; + } + if (limit < mLen) { // not the last run + result &= ~Paint.HYPHENEDIT_MASK_END_OF_LINE; + } + return result; + } + /** * Utility function for handling a unidirectional run. The run must not * contain tabs but can contain styles. @@ -893,9 +905,9 @@ class TextLine { if (mSpanned == null) { TextPaint wp = mWorkPaint; wp.set(mPaint); - final int mlimit = measureLimit; + wp.setHyphenEdit(adjustHyphenEdit(start, limit, wp.getHyphenEdit())); return handleText(wp, start, limit, start, limit, runIsRtl, c, x, top, - y, bottom, fmi, needWidth || mlimit < measureLimit, mlimit); + y, bottom, fmi, needWidth, measureLimit); } mMetricAffectingSpanSpanSet.init(mSpanned, mStart + start, mStart + limit); @@ -953,10 +965,8 @@ class TextLine { span.updateDrawState(wp); } - // Only draw hyphen on last run in line - if (jnext < mLen) { - wp.setHyphenEdit(0); - } + wp.setHyphenEdit(adjustHyphenEdit(j, jnext, wp.getHyphenEdit())); + x += handleText(wp, j, jnext, i, inext, runIsRtl, c, x, top, y, bottom, fmi, needWidth || jnext < measureLimit, offset); } diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index 4ee0c34139686..b1d51ec2d92bd 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -339,6 +339,20 @@ public class Paint { */ private static final int CURSOR_OPT_MAX_VALUE = CURSOR_AT; + /** + * Mask for hyphen edits that happen at the end of a line. Keep in sync with the definition in + * Minikin's Hyphenator.h. + * @hide + */ + public static final int HYPHENEDIT_MASK_END_OF_LINE = 0x07; + + /** + * Mask for hyphen edits that happen at the start of a line. Keep in sync with the definition in + * Minikin's Hyphenator.h. + * @hide + */ + public static final int HYPHENEDIT_MASK_START_OF_LINE = 0x03 << 3; + /** * The Style specifies if the primitive being drawn is filled, stroked, or * both (in the same color). The default is FILL. @@ -1540,7 +1554,8 @@ public class Paint { * Set a hyphen edit on the paint (causes a hyphen to be added to text when * measured or drawn). * - * @param hyphen 0 for no edit, 1 for adding a hyphen (other values in future) + * @param hyphen 0 for no edit, 1 for adding a hyphen at the end, etc. + * Definition of various values are in the HyphenEdit class in Minikin's Hyphenator.h. * * @hide */ diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk index 9515b8291bb62..ec8d63ecde987 100644 --- a/libs/hwui/Android.mk +++ b/libs/hwui/Android.mk @@ -187,6 +187,7 @@ hwui_c_includes += \ external/skia/src/effects \ external/skia/src/image \ external/skia/src/utils \ + external/icu/icu4c/source/common \ external/harfbuzz_ng/src \ external/freetype/include