[go: nahoru, domu]

Move DrawScope to ui-graphics

Relnote: "Consolidated CanvasScope implementations
so there is now just DrawScope and
ContentDrawScope
Renamed CanvasScope to DrawScope.
Updated DrawScope to implement Density
interface and provide LayoutDirection
Deleted DrawScope subclass in ContentDrawScope
Painter and PainterModifier have been updated
to no longer maintain an RTL property
themselves as DrawScope provides this already
without manually providing it"

Change-Id: I1798e4b2b325297c3b5394aa99be3db935e369b7
Fixes: 155918846
Test: re-run compose tests
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrollingDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrollingDemo.kt
index 2125c1a..ea920d5 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrollingDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/FancyScrollingDemo.kt
@@ -32,7 +32,7 @@
 import androidx.ui.geometry.Offset
 import androidx.ui.geometry.Size
 import androidx.ui.graphics.Color
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.layout.Column
 import androidx.ui.layout.fillMaxWidth
 import androidx.ui.layout.padding
@@ -91,7 +91,7 @@
     }
 }
 
-private fun CanvasScope.drawItems(
+private fun DrawScope.drawItems(
     scrollPosition: Float,
     width: Float,
     height: Float
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrollingDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrollingDemo.kt
index 8e4b811f..97bbc57 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrollingDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SpringBackScrollingDemo.kt
@@ -31,7 +31,7 @@
 import androidx.ui.geometry.Offset
 import androidx.ui.geometry.Size
 import androidx.ui.graphics.Color
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.layout.Column
 import androidx.ui.layout.fillMaxHeight
 import androidx.ui.layout.fillMaxWidth
@@ -104,7 +104,7 @@
     }
 }
 
-private fun CanvasScope.drawRects(animScroll: Float) {
+private fun DrawScope.drawRects(animScroll: Float) {
     val width = size.width / 2f
     val scroll = animScroll + width / 2
     var startingPos = scroll % width
diff --git a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismissDemo.kt b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismissDemo.kt
index 43ac47f..5aebbd4 100644
--- a/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismissDemo.kt
+++ b/ui/ui-animation/integration-tests/animation-demos/src/main/java/androidx/ui/animation/demos/SwipeToDismissDemo.kt
@@ -35,7 +35,7 @@
 import androidx.ui.geometry.Offset
 import androidx.ui.geometry.Size
 import androidx.ui.graphics.Color
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.layout.Column
 import androidx.ui.layout.fillMaxWidth
 import androidx.ui.layout.padding
@@ -137,7 +137,7 @@
     }
 }
 
-private fun CanvasScope.drawLeftItems(
+private fun DrawScope.drawLeftItems(
     horizontalOffset: Float,
     width: Float,
     height: Float,
@@ -157,7 +157,7 @@
     }
 }
 
-private fun CanvasScope.drawDismissingItem(
+private fun DrawScope.drawDismissingItem(
     bottom: Float,
     width: Float,
     height: Float,
diff --git a/ui/ui-core/api/0.1.0-dev12.txt b/ui/ui-core/api/0.1.0-dev12.txt
index 8749bae..d8cf738 100644
--- a/ui/ui-core/api/0.1.0-dev12.txt
+++ b/ui/ui-core/api/0.1.0-dev12.txt
@@ -232,7 +232,7 @@
     method public androidx.ui.unit.PxPosition getPositionChange();
   }
 
-  public abstract class ContentDrawScope extends androidx.ui.core.DrawScope {
+  public abstract class ContentDrawScope extends androidx.ui.graphics.painter.DrawScope {
     ctor public ContentDrawScope();
     method public abstract void drawContent();
   }
@@ -329,18 +329,12 @@
   }
 
   public final class DrawModifierKt {
-    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onDraw);
     method public static androidx.ui.core.Modifier drawWithContent(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
     method @Deprecated public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
   }
 
-  public abstract class DrawScope extends androidx.ui.graphics.painter.CanvasScope implements androidx.ui.unit.Density {
-    ctor public DrawScope();
-    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
-    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
-  }
-
   public final class DrawShadowKt {
     method public static androidx.ui.core.Modifier drawShadow-xWKVMPI(androidx.ui.core.Modifier, float elevation, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, boolean clip = elevation > 0.dp, @FloatRange(from=0.0, to=1.0) float opacity = 1f);
   }
@@ -697,7 +691,7 @@
 
   public final class PainterModifierKt {
     method @Deprecated public static androidx.ui.core.DrawModifier asModifier(androidx.ui.graphics.painter.Painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
-    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
   }
 
   public interface ParentDataModifier extends androidx.ui.core.Modifier.Element {
@@ -2013,7 +2007,7 @@
 
   public final class VectorPainter extends androidx.ui.graphics.painter.Painter {
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
diff --git a/ui/ui-core/api/current.txt b/ui/ui-core/api/current.txt
index 8749bae..d8cf738 100644
--- a/ui/ui-core/api/current.txt
+++ b/ui/ui-core/api/current.txt
@@ -232,7 +232,7 @@
     method public androidx.ui.unit.PxPosition getPositionChange();
   }
 
-  public abstract class ContentDrawScope extends androidx.ui.core.DrawScope {
+  public abstract class ContentDrawScope extends androidx.ui.graphics.painter.DrawScope {
     ctor public ContentDrawScope();
     method public abstract void drawContent();
   }
@@ -329,18 +329,12 @@
   }
 
   public final class DrawModifierKt {
-    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onDraw);
     method public static androidx.ui.core.Modifier drawWithContent(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
     method @Deprecated public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
   }
 
-  public abstract class DrawScope extends androidx.ui.graphics.painter.CanvasScope implements androidx.ui.unit.Density {
-    ctor public DrawScope();
-    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
-    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
-  }
-
   public final class DrawShadowKt {
     method public static androidx.ui.core.Modifier drawShadow-xWKVMPI(androidx.ui.core.Modifier, float elevation, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, boolean clip = elevation > 0.dp, @FloatRange(from=0.0, to=1.0) float opacity = 1f);
   }
@@ -697,7 +691,7 @@
 
   public final class PainterModifierKt {
     method @Deprecated public static androidx.ui.core.DrawModifier asModifier(androidx.ui.graphics.painter.Painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
-    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
   }
 
   public interface ParentDataModifier extends androidx.ui.core.Modifier.Element {
@@ -2013,7 +2007,7 @@
 
   public final class VectorPainter extends androidx.ui.graphics.painter.Painter {
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
diff --git a/ui/ui-core/api/public_plus_experimental_0.1.0-dev12.txt b/ui/ui-core/api/public_plus_experimental_0.1.0-dev12.txt
index c6b6cb3..054bb2b 100644
--- a/ui/ui-core/api/public_plus_experimental_0.1.0-dev12.txt
+++ b/ui/ui-core/api/public_plus_experimental_0.1.0-dev12.txt
@@ -232,7 +232,7 @@
     method public androidx.ui.unit.PxPosition getPositionChange();
   }
 
-  public abstract class ContentDrawScope extends androidx.ui.core.DrawScope {
+  public abstract class ContentDrawScope extends androidx.ui.graphics.painter.DrawScope {
     ctor public ContentDrawScope();
     method public abstract void drawContent();
   }
@@ -330,18 +330,12 @@
   }
 
   public final class DrawModifierKt {
-    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onDraw);
     method public static androidx.ui.core.Modifier drawWithContent(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
     method @Deprecated public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
   }
 
-  public abstract class DrawScope extends androidx.ui.graphics.painter.CanvasScope implements androidx.ui.unit.Density {
-    ctor public DrawScope();
-    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
-    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
-  }
-
   public final class DrawShadowKt {
     method public static androidx.ui.core.Modifier drawShadow-xWKVMPI(androidx.ui.core.Modifier, float elevation, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, boolean clip = elevation > 0.dp, @FloatRange(from=0.0, to=1.0) float opacity = 1f);
   }
@@ -699,7 +693,7 @@
 
   public final class PainterModifierKt {
     method @Deprecated public static androidx.ui.core.DrawModifier asModifier(androidx.ui.graphics.painter.Painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
-    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
   }
 
   public interface ParentDataModifier extends androidx.ui.core.Modifier.Element {
@@ -2015,7 +2009,7 @@
 
   public final class VectorPainter extends androidx.ui.graphics.painter.Painter {
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
diff --git a/ui/ui-core/api/public_plus_experimental_current.txt b/ui/ui-core/api/public_plus_experimental_current.txt
index c6b6cb3..054bb2b 100644
--- a/ui/ui-core/api/public_plus_experimental_current.txt
+++ b/ui/ui-core/api/public_plus_experimental_current.txt
@@ -232,7 +232,7 @@
     method public androidx.ui.unit.PxPosition getPositionChange();
   }
 
-  public abstract class ContentDrawScope extends androidx.ui.core.DrawScope {
+  public abstract class ContentDrawScope extends androidx.ui.graphics.painter.DrawScope {
     ctor public ContentDrawScope();
     method public abstract void drawContent();
   }
@@ -330,18 +330,12 @@
   }
 
   public final class DrawModifierKt {
-    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onDraw);
     method public static androidx.ui.core.Modifier drawWithContent(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
     method @Deprecated public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
   }
 
-  public abstract class DrawScope extends androidx.ui.graphics.painter.CanvasScope implements androidx.ui.unit.Density {
-    ctor public DrawScope();
-    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
-    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
-  }
-
   public final class DrawShadowKt {
     method public static androidx.ui.core.Modifier drawShadow-xWKVMPI(androidx.ui.core.Modifier, float elevation, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, boolean clip = elevation > 0.dp, @FloatRange(from=0.0, to=1.0) float opacity = 1f);
   }
@@ -699,7 +693,7 @@
 
   public final class PainterModifierKt {
     method @Deprecated public static androidx.ui.core.DrawModifier asModifier(androidx.ui.graphics.painter.Painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
-    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
   }
 
   public interface ParentDataModifier extends androidx.ui.core.Modifier.Element {
@@ -2015,7 +2009,7 @@
 
   public final class VectorPainter extends androidx.ui.graphics.painter.Painter {
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
diff --git a/ui/ui-core/api/restricted_0.1.0-dev12.txt b/ui/ui-core/api/restricted_0.1.0-dev12.txt
index 1037247..7a13f08 100644
--- a/ui/ui-core/api/restricted_0.1.0-dev12.txt
+++ b/ui/ui-core/api/restricted_0.1.0-dev12.txt
@@ -238,7 +238,7 @@
     method public androidx.ui.unit.PxPosition getPositionChange();
   }
 
-  public abstract class ContentDrawScope extends androidx.ui.core.DrawScope {
+  public abstract class ContentDrawScope extends androidx.ui.graphics.painter.DrawScope {
     ctor public ContentDrawScope();
     method public abstract void drawContent();
   }
@@ -336,18 +336,12 @@
   }
 
   public final class DrawModifierKt {
-    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onDraw);
     method public static androidx.ui.core.Modifier drawWithContent(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
     method @Deprecated public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
   }
 
-  public abstract class DrawScope extends androidx.ui.graphics.painter.CanvasScope implements androidx.ui.unit.Density {
-    ctor public DrawScope();
-    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
-    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
-  }
-
   public final class DrawShadowKt {
     method public static androidx.ui.core.Modifier drawShadow-xWKVMPI(androidx.ui.core.Modifier, float elevation, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, boolean clip = elevation > 0.dp, @FloatRange(from=0.0, to=1.0) float opacity = 1f);
   }
@@ -707,7 +701,7 @@
 
   public final class PainterModifierKt {
     method @Deprecated public static androidx.ui.core.DrawModifier asModifier(androidx.ui.graphics.painter.Painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
-    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
   }
 
   public interface ParentDataModifier extends androidx.ui.core.Modifier.Element {
@@ -2023,7 +2017,7 @@
 
   public final class VectorPainter extends androidx.ui.graphics.painter.Painter {
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
diff --git a/ui/ui-core/api/restricted_current.txt b/ui/ui-core/api/restricted_current.txt
index 1037247..7a13f08 100644
--- a/ui/ui-core/api/restricted_current.txt
+++ b/ui/ui-core/api/restricted_current.txt
@@ -238,7 +238,7 @@
     method public androidx.ui.unit.PxPosition getPositionChange();
   }
 
-  public abstract class ContentDrawScope extends androidx.ui.core.DrawScope {
+  public abstract class ContentDrawScope extends androidx.ui.graphics.painter.DrawScope {
     ctor public ContentDrawScope();
     method public abstract void drawContent();
   }
@@ -336,18 +336,12 @@
   }
 
   public final class DrawModifierKt {
-    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
-    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onDraw);
+    method @Deprecated public static androidx.ui.core.DrawModifier draw(kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onDraw);
+    method public static androidx.ui.core.Modifier drawBehind(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onDraw);
     method public static androidx.ui.core.Modifier drawWithContent(androidx.ui.core.Modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
     method @Deprecated public static androidx.ui.core.DrawModifier drawWithContent(kotlin.jvm.functions.Function1<? super androidx.ui.core.ContentDrawScope,kotlin.Unit> onDraw);
   }
 
-  public abstract class DrawScope extends androidx.ui.graphics.painter.CanvasScope implements androidx.ui.unit.Density {
-    ctor public DrawScope();
-    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
-    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
-  }
-
   public final class DrawShadowKt {
     method public static androidx.ui.core.Modifier drawShadow-xWKVMPI(androidx.ui.core.Modifier, float elevation, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, boolean clip = elevation > 0.dp, @FloatRange(from=0.0, to=1.0) float opacity = 1f);
   }
@@ -707,7 +701,7 @@
 
   public final class PainterModifierKt {
     method @Deprecated public static androidx.ui.core.DrawModifier asModifier(androidx.ui.graphics.painter.Painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
-    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+    method public static androidx.ui.core.Modifier paint(androidx.ui.core.Modifier, androidx.ui.graphics.painter.Painter painter, boolean sizeToIntrinsics = true, androidx.ui.core.Alignment alignment = Alignment.Center, androidx.ui.core.ContentScale contentScale = ContentScale.Inside, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
   }
 
   public interface ParentDataModifier extends androidx.ui.core.Modifier.Element {
@@ -2023,7 +2017,7 @@
 
   public final class VectorPainter extends androidx.ui.graphics.painter.Painter {
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
diff --git a/ui/ui-core/samples/src/main/java/androidx/ui/core/samples/PainterSample.kt b/ui/ui-core/samples/src/main/java/androidx/ui/core/samples/PainterSample.kt
index 7ea6837..7a334df 100644
--- a/ui/ui-core/samples/src/main/java/androidx/ui/core/samples/PainterSample.kt
+++ b/ui/ui-core/samples/src/main/java/androidx/ui/core/samples/PainterSample.kt
@@ -23,7 +23,7 @@
 import androidx.ui.foundation.drawBackground
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.painter.Painter
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.layout.padding
 import androidx.ui.unit.Px
 import androidx.ui.unit.PxSize
@@ -40,7 +40,7 @@
                 Px(300.0f)
             )
 
-        override fun CanvasScope.onDraw() {
+        override fun DrawScope.onDraw() {
             drawCircle(
                 center = center,
                 radius = size.minDimension / 2.0f,
diff --git a/ui/ui-core/src/androidTest/java/androidx/ui/core/PainterModifierTest.kt b/ui/ui-core/src/androidTest/java/androidx/ui/core/PainterModifierTest.kt
index 40c49c8..8390dbd 100644
--- a/ui/ui-core/src/androidTest/java/androidx/ui/core/PainterModifierTest.kt
+++ b/ui/ui-core/src/androidTest/java/androidx/ui/core/PainterModifierTest.kt
@@ -34,9 +34,11 @@
 import androidx.ui.graphics.ColorFilter
 import androidx.ui.graphics.DefaultAlpha
 import androidx.ui.graphics.compositeOver
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.graphics.painter.Painter
 import androidx.ui.graphics.toArgb
+import androidx.ui.layout.ltr
+import androidx.ui.layout.rtl
 import androidx.ui.unit.IntPx
 import androidx.ui.unit.Px
 import androidx.ui.unit.PxSize
@@ -373,15 +375,14 @@
         rtl: Boolean = false,
         latch: CountDownLatch
     ) {
-        with(DensityAmbient.current) {
-            val p = LatchPainter(containerWidth, containerHeight, latch)
-            AtLeastSize(
-                modifier = Modifier.background(Color.White)
-                    .paint(p, alpha = alpha, colorFilter = colorFilter, rtl = rtl),
-                size = containerWidth.roundToInt().ipx
-            ) {
-                // Intentionally empty
-            }
+        val p = LatchPainter(containerWidth, containerHeight, latch)
+        AtLeastSize(
+            modifier = Modifier.background(Color.White)
+                .plus(if (rtl) Modifier.rtl else Modifier.ltr)
+                .paint(p, alpha = alpha, colorFilter = colorFilter),
+            size = containerWidth.roundToInt().ipx
+        ) {
+            // Intentionally empty
         }
     }
 
@@ -406,12 +407,12 @@
                 Px(height)
             )
 
-        override fun applyRtl(rtl: Boolean): Boolean {
-            color = if (rtl) Color.Blue else Color.Red
+        override fun applyLayoutDirection(layoutDirection: LayoutDirection): Boolean {
+            color = if (layoutDirection == LayoutDirection.Rtl) Color.Blue else Color.Red
             return true
         }
 
-        override fun CanvasScope.onDraw() {
+        override fun DrawScope.onDraw() {
             drawRect(color = color)
             latch.countDown()
         }
diff --git a/ui/ui-core/src/androidTest/java/androidx/ui/core/test/ClipTest.kt b/ui/ui-core/src/androidTest/java/androidx/ui/core/test/ClipTest.kt
index 30e6f0b..ec45b3a 100644
--- a/ui/ui-core/src/androidTest/java/androidx/ui/core/test/ClipTest.kt
+++ b/ui/ui-core/src/androidTest/java/androidx/ui/core/test/ClipTest.kt
@@ -24,7 +24,6 @@
 import androidx.test.rule.ActivityTestRule
 import androidx.ui.core.DrawLayerModifier
 import androidx.ui.core.Modifier
-import androidx.ui.core.DrawScope
 import androidx.ui.core.clip
 import androidx.ui.core.clipToBounds
 import androidx.ui.core.drawBehind
@@ -40,6 +39,7 @@
 import androidx.ui.graphics.Path
 import androidx.ui.graphics.PathOperation
 import androidx.ui.graphics.Shape
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.unit.Density
 import androidx.ui.unit.PxSize
 import androidx.ui.unit.ipx
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/ContentDrawScope.kt b/ui/ui-core/src/main/java/androidx/ui/core/ContentDrawScope.kt
index 1d3a7b8..0194be1 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/ContentDrawScope.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/ContentDrawScope.kt
@@ -15,21 +15,7 @@
  */
 package androidx.ui.core
 
-import androidx.ui.graphics.painter.CanvasScope
-import androidx.ui.unit.Density
-
-/**
- * Receiver scope for drawing content into a layout.
- * @see Modifier.drawBehind
- * @see androidx.ui.foundation.Canvas
- */
-abstract class DrawScope() : CanvasScope(), Density {
-
-    /**
-     * The layout direction of the layout being drawn in.
-     */
-    abstract val layoutDirection: LayoutDirection
-}
+import androidx.ui.graphics.painter.DrawScope
 
 /**
  * Receiver scope for drawing content into a layout, where the content can
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/DrawModifier.kt b/ui/ui-core/src/main/java/androidx/ui/core/DrawModifier.kt
index 85310e0..458fc71 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/DrawModifier.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/DrawModifier.kt
@@ -17,6 +17,7 @@
 package androidx.ui.core
 
 import androidx.ui.graphics.Canvas
+import androidx.ui.graphics.painter.DrawScope
 
 /**
  * A [Modifier.Element] that draws into the space of the layout.
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/PainterModifier.kt b/ui/ui-core/src/main/java/androidx/ui/core/PainterModifier.kt
index b4c6f04..e8eac3e 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/PainterModifier.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/PainterModifier.kt
@@ -22,7 +22,6 @@
 import androidx.ui.graphics.ColorFilter
 import androidx.ui.graphics.DefaultAlpha
 import androidx.ui.graphics.painter.Painter
-import androidx.ui.graphics.painter.drawCanvas
 import androidx.ui.graphics.painter.withTransform
 import androidx.ui.unit.IntPx
 import androidx.ui.unit.IntPxSize
@@ -68,6 +67,7 @@
         "androidx.ui.core.paint"
     )
 )
+@Suppress("UNUSED_PARAMETER")
 @Composable
 fun Painter.asModifier(
     sizeToIntrinsics: Boolean = true,
@@ -79,8 +79,8 @@
 ): DrawModifier {
     // TODO potentially create thread-safe PainterModifier pool to allow for re-use
     //  of PainterModifier instances and avoid gc overhead
-    return remember(this, sizeToIntrinsics, alignment, contentScale, alpha, colorFilter, rtl) {
-        PainterModifier(this, sizeToIntrinsics, alignment, contentScale, alpha, colorFilter, rtl)
+    return remember(this, sizeToIntrinsics, alignment, contentScale, alpha, colorFilter) {
+        PainterModifier(this, sizeToIntrinsics, alignment, contentScale, alpha, colorFilter)
     }
 }
 
@@ -92,7 +92,6 @@
  * @param contentScale strategy for scaling [painter] if its size does not match the content size
  * @param alpha opacity of [painter]
  * @param colorFilter optional [ColorFilter] to apply to [painter]
- * @param rtl layout direction to report to [painter] when drawing
  */
 fun Modifier.paint(
     painter: Painter,
@@ -100,16 +99,14 @@
     alignment: Alignment = Alignment.Center,
     contentScale: ContentScale = ContentScale.Inside,
     alpha: Float = DefaultAlpha,
-    colorFilter: ColorFilter? = null,
-    rtl: Boolean = false
+    colorFilter: ColorFilter? = null
 ) = this + PainterModifier(
     painter = painter,
     sizeToIntrinsics = sizeToIntrinsics,
     alignment = alignment,
     contentScale = contentScale,
     alpha = alpha,
-    colorFilter = colorFilter,
-    rtl = rtl
+    colorFilter = colorFilter
 )
 
 /**
@@ -122,8 +119,7 @@
     val alignment: Alignment = Alignment.Center,
     val contentScale: ContentScale = ContentScale.Inside,
     val alpha: Float = DefaultAlpha,
-    val colorFilter: ColorFilter? = null,
-    val rtl: Boolean = false
+    val colorFilter: ColorFilter? = null
 ) : LayoutModifier, DrawModifier {
     override fun MeasureScope.measure(
         measurable: Measurable,
@@ -244,14 +240,8 @@
             translate(dx, dy)
             scale(scale, scale, 0.0f, 0.0f)
         }) {
-            drawCanvas { canvas, _ ->
-                painter.draw(
-                    canvas = canvas,
-                    size = PxSize(Px(srcSize.width), Px(srcSize.height)),
-                    alpha = alpha,
-                    colorFilter = colorFilter,
-                    rtl = rtl
-                )
+            with(painter) {
+                draw(size = srcSize, alpha = alpha, colorFilter = colorFilter)
             }
         }
     }
diff --git a/ui/ui-core/src/main/java/androidx/ui/core/selection/SelectionHandles.kt b/ui/ui-core/src/main/java/androidx/ui/core/selection/SelectionHandles.kt
index 52affcf..50c8dee 100644
--- a/ui/ui-core/src/main/java/androidx/ui/core/selection/SelectionHandles.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/core/selection/SelectionHandles.kt
@@ -21,11 +21,11 @@
 import androidx.compose.remember
 import androidx.ui.core.Layout
 import androidx.ui.core.Modifier
-import androidx.ui.core.DrawScope
 import androidx.ui.core.drawBehind
 import androidx.ui.geometry.Rect
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.Path
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.text.style.TextDirection
 import androidx.ui.unit.Density
 import androidx.ui.unit.Dp
diff --git a/ui/ui-core/src/main/java/androidx/ui/graphics/vector/VectorPainter.kt b/ui/ui-core/src/main/java/androidx/ui/graphics/vector/VectorPainter.kt
index 937238f..d760f59 100644
--- a/ui/ui-core/src/main/java/androidx/ui/graphics/vector/VectorPainter.kt
+++ b/ui/ui-core/src/main/java/androidx/ui/graphics/vector/VectorPainter.kt
@@ -24,7 +24,7 @@
 import androidx.ui.core.DensityAmbient
 import androidx.ui.graphics.ColorFilter
 import androidx.ui.graphics.painter.Painter
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.graphics.painter.drawCanvas
 import androidx.ui.unit.Dp
 import androidx.ui.unit.IntPx
@@ -114,7 +114,7 @@
         IntPx(ceil(vector.defaultHeight.value).roundToInt())
     )
 
-    override fun CanvasScope.onDraw() {
+    override fun DrawScope.onDraw() {
         drawCanvas { canvas, _ -> vector.draw(canvas, currentAlpha, currentColorFilter) }
     }
 
diff --git a/ui/ui-foundation/api/0.1.0-dev12.txt b/ui/ui-foundation/api/0.1.0-dev12.txt
index 333d7fad..bdcd003a 100644
--- a/ui/ui-foundation/api/0.1.0-dev12.txt
+++ b/ui/ui-foundation/api/0.1.0-dev12.txt
@@ -25,7 +25,7 @@
   }
 
   public final class CanvasKt {
-    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onCanvas);
   }
 
   public final class ClickableKt {
@@ -55,8 +55,8 @@
 
   public final class DrawBackgroundKt {
     method @Deprecated public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
-    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
-    method public static androidx.ui.core.Modifier drawBackground-s1Ed2t0(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
+    method public static androidx.ui.core.Modifier drawBackground-s1Ed2t0(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
   public final class DrawBorder implements androidx.ui.core.DrawModifier {
diff --git a/ui/ui-foundation/api/current.txt b/ui/ui-foundation/api/current.txt
index 333d7fad..bdcd003a 100644
--- a/ui/ui-foundation/api/current.txt
+++ b/ui/ui-foundation/api/current.txt
@@ -25,7 +25,7 @@
   }
 
   public final class CanvasKt {
-    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onCanvas);
   }
 
   public final class ClickableKt {
@@ -55,8 +55,8 @@
 
   public final class DrawBackgroundKt {
     method @Deprecated public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
-    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
-    method public static androidx.ui.core.Modifier drawBackground-s1Ed2t0(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
+    method public static androidx.ui.core.Modifier drawBackground-s1Ed2t0(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
   public final class DrawBorder implements androidx.ui.core.DrawModifier {
diff --git a/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev12.txt b/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev12.txt
index 333d7fad..bdcd003a 100644
--- a/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev12.txt
+++ b/ui/ui-foundation/api/public_plus_experimental_0.1.0-dev12.txt
@@ -25,7 +25,7 @@
   }
 
   public final class CanvasKt {
-    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onCanvas);
   }
 
   public final class ClickableKt {
@@ -55,8 +55,8 @@
 
   public final class DrawBackgroundKt {
     method @Deprecated public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
-    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
-    method public static androidx.ui.core.Modifier drawBackground-s1Ed2t0(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
+    method public static androidx.ui.core.Modifier drawBackground-s1Ed2t0(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
   public final class DrawBorder implements androidx.ui.core.DrawModifier {
diff --git a/ui/ui-foundation/api/public_plus_experimental_current.txt b/ui/ui-foundation/api/public_plus_experimental_current.txt
index 333d7fad..bdcd003a 100644
--- a/ui/ui-foundation/api/public_plus_experimental_current.txt
+++ b/ui/ui-foundation/api/public_plus_experimental_current.txt
@@ -25,7 +25,7 @@
   }
 
   public final class CanvasKt {
-    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onCanvas);
   }
 
   public final class ClickableKt {
@@ -55,8 +55,8 @@
 
   public final class DrawBackgroundKt {
     method @Deprecated public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
-    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
-    method public static androidx.ui.core.Modifier drawBackground-s1Ed2t0(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
+    method public static androidx.ui.core.Modifier drawBackground-s1Ed2t0(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
   public final class DrawBorder implements androidx.ui.core.DrawModifier {
diff --git a/ui/ui-foundation/api/restricted_0.1.0-dev12.txt b/ui/ui-foundation/api/restricted_0.1.0-dev12.txt
index 333d7fad..bdcd003a 100644
--- a/ui/ui-foundation/api/restricted_0.1.0-dev12.txt
+++ b/ui/ui-foundation/api/restricted_0.1.0-dev12.txt
@@ -25,7 +25,7 @@
   }
 
   public final class CanvasKt {
-    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onCanvas);
   }
 
   public final class ClickableKt {
@@ -55,8 +55,8 @@
 
   public final class DrawBackgroundKt {
     method @Deprecated public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
-    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
-    method public static androidx.ui.core.Modifier drawBackground-s1Ed2t0(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
+    method public static androidx.ui.core.Modifier drawBackground-s1Ed2t0(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
   public final class DrawBorder implements androidx.ui.core.DrawModifier {
diff --git a/ui/ui-foundation/api/restricted_current.txt b/ui/ui-foundation/api/restricted_current.txt
index 333d7fad..bdcd003a 100644
--- a/ui/ui-foundation/api/restricted_current.txt
+++ b/ui/ui-foundation/api/restricted_current.txt
@@ -25,7 +25,7 @@
   }
 
   public final class CanvasKt {
-    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.core.DrawScope,kotlin.Unit> onCanvas);
+    method public static void Canvas(androidx.ui.core.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> onCanvas);
   }
 
   public final class ClickableKt {
@@ -55,8 +55,8 @@
 
   public final class DrawBackgroundKt {
     method @Deprecated public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Paint paint, androidx.ui.graphics.Shape shape);
-    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
-    method public static androidx.ui.core.Modifier drawBackground-s1Ed2t0(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static androidx.ui.core.Modifier drawBackground(androidx.ui.core.Modifier, androidx.ui.graphics.Brush brush, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
+    method public static androidx.ui.core.Modifier drawBackground-s1Ed2t0(androidx.ui.core.Modifier, long color, androidx.ui.graphics.Shape shape = androidx.ui.graphics.RectangleShapeKt.RectangleShape, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
   public final class DrawBorder implements androidx.ui.core.DrawModifier {
diff --git a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ImageSamples.kt b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ImageSamples.kt
index 9d1e31a..5a1192b 100644
--- a/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ImageSamples.kt
+++ b/ui/ui-foundation/samples/src/main/java/androidx/ui/foundation/samples/ImageSamples.kt
@@ -31,7 +31,7 @@
 import androidx.ui.geometry.Size
 import androidx.ui.graphics.painter.ImagePainter
 import androidx.ui.graphics.painter.Painter
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.layout.preferredSize
 import androidx.ui.res.loadVectorResource
 import androidx.ui.unit.PxSize
@@ -83,7 +83,7 @@
             override val intrinsicSize: PxSize
                 get() = PxSize(100.px, 100.px)
 
-            override fun CanvasScope.onDraw() {
+            override fun DrawScope.onDraw() {
                 drawRect(color = Color.Cyan)
             }
         }
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Canvas.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Canvas.kt
index 82b39c7..e8b9f9f 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/Canvas.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/Canvas.kt
@@ -18,8 +18,8 @@
 
 import androidx.compose.Composable
 import androidx.ui.core.Modifier
-import androidx.ui.core.DrawScope
 import androidx.ui.core.drawBehind
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.layout.ColumnScope
 import androidx.ui.layout.Spacer
 
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBackground.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBackground.kt
index d7fbdae..0149582 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBackground.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBackground.kt
@@ -30,7 +30,7 @@
 import androidx.ui.graphics.RectangleShape
 import androidx.ui.graphics.Shape
 import androidx.ui.graphics.drawOutline
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.graphics.painter.DrawStyle
 import androidx.ui.graphics.painter.Fill
 import androidx.ui.graphics.painter.drawCanvas
@@ -72,10 +72,10 @@
 fun Modifier.drawBackground(
     color: Color,
     shape: Shape = RectangleShape,
-    @FloatRange(from = 0.0, to = 1.0) alpha: Float = CanvasScope.DefaultAlpha,
+    @FloatRange(from = 0.0, to = 1.0) alpha: Float = DrawScope.DefaultAlpha,
     style: DrawStyle = Fill,
     colorFilter: ColorFilter? = null,
-    blendMode: BlendMode = CanvasScope.DefaultBlendMode
+    blendMode: BlendMode = DrawScope.DefaultBlendMode
 ) = this + DrawBackground(
                 shape,
                 {
@@ -110,10 +110,10 @@
 fun Modifier.drawBackground(
     brush: Brush,
     shape: Shape = RectangleShape,
-    @FloatRange(from = 0.0, to = 1.0) alpha: Float = CanvasScope.DefaultAlpha,
+    @FloatRange(from = 0.0, to = 1.0) alpha: Float = DrawScope.DefaultAlpha,
     style: DrawStyle = Fill,
     colorFilter: ColorFilter? = null,
-    blendMode: BlendMode = CanvasScope.DefaultBlendMode
+    blendMode: BlendMode = DrawScope.DefaultBlendMode
 ) = this + DrawBackground(
                 shape,
                 { drawRect(
diff --git a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBorder.kt b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBorder.kt
index 9e6ca6f..dedd2fd 100644
--- a/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBorder.kt
+++ b/ui/ui-foundation/src/main/java/androidx/ui/foundation/DrawBorder.kt
@@ -20,7 +20,6 @@
 import androidx.compose.remember
 import androidx.ui.core.ContentDrawScope
 import androidx.ui.core.DrawModifier
-import androidx.ui.core.DrawScope
 import androidx.ui.core.Modifier
 import androidx.ui.core.composed
 import androidx.ui.geometry.Offset
@@ -37,6 +36,7 @@
 import androidx.ui.graphics.Shape
 import androidx.ui.graphics.SolidColor
 import androidx.ui.graphics.addOutline
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.graphics.painter.Fill
 import androidx.ui.graphics.painter.Stroke
 import androidx.ui.unit.Density
diff --git a/ui/ui-graphics/api/0.1.0-dev12.txt b/ui/ui-graphics/api/0.1.0-dev12.txt
index db431dc..2973b6f 100644
--- a/ui/ui-graphics/api/0.1.0-dev12.txt
+++ b/ui/ui-graphics/api/0.1.0-dev12.txt
@@ -305,9 +305,9 @@
 
   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.painter.CanvasScope, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static void drawOutline(androidx.ui.graphics.painter.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.painter.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-GAv4Q-k(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static void drawOutline-nrZK92U(androidx.ui.graphics.painter.DrawScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
   public final class Paint {
@@ -725,53 +725,6 @@
 
 package androidx.ui.graphics.painter {
 
-  @androidx.ui.graphics.painter.CanvasScopeMarker public class CanvasScope {
-    ctor public CanvasScope();
-    method public final void draw-mEaFHtM(androidx.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public final kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? 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.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.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 long getCenter();
-    method public final long getSize();
-    property public final long center;
-    property public final long size;
-    field public static final androidx.ui.graphics.painter.CanvasScope.Companion! Companion;
-    field public static final float DefaultAlpha = 1.0f;
-  }
-
-  public static final class CanvasScope.Companion {
-    method public androidx.ui.graphics.BlendMode getDefaultBlendMode();
-    property public final androidx.ui.graphics.BlendMode DefaultBlendMode;
-  }
-
-  public final class CanvasScopeKt {
-    method public static inline androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? clipRect(androidx.ui.graphics.painter.CanvasScope, 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.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.CanvasScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.CanvasScope, float dx = 0.0f, float dy = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.CanvasScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.CanvasScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.CanvasScope, float scaleX, float scaleY = scaleX, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.CanvasScope, float left = 0.0f, float top = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? withTransform(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> drawBlock);
-  }
-
   @kotlin.DslMarker public @interface CanvasScopeMarker {
   }
 
@@ -798,10 +751,59 @@
     method public androidx.ui.graphics.painter.ColorPainter copy-QEYXlZo(long color);
     method public long getColor();
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
+  @androidx.ui.graphics.painter.CanvasScopeMarker public abstract class DrawScope implements androidx.ui.unit.Density {
+    ctor public DrawScope();
+    method public final void draw-mEaFHtM(androidx.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public final kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? 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.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.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 long getCenter();
+    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public final long getSize();
+    property public final long center;
+    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
+    property public final long size;
+    field public static final androidx.ui.graphics.painter.DrawScope.Companion! Companion;
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  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 androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.DrawScope, androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? clipRect(androidx.ui.graphics.painter.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.painter.DrawScope,kotlin.Unit> block);
+    method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.DrawScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.DrawScope, float dx = 0.0f, float dy = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.DrawScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.DrawScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.DrawScope, float scaleX, float scaleY = scaleX, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.DrawScope, float left = 0.0f, float top = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? withTransform(androidx.ui.graphics.painter.DrawScope, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> drawBlock);
+  }
+
   public abstract sealed class DrawStyle {
   }
 
@@ -812,7 +814,7 @@
   public final class ImagePainter extends androidx.ui.graphics.painter.Painter {
     method public androidx.ui.graphics.painter.ImagePainter copy-gqgapXI(androidx.ui.graphics.ImageAsset image, long srcOffset, long srcSize);
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
@@ -820,10 +822,10 @@
     ctor public Painter();
     method protected boolean applyAlpha(float alpha);
     method protected boolean applyColorFilter(androidx.ui.graphics.ColorFilter? colorFilter);
-    method protected boolean applyRtl(boolean rtl);
-    method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+    method protected boolean applyLayoutDirection(androidx.ui.core.LayoutDirection layoutDirection);
+    method public final void draw-8TkyRrg(androidx.ui.graphics.painter.DrawScope, long size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
     method public abstract androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected abstract void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected abstract void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public abstract androidx.ui.unit.PxSize intrinsicSize;
   }
 
diff --git a/ui/ui-graphics/api/current.txt b/ui/ui-graphics/api/current.txt
index db431dc..2973b6f 100644
--- a/ui/ui-graphics/api/current.txt
+++ b/ui/ui-graphics/api/current.txt
@@ -305,9 +305,9 @@
 
   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.painter.CanvasScope, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static void drawOutline(androidx.ui.graphics.painter.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.painter.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-GAv4Q-k(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static void drawOutline-nrZK92U(androidx.ui.graphics.painter.DrawScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
   public final class Paint {
@@ -725,53 +725,6 @@
 
 package androidx.ui.graphics.painter {
 
-  @androidx.ui.graphics.painter.CanvasScopeMarker public class CanvasScope {
-    ctor public CanvasScope();
-    method public final void draw-mEaFHtM(androidx.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public final kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? 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.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.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 long getCenter();
-    method public final long getSize();
-    property public final long center;
-    property public final long size;
-    field public static final androidx.ui.graphics.painter.CanvasScope.Companion! Companion;
-    field public static final float DefaultAlpha = 1.0f;
-  }
-
-  public static final class CanvasScope.Companion {
-    method public androidx.ui.graphics.BlendMode getDefaultBlendMode();
-    property public final androidx.ui.graphics.BlendMode DefaultBlendMode;
-  }
-
-  public final class CanvasScopeKt {
-    method public static inline androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? clipRect(androidx.ui.graphics.painter.CanvasScope, 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.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.CanvasScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.CanvasScope, float dx = 0.0f, float dy = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.CanvasScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.CanvasScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.CanvasScope, float scaleX, float scaleY = scaleX, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.CanvasScope, float left = 0.0f, float top = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? withTransform(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> drawBlock);
-  }
-
   @kotlin.DslMarker public @interface CanvasScopeMarker {
   }
 
@@ -798,10 +751,59 @@
     method public androidx.ui.graphics.painter.ColorPainter copy-QEYXlZo(long color);
     method public long getColor();
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
+  @androidx.ui.graphics.painter.CanvasScopeMarker public abstract class DrawScope implements androidx.ui.unit.Density {
+    ctor public DrawScope();
+    method public final void draw-mEaFHtM(androidx.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public final kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? 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.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.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 long getCenter();
+    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public final long getSize();
+    property public final long center;
+    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
+    property public final long size;
+    field public static final androidx.ui.graphics.painter.DrawScope.Companion! Companion;
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  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 androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.DrawScope, androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? clipRect(androidx.ui.graphics.painter.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.painter.DrawScope,kotlin.Unit> block);
+    method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.DrawScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.DrawScope, float dx = 0.0f, float dy = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.DrawScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.DrawScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.DrawScope, float scaleX, float scaleY = scaleX, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.DrawScope, float left = 0.0f, float top = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? withTransform(androidx.ui.graphics.painter.DrawScope, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> drawBlock);
+  }
+
   public abstract sealed class DrawStyle {
   }
 
@@ -812,7 +814,7 @@
   public final class ImagePainter extends androidx.ui.graphics.painter.Painter {
     method public androidx.ui.graphics.painter.ImagePainter copy-gqgapXI(androidx.ui.graphics.ImageAsset image, long srcOffset, long srcSize);
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
@@ -820,10 +822,10 @@
     ctor public Painter();
     method protected boolean applyAlpha(float alpha);
     method protected boolean applyColorFilter(androidx.ui.graphics.ColorFilter? colorFilter);
-    method protected boolean applyRtl(boolean rtl);
-    method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+    method protected boolean applyLayoutDirection(androidx.ui.core.LayoutDirection layoutDirection);
+    method public final void draw-8TkyRrg(androidx.ui.graphics.painter.DrawScope, long size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
     method public abstract androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected abstract void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected abstract void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public abstract androidx.ui.unit.PxSize intrinsicSize;
   }
 
diff --git a/ui/ui-graphics/api/public_plus_experimental_0.1.0-dev12.txt b/ui/ui-graphics/api/public_plus_experimental_0.1.0-dev12.txt
index db431dc..2973b6f 100644
--- a/ui/ui-graphics/api/public_plus_experimental_0.1.0-dev12.txt
+++ b/ui/ui-graphics/api/public_plus_experimental_0.1.0-dev12.txt
@@ -305,9 +305,9 @@
 
   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.painter.CanvasScope, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static void drawOutline(androidx.ui.graphics.painter.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.painter.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-GAv4Q-k(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static void drawOutline-nrZK92U(androidx.ui.graphics.painter.DrawScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
   public final class Paint {
@@ -725,53 +725,6 @@
 
 package androidx.ui.graphics.painter {
 
-  @androidx.ui.graphics.painter.CanvasScopeMarker public class CanvasScope {
-    ctor public CanvasScope();
-    method public final void draw-mEaFHtM(androidx.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public final kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? 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.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.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 long getCenter();
-    method public final long getSize();
-    property public final long center;
-    property public final long size;
-    field public static final androidx.ui.graphics.painter.CanvasScope.Companion! Companion;
-    field public static final float DefaultAlpha = 1.0f;
-  }
-
-  public static final class CanvasScope.Companion {
-    method public androidx.ui.graphics.BlendMode getDefaultBlendMode();
-    property public final androidx.ui.graphics.BlendMode DefaultBlendMode;
-  }
-
-  public final class CanvasScopeKt {
-    method public static inline androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? clipRect(androidx.ui.graphics.painter.CanvasScope, 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.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.CanvasScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.CanvasScope, float dx = 0.0f, float dy = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.CanvasScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.CanvasScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.CanvasScope, float scaleX, float scaleY = scaleX, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.CanvasScope, float left = 0.0f, float top = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? withTransform(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> drawBlock);
-  }
-
   @kotlin.DslMarker public @interface CanvasScopeMarker {
   }
 
@@ -798,10 +751,59 @@
     method public androidx.ui.graphics.painter.ColorPainter copy-QEYXlZo(long color);
     method public long getColor();
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
+  @androidx.ui.graphics.painter.CanvasScopeMarker public abstract class DrawScope implements androidx.ui.unit.Density {
+    ctor public DrawScope();
+    method public final void draw-mEaFHtM(androidx.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public final kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? 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.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.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 long getCenter();
+    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public final long getSize();
+    property public final long center;
+    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
+    property public final long size;
+    field public static final androidx.ui.graphics.painter.DrawScope.Companion! Companion;
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  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 androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.DrawScope, androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? clipRect(androidx.ui.graphics.painter.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.painter.DrawScope,kotlin.Unit> block);
+    method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.DrawScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.DrawScope, float dx = 0.0f, float dy = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.DrawScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.DrawScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.DrawScope, float scaleX, float scaleY = scaleX, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.DrawScope, float left = 0.0f, float top = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? withTransform(androidx.ui.graphics.painter.DrawScope, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> drawBlock);
+  }
+
   public abstract sealed class DrawStyle {
   }
 
@@ -812,7 +814,7 @@
   public final class ImagePainter extends androidx.ui.graphics.painter.Painter {
     method public androidx.ui.graphics.painter.ImagePainter copy-gqgapXI(androidx.ui.graphics.ImageAsset image, long srcOffset, long srcSize);
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
@@ -820,10 +822,10 @@
     ctor public Painter();
     method protected boolean applyAlpha(float alpha);
     method protected boolean applyColorFilter(androidx.ui.graphics.ColorFilter? colorFilter);
-    method protected boolean applyRtl(boolean rtl);
-    method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+    method protected boolean applyLayoutDirection(androidx.ui.core.LayoutDirection layoutDirection);
+    method public final void draw-8TkyRrg(androidx.ui.graphics.painter.DrawScope, long size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
     method public abstract androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected abstract void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected abstract void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public abstract androidx.ui.unit.PxSize intrinsicSize;
   }
 
diff --git a/ui/ui-graphics/api/public_plus_experimental_current.txt b/ui/ui-graphics/api/public_plus_experimental_current.txt
index db431dc..2973b6f 100644
--- a/ui/ui-graphics/api/public_plus_experimental_current.txt
+++ b/ui/ui-graphics/api/public_plus_experimental_current.txt
@@ -305,9 +305,9 @@
 
   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.painter.CanvasScope, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static void drawOutline(androidx.ui.graphics.painter.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.painter.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-GAv4Q-k(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static void drawOutline-nrZK92U(androidx.ui.graphics.painter.DrawScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
   public final class Paint {
@@ -725,53 +725,6 @@
 
 package androidx.ui.graphics.painter {
 
-  @androidx.ui.graphics.painter.CanvasScopeMarker public class CanvasScope {
-    ctor public CanvasScope();
-    method public final void draw-mEaFHtM(androidx.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public final kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? 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.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.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 long getCenter();
-    method public final long getSize();
-    property public final long center;
-    property public final long size;
-    field public static final androidx.ui.graphics.painter.CanvasScope.Companion! Companion;
-    field public static final float DefaultAlpha = 1.0f;
-  }
-
-  public static final class CanvasScope.Companion {
-    method public androidx.ui.graphics.BlendMode getDefaultBlendMode();
-    property public final androidx.ui.graphics.BlendMode DefaultBlendMode;
-  }
-
-  public final class CanvasScopeKt {
-    method public static inline androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? clipRect(androidx.ui.graphics.painter.CanvasScope, 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.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.CanvasScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.CanvasScope, float dx = 0.0f, float dy = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.CanvasScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.CanvasScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.CanvasScope, float scaleX, float scaleY = scaleX, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.CanvasScope, float left = 0.0f, float top = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? withTransform(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> drawBlock);
-  }
-
   @kotlin.DslMarker public @interface CanvasScopeMarker {
   }
 
@@ -798,10 +751,59 @@
     method public androidx.ui.graphics.painter.ColorPainter copy-QEYXlZo(long color);
     method public long getColor();
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
+  @androidx.ui.graphics.painter.CanvasScopeMarker public abstract class DrawScope implements androidx.ui.unit.Density {
+    ctor public DrawScope();
+    method public final void draw-mEaFHtM(androidx.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public final kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? 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.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.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 long getCenter();
+    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public final long getSize();
+    property public final long center;
+    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
+    property public final long size;
+    field public static final androidx.ui.graphics.painter.DrawScope.Companion! Companion;
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  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 androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.DrawScope, androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? clipRect(androidx.ui.graphics.painter.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.painter.DrawScope,kotlin.Unit> block);
+    method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.DrawScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.DrawScope, float dx = 0.0f, float dy = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.DrawScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.DrawScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.DrawScope, float scaleX, float scaleY = scaleX, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.DrawScope, float left = 0.0f, float top = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? withTransform(androidx.ui.graphics.painter.DrawScope, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> drawBlock);
+  }
+
   public abstract sealed class DrawStyle {
   }
 
@@ -812,7 +814,7 @@
   public final class ImagePainter extends androidx.ui.graphics.painter.Painter {
     method public androidx.ui.graphics.painter.ImagePainter copy-gqgapXI(androidx.ui.graphics.ImageAsset image, long srcOffset, long srcSize);
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
@@ -820,10 +822,10 @@
     ctor public Painter();
     method protected boolean applyAlpha(float alpha);
     method protected boolean applyColorFilter(androidx.ui.graphics.ColorFilter? colorFilter);
-    method protected boolean applyRtl(boolean rtl);
-    method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+    method protected boolean applyLayoutDirection(androidx.ui.core.LayoutDirection layoutDirection);
+    method public final void draw-8TkyRrg(androidx.ui.graphics.painter.DrawScope, long size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
     method public abstract androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected abstract void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected abstract void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public abstract androidx.ui.unit.PxSize intrinsicSize;
   }
 
diff --git a/ui/ui-graphics/api/restricted_0.1.0-dev12.txt b/ui/ui-graphics/api/restricted_0.1.0-dev12.txt
index db431dc..2973b6f 100644
--- a/ui/ui-graphics/api/restricted_0.1.0-dev12.txt
+++ b/ui/ui-graphics/api/restricted_0.1.0-dev12.txt
@@ -305,9 +305,9 @@
 
   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.painter.CanvasScope, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static void drawOutline(androidx.ui.graphics.painter.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.painter.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-GAv4Q-k(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static void drawOutline-nrZK92U(androidx.ui.graphics.painter.DrawScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
   public final class Paint {
@@ -725,53 +725,6 @@
 
 package androidx.ui.graphics.painter {
 
-  @androidx.ui.graphics.painter.CanvasScopeMarker public class CanvasScope {
-    ctor public CanvasScope();
-    method public final void draw-mEaFHtM(androidx.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public final kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? 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.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.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 long getCenter();
-    method public final long getSize();
-    property public final long center;
-    property public final long size;
-    field public static final androidx.ui.graphics.painter.CanvasScope.Companion! Companion;
-    field public static final float DefaultAlpha = 1.0f;
-  }
-
-  public static final class CanvasScope.Companion {
-    method public androidx.ui.graphics.BlendMode getDefaultBlendMode();
-    property public final androidx.ui.graphics.BlendMode DefaultBlendMode;
-  }
-
-  public final class CanvasScopeKt {
-    method public static inline androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? clipRect(androidx.ui.graphics.painter.CanvasScope, 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.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.CanvasScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.CanvasScope, float dx = 0.0f, float dy = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.CanvasScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.CanvasScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.CanvasScope, float scaleX, float scaleY = scaleX, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.CanvasScope, float left = 0.0f, float top = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? withTransform(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> drawBlock);
-  }
-
   @kotlin.DslMarker public @interface CanvasScopeMarker {
   }
 
@@ -798,10 +751,59 @@
     method public androidx.ui.graphics.painter.ColorPainter copy-QEYXlZo(long color);
     method public long getColor();
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
+  @androidx.ui.graphics.painter.CanvasScopeMarker public abstract class DrawScope implements androidx.ui.unit.Density {
+    ctor public DrawScope();
+    method public final void draw-mEaFHtM(androidx.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public final kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? 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.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.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 long getCenter();
+    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public final long getSize();
+    property public final long center;
+    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
+    property public final long size;
+    field public static final androidx.ui.graphics.painter.DrawScope.Companion! Companion;
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  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 androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.DrawScope, androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? clipRect(androidx.ui.graphics.painter.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.painter.DrawScope,kotlin.Unit> block);
+    method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.DrawScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.DrawScope, float dx = 0.0f, float dy = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.DrawScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.DrawScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.DrawScope, float scaleX, float scaleY = scaleX, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.DrawScope, float left = 0.0f, float top = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? withTransform(androidx.ui.graphics.painter.DrawScope, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> drawBlock);
+  }
+
   public abstract sealed class DrawStyle {
   }
 
@@ -812,7 +814,7 @@
   public final class ImagePainter extends androidx.ui.graphics.painter.Painter {
     method public androidx.ui.graphics.painter.ImagePainter copy-gqgapXI(androidx.ui.graphics.ImageAsset image, long srcOffset, long srcSize);
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
@@ -820,10 +822,10 @@
     ctor public Painter();
     method protected boolean applyAlpha(float alpha);
     method protected boolean applyColorFilter(androidx.ui.graphics.ColorFilter? colorFilter);
-    method protected boolean applyRtl(boolean rtl);
-    method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+    method protected boolean applyLayoutDirection(androidx.ui.core.LayoutDirection layoutDirection);
+    method public final void draw-8TkyRrg(androidx.ui.graphics.painter.DrawScope, long size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
     method public abstract androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected abstract void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected abstract void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public abstract androidx.ui.unit.PxSize intrinsicSize;
   }
 
diff --git a/ui/ui-graphics/api/restricted_current.txt b/ui/ui-graphics/api/restricted_current.txt
index db431dc..2973b6f 100644
--- a/ui/ui-graphics/api/restricted_current.txt
+++ b/ui/ui-graphics/api/restricted_current.txt
@@ -305,9 +305,9 @@
 
   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.painter.CanvasScope, androidx.ui.graphics.Outline outline, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static void drawOutline(androidx.ui.graphics.painter.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.painter.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-GAv4Q-k(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = CanvasScope.DefaultBlendMode);
+    method public static void drawOutline-nrZK92U(androidx.ui.graphics.painter.DrawScope, androidx.ui.graphics.Outline outline, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DrawScope.DefaultBlendMode);
   }
 
   public final class Paint {
@@ -725,53 +725,6 @@
 
 package androidx.ui.graphics.painter {
 
-  @androidx.ui.graphics.painter.CanvasScopeMarker public class CanvasScope {
-    ctor public CanvasScope();
-    method public final void draw-mEaFHtM(androidx.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public final kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? 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.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
-    method public final kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.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 long getCenter();
-    method public final long getSize();
-    property public final long center;
-    property public final long size;
-    field public static final androidx.ui.graphics.painter.CanvasScope.Companion! Companion;
-    field public static final float DefaultAlpha = 1.0f;
-  }
-
-  public static final class CanvasScope.Companion {
-    method public androidx.ui.graphics.BlendMode getDefaultBlendMode();
-    property public final androidx.ui.graphics.BlendMode DefaultBlendMode;
-  }
-
-  public final class CanvasScopeKt {
-    method public static inline androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.CanvasScope, androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? clipRect(androidx.ui.graphics.painter.CanvasScope, 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.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.CanvasScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.CanvasScope, float dx = 0.0f, float dy = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.CanvasScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.CanvasScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.CanvasScope, float scaleX, float scaleY = scaleX, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.CanvasScope, float left = 0.0f, float top = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> block);
-    method public static inline androidx.ui.graphics.Canvas? withTransform(androidx.ui.graphics.painter.CanvasScope, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasScope,kotlin.Unit> drawBlock);
-  }
-
   @kotlin.DslMarker public @interface CanvasScopeMarker {
   }
 
@@ -798,10 +751,59 @@
     method public androidx.ui.graphics.painter.ColorPainter copy-QEYXlZo(long color);
     method public long getColor();
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
+  @androidx.ui.graphics.painter.CanvasScopeMarker public abstract class DrawScope implements androidx.ui.unit.Density {
+    ctor public DrawScope();
+    method public final void draw-mEaFHtM(androidx.ui.graphics.Canvas canvas, long size, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public final kotlin.Unit? drawArc-_aGsT6c(androidx.ui.graphics.Brush brush, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawArc-eUb3Eo4(long color, float startAngle, float sweepAngle, boolean useCenter, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawCircle-0EImeI8(long color, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawCircle-uHGJFV8(androidx.ui.graphics.Brush brush, float radius = size.minDimension / 2.0, long center = this.center, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawImage-IF_VeeU(androidx.ui.graphics.ImageAsset image, long srcOffset = Offset.zero, long srcSize = Size(image.width.toFloat(), image.height.toFloat()), long dstOffset = Offset.zero, long dstSize = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawImage-zcoU2q0(androidx.ui.graphics.ImageAsset image, long topLeft = Offset.zero, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawLine-MfDnFlo(long color, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawLine-PWBr8KI(androidx.ui.graphics.Brush brush, long p1, long p2, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawOval-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawOval-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? 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.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPath-ZizoN6c(androidx.ui.graphics.Path path, long color, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPoints(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, androidx.ui.graphics.Brush brush, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawPoints-yiE_nf0(java.util.List<androidx.ui.geometry.Offset> points, androidx.ui.graphics.PointMode pointMode, long color, androidx.ui.graphics.painter.Stroke stroke, @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 kotlin.Unit? drawRect-EPCrxCw(long color, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRect-cuGMcK0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRoundRect-5PTu5W0(androidx.ui.graphics.Brush brush, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = radiusX, @FloatRange(from=0.0, to=1.0) float alpha = 1.0f, androidx.ui.graphics.painter.DrawStyle style = Fill, androidx.ui.graphics.ColorFilter? colorFilter = null, androidx.ui.graphics.BlendMode blendMode = DefaultBlendMode);
+    method public final kotlin.Unit? drawRoundRect-A8SqK14(long color, long topLeft = Offset.zero, long size = this.size, float radiusX = 0.0f, float radiusY = 0.0f, androidx.ui.graphics.painter.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 long getCenter();
+    method public abstract androidx.ui.core.LayoutDirection getLayoutDirection();
+    method public final long getSize();
+    property public final long center;
+    property public abstract androidx.ui.core.LayoutDirection layoutDirection;
+    property public final long size;
+    field public static final androidx.ui.graphics.painter.DrawScope.Companion! Companion;
+    field public static final float DefaultAlpha = 1.0f;
+  }
+
+  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 androidx.ui.graphics.Canvas? clipPath(androidx.ui.graphics.painter.DrawScope, androidx.ui.graphics.Path path, androidx.ui.graphics.ClipOp clipOp = androidx.ui.graphics.ClipOp.intersect, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? clipRect(androidx.ui.graphics.painter.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.painter.DrawScope,kotlin.Unit> block);
+    method public static inline kotlin.Unit? drawCanvas(androidx.ui.graphics.painter.DrawScope, kotlin.jvm.functions.Function2<? super androidx.ui.graphics.Canvas,? super androidx.ui.unit.PxSize,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.DrawScope, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? inset(androidx.ui.graphics.painter.DrawScope, float dx = 0.0f, float dy = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? rotate(androidx.ui.graphics.painter.DrawScope, float degrees, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? rotateRad(androidx.ui.graphics.painter.DrawScope, float radians, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? scale(androidx.ui.graphics.painter.DrawScope, float scaleX, float scaleY = scaleX, float pivotX = center.dx, float pivotY = center.dy, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? translate(androidx.ui.graphics.painter.DrawScope, float left = 0.0f, float top = 0.0f, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> block);
+    method public static inline androidx.ui.graphics.Canvas? withTransform(androidx.ui.graphics.painter.DrawScope, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.CanvasTransform,kotlin.Unit> transformBlock, kotlin.jvm.functions.Function1<? super androidx.ui.graphics.painter.DrawScope,kotlin.Unit> drawBlock);
+  }
+
   public abstract sealed class DrawStyle {
   }
 
@@ -812,7 +814,7 @@
   public final class ImagePainter extends androidx.ui.graphics.painter.Painter {
     method public androidx.ui.graphics.painter.ImagePainter copy-gqgapXI(androidx.ui.graphics.ImageAsset image, long srcOffset, long srcSize);
     method public androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public androidx.ui.unit.PxSize intrinsicSize;
   }
 
@@ -820,10 +822,10 @@
     ctor public Painter();
     method protected boolean applyAlpha(float alpha);
     method protected boolean applyColorFilter(androidx.ui.graphics.ColorFilter? colorFilter);
-    method protected boolean applyRtl(boolean rtl);
-    method public final void draw(androidx.ui.graphics.Canvas canvas, androidx.ui.unit.PxSize size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null, boolean rtl = false);
+    method protected boolean applyLayoutDirection(androidx.ui.core.LayoutDirection layoutDirection);
+    method public final void draw-8TkyRrg(androidx.ui.graphics.painter.DrawScope, long size, float alpha = 1.0f, androidx.ui.graphics.ColorFilter? colorFilter = null);
     method public abstract androidx.ui.unit.PxSize getIntrinsicSize();
-    method protected abstract void onDraw(androidx.ui.graphics.painter.CanvasScope);
+    method protected abstract void onDraw(androidx.ui.graphics.painter.DrawScope);
     property public abstract androidx.ui.unit.PxSize intrinsicSize;
   }
 
diff --git a/ui/ui-graphics/samples/src/main/java/androidx/ui/graphics/samples/CanvasScopeSample.kt b/ui/ui-graphics/samples/src/main/java/androidx/ui/graphics/samples/DrawScopeSample.kt
similarity index 83%
rename from ui/ui-graphics/samples/src/main/java/androidx/ui/graphics/samples/CanvasScopeSample.kt
rename to ui/ui-graphics/samples/src/main/java/androidx/ui/graphics/samples/DrawScopeSample.kt
index 84ca7ed..87ee069 100644
--- a/ui/ui-graphics/samples/src/main/java/androidx/ui/graphics/samples/CanvasScopeSample.kt
+++ b/ui/ui-graphics/samples/src/main/java/androidx/ui/graphics/samples/DrawScopeSample.kt
@@ -17,11 +17,12 @@
 package androidx.ui.graphics.samples
 
 import androidx.annotation.Sampled
+import androidx.ui.core.LayoutDirection
 import androidx.ui.geometry.Size
 import androidx.ui.graphics.Canvas
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.ImageAsset
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.graphics.painter.inset
 import androidx.ui.graphics.painter.rotate
 import androidx.ui.graphics.painter.withTransform
@@ -42,7 +43,7 @@
     val targetCanvas = Canvas(imageAsset)
 
     // Create a CanvasScope from this canvas to issue drawing commands into
-    CanvasScope().draw(targetCanvas, pxSize) {
+    SampleDrawScope().draw(targetCanvas, pxSize) {
         drawRect(color = Color.Gray) // Draw grey background
         // Inset content by 10 pixels on the left/right sides and 12 by the
         // top/bottom
@@ -73,7 +74,7 @@
     // create a Canvas to draw contents into the ImageAsset
     val targetCanvas = Canvas(imageAsset)
 
-    CanvasScope().draw(targetCanvas, pxSize) { // CanvasScope
+    SampleDrawScope().draw(targetCanvas, pxSize) { // CanvasScope
         inset(20.0f) {
             // Use withTransform to batch multiple transformations for 1 or more drawing calls
             // that are to be drawn.
@@ -91,4 +92,13 @@
             drawRect(Color.Red, alpha = 0.25f)
         }
     }
+}
+
+// DrawScope instance used for the purposes of this sample
+// Consumers of the DrawScope API would normally access a DrawScope
+// instance through the compose framework itself
+private class SampleDrawScope() : DrawScope() {
+    override val layoutDirection: LayoutDirection = LayoutDirection.Ltr
+    override val density: Float = 1.0f
+    override val fontScale: Float = 1.0f
 }
\ No newline at end of file
diff --git a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/CanvasScopeTest.kt b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/DrawScopeTest.kt
similarity index 94%
rename from ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/CanvasScopeTest.kt
rename to ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/DrawScopeTest.kt
index fee6fdc..1c669c0 100644
--- a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/CanvasScopeTest.kt
+++ b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/DrawScopeTest.kt
@@ -35,7 +35,7 @@
 
 @SmallTest
 @RunWith(JUnit4::class)
-class CanvasScopeTest {
+class DrawScopeTest {
 
     private val width: Int = 100
     private val height: Int = 100
@@ -57,7 +57,7 @@
     @Test
     fun testDrawRectColor() {
         val img = createTestDstImage()
-        CanvasScope().draw(Canvas(img), dstSize) {
+        TestDrawScope().draw(Canvas(img), dstSize) {
             // Verify that the overload that consumes a color parameter
             // fills the canvas with red color
             drawRect(color = Color.Red)
@@ -74,7 +74,7 @@
     @Test
     fun testDrawRectBrushColor() {
         val img = createTestDstImage()
-        CanvasScope().draw(Canvas(img), dstSize) {
+        TestDrawScope().draw(Canvas(img), dstSize) {
             // Verify that the overload that consumes a brush parameter
             // fills the canvas with red color
             drawRect(brush = SolidColor(Color.Red))
@@ -91,7 +91,7 @@
     @Test
     fun testDrawRectColorAlpha() {
         val img = createTestDstImage()
-        CanvasScope().draw(Canvas(img), dstSize) {
+        TestDrawScope().draw(Canvas(img), dstSize) {
             // Verify that the overload that consumes a color parameter
             // fills the canvas with red color
             drawRect(color = Color.Red, alpha = 0.5f)
@@ -119,7 +119,7 @@
     @Test
     fun testDrawRectBrushColorAlpha() {
         val img = createTestDstImage()
-        CanvasScope().draw(Canvas(img), dstSize) {
+        TestDrawScope().draw(Canvas(img), dstSize) {
             // Verify that the overload that consumes a brush parameter
             // fills the canvas with red color
             drawRect(brush = SolidColor(Color.Red), alpha = 0.5f)
@@ -149,7 +149,7 @@
         val img = createTestDstImage()
         val insetLeft = 10.0f
         val insetTop = 12.0f
-        CanvasScope().draw(Canvas(img), dstSize) {
+        TestDrawScope().draw(Canvas(img), dstSize) {
             translate(insetLeft, insetTop) {
                 drawRect(color = Color.Red)
             }
@@ -176,7 +176,7 @@
         val insetTop = 12.0f
         val insetRight = 11.0f
         val insetBottom = 13.0f
-        CanvasScope().draw(Canvas(img), dstSize) {
+        TestDrawScope().draw(Canvas(img), dstSize) {
             inset(insetLeft, insetTop, insetRight, insetBottom) {
                 drawRect(color = Color.Red)
             }
@@ -200,7 +200,7 @@
     @Test
     fun testInsetRestoredAfterScopedInsetDraw() {
         val img = createTestDstImage()
-        CanvasScope().draw(Canvas(img), dstSize) {
+        TestDrawScope().draw(Canvas(img), dstSize) {
             // Verify that the overload that consumes a color parameter
             // fills the canvas with red color
             val left = 10.0f
@@ -221,7 +221,7 @@
     @Test
     fun testFillOverwritesOldAlpha() {
         val img = createTestDstImage()
-        CanvasScope().draw(Canvas(img), dstSize) {
+        TestDrawScope().draw(Canvas(img), dstSize) {
             // Verify that the alpha parameter used in the first draw call is overridden
             // in the subsequent call that does not specify an alpha value
             drawRect(color = Color.Blue, alpha = 0.5f)
@@ -239,7 +239,7 @@
     @Test
     fun testFillOverwritesOldPaintBrushAlpha() {
         val img = createTestDstImage()
-        CanvasScope().draw(Canvas(img), dstSize) {
+        TestDrawScope().draw(Canvas(img), dstSize) {
             // Verify that the alpha parameter used in the first draw call is overridden
             // in the subsequent call that does not specify an alpha value that goes through
             // a different code path for configuration of the underlying paint
@@ -257,7 +257,7 @@
 
     @Test
     fun testScaleTopLeftPivot() {
-        val canvasScope = CanvasScope()
+        val canvasScope = TestDrawScope()
 
         val width = 200
         val height = 200
@@ -286,7 +286,7 @@
 
     @Test
     fun testScaleCenterDefaultPivot() {
-        val canvasScope = CanvasScope()
+        val canvasScope = TestDrawScope()
 
         val width = 200
         val height = 200
@@ -329,7 +329,7 @@
 
     @Test
     fun testInsetNegativeWidthThrows() {
-        val canvasScope = CanvasScope()
+        val canvasScope = TestDrawScope()
 
         val width = 200
         val height = 200
@@ -350,7 +350,7 @@
 
     @Test
     fun testInsetNegativeHeightThrows() {
-        val canvasScope = CanvasScope()
+        val canvasScope = TestDrawScope()
 
         val width = 200
         val height = 200
@@ -371,7 +371,7 @@
 
     @Test
     fun testScaleBottomRightPivot() {
-        val canvasScope = CanvasScope()
+        val canvasScope = TestDrawScope()
 
         val width = 200
         val height = 200
@@ -410,7 +410,7 @@
         val height = 200
         val size = Size(width.toFloat(), height.toFloat())
         val imageAsset = ImageAsset(width, height)
-        CanvasScope().draw(Canvas(imageAsset), size) {
+        TestDrawScope().draw(Canvas(imageAsset), size) {
             drawRect(color = Color.Red)
             rotate(180.0f) {
                 drawRect(
@@ -440,7 +440,7 @@
         val height = 200
         val size = Size(width.toFloat(), height.toFloat())
         val imageAsset = ImageAsset(width, height)
-        CanvasScope().draw(Canvas(imageAsset), size) {
+        TestDrawScope().draw(Canvas(imageAsset), size) {
             drawRect(color = Color.Red)
             rotate(-45.0f, 0.0f, 0.0f) {
                 drawRect(
@@ -466,7 +466,7 @@
         val height = 200
         val size = Size(width.toFloat(), height.toFloat())
         val imageAsset1 = ImageAsset(width, height)
-        CanvasScope().draw(Canvas(imageAsset1), size) {
+        TestDrawScope().draw(Canvas(imageAsset1), size) {
             drawRect(color = Color.Red)
             inset(20.0f, 12.0f, 10.0f, 8.0f) {
                 scale(2.0f, 0.5f) {
@@ -484,7 +484,7 @@
 
         val imageAsset2 = ImageAsset(width, height)
         val saveCountCanvas = SaveCountCanvas(Canvas(imageAsset2))
-        CanvasScope().draw(saveCountCanvas, size) {
+        TestDrawScope().draw(saveCountCanvas, size) {
             drawRect(color = Color.Red)
             withTransform({
                 inset(20.0f, 12.0f, 10.0f, 8.0f)
diff --git a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/ImagePainterTest.kt b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/ImagePainterTest.kt
index 9269351..a7b8e1c 100644
--- a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/ImagePainterTest.kt
+++ b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/ImagePainterTest.kt
@@ -74,7 +74,7 @@
     fun testImagePainter() {
         val imagePainter = ImagePainter(createTestSrcImage())
         val dst = createTestDstImage()
-        imagePainter.draw(Canvas(dst), srcSize)
+        drawPainter(imagePainter, Canvas(dst), srcSize)
 
         val pixelmap = dst.toPixelMap()
         assertEquals(white, pixelmap[195, 5])
@@ -89,7 +89,7 @@
         val dst = createTestDstImage()
 
         val flagCanvas = LayerFlagCanvas(Canvas(dst))
-        imagePainter.draw(flagCanvas, srcSize, alpha = 0.5f)
+        drawPainter(imagePainter, flagCanvas, srcSize, alpha = 0.5f)
 
         // ImagePainter's optimized application of alpha should be applied here
         // instead of Painter's default implementation that invokes Canvas.saveLayer
@@ -113,7 +113,9 @@
     fun testImagePainterTint() {
         val imagePainter = ImagePainter(createTestSrcImage())
         val dst = createTestDstImage()
-        imagePainter.draw(
+
+        drawPainter(
+            imagePainter,
             Canvas(dst),
             srcSize,
             colorFilter = ColorFilter(Color.Cyan, BlendMode.srcIn)
@@ -140,7 +142,7 @@
         val intrinsicSize = topLeftPainter.intrinsicSize
         assertEquals(50.0f, intrinsicSize.width.value)
         assertEquals(50.0f, intrinsicSize.height.value)
-        topLeftPainter.draw(Canvas(dst), intrinsicSize)
+        drawPainter(topLeftPainter, Canvas(dst), intrinsicSize)
 
         val topLeftMap = dst.toPixelMap()
         assertEquals(Color.Blue, topLeftMap[0, 0])
@@ -154,7 +156,8 @@
         )
 
         val topRightDst = createTestDstImage()
-        topRightPainter.draw(Canvas(topRightDst), topRightPainter.intrinsicSize)
+        drawPainter(topRightPainter, Canvas(topRightDst), topRightPainter.intrinsicSize)
+
         val topRightMap = topRightDst.toPixelMap()
         assertEquals(Color.Blue, topRightMap[0, 0])
         assertEquals(Color.Red, topRightMap[0, 49])
@@ -166,7 +169,7 @@
             srcSize = Size(50.0f, 50.0f)
         )
 
-        bottomLeftPainter.draw(canvas, bottomLeftPainter.intrinsicSize)
+        drawPainter(bottomLeftPainter, canvas, bottomLeftPainter.intrinsicSize)
 
         val bottomLeftMap = dst.toPixelMap()
         assertEquals(Color.Blue, bottomLeftMap[0, 0])
@@ -179,7 +182,7 @@
             srcSize = Size(50.0f, 50.0f)
         )
 
-        bottomRightPainter.draw(canvas, bottomRightPainter.intrinsicSize)
+        drawPainter(bottomRightPainter, canvas, bottomRightPainter.intrinsicSize)
 
         val bottomRightMap = dst.toPixelMap()
         assertEquals(Color.Red, bottomRightMap[0, 0])
diff --git a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/PainterTest.kt b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/PainterTest.kt
index 0407a9e..cc4ecc6 100644
--- a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/PainterTest.kt
+++ b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/PainterTest.kt
@@ -17,6 +17,7 @@
 package androidx.ui.graphics.painter
 
 import androidx.test.filters.SmallTest
+import androidx.ui.core.LayoutDirection
 import androidx.ui.geometry.Rect
 import androidx.ui.graphics.BlendMode
 import androidx.ui.graphics.Canvas
@@ -50,7 +51,7 @@
             override val intrinsicSize: PxSize
                 get() = size
 
-            override fun CanvasScope.onDraw() {
+            override fun DrawScope.onDraw() {
                 didDraw = true
             }
         }
@@ -58,7 +59,11 @@
         assertEquals(size, p.intrinsicSize)
         assertFalse(p.didDraw)
 
-        p.draw(Canvas(ImageAsset(100, 100)), PxSize(Px(100.0f), Px(100.0f)))
+        drawPainter(
+            p,
+            Canvas(ImageAsset(100, 100)),
+            PxSize(Px(100f), Px(100f))
+        )
         assertTrue(p.didDraw)
     }
 
@@ -71,21 +76,23 @@
             override val intrinsicSize: PxSize
                 get() = size
 
-            override fun applyRtl(rtl: Boolean): Boolean {
-                color = if (rtl) Color.Red else Color.Cyan
+            override fun applyLayoutDirection(layoutDirection: LayoutDirection): Boolean {
+                color = if (layoutDirection == LayoutDirection.Rtl) Color.Red else Color.Cyan
                 return true
             }
 
-            override fun CanvasScope.onDraw() {
+            override fun DrawScope.onDraw() {
                 drawRect(color = color)
             }
         }
 
         val image = ImageAsset(100, 100)
-        p.draw(
+
+        drawPainter(
+            p,
             Canvas(image),
-            PxSize(Px(100.0f), Px(100.0f)),
-            rtl = true
+            PxSize(Px(100f), Px(100f)),
+            layoutDirection = LayoutDirection.Rtl
         )
 
         assertEquals(Color.Red, image.toPixelMap()[50, 50])
@@ -98,7 +105,7 @@
             override val intrinsicSize: PxSize
                 get() = size
 
-            override fun CanvasScope.onDraw() {
+            override fun DrawScope.onDraw() {
                 drawRect(color = Color.Red)
             }
         }
@@ -108,7 +115,13 @@
 
         val paint = Paint().apply { this.color = Color.White }
         canvas.drawRect(Rect.fromLTWH(0.0f, 0.0f, 100.0f, 100.0f), paint)
-        p.draw(canvas, size, alpha = 0.5f)
+
+        drawPainter(
+            p,
+            canvas,
+            size,
+            alpha = 0.5f
+        )
 
         val expected = Color(
             alpha = 0.5f,
@@ -144,7 +157,7 @@
             override val intrinsicSize: PxSize
                 get() = size
 
-            override fun CanvasScope.onDraw() {
+            override fun DrawScope.onDraw() {
                 drawRect(color = color)
             }
         }
@@ -155,7 +168,13 @@
 
         val paint = Paint().apply { this.color = Color.White }
         canvas.drawRect(Rect.fromLTWH(0.0f, 0.0f, 100.0f, 100.0f), paint)
-        p.draw(canvas, size, alpha = 0.5f)
+
+        drawPainter(
+            p,
+            canvas,
+            size,
+            alpha = 0.5f
+        )
 
         val expected = Color(
             alpha = 0.5f,
@@ -185,14 +204,19 @@
             override val intrinsicSize: PxSize
                 get() = size
 
-            override fun CanvasScope.onDraw() {
+            override fun DrawScope.onDraw() {
                 drawRect(color = Color.Black, colorFilter = colorFilter)
             }
         }
 
         val image = ImageAsset(100, 100)
 
-        p.draw(Canvas(image), size, colorFilter = ColorFilter(Color.Blue, BlendMode.srcIn))
+        drawPainter(
+            p,
+            Canvas(image),
+            size,
+            colorFilter = ColorFilter(Color.Blue, BlendMode.srcIn)
+        )
         assertEquals(Color.Blue, image.toPixelMap()[50, 50])
     }
 }
\ No newline at end of file
diff --git a/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/TestDrawScope.kt b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/TestDrawScope.kt
new file mode 100644
index 0000000..ce23f17
--- /dev/null
+++ b/ui/ui-graphics/src/androidTest/java/androidx/ui/graphics/painter/TestDrawScope.kt
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package androidx.ui.graphics.painter
+
+import androidx.ui.core.LayoutDirection
+import androidx.ui.geometry.Size
+import androidx.ui.graphics.Canvas
+import androidx.ui.graphics.ColorFilter
+import androidx.ui.unit.PxSize
+
+/**
+ * TestDrawScope implementation with default values for density and layout direction
+ */
+class TestDrawScope() : DrawScope() {
+    override var layoutDirection: LayoutDirection = LayoutDirection.Ltr
+
+    override var density: Float = 1.0f
+
+    override var fontScale: Float = 1.0f
+}
+
+/**
+ * Helper method that draws a Painter into the given canvas, automatically creating a DrawScope
+ * to do so with
+ */
+fun drawPainter(
+    painter: Painter,
+    canvas: Canvas,
+    pxSize: PxSize,
+    alpha: Float = DrawScope.DefaultAlpha,
+    colorFilter: ColorFilter? = null,
+    layoutDirection: LayoutDirection = LayoutDirection.Ltr
+) {
+    val size = Size(pxSize.width.value, pxSize.height.value)
+    TestDrawScope().apply { this.layoutDirection = layoutDirection }.draw(canvas, size) {
+        with (painter) {
+            draw(size, alpha = alpha, colorFilter = colorFilter)
+        }
+    }
+}
\ No newline at end of file
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/Outline.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/Outline.kt
index a835ff7..bd26830 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/Outline.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/Outline.kt
@@ -21,7 +21,7 @@
 import androidx.ui.geometry.RRect
 import androidx.ui.geometry.Rect
 import androidx.ui.geometry.Size
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.graphics.painter.DrawStyle
 import androidx.ui.graphics.painter.Fill
 
@@ -75,7 +75,7 @@
 }
 
 /**
- * Draws the [Outline] on a [CanvasScope].
+ * Draws the [Outline] on a [DrawScope].
  *
  * @param outline the outline to draw.
  * @param color Color applied to the outline when it is drawn
@@ -85,13 +85,13 @@
  * @param colorFilter: ColorFilter to apply to the [color] when drawn into the destination
  * @param blendMode: Blending algorithm to be applied to the outline
  */
-fun CanvasScope.drawOutline(
+fun DrawScope.drawOutline(
     outline: Outline,
     color: Color,
-    @FloatRange(from = 0.0, to = 1.0) alpha: Float = CanvasScope.DefaultAlpha,
+    @FloatRange(from = 0.0, to = 1.0) alpha: Float = DrawScope.DefaultAlpha,
     style: DrawStyle = Fill,
     colorFilter: ColorFilter? = null,
-    blendMode: BlendMode = CanvasScope.DefaultBlendMode
+    blendMode: BlendMode = DrawScope.DefaultBlendMode
 ) = drawOutlineHelper(
         outline,
         { rect ->
@@ -115,7 +115,7 @@
     )
 
 /**
- * Draws the [Outline] on a [CanvasScope].
+ * Draws the [Outline] on a [DrawScope].
  *
  * @param outline the outline to draw.
  * @param brush Brush applied to the outline when it is drawn
@@ -125,13 +125,13 @@
  * @param colorFilter: ColorFilter to apply to the [Brush] when drawn into the destination
  * @param blendMode: Blending algorithm to be applied to the outline
  */
-fun CanvasScope.drawOutline(
+fun DrawScope.drawOutline(
     outline: Outline,
     brush: Brush,
-    @FloatRange(from = 0.0, to = 1.0) alpha: Float = CanvasScope.DefaultAlpha,
+    @FloatRange(from = 0.0, to = 1.0) alpha: Float = DrawScope.DefaultAlpha,
     style: DrawStyle = Fill,
     colorFilter: ColorFilter? = null,
-    blendMode: BlendMode = CanvasScope.DefaultBlendMode
+    blendMode: BlendMode = DrawScope.DefaultBlendMode
 ) = drawOutlineHelper(
         outline,
         { rect ->
@@ -178,11 +178,11 @@
  * Helper method that allows for delegation of appropriate drawing call based on type of
  * underlying outline shape
  */
-private inline fun CanvasScope.drawOutlineHelper(
+private inline fun DrawScope.drawOutlineHelper(
     outline: Outline,
-    drawRectBlock: CanvasScope.(rect: Rect) -> Unit,
-    drawRoundedRectBlock: CanvasScope.(rrect: RRect) -> Unit,
-    drawPathBlock: CanvasScope.(path: Path) -> Unit
+    drawRectBlock: DrawScope.(rect: Rect) -> Unit,
+    drawRoundedRectBlock: DrawScope.(rrect: RRect) -> Unit,
+    drawPathBlock: DrawScope.(path: Path) -> Unit
 ) = when (outline) {
         is Outline.Rectangle -> drawRectBlock(outline.rect)
         is Outline.Rounded -> {
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ColorPainter.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ColorPainter.kt
index ba0334c..e0b7f37 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ColorPainter.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ColorPainter.kt
@@ -26,11 +26,11 @@
  */
 data class ColorPainter(val color: Color) : Painter() {
 
-    private var alpha: Float = CanvasScope.DefaultAlpha
+    private var alpha: Float = DrawScope.DefaultAlpha
 
     private var colorFilter: ColorFilter? = null
 
-    override fun CanvasScope.onDraw() {
+    override fun DrawScope.onDraw() {
         drawRect(color = color, alpha = alpha, colorFilter = colorFilter)
     }
 
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/CanvasScope.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/DrawScope.kt
similarity index 95%
rename from ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/CanvasScope.kt
rename to ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/DrawScope.kt
index 6ccfdac..00d3c83 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/CanvasScope.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/DrawScope.kt
@@ -18,6 +18,7 @@
 
 import android.graphics.PathEffect
 import androidx.annotation.FloatRange
+import androidx.ui.core.LayoutDirection
 import androidx.ui.geometry.Offset
 import androidx.ui.geometry.Size
 import androidx.ui.graphics.BlendMode
@@ -34,14 +35,15 @@
 import androidx.ui.graphics.StrokeCap
 import androidx.ui.graphics.StrokeJoin
 import androidx.ui.graphics.vectormath.degrees
+import androidx.ui.unit.Density
 import androidx.ui.unit.Px
 import androidx.ui.unit.PxSize
 
 /**
- * Simultaneously translate the [CanvasScope] coordinate space by [left] and [top] as well as modify
+ * Simultaneously translate the [DrawScope] coordinate space by [left] and [top] as well as modify
  * the dimensions of the current painting area. This provides a callback to issue more
  * drawing instructions within the modified coordinate space. This method
- * modifies the width of the [CanvasScope] to be equivalent to width - (left + right) as well as
+ * modifies the width of the [DrawScope] to be equivalent to width - (left + right) as well as
  * height to height - (top + bottom)
  *
  * @param left number of pixels to inset the left drawing bound
@@ -50,12 +52,12 @@
  * @param bottom number of pixels to inset the bottom drawing bound
  * @param block lambda that is called to issue drawing commands within the inset coordinate space
  */
-inline fun CanvasScope.inset(
+inline fun DrawScope.inset(
     left: Float,
     top: Float,
     right: Float,
     bottom: Float,
-    block: CanvasScope.() -> Unit
+    block: DrawScope.() -> Unit
 ) = canvas?.apply {
         transform.inset(left, top, right, bottom)
         block()
@@ -63,7 +65,7 @@
     }
 
 /**
- * Convenience method modifies the [CanvasScope] bounds to inset both left and right bounds by
+ * Convenience method modifies the [DrawScope] bounds to inset both left and right bounds by
  * [dx] as well as the top and bottom by [dy]. If only [dx] is provided, the same inset is applied
  * to all 4 bounds
  *
@@ -73,7 +75,7 @@
  * @param block lambda that is called to issue additional drawing commands within the modified
  * coordinate space
  */
-inline fun CanvasScope.inset(dx: Float = 0.0f, dy: Float = 0.0f, block: CanvasScope.() -> Unit) =
+inline fun DrawScope.inset(dx: Float = 0.0f, dy: Float = 0.0f, block: DrawScope.() -> Unit) =
     inset(dx, dy, dx, dy, block)
 
 /**
@@ -85,10 +87,10 @@
  * @param block lambda that is called to issue drawing commands within the
  * translated coordinate space
  */
-inline fun CanvasScope.translate(
+inline fun DrawScope.translate(
     left: Float = 0.0f,
     top: Float = 0.0f,
-    block: CanvasScope.() -> Unit
+    block: DrawScope.() -> Unit
 ) = canvas?.apply {
         translate(left, top)
         block()
@@ -108,11 +110,11 @@
  *  @param block lambda that is called to issue drawing commands within the rotated
  *  coordinate space
  */
-inline fun CanvasScope.rotate(
+inline fun DrawScope.rotate(
     degrees: Float,
     pivotX: Float = center.dx,
     pivotY: Float = center.dy,
-    block: CanvasScope.() -> Unit
+    block: DrawScope.() -> Unit
 ) = withTransform({ rotate(degrees, pivotX, pivotY) }, block)
 
 /**
@@ -127,11 +129,11 @@
  * @param block lambda that is called to issue drawing commands within the rotated
  * coordinate space
  */
-inline fun CanvasScope.rotateRad(
+inline fun DrawScope.rotateRad(
     radians: Float,
     pivotX: Float = center.dx,
     pivotY: Float = center.dy,
-    block: CanvasScope.() -> Unit
+    block: DrawScope.() -> Unit
 ) = withTransform({ rotate(degrees(radians), pivotX, pivotY) }, block)
 
 /**
@@ -151,12 +153,12 @@
  * coordinate space vertically
  * @param block lambda used to issue drawing commands within the scaled coordinate space
  */
-inline fun CanvasScope.scale(
+inline fun DrawScope.scale(
     scaleX: Float,
     scaleY: Float = scaleX,
     pivotX: Float = center.dx,
     pivotY: Float = center.dy,
-    block: CanvasScope.() -> Unit
+    block: DrawScope.() -> Unit
 ) = withTransform({ scale(scaleX, scaleY, pivotX, pivotY) }, block)
 
 /**
@@ -174,13 +176,13 @@
  * @param block Lambda callback with this CanvasScope as a receiver scope to issue drawing commands
  * within the provided clip
  */
-inline fun CanvasScope.clipRect(
+inline fun DrawScope.clipRect(
     left: Float = 0.0f,
     top: Float = 0.0f,
     right: Float = size.width,
     bottom: Float = size.height,
     clipOp: ClipOp = ClipOp.intersect,
-    block: CanvasScope.() -> Unit
+    block: DrawScope.() -> Unit
 ) = withTransform({ clipRect(left, top, right, bottom, clipOp) }, block)
 
 /**
@@ -192,20 +194,20 @@
  * @param block Lambda callback with this CanvasScope as a receiver scope to issue drawing commands
  * within the provided clip
  */
-inline fun CanvasScope.clipPath(
+inline fun DrawScope.clipPath(
     path: Path,
     clipOp: ClipOp = ClipOp.intersect,
-    block: CanvasScope.() -> Unit
+    block: DrawScope.() -> Unit
 ) = withTransform({ clipPath(path, clipOp) }, block)
 
 /**
  * Provides access to draw directly with the underlying [Canvas] along with the current
- * size of the [CanvasScope]. This is helpful for situations
- * to re-use alternative drawing logic in combination with [CanvasScope]
+ * size of the [DrawScope]. This is helpful for situations
+ * to re-use alternative drawing logic in combination with [DrawScope]
  *
  * @param block Lambda callback to issue drawing commands on the provided [Canvas] and given size
  */
-inline fun CanvasScope.drawCanvas(block: (Canvas, PxSize) -> Unit) =
+inline fun DrawScope.drawCanvas(block: (Canvas, PxSize) -> Unit) =
     canvas?.let {
         block(it, PxSize(Px(size.width), Px(size.height)))
     }
@@ -221,9 +223,9 @@
  * @param drawBlock Callback invoked to issue drawing operations after the transformations are
  * applied
  */
-inline fun CanvasScope.withTransform(
+inline fun DrawScope.withTransform(
     transformBlock: CanvasTransform.() -> Unit,
-    drawBlock: CanvasScope.() -> Unit
+    drawBlock: DrawScope.() -> Unit
 ) = canvas?.apply {
         // Transformation can include inset calls which change the drawing area
         // so cache the previous size before the transformation is done
@@ -240,8 +242,8 @@
  * Creates a scoped drawing environment with the provided [Canvas]. This provides a
  * declarative, stateless API to draw shapes and paths without requiring
  * consumers to maintain underlying [Canvas] state information.
- * The bounds for drawing within [CanvasScope] are provided by the call to
- * [CanvasScope.draw] and are always bound to the local translation. That is the left and
+ * The bounds for drawing within [DrawScope] are provided by the call to
+ * [DrawScope.draw] and are always bound to the local translation. That is the left and
  * top coordinates are always the origin and the right and bottom coordinates are always the
  * specified width and height respectively. Drawing content is not clipped,
  * so it is possible to draw outside of the specified bounds.
@@ -249,25 +251,25 @@
  * @sample androidx.ui.graphics.samples.canvasScopeSample
  */
 @CanvasScopeMarker
-open class CanvasScope {
+abstract class DrawScope : Density {
 
     @PublishedApi internal var canvas: Canvas? = null
 
     @PublishedApi internal val transform = object : CanvasTransform {
 
         override val size: Size
-            get() = this@CanvasScope.size
+            get() = this@DrawScope.size
 
         override val center: Offset
-            get() = this@CanvasScope.center
+            get() = this@DrawScope.center
 
         override fun inset(left: Float, top: Float, right: Float, bottom: Float) {
-            this@CanvasScope.canvas?.let {
+            this@DrawScope.canvas?.let {
                 val updatedSize = size - Offset(left + right, top + bottom)
                 require(updatedSize.width > 0 && updatedSize.height > 0) {
                     "Width and height must be greater than zero"
                 }
-                this@CanvasScope.setSize(updatedSize)
+                this@DrawScope.setSize(updatedSize)
                 it.translate(left, top)
             }
         }
@@ -279,19 +281,19 @@
             bottom: Float,
             clipOp: ClipOp
         ) {
-            this@CanvasScope.canvas?.clipRect(left, top, right, bottom, clipOp)
+            this@DrawScope.canvas?.clipRect(left, top, right, bottom, clipOp)
         }
 
         override fun clipPath(path: Path, clipOp: ClipOp) {
-            this@CanvasScope.canvas?.clipPath(path, clipOp)
+            this@DrawScope.canvas?.clipPath(path, clipOp)
         }
 
         override fun translate(left: Float, top: Float) {
-            this@CanvasScope.canvas?.translate(left, top)
+            this@DrawScope.canvas?.translate(left, top)
         }
 
         override fun rotate(degrees: Float, pivotX: Float, pivotY: Float) {
-            this@CanvasScope.canvas?.apply {
+            this@DrawScope.canvas?.apply {
                 translate(pivotX, pivotY)
                 rotate(degrees)
                 translate(-pivotX, -pivotY)
@@ -299,7 +301,7 @@
         }
 
         override fun scale(scaleX: Float, scaleY: Float, pivotX: Float, pivotY: Float) {
-            this@CanvasScope.canvas?.apply {
+            this@DrawScope.canvas?.apply {
                 translate(pivotX, pivotY)
                 scale(scaleX, scaleY)
                 translate(-pivotX, -pivotY)
@@ -338,6 +340,11 @@
         private set
 
     /**
+     * The layout direction of the layout being drawn in.
+     */
+    abstract val layoutDirection: LayoutDirection
+
+    /**
      * Draws a line between the given points using the given paint. The line is
      * stroked.
      *
@@ -898,14 +905,14 @@
 
     /**
      * Draws into the provided [Canvas] with the commands specified in the lambda with this
-     * [CanvasScope] as a receiver
+     * [DrawScope] as a receiver
      *
      * @param canvas target canvas to render into
-     * @param size bounds relative to the current canvas translation in which the [CanvasScope]
+     * @param size bounds relative to the current canvas translation in which the [DrawScope]
      * should draw within
-     * @param block lambda that is called to issue drawing commands on this [CanvasScope]
+     * @param block lambda that is called to issue drawing commands on this [DrawScope]
      */
-    fun draw(canvas: Canvas, size: Size, block: CanvasScope.() -> Unit) {
+    fun draw(canvas: Canvas, size: Size, block: DrawScope.() -> Unit) {
         val previousSize = this.size
         // Remember the previous canvas in case we are temporarily re-directing our drawing
         // to a separate Layer/RenderNode only to draw that content back into the original Canvas
@@ -1030,7 +1037,7 @@
 }
 
 /**
- * Represents how the shapes should be drawn within a [CanvasScope]
+ * Represents how the shapes should be drawn within a [DrawScope]
  */
 sealed class DrawStyle
 
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ImagePainter.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ImagePainter.kt
index 8c5e856..9c2d3e6 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ImagePainter.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/ImagePainter.kt
@@ -45,11 +45,11 @@
 
     private val size: PxSize = validateSize(srcOffset, srcSize)
 
-    private var alpha: Float = CanvasScope.DefaultAlpha
+    private var alpha: Float = DrawScope.DefaultAlpha
 
     private var colorFilter: ColorFilter? = null
 
-    override fun CanvasScope.onDraw() {
+    override fun DrawScope.onDraw() {
         drawImage(
             image,
             srcOffset,
diff --git a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/Painter.kt b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/Painter.kt
index bb6a153..bc936c9 100644
--- a/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/Painter.kt
+++ b/ui/ui-graphics/src/main/java/androidx/ui/graphics/painter/Painter.kt
@@ -15,9 +15,9 @@
  */
 package androidx.ui.graphics.painter
 
+import androidx.ui.core.LayoutDirection
 import androidx.ui.geometry.Rect
 import androidx.ui.geometry.Size
-import androidx.ui.graphics.Canvas
 import androidx.ui.graphics.ColorFilter
 import androidx.ui.graphics.DefaultAlpha
 import androidx.ui.graphics.Paint
@@ -70,8 +70,6 @@
      */
     private var colorFilter: ColorFilter? = null
 
-    private val canvasScope = CanvasScope()
-
     /**
      * Optional [ColorFilter] used to modify the source pixels when drawn to the destination
      * The default implementation of [Painter] will render it's contents into a separate
@@ -130,22 +128,22 @@
         }
     }
 
-    private var rtl: Boolean = false
+    private var layoutDirection: LayoutDirection = LayoutDirection.Ltr
 
     /**
      * Flag indicating that the contents of the [Painter] should be drawn with
      * to support locales with right-to-left languages.
      * Implementations of [Painter] that support right to left contents should implement
-     * the [applyRtl] method
+     * the [applyLayoutDirection] method
      */
-    private fun configureRtl(rtl: Boolean) {
-        if (this.rtl != rtl) {
-            applyRtl(rtl)
-            this.rtl = rtl
+    private fun configureLayoutDirection(rtl: LayoutDirection) {
+        if (this.layoutDirection != rtl) {
+            applyLayoutDirection(rtl)
+            this.layoutDirection = rtl
         }
     }
 
-    private val drawLambda: CanvasScope.() -> Unit = { onDraw() }
+    private val drawLambda: DrawScope.() -> Unit = { onDraw() }
 
     /**
      * Return the intrinsic size of the [Painter].
@@ -162,7 +160,7 @@
      * Implementation of drawing logic for instances of [Painter]. This is invoked
      * internally within [draw] after the positioning and configuring the [Painter]
      */
-    protected abstract fun CanvasScope.onDraw()
+    protected abstract fun DrawScope.onDraw()
 
     /**
      * Apply the provided alpha value returning true if it was applied successfully,
@@ -177,33 +175,33 @@
     protected open fun applyColorFilter(colorFilter: ColorFilter?): Boolean = false
 
     /**
-     * Apply the appropriate internal configuration to positioning content for locales with
-     * right-to-left languages
+     * Apply the appropriate internal configuration to positioning content with the
+     * given [LayoutDirection]
      */
-    protected open fun applyRtl(rtl: Boolean): Boolean = false
+    protected open fun applyLayoutDirection(layoutDirection: LayoutDirection): Boolean = false
 
-    fun draw(
-        canvas: Canvas,
-        size: PxSize,
+    fun DrawScope.draw(
+        size: Size,
         alpha: Float = DefaultAlpha,
-        colorFilter: ColorFilter? = null,
-        rtl: Boolean = false
+        colorFilter: ColorFilter? = null
     ) {
         configureAlpha(alpha)
         configureColorFilter(colorFilter)
-        configureRtl(rtl)
+        configureLayoutDirection(layoutDirection)
 
-        val scopeSize = Size(size.width.value, size.height.value)
-        if (alpha > 0.0f) {
-            if (useLayer) {
-                val layerRect =
-                    Rect.fromLTWH(0.0f, 0.0f, size.width.value, size.height.value)
-                // TODO (b/154550724) njawad replace with RenderNode/Layer API usage
-                canvas.withSaveLayer(layerRect, obtainPaint()) {
-                    canvasScope.draw(canvas, scopeSize, drawLambda)
+        // b/156512437 to expose saveLayer on DrawScope
+        drawCanvas { canvas, _ ->
+            if (alpha > 0.0f) {
+                if (useLayer) {
+                    val layerRect =
+                        Rect.fromLTWH(0.0f, 0.0f, size.width, size.height)
+                    // TODO (b/154550724) njawad replace with RenderNode/Layer API usage
+                    canvas.withSaveLayer(layerRect, obtainPaint()) {
+                        draw(canvas, size, drawLambda)
+                    }
+                } else {
+                    draw(canvas, size, drawLambda)
                 }
-            } else {
-                canvasScope.draw(canvas, scopeSize, drawLambda)
             }
         }
     }
diff --git a/ui/ui-material/api/0.1.0-dev12.txt b/ui/ui-material/api/0.1.0-dev12.txt
index a580938..93e2b6d 100644
--- a/ui/ui-material/api/0.1.0-dev12.txt
+++ b/ui/ui-material/api/0.1.0-dev12.txt
@@ -333,7 +333,7 @@
 
   public interface RippleEffect {
     method public default void dispose();
-    method public void draw-W2xXVUk(androidx.ui.core.DrawScope, long color);
+    method public void draw-aFmCyno(androidx.ui.graphics.painter.DrawScope, long color);
     method public void finish(boolean canceled);
   }
 
diff --git a/ui/ui-material/api/current.txt b/ui/ui-material/api/current.txt
index a580938..93e2b6d 100644
--- a/ui/ui-material/api/current.txt
+++ b/ui/ui-material/api/current.txt
@@ -333,7 +333,7 @@
 
   public interface RippleEffect {
     method public default void dispose();
-    method public void draw-W2xXVUk(androidx.ui.core.DrawScope, long color);
+    method public void draw-aFmCyno(androidx.ui.graphics.painter.DrawScope, long color);
     method public void finish(boolean canceled);
   }
 
diff --git a/ui/ui-material/api/public_plus_experimental_0.1.0-dev12.txt b/ui/ui-material/api/public_plus_experimental_0.1.0-dev12.txt
index a580938..93e2b6d 100644
--- a/ui/ui-material/api/public_plus_experimental_0.1.0-dev12.txt
+++ b/ui/ui-material/api/public_plus_experimental_0.1.0-dev12.txt
@@ -333,7 +333,7 @@
 
   public interface RippleEffect {
     method public default void dispose();
-    method public void draw-W2xXVUk(androidx.ui.core.DrawScope, long color);
+    method public void draw-aFmCyno(androidx.ui.graphics.painter.DrawScope, long color);
     method public void finish(boolean canceled);
   }
 
diff --git a/ui/ui-material/api/public_plus_experimental_current.txt b/ui/ui-material/api/public_plus_experimental_current.txt
index a580938..93e2b6d 100644
--- a/ui/ui-material/api/public_plus_experimental_current.txt
+++ b/ui/ui-material/api/public_plus_experimental_current.txt
@@ -333,7 +333,7 @@
 
   public interface RippleEffect {
     method public default void dispose();
-    method public void draw-W2xXVUk(androidx.ui.core.DrawScope, long color);
+    method public void draw-aFmCyno(androidx.ui.graphics.painter.DrawScope, long color);
     method public void finish(boolean canceled);
   }
 
diff --git a/ui/ui-material/api/restricted_0.1.0-dev12.txt b/ui/ui-material/api/restricted_0.1.0-dev12.txt
index a580938..93e2b6d 100644
--- a/ui/ui-material/api/restricted_0.1.0-dev12.txt
+++ b/ui/ui-material/api/restricted_0.1.0-dev12.txt
@@ -333,7 +333,7 @@
 
   public interface RippleEffect {
     method public default void dispose();
-    method public void draw-W2xXVUk(androidx.ui.core.DrawScope, long color);
+    method public void draw-aFmCyno(androidx.ui.graphics.painter.DrawScope, long color);
     method public void finish(boolean canceled);
   }
 
diff --git a/ui/ui-material/api/restricted_current.txt b/ui/ui-material/api/restricted_current.txt
index a580938..93e2b6d 100644
--- a/ui/ui-material/api/restricted_current.txt
+++ b/ui/ui-material/api/restricted_current.txt
@@ -333,7 +333,7 @@
 
   public interface RippleEffect {
     method public default void dispose();
-    method public void draw-W2xXVUk(androidx.ui.core.DrawScope, long color);
+    method public void draw-aFmCyno(androidx.ui.graphics.painter.DrawScope, long color);
     method public void finish(boolean canceled);
   }
 
diff --git a/ui/ui-material/src/androidTest/java/androidx/ui/material/RippleTest.kt b/ui/ui-material/src/androidTest/java/androidx/ui/material/RippleTest.kt
index 0b7092a..8eb5b2966 100644
--- a/ui/ui-material/src/androidTest/java/androidx/ui/material/RippleTest.kt
+++ b/ui/ui-material/src/androidTest/java/androidx/ui/material/RippleTest.kt
@@ -25,7 +25,6 @@
 import androidx.compose.setValue
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
-import androidx.ui.core.DrawScope
 import androidx.ui.core.Modifier
 import androidx.ui.core.TestTag
 import androidx.ui.foundation.Box
@@ -36,6 +35,7 @@
 import androidx.ui.geometry.Size
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.RectangleShape
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.graphics.painter.clipRect
 import androidx.ui.layout.Row
 import androidx.ui.layout.padding
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Checkbox.kt b/ui/ui-material/src/main/java/androidx/ui/material/Checkbox.kt
index 240b33f..add0ad0 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Checkbox.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Checkbox.kt
@@ -38,7 +38,7 @@
 import androidx.ui.graphics.ClipOp
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.StrokeCap
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.graphics.painter.Stroke
 import androidx.ui.graphics.painter.clipRect
 import androidx.ui.layout.padding
@@ -148,7 +148,7 @@
     }
 }
 
-private fun CanvasScope.drawBox(
+private fun DrawScope.drawBox(
     color: Color,
     innerRadiusFraction: Float,
     radius: Float,
@@ -214,7 +214,7 @@
     }
 }
 
-private fun CanvasScope.drawCheck(
+private fun DrawScope.drawCheck(
     checkFraction: Float,
     crossCenterGravitation: Float,
     strokeWidthPx: Float
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/ProgressIndicator.kt b/ui/ui-material/src/main/java/androidx/ui/material/ProgressIndicator.kt
index 2f23a18..5b51e5b 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/ProgressIndicator.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/ProgressIndicator.kt
@@ -26,9 +26,8 @@
 import androidx.compose.Composable
 import androidx.ui.animation.Transition
 import androidx.ui.core.DensityAmbient
-import androidx.ui.core.DrawScope
-import androidx.ui.core.Modifier
 import androidx.ui.core.LayoutDirection
+import androidx.ui.core.Modifier
 import androidx.ui.foundation.Canvas
 import androidx.ui.foundation.DeterminateProgressIndicator
 import androidx.ui.foundation.Strings
@@ -36,7 +35,7 @@
 import androidx.ui.geometry.Size
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.StrokeCap
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.graphics.painter.Stroke
 import androidx.ui.graphics.vectormath.degrees
 import androidx.ui.layout.padding
@@ -232,7 +231,7 @@
     }
 }
 
-private fun CanvasScope.drawCircularIndicator(
+private fun DrawScope.drawCircularIndicator(
     startAngle: Float,
     sweep: Float,
     color: Color,
@@ -267,14 +266,14 @@
     val DefaultStrokeWidth = 4.dp
 }
 
-private fun CanvasScope.drawDeterminateCircularIndicator(
+private fun DrawScope.drawDeterminateCircularIndicator(
     startAngle: Float,
     sweep: Float,
     color: Color,
     stroke: Stroke
 ) = drawCircularIndicator(startAngle, sweep, color, stroke)
 
-private fun CanvasScope.drawIndeterminateCircularIndicator(
+private fun DrawScope.drawIndeterminateCircularIndicator(
     startAngle: Float,
     strokeWidth: Dp,
     sweep: Float,
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/RadioButton.kt b/ui/ui-material/src/main/java/androidx/ui/material/RadioButton.kt
index 121a81b..c2636a1 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/RadioButton.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/RadioButton.kt
@@ -31,7 +31,7 @@
 import androidx.ui.foundation.selection.MutuallyExclusiveSetItem
 import androidx.ui.geometry.Offset
 import androidx.ui.graphics.Color
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.graphics.painter.Stroke
 import androidx.ui.layout.Column
 import androidx.ui.layout.Row
@@ -223,7 +223,7 @@
     }
 }
 
-private fun CanvasScope.drawRadio(
+private fun DrawScope.drawRadio(
     color: Color,
     outerPx: Float,
     innerPx: Float,
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/Switch.kt b/ui/ui-material/src/main/java/androidx/ui/material/Switch.kt
index 82f5707..24305f3 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/Switch.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/Switch.kt
@@ -27,7 +27,7 @@
 import androidx.ui.geometry.Offset
 import androidx.ui.graphics.Color
 import androidx.ui.graphics.StrokeCap
-import androidx.ui.graphics.painter.CanvasScope
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.graphics.painter.Stroke
 import androidx.ui.layout.Stack
 import androidx.ui.layout.padding
@@ -120,7 +120,7 @@
     }
 }
 
-private fun CanvasScope.drawTrack(trackColor: Color, trackWidth: Float, stroke: Stroke) {
+private fun DrawScope.drawTrack(trackColor: Color, trackWidth: Float, stroke: Stroke) {
     val strokeRadius = stroke.width / 2
     drawLine(
         trackColor,
@@ -130,7 +130,7 @@
     )
 }
 
-private fun CanvasScope.drawThumb(position: Float, thumbDiameter: Float, thumbColor: Color) {
+private fun DrawScope.drawThumb(position: Float, thumbDiameter: Float, thumbColor: Color) {
     val thumbRadius = thumbDiameter / 2
     val x = position + thumbRadius
     drawCircle(thumbColor, thumbRadius, Offset(x, center.dy))
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/ripple/DefaultRippleEffect.kt b/ui/ui-material/src/main/java/androidx/ui/material/ripple/DefaultRippleEffect.kt
index 23f1142..99b1cef 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/ripple/DefaultRippleEffect.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/ripple/DefaultRippleEffect.kt
@@ -30,8 +30,8 @@
 import androidx.compose.setValue
 import androidx.ui.animation.PxPositionPropKey
 import androidx.ui.animation.PxPropKey
-import androidx.ui.core.DrawScope
 import androidx.ui.graphics.Color
+import androidx.ui.graphics.painter.DrawScope
 import androidx.ui.graphics.painter.clipRect
 import androidx.ui.unit.Density
 import androidx.ui.unit.Dp
diff --git a/ui/ui-material/src/main/java/androidx/ui/material/ripple/RippleEffect.kt b/ui/ui-material/src/main/java/androidx/ui/material/ripple/RippleEffect.kt
index 7b7f9b7..8156ffb 100644
--- a/ui/ui-material/src/main/java/androidx/ui/material/ripple/RippleEffect.kt
+++ b/ui/ui-material/src/main/java/androidx/ui/material/ripple/RippleEffect.kt
@@ -16,8 +16,8 @@
 
 package androidx.ui.material.ripple
 
-import androidx.ui.core.DrawScope
 import androidx.ui.graphics.Color
+import androidx.ui.graphics.painter.DrawScope
 
 /**
  * [RippleEffect]s are drawn as part of [ripple] as a visual indicator for a pressed state.