// Signature format: 3.0
package androidx.ui.core {

  public final class RectHelperKt {
    method public static android.graphics.Rect toAndroidRect(androidx.ui.geometry.Rect);
    method public static android.graphics.RectF toAndroidRectF(androidx.ui.geometry.Rect);
    method public static androidx.ui.geometry.Rect toComposeRect(android.graphics.Rect);
  }

}

package androidx.ui.graphics {

  public final class AndroidBlendModeKt {
  }

  public final class AndroidCanvasKt {
    method public static androidx.ui.graphics.Canvas Canvas(android.graphics.Canvas c);
  }

  public final class AndroidImageAssetKt {
    method public static android.graphics.Bitmap asAndroidBitmap(androidx.ui.graphics.ImageAsset);
    method public static androidx.ui.graphics.ImageAsset asImageAsset(android.graphics.Bitmap);
    method public static androidx.ui.graphics.ImageAsset imageFromResource(android.content.res.Resources res, int resId);
  }

  public final class AndroidPaint implements androidx.ui.graphics.Paint {
    ctor public AndroidPaint();
    method public android.graphics.Paint asFrameworkPaint();
    method public float getAlpha();
    method public androidx.ui.graphics.BlendMode getBlendMode();
    method public long getColor();
    method public androidx.ui.graphics.ColorFilter? getColorFilter();
    method public androidx.ui.graphics.FilterQuality getFilterQuality();
    method public android.graphics.PathEffect? getNativePathEffect();
    method public android.graphics.Shader? getShader();
    method public androidx.ui.graphics.StrokeCap getStrokeCap();
    method public androidx.ui.graphics.StrokeJoin getStrokeJoin();
    method public float getStrokeMiterLimit();
    method public float getStrokeWidth();
    method public androidx.ui.graphics.PaintingStyle getStyle();
    method public boolean isAntiAlias();
    method public void setAlpha(float value);
    method public void setAntiAlias(boolean value);
    method public void setBlendMode(androidx.ui.graphics.BlendMode value);
    method public void setColor-QEYXlZo(long color);
    method public void setColorFilter(androidx.ui.graphics.ColorFilter? value);
    method public void setFilterQuality(androidx.ui.graphics.FilterQuality value);
    method public void setNativePathEffect(android.graphics.PathEffect? value);
    method public void setShader(android.graphics.Shader? value);
    method public void setStrokeCap(androidx.ui.graphics.StrokeCap value);
    method public void setStrokeJoin(androidx.ui.graphics.StrokeJoin value);
    method public void setStrokeMiterLimit(float value);
    method public void setStrokeWidth(float value);
    method public void setStyle(androidx.ui.graphics.PaintingStyle value);
    property public float alpha;
    property public androidx.ui.graphics.BlendMode blendMode;
    property public long color;
    property public androidx.ui.graphics.ColorFilter? colorFilter;
    property public androidx.ui.graphics.FilterQuality filterQuality;
    property public boolean isAntiAlias;
    property public android.graphics.PathEffect? nativePathEffect;
    property public android.graphics.Shader? shader;
    property public androidx.ui.graphics.StrokeCap strokeCap;
    property public androidx.ui.graphics.StrokeJoin strokeJoin;
    property public float strokeMiterLimit;
    property public float strokeWidth;
    property public androidx.ui.graphics.PaintingStyle style;
  }

  public final class AndroidPaintKt {
    method public static androidx.ui.graphics.Paint Paint();
  }

  public final class AndroidPath implements androidx.ui.graphics.Path {
    ctor public AndroidPath(android.graphics.Path internalPath);
    ctor public AndroidPath();
    method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
    method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
    method public void addOval(androidx.ui.geometry.Rect oval);
    method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset);
    method public void addRRect(androidx.ui.geometry.RRect rrect);
    method public void addRect(androidx.ui.geometry.Rect rect);
    method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
    method public void close();
    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
    method public androidx.ui.geometry.Rect getBounds();
    method public androidx.ui.graphics.PathFillType getFillType();
    method public android.graphics.Path getInternalPath();
    method public boolean isConvex();
    method public boolean isEmpty();
    method public void lineTo(float x, float y);
    method public void moveTo(float x, float y);
    method public boolean op(androidx.ui.graphics.Path path1, androidx.ui.graphics.Path path2, androidx.ui.graphics.PathOperation operation);
    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
    method public void relativeLineTo(float dx, float dy);
    method public void relativeMoveTo(float dx, float dy);
    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
    method public void reset();
    method public void setFillType(androidx.ui.graphics.PathFillType value);
    method public void shift(androidx.ui.geometry.Offset offset);
    property public androidx.ui.graphics.PathFillType fillType;
    property public boolean isConvex;
    property public boolean isEmpty;
  }

  public final class AndroidPathKt {
    method public static androidx.ui.graphics.Path Path();
    method public static inline android.graphics.Path asAndroidPath(androidx.ui.graphics.Path);
    method public static androidx.ui.graphics.Path asComposePath(android.graphics.Path);
  }

  public final class AndroidPathMeasureKt {
    method public static androidx.ui.graphics.PathMeasure PathMeasure();
  }

  public final class AndroidShaderKt {
  }

  public final class AndroidTileModeKt {
    method public static android.graphics.Shader.TileMode toNativeTileMode(androidx.ui.graphics.TileMode);
  }

  public final class AndroidVertexModeKt {
    method public static android.graphics.Canvas.VertexMode toNativeVertexMode(androidx.ui.graphics.VertexMode);
  }

  public enum BlendMode {
    method public static androidx.ui.graphics.BlendMode valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.BlendMode[] values();
    enum_constant public static final androidx.ui.graphics.BlendMode clear;
    enum_constant public static final androidx.ui.graphics.BlendMode color;
    enum_constant public static final androidx.ui.graphics.BlendMode colorBurn;
    enum_constant public static final androidx.ui.graphics.BlendMode colorDodge;
    enum_constant public static final androidx.ui.graphics.BlendMode darken;
    enum_constant public static final androidx.ui.graphics.BlendMode difference;
    enum_constant public static final androidx.ui.graphics.BlendMode dst;
    enum_constant public static final androidx.ui.graphics.BlendMode dstATop;
    enum_constant public static final androidx.ui.graphics.BlendMode dstIn;
    enum_constant public static final androidx.ui.graphics.BlendMode dstOut;
    enum_constant public static final androidx.ui.graphics.BlendMode dstOver;
    enum_constant public static final androidx.ui.graphics.BlendMode exclusion;
    enum_constant public static final androidx.ui.graphics.BlendMode hardLight;
    enum_constant public static final androidx.ui.graphics.BlendMode hue;
    enum_constant public static final androidx.ui.graphics.BlendMode lighten;
    enum_constant public static final androidx.ui.graphics.BlendMode luminosity;
    enum_constant public static final androidx.ui.graphics.BlendMode modulate;
    enum_constant public static final androidx.ui.graphics.BlendMode multiply;
    enum_constant public static final androidx.ui.graphics.BlendMode overlay;
    enum_constant public static final androidx.ui.graphics.BlendMode plus;
    enum_constant public static final androidx.ui.graphics.BlendMode saturation;
    enum_constant public static final androidx.ui.graphics.BlendMode screen;
    enum_constant public static final androidx.ui.graphics.BlendMode softLight;
    enum_constant public static final androidx.ui.graphics.BlendMode src;
    enum_constant public static final androidx.ui.graphics.BlendMode srcATop;
    enum_constant public static final androidx.ui.graphics.BlendMode srcIn;
    enum_constant public static final androidx.ui.graphics.BlendMode srcOut;
    enum_constant public static final androidx.ui.graphics.BlendMode srcOver;
    enum_constant public static final androidx.ui.graphics.BlendMode xor;
  }

  public abstract sealed class Brush {
    method public abstract void applyTo(androidx.ui.graphics.Paint p, float alpha);
  }

  public final class BrushKt {
    method public static androidx.ui.graphics.LinearGradient HorizontalGradient(java.util.List<androidx.ui.graphics.Color> colors, float startX, float endX, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
    method public static androidx.ui.graphics.LinearGradient HorizontalGradient(kotlin.Pair<java.lang.Float,androidx.ui.graphics.Color>![] colorStops, float startX, float endX, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
    method public static androidx.ui.graphics.LinearGradient LinearGradient(java.util.List<androidx.ui.graphics.Color> colors, float startX, float startY, float endX, float endY, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
    method public static androidx.ui.graphics.LinearGradient LinearGradient(kotlin.Pair<java.lang.Float,androidx.ui.graphics.Color>![] colorStops, float startX, float startY, float endX, float endY, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
    method public static androidx.ui.graphics.RadialGradient RadialGradient(kotlin.Pair<java.lang.Float,androidx.ui.graphics.Color>![] colorStops, float centerX, float centerY, float radius, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
    method public static androidx.ui.graphics.RadialGradient RadialGradient(java.util.List<androidx.ui.graphics.Color> colors, float centerX, float centerY, float radius, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
    method public static androidx.ui.graphics.LinearGradient VerticalGradient(java.util.List<androidx.ui.graphics.Color> colors, float startY, float endY, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
    method public static androidx.ui.graphics.LinearGradient VerticalGradient(kotlin.Pair<java.lang.Float,androidx.ui.graphics.Color>![] colorStops, float startY, float endY, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
  }

  public interface Canvas {
    method public void clipPath(androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
    method public default void clipRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
    method public void clipRect(float left, float top, float right, float bottom, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
    method public void concat(androidx.ui.graphics.vectormath.Matrix4 matrix4);
    method public void disableZ();
    method public default void drawArc(androidx.ui.geometry.Rect rect, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
    method public void drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.graphics.Paint paint);
    method public default void drawArcRad(androidx.ui.geometry.Rect rect, float startAngleRad, float sweepAngleRad, boolean useCenter, androidx.ui.graphics.Paint paint);
    method public void drawCircle(androidx.ui.geometry.Offset center, float radius, androidx.ui.graphics.Paint paint);
    method public void drawImage(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Offset topLeftOffset, androidx.ui.graphics.Paint paint);
    method public void drawImageRect(androidx.ui.graphics.ImageAsset image, androidx.ui.unit.IntOffset srcOffset = IntOffset.Origin, androidx.ui.unit.IntSize srcSize = IntSize(image.width, image.height), androidx.ui.unit.IntOffset dstOffset = IntOffset.Origin, androidx.ui.unit.IntSize dstSize = srcSize, androidx.ui.graphics.Paint paint);
    method public void drawLine(androidx.ui.geometry.Offset p1, androidx.ui.geometry.Offset p2, androidx.ui.graphics.Paint paint);
    method public default void drawOval(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
    method public void drawOval(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
    method public void drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Paint paint);
    method public void drawPoints(androidx.ui.graphics.PointMode pointMode, java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.Paint paint);
    method public void drawRawPoints(androidx.ui.graphics.PointMode pointMode, float[] points, androidx.ui.graphics.Paint paint);
    method public default void drawRect(androidx.ui.geometry.Rect rect, androidx.ui.graphics.Paint paint);
    method public void drawRect(float left, float top, float right, float bottom, androidx.ui.graphics.Paint paint);
    method public void drawRoundRect(float left, float top, float right, float bottom, float radiusX, float radiusY, androidx.ui.graphics.Paint paint);
    method public void drawVertices(androidx.ui.graphics.Vertices vertices, androidx.ui.graphics.BlendMode blendMode, androidx.ui.graphics.Paint paint);
    method public void enableZ();
    method public android.graphics.Canvas getNativeCanvas();
    method public void restore();
    method public void rotate(float degrees);
    method public void save();
    method public void saveLayer(androidx.ui.geometry.Rect bounds, androidx.ui.graphics.Paint paint);
    method public void scale(float sx, float sy = sx);
    method public void skew(float sx, float sy);
    method public default void skewRad(float sxRad, float syRad);
    method public void translate(float dx, float dy);
    property public abstract android.graphics.Canvas nativeCanvas;
  }

  public final class CanvasHolder {
    ctor public CanvasHolder();
    method public inline void drawInto(android.graphics.Canvas targetCanvas, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.Canvas,kotlin.Unit> block);
  }

  public final class CanvasKt {
    method public static androidx.ui.graphics.Canvas Canvas(androidx.ui.graphics.ImageAsset image);
    method public static void rotate(androidx.ui.graphics.Canvas, float degrees, float pivotX, float pivotY);
    method public static void rotateRad(androidx.ui.graphics.Canvas, float radians, float pivotX = 0.0f, float pivotY = 0.0f);
    method public static void scale(androidx.ui.graphics.Canvas, float sx, float sy = sx, float pivotX, float pivotY);
    method public static inline void withSave(androidx.ui.graphics.Canvas, kotlin.jvm.functions.Function0<kotlin.Unit> block);
    method public static inline void withSaveLayer(androidx.ui.graphics.Canvas, androidx.ui.geometry.Rect bounds, androidx.ui.graphics.Paint paint, kotlin.jvm.functions.Function0<kotlin.Unit> block);
  }

  public enum ClipOp {
    method public static androidx.ui.graphics.ClipOp valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.ClipOp[] values();
    enum_constant public static final androidx.ui.graphics.ClipOp difference;
    enum_constant public static final androidx.ui.graphics.ClipOp intersect;
  }

  @androidx.compose.Immutable public final inline class Color {
    ctor public Color();
    method @androidx.compose.Stable public static operator float component1-impl(long $this);
    method @androidx.compose.Stable public static operator float component2-impl(long $this);
    method @androidx.compose.Stable public static operator float component3-impl(long $this);
    method @androidx.compose.Stable public static operator float component4-impl(long $this);
    method @androidx.compose.Stable public static operator androidx.ui.graphics.colorspace.ColorSpace component5-impl(long $this);
    method public static long constructor-impl(long value);
    method public static long convert-impl(long $this, androidx.ui.graphics.colorspace.ColorSpace colorSpace);
    method @androidx.compose.Stable public static long copy-impl(long $this, float alpha = this.alpha, float red = this.red, float green = this.green, float blue = this.blue);
    method @androidx.compose.Immutable public static inline boolean equals-impl(long p, Object? p1);
    method public static boolean equals-impl0(long p1, long p2);
    method public static float getAlpha-impl(long $this);
    method public static float getBlue-impl(long $this);
    method public static androidx.ui.graphics.colorspace.ColorSpace getColorSpace-impl(long $this);
    method public static float getGreen-impl(long $this);
    method public static float getRed-impl(long $this);
    method public long getValue();
    method @androidx.compose.Immutable public static inline int hashCode-impl(long p);
    method public static String toString-impl(long $this);
    field public static final androidx.ui.graphics.Color.Companion Companion;
  }

  public static final class Color.Companion {
    method public long getBlack();
    method public long getBlue();
    method public long getCyan();
    method public long getDarkGray();
    method public long getGray();
    method public long getGreen();
    method public long getLightGray();
    method public long getMagenta();
    method public long getRed();
    method public long getTransparent();
    method public long getUnset();
    method public long getWhite();
    method public long getYellow();
    property public final long Black;
    property public final long Blue;
    property public final long Cyan;
    property public final long DarkGray;
    property public final long Gray;
    property public final long Green;
    property public final long LightGray;
    property public final long Magenta;
    property public final long Red;
    property public final long Transparent;
    property public final long Unset;
    property public final long White;
    property public final long Yellow;
  }

  @androidx.compose.Immutable public final class ColorFilter {
    method public long component1();
    method public androidx.ui.graphics.BlendMode component2();
    method @androidx.compose.Immutable public androidx.ui.graphics.ColorFilter copy-vOa7YyA(long color, androidx.ui.graphics.BlendMode blendMode);
    method public androidx.ui.graphics.BlendMode getBlendMode();
    method public long getColor();
    field public static final androidx.ui.graphics.ColorFilter.Companion Companion;
  }

  public static final class ColorFilter.Companion {
    method @androidx.compose.Stable public androidx.ui.graphics.ColorFilter tint-QEYXlZo(long color);
  }

  public final class ColorKt {
    method @androidx.compose.Stable public static long Color(float red, float green, float blue, float alpha = 1f, androidx.ui.graphics.colorspace.ColorSpace colorSpace = ColorSpaces.Srgb);
    method @androidx.compose.Stable public static long Color(@ColorInt int color);
    method @androidx.compose.Stable public static long Color(long color);
    method @androidx.compose.Stable public static long Color(@IntRange(from=0, to=255) int red, @IntRange(from=0, to=255) int green, @IntRange(from=0, to=255) int blue, @IntRange(from=0, to=255) int alpha = 0xFF);
    method @androidx.compose.Stable public static long compositeOver-MsF30Tg(long, long background);
    method public static inline boolean isSet-QEYXlZo(long);
    method public static inline boolean isUnset-QEYXlZo(long);
    method @androidx.compose.Stable public static long lerp-hhXNEtA(long start, long stop, @FloatRange(from=0.0, to=1.0) float fraction);
    method @androidx.compose.Stable public static float luminance-QEYXlZo(long);
    method @ColorInt @androidx.compose.Stable public static int toArgb-QEYXlZo(long);
    method public static inline long useOrElse-4UtWFt0(long, kotlin.jvm.functions.Function0<androidx.ui.graphics.Color> block);
  }

  public enum FilterQuality {
    method public static androidx.ui.graphics.FilterQuality valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.FilterQuality[] values();
    enum_constant public static final androidx.ui.graphics.FilterQuality high;
    enum_constant public static final androidx.ui.graphics.FilterQuality low;
    enum_constant public static final androidx.ui.graphics.FilterQuality medium;
    enum_constant public static final androidx.ui.graphics.FilterQuality none;
  }

  public final class Float16Kt {
  }

  @Deprecated @androidx.compose.InternalComposeApi public final class GraphicsFactory {
    method @Deprecated public kotlin.jvm.functions.Function0<androidx.ui.graphics.InternalCanvasHolder> getCanvasHolder();
    method @Deprecated public kotlin.reflect.KFunction<androidx.ui.graphics.Canvas> getImageCanvas();
    method @Deprecated public kotlin.jvm.functions.Function1<android.graphics.Canvas,androidx.ui.graphics.Canvas> getNativeCanvas();
    method @Deprecated public kotlin.jvm.functions.Function0<androidx.ui.graphics.Paint> getPaint();
    method @Deprecated public kotlin.jvm.functions.Function0<androidx.ui.graphics.Path> getPath();
    method @Deprecated public void setCanvasHolder(kotlin.jvm.functions.Function0<? extends androidx.ui.graphics.InternalCanvasHolder> p);
    method @Deprecated public void setImageCanvas(kotlin.reflect.KFunction<? extends androidx.ui.graphics.Canvas> p);
    method @Deprecated public void setNativeCanvas(kotlin.jvm.functions.Function1<? super android.graphics.Canvas,? extends androidx.ui.graphics.Canvas> p);
    method @Deprecated public void setPaint(kotlin.jvm.functions.Function0<? extends androidx.ui.graphics.Paint> p);
    method @Deprecated public void setPath(kotlin.jvm.functions.Function0<? extends androidx.ui.graphics.Path> p);
    property public final kotlin.jvm.functions.Function0<androidx.ui.graphics.InternalCanvasHolder> canvasHolder;
    property public final kotlin.reflect.KFunction<androidx.ui.graphics.Canvas> imageCanvas;
    property public final kotlin.jvm.functions.Function1<android.graphics.Canvas,androidx.ui.graphics.Canvas> nativeCanvas;
    property public final kotlin.jvm.functions.Function0<androidx.ui.graphics.Paint> paint;
    property public final kotlin.jvm.functions.Function0<androidx.ui.graphics.Path> path;
    field @Deprecated public static final androidx.ui.graphics.GraphicsFactory INSTANCE;
  }

  @Deprecated public static final class GraphicsFactory.Shader {
    method @Deprecated public kotlin.reflect.KFunction<android.graphics.Shader> getImage();
    method @Deprecated public kotlin.reflect.KFunction<android.graphics.Shader> getLinear();
    method @Deprecated public kotlin.reflect.KFunction<android.graphics.Shader> getRadial();
    method @Deprecated public void setImage(kotlin.reflect.KFunction<? extends android.graphics.Shader> p);
    method @Deprecated public void setLinear(kotlin.reflect.KFunction<? extends android.graphics.Shader> p);
    method @Deprecated public void setRadial(kotlin.reflect.KFunction<? extends android.graphics.Shader> p);
    property public final kotlin.reflect.KFunction<android.graphics.Shader> image;
    property public final kotlin.reflect.KFunction<android.graphics.Shader> linear;
    property public final kotlin.reflect.KFunction<android.graphics.Shader> radial;
    field @Deprecated public static final androidx.ui.graphics.GraphicsFactory.Shader INSTANCE;
  }

  public interface ImageAsset {
    method public androidx.ui.graphics.colorspace.ColorSpace getColorSpace();
    method public androidx.ui.graphics.ImageAssetConfig getConfig();
    method public boolean getHasAlpha();
    method public int getHeight();
    method public int getWidth();
    method public void prepareToDraw();
    method public void readPixels(int[] buffer, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int bufferOffset = 0, int stride = width);
    property public abstract androidx.ui.graphics.colorspace.ColorSpace colorSpace;
    property public abstract androidx.ui.graphics.ImageAssetConfig config;
    property public abstract boolean hasAlpha;
    property public abstract int height;
    property public abstract int width;
  }

  public enum ImageAssetConfig {
    method public static androidx.ui.graphics.ImageAssetConfig valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.ImageAssetConfig[] values();
    enum_constant public static final androidx.ui.graphics.ImageAssetConfig Alpha8;
    enum_constant public static final androidx.ui.graphics.ImageAssetConfig Argb8888;
    enum_constant public static final androidx.ui.graphics.ImageAssetConfig F16;
    enum_constant public static final androidx.ui.graphics.ImageAssetConfig Gpu;
    enum_constant public static final androidx.ui.graphics.ImageAssetConfig Rgb565;
  }

  public final class ImageAssetKt {
    method public static androidx.ui.graphics.ImageAsset ImageAsset(int width, int height, androidx.ui.graphics.ImageAssetConfig config = androidx.ui.graphics.ImageAssetConfig.Argb8888, boolean hasAlpha = true, androidx.ui.graphics.colorspace.ColorSpace colorSpace = ColorSpaces.Srgb);
    method public static androidx.ui.graphics.PixelMap toPixelMap(androidx.ui.graphics.ImageAsset, int startX = 0, int startY = 0, int width = this.width, int height = this.height, int[] buffer = null(width * height), int bufferOffset = 0, int stride = width);
  }

  @androidx.compose.InternalComposeApi public interface InternalCanvasHolder {
    method public androidx.ui.graphics.Canvas getCanvas();
    method public android.graphics.Canvas getInternalCanvas();
    method public void setInternalCanvas(android.graphics.Canvas p);
    property public abstract androidx.ui.graphics.Canvas canvas;
    property public abstract android.graphics.Canvas internalCanvas;
  }

  public final class LinearGradient extends androidx.ui.graphics.ShaderBrush {
    method public androidx.ui.graphics.LinearGradient copy(java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? stops, float startX, float startY, float endX, float endY, androidx.ui.graphics.TileMode tileMode);
  }

  public abstract sealed class Outline {
  }

  public static final class Outline.Generic extends androidx.ui.graphics.Outline {
    ctor public Outline.Generic(androidx.ui.graphics.Path path);
    method public androidx.ui.graphics.Path component1();
    method public androidx.ui.graphics.Outline.Generic copy(androidx.ui.graphics.Path path);
    method public androidx.ui.graphics.Path getPath();
  }

  public static final class Outline.Rectangle extends androidx.ui.graphics.Outline {
    ctor public Outline.Rectangle(androidx.ui.geometry.Rect rect);
    method public androidx.ui.geometry.Rect component1();
    method public androidx.ui.graphics.Outline.Rectangle copy(androidx.ui.geometry.Rect rect);
    method public androidx.ui.geometry.Rect getRect();
  }

  public static final class Outline.Rounded extends androidx.ui.graphics.Outline {
    ctor public Outline.Rounded(androidx.ui.geometry.RRect rrect);
    method public androidx.ui.geometry.RRect component1();
    method public androidx.ui.graphics.Outline.Rounded copy(androidx.ui.geometry.RRect rrect);
    method public androidx.ui.geometry.RRect getRrect();
  }

  public final class OutlineKt {
    method public static void addOutline(androidx.ui.graphics.Path, androidx.ui.graphics.Outline outline);
    method public static void drawOutline(androidx.ui.graphics.drawscope.DrawScope, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
    method public static void drawOutline(androidx.ui.graphics.Canvas, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Paint paint);
    method public static void drawOutline-2ddATRk(androidx.ui.graphics.drawscope.DrawScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
  }

  public interface Paint {
    method public android.graphics.Paint asFrameworkPaint();
    method public float getAlpha();
    method public androidx.ui.graphics.BlendMode getBlendMode();
    method public long getColor();
    method public androidx.ui.graphics.ColorFilter? getColorFilter();
    method public androidx.ui.graphics.FilterQuality getFilterQuality();
    method public android.graphics.PathEffect? getNativePathEffect();
    method public android.graphics.Shader? getShader();
    method public androidx.ui.graphics.StrokeCap getStrokeCap();
    method public androidx.ui.graphics.StrokeJoin getStrokeJoin();
    method public float getStrokeMiterLimit();
    method public float getStrokeWidth();
    method public androidx.ui.graphics.PaintingStyle getStyle();
    method public boolean isAntiAlias();
    method public void setAlpha(float p);
    method public void setAntiAlias(boolean p);
    method public void setBlendMode(androidx.ui.graphics.BlendMode p);
    method public void setColor-QEYXlZo(long p);
    method public void setColorFilter(androidx.ui.graphics.ColorFilter? p);
    method public void setFilterQuality(androidx.ui.graphics.FilterQuality p);
    method public void setNativePathEffect(android.graphics.PathEffect? p);
    method public void setShader(android.graphics.Shader? p);
    method public void setStrokeCap(androidx.ui.graphics.StrokeCap p);
    method public void setStrokeJoin(androidx.ui.graphics.StrokeJoin p);
    method public void setStrokeMiterLimit(float p);
    method public void setStrokeWidth(float p);
    method public void setStyle(androidx.ui.graphics.PaintingStyle p);
    property public abstract float alpha;
    property public abstract androidx.ui.graphics.BlendMode blendMode;
    property public abstract long color;
    property public abstract androidx.ui.graphics.ColorFilter? colorFilter;
    property public abstract androidx.ui.graphics.FilterQuality filterQuality;
    property public abstract boolean isAntiAlias;
    property public abstract android.graphics.PathEffect? nativePathEffect;
    property public abstract android.graphics.Shader? shader;
    property public abstract androidx.ui.graphics.StrokeCap strokeCap;
    property public abstract androidx.ui.graphics.StrokeJoin strokeJoin;
    property public abstract float strokeMiterLimit;
    property public abstract float strokeWidth;
    property public abstract androidx.ui.graphics.PaintingStyle style;
  }

  public final class PaintKt {
    field public static final float DefaultAlpha = 1.0f;
  }

  public enum PaintingStyle {
    method public static androidx.ui.graphics.PaintingStyle valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.PaintingStyle[] values();
    enum_constant public static final androidx.ui.graphics.PaintingStyle fill;
    enum_constant public static final androidx.ui.graphics.PaintingStyle stroke;
  }

  public interface Path {
    method public void addArc(androidx.ui.geometry.Rect oval, float startAngleDegrees, float sweepAngleDegrees);
    method public void addArcRad(androidx.ui.geometry.Rect oval, float startAngleRadians, float sweepAngleRadians);
    method public void addOval(androidx.ui.geometry.Rect oval);
    method public void addPath(androidx.ui.graphics.Path path, androidx.ui.geometry.Offset offset = Offset.Zero);
    method public void addRRect(androidx.ui.geometry.RRect rrect);
    method public void addRect(androidx.ui.geometry.Rect rect);
    method public void arcTo(androidx.ui.geometry.Rect rect, float startAngleDegrees, float sweepAngleDegrees, boolean forceMoveTo);
    method public default void arcToRad(androidx.ui.geometry.Rect rect, float startAngleRadians, float sweepAngleRadians, boolean forceMoveTo);
    method public void close();
    method public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);
    method public androidx.ui.geometry.Rect getBounds();
    method public androidx.ui.graphics.PathFillType getFillType();
    method public boolean isConvex();
    method public boolean isEmpty();
    method public void lineTo(float x, float y);
    method public void moveTo(float x, float y);
    method public boolean op(androidx.ui.graphics.Path path1, androidx.ui.graphics.Path path2, androidx.ui.graphics.PathOperation operation);
    method public void quadraticBezierTo(float x1, float y1, float x2, float y2);
    method public void relativeCubicTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
    method public void relativeLineTo(float dx, float dy);
    method public void relativeMoveTo(float dx, float dy);
    method public void relativeQuadraticBezierTo(float dx1, float dy1, float dx2, float dy2);
    method public void reset();
    method public void setFillType(androidx.ui.graphics.PathFillType p);
    method public void shift(androidx.ui.geometry.Offset offset);
    property public abstract androidx.ui.graphics.PathFillType fillType;
    property public abstract boolean isConvex;
    property public abstract boolean isEmpty;
    field public static final androidx.ui.graphics.Path.Companion Companion;
  }

  public static final class Path.Companion {
    method public androidx.ui.graphics.Path combine(androidx.ui.graphics.PathOperation operation, androidx.ui.graphics.Path path1, androidx.ui.graphics.Path path2);
  }

  public enum PathFillType {
    method public static androidx.ui.graphics.PathFillType valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.PathFillType[] values();
    enum_constant public static final androidx.ui.graphics.PathFillType evenOdd;
    enum_constant public static final androidx.ui.graphics.PathFillType nonZero;
  }

  public interface PathMeasure {
    method public float getLength();
    method public boolean getSegment(float startDistance, float stopDistance, androidx.ui.graphics.Path path, boolean startWithMoveTo);
    method public void setPath(androidx.ui.graphics.Path path, boolean forceClosed);
    property public abstract float length;
  }

  public enum PathOperation {
    method public static androidx.ui.graphics.PathOperation valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.PathOperation[] values();
    enum_constant public static final androidx.ui.graphics.PathOperation difference;
    enum_constant public static final androidx.ui.graphics.PathOperation intersect;
    enum_constant public static final androidx.ui.graphics.PathOperation reverseDifference;
    enum_constant public static final androidx.ui.graphics.PathOperation union;
    enum_constant public static final androidx.ui.graphics.PathOperation xor;
  }

  public final class PixelMap {
    ctor public PixelMap(int[] buffer, int width, int height, int bufferOffset, int stride);
    method public operator long get(@IntRange(from=0) int x, @IntRange(from=0) int y);
    method public int[] getBuffer();
    method public int getBufferOffset();
    method public int getHeight();
    method public int getStride();
    method public int getWidth();
  }

  public enum PointMode {
    method public static androidx.ui.graphics.PointMode valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.PointMode[] values();
    enum_constant public static final androidx.ui.graphics.PointMode lines;
    enum_constant public static final androidx.ui.graphics.PointMode points;
    enum_constant public static final androidx.ui.graphics.PointMode polygon;
  }

  public final class RadialGradient extends androidx.ui.graphics.ShaderBrush {
    method public androidx.ui.graphics.RadialGradient copy(java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? stops, float centerX, float centerY, float radius, androidx.ui.graphics.TileMode tileMode);
  }

  public final class RectangleShapeKt {
    method public static androidx.ui.graphics.Shape getRectangleShape();
  }

  public class ShaderBrush extends androidx.ui.graphics.Brush {
    ctor public ShaderBrush(android.graphics.Shader shader);
    method public final void applyTo(androidx.ui.graphics.Paint p, float alpha);
    method public final android.graphics.Shader getShader();
  }

  public final class ShaderKt {
    method public static android.graphics.Shader ImageShader(androidx.ui.graphics.ImageAsset image, androidx.ui.graphics.TileMode tileModeX = androidx.ui.graphics.TileMode.Clamp, androidx.ui.graphics.TileMode tileModeY = androidx.ui.graphics.TileMode.Clamp);
    method public static android.graphics.Shader LinearGradientShader(androidx.ui.geometry.Offset from, androidx.ui.geometry.Offset to, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
    method public static android.graphics.Shader RadialGradientShader(androidx.ui.geometry.Offset center, float radius, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Float>? colorStops = null, androidx.ui.graphics.TileMode tileMode = androidx.ui.graphics.TileMode.Clamp);
  }

  @androidx.compose.Immutable public final class Shadow {
    method public long component1();
    method public androidx.ui.geometry.Offset component2();
    method public float component3();
    method @androidx.compose.Immutable public androidx.ui.graphics.Shadow copy-hgWLwZA(long color, androidx.ui.geometry.Offset offset, float blurRadius);
    method public float getBlurRadius();
    method public long getColor();
    method public androidx.ui.geometry.Offset getOffset();
    field public static final androidx.ui.graphics.Shadow.Companion Companion;
  }

  public static final class Shadow.Companion {
    method public androidx.ui.graphics.Shadow getNone();
    property public final androidx.ui.graphics.Shadow None;
  }

  public final class ShadowKt {
    method @androidx.compose.Stable public static androidx.ui.graphics.Shadow lerp(androidx.ui.graphics.Shadow start, androidx.ui.graphics.Shadow stop, float fraction);
  }

  @androidx.compose.Immutable public interface Shape {
    method public androidx.ui.graphics.Outline createOutline-SwJi8iY(long size, androidx.ui.unit.Density density);
  }

  public final class SolidColor extends androidx.ui.graphics.Brush {
    method public void applyTo(androidx.ui.graphics.Paint p, float alpha);
    method public long component1();
    method public androidx.ui.graphics.SolidColor copy-QEYXlZo(long value);
    method public long getValue();
  }

  public enum StrokeCap {
    method public static androidx.ui.graphics.StrokeCap valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.StrokeCap[] values();
    enum_constant public static final androidx.ui.graphics.StrokeCap butt;
    enum_constant public static final androidx.ui.graphics.StrokeCap round;
    enum_constant public static final androidx.ui.graphics.StrokeCap square;
  }

  public enum StrokeJoin {
    method public static androidx.ui.graphics.StrokeJoin valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.StrokeJoin[] values();
    enum_constant public static final androidx.ui.graphics.StrokeJoin bevel;
    enum_constant public static final androidx.ui.graphics.StrokeJoin miter;
    enum_constant public static final androidx.ui.graphics.StrokeJoin round;
  }

  public enum TileMode {
    method public static androidx.ui.graphics.TileMode valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.TileMode[] values();
    enum_constant public static final androidx.ui.graphics.TileMode Clamp;
    enum_constant public static final androidx.ui.graphics.TileMode Mirror;
    enum_constant public static final androidx.ui.graphics.TileMode Repeated;
  }

  public enum VertexMode {
    method public static androidx.ui.graphics.VertexMode valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.VertexMode[] values();
    enum_constant public static final androidx.ui.graphics.VertexMode triangleFan;
    enum_constant public static final androidx.ui.graphics.VertexMode triangleStrip;
    enum_constant public static final androidx.ui.graphics.VertexMode triangles;
  }

  public final class Vertices {
    ctor public Vertices(androidx.ui.graphics.VertexMode vertexMode, java.util.List<androidx.ui.geometry.Offset> positions, java.util.List<androidx.ui.geometry.Offset> textureCoordinates, java.util.List<androidx.ui.graphics.Color> colors, java.util.List<java.lang.Integer> indices);
    method public int[] getColors();
    method public short[] getIndices();
    method public float[] getPositions();
    method public float[] getTextureCoordinates();
    method public androidx.ui.graphics.VertexMode getVertexMode();
    property public final int[] colors;
    property public final short[] indices;
    property public final float[] positions;
    property public final float[] textureCoordinates;
  }

}

package androidx.ui.graphics.colorspace {

  public enum Adaptation {
    method public static androidx.ui.graphics.colorspace.Adaptation valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.colorspace.Adaptation[] values();
    enum_constant public static final androidx.ui.graphics.colorspace.Adaptation Bradford;
    enum_constant public static final androidx.ui.graphics.colorspace.Adaptation Ciecat02;
    enum_constant public static final androidx.ui.graphics.colorspace.Adaptation VonKries;
  }

  public enum ColorModel {
    method public final int getComponentCount();
    method public static androidx.ui.graphics.colorspace.ColorModel valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.colorspace.ColorModel[] values();
    enum_constant public static final androidx.ui.graphics.colorspace.ColorModel Cmyk;
    enum_constant public static final androidx.ui.graphics.colorspace.ColorModel Lab;
    enum_constant public static final androidx.ui.graphics.colorspace.ColorModel Rgb;
    enum_constant public static final androidx.ui.graphics.colorspace.ColorModel Xyz;
  }

  public abstract class ColorSpace {
    ctor public ColorSpace(String name, androidx.ui.graphics.colorspace.ColorModel model);
    method @Size(min=3) public final float[] fromXyz(float x, float y, float z);
    method @Size(min=3) public abstract float[] fromXyz(@Size(min=3) float[] v);
    method @IntRange(from=1, to=4) public final int getComponentCount();
    method public abstract float getMaxValue(@IntRange(from=0, to=3) int component);
    method public abstract float getMinValue(@IntRange(from=0, to=3) int component);
    method public final androidx.ui.graphics.colorspace.ColorModel getModel();
    method public final String getName();
    method public boolean isSrgb();
    method public abstract boolean isWideGamut();
    method @Size(3) public final float[] toXyz(float r, float g, float b);
    method @Size(min=3) public abstract float[] toXyz(@Size(min=3) float[] v);
    property @IntRange(from=1, to=4) public final int componentCount;
    property public boolean isSrgb;
    property public abstract boolean isWideGamut;
  }

  public final class ColorSpaceKt {
    method public static androidx.ui.graphics.colorspace.ColorSpace adapt(androidx.ui.graphics.colorspace.ColorSpace, androidx.ui.graphics.colorspace.WhitePoint whitePoint, androidx.ui.graphics.colorspace.Adaptation adaptation = androidx.ui.graphics.colorspace.Adaptation.Bradford);
    method public static androidx.ui.graphics.colorspace.ColorSpace adapt(androidx.ui.graphics.colorspace.ColorSpace, androidx.ui.graphics.colorspace.WhitePoint whitePoint);
    method public static androidx.ui.graphics.colorspace.Connector connect(androidx.ui.graphics.colorspace.ColorSpace, androidx.ui.graphics.colorspace.ColorSpace destination = ColorSpaces.Srgb, androidx.ui.graphics.colorspace.RenderIntent intent = androidx.ui.graphics.colorspace.RenderIntent.Perceptual);
  }

  public final class ColorSpaces {
    method public androidx.ui.graphics.colorspace.Rgb getAces();
    method public androidx.ui.graphics.colorspace.Rgb getAcescg();
    method public androidx.ui.graphics.colorspace.Rgb getAdobeRgb();
    method public androidx.ui.graphics.colorspace.Rgb getBt2020();
    method public androidx.ui.graphics.colorspace.Rgb getBt709();
    method public androidx.ui.graphics.colorspace.ColorSpace getCieLab();
    method public androidx.ui.graphics.colorspace.ColorSpace getCieXyz();
    method public androidx.ui.graphics.colorspace.Rgb getDciP3();
    method public androidx.ui.graphics.colorspace.Rgb getDisplayP3();
    method public androidx.ui.graphics.colorspace.Rgb getExtendedSrgb();
    method public androidx.ui.graphics.colorspace.Rgb getLinearExtendedSrgb();
    method public androidx.ui.graphics.colorspace.Rgb getLinearSrgb();
    method public androidx.ui.graphics.colorspace.Rgb getNtsc1953();
    method public androidx.ui.graphics.colorspace.Rgb getProPhotoRgb();
    method public androidx.ui.graphics.colorspace.Rgb getSmpteC();
    method public androidx.ui.graphics.colorspace.Rgb getSrgb();
    method public androidx.ui.graphics.colorspace.ColorSpace? match(@Size(9) float[] toXYZD50, androidx.ui.graphics.colorspace.TransferParameters function);
    property public final androidx.ui.graphics.colorspace.Rgb Aces;
    property public final androidx.ui.graphics.colorspace.Rgb Acescg;
    property public final androidx.ui.graphics.colorspace.Rgb AdobeRgb;
    property public final androidx.ui.graphics.colorspace.Rgb Bt2020;
    property public final androidx.ui.graphics.colorspace.Rgb Bt709;
    property public final androidx.ui.graphics.colorspace.ColorSpace CieLab;
    property public final androidx.ui.graphics.colorspace.ColorSpace CieXyz;
    property public final androidx.ui.graphics.colorspace.Rgb DciP3;
    property public final androidx.ui.graphics.colorspace.Rgb DisplayP3;
    property public final androidx.ui.graphics.colorspace.Rgb ExtendedSrgb;
    property public final androidx.ui.graphics.colorspace.Rgb LinearExtendedSrgb;
    property public final androidx.ui.graphics.colorspace.Rgb LinearSrgb;
    property public final androidx.ui.graphics.colorspace.Rgb Ntsc1953;
    property public final androidx.ui.graphics.colorspace.Rgb ProPhotoRgb;
    property public final androidx.ui.graphics.colorspace.Rgb SmpteC;
    property public final androidx.ui.graphics.colorspace.Rgb Srgb;
    field public static final androidx.ui.graphics.colorspace.ColorSpaces INSTANCE;
  }

  public class Connector {
    method public final androidx.ui.graphics.colorspace.ColorSpace getDestination();
    method public final androidx.ui.graphics.colorspace.RenderIntent getRenderIntent();
    method public final androidx.ui.graphics.colorspace.ColorSpace getSource();
    method @Size(3) public final float[] transform(float r, float g, float b);
    method @Size(min=3) public float[] transform(@Size(min=3) float[] v);
  }

  public final class Illuminant {
    method public androidx.ui.graphics.colorspace.WhitePoint getA();
    method public androidx.ui.graphics.colorspace.WhitePoint getB();
    method public androidx.ui.graphics.colorspace.WhitePoint getC();
    method public androidx.ui.graphics.colorspace.WhitePoint getD50();
    method public androidx.ui.graphics.colorspace.WhitePoint getD55();
    method public androidx.ui.graphics.colorspace.WhitePoint getD60();
    method public androidx.ui.graphics.colorspace.WhitePoint getD65();
    method public androidx.ui.graphics.colorspace.WhitePoint getD75();
    method public androidx.ui.graphics.colorspace.WhitePoint getE();
    property public final androidx.ui.graphics.colorspace.WhitePoint A;
    property public final androidx.ui.graphics.colorspace.WhitePoint B;
    property public final androidx.ui.graphics.colorspace.WhitePoint C;
    property public final androidx.ui.graphics.colorspace.WhitePoint D50;
    property public final androidx.ui.graphics.colorspace.WhitePoint D55;
    property public final androidx.ui.graphics.colorspace.WhitePoint D60;
    property public final androidx.ui.graphics.colorspace.WhitePoint D65;
    property public final androidx.ui.graphics.colorspace.WhitePoint D75;
    property public final androidx.ui.graphics.colorspace.WhitePoint E;
    field public static final androidx.ui.graphics.colorspace.Illuminant INSTANCE;
  }

  public enum RenderIntent {
    method public static androidx.ui.graphics.colorspace.RenderIntent valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.colorspace.RenderIntent[] values();
    enum_constant public static final androidx.ui.graphics.colorspace.RenderIntent Absolute;
    enum_constant public static final androidx.ui.graphics.colorspace.RenderIntent Perceptual;
    enum_constant public static final androidx.ui.graphics.colorspace.RenderIntent Relative;
    enum_constant public static final androidx.ui.graphics.colorspace.RenderIntent Saturation;
  }

  public final class Rgb extends androidx.ui.graphics.colorspace.ColorSpace {
    ctor public Rgb(@Size(min=null) String name, @Size(null) float[] toXYZ, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf);
    ctor public Rgb(@Size(min=null) String name, @Size(min=null, max=null) float[] primaries, androidx.ui.graphics.colorspace.WhitePoint whitePoint, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> oetf, kotlin.jvm.functions.Function1<? super java.lang.Double,java.lang.Double> eotf, float min, float max);
    ctor public Rgb(@Size(min=null) String name, @Size(null) float[] toXYZ, androidx.ui.graphics.colorspace.TransferParameters function);
    ctor public Rgb(@Size(min=null) String name, @Size(min=null, max=null) float[] primaries, androidx.ui.graphics.colorspace.WhitePoint whitePoint, androidx.ui.graphics.colorspace.TransferParameters function);
    ctor public Rgb(@Size(min=null) String name, @Size(null) float[] toXYZ, double gamma);
    ctor public Rgb(@Size(min=null) String name, @Size(min=null, max=null) float[] primaries, androidx.ui.graphics.colorspace.WhitePoint whitePoint, double gamma);
    method @Size(3) public float[] fromLinear(float r, float g, float b);
    method @Size(min=3) public float[] fromLinear(@Size(min=3) float[] v);
    method @Size(min=3) public float[] fromXyz(@Size(min=3) float[] v);
    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getEotf();
    method @Size(9) public float[] getInverseTransform();
    method @Size(min=9) public float[] getInverseTransform(@Size(min=9) float[] inverseTransform);
    method public float getMaxValue(int component);
    method public float getMinValue(int component);
    method public kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> getOetf();
    method @Size(6) public float[] getPrimaries();
    method @Size(min=6) public float[] getPrimaries(@Size(min=6) float[] primaries);
    method public androidx.ui.graphics.colorspace.TransferParameters? getTransferParameters();
    method @Size(9) public float[] getTransform();
    method @Size(min=9) public float[] getTransform(@Size(min=9) float[] transform);
    method public androidx.ui.graphics.colorspace.WhitePoint getWhitePoint();
    method public boolean isWideGamut();
    method @Size(3) public float[] toLinear(float r, float g, float b);
    method @Size(min=3) public float[] toLinear(@Size(min=3) float[] v);
    method @Size(min=3) public float[] toXyz(@Size(min=3) float[] v);
    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> eotf;
    property public boolean isSrgb;
    property public boolean isWideGamut;
    property public final kotlin.jvm.functions.Function1<java.lang.Double,java.lang.Double> oetf;
  }

  public final class TransferParameters {
    ctor public TransferParameters(double gamma, double a, double b, double c, double d, double e, double f);
    method public double component1();
    method public double component2();
    method public double component3();
    method public double component4();
    method public double component5();
    method public double component6();
    method public double component7();
    method public androidx.ui.graphics.colorspace.TransferParameters copy(double gamma, double a, double b, double c, double d, double e, double f);
    method public double getA();
    method public double getB();
    method public double getC();
    method public double getD();
    method public double getE();
    method public double getF();
    method public double getGamma();
  }

  public final class WhitePoint {
    ctor public WhitePoint(float x, float y);
    ctor public WhitePoint(float x, float y, float z);
    method public float component1();
    method public float component2();
    method public androidx.ui.graphics.colorspace.WhitePoint copy(float x, float y);
    method public float getX();
    method public float getY();
  }

}

package androidx.ui.graphics.drawscope {

  @androidx.ui.graphics.drawscope.DrawScopeMarker public abstract class DrawScope implements androidx.ui.unit.Density {
    ctor public DrawScope();
    method protected final void draw-mEaFHtM(androidx.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
    method public final void drawArc-MKXvu20(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.geometry.Offset topLeft = Offset.Zero, long size = this.size - topLeft, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawArc-w9iw49s(long color, float startAngle, float sweepAngle, boolean useCenter, androidx.ui.geometry.Offset topLeft = Offset.Zero, long size = this.size - topLeft, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawCircle(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, androidx.ui.geometry.Offset center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawCircle-UNeD5NE(long color, float radius = size.minDimension / 2.0, androidx.ui.geometry.Offset center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawImage(androidx.ui.graphics.ImageAsset image, androidx.ui.geometry.Offset topLeft = Offset.Zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawImage(androidx.ui.graphics.ImageAsset image, androidx.ui.unit.IntOffset srcOffset = IntOffset.Origin, androidx.ui.unit.IntSize srcSize = IntSize(image.width, image.height), androidx.ui.unit.IntOffset dstOffset = IntOffset.Origin, androidx.ui.unit.IntSize dstSize = srcSize, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawLine(androidx.ui.graphics.Brush brush, androidx.ui.geometry.Offset start, androidx.ui.geometry.Offset end, float strokeWidth = 0.0f, androidx.ui.graphics.StrokeCap cap = Stroke.DefaultCap, android.graphics.PathEffect? pathEffect = null, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawLine-LIcrJ00(long color, androidx.ui.geometry.Offset start, androidx.ui.geometry.Offset end, float strokeWidth = 0.0f, androidx.ui.graphics.StrokeCap cap = Stroke.DefaultCap, android.graphics.PathEffect? pathEffect = null, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawOval-5gW23P0(long color, androidx.ui.geometry.Offset topLeft = Offset.Zero, long size = this.size - topLeft, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawOval-m7aN-JY(androidx.ui.graphics.Brush brush, androidx.ui.geometry.Offset topLeft = Offset.Zero, long size = this.size - topLeft, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawPath(androidx.ui.graphics.Path path, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawPath-u5ZPEDk(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, float strokeWidth = 0.0f, androidx.ui.graphics.StrokeCap cap = androidx.ui.graphics.StrokeCap.butt, android.graphics.PathEffect? pathEffect = null, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawPoints-op7krm4(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, float strokeWidth = 0.0f, androidx.ui.graphics.StrokeCap cap = androidx.ui.graphics.StrokeCap.butt, android.graphics.PathEffect? pathEffect = null, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawRect-5gW23P0(long color, androidx.ui.geometry.Offset topLeft = Offset.Zero, long size = this.size - topLeft, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawRect-m7aN-JY(androidx.ui.graphics.Brush brush, androidx.ui.geometry.Offset topLeft = Offset.Zero, long size = this.size - topLeft, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawRoundRect-J_jAawI(long color, androidx.ui.geometry.Offset topLeft = Offset.Zero, long size = this.size - topLeft, long radius = Radius.Zero, androidx.ui.graphics.drawscope.DrawStyle style = Fill, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final void drawRoundRect-TLscAYA(androidx.ui.graphics.Brush brush, androidx.ui.geometry.Offset topLeft = Offset.Zero, long size = this.size - topLeft, long radius = Radius.Zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.drawscope.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
    method public final androidx.ui.geometry.Offset getCenter();
    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
    method public final long getSize();
    property public final androidx.ui.geometry.Offset center;
    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
    property public final long size;
    field public static final androidx.ui.graphics.drawscope.DrawScope.Companion Companion;
  }

  public static final class DrawScope.Companion {
    method public androidx.ui.graphics.BlendMode getDefaultBlendMode();
    property public final androidx.ui.graphics.BlendMode DefaultBlendMode;
  }

  public final class DrawScopeKt {
    method public static inline void clipPath(androidx.ui.graphics.drawscope.DrawScope, androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
    method public static inline void clipRect(androidx.ui.graphics.drawscope.DrawScope, float left = 0.0f, float top = 0.0f, float right = size.width, float bottom = size.height, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
    method public static inline void drawCanvas(androidx.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.geometry.Size,kotlin.Unit> block);
    method public static inline void inset(androidx.ui.graphics.drawscope.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
    method public static inline void inset(androidx.ui.graphics.drawscope.DrawScope, float dx = 0.0f, float dy = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
    method public static inline void rotate(androidx.ui.graphics.drawscope.DrawScope, float degrees, float pivotX = center.x, float pivotY = center.y, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
    method public static inline void rotateRad(androidx.ui.graphics.drawscope.DrawScope, float radians, float pivotX = center.x, float pivotY = center.y, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
    method public static inline void scale(androidx.ui.graphics.drawscope.DrawScope, float scaleX, float scaleY = scaleX, float pivotX = center.x, float pivotY = center.y, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
    method public static inline void translate(androidx.ui.graphics.drawscope.DrawScope, float left = 0.0f, float top = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawScope,kotlin.Unit> block);
    method public static inline void withTransform(androidx.ui.graphics.drawscope.DrawScope, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.drawscope.DrawScope,kotlin.Unit> drawBlock);
  }

  @kotlin.DslMarker public @interface DrawScopeMarker {
  }

  public abstract sealed class DrawStyle {
  }

  @androidx.ui.graphics.drawscope.DrawScopeMarker public interface DrawTransform {
    method public void clipPath(androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
    method public void clipRect(float left = 0.0f, float top = 0.0f, float right = size.width, float bottom = size.height, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect);
    method public default androidx.ui.geometry.Offset getCenter();
    method public long getSize();
    method public void inset(float left, float top, float right, float bottom);
    method public void rotate(float degrees, float pivotX = center.x, float pivotY = center.y);
    method public void scale(float scaleX, float scaleY = scaleX, float pivotX = center.x, float pivotY = center.y);
    method public void transform(androidx.ui.graphics.vectormath.Matrix4 matrix);
    method public void translate(float left = 0.0f, float top = 0.0f);
    property public default androidx.ui.geometry.Offset center;
    property public abstract long size;
  }

  public final class DrawTransformKt {
    method public static inline void inset(androidx.ui.graphics.drawscope.DrawTransform, float dx = 0.0f, float dy = 0.0f);
    method public static inline void rotateRad(androidx.ui.graphics.drawscope.DrawTransform, float radians, float pivotX = center.x, float pivotY = center.y);
  }

  public final class Fill extends androidx.ui.graphics.drawscope.DrawStyle {
    field public static final androidx.ui.graphics.drawscope.Fill INSTANCE;
  }

  public final class Stroke extends androidx.ui.graphics.drawscope.DrawStyle {
    ctor public Stroke(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
    ctor public Stroke();
    method public float component1();
    method public float component2();
    method public androidx.ui.graphics.StrokeCap component3();
    method public androidx.ui.graphics.StrokeJoin component4();
    method public android.graphics.PathEffect? component5();
    method public androidx.ui.graphics.drawscope.Stroke copy(float width, float miter, androidx.ui.graphics.StrokeCap cap, androidx.ui.graphics.StrokeJoin join, android.graphics.PathEffect? pathEffect);
    method public androidx.ui.graphics.StrokeCap getCap();
    method public androidx.ui.graphics.StrokeJoin getJoin();
    method public float getMiter();
    method public android.graphics.PathEffect? getPathEffect();
    method public float getWidth();
    field public static final androidx.ui.graphics.drawscope.Stroke.Companion Companion;
    field public static final float DefaultMiter = 4.0f;
    field public static final float HairlineWidth = 0.0f;
  }

  public static final class Stroke.Companion {
    method public androidx.ui.graphics.StrokeCap getDefaultCap();
    method public androidx.ui.graphics.StrokeJoin getDefaultJoin();
    property public final androidx.ui.graphics.StrokeCap DefaultCap;
    property public final androidx.ui.graphics.StrokeJoin DefaultJoin;
  }

}

package androidx.ui.graphics.painter {

  public final class ColorPainter extends androidx.ui.graphics.painter.Painter {
    method public long component1();
    method public androidx.ui.graphics.painter.ColorPainter copy-QEYXlZo(long color);
    method public long getColor();
    method public long getIntrinsicSize();
    method protected void onDraw(androidx.ui.graphics.drawscope.DrawScope);
    property public long intrinsicSize;
  }

  public final class ImagePainter extends androidx.ui.graphics.painter.Painter {
    ctor public ImagePainter(androidx.ui.graphics.ImageAsset image, androidx.ui.unit.IntOffset srcOffset, androidx.ui.unit.IntSize srcSize);
    method public androidx.ui.graphics.painter.ImagePainter copy(androidx.ui.graphics.ImageAsset image, androidx.ui.unit.IntOffset srcOffset, androidx.ui.unit.IntSize srcSize);
    method public long getIntrinsicSize();
    method protected void onDraw(androidx.ui.graphics.drawscope.DrawScope);
    property public long intrinsicSize;
  }

  public abstract class Painter {
    ctor public Painter();
    method protected boolean applyAlpha(float alpha);
    method protected boolean applyColorFilter(androidx.ui.graphics.ColorFilter? colorFilter);
    method protected boolean applyLayoutDirection(androidx.ui.core.LayoutDirection layoutDirection);
    method public final void draw-fjVI2_8(androidx.ui.graphics.drawscope.DrawScope, long size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
    method public abstract long getIntrinsicSize();
    method protected abstract void onDraw(androidx.ui.graphics.drawscope.DrawScope);
    property public abstract long intrinsicSize;
  }

}

package androidx.ui.graphics.vector {

  public final class PathBuilder {
    ctor public PathBuilder();
    method public androidx.ui.graphics.vector.PathBuilder arcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float x1, float y1);
    method public androidx.ui.graphics.vector.PathBuilder arcToRelative(float a, float b, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float dx1, float dy1);
    method public androidx.ui.graphics.vector.PathBuilder close();
    method public androidx.ui.graphics.vector.PathBuilder curveTo(float x1, float y1, float x2, float y2, float x3, float y3);
    method public androidx.ui.graphics.vector.PathBuilder curveToRelative(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
    method public java.util.List<androidx.ui.graphics.vector.PathNode> getNodes();
    method public androidx.ui.graphics.vector.PathBuilder horizontalLineTo(float x);
    method public androidx.ui.graphics.vector.PathBuilder horizontalLineToRelative(float dx);
    method public androidx.ui.graphics.vector.PathBuilder lineTo(float x, float y);
    method public androidx.ui.graphics.vector.PathBuilder lineToRelative(float dx, float dy);
    method public androidx.ui.graphics.vector.PathBuilder moveTo(float x, float y);
    method public androidx.ui.graphics.vector.PathBuilder moveToRelative(float dx, float dy);
    method public androidx.ui.graphics.vector.PathBuilder quadTo(float x1, float y1, float x2, float y2);
    method public androidx.ui.graphics.vector.PathBuilder quadToRelative(float dx1, float dy1, float dx2, float dy2);
    method public androidx.ui.graphics.vector.PathBuilder reflectiveCurveTo(float x1, float y1, float x2, float y2);
    method public androidx.ui.graphics.vector.PathBuilder reflectiveCurveToRelative(float dx1, float dy1, float dx2, float dy2);
    method public androidx.ui.graphics.vector.PathBuilder reflectiveQuadTo(float x1, float y1);
    method public androidx.ui.graphics.vector.PathBuilder reflectiveQuadToRelative(float dx1, float dy1);
    method public androidx.ui.graphics.vector.PathBuilder verticalLineTo(float y);
    method public androidx.ui.graphics.vector.PathBuilder verticalLineToRelative(float dy);
  }

  public abstract sealed class PathNode {
    method public final boolean isCurve();
    method public final boolean isQuad();
  }

  public static final class PathNode.ArcTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.ArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
    method public float component1();
    method public float component2();
    method public float component3();
    method public boolean component4();
    method public boolean component5();
    method public float component6();
    method public float component7();
    method public androidx.ui.graphics.vector.PathNode.ArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartX, float arcStartY);
    method public float getArcStartX();
    method public float getArcStartY();
    method public float getHorizontalEllipseRadius();
    method public float getTheta();
    method public float getVerticalEllipseRadius();
    method public boolean isMoreThanHalf();
    method public boolean isPositiveArc();
  }

  public static final class PathNode.Close extends androidx.ui.graphics.vector.PathNode {
    field public static final androidx.ui.graphics.vector.PathNode.Close INSTANCE;
  }

  public static final class PathNode.CurveTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.CurveTo(float x1, float y1, float x2, float y2, float x3, float y3);
    method public float component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method public float component5();
    method public float component6();
    method public androidx.ui.graphics.vector.PathNode.CurveTo copy(float x1, float y1, float x2, float y2, float x3, float y3);
    method public float getX1();
    method public float getX2();
    method public float getX3();
    method public float getY1();
    method public float getY2();
    method public float getY3();
  }

  public static final class PathNode.HorizontalTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.HorizontalTo(float x);
    method public float component1();
    method public androidx.ui.graphics.vector.PathNode.HorizontalTo copy(float x);
    method public float getX();
  }

  public static final class PathNode.LineTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.LineTo(float x, float y);
    method public float component1();
    method public float component2();
    method public androidx.ui.graphics.vector.PathNode.LineTo copy(float x, float y);
    method public float getX();
    method public float getY();
  }

  public static final class PathNode.MoveTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.MoveTo(float x, float y);
    method public float component1();
    method public float component2();
    method public androidx.ui.graphics.vector.PathNode.MoveTo copy(float x, float y);
    method public float getX();
    method public float getY();
  }

  public static final class PathNode.QuadTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.QuadTo(float x1, float y1, float x2, float y2);
    method public float component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method public androidx.ui.graphics.vector.PathNode.QuadTo copy(float x1, float y1, float x2, float y2);
    method public float getX1();
    method public float getX2();
    method public float getY1();
    method public float getY2();
  }

  public static final class PathNode.ReflectiveCurveTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.ReflectiveCurveTo(float x1, float y1, float x2, float y2);
    method public float component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method public androidx.ui.graphics.vector.PathNode.ReflectiveCurveTo copy(float x1, float y1, float x2, float y2);
    method public float getX1();
    method public float getX2();
    method public float getY1();
    method public float getY2();
  }

  public static final class PathNode.ReflectiveQuadTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.ReflectiveQuadTo(float x, float y);
    method public float component1();
    method public float component2();
    method public androidx.ui.graphics.vector.PathNode.ReflectiveQuadTo copy(float x, float y);
    method public float getX();
    method public float getY();
  }

  public static final class PathNode.RelativeArcTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.RelativeArcTo(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
    method public float component1();
    method public float component2();
    method public float component3();
    method public boolean component4();
    method public boolean component5();
    method public float component6();
    method public float component7();
    method public androidx.ui.graphics.vector.PathNode.RelativeArcTo copy(float horizontalEllipseRadius, float verticalEllipseRadius, float theta, boolean isMoreThanHalf, boolean isPositiveArc, float arcStartDx, float arcStartDy);
    method public float getArcStartDx();
    method public float getArcStartDy();
    method public float getHorizontalEllipseRadius();
    method public float getTheta();
    method public float getVerticalEllipseRadius();
    method public boolean isMoreThanHalf();
    method public boolean isPositiveArc();
  }

  public static final class PathNode.RelativeCurveTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.RelativeCurveTo(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
    method public float component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method public float component5();
    method public float component6();
    method public androidx.ui.graphics.vector.PathNode.RelativeCurveTo copy(float dx1, float dy1, float dx2, float dy2, float dx3, float dy3);
    method public float getDx1();
    method public float getDx2();
    method public float getDx3();
    method public float getDy1();
    method public float getDy2();
    method public float getDy3();
  }

  public static final class PathNode.RelativeHorizontalTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.RelativeHorizontalTo(float dx);
    method public float component1();
    method public androidx.ui.graphics.vector.PathNode.RelativeHorizontalTo copy(float dx);
    method public float getDx();
  }

  public static final class PathNode.RelativeLineTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.RelativeLineTo(float dx, float dy);
    method public float component1();
    method public float component2();
    method public androidx.ui.graphics.vector.PathNode.RelativeLineTo copy(float dx, float dy);
    method public float getDx();
    method public float getDy();
  }

  public static final class PathNode.RelativeMoveTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.RelativeMoveTo(float dx, float dy);
    method public float component1();
    method public float component2();
    method public androidx.ui.graphics.vector.PathNode.RelativeMoveTo copy(float dx, float dy);
    method public float getDx();
    method public float getDy();
  }

  public static final class PathNode.RelativeQuadTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.RelativeQuadTo(float dx1, float dy1, float dx2, float dy2);
    method public float component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method public androidx.ui.graphics.vector.PathNode.RelativeQuadTo copy(float dx1, float dy1, float dx2, float dy2);
    method public float getDx1();
    method public float getDx2();
    method public float getDy1();
    method public float getDy2();
  }

  public static final class PathNode.RelativeReflectiveCurveTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.RelativeReflectiveCurveTo(float dx1, float dy1, float dx2, float dy2);
    method public float component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method public androidx.ui.graphics.vector.PathNode.RelativeReflectiveCurveTo copy(float dx1, float dy1, float dx2, float dy2);
    method public float getDx1();
    method public float getDx2();
    method public float getDy1();
    method public float getDy2();
  }

  public static final class PathNode.RelativeReflectiveQuadTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.RelativeReflectiveQuadTo(float dx, float dy);
    method public float component1();
    method public float component2();
    method public androidx.ui.graphics.vector.PathNode.RelativeReflectiveQuadTo copy(float dx, float dy);
    method public float getDx();
    method public float getDy();
  }

  public static final class PathNode.RelativeVerticalTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.RelativeVerticalTo(float dy);
    method public float component1();
    method public androidx.ui.graphics.vector.PathNode.RelativeVerticalTo copy(float dy);
    method public float getDy();
  }

  public static final class PathNode.VerticalTo extends androidx.ui.graphics.vector.PathNode {
    ctor public PathNode.VerticalTo(float y);
    method public float component1();
    method public androidx.ui.graphics.vector.PathNode.VerticalTo copy(float y);
    method public float getY();
  }

  public final class PathNodeKt {
  }

  public final class PathParser {
    ctor public PathParser();
    method public androidx.ui.graphics.vector.PathParser addPathNodes(java.util.List<? extends androidx.ui.graphics.vector.PathNode> nodes);
    method public void clear();
    method public androidx.ui.graphics.vector.PathParser parsePathString(String pathData);
    method public java.util.List<androidx.ui.graphics.vector.PathNode> toNodes();
    method public androidx.ui.graphics.Path toPath(androidx.ui.graphics.Path target = Path());
  }

}

package androidx.ui.graphics.vectormath {

  public final class Matrix3 {
    ctor public Matrix3(androidx.ui.graphics.vectormath.Vector3 x, androidx.ui.graphics.vectormath.Vector3 y, androidx.ui.graphics.vectormath.Vector3 z);
    ctor public Matrix3();
    ctor public Matrix3(androidx.ui.graphics.vectormath.Matrix3 m);
    method public androidx.ui.graphics.vectormath.Vector3 component1();
    method public androidx.ui.graphics.vectormath.Vector3 component2();
    method public androidx.ui.graphics.vectormath.Vector3 component3();
    method public androidx.ui.graphics.vectormath.Matrix3 copy(androidx.ui.graphics.vectormath.Vector3 x, androidx.ui.graphics.vectormath.Vector3 y, androidx.ui.graphics.vectormath.Vector3 z);
    method public operator androidx.ui.graphics.vectormath.Matrix3 dec();
    method public operator androidx.ui.graphics.vectormath.Matrix3 div(float v);
    method public operator androidx.ui.graphics.vectormath.Vector3 get(int column);
    method public operator float get(int column, int row);
    method public operator androidx.ui.graphics.vectormath.Vector3 get(androidx.ui.graphics.vectormath.MatrixColumn column);
    method public operator float get(androidx.ui.graphics.vectormath.MatrixColumn column, int row);
    method public inline java.util.List<java.lang.Float> getM3storage();
    method public androidx.ui.graphics.vectormath.Vector3 getX();
    method public androidx.ui.graphics.vectormath.Vector3 getY();
    method public androidx.ui.graphics.vectormath.Vector3 getZ();
    method public operator androidx.ui.graphics.vectormath.Matrix3 inc();
    method public operator androidx.ui.graphics.vectormath.Matrix3 minus(float v);
    method public operator androidx.ui.graphics.vectormath.Matrix3 plus(float v);
    method public operator void set(int column, androidx.ui.graphics.vectormath.Vector3 v);
    method public operator void set(int column, int row, float v);
    method public void setX(androidx.ui.graphics.vectormath.Vector3 p);
    method public void setY(androidx.ui.graphics.vectormath.Vector3 p);
    method public void setZ(androidx.ui.graphics.vectormath.Vector3 p);
    method public operator androidx.ui.graphics.vectormath.Matrix3 times(float v);
    method public operator androidx.ui.graphics.vectormath.Matrix3 times(androidx.ui.graphics.vectormath.Matrix3 m);
    method public operator androidx.ui.graphics.vectormath.Vector3 times(androidx.ui.graphics.vectormath.Vector3 v);
    method public float[] toFloatArray();
    method public operator androidx.ui.graphics.vectormath.Matrix3 unaryMinus();
    property public final inline java.util.List<java.lang.Float> m3storage;
    field public static final androidx.ui.graphics.vectormath.Matrix3.Companion Companion;
  }

  public static final class Matrix3.Companion {
    method public androidx.ui.graphics.vectormath.Matrix3 identity();
    method public androidx.ui.graphics.vectormath.Matrix3 of(float... a);
  }

  public final class Matrix4 {
    ctor public Matrix4(androidx.ui.graphics.vectormath.Vector4 x, androidx.ui.graphics.vectormath.Vector4 y, androidx.ui.graphics.vectormath.Vector4 z, androidx.ui.graphics.vectormath.Vector4 w);
    ctor public Matrix4();
    ctor public Matrix4(androidx.ui.graphics.vectormath.Vector3 right, androidx.ui.graphics.vectormath.Vector3 up, androidx.ui.graphics.vectormath.Vector3 forward, androidx.ui.graphics.vectormath.Vector3 position);
    ctor public Matrix4(androidx.ui.graphics.vectormath.Matrix4 m);
    method public void assignColumns(androidx.ui.graphics.vectormath.Matrix4 other);
    method public void assignFromStorage(java.util.List<java.lang.Float> storage);
    method public androidx.ui.graphics.vectormath.Vector4 component1();
    method public androidx.ui.graphics.vectormath.Vector4 component2();
    method public androidx.ui.graphics.vectormath.Vector4 component3();
    method public androidx.ui.graphics.vectormath.Vector4 component4();
    method public androidx.ui.graphics.vectormath.Matrix4 copy(androidx.ui.graphics.vectormath.Vector4 x, androidx.ui.graphics.vectormath.Vector4 y, androidx.ui.graphics.vectormath.Vector4 z, androidx.ui.graphics.vectormath.Vector4 w);
    method public float copyInverse(androidx.ui.graphics.vectormath.Matrix4 arg);
    method public operator androidx.ui.graphics.vectormath.Matrix4 dec();
    method public operator androidx.ui.graphics.vectormath.Matrix4 div(float v);
    method public operator androidx.ui.graphics.vectormath.Vector4 get(int column);
    method public operator float get(int column, int row);
    method public operator androidx.ui.graphics.vectormath.Vector4 get(androidx.ui.graphics.vectormath.MatrixColumn column);
    method public operator float get(androidx.ui.graphics.vectormath.MatrixColumn column, int row);
    method public float getDeterminant();
    method public inline androidx.ui.graphics.vectormath.Vector3 getForward();
    method public inline java.util.List<java.lang.Float> getM4storage();
    method public inline androidx.ui.graphics.vectormath.Vector3 getPosition();
    method public inline androidx.ui.graphics.vectormath.Vector3 getRight();
    method public androidx.ui.graphics.vectormath.Vector3 getRotation();
    method public androidx.ui.graphics.vectormath.Vector4 getRow(int row);
    method public inline androidx.ui.graphics.vectormath.Vector3 getScale();
    method public inline androidx.ui.graphics.vectormath.Vector3 getTranslation();
    method public inline androidx.ui.graphics.vectormath.Vector3 getUp();
    method public inline androidx.ui.graphics.vectormath.Matrix3 getUpperLeft();
    method public androidx.ui.graphics.vectormath.Vector4 getW();
    method public androidx.ui.graphics.vectormath.Vector4 getX();
    method public androidx.ui.graphics.vectormath.Vector4 getY();
    method public androidx.ui.graphics.vectormath.Vector4 getZ();
    method public operator androidx.ui.graphics.vectormath.Matrix4 inc();
    method public float invert();
    method public operator androidx.ui.graphics.vectormath.Matrix4 minus(float v);
    method public androidx.ui.graphics.vectormath.Vector3 perspectiveTransform(androidx.ui.graphics.vectormath.Vector3 arg);
    method public operator androidx.ui.graphics.vectormath.Matrix4 plus(float v);
    method public void rotateX(float radians);
    method public void rotateY(float radians);
    method public void rotateZ(float radians);
    method public void scale(Object x, Float? y = null, Float? z = null);
    method public operator void set(int column, androidx.ui.graphics.vectormath.Vector4 v);
    method public operator void set(int column, int row, float v);
    method public inline void setForward(androidx.ui.graphics.vectormath.Vector3 value);
    method public void setFrom(androidx.ui.graphics.vectormath.Matrix4 arg);
    method public inline void setPosition(androidx.ui.graphics.vectormath.Vector3 value);
    method public inline void setRight(androidx.ui.graphics.vectormath.Vector3 value);
    method public void setTranslationRaw(float x, float y, float z);
    method public inline void setUp(androidx.ui.graphics.vectormath.Vector3 value);
    method public void setW(androidx.ui.graphics.vectormath.Vector4 p);
    method public void setX(androidx.ui.graphics.vectormath.Vector4 p);
    method public void setY(androidx.ui.graphics.vectormath.Vector4 p);
    method public void setZ(androidx.ui.graphics.vectormath.Vector4 p);
    method public operator androidx.ui.graphics.vectormath.Matrix4 times(float v);
    method public operator androidx.ui.graphics.vectormath.Matrix4 times(androidx.ui.graphics.vectormath.Matrix4 m);
    method public operator androidx.ui.graphics.vectormath.Vector4 times(androidx.ui.graphics.vectormath.Vector4 v);
    method public operator void timesAssign(androidx.ui.graphics.vectormath.Matrix4 m);
    method public float[] toFloatArray();
    method public void translate(Object x, float y = 0.0f, float z = 0.0f);
    method public operator androidx.ui.graphics.vectormath.Matrix4 unaryMinus();
    property public final float determinant;
    property public final inline androidx.ui.graphics.vectormath.Vector3 forward;
    property public final inline java.util.List<java.lang.Float> m4storage;
    property public final inline androidx.ui.graphics.vectormath.Vector3 position;
    property public final inline androidx.ui.graphics.vectormath.Vector3 right;
    property public final androidx.ui.graphics.vectormath.Vector3 rotation;
    property public final inline androidx.ui.graphics.vectormath.Vector3 scale;
    property public final inline androidx.ui.graphics.vectormath.Vector3 translation;
    property public final inline androidx.ui.graphics.vectormath.Vector3 up;
    property public final inline androidx.ui.graphics.vectormath.Matrix3 upperLeft;
    field public static final androidx.ui.graphics.vectormath.Matrix4.Companion Companion;
  }

  public static final class Matrix4.Companion {
    method public androidx.ui.graphics.vectormath.Matrix4 diagonal3(androidx.ui.graphics.vectormath.Vector3 scale);
    method public androidx.ui.graphics.vectormath.Matrix4 diagonal3Values(float x, float y, float z);
    method public androidx.ui.graphics.vectormath.Matrix4 identity();
    method public androidx.ui.graphics.vectormath.Matrix4 of(float... a);
    method public androidx.ui.graphics.vectormath.Matrix4 rotationX(float radians);
    method public androidx.ui.graphics.vectormath.Matrix4 rotationY(float radians);
    method public androidx.ui.graphics.vectormath.Matrix4 rotationZ(float radians);
    method public androidx.ui.graphics.vectormath.Matrix4 translation(androidx.ui.graphics.vectormath.Vector3 translation);
    method public androidx.ui.graphics.vectormath.Matrix4 translationValues(float x, float y, float z);
    method public androidx.ui.graphics.vectormath.Matrix4 zero();
  }

  public final class Matrix4Kt {
    method public static Float? getAsScale(androidx.ui.graphics.vectormath.Matrix4);
    method public static androidx.ui.geometry.Offset? getAsTranslation(androidx.ui.graphics.vectormath.Matrix4);
    method public static androidx.ui.geometry.Rect inverseTransformRect(androidx.ui.graphics.vectormath.Matrix4 transform, androidx.ui.geometry.Rect rect);
    method public static boolean isIdentity(androidx.ui.graphics.vectormath.Matrix4);
    method public static boolean matrixEquals(androidx.ui.graphics.vectormath.Matrix4? a, androidx.ui.graphics.vectormath.Matrix4? b);
    method public static androidx.ui.geometry.Offset transformPoint(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Offset point);
    method public static androidx.ui.geometry.Rect transformRect(androidx.ui.graphics.vectormath.Matrix4, androidx.ui.geometry.Rect rect);
  }

  public enum MatrixColumn {
    method public static androidx.ui.graphics.vectormath.MatrixColumn valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.vectormath.MatrixColumn[] values();
    enum_constant public static final androidx.ui.graphics.vectormath.MatrixColumn W;
    enum_constant public static final androidx.ui.graphics.vectormath.MatrixColumn X;
    enum_constant public static final androidx.ui.graphics.vectormath.MatrixColumn Y;
    enum_constant public static final androidx.ui.graphics.vectormath.MatrixColumn Z;
  }

  public final class MatrixExtensionsKt {
    method public static androidx.ui.graphics.vectormath.Matrix3 inverse(androidx.ui.graphics.vectormath.Matrix3 m);
    method public static androidx.ui.graphics.vectormath.Matrix4 inverse(androidx.ui.graphics.vectormath.Matrix4 m);
    method public static androidx.ui.graphics.vectormath.Matrix4 lookAt(androidx.ui.graphics.vectormath.Vector3 eye, androidx.ui.graphics.vectormath.Vector3 target, androidx.ui.graphics.vectormath.Vector3 up = androidx.ui.graphics.vectormath.Vector3(1.0));
    method public static androidx.ui.graphics.vectormath.Matrix4 lookTowards(androidx.ui.graphics.vectormath.Vector3 eye, androidx.ui.graphics.vectormath.Vector3 forward, androidx.ui.graphics.vectormath.Vector3 up = androidx.ui.graphics.vectormath.Vector3(1.0));
    method public static androidx.ui.graphics.vectormath.Matrix4 normal(androidx.ui.graphics.vectormath.Matrix4 m);
    method public static androidx.ui.graphics.vectormath.Matrix4 ortho(float l, float r, float b, float t, float n, float f);
    method public static androidx.ui.graphics.vectormath.Matrix4 perspective(float fov, float ratio, float near, float far);
    method public static androidx.ui.graphics.vectormath.Matrix4 rotation(androidx.ui.graphics.vectormath.Matrix4 m);
    method public static androidx.ui.graphics.vectormath.Matrix4 rotation(androidx.ui.graphics.vectormath.Vector3 d);
    method public static androidx.ui.graphics.vectormath.Matrix4 rotation(androidx.ui.graphics.vectormath.Vector3 axis, float angle);
    method public static androidx.ui.graphics.vectormath.Matrix4 scale(androidx.ui.graphics.vectormath.Vector3 s);
    method public static androidx.ui.graphics.vectormath.Matrix4 scale(androidx.ui.graphics.vectormath.Matrix4 m);
    method public static androidx.ui.graphics.vectormath.Matrix4 translation(androidx.ui.graphics.vectormath.Vector3 t);
    method public static androidx.ui.graphics.vectormath.Matrix4 translation(androidx.ui.graphics.vectormath.Matrix4 m);
    method public static androidx.ui.graphics.vectormath.Matrix3 transpose(androidx.ui.graphics.vectormath.Matrix3 m);
    method public static androidx.ui.graphics.vectormath.Matrix4 transpose(androidx.ui.graphics.vectormath.Matrix4 m);
  }

  public final class ScalarKt {
    method public static inline float degrees(float v);
    method public static inline float radians(float v);
    field public static final float FOUR_PI = 12.566371f;
    field public static final float HALF_PI = 1.5707964f;
    field public static final float INV_FOUR_PI = 0.07957747f;
    field public static final float INV_PI = 0.31830987f;
    field public static final float INV_TWO_PI = 0.15915494f;
    field public static final float PI = 3.1415927f;
    field public static final float TWO_PI = 6.2831855f;
  }

  public final class Vector2 {
    ctor public Vector2(float x, float y);
    ctor public Vector2();
    ctor public Vector2(androidx.ui.graphics.vectormath.Vector2 v);
    method public float component1();
    method public float component2();
    method public androidx.ui.graphics.vectormath.Vector2 copy(float x, float y);
    method public operator androidx.ui.graphics.vectormath.Vector2 dec();
    method public inline operator androidx.ui.graphics.vectormath.Vector2 div(float v);
    method public inline operator androidx.ui.graphics.vectormath.Vector2 div(androidx.ui.graphics.vectormath.Vector2 v);
    method public operator float get(androidx.ui.graphics.vectormath.VectorComponent index);
    method public operator androidx.ui.graphics.vectormath.Vector2 get(androidx.ui.graphics.vectormath.VectorComponent index1, androidx.ui.graphics.vectormath.VectorComponent index2);
    method public operator float get(int index);
    method public operator androidx.ui.graphics.vectormath.Vector2 get(int index1, int index2);
    method public inline float getG();
    method public inline float getR();
    method public inline androidx.ui.graphics.vectormath.Vector2 getRg();
    method public inline float getS();
    method public inline androidx.ui.graphics.vectormath.Vector2 getSt();
    method public inline float getT();
    method public inline java.util.List<java.lang.Float> getV2storage();
    method public float getX();
    method public inline androidx.ui.graphics.vectormath.Vector2 getXy();
    method public float getY();
    method public operator androidx.ui.graphics.vectormath.Vector2 inc();
    method public inline operator androidx.ui.graphics.vectormath.Vector2 minus(float v);
    method public inline operator androidx.ui.graphics.vectormath.Vector2 minus(androidx.ui.graphics.vectormath.Vector2 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector2 plus(float v);
    method public inline operator androidx.ui.graphics.vectormath.Vector2 plus(androidx.ui.graphics.vectormath.Vector2 v);
    method public operator void set(int index, float v);
    method public operator void set(int index1, int index2, float v);
    method public operator void set(androidx.ui.graphics.vectormath.VectorComponent index, float v);
    method public operator void set(androidx.ui.graphics.vectormath.VectorComponent index1, androidx.ui.graphics.vectormath.VectorComponent index2, float v);
    method public inline void setG(float value);
    method public inline void setR(float value);
    method public inline void setRg(androidx.ui.graphics.vectormath.Vector2 value);
    method public inline void setS(float value);
    method public inline void setSt(androidx.ui.graphics.vectormath.Vector2 value);
    method public inline void setT(float value);
    method public void setX(float p);
    method public inline void setXy(androidx.ui.graphics.vectormath.Vector2 value);
    method public void setY(float p);
    method public inline operator androidx.ui.graphics.vectormath.Vector2 times(float v);
    method public inline operator androidx.ui.graphics.vectormath.Vector2 times(androidx.ui.graphics.vectormath.Vector2 v);
    method public inline androidx.ui.graphics.vectormath.Vector2 transform(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> block);
    method public operator androidx.ui.graphics.vectormath.Vector2 unaryMinus();
    property public final inline float g;
    property public final inline float r;
    property public final inline androidx.ui.graphics.vectormath.Vector2 rg;
    property public final inline float s;
    property public final inline androidx.ui.graphics.vectormath.Vector2 st;
    property public final inline float t;
    property public final inline java.util.List<java.lang.Float> v2storage;
    property public final inline androidx.ui.graphics.vectormath.Vector2 xy;
  }

  public final class Vector3 {
    ctor public Vector3(float x, float y, float z);
    ctor public Vector3();
    ctor public Vector3(androidx.ui.graphics.vectormath.Vector2 v, float z);
    ctor public Vector3(androidx.ui.graphics.vectormath.Vector3 v);
    method public float component1();
    method public float component2();
    method public float component3();
    method public androidx.ui.graphics.vectormath.Vector3 copy(float x, float y, float z);
    method public operator androidx.ui.graphics.vectormath.Vector3 dec();
    method public inline operator androidx.ui.graphics.vectormath.Vector3 div(float v);
    method public inline operator androidx.ui.graphics.vectormath.Vector3 div(androidx.ui.graphics.vectormath.Vector2 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector3 div(androidx.ui.graphics.vectormath.Vector3 v);
    method public operator float get(androidx.ui.graphics.vectormath.VectorComponent index);
    method public operator androidx.ui.graphics.vectormath.Vector2 get(androidx.ui.graphics.vectormath.VectorComponent index1, androidx.ui.graphics.vectormath.VectorComponent index2);
    method public operator androidx.ui.graphics.vectormath.Vector3 get(androidx.ui.graphics.vectormath.VectorComponent index1, androidx.ui.graphics.vectormath.VectorComponent index2, androidx.ui.graphics.vectormath.VectorComponent index3);
    method public operator float get(int index);
    method public operator androidx.ui.graphics.vectormath.Vector2 get(int index1, int index2);
    method public operator androidx.ui.graphics.vectormath.Vector3 get(int index1, int index2, int index3);
    method public inline float getB();
    method public inline float getG();
    method public inline float getP();
    method public inline float getR();
    method public inline androidx.ui.graphics.vectormath.Vector2 getRg();
    method public inline androidx.ui.graphics.vectormath.Vector3 getRgb();
    method public inline float getS();
    method public inline androidx.ui.graphics.vectormath.Vector2 getSt();
    method public inline androidx.ui.graphics.vectormath.Vector3 getStp();
    method public inline float getT();
    method public inline java.util.List<java.lang.Float> getV3storage();
    method public float getX();
    method public inline androidx.ui.graphics.vectormath.Vector2 getXy();
    method public inline androidx.ui.graphics.vectormath.Vector3 getXyz();
    method public float getY();
    method public float getZ();
    method public operator androidx.ui.graphics.vectormath.Vector3 inc();
    method public inline operator androidx.ui.graphics.vectormath.Vector3 minus(float v);
    method public inline operator androidx.ui.graphics.vectormath.Vector3 minus(androidx.ui.graphics.vectormath.Vector2 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector3 minus(androidx.ui.graphics.vectormath.Vector3 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector3 plus(float v);
    method public inline operator androidx.ui.graphics.vectormath.Vector3 plus(androidx.ui.graphics.vectormath.Vector2 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector3 plus(androidx.ui.graphics.vectormath.Vector3 v);
    method public operator void set(int index, float v);
    method public operator void set(int index1, int index2, float v);
    method public operator void set(int index1, int index2, int index3, float v);
    method public operator void set(androidx.ui.graphics.vectormath.VectorComponent index, float v);
    method public operator void set(androidx.ui.graphics.vectormath.VectorComponent index1, androidx.ui.graphics.vectormath.VectorComponent index2, float v);
    method public operator void set(androidx.ui.graphics.vectormath.VectorComponent index1, androidx.ui.graphics.vectormath.VectorComponent index2, androidx.ui.graphics.vectormath.VectorComponent index3, float v);
    method public inline void setB(float value);
    method public inline void setG(float value);
    method public inline void setP(float value);
    method public inline void setR(float value);
    method public inline void setRg(androidx.ui.graphics.vectormath.Vector2 value);
    method public inline void setRgb(androidx.ui.graphics.vectormath.Vector3 value);
    method public inline void setS(float value);
    method public inline void setSt(androidx.ui.graphics.vectormath.Vector2 value);
    method public inline void setStp(androidx.ui.graphics.vectormath.Vector3 value);
    method public inline void setT(float value);
    method public void setX(float p);
    method public inline void setXy(androidx.ui.graphics.vectormath.Vector2 value);
    method public inline void setXyz(androidx.ui.graphics.vectormath.Vector3 value);
    method public void setY(float p);
    method public void setZ(float p);
    method public inline operator androidx.ui.graphics.vectormath.Vector3 times(float v);
    method public inline operator androidx.ui.graphics.vectormath.Vector3 times(androidx.ui.graphics.vectormath.Vector2 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector3 times(androidx.ui.graphics.vectormath.Vector3 v);
    method public inline androidx.ui.graphics.vectormath.Vector3 transform(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> block);
    method public operator androidx.ui.graphics.vectormath.Vector3 unaryMinus();
    property public final inline float b;
    property public final inline float g;
    property public final inline float p;
    property public final inline float r;
    property public final inline androidx.ui.graphics.vectormath.Vector2 rg;
    property public final inline androidx.ui.graphics.vectormath.Vector3 rgb;
    property public final inline float s;
    property public final inline androidx.ui.graphics.vectormath.Vector2 st;
    property public final inline androidx.ui.graphics.vectormath.Vector3 stp;
    property public final inline float t;
    property public final inline java.util.List<java.lang.Float> v3storage;
    property public final inline androidx.ui.graphics.vectormath.Vector2 xy;
    property public final inline androidx.ui.graphics.vectormath.Vector3 xyz;
  }

  public final class Vector4 {
    ctor public Vector4(float x, float y, float z, float w);
    ctor public Vector4();
    ctor public Vector4(androidx.ui.graphics.vectormath.Vector2 v, float z, float w);
    ctor public Vector4(androidx.ui.graphics.vectormath.Vector3 v, float w);
    ctor public Vector4(androidx.ui.graphics.vectormath.Vector4 v);
    method public void assignFromStorage(java.util.List<java.lang.Float> storage);
    method public float component1();
    method public float component2();
    method public float component3();
    method public float component4();
    method public androidx.ui.graphics.vectormath.Vector4 copy(float x, float y, float z, float w);
    method public operator androidx.ui.graphics.vectormath.Vector4 dec();
    method public inline operator androidx.ui.graphics.vectormath.Vector4 div(float v);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 div(androidx.ui.graphics.vectormath.Vector2 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 div(androidx.ui.graphics.vectormath.Vector3 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 div(androidx.ui.graphics.vectormath.Vector4 v);
    method public operator float get(androidx.ui.graphics.vectormath.VectorComponent index);
    method public operator androidx.ui.graphics.vectormath.Vector2 get(androidx.ui.graphics.vectormath.VectorComponent index1, androidx.ui.graphics.vectormath.VectorComponent index2);
    method public operator androidx.ui.graphics.vectormath.Vector3 get(androidx.ui.graphics.vectormath.VectorComponent index1, androidx.ui.graphics.vectormath.VectorComponent index2, androidx.ui.graphics.vectormath.VectorComponent index3);
    method public operator androidx.ui.graphics.vectormath.Vector4 get(androidx.ui.graphics.vectormath.VectorComponent index1, androidx.ui.graphics.vectormath.VectorComponent index2, androidx.ui.graphics.vectormath.VectorComponent index3, androidx.ui.graphics.vectormath.VectorComponent index4);
    method public operator float get(int index);
    method public operator androidx.ui.graphics.vectormath.Vector2 get(int index1, int index2);
    method public operator androidx.ui.graphics.vectormath.Vector3 get(int index1, int index2, int index3);
    method public operator androidx.ui.graphics.vectormath.Vector4 get(int index1, int index2, int index3, int index4);
    method public inline float getA();
    method public inline float getB();
    method public inline float getG();
    method public inline float getP();
    method public inline float getQ();
    method public inline float getR();
    method public inline androidx.ui.graphics.vectormath.Vector2 getRg();
    method public inline androidx.ui.graphics.vectormath.Vector3 getRgb();
    method public inline androidx.ui.graphics.vectormath.Vector4 getRgba();
    method public inline float getS();
    method public inline androidx.ui.graphics.vectormath.Vector2 getSt();
    method public inline androidx.ui.graphics.vectormath.Vector3 getStp();
    method public inline androidx.ui.graphics.vectormath.Vector4 getStpq();
    method public inline float getT();
    method public inline java.util.List<java.lang.Float> getV4storage();
    method public float getW();
    method public float getX();
    method public inline androidx.ui.graphics.vectormath.Vector2 getXy();
    method public inline androidx.ui.graphics.vectormath.Vector3 getXyz();
    method public inline androidx.ui.graphics.vectormath.Vector4 getXyzw();
    method public float getY();
    method public float getZ();
    method public operator androidx.ui.graphics.vectormath.Vector4 inc();
    method public inline operator androidx.ui.graphics.vectormath.Vector4 minus(float v);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 minus(androidx.ui.graphics.vectormath.Vector2 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 minus(androidx.ui.graphics.vectormath.Vector3 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 minus(androidx.ui.graphics.vectormath.Vector4 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 plus(float v);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 plus(androidx.ui.graphics.vectormath.Vector2 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 plus(androidx.ui.graphics.vectormath.Vector3 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 plus(androidx.ui.graphics.vectormath.Vector4 v);
    method public operator void set(int index, float v);
    method public operator void set(int index1, int index2, float v);
    method public operator void set(int index1, int index2, int index3, float v);
    method public operator void set(int index1, int index2, int index3, int index4, float v);
    method public operator void set(androidx.ui.graphics.vectormath.VectorComponent index, float v);
    method public operator void set(androidx.ui.graphics.vectormath.VectorComponent index1, androidx.ui.graphics.vectormath.VectorComponent index2, float v);
    method public operator void set(androidx.ui.graphics.vectormath.VectorComponent index1, androidx.ui.graphics.vectormath.VectorComponent index2, androidx.ui.graphics.vectormath.VectorComponent index3, float v);
    method public operator void set(androidx.ui.graphics.vectormath.VectorComponent index1, androidx.ui.graphics.vectormath.VectorComponent index2, androidx.ui.graphics.vectormath.VectorComponent index3, androidx.ui.graphics.vectormath.VectorComponent index4, float v);
    method public inline void setA(float value);
    method public inline void setB(float value);
    method public inline void setG(float value);
    method public inline void setP(float value);
    method public inline void setQ(float value);
    method public inline void setR(float value);
    method public inline void setRg(androidx.ui.graphics.vectormath.Vector2 value);
    method public inline void setRgb(androidx.ui.graphics.vectormath.Vector3 value);
    method public inline void setRgba(androidx.ui.graphics.vectormath.Vector4 value);
    method public inline void setS(float value);
    method public inline void setSt(androidx.ui.graphics.vectormath.Vector2 value);
    method public inline void setStp(androidx.ui.graphics.vectormath.Vector3 value);
    method public inline void setStpq(androidx.ui.graphics.vectormath.Vector4 value);
    method public inline void setT(float value);
    method public void setW(float p);
    method public void setX(float p);
    method public inline void setXy(androidx.ui.graphics.vectormath.Vector2 value);
    method public inline void setXyz(androidx.ui.graphics.vectormath.Vector3 value);
    method public inline void setXyzw(androidx.ui.graphics.vectormath.Vector4 value);
    method public void setY(float p);
    method public void setZ(float p);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 times(float v);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 times(androidx.ui.graphics.vectormath.Vector2 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 times(androidx.ui.graphics.vectormath.Vector3 v);
    method public inline operator androidx.ui.graphics.vectormath.Vector4 times(androidx.ui.graphics.vectormath.Vector4 v);
    method public inline androidx.ui.graphics.vectormath.Vector4 transform(kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> block);
    method public operator androidx.ui.graphics.vectormath.Vector4 unaryMinus();
    property public final inline float a;
    property public final inline float b;
    property public final inline float g;
    property public final inline float p;
    property public final inline float q;
    property public final inline float r;
    property public final inline androidx.ui.graphics.vectormath.Vector2 rg;
    property public final inline androidx.ui.graphics.vectormath.Vector3 rgb;
    property public final inline androidx.ui.graphics.vectormath.Vector4 rgba;
    property public final inline float s;
    property public final inline androidx.ui.graphics.vectormath.Vector2 st;
    property public final inline androidx.ui.graphics.vectormath.Vector3 stp;
    property public final inline androidx.ui.graphics.vectormath.Vector4 stpq;
    property public final inline float t;
    property public final inline java.util.List<java.lang.Float> v4storage;
    property public final inline androidx.ui.graphics.vectormath.Vector2 xy;
    property public final inline androidx.ui.graphics.vectormath.Vector3 xyz;
    property public final inline androidx.ui.graphics.vectormath.Vector4 xyzw;
  }

  public enum VectorComponent {
    method public static androidx.ui.graphics.vectormath.VectorComponent valueOf(String name) throws java.lang.IllegalArgumentException;
    method public static androidx.ui.graphics.vectormath.VectorComponent[] values();
    enum_constant public static final androidx.ui.graphics.vectormath.VectorComponent A;
    enum_constant public static final androidx.ui.graphics.vectormath.VectorComponent B;
    enum_constant public static final androidx.ui.graphics.vectormath.VectorComponent G;
    enum_constant public static final androidx.ui.graphics.vectormath.VectorComponent P;
    enum_constant public static final androidx.ui.graphics.vectormath.VectorComponent Q;
    enum_constant public static final androidx.ui.graphics.vectormath.VectorComponent R;
    enum_constant public static final androidx.ui.graphics.vectormath.VectorComponent S;
    enum_constant public static final androidx.ui.graphics.vectormath.VectorComponent T;
    enum_constant public static final androidx.ui.graphics.vectormath.VectorComponent W;
    enum_constant public static final androidx.ui.graphics.vectormath.VectorComponent X;
    enum_constant public static final androidx.ui.graphics.vectormath.VectorComponent Y;
    enum_constant public static final androidx.ui.graphics.vectormath.VectorComponent Z;
  }

  public final class VectorExtensionsKt {
    method public static inline androidx.ui.graphics.vectormath.Vector2 abs(androidx.ui.graphics.vectormath.Vector2 v);
    method public static inline androidx.ui.graphics.vectormath.Vector3 abs(androidx.ui.graphics.vectormath.Vector3 v);
    method public static inline androidx.ui.graphics.vectormath.Vector4 abs(androidx.ui.graphics.vectormath.Vector4 v);
    method public static inline androidx.ui.graphics.vectormath.Vector2 coerceIn(androidx.ui.graphics.vectormath.Vector2, float min, float max);
    method public static inline androidx.ui.graphics.vectormath.Vector2 coerceIn(androidx.ui.graphics.vectormath.Vector2, androidx.ui.graphics.vectormath.Vector2 min, androidx.ui.graphics.vectormath.Vector2 max);
    method public static inline androidx.ui.graphics.vectormath.Vector3 coerceIn(androidx.ui.graphics.vectormath.Vector3, float min, float max);
    method public static inline androidx.ui.graphics.vectormath.Vector3 coerceIn(androidx.ui.graphics.vectormath.Vector3, androidx.ui.graphics.vectormath.Vector3 min, androidx.ui.graphics.vectormath.Vector3 max);
    method public static inline androidx.ui.graphics.vectormath.Vector4 coerceIn(androidx.ui.graphics.vectormath.Vector4, float min, float max);
    method public static inline androidx.ui.graphics.vectormath.Vector4 coerceIn(androidx.ui.graphics.vectormath.Vector4, androidx.ui.graphics.vectormath.Vector4 min, androidx.ui.graphics.vectormath.Vector4 max);
    method public static inline androidx.ui.graphics.vectormath.Vector3 cross(androidx.ui.graphics.vectormath.Vector3 a, androidx.ui.graphics.vectormath.Vector3 b);
    method public static inline float distance(androidx.ui.graphics.vectormath.Vector2 a, androidx.ui.graphics.vectormath.Vector2 b);
    method public static inline float distance(androidx.ui.graphics.vectormath.Vector3 a, androidx.ui.graphics.vectormath.Vector3 b);
    method public static inline float distance(androidx.ui.graphics.vectormath.Vector4 a, androidx.ui.graphics.vectormath.Vector4 b);
    method public static inline operator androidx.ui.graphics.vectormath.Vector2 div(float, androidx.ui.graphics.vectormath.Vector2 v);
    method public static inline operator androidx.ui.graphics.vectormath.Vector3 div(float, androidx.ui.graphics.vectormath.Vector3 v);
    method public static inline operator androidx.ui.graphics.vectormath.Vector4 div(float, androidx.ui.graphics.vectormath.Vector4 v);
    method public static inline float dot(androidx.ui.graphics.vectormath.Vector2 a, androidx.ui.graphics.vectormath.Vector2 b);
    method public static inline float dot(androidx.ui.graphics.vectormath.Vector3 a, androidx.ui.graphics.vectormath.Vector3 b);
    method public static inline float dot(androidx.ui.graphics.vectormath.Vector4 a, androidx.ui.graphics.vectormath.Vector4 b);
    method public static inline float length(androidx.ui.graphics.vectormath.Vector2 v);
    method public static inline float length(androidx.ui.graphics.vectormath.Vector3 v);
    method public static inline float length(androidx.ui.graphics.vectormath.Vector4 v);
    method public static inline float length2(androidx.ui.graphics.vectormath.Vector2 v);
    method public static inline float length2(androidx.ui.graphics.vectormath.Vector3 v);
    method public static inline float length2(androidx.ui.graphics.vectormath.Vector4 v);
    method public static inline float max(androidx.ui.graphics.vectormath.Vector2 v);
    method public static inline androidx.ui.graphics.vectormath.Vector2 max(androidx.ui.graphics.vectormath.Vector2 a, androidx.ui.graphics.vectormath.Vector2 b);
    method public static inline float max(androidx.ui.graphics.vectormath.Vector3 v);
    method public static inline androidx.ui.graphics.vectormath.Vector3 max(androidx.ui.graphics.vectormath.Vector3 a, androidx.ui.graphics.vectormath.Vector3 b);
    method public static inline float max(androidx.ui.graphics.vectormath.Vector4 v);
    method public static inline androidx.ui.graphics.vectormath.Vector4 max(androidx.ui.graphics.vectormath.Vector4 a, androidx.ui.graphics.vectormath.Vector4 b);
    method public static inline float min(androidx.ui.graphics.vectormath.Vector2 v);
    method public static inline androidx.ui.graphics.vectormath.Vector2 min(androidx.ui.graphics.vectormath.Vector2 a, androidx.ui.graphics.vectormath.Vector2 b);
    method public static inline float min(androidx.ui.graphics.vectormath.Vector3 v);
    method public static inline androidx.ui.graphics.vectormath.Vector3 min(androidx.ui.graphics.vectormath.Vector3 a, androidx.ui.graphics.vectormath.Vector3 b);
    method public static inline float min(androidx.ui.graphics.vectormath.Vector4 v);
    method public static inline androidx.ui.graphics.vectormath.Vector4 min(androidx.ui.graphics.vectormath.Vector4 a, androidx.ui.graphics.vectormath.Vector4 b);
    method public static inline operator androidx.ui.graphics.vectormath.Vector2 minus(float, androidx.ui.graphics.vectormath.Vector2 v);
    method public static inline operator androidx.ui.graphics.vectormath.Vector3 minus(float, androidx.ui.graphics.vectormath.Vector3 v);
    method public static inline operator androidx.ui.graphics.vectormath.Vector4 minus(float, androidx.ui.graphics.vectormath.Vector4 v);
    method public static androidx.ui.graphics.vectormath.Vector2 normalize(androidx.ui.graphics.vectormath.Vector2 v);
    method public static androidx.ui.graphics.vectormath.Vector3 normalize(androidx.ui.graphics.vectormath.Vector3 v);
    method public static androidx.ui.graphics.vectormath.Vector4 normalize(androidx.ui.graphics.vectormath.Vector4 v);
    method public static inline operator androidx.ui.graphics.vectormath.Vector2 plus(float, androidx.ui.graphics.vectormath.Vector2 v);
    method public static inline operator androidx.ui.graphics.vectormath.Vector3 plus(float, androidx.ui.graphics.vectormath.Vector3 v);
    method public static inline operator androidx.ui.graphics.vectormath.Vector4 plus(float, androidx.ui.graphics.vectormath.Vector4 v);
    method public static inline androidx.ui.graphics.vectormath.Vector2 reflect(androidx.ui.graphics.vectormath.Vector2 i, androidx.ui.graphics.vectormath.Vector2 n);
    method public static inline androidx.ui.graphics.vectormath.Vector3 reflect(androidx.ui.graphics.vectormath.Vector3 i, androidx.ui.graphics.vectormath.Vector3 n);
    method public static androidx.ui.graphics.vectormath.Vector2 refract(androidx.ui.graphics.vectormath.Vector2 i, androidx.ui.graphics.vectormath.Vector2 n, float eta);
    method public static androidx.ui.graphics.vectormath.Vector3 refract(androidx.ui.graphics.vectormath.Vector3 i, androidx.ui.graphics.vectormath.Vector3 n, float eta);
    method public static inline operator androidx.ui.graphics.vectormath.Vector2 times(float, androidx.ui.graphics.vectormath.Vector2 v);
    method public static inline operator androidx.ui.graphics.vectormath.Vector3 times(float, androidx.ui.graphics.vectormath.Vector3 v);
    method public static inline operator androidx.ui.graphics.vectormath.Vector4 times(float, androidx.ui.graphics.vectormath.Vector4 v);
    method public static inline androidx.ui.graphics.vectormath.Vector2 transform(androidx.ui.graphics.vectormath.Vector2 v, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> block);
    method public static inline androidx.ui.graphics.vectormath.Vector3 transform(androidx.ui.graphics.vectormath.Vector3 v, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> block);
    method public static inline androidx.ui.graphics.vectormath.Vector4 transform(androidx.ui.graphics.vectormath.Vector4 v, kotlin.jvm.functions.Function1<? super java.lang.Float,java.lang.Float> block);
    method public static inline infix androidx.ui.graphics.vectormath.Vector3 x(androidx.ui.graphics.vectormath.Vector3, androidx.ui.graphics.vectormath.Vector3 v);
  }

}

