diff options
Diffstat (limited to 'graphics/java')
42 files changed, 334 insertions, 396 deletions
diff --git a/graphics/java/android/graphics/BLASTBufferQueue.java b/graphics/java/android/graphics/BLASTBufferQueue.java index 4c0f890eee40..94bfdc9dbad6 100644 --- a/graphics/java/android/graphics/BLASTBufferQueue.java +++ b/graphics/java/android/graphics/BLASTBufferQueue.java @@ -29,9 +29,10 @@ public final class BLASTBufferQueue { private static native long nativeCreate(String name, long surfaceControl, long width, long height, boolean tripleBufferingEnabled); private static native void nativeDestroy(long ptr); - private static native Surface nativeGetSurface(long ptr); + private static native Surface nativeGetSurface(long ptr, boolean includeSurfaceControlHandle); private static native void nativeSetNextTransaction(long ptr, long transactionPtr); private static native void nativeUpdate(long ptr, long surfaceControl, long width, long height); + private static native void nativeFlushShadowQueue(long ptr); /** Create a new connection with the surface flinger. */ public BLASTBufferQueue(String name, SurfaceControl sc, int width, int height, @@ -48,7 +49,15 @@ public final class BLASTBufferQueue { * @return a new Surface instance from the IGraphicsBufferProducer of the adapter. */ public Surface createSurface() { - return nativeGetSurface(mNativeObject); + return nativeGetSurface(mNativeObject, false /* includeSurfaceControlHandle */); + } + + /** + * @return a new Surface instance from the IGraphicsBufferProducer of the adapter and + * the SurfaceControl handle. + */ + public Surface createSurfaceWithHandle() { + return nativeGetSurface(mNativeObject, true /* includeSurfaceControlHandle */); } public void setNextTransaction(SurfaceControl.Transaction t) { @@ -69,4 +78,8 @@ public final class BLASTBufferQueue { super.finalize(); } } + + public void flushShadowQueue() { + nativeFlushShadowQueue(mNativeObject); + } } diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java index 05df250fa6b9..54f9fa81b9b7 100644 --- a/graphics/java/android/graphics/BaseCanvas.java +++ b/graphics/java/android/graphics/BaseCanvas.java @@ -26,11 +26,13 @@ import android.compat.annotation.UnsupportedAppUsage; import android.graphics.Canvas.VertexMode; import android.graphics.fonts.Font; import android.graphics.text.MeasuredText; +import android.graphics.text.TextRunShaper; import android.text.GraphicsOperations; import android.text.MeasuredParagraph; import android.text.PrecomputedText; import android.text.SpannableString; import android.text.SpannedString; +import android.text.TextShaper; import android.text.TextUtils; import com.android.internal.util.Preconditions; @@ -471,8 +473,8 @@ public abstract class BaseCanvas { * @param font Font used for drawing. * @param paint Paint used for drawing. The typeface set to this paint is ignored. * - * @see android.graphics.text.TextShaper - * @see android.text.StyledTextShaper + * @see TextRunShaper + * @see TextShaper */ public void drawGlyphs( @NonNull int[] glyphIds, diff --git a/graphics/java/android/graphics/Bitmap.java b/graphics/java/android/graphics/Bitmap.java index 4f95a53e0ec8..055e5ad17def 100644 --- a/graphics/java/android/graphics/Bitmap.java +++ b/graphics/java/android/graphics/Bitmap.java @@ -80,7 +80,7 @@ public final class Bitmap implements Parcelable { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 123769491) private byte[] mNinePatchChunk; // may be null - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private NinePatch.InsetStruct mNinePatchInsets; // may be null @UnsupportedAppUsage private int mWidth; @@ -176,7 +176,7 @@ public final class Bitmap implements Parcelable { * width/height values */ @SuppressWarnings("unused") // called from JNI - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) void reinit(int width, int height, boolean requestPremultiplied) { mWidth = width; mHeight = height; diff --git a/graphics/java/android/graphics/BitmapFactory.java b/graphics/java/android/graphics/BitmapFactory.java index bad487b47682..ef1e7bfc6651 100644 --- a/graphics/java/android/graphics/BitmapFactory.java +++ b/graphics/java/android/graphics/BitmapFactory.java @@ -23,6 +23,7 @@ import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; import android.content.res.AssetManager; import android.content.res.Resources; +import android.os.Build; import android.os.Trace; import android.util.DisplayMetrics; import android.util.Log; @@ -875,7 +876,7 @@ public class BitmapFactory { @UnsupportedAppUsage private static native Bitmap nativeDecodeFileDescriptor(FileDescriptor fd, Rect padding, Options opts, long inBitmapHandle, long colorSpaceHandle); - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private static native Bitmap nativeDecodeAsset(long nativeAsset, Rect padding, Options opts, long inBitmapHandle, long colorSpaceHandle); @UnsupportedAppUsage diff --git a/graphics/java/android/graphics/Canvas.java b/graphics/java/android/graphics/Canvas.java index 5e07d156a06a..42e6ab9c830c 100644 --- a/graphics/java/android/graphics/Canvas.java +++ b/graphics/java/android/graphics/Canvas.java @@ -26,7 +26,9 @@ import android.annotation.Size; import android.compat.annotation.UnsupportedAppUsage; import android.graphics.fonts.Font; import android.graphics.text.MeasuredText; +import android.graphics.text.TextRunShaper; import android.os.Build; +import android.text.TextShaper; import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.FastNative; @@ -1353,7 +1355,7 @@ public class Canvas extends BaseCanvas { * * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public void release() { mNativeCanvasWrapper = 0; if (mFinalizer != null) { @@ -1377,7 +1379,7 @@ public class Canvas extends BaseCanvas { * * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public static void freeTextLayoutCaches() { nFreeTextLayoutCaches(); } @@ -2053,7 +2055,7 @@ public class Canvas extends BaseCanvas { * Draw array of glyphs with specified font. * * @param glyphIds Array of glyph IDs. The length of array must be greater than or equal to - * {@code glyphStart + glyphCount}. + * {@code glyphIdOffset + glyphCount}. * @param glyphIdOffset Number of elements to skip before drawing in <code>glyphIds</code> * array. * @param positions A flattened X and Y position array. The first glyph X position must be @@ -2071,8 +2073,8 @@ public class Canvas extends BaseCanvas { * @param font Font used for drawing. * @param paint Paint used for drawing. The typeface set to this paint is ignored. * - * @see android.graphics.text.TextShaper - * @see android.text.StyledTextShaper + * @see TextRunShaper + * @see TextShaper */ public void drawGlyphs( @NonNull int[] glyphIds, diff --git a/graphics/java/android/graphics/CanvasProperty.java b/graphics/java/android/graphics/CanvasProperty.java index 4263772c1c2c..e949584b0659 100644 --- a/graphics/java/android/graphics/CanvasProperty.java +++ b/graphics/java/android/graphics/CanvasProperty.java @@ -17,6 +17,7 @@ package android.graphics; import android.compat.annotation.UnsupportedAppUsage; +import android.os.Build; import com.android.internal.util.VirtualRefBasePtr; @@ -28,12 +29,12 @@ public final class CanvasProperty<T> { private VirtualRefBasePtr mProperty; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public static CanvasProperty<Float> createFloat(float initialValue) { return new CanvasProperty<Float>(nCreateFloat(initialValue)); } - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public static CanvasProperty<Paint> createPaint(Paint initialValue) { return new CanvasProperty<Paint>(nCreatePaint(initialValue.getNativeInstance())); } diff --git a/graphics/java/android/graphics/ColorMatrixColorFilter.java b/graphics/java/android/graphics/ColorMatrixColorFilter.java index a8b18a9fcb1f..90ff1899f34d 100644 --- a/graphics/java/android/graphics/ColorMatrixColorFilter.java +++ b/graphics/java/android/graphics/ColorMatrixColorFilter.java @@ -19,6 +19,7 @@ package android.graphics; import android.annotation.NonNull; import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; +import android.os.Build; /** * A color filter that transforms colors through a 4x5 color matrix. This filter @@ -107,7 +108,7 @@ public class ColorMatrixColorFilter extends ColorFilter { * * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public void setColorMatrixArray(@Nullable float[] array) { // called '...Array' so that passing null isn't ambiguous discardNativeInstance(); diff --git a/graphics/java/android/graphics/FontListParser.java b/graphics/java/android/graphics/FontListParser.java index c146bbd4441b..0782f8dfd9d3 100644 --- a/graphics/java/android/graphics/FontListParser.java +++ b/graphics/java/android/graphics/FontListParser.java @@ -18,6 +18,7 @@ package android.graphics; import android.compat.annotation.UnsupportedAppUsage; import android.graphics.fonts.FontVariationAxis; +import android.os.Build; import android.text.FontConfig; import android.util.Xml; @@ -38,7 +39,7 @@ import java.util.regex.Pattern; public class FontListParser { /* Parse fallback list (no names) */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public static FontConfig parse(InputStream in) throws XmlPullParserException, IOException { return parse(in, "/system/fonts"); } diff --git a/graphics/java/android/graphics/GraphicBuffer.java b/graphics/java/android/graphics/GraphicBuffer.java index 2c25f4546771..f9113a21405c 100644 --- a/graphics/java/android/graphics/GraphicBuffer.java +++ b/graphics/java/android/graphics/GraphicBuffer.java @@ -18,6 +18,7 @@ package android.graphics; import android.compat.annotation.UnsupportedAppUsage; import android.hardware.HardwareBuffer; +import android.os.Build; import android.os.Parcel; import android.os.Parcelable; @@ -55,7 +56,7 @@ public class GraphicBuffer implements Parcelable { private final int mFormat; private final int mUsage; // Note: do not rename, this field is used by native code - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private final long mNativeObject; // These two fields are only used by lock/unlockCanvas() @@ -87,7 +88,7 @@ public class GraphicBuffer implements Parcelable { /** * Private use only. See {@link #create(int, int, int, int)}. */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private GraphicBuffer(int width, int height, int format, int usage, long nativeObject) { mWidth = width; mHeight = height; diff --git a/graphics/java/android/graphics/LightingColorFilter.java b/graphics/java/android/graphics/LightingColorFilter.java index 221dfa192795..df91c5d492bd 100644 --- a/graphics/java/android/graphics/LightingColorFilter.java +++ b/graphics/java/android/graphics/LightingColorFilter.java @@ -23,6 +23,7 @@ package android.graphics; import android.annotation.ColorInt; import android.compat.annotation.UnsupportedAppUsage; +import android.os.Build; /** * A color filter that can be used to simulate simple lighting effects. @@ -73,7 +74,7 @@ public class LightingColorFilter extends ColorFilter { * * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public void setColorMultiply(@ColorInt int mul) { if (mMul != mul) { mMul = mul; @@ -99,7 +100,7 @@ public class LightingColorFilter extends ColorFilter { * * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public void setColorAdd(@ColorInt int add) { if (mAdd != add) { mAdd = add; diff --git a/graphics/java/android/graphics/LinearGradient.java b/graphics/java/android/graphics/LinearGradient.java index ebe34cad0654..4eedbf563865 100644 --- a/graphics/java/android/graphics/LinearGradient.java +++ b/graphics/java/android/graphics/LinearGradient.java @@ -21,20 +21,21 @@ import android.annotation.ColorLong; import android.annotation.NonNull; import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; +import android.os.Build; public class LinearGradient extends Shader { - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float mX0; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float mY0; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float mX1; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float mY1; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float[] mPositions; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private TileMode mTileMode; // @ColorInts are replaced by @ColorLongs, but these remain due to @UnsupportedAppUsage. @@ -44,7 +45,7 @@ public class LinearGradient extends Shader { @UnsupportedAppUsage @ColorInt private int mColor0; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @ColorInt private int mColor1; diff --git a/graphics/java/android/graphics/Movie.java b/graphics/java/android/graphics/Movie.java index 4b3924f0d55f..9c9535d16aab 100644 --- a/graphics/java/android/graphics/Movie.java +++ b/graphics/java/android/graphics/Movie.java @@ -28,7 +28,7 @@ import java.io.InputStream; */ @Deprecated public class Movie { - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private long mNativeMovie; @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java index 28d7911c771f..4b6e4d124b48 100644 --- a/graphics/java/android/graphics/Paint.java +++ b/graphics/java/android/graphics/Paint.java @@ -53,7 +53,7 @@ import java.util.Locale; */ public class Paint { - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private long mNativePaint; private long mNativeShader; private long mNativeColorFilter; @@ -115,6 +115,21 @@ public class Paint { Align.LEFT, Align.CENTER, Align.RIGHT }; + /** @hide */ + @Retention(RetentionPolicy.SOURCE) + @IntDef(flag = true, value = { + ANTI_ALIAS_FLAG, + FILTER_BITMAP_FLAG, + DITHER_FLAG, + UNDERLINE_TEXT_FLAG, + STRIKE_THRU_TEXT_FLAG, + FAKE_BOLD_TEXT_FLAG, + LINEAR_TEXT_FLAG, + SUBPIXEL_TEXT_FLAG, + EMBEDDED_BITMAP_TEXT_FLAG + }) + public @interface PaintFlag{} + /** * Paint flag that enables antialiasing when drawing. * @@ -724,7 +739,7 @@ public class Paint { * * @return the paint's flags (see enums ending in _Flag for bit masks) */ - public int getFlags() { + public @PaintFlag int getFlags() { return nGetFlags(mNativePaint); } @@ -733,7 +748,7 @@ public class Paint { * * @param flags The new flag bits for the paint */ - public void setFlags(int flags) { + public void setFlags(@PaintFlag int flags) { nSetFlags(mNativePaint, flags); } diff --git a/graphics/java/android/graphics/Path.java b/graphics/java/android/graphics/Path.java index 7811671b80d6..e5ef10d1d555 100644 --- a/graphics/java/android/graphics/Path.java +++ b/graphics/java/android/graphics/Path.java @@ -21,6 +21,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.Size; import android.compat.annotation.UnsupportedAppUsage; +import android.os.Build; import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.FastNative; @@ -48,12 +49,12 @@ public class Path { /** * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public boolean isSimplePath = true; /** * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public Region rects; private Direction mLastDirection = null; diff --git a/graphics/java/android/graphics/PorterDuffColorFilter.java b/graphics/java/android/graphics/PorterDuffColorFilter.java index 50ecb62e7fcc..0700f217ecf0 100644 --- a/graphics/java/android/graphics/PorterDuffColorFilter.java +++ b/graphics/java/android/graphics/PorterDuffColorFilter.java @@ -19,6 +19,7 @@ package android.graphics; import android.annotation.ColorInt; import android.annotation.NonNull; import android.compat.annotation.UnsupportedAppUsage; +import android.os.Build; /** * A color filter that can be used to tint the source pixels using a single @@ -64,7 +65,7 @@ public class PorterDuffColorFilter extends ColorFilter { * * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public PorterDuff.Mode getMode() { return mMode; } diff --git a/graphics/java/android/graphics/RadialGradient.java b/graphics/java/android/graphics/RadialGradient.java index 089d6de44adb..dd1be1570d79 100644 --- a/graphics/java/android/graphics/RadialGradient.java +++ b/graphics/java/android/graphics/RadialGradient.java @@ -18,30 +18,36 @@ package android.graphics; import android.annotation.ColorInt; import android.annotation.ColorLong; +import android.annotation.FloatRange; import android.annotation.NonNull; import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; +import android.os.Build; public class RadialGradient extends Shader { - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float mX; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float mY; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float mRadius; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float[] mPositions; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private TileMode mTileMode; + private final float mFocalX; + private final float mFocalY; + private final float mFocalRadius; + // @ColorInts are replaced by @ColorLongs, but these remain due to @UnsupportedAppUsage. - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @ColorInt private int[] mColors; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @ColorInt private int mCenterColor; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @ColorInt private int mEdgeColor; @@ -64,8 +70,8 @@ public class RadialGradient extends Shader { public RadialGradient(float centerX, float centerY, float radius, @NonNull @ColorInt int[] colors, @Nullable float[] stops, @NonNull TileMode tileMode) { - this(centerX, centerY, radius, convertColors(colors), stops, tileMode, - ColorSpace.get(ColorSpace.Named.SRGB)); + this(centerX, centerY, 0f, centerX, centerY, radius, convertColors(colors), + stops, tileMode, ColorSpace.get(ColorSpace.Named.SRGB)); } /** @@ -88,27 +94,79 @@ public class RadialGradient extends Shader { public RadialGradient(float centerX, float centerY, float radius, @NonNull @ColorLong long[] colors, @Nullable float[] stops, @NonNull TileMode tileMode) { - this(centerX, centerY, radius, colors.clone(), stops, tileMode, detectColorSpace(colors)); + this(centerX, centerY, 0f, centerX, centerY, radius, colors.clone(), stops, + tileMode, detectColorSpace(colors)); + } + + /** + * Create a shader that draws a radial gradient given the start and end points as well as + * starting and ending radii. The starting point is often referred to as the focal center and + * represents the starting circle of the radial gradient. + * + * @param startX The x-coordinate of the center of the starting circle of the radial gradient, + * often referred to as the focal point. + * @param startY The y-coordinate of the center of the starting circle of the radial gradient, + * often referred to as the focal point. + * @param startRadius The radius of the starting circle of the radial gradient, often referred + * to as the focal radius. Must be greater than or equal to zero. + * @param endX The x-coordinate of the center of the radius for the end circle of the + * radial gradient + * @param endY The y-coordinate of the center of the radius for the end circle of the + * radial gradient + * @param endRadius The radius of the ending circle for this gradient. This must be strictly + * greater than zero. A radius value equal to zero is not allowed. + * @param colors The colors to be distributed between the center and edge of the circle + * @param stops May be <code>null</code>. Valid values are between <code>0.0f</code> and + * <code>1.0f</code>. The relative position of each corresponding color in + * the colors array. If <code>null</code>, colors are distributed evenly + * between the center and edge of the circle. + * @param tileMode The Shader tiling mode + * + * @throws IllegalArgumentException If one of the following circumstances: + * - There are less than two colors + * - The colors do not share the same {@link ColorSpace} + * - The colors do not use a valid {@link ColorSpace} + * - The {@code stops} parameter is not {@code null} and has a different length + * from {@code colors}. + * - The {@param startRadius} is negative + * - The {@param endRadius} is less than or equal to zero + */ + public RadialGradient(float startX, float startY, @FloatRange(from = 0.0f) float startRadius, + float endX, float endY, @FloatRange(from = 0.0f, fromInclusive = false) float endRadius, + @NonNull @ColorLong long[] colors, @Nullable float[] stops, + @NonNull TileMode tileMode) { + this(startX, startY, startRadius, endX, endY, endRadius, colors.clone(), stops, tileMode, + detectColorSpace(colors)); } /** * Base constructor. Assumes @param colors is a copy that this object can hold onto, * and all colors share @param colorSpace. */ - private RadialGradient(float centerX, float centerY, float radius, - @NonNull @ColorLong long[] colors, @Nullable float[] stops, - @NonNull TileMode tileMode, ColorSpace colorSpace) { + private RadialGradient(float startX, float startY, float startRadius, float endX, float endY, + float endRadius, @NonNull @ColorLong long[] colors, @Nullable float[] stops, + @NonNull TileMode tileMode, ColorSpace colorSpace + ) { super(colorSpace); + // A focal or starting radius of zero with a focal point that matches the center is + // identical to a regular radial gradient + if (startRadius < 0) { + throw new IllegalArgumentException("starting/focal radius must be >= 0"); + } - if (radius <= 0) { - throw new IllegalArgumentException("radius must be > 0"); + if (endRadius <= 0) { + throw new IllegalArgumentException("ending radius must be > 0"); } + if (stops != null && colors.length != stops.length) { throw new IllegalArgumentException("color and position arrays must be of equal length"); } - mX = centerX; - mY = centerY; - mRadius = radius; + mX = endX; + mY = endY; + mRadius = endRadius; + mFocalX = startX; + mFocalY = startY; + mFocalRadius = startRadius; mColorLongs = colors; mPositions = stops != null ? stops.clone() : null; mTileMode = tileMode; @@ -150,12 +208,12 @@ public class RadialGradient extends Shader { /** @hide */ @Override protected long createNativeInstance(long nativeMatrix) { - return nativeCreate(nativeMatrix, mX, mY, mRadius, - mColorLongs, mPositions, mTileMode.nativeInt, - colorSpace().getNativeInstance()); + return nativeCreate(nativeMatrix, mFocalX, mFocalY, mFocalRadius, mX, mY, mRadius, + mColorLongs, mPositions, mTileMode.nativeInt, colorSpace().getNativeInstance()); } - private static native long nativeCreate(long matrix, float x, float y, float radius, - @ColorLong long[] colors, float[] positions, int tileMode, long colorSpaceHandle); + private static native long nativeCreate(long matrix, float startX, float startY, + float startRadius, float endX, float endY, float endRadius, @ColorLong long[] colors, + float[] positions, int tileMode, long colorSpaceHandle); } diff --git a/graphics/java/android/graphics/Region.java b/graphics/java/android/graphics/Region.java index 43373ffbd3f4..29708738d2db 100644 --- a/graphics/java/android/graphics/Region.java +++ b/graphics/java/android/graphics/Region.java @@ -18,6 +18,7 @@ package android.graphics; import android.annotation.NonNull; import android.compat.annotation.UnsupportedAppUsage; +import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import android.util.Pools.SynchronizedPool; @@ -32,7 +33,7 @@ public class Region implements Parcelable { /** * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public long mNativeRegion; // the native values for these must match up with the enum in SkRegion.h @@ -337,7 +338,7 @@ public class Region implements Parcelable { * * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public void recycle() { setEmpty(); sPool.release(this); @@ -411,7 +412,7 @@ public class Region implements Parcelable { /* Add an unused parameter so constructor can be called from jni without triggering 'not cloneable' exception */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private Region(long ni, int unused) { this(ni); } diff --git a/graphics/java/android/graphics/Shader.java b/graphics/java/android/graphics/Shader.java index d71ff1138b25..7651d019bdcb 100644 --- a/graphics/java/android/graphics/Shader.java +++ b/graphics/java/android/graphics/Shader.java @@ -83,21 +83,22 @@ public class Shader { public enum TileMode { /** - * replicate the edge color if the shader draws outside of its - * original bounds + * Replicate the edge color if the shader draws outside of its + * original bounds. */ CLAMP (0), /** - * repeat the shader's image horizontally and vertically + * Repeat the shader's image horizontally and vertically. */ REPEAT (1), /** - * repeat the shader's image horizontally and vertically, alternating - * mirror images so that adjacent images always seam + * Repeat the shader's image horizontally and vertically, alternating + * mirror images so that adjacent images always seam. */ MIRROR(2), /** - * Only draw within the original domain, return transparent-black everywhere else + * Render the shader's image pixels only within its original bounds. If the shader + * draws outside of its original bounds, transparent black is drawn instead. */ DECAL(3); diff --git a/graphics/java/android/graphics/SurfaceTexture.java b/graphics/java/android/graphics/SurfaceTexture.java index 228d03a1dd10..7a2e5843ffc7 100644 --- a/graphics/java/android/graphics/SurfaceTexture.java +++ b/graphics/java/android/graphics/SurfaceTexture.java @@ -18,6 +18,7 @@ package android.graphics; import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; +import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -69,17 +70,17 @@ import java.lang.ref.WeakReference; */ public class SurfaceTexture { private final Looper mCreatorLooper; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private Handler mOnFrameAvailableHandler; /** * These fields are used by native code, do not access or modify. */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private long mSurfaceTexture; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private long mProducer; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private long mFrameAvailableListener; private boolean mIsSingleBuffered; @@ -390,7 +391,7 @@ public class SurfaceTexture { * This method is invoked from native code only. */ @SuppressWarnings({"UnusedDeclaration"}) - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private static void postEventFromNative(WeakReference<SurfaceTexture> weakSelf) { SurfaceTexture st = weakSelf.get(); if (st != null) { diff --git a/graphics/java/android/graphics/SweepGradient.java b/graphics/java/android/graphics/SweepGradient.java index f1ca1986bfa0..22807805e7fa 100644 --- a/graphics/java/android/graphics/SweepGradient.java +++ b/graphics/java/android/graphics/SweepGradient.java @@ -21,23 +21,24 @@ import android.annotation.ColorLong; import android.annotation.NonNull; import android.annotation.Nullable; import android.compat.annotation.UnsupportedAppUsage; +import android.os.Build; public class SweepGradient extends Shader { - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float mCx; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float mCy; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private float[] mPositions; // @ColorInts are replaced by @ColorLongs, but these remain due to @UnsupportedAppUsage. - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @ColorInt private int[] mColors; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @ColorInt private int mColor0; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) @ColorInt private int mColor1; diff --git a/graphics/java/android/graphics/Typeface.java b/graphics/java/android/graphics/Typeface.java index a2dd9a8322b6..441c16322645 100644 --- a/graphics/java/android/graphics/Typeface.java +++ b/graphics/java/android/graphics/Typeface.java @@ -327,7 +327,7 @@ public class Typeface { * 1) Create Typeface from ttf file. * <pre> * <code> - * Typeface.Builder buidler = new Typeface.Builder("your_font_file.ttf"); + * Typeface.Builder builder = new Typeface.Builder("your_font_file.ttf"); * Typeface typeface = builder.build(); * </code> * </pre> @@ -335,7 +335,7 @@ public class Typeface { * 2) Create Typeface from ttc file in assets directory. * <pre> * <code> - * Typeface.Builder buidler = new Typeface.Builder(getAssets(), "your_font_file.ttc"); + * Typeface.Builder builder = new Typeface.Builder(getAssets(), "your_font_file.ttc"); * builder.setTtcIndex(2); // Set index of font collection. * Typeface typeface = builder.build(); * </code> @@ -344,7 +344,7 @@ public class Typeface { * 3) Create Typeface with variation settings. * <pre> * <code> - * Typeface.Builder buidler = new Typeface.Builder("your_font_file.ttf"); + * Typeface.Builder builder = new Typeface.Builder("your_font_file.ttf"); * builder.setFontVariationSettings("'wght' 700, 'slnt' 20, 'ital' 1"); * builder.setWeight(700); // Tell the system that this is a bold font. * builder.setItalic(true); // Tell the system that this is an italic style font. @@ -768,7 +768,7 @@ public class Typeface { public @NonNull CustomFallbackBuilder addCustomFallback(@NonNull FontFamily family) { Preconditions.checkNotNull(family); Preconditions.checkArgument(mFamilies.size() < getMaxCustomFallbackCount(), - "Custom fallback limit exceeded(" + getMaxCustomFallbackCount() + ")"); + "Custom fallback limit exceeded(%d)", getMaxCustomFallbackCount()); mFamilies.add(family); return this; } @@ -1217,7 +1217,7 @@ public class Typeface { long native_instance, List<FontVariationAxis> axes); @UnsupportedAppUsage private static native long nativeCreateWeightAlias(long native_instance, int weight); - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private static native long nativeCreateFromArray(long[] familyArray, int weight, int italic); private static native int[] nativeGetSupportedAxes(long native_instance); diff --git a/graphics/java/android/graphics/Xfermode.java b/graphics/java/android/graphics/Xfermode.java index e79fb76d806e..81769e2e21bf 100644 --- a/graphics/java/android/graphics/Xfermode.java +++ b/graphics/java/android/graphics/Xfermode.java @@ -22,6 +22,7 @@ package android.graphics; import android.compat.annotation.UnsupportedAppUsage; +import android.os.Build; /** * Xfermode is the base class for objects that are called to implement custom @@ -32,6 +33,6 @@ import android.compat.annotation.UnsupportedAppUsage; */ public class Xfermode { static final int DEFAULT = PorterDuff.Mode.SRC_OVER.nativeInt; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) int porterDuffMode = DEFAULT; } diff --git a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java index 06159d8a0558..33a6d38b698d 100644 --- a/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedStateListDrawable.java @@ -561,9 +561,9 @@ public class AnimatedStateListDrawable extends StateListDrawable { int[] mAnimThemeAttrs; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) LongSparseLongArray mTransitions; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) SparseIntArray mStateIds; AnimatedStateListState(@Nullable AnimatedStateListState orig, diff --git a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java index 73dbe65bd25b..33b09b8831ce 100644 --- a/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java +++ b/graphics/java/android/graphics/drawable/AnimatedVectorDrawable.java @@ -315,7 +315,7 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { */ private Resources mRes; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private AnimatedVectorDrawableState mAnimatedVectorState; /** The animator set that is parsed from the xml. */ @@ -1773,7 +1773,7 @@ public class AnimatedVectorDrawable extends Drawable implements Animatable2 { } // onFinished: should be called from native - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private static void callOnFinished(VectorDrawableAnimatorRT set, int id) { set.mHandler.post(() -> set.onAnimationEnd(id)); } diff --git a/graphics/java/android/graphics/drawable/ColorDrawable.java b/graphics/java/android/graphics/drawable/ColorDrawable.java index 2457ab85144f..f8dc61526ce6 100644 --- a/graphics/java/android/graphics/drawable/ColorDrawable.java +++ b/graphics/java/android/graphics/drawable/ColorDrawable.java @@ -34,6 +34,7 @@ import android.graphics.Outline; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.Xfermode; +import android.os.Build; import android.util.AttributeSet; import android.view.ViewDebug; @@ -53,7 +54,7 @@ import java.io.IOException; * @attr ref android.R.styleable#ColorDrawable_color */ public class ColorDrawable extends Drawable { - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); @ViewDebug.ExportedProperty(deepExport = true, prefix = "state_") diff --git a/graphics/java/android/graphics/drawable/Drawable.java b/graphics/java/android/graphics/drawable/Drawable.java index ed210ab40b7a..28b3b04b827d 100644 --- a/graphics/java/android/graphics/drawable/Drawable.java +++ b/graphics/java/android/graphics/drawable/Drawable.java @@ -45,6 +45,7 @@ import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.Region; import android.graphics.Xfermode; +import android.os.Build; import android.os.Trace; import android.util.AttributeSet; import android.util.DisplayMetrics; @@ -1715,7 +1716,7 @@ public abstract class Drawable { * * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public static BlendMode parseBlendMode(int value, BlendMode defaultMode) { switch (value) { case 3: return BlendMode.SRC_OVER; diff --git a/graphics/java/android/graphics/drawable/DrawableInflater.java b/graphics/java/android/graphics/drawable/DrawableInflater.java index 3408b64e7536..66752a2536d3 100644 --- a/graphics/java/android/graphics/drawable/DrawableInflater.java +++ b/graphics/java/android/graphics/drawable/DrawableInflater.java @@ -23,6 +23,7 @@ import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.res.Resources; import android.content.res.Resources.Theme; +import android.os.Build; import android.util.AttributeSet; import android.view.InflateException; @@ -50,7 +51,7 @@ public final class DrawableInflater { new HashMap<>(); private final Resources mRes; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private final ClassLoader mClassLoader; /** diff --git a/graphics/java/android/graphics/drawable/DrawableWrapper.java b/graphics/java/android/graphics/drawable/DrawableWrapper.java index 98c38214adab..ebde75775e84 100644 --- a/graphics/java/android/graphics/drawable/DrawableWrapper.java +++ b/graphics/java/android/graphics/drawable/DrawableWrapper.java @@ -32,6 +32,7 @@ import android.graphics.Outline; import android.graphics.PixelFormat; import android.graphics.Rect; import android.graphics.Xfermode; +import android.os.Build; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.View; @@ -47,7 +48,7 @@ import java.io.IOException; * Drawable container with only one child element. */ public abstract class DrawableWrapper extends Drawable implements Drawable.Callback { - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private DrawableWrapperState mState; private Drawable mDrawable; private boolean mMutated; diff --git a/graphics/java/android/graphics/drawable/Icon.java b/graphics/java/android/graphics/drawable/Icon.java index 90412f417f38..32b310353b6c 100644 --- a/graphics/java/android/graphics/drawable/Icon.java +++ b/graphics/java/android/graphics/drawable/Icon.java @@ -39,6 +39,7 @@ import android.os.Handler; import android.os.Message; import android.os.Parcel; import android.os.Parcelable; +import android.os.UserHandle; import android.text.TextUtils; import android.util.Log; @@ -169,7 +170,7 @@ public final class Icon implements Parcelable { * @return The length of the compressed bitmap byte array held by this {@link #TYPE_DATA} Icon. * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public int getDataLength() { if (mType != TYPE_DATA) { throw new IllegalStateException("called getDataLength() on " + this); @@ -441,10 +442,11 @@ public final class Icon implements Parcelable { resPackage = context.getPackageName(); } if (getResources() == null && !(getResPackage().equals("android"))) { - final PackageManager pm = context.getPackageManager(); + final PackageManager pm = context.createContextAsUser( + UserHandle.of(userId), /* flags */ 0).getPackageManager(); try { // assign getResources() as the correct user - mObj1 = pm.getResourcesForApplicationAsUser(resPackage, userId); + mObj1 = pm.getResourcesForApplication(resPackage); } catch (PackageManager.NameNotFoundException e) { Log.e(TAG, String.format("Unable to find pkg=%s user=%d", getResPackage(), @@ -597,7 +599,7 @@ public final class Icon implements Parcelable { * Version of createWithResource that takes Resources. Do not use. * @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public static Icon createWithResource(Resources res, @DrawableRes int resId) { if (res == null) { throw new IllegalArgumentException("Resource must not be null."); @@ -769,7 +771,7 @@ public final class Icon implements Parcelable { } /** @hide */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) public boolean hasTint() { return (mTintList != null) || (mBlendMode != DEFAULT_BLEND_MODE); } diff --git a/graphics/java/android/graphics/drawable/InsetDrawable.java b/graphics/java/android/graphics/drawable/InsetDrawable.java index 005a4d175fd5..87c0a061c9f2 100644 --- a/graphics/java/android/graphics/drawable/InsetDrawable.java +++ b/graphics/java/android/graphics/drawable/InsetDrawable.java @@ -27,6 +27,7 @@ import android.graphics.Insets; import android.graphics.Outline; import android.graphics.PixelFormat; import android.graphics.Rect; +import android.os.Build; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.TypedValue; @@ -58,7 +59,7 @@ public class InsetDrawable extends DrawableWrapper { private final Rect mTmpRect = new Rect(); private final Rect mTmpInsetRect = new Rect(); - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private InsetState mState; /** diff --git a/graphics/java/android/graphics/drawable/LayerDrawable.java b/graphics/java/android/graphics/drawable/LayerDrawable.java index 19f29aed203f..a03f8b566ddd 100644 --- a/graphics/java/android/graphics/drawable/LayerDrawable.java +++ b/graphics/java/android/graphics/drawable/LayerDrawable.java @@ -30,6 +30,7 @@ import android.graphics.ColorFilter; import android.graphics.Outline; import android.graphics.PixelFormat; import android.graphics.Rect; +import android.os.Build; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.LayoutDirection; @@ -434,7 +435,7 @@ public class LayerDrawable extends Drawable implements Drawable.Callback { * @param layer The layer to add. * @return The index of the layer. */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) int addLayer(@NonNull ChildDrawable layer) { final LayerState st = mLayerState; final int N = st.mChildren != null ? st.mChildren.length : 0; diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index 16ffd132a41b..8677fb1b7c1e 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -36,6 +36,7 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.Shader; +import android.os.Build; import android.util.AttributeSet; import com.android.internal.R; @@ -121,7 +122,7 @@ public class RippleDrawable extends LayerDrawable { private final Rect mDirtyBounds = new Rect(); /** Mirrors mLayerState with some extra information. */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private RippleState mState; /** The masking layer, e.g. the layer with id R.id.mask. */ @@ -159,7 +160,7 @@ public class RippleDrawable extends LayerDrawable { private Paint mRipplePaint; /** Target density of the display into which ripples are drawn. */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private int mDensity; /** Whether bounds are being overridden. */ @@ -979,7 +980,7 @@ public class RippleDrawable extends LayerDrawable { static class RippleState extends LayerState { int[] mTouchThemeAttrs; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) ColorStateList mColor = ColorStateList.valueOf(Color.MAGENTA); int mMaxRadius = RADIUS_AUTO; diff --git a/graphics/java/android/graphics/drawable/ScaleDrawable.java b/graphics/java/android/graphics/drawable/ScaleDrawable.java index af7eed4b3897..7e246e552bec 100644 --- a/graphics/java/android/graphics/drawable/ScaleDrawable.java +++ b/graphics/java/android/graphics/drawable/ScaleDrawable.java @@ -25,6 +25,7 @@ import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.PixelFormat; import android.graphics.Rect; +import android.os.Build; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; @@ -67,7 +68,7 @@ public class ScaleDrawable extends DrawableWrapper { private final Rect mTmpRect = new Rect(); - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private ScaleState mState; ScaleDrawable() { diff --git a/graphics/java/android/graphics/drawable/StateListDrawable.java b/graphics/java/android/graphics/drawable/StateListDrawable.java index 88cd4625394b..af69029da9d7 100644 --- a/graphics/java/android/graphics/drawable/StateListDrawable.java +++ b/graphics/java/android/graphics/drawable/StateListDrawable.java @@ -22,6 +22,7 @@ import android.compat.annotation.UnsupportedAppUsage; import android.content.res.Resources; import android.content.res.Resources.Theme; import android.content.res.TypedArray; +import android.os.Build; import android.util.AttributeSet; import android.util.StateSet; @@ -130,7 +131,7 @@ public class StateListDrawable extends DrawableContainer { /** * Updates the constant state from the values in the typed array. */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private void updateStateFromTypedArray(TypedArray a) { final StateListState state = mStateListState; @@ -208,7 +209,7 @@ public class StateListDrawable extends DrawableContainer { * @param attrs The attribute set. * @return An array of state_ attributes. */ - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) int[] extractStateSet(AttributeSet attrs) { int j = 0; final int numAttrs = attrs.getAttributeCount(); diff --git a/graphics/java/android/graphics/drawable/VectorDrawable.java b/graphics/java/android/graphics/drawable/VectorDrawable.java index a1ccc7b7b5e4..6dcc251c2ddc 100644 --- a/graphics/java/android/graphics/drawable/VectorDrawable.java +++ b/graphics/java/android/graphics/drawable/VectorDrawable.java @@ -34,6 +34,7 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.Shader; +import android.os.Build; import android.os.Trace; import android.util.ArrayMap; import android.util.AttributeSet; @@ -324,7 +325,7 @@ public class VectorDrawable extends Drawable { private VectorDrawableState mVectorState; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private PorterDuffColorFilter mTintFilter; private BlendModeColorFilter mBlendModeColorFilter; diff --git a/graphics/java/android/graphics/fonts/Font.java b/graphics/java/android/graphics/fonts/Font.java index 97cd8ab6cae9..c07b4bcf0e72 100644 --- a/graphics/java/android/graphics/fonts/Font.java +++ b/graphics/java/android/graphics/fonts/Font.java @@ -523,6 +523,9 @@ public final class Font { /** * Returns a font file buffer. * + * Duplicate before reading values by {@link ByteBuffer#duplicate()} for avoiding unexpected + * reading position sharing. + * * @return a font buffer */ public @NonNull ByteBuffer getBuffer() { @@ -623,23 +626,82 @@ public final class Font { return mNativePtr; } + /** + * Returns true if the given font is created from the same source data from this font. + * + * This method essentially compares {@link ByteBuffer} inside Font, but has some optimization + * for faster comparing. This method compares the internal object before going to one-by-one + * byte compare with {@link ByteBuffer}. This typically works efficiently if you compares the + * font that is created from {@link Builder#Builder(Font)}. + * + * This API is typically useful for checking if two fonts can be interpolated by font variation + * axes. For example, when you call {@link android.text.TextShaper} for the same + * string but different style, you may get two font objects which is created from the same + * source but have different parameters. You may want to animate between them by interpolating + * font variation settings if these fonts are created from the same source. + * + * @param other a font object to be compared. + * @return true if given font is created from the same source from this font. Otherwise false. + */ + public boolean isSameSource(@NonNull Font other) { + Objects.requireNonNull(other); + + // Shortcut for the same instance. + if (mBuffer == other.mBuffer) { + return true; + } + + // Shortcut for different font buffer check by comparing size. + if (mBuffer.capacity() != other.mBuffer.capacity()) { + return false; + } + + // ByteBuffer#equals compares all bytes which is not performant for e.g HashMap. Since + // underlying native font object holds buffer address, check if this buffer points exactly + // the same address as a shortcut of equality. For being compatible with of API30 or before, + // check buffer position even if the buffer points the same address. + if (nIsSameBufferAddress(mNativePtr, other.mNativePtr) + && mBuffer.position() == other.mBuffer.position()) { + return true; + } + + // Unfortunately, need to compare bytes one-by-one since the buffer may be different font + // file but has the same file size, or two font has same content but they are allocated + // differently. For being compatible with API30 ore before, compare with ByteBuffer#equals. + return mBuffer.equals(other.mBuffer); + } + @Override public boolean equals(@Nullable Object o) { if (o == this) { return true; } - if (o == null || !(o instanceof Font)) { + if (!(o instanceof Font)) { return false; } Font f = (Font) o; - return mFontStyle.equals(f.mFontStyle) && f.mTtcIndex == mTtcIndex - && Arrays.equals(f.mAxes, mAxes) && f.mBuffer.equals(mBuffer) - && Objects.equals(f.mLocaleList, mLocaleList); + boolean paramEqual = mFontStyle.equals(f.mFontStyle) && f.mTtcIndex == mTtcIndex + && Arrays.equals(f.mAxes, mAxes) && Objects.equals(f.mLocaleList, mLocaleList) + && Objects.equals(mFile, f.mFile); + + if (!paramEqual) { + return false; + } + + return isSameSource(f); } @Override public int hashCode() { - return Objects.hash(mFontStyle, mTtcIndex, Arrays.hashCode(mAxes), mBuffer, mLocaleList); + return Objects.hash( + mFontStyle, + mTtcIndex, + Arrays.hashCode(mAxes), + // Use Buffer size instead of ByteBuffer#hashCode since ByteBuffer#hashCode traverse + // data which is not performant e.g. for HashMap. The hash collision are less likely + // happens because it is unlikely happens the different font files has exactly the + // same size. + mLocaleList); } @Override @@ -724,4 +786,7 @@ public final class Font { @CriticalNative private static native long nGetNativeFontPtr(long ptr); + + @CriticalNative + private static native boolean nIsSameBufferAddress(long lFontPtr, long rFontPtr); } diff --git a/graphics/java/android/graphics/fonts/FontVariationAxis.java b/graphics/java/android/graphics/fonts/FontVariationAxis.java index 4e6580ea5f53..7bd581723d18 100644 --- a/graphics/java/android/graphics/fonts/FontVariationAxis.java +++ b/graphics/java/android/graphics/fonts/FontVariationAxis.java @@ -33,7 +33,7 @@ public final class FontVariationAxis { @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023) private final int mTag; private final String mTagString; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private final float mStyleValue; /** diff --git a/graphics/java/android/graphics/pdf/PdfRenderer.java b/graphics/java/android/graphics/pdf/PdfRenderer.java index 43de4699381f..4666963b5dd4 100644 --- a/graphics/java/android/graphics/pdf/PdfRenderer.java +++ b/graphics/java/android/graphics/pdf/PdfRenderer.java @@ -25,6 +25,7 @@ import android.graphics.Bitmap.Config; import android.graphics.Matrix; import android.graphics.Point; import android.graphics.Rect; +import android.os.Build; import android.os.ParcelFileDescriptor; import android.system.ErrnoException; import android.system.Os; @@ -121,7 +122,7 @@ public final class PdfRenderer implements AutoCloseable { private ParcelFileDescriptor mInput; - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private Page mCurrentPage; /** @hide */ @@ -246,7 +247,7 @@ public final class PdfRenderer implements AutoCloseable { } } - @UnsupportedAppUsage + @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553) private void doClose() { if (mCurrentPage != null) { mCurrentPage.close(); diff --git a/graphics/java/android/graphics/text/GlyphStyle.java b/graphics/java/android/graphics/text/GlyphStyle.java deleted file mode 100644 index cc8c4d26fb5e..000000000000 --- a/graphics/java/android/graphics/text/GlyphStyle.java +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.graphics.text; - -import android.annotation.ColorInt; -import android.annotation.FloatRange; -import android.annotation.NonNull; -import android.graphics.Paint; - -import java.util.Objects; - -/** - * Represents subset of Paint parameters such as font size, scaleX that is used to draw a glyph. - * - * Glyph is a most primitive unit of text drawing. - * - */ -public class GlyphStyle { - private @ColorInt int mColor; - private float mFontSize; - private float mScaleX; - private float mSkewX; - private int mFlags; - - /** - * @param color a color. - * @param fontSize a font size in pixels. - * @param scaleX a horizontal scale factor. - * @param skewX a horizontal skew factor - * @param flags paint flags - * - * @see Paint#getFlags() - * @see Paint#setFlags(int) - */ - public GlyphStyle( - @ColorInt int color, - @FloatRange(from = 0) float fontSize, - @FloatRange(from = 0) float scaleX, - @FloatRange(from = 0) float skewX, - int flags) { - mColor = color; - mFontSize = fontSize; - mScaleX = scaleX; - mSkewX = skewX; - mFlags = flags; - } - - /** - * Create glyph style from Paint - * - * @param paint a paint - */ - public GlyphStyle(@NonNull Paint paint) { - setFromPaint(paint); - } - - /** - * Gets the color. - * - * @return a color - * @see Paint#getColor() - * @see Paint#setColor(int) - */ - public @ColorInt int getColor() { - return mColor; - } - - /** - * Sets the color. - * - * @param color a color - * @see Paint#getColor() - * @see Paint#setColor(int) - */ - public void setColor(@ColorInt int color) { - mColor = color; - } - - /** - * Gets the font size in pixels. - * - * @return font size - * @see Paint#getTextSize() - * @see Paint#setTextSize(float) - */ - public @FloatRange(from = 0) float getFontSize() { - return mFontSize; - } - - /** - * Sets the font size in pixels. - * - * @param fontSize font size in pixel - * @see Paint#getTextSize() - * @see Paint#setTextSize(float) - */ - public void setFontSize(@FloatRange(from = 0) float fontSize) { - mFontSize = fontSize; - } - - /** - * Return the horizontal scale factor - * - * @return a horizontal scale factor - * @see Paint#getTextScaleX() - * @see Paint#setTextScaleX(float) - */ - public @FloatRange(from = 0) float getScaleX() { - return mScaleX; - } - - /** - * Set the horizontal scale factor - * - * @param scaleX a horizontal scale factor - * @see Paint#getTextScaleX() - * @see Paint#setTextScaleX(float) - */ - public void setScaleX(@FloatRange(from = 0) float scaleX) { - mScaleX = scaleX; - } - - /** - * Return the horizontal skew factor - * - * @return a horizontal skew factor - * @see Paint#getTextSkewX() - * @see Paint#setTextSkewX(float) - */ - public @FloatRange(from = 0) float getSkewX() { - return mSkewX; - } - - /** - * Set the horizontal skew factor - * - * @param skewX a horizontal skew factor - * @see Paint#getTextSkewX() - * @see Paint#setTextSkewX(float) - */ - public void setSkewX(@FloatRange(from = 0) float skewX) { - mSkewX = skewX; - } - - /** - * Returns the Paint flags. - * - * @return a paint flags - * @see Paint#getFlags() - * @see Paint#setFlags(int) - */ - public int getFlags() { - return mFlags; - } - - /** - * Set the Paint flags. - * - * @param flags a paint flags - * @see Paint#getFlags() - * @see Paint#setFlags(int) - */ - public void setFlags(int flags) { - mFlags = flags; - } - - /** - * Applies glyph style to the paint object. - * - * @param paint a paint object - */ - public void applyToPaint(@NonNull Paint paint) { - paint.setColor(mColor); - paint.setTextSize(mFontSize); - paint.setTextScaleX(mScaleX); - paint.setTextSkewX(mSkewX); - paint.setFlags(mFlags); - } - - /** - * Copy parameters from a Paint object. - * - * @param paint a paint object - */ - public void setFromPaint(@NonNull Paint paint) { - mColor = paint.getColor(); - mFontSize = paint.getTextSize(); - mScaleX = paint.getTextScaleX(); - mSkewX = paint.getTextSkewX(); - mFlags = paint.getFlags(); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof GlyphStyle)) return false; - GlyphStyle that = (GlyphStyle) o; - return that.mColor == mColor - && Float.compare(that.mFontSize, mFontSize) == 0 - && Float.compare(that.mScaleX, mScaleX) == 0 - && Float.compare(that.mSkewX, mSkewX) == 0 - && mFlags == that.mFlags; - } - - @Override - public int hashCode() { - return Objects.hash(mColor, mFontSize, mScaleX, mSkewX, mFlags); - } - - @Override - public String toString() { - return "GlyphStyle{" - + "mColor=" + mColor - + ", mFontSize=" + mFontSize - + ", mScaleX=" + mScaleX - + ", mSkewX=" + mSkewX - + ", mFlags=" + mFlags - + '}'; - } -} diff --git a/graphics/java/android/graphics/text/MeasuredText.java b/graphics/java/android/graphics/text/MeasuredText.java index b6d8fa19fca8..31c3d09ed5b1 100644 --- a/graphics/java/android/graphics/text/MeasuredText.java +++ b/graphics/java/android/graphics/text/MeasuredText.java @@ -80,11 +80,11 @@ public class MeasuredText { public @FloatRange(from = 0.0) @Px float getWidth( @IntRange(from = 0) int start, @IntRange(from = 0) int end) { Preconditions.checkArgument(0 <= start && start <= mChars.length, - "start(" + start + ") must be 0 <= start <= " + mChars.length); + "start(%d) must be 0 <= start <= %d", start, mChars.length); Preconditions.checkArgument(0 <= end && end <= mChars.length, - "end(" + end + ") must be 0 <= end <= " + mChars.length); + "end(%d) must be 0 <= end <= %d", end, mChars.length); Preconditions.checkArgument(start <= end, - "start(" + start + ") is larger than end(" + end + ")"); + "start(%d) is larger than end(%d)", start, end); return nGetWidth(mNativePtr, start, end); } @@ -107,11 +107,11 @@ public class MeasuredText { public void getBounds(@IntRange(from = 0) int start, @IntRange(from = 0) int end, @NonNull Rect rect) { Preconditions.checkArgument(0 <= start && start <= mChars.length, - "start(" + start + ") must be 0 <= start <= " + mChars.length); + "start(%d) must be 0 <= start <= %d", start, mChars.length); Preconditions.checkArgument(0 <= end && end <= mChars.length, - "end(" + end + ") must be 0 <= end <= " + mChars.length); + "end(%d) must be 0 <= end <= %d", end, mChars.length); Preconditions.checkArgument(start <= end, - "start(" + start + ") is larger than end(" + end + ")"); + "start(%d) is larger than end(%d)", start, end); Preconditions.checkNotNull(rect); nGetBounds(mNativePtr, mChars, start, end, rect); } @@ -123,7 +123,7 @@ public class MeasuredText { */ public @FloatRange(from = 0.0f) @Px float getCharWidthAt(@IntRange(from = 0) int offset) { Preconditions.checkArgument(0 <= offset && offset < mChars.length, - "offset(" + offset + ") is larger than text length: " + mChars.length); + "offset(%d) is larger than text length %d" + offset, mChars.length); return nGetCharWidthAt(mNativePtr, offset); } diff --git a/graphics/java/android/graphics/text/PositionedGlyphs.java b/graphics/java/android/graphics/text/PositionedGlyphs.java index 7364d545a452..c2de0acebca9 100644 --- a/graphics/java/android/graphics/text/PositionedGlyphs.java +++ b/graphics/java/android/graphics/text/PositionedGlyphs.java @@ -35,11 +35,12 @@ import java.util.Objects; * Text shaping result object for single style text. * * You can get text shaping result by - * {@link TextShaper#shapeTextRun(char[], int, int, int, int, float, float, boolean, Paint)} and - * {@link TextShaper#shapeTextRun(CharSequence, int, int, int, int, float, float, boolean, Paint)}. + * {@link TextRunShaper#shapeTextRun(char[], int, int, int, int, float, float, boolean, Paint)} and + * {@link TextRunShaper#shapeTextRun(CharSequence, int, int, int, int, float, float, boolean, + * Paint)}. * - * @see TextShaper#shapeTextRun(char[], int, int, int, int, float, float, boolean, Paint) - * @see TextShaper#shapeTextRun(CharSequence, int, int, int, int, float, float, boolean, Paint) + * @see TextRunShaper#shapeTextRun(char[], int, int, int, int, float, float, boolean, Paint) + * @see TextRunShaper#shapeTextRun(CharSequence, int, int, int, int, float, float, boolean, Paint) */ public final class PositionedGlyphs { private static final NativeAllocationRegistry REGISTRY = @@ -49,7 +50,6 @@ public final class PositionedGlyphs { private final long mLayoutPtr; private final float mXOffset; private final float mYOffset; - private final GlyphStyle mGlyphStyle; private final ArrayList<Font> mFonts; /** @@ -62,7 +62,7 @@ public final class PositionedGlyphs { * * @return total amount of advance */ - public float getTotalAdvance() { + public float getAdvance() { return nGetTotalAdvance(mLayoutPtr); } @@ -91,21 +91,11 @@ public final class PositionedGlyphs { } /** - * Returns the glyph style used for drawing the glyph at the given index. - * - * @return A glyph style - */ - @NonNull - public GlyphStyle getStyle() { - return mGlyphStyle; - } - - /** * Returns the amount of X offset added to glyph position. * * @return The X offset added to glyph position. */ - public float getOriginX() { + public float getOffsetX() { return mXOffset; } @@ -114,7 +104,7 @@ public final class PositionedGlyphs { * * @return The Y offset added to glyph position. */ - public float getOriginY() { + public float getOffsetY() { return mYOffset; } @@ -144,7 +134,7 @@ public final class PositionedGlyphs { * Returns the glyph ID used for drawing the glyph at the given index. * * @param index the glyph index - * @return A font object + * @return An glyph ID of the font. */ @IntRange(from = 0) public int getGlyphId(@IntRange(from = 0) int index) { @@ -158,7 +148,7 @@ public final class PositionedGlyphs { * @param index the glyph index * @return A X offset in pixels */ - public float getPositionX(@IntRange(from = 0) int index) { + public float getGlyphX(@IntRange(from = 0) int index) { Preconditions.checkArgumentInRange(index, 0, glyphCount() - 1, "index"); return nGetX(mLayoutPtr, index) + mXOffset; } @@ -169,7 +159,7 @@ public final class PositionedGlyphs { * @param index the glyph index * @return A Y offset in pixels. */ - public float getPositionY(@IntRange(from = 0) int index) { + public float getGlyphY(@IntRange(from = 0) int index) { Preconditions.checkArgumentInRange(index, 0, glyphCount() - 1, "index"); return nGetY(mLayoutPtr, index) + mYOffset; } @@ -180,11 +170,9 @@ public final class PositionedGlyphs { * @hide * * @param layoutPtr the address of native layout object. - * @param paint a paint object */ - public PositionedGlyphs(long layoutPtr, @NonNull Paint paint, float xOffset, float yOffset) { + public PositionedGlyphs(long layoutPtr, float xOffset, float yOffset) { mLayoutPtr = layoutPtr; - mGlyphStyle = new GlyphStyle(paint); int glyphCount = nGetGlyphCount(layoutPtr); mFonts = new ArrayList<>(glyphCount); mXOffset = xOffset; @@ -229,14 +217,13 @@ public final class PositionedGlyphs { if (!(o instanceof PositionedGlyphs)) return false; PositionedGlyphs that = (PositionedGlyphs) o; - if (!mGlyphStyle.equals(that.mGlyphStyle)) return false; if (mXOffset != that.mXOffset || mYOffset != that.mYOffset) return false; if (glyphCount() != that.glyphCount()) return false; for (int i = 0; i < glyphCount(); ++i) { if (getGlyphId(i) != that.getGlyphId(i)) return false; - if (getPositionX(i) != that.getPositionX(i)) return false; - if (getPositionY(i) != that.getPositionY(i)) return false; + if (getGlyphX(i) != that.getGlyphX(i)) return false; + if (getGlyphY(i) != that.getGlyphY(i)) return false; // Intentionally using reference equality since font equality is heavy due to buffer // compare. if (getFont(i) != that.getFont(i)) return false; @@ -247,10 +234,10 @@ public final class PositionedGlyphs { @Override public int hashCode() { - int hashCode = Objects.hash(mXOffset, mYOffset, mGlyphStyle); + int hashCode = Objects.hash(mXOffset, mYOffset); for (int i = 0; i < glyphCount(); ++i) { hashCode = Objects.hash(hashCode, - getGlyphId(i), getPositionX(i), getPositionY(i), getFont(i)); + getGlyphId(i), getGlyphX(i), getGlyphY(i), getFont(i)); } return hashCode; } @@ -263,7 +250,7 @@ public final class PositionedGlyphs { sb.append(", "); } sb.append("[ ID = " + getGlyphId(i) + "," - + " pos = (" + getPositionX(i) + "," + getPositionY(i) + ")" + + " pos = (" + getGlyphX(i) + "," + getGlyphY(i) + ")" + " font = " + getFont(i) + " ]"); } sb.append("]"); @@ -271,7 +258,6 @@ public final class PositionedGlyphs { + "glyphs = " + sb.toString() + ", mXOffset=" + mXOffset + ", mYOffset=" + mYOffset - + ", mGlyphStyle=" + mGlyphStyle + '}'; } } diff --git a/graphics/java/android/graphics/text/TextShaper.java b/graphics/java/android/graphics/text/TextRunShaper.java index f40ed8f8f653..8459e7bfe191 100644 --- a/graphics/java/android/graphics/text/TextShaper.java +++ b/graphics/java/android/graphics/text/TextRunShaper.java @@ -19,6 +19,7 @@ package android.graphics.text; import android.annotation.NonNull; import android.graphics.Paint; import android.text.TextDirectionHeuristic; +import android.text.TextPaint; import android.text.TextUtils; import com.android.internal.util.Preconditions; @@ -31,15 +32,18 @@ import dalvik.annotation.optimization.FastNative; * Text shaping is a preprocess for drawing text into canvas with glyphs. The glyph is a most * primitive unit of the text drawing, consist of glyph identifier in the font file and its position * and style. You can draw the shape result to Canvas by calling Canvas#drawGlyphs. - * - * @see TextShaper#shapeTextRun(CharSequence, int, int, int, int, float, float, boolean, Paint) - * @see TextShaper#shapeTextRun(char[], int, int, int, int, float, float, boolean, Paint) - * @see android.text.StyledTextShaper#shapeText(CharSequence, int, int, TextDirectionHeuristic, - * TextPaint) + * For most of the use cases, {@link android.text.TextShaper} will provide text shaping + * functionalities needed. {@link TextRunShaper} is a lower level API that is used by + * {@link android.text.TextShaper}. + * + * @see TextRunShaper#shapeTextRun(CharSequence, int, int, int, int, float, float, boolean, Paint) + * @see TextRunShaper#shapeTextRun(char[], int, int, int, int, float, float, boolean, Paint) + * @see android.text.TextShaper#shapeText(CharSequence, int, int, TextDirectionHeuristic, TextPaint, + * TextShaper.GlyphsConsumer) */ -public class TextShaper { - private TextShaper() {} // Do not instantiate +public class TextRunShaper { + private TextRunShaper() {} // Do not instantiate /** * Shape non-styled text. @@ -68,7 +72,7 @@ public class TextShaper { return new PositionedGlyphs( nativeShapeTextRun(text, start, count, contextStart, contextCount, isRtl, paint.getNativeInstance()), - paint, xOffset, yOffset); + xOffset, yOffset); } /** @@ -100,7 +104,7 @@ public class TextShaper { nativeShapeTextRun( (String) text, start, count, contextStart, contextCount, isRtl, paint.getNativeInstance()), - paint, xOffset, yOffset); + xOffset, yOffset); } else { char[] buf = new char[contextCount]; TextUtils.getChars(text, contextStart, contextStart + contextCount, buf, 0); @@ -108,7 +112,7 @@ public class TextShaper { nativeShapeTextRun( buf, start - contextStart, count, 0, contextCount, isRtl, paint.getNativeInstance()), - paint, xOffset, yOffset); + xOffset, yOffset); } } |