diff --git a/core/api/current.txt b/core/api/current.txt index 2c5529a84147e..fcb3a14d3cecc 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -15644,26 +15644,31 @@ package android.graphics { } public class MeshSpecification { - method @NonNull public static android.graphics.MeshSpecification make(@NonNull java.util.List, int, @NonNull java.util.List, @NonNull String, @NonNull String); - method @NonNull public static android.graphics.MeshSpecification make(@NonNull java.util.List, int, @NonNull java.util.List, @NonNull String, @NonNull String, @NonNull android.graphics.ColorSpace); - method @NonNull public static android.graphics.MeshSpecification make(@NonNull java.util.List, int, @NonNull java.util.List, @NonNull String, @NonNull String, @NonNull android.graphics.ColorSpace, int); - field public static final int FLOAT = 0; // 0x0 - field public static final int FLOAT2 = 1; // 0x1 - field public static final int FLOAT3 = 2; // 0x2 - field public static final int FLOAT4 = 3; // 0x3 - field public static final int OPAQUE = 1; // 0x1 - field public static final int PREMUL = 2; // 0x2 - field public static final int UBYTE4 = 4; // 0x4 - field public static final int UNKNOWN = 0; // 0x0 - field public static final int UNPREMULT = 3; // 0x3 + method @NonNull public static android.graphics.MeshSpecification make(@NonNull @Size(max=8) android.graphics.MeshSpecification.Attribute[], @IntRange(from=1, to=1024) int, @NonNull @Size(max=6) android.graphics.MeshSpecification.Varying[], @NonNull String, @NonNull String); + method @NonNull public static android.graphics.MeshSpecification make(@NonNull @Size(max=8) android.graphics.MeshSpecification.Attribute[], @IntRange(from=1, to=1024) int, @NonNull @Size(max=6) android.graphics.MeshSpecification.Varying[], @NonNull String, @NonNull String, @NonNull android.graphics.ColorSpace); + method @NonNull public static android.graphics.MeshSpecification make(@NonNull @Size(max=8) android.graphics.MeshSpecification.Attribute[], @IntRange(from=1, to=1024) int, @NonNull @Size(max=6) android.graphics.MeshSpecification.Varying[], @NonNull String, @NonNull String, @NonNull android.graphics.ColorSpace, int); + field public static final int ALPHA_TYPE_OPAQUE = 1; // 0x1 + field public static final int ALPHA_TYPE_PREMUL = 2; // 0x2 + field public static final int ALPHA_TYPE_PREMULT = 3; // 0x3 + field public static final int ALPHA_TYPE_UNKNOWN = 0; // 0x0 + field public static final int TYPE_FLOAT = 0; // 0x0 + field public static final int TYPE_FLOAT2 = 1; // 0x1 + field public static final int TYPE_FLOAT3 = 2; // 0x2 + field public static final int TYPE_FLOAT4 = 3; // 0x3 + field public static final int TYPE_UBYTE4 = 4; // 0x4 } public static class MeshSpecification.Attribute { ctor public MeshSpecification.Attribute(int, int, @NonNull String); + method @NonNull public String getName(); + method public int getOffset(); + method public int getType(); } public static class MeshSpecification.Varying { ctor public MeshSpecification.Varying(int, @NonNull String); + method @NonNull public String getName(); + method public int getType(); } @Deprecated public class Movie { diff --git a/graphics/java/android/graphics/MeshSpecification.java b/graphics/java/android/graphics/MeshSpecification.java index 52b40029a0eba..6b5f1da2663b9 100644 --- a/graphics/java/android/graphics/MeshSpecification.java +++ b/graphics/java/android/graphics/MeshSpecification.java @@ -17,11 +17,15 @@ package android.graphics; import android.annotation.IntDef; +import android.annotation.IntRange; import android.annotation.NonNull; +import android.annotation.Size; +import android.annotation.SuppressLint; import libcore.util.NativeAllocationRegistry; -import java.util.List; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; /** * Class responsible for holding specifications for {@link Mesh} creations. This class @@ -43,100 +47,162 @@ public class MeshSpecification { long mNativeMeshSpec; /** - * Constants for {@link #make(List, int, List, String, String)} + * Constants for {@link #make(Attribute[], int, Varying[], String, String)} * to determine alpha type. Describes how to interpret the alpha component of a pixel. + * + * @hide */ - @IntDef({UNKNOWN, OPAQUE, PREMUL, UNPREMULT}) + @IntDef({ALPHA_TYPE_UNKNOWN, ALPHA_TYPE_OPAQUE, ALPHA_TYPE_PREMUL, ALPHA_TYPE_PREMULT}) + @Retention(RetentionPolicy.SOURCE) private @interface AlphaType {} /** * uninitialized. */ - public static final int UNKNOWN = 0; + public static final int ALPHA_TYPE_UNKNOWN = 0; /** * Pixel is opaque. */ - public static final int OPAQUE = 1; + public static final int ALPHA_TYPE_OPAQUE = 1; /** * Pixel components are premultiplied by alpha. */ - public static final int PREMUL = 2; + public static final int ALPHA_TYPE_PREMUL = 2; /** * Pixel components are independent of alpha. */ - public static final int UNPREMULT = 3; + public static final int ALPHA_TYPE_PREMULT = 3; /** * Constants for {@link Attribute} and {@link Varying} for determining the data type. + * + * @hide */ - @IntDef({FLOAT, FLOAT2, FLOAT3, FLOAT4, UBYTE4}) + @IntDef({TYPE_FLOAT, TYPE_FLOAT2, TYPE_FLOAT3, TYPE_FLOAT4, TYPE_UBYTE4}) + @Retention(RetentionPolicy.SOURCE) private @interface Type {} /** * Represents one float. Its equivalent shader type is float. */ - public static final int FLOAT = 0; + public static final int TYPE_FLOAT = 0; /** * Represents two floats. Its equivalent shader type is float2. */ - public static final int FLOAT2 = 1; + public static final int TYPE_FLOAT2 = 1; /** * Represents three floats. Its equivalent shader type is float3. */ - public static final int FLOAT3 = 2; + public static final int TYPE_FLOAT3 = 2; /** * Represents four floats. Its equivalent shader type is float4. */ - public static final int FLOAT4 = 3; + public static final int TYPE_FLOAT4 = 3; /** * Represents four bytes. Its equivalent shader type is half4. */ - public static final int UBYTE4 = 4; + public static final int TYPE_UBYTE4 = 4; /** - * Data class to represent a single attribute in a shader. Note that type parameter must be - * one of {@link #FLOAT}, {@link #FLOAT2}, {@link #FLOAT3}, {@link #FLOAT4}, or {@link #UBYTE4}. + * Data class to represent a single attribute in a shader. * * Note that offset is the offset in number of bytes. For example, if we had two attributes * + *
      * Float3 att1
      * Float att2
+     * 
* * att1 would have an offset of 0, while att2 would have an offset of 12 bytes. */ public static class Attribute { @Type - private int mType; - private int mOffset; - private String mName; + private final int mType; + private final int mOffset; + private final String mName; public Attribute(@Type int type, int offset, @NonNull String name) { mType = type; mOffset = offset; mName = name; } + + /** + * Return the corresponding data type for this {@link Attribute}. + */ + @Type + public int getType() { + return mType; + } + + /** + * Return the offset of the attribute in bytes + */ + public int getOffset() { + return mOffset; + } + + /** + * Return the name of this {@link Attribute} + */ + @NonNull + public String getName() { + return mName; + } + + @Override + public String toString() { + return "Attribute{" + + "mType=" + mType + + ", mOffset=" + mOffset + + ", mName='" + mName + '\'' + + '}'; + } } /** - * Data class to represent a single varying variable. Note that type parameter must be - * one of {@link #FLOAT}, {@link #FLOAT2}, {@link #FLOAT3}, {@link #FLOAT4}, or {@link #UBYTE4}. + * Data class to represent a single varying variable. */ public static class Varying { @Type - private int mType; - private String mName; + private final int mType; + private final String mName; public Varying(@Type int type, @NonNull String name) { mType = type; mName = name; } + + /** + * Return the corresponding data type for this {@link Varying}. + */ + @Type + public int getType() { + return mType; + } + + /** + * Return the name of this {@link Varying} + */ + @NonNull + public String getName() { + return mName; + } + + @Override + public String toString() { + return "Varying{" + + "mType=" + mType + + ", mName='" + mName + '\'' + + '}'; + } } private static class MeshSpecificationHolder { @@ -146,7 +212,9 @@ public class MeshSpecification { } /** - * Creates a {@link MeshSpecification} object for use within {@link Mesh}. + * Creates a {@link MeshSpecification} object for use within {@link Mesh}. This uses a default + * color space of {@link ColorSpace.Named#SRGB} and {@link AlphaType} of + * {@link #ALPHA_TYPE_PREMUL}. * * @param attributes list of attributes represented by {@link Attribute}. Can hold a max of * 8. @@ -162,11 +230,14 @@ public class MeshSpecification { * @return {@link MeshSpecification} object for use when creating {@link Mesh} */ @NonNull - public static MeshSpecification make(@NonNull List attributes, int vertexStride, - @NonNull List varyings, @NonNull String vertexShader, + public static MeshSpecification make( + @SuppressLint("ArrayReturn") @NonNull @Size(max = 8) Attribute[] attributes, + @IntRange(from = 1, to = 1024) int vertexStride, + @SuppressLint("ArrayReturn") @NonNull @Size(max = 6) Varying[] varyings, + @NonNull String vertexShader, @NonNull String fragmentShader) { - long nativeMeshSpec = nativeMake(attributes.toArray(new Attribute[attributes.size()]), - vertexStride, varyings.toArray(new Varying[varyings.size()]), vertexShader, + long nativeMeshSpec = nativeMake(attributes, + vertexStride, varyings, vertexShader, fragmentShader); if (nativeMeshSpec == 0) { throw new IllegalArgumentException("MeshSpecification construction failed"); @@ -175,7 +246,8 @@ public class MeshSpecification { } /** - * Creates a {@link MeshSpecification} object. + * Creates a {@link MeshSpecification} object. This uses a default {@link AlphaType} of + * {@link #ALPHA_TYPE_PREMUL}. * * @param attributes list of attributes represented by {@link Attribute}. Can hold a max of * 8. @@ -192,11 +264,16 @@ public class MeshSpecification { * @return {@link MeshSpecification} object for use when creating {@link Mesh} */ @NonNull - public static MeshSpecification make(@NonNull List attributes, int vertexStride, - @NonNull List varyings, @NonNull String vertexShader, - @NonNull String fragmentShader, @NonNull ColorSpace colorSpace) { - long nativeMeshSpec = nativeMakeWithCS(attributes.toArray(new Attribute[attributes.size()]), - vertexStride, varyings.toArray(new Varying[varyings.size()]), vertexShader, + public static MeshSpecification make( + @SuppressLint("ArrayReturn") @NonNull @Size(max = 8) Attribute[] attributes, + @IntRange(from = 1, to = 1024) int vertexStride, + @SuppressLint("ArrayReturn") @NonNull @Size(max = 6) Varying[] varyings, + @NonNull String vertexShader, + @NonNull String fragmentShader, + @NonNull ColorSpace colorSpace + ) { + long nativeMeshSpec = nativeMakeWithCS(attributes, + vertexStride, varyings, vertexShader, fragmentShader, colorSpace.getNativeInstance()); if (nativeMeshSpec == 0) { throw new IllegalArgumentException("MeshSpecification construction failed"); @@ -221,20 +298,23 @@ public class MeshSpecification { * @param colorSpace {@link ColorSpace} to tell what color space to work in. * @param alphaType Describes how to interpret the alpha component for a pixel. Must be * one of - * {@link MeshSpecification#UNKNOWN}, - * {@link MeshSpecification#OPAQUE}, - * {@link MeshSpecification#PREMUL}, or - * {@link MeshSpecification#UNPREMULT} + * {@link MeshSpecification#ALPHA_TYPE_UNKNOWN}, + * {@link MeshSpecification#ALPHA_TYPE_OPAQUE}, + * {@link MeshSpecification#ALPHA_TYPE_PREMUL}, or + * {@link MeshSpecification#ALPHA_TYPE_PREMULT} * @return {@link MeshSpecification} object for use when creating {@link Mesh} */ @NonNull - public static MeshSpecification make(@NonNull List attributes, int vertexStride, - @NonNull List varyings, @NonNull String vertexShader, - @NonNull String fragmentShader, @NonNull ColorSpace colorSpace, + public static MeshSpecification make( + @SuppressLint("ArrayReturn") @NonNull @Size(max = 8) Attribute[] attributes, + @IntRange(from = 1, to = 1024) int vertexStride, + @SuppressLint("ArrayReturn") @NonNull @Size(max = 6) Varying[] varyings, + @NonNull String vertexShader, + @NonNull String fragmentShader, + @NonNull ColorSpace colorSpace, @AlphaType int alphaType) { long nativeMeshSpec = - nativeMakeWithAlpha(attributes.toArray(new Attribute[attributes.size()]), - vertexStride, varyings.toArray(new Varying[varyings.size()]), vertexShader, + nativeMakeWithAlpha(attributes, vertexStride, varyings, vertexShader, fragmentShader, colorSpace.getNativeInstance(), alphaType); if (nativeMeshSpec == 0) { throw new IllegalArgumentException("MeshSpecification construction failed"); diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/MeshActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/MeshActivity.java index 413f92c5446bd..ae3dcb834687d 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/MeshActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/MeshActivity.java @@ -32,7 +32,6 @@ import android.view.View; import java.nio.FloatBuffer; import java.nio.ShortBuffer; -import java.util.ArrayList; public class MeshActivity extends Activity { @Override @@ -115,9 +114,11 @@ public class MeshActivity extends Activity { + " color = vec4(1.0, 0.0, 0.0, 1.0);" + " return varyings.position;\n" + "}"; - ArrayList attList = new ArrayList<>(); - attList.add(new Attribute(MeshSpecification.FLOAT2, 0, "position")); - ArrayList varyList = new ArrayList<>(); + Attribute[] attList = new Attribute[]{ + new Attribute(MeshSpecification.TYPE_FLOAT2, 0, "position"), + + }; + Varying[] varyList = new Varying[0]; return MeshSpecification.make(attList, 8, varyList, vs, fs); } } diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/MeshLargeActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/MeshLargeActivity.java index e62db6bd6c025..01ca2fcdbb867 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/MeshLargeActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/MeshLargeActivity.java @@ -32,7 +32,6 @@ import android.view.View; import java.nio.FloatBuffer; import java.nio.ShortBuffer; -import java.util.ArrayList; public class MeshLargeActivity extends Activity { @Override @@ -131,44 +130,37 @@ public class MeshLargeActivity extends Activity { + " color = vec4(1.0, 0.0, 0.0, 1.0);" + " return varyings.position;\n" + "}"; - ArrayList attList = new ArrayList<>(); - attList.add(new Attribute(MeshSpecification.FLOAT2, 0, "position")); - attList.add(new Attribute( - MeshSpecification.FLOAT4, - 8, - "test" - )); - attList.add(new Attribute( - MeshSpecification.FLOAT4, - 24, - "test2" - )); - attList.add(new Attribute( - MeshSpecification.FLOAT4, - 40, - "test3" - )); - attList.add(new Attribute( - MeshSpecification.FLOAT4, - 56, - "test4" - )); - attList.add(new Attribute( - MeshSpecification.FLOAT4, - 72, - "test5" - )); - attList.add(new Attribute( - MeshSpecification.FLOAT4, - 88, - "test6" - )); - attList.add(new Attribute( - MeshSpecification.FLOAT4, - 104, - "test7" - )); - ArrayList varyList = new ArrayList<>(); + Attribute[] attList = new Attribute[]{ + new Attribute(MeshSpecification.TYPE_FLOAT2, 0, "position"), + new Attribute(MeshSpecification.TYPE_FLOAT4, 8, "test"), + new Attribute(MeshSpecification.TYPE_FLOAT4, 24, "test2"), + new Attribute( + MeshSpecification.TYPE_FLOAT4, + 40, + "test3" + ), + new Attribute( + MeshSpecification.TYPE_FLOAT4, + 56, + "test4" + ), + new Attribute( + MeshSpecification.TYPE_FLOAT4, + 72, + "test5" + ), + new Attribute( + MeshSpecification.TYPE_FLOAT4, + 88, + "test6" + ), + new Attribute( + MeshSpecification.TYPE_FLOAT4, + 104, + "test7" + ) + }; + Varying[] varyList = new Varying[0]; return MeshSpecification.make(attList, 120, varyList, vs, fs); } }