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
This commit is contained in:
Seigo Nonaka
2018-09-18 13:26:24 -07:00
parent 665f5b9b09
commit 32b87e01e0
4 changed files with 80 additions and 68 deletions

View File

@@ -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 {

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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