From 32b87e01e0b47873e0b29939deb4e42f45b718dd Mon Sep 17 00:00:00 2001 From: Seigo Nonaka Date: Tue, 18 Sep 2018 13:26:24 -0700 Subject: [PATCH] Move hasEqualAttribute from Paint with adding some accessors Paint#hasEqualAttributes is not a equal method in Paint. TextLine depends on this method but making this public will make developer confused. So, moving hasEqualAttributes to TextLine and provide some accessors for shadow layer parameters. For the TextPaint, unhide underlineColor and underlineThckness for implementing equalAttributes in TextLine. Bug: 112327179 Test: atest android.graphics.cts.PaintTest Change-Id: I4565e18134856e31d26bd06bcddeb31ddbe7e093 --- api/current.txt | 6 ++ core/java/android/text/TextLine.java | 40 +++++++++++- core/java/android/text/TextPaint.java | 27 +------- graphics/java/android/graphics/Paint.java | 75 ++++++++++------------- 4 files changed, 80 insertions(+), 68 deletions(-) diff --git a/api/current.txt b/api/current.txt index 1eecc2da673cf..d53c11f2c8786 100755 --- a/api/current.txt +++ b/api/current.txt @@ -14001,6 +14001,10 @@ package android.graphics { method public float getRunAdvance(char[], int, int, int, int, boolean, int); method public float getRunAdvance(java.lang.CharSequence, int, int, int, int, boolean, int); method public android.graphics.Shader getShader(); + method public int getShadowLayerColor(); + method public float getShadowLayerDx(); + method public float getShadowLayerDy(); + method public float getShadowLayerRadius(); method public float getStrikeThruPosition(); method public float getStrikeThruThickness(); method public android.graphics.Paint.Cap getStrokeCap(); @@ -43968,6 +43972,8 @@ package android.text { field public float density; field public int[] drawableState; field public int linkColor; + field public int underlineColor; + field public float underlineThickness; } public class TextUtils { diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java index ad7a851926a1c..a182fe80dfbf9 100644 --- a/core/java/android/text/TextLine.java +++ b/core/java/android/text/TextLine.java @@ -1231,7 +1231,7 @@ public class TextLine { // with the next chunk. So we just save the TextPaint for future comparisons // and use. activePaint.set(wp); - } else if (!wp.hasEqualAttributes(activePaint)) { + } else if (!equalAttributes(wp, activePaint)) { // The style of the present chunk of text is substantially different from the // style of the previous chunk. We need to handle the active piece of text // and restart with the present chunk. @@ -1336,4 +1336,42 @@ public class TextLine { } private static final int TAB_INCREMENT = 20; + + private static boolean equalAttributes(@NonNull TextPaint lp, @NonNull TextPaint rp) { + return lp.getColorFilter() == rp.getColorFilter() + && lp.getMaskFilter() == rp.getMaskFilter() + && lp.getShader() == rp.getShader() + && lp.getTypeface() == rp.getTypeface() + && lp.getXfermode() == rp.getXfermode() + && lp.getTextLocales().equals(rp.getTextLocales()) + && TextUtils.equals(lp.getFontFeatureSettings(), rp.getFontFeatureSettings()) + && TextUtils.equals(lp.getFontVariationSettings(), rp.getFontVariationSettings()) + && lp.getShadowLayerRadius() == rp.getShadowLayerRadius() + && lp.getShadowLayerDx() == rp.getShadowLayerDx() + && lp.getShadowLayerDy() == rp.getShadowLayerDy() + && lp.getShadowLayerColor() == rp.getShadowLayerColor() + && lp.getFlags() == rp.getFlags() + && lp.getHinting() == rp.getHinting() + && lp.getStyle() == rp.getStyle() + && lp.getColor() == rp.getColor() + && lp.getStrokeWidth() == rp.getStrokeWidth() + && lp.getStrokeMiter() == rp.getStrokeMiter() + && lp.getStrokeCap() == rp.getStrokeCap() + && lp.getStrokeJoin() == rp.getStrokeJoin() + && lp.getTextAlign() == rp.getTextAlign() + && lp.isElegantTextHeight() == rp.isElegantTextHeight() + && lp.getTextSize() == rp.getTextSize() + && lp.getTextScaleX() == rp.getTextScaleX() + && lp.getTextSkewX() == rp.getTextSkewX() + && lp.getLetterSpacing() == rp.getLetterSpacing() + && lp.getWordSpacing() == rp.getWordSpacing() + && lp.getHyphenEdit() == rp.getHyphenEdit() + && lp.bgColor == rp.bgColor + && lp.baselineShift == rp.baselineShift + && lp.linkColor == rp.linkColor + && lp.drawableState == rp.drawableState + && lp.density == rp.density + && lp.underlineColor == rp.underlineColor + && lp.underlineThickness == rp.underlineThickness; + } } diff --git a/core/java/android/text/TextPaint.java b/core/java/android/text/TextPaint.java index 7bcc6859b8fc5..d5aad33a85e7d 100644 --- a/core/java/android/text/TextPaint.java +++ b/core/java/android/text/TextPaint.java @@ -17,7 +17,7 @@ package android.text; import android.annotation.ColorInt; -import android.annotation.NonNull; +import android.annotation.Px; import android.annotation.UnsupportedAppUsage; import android.graphics.Paint; @@ -37,17 +37,14 @@ public class TextPaint extends Paint { public float density = 1.0f; /** * Special value 0 means no custom underline - * @hide */ @ColorInt - @UnsupportedAppUsage public int underlineColor = 0; + /** * Thickness of the underline, in pixels. - * @hide */ - @UnsupportedAppUsage - public float underlineThickness; + public @Px float underlineThickness; public TextPaint() { super(); @@ -77,24 +74,6 @@ public class TextPaint extends Paint { underlineThickness = tp.underlineThickness; } - /** - * Returns true if all attributes, including the attributes inherited from Paint, are equal. - * - * The caller is expected to have checked the trivial cases, like the pointers being equal, - * the objects having different classes, or the parameter being null. - * @hide - */ - public boolean hasEqualAttributes(@NonNull TextPaint other) { - return bgColor == other.bgColor - && baselineShift == other.baselineShift - && linkColor == other.linkColor - && drawableState == other.drawableState - && density == other.density - && underlineColor == other.underlineColor - && underlineThickness == other.underlineThickness - && super.hasEqualAttributes((Paint) other); - } - /** * Defines a custom underline for this Paint. * @param color underline solid color diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index 85b39fea84276..9998db146783f 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -580,49 +580,6 @@ public class Paint { mShadowLayerColor = paint.mShadowLayerColor; } - /** - * Returns true if all attributes are equal. - * - * The caller is expected to have checked the trivial cases, like the pointers being equal, - * the objects having different classes, or the parameter being null. - * @hide - */ - public boolean hasEqualAttributes(@NonNull Paint other) { - return mColorFilter == other.mColorFilter - && mMaskFilter == other.mMaskFilter - && mPathEffect == other.mPathEffect - && mShader == other.mShader - && mTypeface == other.mTypeface - && mXfermode == other.mXfermode - && mHasCompatScaling == other.mHasCompatScaling - && mCompatScaling == other.mCompatScaling - && mInvCompatScaling == other.mInvCompatScaling - && mBidiFlags == other.mBidiFlags - && mLocales.equals(other.mLocales) - && TextUtils.equals(mFontFeatureSettings, other.mFontFeatureSettings) - && TextUtils.equals(mFontVariationSettings, other.mFontVariationSettings) - && mShadowLayerRadius == other.mShadowLayerRadius - && mShadowLayerDx == other.mShadowLayerDx - && mShadowLayerDy == other.mShadowLayerDy - && mShadowLayerColor == other.mShadowLayerColor - && getFlags() == other.getFlags() - && getHinting() == other.getHinting() - && getStyle() == other.getStyle() - && getColor() == other.getColor() - && getStrokeWidth() == other.getStrokeWidth() - && getStrokeMiter() == other.getStrokeMiter() - && getStrokeCap() == other.getStrokeCap() - && getStrokeJoin() == other.getStrokeJoin() - && getTextAlign() == other.getTextAlign() - && isElegantTextHeight() == other.isElegantTextHeight() - && getTextSize() == other.getTextSize() - && getTextScaleX() == other.getTextScaleX() - && getTextSkewX() == other.getTextSkewX() - && getLetterSpacing() == other.getLetterSpacing() - && getWordSpacing() == other.getWordSpacing() - && getHyphenEdit() == other.getHyphenEdit(); - } - /** @hide */ @UnsupportedAppUsage public void setCompatibilityScaling(float factor) { @@ -1382,6 +1339,38 @@ public class Paint { return nHasShadowLayer(mNativePaint); } + /** + * Returns the blur radius of the shadow layer. + * @see #setShadowLayer(float,float,float,int) + */ + public float getShadowLayerRadius() { + return mShadowLayerRadius; + } + + /** + * Returns the x offset of the shadow layer. + * @see #setShadowLayer(float,float,float,int) + */ + public float getShadowLayerDx() { + return mShadowLayerDx; + } + + /** + * Returns the y offset of the shadow layer. + * @see #setShadowLayer(float,float,float,int) + */ + public float getShadowLayerDy() { + return mShadowLayerDy; + } + + /** + * Returns the color of the shadow layer. + * @see #setShadowLayer(float,float,float,int) + */ + public @ColorInt int getShadowLayerColor() { + return mShadowLayerColor; + } + /** * Return the paint's Align value for drawing text. This controls how the * text is positioned relative to its origin. LEFT align means that all of