[flutter roll cp] Revert "[Impeller] construct text frames on UI thread." (#45910) (#45958)

Reverts flutter/engine#45418

Some google3 tests are hitting the CHECK I added in the
DlSkCanvasDispatcher::drawTextFrame, which indicates that the
SkParagraph code likely thinks impeller is enabled, whereas other code
might be running with Skia.

Perhaps this could happen if its software rendering? It should be a
fatal error on startup so we can track this down.

cherry pick for flutter roll

Co-authored-by: Jonah Williams <jonahwilliams@google.com>
diff --git a/display_list/BUILD.gn b/display_list/BUILD.gn
index 736e13d..97c9683 100644
--- a/display_list/BUILD.gn
+++ b/display_list/BUILD.gn
@@ -87,7 +87,6 @@
   public_deps = [
     "//flutter/fml",
     "//flutter/impeller/runtime_stage",
-    "//flutter/impeller/typographer",
     "//third_party/skia",
   ]
 
diff --git a/display_list/benchmarking/dl_complexity_gl.cc b/display_list/benchmarking/dl_complexity_gl.cc
index 53b70e2..f8dd1c5 100644
--- a/display_list/benchmarking/dl_complexity_gl.cc
+++ b/display_list/benchmarking/dl_complexity_gl.cc
@@ -637,11 +637,6 @@
   draw_text_blob_count_++;
 }
 
-void DisplayListGLComplexityCalculator::GLHelper::drawTextFrame(
-    const std::shared_ptr<impeller::TextFrame>& text_frame,
-    SkScalar x,
-    SkScalar y) {}
-
 void DisplayListGLComplexityCalculator::GLHelper::drawShadow(
     const SkPath& path,
     const DlColor color,
diff --git a/display_list/benchmarking/dl_complexity_gl.h b/display_list/benchmarking/dl_complexity_gl.h
index 5115bb4..9fc7596 100644
--- a/display_list/benchmarking/dl_complexity_gl.h
+++ b/display_list/benchmarking/dl_complexity_gl.h
@@ -70,9 +70,6 @@
     void drawTextBlob(const sk_sp<SkTextBlob> blob,
                       SkScalar x,
                       SkScalar y) override;
-    void drawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                       SkScalar x,
-                       SkScalar y) override;
     void drawShadow(const SkPath& path,
                     const DlColor color,
                     const SkScalar elevation,
diff --git a/display_list/benchmarking/dl_complexity_metal.cc b/display_list/benchmarking/dl_complexity_metal.cc
index c6b6547..56d4f3b 100644
--- a/display_list/benchmarking/dl_complexity_metal.cc
+++ b/display_list/benchmarking/dl_complexity_metal.cc
@@ -581,11 +581,6 @@
   draw_text_blob_count_++;
 }
 
-void DisplayListMetalComplexityCalculator::MetalHelper::drawTextFrame(
-    const std::shared_ptr<impeller::TextFrame>& text_frame,
-    SkScalar x,
-    SkScalar y) {}
-
 void DisplayListMetalComplexityCalculator::MetalHelper::drawShadow(
     const SkPath& path,
     const DlColor color,
diff --git a/display_list/benchmarking/dl_complexity_metal.h b/display_list/benchmarking/dl_complexity_metal.h
index dd068e2..aa63863 100644
--- a/display_list/benchmarking/dl_complexity_metal.h
+++ b/display_list/benchmarking/dl_complexity_metal.h
@@ -70,9 +70,6 @@
     void drawTextBlob(const sk_sp<SkTextBlob> blob,
                       SkScalar x,
                       SkScalar y) override;
-    void drawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                       SkScalar x,
-                       SkScalar y) override;
     void drawShadow(const SkPath& path,
                     const DlColor color,
                     const SkScalar elevation,
diff --git a/display_list/display_list.h b/display_list/display_list.h
index 3d4a7ac..668a247 100644
--- a/display_list/display_list.h
+++ b/display_list/display_list.h
@@ -136,7 +136,6 @@
                                     \
   V(DrawDisplayList)                \
   V(DrawTextBlob)                   \
-  V(DrawTextFrame)                  \
                                     \
   V(DrawShadow)                     \
   V(DrawShadowTransparentOccluder)
diff --git a/display_list/dl_builder.cc b/display_list/dl_builder.cc
index f20b8fe..2906f9a 100644
--- a/display_list/dl_builder.cc
+++ b/display_list/dl_builder.cc
@@ -1302,48 +1302,6 @@
   SetAttributesFromPaint(paint, DisplayListOpFlags::kDrawTextBlobFlags);
   drawTextBlob(blob, x, y);
 }
-
-void DisplayListBuilder::drawTextFrame(
-    const std::shared_ptr<impeller::TextFrame>& text_frame,
-    SkScalar x,
-    SkScalar y) {
-  DisplayListAttributeFlags flags = kDrawTextBlobFlags;
-  OpResult result = PaintResult(current_, flags);
-  if (result == OpResult::kNoEffect) {
-    return;
-  }
-  impeller::Rect bounds = text_frame->GetBounds();
-  SkRect sk_bounds = SkRect::MakeLTRB(bounds.GetLeft(), bounds.GetTop(),
-                                      bounds.GetRight(), bounds.GetBottom());
-  bool unclipped = AccumulateOpBounds(sk_bounds.makeOffset(x, y), flags);
-  // TODO(https://github.com/flutter/flutter/issues/82202): Remove once the
-  // unit tests can use Fuchsia's font manager instead of the empty default.
-  // Until then we might encounter empty bounds for otherwise valid text and
-  // thus we ignore the results from AccumulateOpBounds.
-#if defined(OS_FUCHSIA)
-  unclipped = true;
-#endif  // OS_FUCHSIA
-  if (unclipped) {
-    Push<DrawTextFrameOp>(0, 1, text_frame, x, y);
-    // There is no way to query if the glyphs of a text blob overlap and
-    // there are no current guarantees from either Skia or Impeller that
-    // they will protect overlapping glyphs from the effects of overdraw
-    // so we must make the conservative assessment that this DL layer is
-    // not compatible with group opacity inheritance.
-    UpdateLayerOpacityCompatibility(false);
-    UpdateLayerResult(result);
-  }
-}
-
-void DisplayListBuilder::DrawTextFrame(
-    const std::shared_ptr<impeller::TextFrame>& text_frame,
-    SkScalar x,
-    SkScalar y,
-    const DlPaint& paint) {
-  SetAttributesFromPaint(paint, DisplayListOpFlags::kDrawTextBlobFlags);
-  drawTextFrame(text_frame, x, y);
-}
-
 void DisplayListBuilder::DrawShadow(const SkPath& path,
                                     const DlColor color,
                                     const SkScalar elevation,
diff --git a/display_list/dl_builder.h b/display_list/dl_builder.h
index 3a65b8f..ab0bce0 100644
--- a/display_list/dl_builder.h
+++ b/display_list/dl_builder.h
@@ -224,16 +224,6 @@
                     SkScalar x,
                     SkScalar y,
                     const DlPaint& paint) override;
-
-  void drawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                     SkScalar x,
-                     SkScalar y) override;
-
-  void DrawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                     SkScalar x,
-                     SkScalar y,
-                     const DlPaint& paint) override;
-
   // |DlCanvas|
   void DrawShadow(const SkPath& path,
                   const DlColor color,
diff --git a/display_list/dl_canvas.h b/display_list/dl_canvas.h
index 5cd0614..f04645c 100644
--- a/display_list/dl_canvas.h
+++ b/display_list/dl_canvas.h
@@ -18,8 +18,6 @@
 #include "third_party/skia/include/core/SkRect.h"
 #include "third_party/skia/include/core/SkTextBlob.h"
 
-#include "impeller/typographer/text_frame.h"
-
 namespace flutter {
 
 //------------------------------------------------------------------------------
@@ -154,7 +152,7 @@
   virtual void DrawVertices(const DlVertices* vertices,
                             DlBlendMode mode,
                             const DlPaint& paint) = 0;
-  void DrawVertices(const std::shared_ptr<const DlVertices>& vertices,
+  void DrawVertices(const std::shared_ptr<const DlVertices> vertices,
                     DlBlendMode mode,
                     const DlPaint& paint) {
     DrawVertices(vertices.get(), mode, paint);
@@ -203,13 +201,6 @@
                          const DlPaint* paint = nullptr) = 0;
   virtual void DrawDisplayList(const sk_sp<DisplayList> display_list,
                                SkScalar opacity = SK_Scalar1) = 0;
-
-  virtual void DrawTextFrame(
-      const std::shared_ptr<impeller::TextFrame>& text_frame,
-      SkScalar x,
-      SkScalar y,
-      const DlPaint& paint) = 0;
-
   virtual void DrawTextBlob(const sk_sp<SkTextBlob>& blob,
                             SkScalar x,
                             SkScalar y,
diff --git a/display_list/dl_op_receiver.h b/display_list/dl_op_receiver.h
index d9bbc7b..23a0aaf 100644
--- a/display_list/dl_op_receiver.h
+++ b/display_list/dl_op_receiver.h
@@ -257,10 +257,6 @@
   virtual void drawTextBlob(const sk_sp<SkTextBlob> blob,
                             SkScalar x,
                             SkScalar y) = 0;
-  virtual void drawTextFrame(
-      const std::shared_ptr<impeller::TextFrame>& text_frame,
-      SkScalar x,
-      SkScalar y) = 0;
   virtual void drawShadow(const SkPath& path,
                           const DlColor color,
                           const SkScalar elevation,
diff --git a/display_list/dl_op_records.h b/display_list/dl_op_records.h
index a1c7835..47cdeb9 100644
--- a/display_list/dl_op_records.h
+++ b/display_list/dl_op_records.h
@@ -12,7 +12,6 @@
 #include "flutter/display_list/effects/dl_color_source.h"
 #include "flutter/fml/macros.h"
 
-#include "impeller/typographer/text_frame.h"
 #include "third_party/skia/include/core/SkRSXform.h"
 
 namespace flutter {
@@ -1085,25 +1084,6 @@
   }
 };
 
-struct DrawTextFrameOp final : DrawOpBase {
-  static const auto kType = DisplayListOpType::kDrawTextFrame;
-
-  DrawTextFrameOp(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                  SkScalar x,
-                  SkScalar y)
-      : x(x), y(y), text_frame(text_frame) {}
-
-  const SkScalar x;
-  const SkScalar y;
-  const std::shared_ptr<impeller::TextFrame> text_frame;
-
-  void dispatch(DispatchContext& ctx) const {
-    if (op_needed(ctx)) {
-      ctx.receiver.drawTextFrame(text_frame, x, y);
-    }
-  }
-};
-
 // 4 byte header + 28 byte payload packs evenly into 32 bytes
 #define DEFINE_DRAW_SHADOW_OP(name, transparent_occluder)                     \
   struct Draw##name##Op final : DrawOpBase {                                  \
diff --git a/display_list/skia/dl_sk_canvas.cc b/display_list/skia/dl_sk_canvas.cc
index 34270bd..9299c9a 100644
--- a/display_list/skia/dl_sk_canvas.cc
+++ b/display_list/skia/dl_sk_canvas.cc
@@ -325,14 +325,6 @@
   delegate_->drawTextBlob(blob, x, y, ToSk(paint));
 }
 
-void DlSkCanvasAdapter::DrawTextFrame(
-    const std::shared_ptr<impeller::TextFrame>& text_frame,
-    SkScalar x,
-    SkScalar y,
-    const DlPaint& paint) {
-  FML_CHECK(false);
-}
-
 void DlSkCanvasAdapter::DrawShadow(const SkPath& path,
                                    const DlColor color,
                                    const SkScalar elevation,
diff --git a/display_list/skia/dl_sk_canvas.h b/display_list/skia/dl_sk_canvas.h
index f085d35..0377b7d 100644
--- a/display_list/skia/dl_sk_canvas.h
+++ b/display_list/skia/dl_sk_canvas.h
@@ -7,7 +7,6 @@
 
 #include "flutter/display_list/dl_canvas.h"
 #include "flutter/display_list/skia/dl_sk_types.h"
-#include "impeller/typographer/text_frame.h"
 
 namespace flutter {
 
@@ -145,10 +144,6 @@
                     SkScalar x,
                     SkScalar y,
                     const DlPaint& paint) override;
-  void DrawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                     SkScalar x,
-                     SkScalar y,
-                     const DlPaint& paint) override;
   void DrawShadow(const SkPath& path,
                   const DlColor color,
                   const SkScalar elevation,
diff --git a/display_list/skia/dl_sk_dispatcher.cc b/display_list/skia/dl_sk_dispatcher.cc
index f8cc16d..def08fa 100644
--- a/display_list/skia/dl_sk_dispatcher.cc
+++ b/display_list/skia/dl_sk_dispatcher.cc
@@ -270,13 +270,6 @@
   canvas_->drawTextBlob(blob, x, y, paint());
 }
 
-void DlSkCanvasDispatcher::drawTextFrame(
-    const std::shared_ptr<impeller::TextFrame>& text_frame,
-    SkScalar x,
-    SkScalar y) {
-  FML_CHECK(false);
-}
-
 void DlSkCanvasDispatcher::DrawShadow(SkCanvas* canvas,
                                       const SkPath& path,
                                       DlColor color,
diff --git a/display_list/skia/dl_sk_dispatcher.h b/display_list/skia/dl_sk_dispatcher.h
index ee61012..a7fc73b 100644
--- a/display_list/skia/dl_sk_dispatcher.h
+++ b/display_list/skia/dl_sk_dispatcher.h
@@ -98,9 +98,6 @@
   void drawTextBlob(const sk_sp<SkTextBlob> blob,
                     SkScalar x,
                     SkScalar y) override;
-  void drawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                     SkScalar x,
-                     SkScalar y) override;
   void drawShadow(const SkPath& path,
                   const DlColor color,
                   const SkScalar elevation,
diff --git a/display_list/utils/dl_receiver_utils.h b/display_list/utils/dl_receiver_utils.h
index 2a1f9cb..e2d0731 100644
--- a/display_list/utils/dl_receiver_utils.h
+++ b/display_list/utils/dl_receiver_utils.h
@@ -129,9 +129,6 @@
   void drawTextBlob(const sk_sp<SkTextBlob> blob,
                     SkScalar x,
                     SkScalar y) override {}
-  void drawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                     SkScalar x,
-                     SkScalar y) override {}
   void drawShadow(const SkPath& path,
                   const DlColor color,
                   const SkScalar elevation,
diff --git a/flow/BUILD.gn b/flow/BUILD.gn
index a756057..53de134 100644
--- a/flow/BUILD.gn
+++ b/flow/BUILD.gn
@@ -99,10 +99,7 @@
   deps = [ "//third_party/skia" ]
 
   if (impeller_supports_rendering) {
-    deps += [
-      "//flutter/impeller",
-      "//flutter/impeller/typographer/backends/skia:typographer_skia_backend",
-    ]
+    deps += [ "//flutter/impeller" ]
   }
 }
 
diff --git a/flow/layers/performance_overlay_layer.cc b/flow/layers/performance_overlay_layer.cc
index 1c1ebb4..911131f 100644
--- a/flow/layers/performance_overlay_layer.cc
+++ b/flow/layers/performance_overlay_layer.cc
@@ -14,9 +14,6 @@
 #include "flow/stopwatch_sk.h"
 #include "third_party/skia/include/core/SkFont.h"
 #include "third_party/skia/include/core/SkTextBlob.h"
-#ifdef IMPELLER_SUPPORTS_RENDERING
-#include "impeller/typographer/backends/skia/text_frame_skia.h"  // nogncheck
-#endif  // IMPELLER_SUPPORTS_RENDERING
 
 namespace flutter {
 namespace {
@@ -53,14 +50,7 @@
         stopwatch, label_prefix, font_path);
     // Historically SK_ColorGRAY (== 0xFF888888) was used here
     DlPaint paint(0xFF888888);
-#ifdef IMPELLER_SUPPORTS_RENDERING
-    if (impeller_enabled) {
-      canvas->DrawTextFrame(impeller::MakeTextFrameFromTextBlobSkia(text),
-                            x + label_x, y + height + label_y, paint);
-    }
-#endif  // IMPELLER_SUPPORTS_RENDERING
     canvas->DrawTextBlob(text, x + label_x, y + height + label_y, paint);
-    return;
   }
 }
 
diff --git a/impeller/aiks/aiks_unittests.cc b/impeller/aiks/aiks_unittests.cc
index 6af0cbc..116fe05 100644
--- a/impeller/aiks/aiks_unittests.cc
+++ b/impeller/aiks/aiks_unittests.cc
@@ -5,6 +5,7 @@
 #include <array>
 #include <cmath>
 #include <cstdlib>
+#include <iostream>
 #include <memory>
 #include <tuple>
 #include <utility>
@@ -1309,7 +1310,11 @@
   }
 
   // Create the Impeller text frame and draw it at the designated baseline.
-  auto frame = MakeTextFrameFromTextBlobSkia(blob);
+  auto maybe_frame = MakeTextFrameFromTextBlobSkia(blob);
+  if (!maybe_frame.has_value()) {
+    return false;
+  }
+  auto frame = maybe_frame.value();
 
   Paint text_paint;
   text_paint.color = Color::Yellow().WithAlpha(options.alpha);
@@ -1498,7 +1503,7 @@
     {
       auto blob = SkTextBlob::MakeFromString(t.text, sk_font);
       ASSERT_NE(blob, nullptr);
-      auto frame = MakeTextFrameFromTextBlobSkia(blob);
+      auto frame = MakeTextFrameFromTextBlobSkia(blob).value();
       canvas.DrawTextFrame(frame, Point(), text_paint);
     }
     canvas.Restore();
@@ -3102,7 +3107,12 @@
 
   auto blob = SkTextBlob::MakeFromString("Hello", sk_font);
   ASSERT_NE(blob, nullptr);
-  auto frame = MakeTextFrameFromTextBlobSkia(blob);
+  auto maybe_frame = MakeTextFrameFromTextBlobSkia(blob);
+  ASSERT_TRUE(maybe_frame.has_value());
+  if (!maybe_frame.has_value()) {
+    return;
+  }
+  auto frame = maybe_frame.value();
   canvas.DrawTextFrame(frame, Point(), text_paint);
 
   ASSERT_TRUE(OpenPlaygroundHere(canvas.EndRecordingAsPicture()));
diff --git a/impeller/aiks/canvas.cc b/impeller/aiks/canvas.cc
index f50dd36..6db3b20 100644
--- a/impeller/aiks/canvas.cc
+++ b/impeller/aiks/canvas.cc
@@ -545,7 +545,7 @@
   }
 }
 
-void Canvas::DrawTextFrame(const std::shared_ptr<TextFrame>& text_frame,
+void Canvas::DrawTextFrame(const TextFrame& text_frame,
                            Point position,
                            const Paint& paint) {
   Entity entity;
@@ -553,7 +553,7 @@
   entity.SetBlendMode(paint.blend_mode);
 
   auto text_contents = std::make_shared<TextContents>();
-  text_contents->SetTextFrame(text_frame);
+  text_contents->SetTextFrame(TextFrame(text_frame));
   text_contents->SetColor(paint.color);
 
   entity.SetTransformation(GetCurrentTransformation() *
diff --git a/impeller/aiks/canvas.h b/impeller/aiks/canvas.h
index 0ea187c..8015555 100644
--- a/impeller/aiks/canvas.h
+++ b/impeller/aiks/canvas.h
@@ -140,7 +140,7 @@
 
   void DrawPicture(const Picture& picture);
 
-  void DrawTextFrame(const std::shared_ptr<TextFrame>& text_frame,
+  void DrawTextFrame(const TextFrame& text_frame,
                      Point position,
                      const Paint& paint);
 
diff --git a/impeller/display_list/dl_dispatcher.cc b/impeller/display_list/dl_dispatcher.cc
index edcd363..aaa2185 100644
--- a/impeller/display_list/dl_dispatcher.cc
+++ b/impeller/display_list/dl_dispatcher.cc
@@ -34,6 +34,7 @@
 #include "impeller/geometry/path_builder.h"
 #include "impeller/geometry/scalar.h"
 #include "impeller/geometry/sigma.h"
+#include "impeller/typographer/backends/skia/text_frame_skia.h"
 
 #if IMPELLER_ENABLE_3D
 #include "impeller/entity/contents/scene_contents.h"
@@ -1060,14 +1061,20 @@
 void DlDispatcher::drawTextBlob(const sk_sp<SkTextBlob> blob,
                                 SkScalar x,
                                 SkScalar y) {
-  // When running with Impeller enabled Skia text blobs are converted to
-  // Impeller text frames in paragraph_skia.cc
-  UNIMPLEMENTED;
-}
+  const auto maybe_text_frame = MakeTextFrameFromTextBlobSkia(blob);
+  if (!maybe_text_frame.has_value()) {
+    return;
+  }
+  const auto text_frame = maybe_text_frame.value();
+  if (paint_.style == Paint::Style::kStroke ||
+      paint_.color_source.GetType() != ColorSource::Type::kColor) {
+    auto bounds = blob->bounds();
+    auto path = skia_conversions::PathDataFromTextBlob(
+        blob, Point(x + bounds.left(), y + bounds.top()));
+    canvas_.DrawPath(path, paint_);
+    return;
+  }
 
-void DlDispatcher::drawTextFrame(const std::shared_ptr<TextFrame>& text_frame,
-                                 SkScalar x,
-                                 SkScalar y) {
   canvas_.DrawTextFrame(text_frame,             //
                         impeller::Point{x, y},  //
                         paint_                  //
diff --git a/impeller/display_list/dl_dispatcher.h b/impeller/display_list/dl_dispatcher.h
index 0dc3b7c..d9a36e2 100644
--- a/impeller/display_list/dl_dispatcher.h
+++ b/impeller/display_list/dl_dispatcher.h
@@ -213,11 +213,6 @@
                     SkScalar y) override;
 
   // |flutter::DlOpReceiver|
-  void drawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                     SkScalar x,
-                     SkScalar y) override;
-
-  // |flutter::DlOpReceiver|
   void drawShadow(const SkPath& path,
                   const flutter::DlColor color,
                   const SkScalar elevation,
diff --git a/impeller/entity/contents/text_contents.cc b/impeller/entity/contents/text_contents.cc
index c17c47a..fceab90 100644
--- a/impeller/entity/contents/text_contents.cc
+++ b/impeller/entity/contents/text_contents.cc
@@ -24,8 +24,8 @@
 
 TextContents::~TextContents() = default;
 
-void TextContents::SetTextFrame(const std::shared_ptr<TextFrame>& frame) {
-  frame_ = frame;
+void TextContents::SetTextFrame(TextFrame&& frame) {
+  frame_ = std::move(frame);
 }
 
 std::shared_ptr<GlyphAtlas> TextContents::ResolveAtlas(
@@ -49,7 +49,7 @@
 }
 
 bool TextContents::CanInheritOpacity(const Entity& entity) const {
-  return !frame_->MaybeHasOverlapping();
+  return !frame_.MaybeHasOverlapping();
 }
 
 void TextContents::SetInheritedOpacity(Scalar opacity) {
@@ -61,13 +61,13 @@
 }
 
 std::optional<Rect> TextContents::GetCoverage(const Entity& entity) const {
-  return frame_->GetBounds().TransformBounds(entity.GetTransformation());
+  return frame_.GetBounds().TransformBounds(entity.GetTransformation());
 }
 
 void TextContents::PopulateGlyphAtlas(
     const std::shared_ptr<LazyGlyphAtlas>& lazy_glyph_atlas,
     Scalar scale) {
-  lazy_glyph_atlas->AddTextFrame(*frame_, scale);
+  lazy_glyph_atlas->AddTextFrame(frame_, scale);
   scale_ = scale;
 }
 
@@ -79,7 +79,7 @@
     return true;
   }
 
-  auto type = frame_->GetAtlasType();
+  auto type = frame_.GetAtlasType();
   auto atlas =
       ResolveAtlas(*renderer.GetContext(), type, renderer.GetLazyGlyphAtlas());
 
@@ -152,7 +152,7 @@
 
   auto& host_buffer = pass.GetTransientsBuffer();
   size_t vertex_count = 0;
-  for (const auto& run : frame_->GetRuns()) {
+  for (const auto& run : frame_.GetRuns()) {
     vertex_count += run.GetGlyphPositions().size();
   }
   vertex_count *= 6;
@@ -163,7 +163,7 @@
         VS::PerVertexData vtx;
         VS::PerVertexData* vtx_contents =
             reinterpret_cast<VS::PerVertexData*>(contents);
-        for (const TextRun& run : frame_->GetRuns()) {
+        for (const TextRun& run : frame_.GetRuns()) {
           const Font& font = run.GetFont();
           Scalar rounded_scale = TextFrame::RoundScaledFontSize(
               scale_, font.GetMetrics().point_size);
diff --git a/impeller/entity/contents/text_contents.h b/impeller/entity/contents/text_contents.h
index 07d191e..6e3b89d 100644
--- a/impeller/entity/contents/text_contents.h
+++ b/impeller/entity/contents/text_contents.h
@@ -26,7 +26,7 @@
 
   ~TextContents();
 
-  void SetTextFrame(const std::shared_ptr<TextFrame>& frame);
+  void SetTextFrame(TextFrame&& frame);
 
   void SetColor(Color color);
 
@@ -56,7 +56,7 @@
               RenderPass& pass) const override;
 
  private:
-  std::shared_ptr<TextFrame> frame_;
+  TextFrame frame_;
   Scalar scale_ = 1.0;
   Color color_;
   Scalar inherited_opacity_ = 1.0;
diff --git a/impeller/entity/entity_unittests.cc b/impeller/entity/entity_unittests.cc
index b5d36ca..c01a4ae 100644
--- a/impeller/entity/entity_unittests.cc
+++ b/impeller/entity/entity_unittests.cc
@@ -2173,13 +2173,13 @@
   SkFont font;
   font.setSize(30);
   auto blob = SkTextBlob::MakeFromString("A", font);
-  auto frame = MakeTextFrameFromTextBlobSkia(blob);
+  auto frame = MakeTextFrameFromTextBlobSkia(blob).value();
   auto lazy_glyph_atlas =
       std::make_shared<LazyGlyphAtlas>(TypographerContextSkia::Make());
-  lazy_glyph_atlas->AddTextFrame(*frame, 1.0f);
+  lazy_glyph_atlas->AddTextFrame(frame, 1.0f);
 
   auto text_contents = std::make_shared<TextContents>();
-  text_contents->SetTextFrame(frame);
+  text_contents->SetTextFrame(std::move(frame));
   text_contents->SetColor(Color::Blue().WithAlpha(0.5));
 
   ASSERT_TRUE(text_contents->CanInheritOpacity(entity));
diff --git a/impeller/typographer/backends/skia/text_frame_skia.cc b/impeller/typographer/backends/skia/text_frame_skia.cc
index b5d7ee8..11c256a 100644
--- a/impeller/typographer/backends/skia/text_frame_skia.cc
+++ b/impeller/typographer/backends/skia/text_frame_skia.cc
@@ -8,6 +8,7 @@
 
 #include "flutter/fml/logging.h"
 #include "impeller/typographer/backends/skia/typeface_skia.h"
+#include "include/core/SkFontTypes.h"
 #include "include/core/SkRect.h"
 #include "third_party/skia/include/core/SkFont.h"
 #include "third_party/skia/include/core/SkFontMetrics.h"
@@ -38,10 +39,16 @@
 
 static constexpr Scalar kScaleSize = 100000.0f;
 
-std::shared_ptr<TextFrame> MakeTextFrameFromTextBlobSkia(
+std::optional<TextFrame> MakeTextFrameFromTextBlobSkia(
     const sk_sp<SkTextBlob>& blob) {
-  bool has_color = false;
+  // Handling nullptr text blobs feels overly defensive here, as I don't
+  // actually know if this happens.
+  if (!blob) {
+    return {};
+  }
+
   std::vector<TextRun> runs;
+  bool has_color = false;
   for (SkTextBlobRunIterator run(blob.get()); !run.done(); run.next()) {
     // TODO(jonahwilliams): ask Skia for a public API to look this up.
     // https://github.com/flutter/flutter/issues/112005
@@ -88,7 +95,7 @@
         continue;
     }
   }
-  return std::make_shared<TextFrame>(runs, ToRect(blob->bounds()), has_color);
+  return TextFrame(runs, ToRect(blob->bounds()), has_color);
 }
 
 }  // namespace impeller
diff --git a/impeller/typographer/backends/skia/text_frame_skia.h b/impeller/typographer/backends/skia/text_frame_skia.h
index e7721a0..53170a2 100644
--- a/impeller/typographer/backends/skia/text_frame_skia.h
+++ b/impeller/typographer/backends/skia/text_frame_skia.h
@@ -4,12 +4,13 @@
 
 #pragma once
 
+#include "flutter/fml/macros.h"
 #include "impeller/typographer/text_frame.h"
 #include "third_party/skia/include/core/SkTextBlob.h"
 
 namespace impeller {
 
-std::shared_ptr<impeller::TextFrame> MakeTextFrameFromTextBlobSkia(
+std::optional<TextFrame> MakeTextFrameFromTextBlobSkia(
     const sk_sp<SkTextBlob>& blob);
 
 }  // namespace impeller
diff --git a/impeller/typographer/backends/stb/text_frame_stb.cc b/impeller/typographer/backends/stb/text_frame_stb.cc
index e1d1dd0..5e6060b 100644
--- a/impeller/typographer/backends/stb/text_frame_stb.cc
+++ b/impeller/typographer/backends/stb/text_frame_stb.cc
@@ -8,10 +8,9 @@
 
 namespace impeller {
 
-std::shared_ptr<TextFrame> MakeTextFrameSTB(
-    const std::shared_ptr<TypefaceSTB>& typeface_stb,
-    Font::Metrics metrics,
-    const std::string& text) {
+TextFrame MakeTextFrameSTB(const std::shared_ptr<TypefaceSTB>& typeface_stb,
+                           Font::Metrics metrics,
+                           const std::string& text) {
   TextRun run(Font(typeface_stb, metrics));
 
   // Shape the text run using STB. The glyph positions could also be resolved
@@ -62,8 +61,7 @@
   }
 
   std::vector<TextRun> runs = {run};
-  return std::make_shared<TextFrame>(
-      runs, result.value_or(Rect::MakeLTRB(0, 0, 0, 0)), false);
+  return TextFrame(runs, result.value_or(Rect::MakeLTRB(0, 0, 0, 0)), false);
 }
 
 }  // namespace impeller
diff --git a/impeller/typographer/backends/stb/text_frame_stb.h b/impeller/typographer/backends/stb/text_frame_stb.h
index 39f8ccc..622cb1f 100644
--- a/impeller/typographer/backends/stb/text_frame_stb.h
+++ b/impeller/typographer/backends/stb/text_frame_stb.h
@@ -10,9 +10,8 @@
 
 namespace impeller {
 
-std::shared_ptr<TextFrame> MakeTextFrameSTB(
-    const std::shared_ptr<TypefaceSTB>& typeface_stb,
-    Font::Metrics metrics,
-    const std::string& text);
+TextFrame MakeTextFrameSTB(const std::shared_ptr<TypefaceSTB>& typeface_stb,
+                           Font::Metrics metrics,
+                           const std::string& text);
 
 }  // namespace impeller
diff --git a/impeller/typographer/typographer_context.h b/impeller/typographer/typographer_context.h
index 3714dd8..1ca4d4a 100644
--- a/impeller/typographer/typographer_context.h
+++ b/impeller/typographer/typographer_context.h
@@ -4,6 +4,7 @@
 
 #pragma once
 
+#include <functional>
 #include <memory>
 
 #include "flutter/fml/macros.h"
diff --git a/impeller/typographer/typographer_unittests.cc b/impeller/typographer/typographer_unittests.cc
index eb3581d..a996bdf 100644
--- a/impeller/typographer/typographer_unittests.cc
+++ b/impeller/typographer/typographer_unittests.cc
@@ -40,9 +40,9 @@
   auto blob = SkTextBlob::MakeFromString(
       "the quick brown fox jumped over the lazy dog.", font);
   ASSERT_TRUE(blob);
-  auto frame = MakeTextFrameFromTextBlobSkia(blob);
-  ASSERT_EQ(frame->GetRunCount(), 1u);
-  for (const auto& run : frame->GetRuns()) {
+  auto frame = MakeTextFrameFromTextBlobSkia(blob).value();
+  ASSERT_EQ(frame.GetRunCount(), 1u);
+  for (const auto& run : frame.GetRuns()) {
     ASSERT_TRUE(run.IsValid());
     ASSERT_EQ(run.GetGlyphCount(), 45u);
   }
@@ -62,7 +62,7 @@
   ASSERT_TRUE(blob);
   auto atlas = CreateGlyphAtlas(
       *GetContext(), context.get(), GlyphAtlas::Type::kAlphaBitmap, 1.0f,
-      atlas_context, *MakeTextFrameFromTextBlobSkia(blob));
+      atlas_context, MakeTextFrameFromTextBlobSkia(blob).value());
   ASSERT_NE(atlas, nullptr);
   ASSERT_NE(atlas->GetTexture(), nullptr);
   ASSERT_EQ(atlas->GetType(), GlyphAtlas::Type::kAlphaBitmap);
@@ -113,20 +113,21 @@
 
   auto blob = SkTextBlob::MakeFromString("hello", sk_font);
   ASSERT_TRUE(blob);
-  auto frame = MakeTextFrameFromTextBlobSkia(blob);
+  auto frame = MakeTextFrameFromTextBlobSkia(blob).value();
 
-  ASSERT_FALSE(frame->GetAtlasType() == GlyphAtlas::Type::kColorBitmap);
+  ASSERT_FALSE(frame.GetAtlasType() == GlyphAtlas::Type::kColorBitmap);
 
   LazyGlyphAtlas lazy_atlas(TypographerContextSkia::Make());
 
-  lazy_atlas.AddTextFrame(*frame, 1.0f);
+  lazy_atlas.AddTextFrame(frame, 1.0f);
 
   frame = MakeTextFrameFromTextBlobSkia(
-      SkTextBlob::MakeFromString("😀 ", emoji_font));
+              SkTextBlob::MakeFromString("😀 ", emoji_font))
+              .value();
 
-  ASSERT_TRUE(frame->GetAtlasType() == GlyphAtlas::Type::kColorBitmap);
+  ASSERT_TRUE(frame.GetAtlasType() == GlyphAtlas::Type::kColorBitmap);
 
-  lazy_atlas.AddTextFrame(*frame, 1.0f);
+  lazy_atlas.AddTextFrame(frame, 1.0f);
 
   // Creates different atlases for color and alpha bitmap.
   auto color_atlas = lazy_atlas.CreateOrGetGlyphAtlas(
@@ -147,7 +148,7 @@
   ASSERT_TRUE(blob);
   auto atlas = CreateGlyphAtlas(
       *GetContext(), context.get(), GlyphAtlas::Type::kAlphaBitmap, 1.0f,
-      atlas_context, *MakeTextFrameFromTextBlobSkia(blob));
+      atlas_context, MakeTextFrameFromTextBlobSkia(blob).value());
   ASSERT_NE(atlas, nullptr);
   ASSERT_NE(atlas->GetTexture(), nullptr);
 
@@ -164,7 +165,7 @@
   ASSERT_TRUE(blob);
   auto atlas = CreateGlyphAtlas(
       *GetContext(), context.get(), GlyphAtlas::Type::kAlphaBitmap, 1.0f,
-      atlas_context, *MakeTextFrameFromTextBlobSkia(blob));
+      atlas_context, MakeTextFrameFromTextBlobSkia(blob).value());
   ASSERT_NE(atlas, nullptr);
   ASSERT_NE(atlas->GetTexture(), nullptr);
   ASSERT_EQ(atlas, atlas_context->GetGlyphAtlas());
@@ -173,7 +174,7 @@
 
   auto next_atlas = CreateGlyphAtlas(
       *GetContext(), context.get(), GlyphAtlas::Type::kAlphaBitmap, 1.0f,
-      atlas_context, *MakeTextFrameFromTextBlobSkia(blob));
+      atlas_context, MakeTextFrameFromTextBlobSkia(blob).value());
   ASSERT_EQ(atlas, next_atlas);
   ASSERT_EQ(atlas_context->GetGlyphAtlas(), atlas);
 }
@@ -196,7 +197,7 @@
   FontGlyphMap font_glyph_map;
   size_t size_count = 8;
   for (size_t index = 0; index < size_count; index += 1) {
-    MakeTextFrameFromTextBlobSkia(blob)->CollectUniqueFontGlyphPairs(
+    MakeTextFrameFromTextBlobSkia(blob).value().CollectUniqueFontGlyphPairs(
         font_glyph_map, 0.6 * index);
   };
   auto atlas =
@@ -231,7 +232,7 @@
   ASSERT_TRUE(blob);
   auto atlas = CreateGlyphAtlas(
       *GetContext(), context.get(), GlyphAtlas::Type::kAlphaBitmap, 1.0f,
-      atlas_context, *MakeTextFrameFromTextBlobSkia(blob));
+      atlas_context, MakeTextFrameFromTextBlobSkia(blob).value());
   auto old_packer = atlas_context->GetRectPacker();
 
   ASSERT_NE(atlas, nullptr);
@@ -245,7 +246,7 @@
   auto blob2 = SkTextBlob::MakeFromString("spooky 2", sk_font);
   auto next_atlas = CreateGlyphAtlas(
       *GetContext(), context.get(), GlyphAtlas::Type::kAlphaBitmap, 1.0f,
-      atlas_context, *MakeTextFrameFromTextBlobSkia(blob2));
+      atlas_context, MakeTextFrameFromTextBlobSkia(blob2).value());
   ASSERT_EQ(atlas, next_atlas);
   auto* second_texture = next_atlas->GetTexture().get();
 
@@ -264,7 +265,7 @@
   ASSERT_TRUE(blob);
   auto atlas = CreateGlyphAtlas(
       *GetContext(), context.get(), GlyphAtlas::Type::kAlphaBitmap, 1.0f,
-      atlas_context, *MakeTextFrameFromTextBlobSkia(blob));
+      atlas_context, MakeTextFrameFromTextBlobSkia(blob).value());
   auto old_packer = atlas_context->GetRectPacker();
 
   ASSERT_NE(atlas, nullptr);
@@ -279,7 +280,7 @@
   auto blob2 = SkTextBlob::MakeFromString("spooky 1", sk_font);
   auto next_atlas = CreateGlyphAtlas(
       *GetContext(), context.get(), GlyphAtlas::Type::kColorBitmap, 1.0f,
-      atlas_context, *MakeTextFrameFromTextBlobSkia(blob2));
+      atlas_context, MakeTextFrameFromTextBlobSkia(blob2).value());
   ASSERT_NE(atlas, next_atlas);
   auto* second_texture = next_atlas->GetTexture().get();
 
@@ -296,13 +297,15 @@
   SkFont sk_font(typeface, 0.5f);
 
   auto frame =
-      MakeTextFrameFromTextBlobSkia(SkTextBlob::MakeFromString("1", sk_font));
+      MakeTextFrameFromTextBlobSkia(SkTextBlob::MakeFromString("1", sk_font))
+          .value();
   // Single character has no overlapping
-  ASSERT_FALSE(frame->MaybeHasOverlapping());
+  ASSERT_FALSE(frame.MaybeHasOverlapping());
 
   auto frame_2 = MakeTextFrameFromTextBlobSkia(
-      SkTextBlob::MakeFromString("123456789", sk_font));
-  ASSERT_FALSE(frame_2->MaybeHasOverlapping());
+                     SkTextBlob::MakeFromString("123456789", sk_font))
+                     .value();
+  ASSERT_FALSE(frame_2.MaybeHasOverlapping());
 }
 
 TEST_P(TypographerTest, RectanglePackerAddsNonoverlapingRectangles) {
diff --git a/shell/common/dl_op_spy.cc b/shell/common/dl_op_spy.cc
index bcf213b..15910fc 100644
--- a/shell/common/dl_op_spy.cc
+++ b/shell/common/dl_op_spy.cc
@@ -127,14 +127,6 @@
                            SkScalar y) {
   did_draw_ |= will_draw_;
 }
-
-void DlOpSpy::drawTextFrame(
-    const std::shared_ptr<impeller::TextFrame>& text_frame,
-    SkScalar x,
-    SkScalar y) {
-  did_draw_ |= will_draw_;
-}
-
 void DlOpSpy::drawShadow(const SkPath& path,
                          const DlColor color,
                          const SkScalar elevation,
diff --git a/shell/common/dl_op_spy.h b/shell/common/dl_op_spy.h
index 1bcf08c..1cb29ff 100644
--- a/shell/common/dl_op_spy.h
+++ b/shell/common/dl_op_spy.h
@@ -90,9 +90,6 @@
   void drawTextBlob(const sk_sp<SkTextBlob> blob,
                     SkScalar x,
                     SkScalar y) override;
-  void drawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                     SkScalar x,
-                     SkScalar y) override;
   void drawShadow(const SkPath& path,
                   const DlColor color,
                   const SkScalar elevation,
diff --git a/testing/display_list_testing.cc b/testing/display_list_testing.cc
index 3ddeeac..f54a90c 100644
--- a/testing/display_list_testing.cc
+++ b/testing/display_list_testing.cc
@@ -859,15 +859,6 @@
            << blob.get() << ", "
            << x << ", " << y << ");" << std::endl;
 }
-
-void DisplayListStreamDispatcher::drawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                     SkScalar x,
-                     SkScalar y) {
-    startl() << "drawTextFrame("
-      << text_frame.get() << ", "
-      << x << ", " << y << ");" << std::endl;
-}
-
 void DisplayListStreamDispatcher::drawShadow(const SkPath& path,
                                              const DlColor color,
                                              const SkScalar elevation,
diff --git a/testing/display_list_testing.h b/testing/display_list_testing.h
index a468ded..4f3830a 100644
--- a/testing/display_list_testing.h
+++ b/testing/display_list_testing.h
@@ -144,9 +144,6 @@
   void drawTextBlob(const sk_sp<SkTextBlob> blob,
                     SkScalar x,
                     SkScalar y) override;
-  void drawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                     SkScalar x,
-                     SkScalar y) override;
   void drawShadow(const SkPath& path,
                   const DlColor color,
                   const SkScalar elevation,
diff --git a/testing/mock_canvas.cc b/testing/mock_canvas.cc
index 8d5a51f..75b0310 100644
--- a/testing/mock_canvas.cc
+++ b/testing/mock_canvas.cc
@@ -160,14 +160,6 @@
                                    paint, SkPoint::Make(x, y)}});
 }
 
-void MockCanvas::DrawTextFrame(
-    const std::shared_ptr<impeller::TextFrame>& text_frame,
-    SkScalar x,
-    SkScalar y,
-    const DlPaint& paint) {
-  FML_DCHECK(false);
-}
-
 void MockCanvas::DrawRect(const SkRect& rect, const DlPaint& paint) {
   draw_calls_.emplace_back(DrawCall{current_layer_, DrawRectData{rect, paint}});
 }
diff --git a/testing/mock_canvas.h b/testing/mock_canvas.h
index 591f1c9..71260d5 100644
--- a/testing/mock_canvas.h
+++ b/testing/mock_canvas.h
@@ -273,10 +273,6 @@
                     SkScalar x,
                     SkScalar y,
                     const DlPaint& paint) override;
-  void DrawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                     SkScalar x,
-                     SkScalar y,
-                     const DlPaint& paint) override;
   void DrawShadow(const SkPath& path,
                   const DlColor color,
                   const SkScalar elevation,
diff --git a/third_party/txt/BUILD.gn b/third_party/txt/BUILD.gn
index a61438b..b799bc5 100644
--- a/third_party/txt/BUILD.gn
+++ b/third_party/txt/BUILD.gn
@@ -81,7 +81,6 @@
   public_deps = [
     "//flutter/display_list",
     "//flutter/fml",
-    "//flutter/impeller/typographer/backends/skia:typographer_skia_backend",
     "//third_party/harfbuzz",
     "//third_party/icu",
     "//third_party/skia",
diff --git a/third_party/txt/src/skia/paragraph_skia.cc b/third_party/txt/src/skia/paragraph_skia.cc
index a688720..76d7372 100644
--- a/third_party/txt/src/skia/paragraph_skia.cc
+++ b/third_party/txt/src/skia/paragraph_skia.cc
@@ -18,10 +18,7 @@
 
 #include <algorithm>
 #include <numeric>
-#include "display_list/dl_paint.h"
 #include "fml/logging.h"
-#include "impeller/typographer/backends/skia/text_frame_skia.h"
-#include "include/core/SkMatrix.h"
 
 namespace txt {
 
@@ -68,10 +65,10 @@
   ///             decision (i.e. with `#ifdef`) instead of a runtime option.
   DisplayListParagraphPainter(DisplayListBuilder* builder,
                               const std::vector<DlPaint>& dl_paints,
-                              bool impeller_enabled)
+                              bool draw_path_effect)
       : builder_(builder),
         dl_paints_(dl_paints),
-        impeller_enabled_(impeller_enabled) {}
+        draw_path_effect_(draw_path_effect) {}
 
   void drawTextBlob(const sk_sp<SkTextBlob>& blob,
                     SkScalar x,
@@ -82,22 +79,6 @@
     }
     size_t paint_id = std::get<PaintID>(paint);
     FML_DCHECK(paint_id < dl_paints_.size());
-
-#ifdef IMPELLER_SUPPORTS_RENDERING
-    if (impeller_enabled_) {
-      if (ShouldRenderAsPath(dl_paints_[paint_id])) {
-        auto path = skia::textlayout::Paragraph::GetPath(blob.get());
-        auto transformed = path.makeTransform(SkMatrix::Translate(
-            x + blob->bounds().left(), y + blob->bounds().top()));
-        builder_->DrawPath(transformed, dl_paints_[paint_id]);
-        return;
-      }
-
-      builder_->DrawTextFrame(impeller::MakeTextFrameFromTextBlobSkia(blob), x,
-                              y, dl_paints_[paint_id]);
-      return;
-    }
-#endif  // IMPELLER_SUPPORTS_RENDERING
     builder_->DrawTextBlob(blob, x, y, dl_paints_[paint_id]);
   }
 
@@ -115,11 +96,6 @@
       DlBlurMaskFilter filter(DlBlurStyle::kNormal, blur_sigma, false);
       paint.setMaskFilter(&filter);
     }
-    if (impeller_enabled_) {
-      builder_->DrawTextFrame(impeller::MakeTextFrameFromTextBlobSkia(blob), x,
-                              y, paint);
-      return;
-    }
     builder_->DrawTextBlob(blob, x, y, paint);
   }
 
@@ -153,13 +129,11 @@
     // the line directly using the `drawLine` API instead of using a path effect
     // (because Impeller does not support path effects).
     auto dash_path_effect = decor_style.getDashPathEffect();
-#ifdef IMPELLER_SUPPORTS_RENDERING
-    if (impeller_enabled_ && dash_path_effect) {
+    if (draw_path_effect_ && dash_path_effect) {
       auto path = dashedLine(x0, x1, y0, *dash_path_effect);
       builder_->DrawPath(path, toDlPaint(decor_style));
       return;
     }
-#endif  // IMPELLER_SUPPORTS_RENDERING
 
     auto paint = toDlPaint(decor_style);
     if (dash_path_effect) {
@@ -206,16 +180,6 @@
     return path;
   }
 
-  bool ShouldRenderAsPath(const DlPaint& paint) const {
-    FML_DCHECK(impeller_enabled_);
-    // Text with non-trivial color sources or stroke paint mode should be
-    // rendered as a path when running on Impeller for correctness. These
-    // filters rely on having the glyph coverage, whereas regular text is
-    // drawn as rectangular texture samples.
-    return ((paint.getColorSource() && !paint.getColorSource()->asColor()) ||
-            paint.getDrawStyle() == DlDrawStyle::kStroke);
-  }
-
   DlPaint toDlPaint(const DecorationStyle& decor_style,
                     DlDrawStyle draw_style = DlDrawStyle::kStroke) {
     DlPaint paint;
@@ -228,7 +192,7 @@
 
   void setPathEffect(DlPaint& paint, const DashPathEffect& dash_path_effect) {
     // Impeller does not support path effects, so we should never be setting.
-    FML_DCHECK(!impeller_enabled_);
+    FML_DCHECK(!draw_path_effect_);
 
     std::array<SkScalar, 2> intervals{dash_path_effect.fOnLength,
                                       dash_path_effect.fOffLength};
@@ -238,7 +202,7 @@
 
   DisplayListBuilder* builder_;
   const std::vector<DlPaint>& dl_paints_;
-  const bool impeller_enabled_;
+  bool draw_path_effect_;
 };
 
 }  // anonymous namespace
diff --git a/third_party/txt/tests/paragraph_unittests.cc b/third_party/txt/tests/paragraph_unittests.cc
index 7eaf771..ec06ce7 100644
--- a/third_party/txt/tests/paragraph_unittests.cc
+++ b/third_party/txt/tests/paragraph_unittests.cc
@@ -3,13 +3,8 @@
 // found in the LICENSE file.
 
 #include <memory>
-#include "display_list/dl_color.h"
-#include "display_list/dl_paint.h"
-#include "display_list/dl_tile_mode.h"
-#include "display_list/effects/dl_color_source.h"
 #include "display_list/utils/dl_receiver_utils.h"
 #include "gtest/gtest.h"
-#include "include/core/SkScalar.h"
 #include "runtime/test_font_data.h"
 #include "skia/paragraph_builder_skia.h"
 #include "testing/canvas_test.h"
@@ -28,8 +23,6 @@
   int lineCount() const { return lines_.size(); }
   int rectCount() const { return rects_.size(); }
   int pathCount() const { return paths_.size(); }
-  int textFrameCount() const { return text_frames_.size(); }
-  int blobCount() const { return blobs_.size(); }
   bool hasPathEffect() const { return path_effect_ != nullptr; }
 
  private:
@@ -37,18 +30,6 @@
     lines_.emplace_back(p0, p1);
   }
 
-  void drawTextFrame(const std::shared_ptr<impeller::TextFrame>& text_frame,
-                     SkScalar x,
-                     SkScalar y) override {
-    text_frames_.push_back(text_frame);
-  }
-
-  void drawTextBlob(const sk_sp<SkTextBlob> blob,
-                    SkScalar x,
-                    SkScalar y) override {
-    blobs_.push_back(blob);
-  }
-
   void drawRect(const SkRect& rect) override { rects_.push_back(rect); }
 
   void drawPath(const SkPath& path) override { paths_.push_back(path); }
@@ -57,8 +38,6 @@
     path_effect_ = effect;
   }
 
-  std::vector<std::shared_ptr<impeller::TextFrame>> text_frames_;
-  std::vector<sk_sp<SkTextBlob>> blobs_;
   std::vector<std::pair<SkPoint, SkPoint>> lines_;
   std::vector<SkRect> rects_;
   std::vector<SkPath> paths_;
@@ -73,30 +52,10 @@
   void PretendImpellerIsEnabled(bool impeller) { impeller_ = impeller; }
 
  protected:
-  txt::TextStyle makeDecoratedStyle(txt::TextDecorationStyle style) {
-    auto t_style = txt::TextStyle();
-    t_style.color = SK_ColorBLACK;                // default
-    t_style.font_weight = txt::FontWeight::w400;  // normal
-    t_style.font_size = 14;                       // default
-    t_style.decoration = txt::TextDecoration::kUnderline;
-    t_style.decoration_style = style;
-    t_style.decoration_color = SK_ColorBLACK;
-    t_style.font_families.push_back("ahem");
-    return t_style;
-  }
-
-  txt::TextStyle makeStyle() {
-    auto t_style = txt::TextStyle();
-    t_style.color = SK_ColorBLACK;                // default
-    t_style.font_weight = txt::FontWeight::w400;  // normal
-    t_style.font_size = 14;                       // default
-    t_style.font_families.push_back("ahem");
-    return t_style;
-  }
-
-  sk_sp<DisplayList> draw(txt::TextStyle style) const {
+  sk_sp<DisplayList> draw(txt::TextDecorationStyle style) const {
+    auto t_style = makeDecoratedStyle(style);
     auto pb_skia = makeParagraphBuilder();
-    pb_skia.PushStyle(style);
+    pb_skia.PushStyle(t_style);
     pb_skia.AddText(u"Hello World!");
     pb_skia.Pop();
 
@@ -126,6 +85,18 @@
     return txt::ParagraphBuilderSkia(p_style, f_collection, impeller_);
   }
 
+  txt::TextStyle makeDecoratedStyle(txt::TextDecorationStyle style) const {
+    auto t_style = txt::TextStyle();
+    t_style.color = SK_ColorBLACK;                // default
+    t_style.font_weight = txt::FontWeight::w400;  // normal
+    t_style.font_size = 14;                       // default
+    t_style.decoration = txt::TextDecoration::kUnderline;
+    t_style.decoration_style = style;
+    t_style.decoration_color = SK_ColorBLACK;
+    t_style.font_families.push_back("ahem");
+    return t_style;
+  }
+
   bool impeller_ = false;
 };
 
@@ -135,8 +106,19 @@
   PretendImpellerIsEnabled(false);
 
   auto recorder = DlOpRecorder();
-  draw(makeDecoratedStyle(txt::TextDecorationStyle::kSolid))
-      ->Dispatch(recorder);
+  draw(txt::TextDecorationStyle::kSolid)->Dispatch(recorder);
+
+  // Skia may draw a solid underline as a filled rectangle:
+  // https://skia.googlesource.com/skia/+/refs/heads/main/modules/skparagraph/src/Decorations.cpp#91
+  EXPECT_EQ(recorder.rectCount(), 1);
+  EXPECT_FALSE(recorder.hasPathEffect());
+}
+
+TEST_F(PainterTest, DrawsSolidLineImpeller) {
+  PretendImpellerIsEnabled(true);
+
+  auto recorder = DlOpRecorder();
+  draw(txt::TextDecorationStyle::kSolid)->Dispatch(recorder);
 
   // Skia may draw a solid underline as a filled rectangle:
   // https://skia.googlesource.com/skia/+/refs/heads/main/modules/skparagraph/src/Decorations.cpp#91
@@ -148,98 +130,23 @@
   PretendImpellerIsEnabled(false);
 
   auto recorder = DlOpRecorder();
-  draw(makeDecoratedStyle(txt::TextDecorationStyle::kDashed))
-      ->Dispatch(recorder);
+  draw(txt::TextDecorationStyle::kDashed)->Dispatch(recorder);
 
   // Skia draws a dashed underline as a filled rectangle with a path effect.
   EXPECT_EQ(recorder.lineCount(), 1);
   EXPECT_TRUE(recorder.hasPathEffect());
 }
 
-#ifdef IMPELLER_SUPPORTS_RENDERING
-TEST_F(PainterTest, DrawsSolidLineImpeller) {
-  PretendImpellerIsEnabled(true);
-
-  auto recorder = DlOpRecorder();
-  draw(makeDecoratedStyle(txt::TextDecorationStyle::kSolid))
-      ->Dispatch(recorder);
-
-  // Skia may draw a solid underline as a filled rectangle:
-  // https://skia.googlesource.com/skia/+/refs/heads/main/modules/skparagraph/src/Decorations.cpp#91
-  EXPECT_EQ(recorder.rectCount(), 1);
-  EXPECT_FALSE(recorder.hasPathEffect());
-}
-
 TEST_F(PainterTest, DrawDashedLineImpeller) {
   PretendImpellerIsEnabled(true);
 
   auto recorder = DlOpRecorder();
-  draw(makeDecoratedStyle(txt::TextDecorationStyle::kDashed))
-      ->Dispatch(recorder);
+  draw(txt::TextDecorationStyle::kDashed)->Dispatch(recorder);
 
   // Impeller draws a dashed underline as a path.
   EXPECT_EQ(recorder.pathCount(), 1);
   EXPECT_FALSE(recorder.hasPathEffect());
 }
 
-TEST_F(PainterTest, DrawTextFrameImpeller) {
-  PretendImpellerIsEnabled(true);
-
-  auto recorder = DlOpRecorder();
-  draw(makeStyle())->Dispatch(recorder);
-
-  EXPECT_EQ(recorder.textFrameCount(), 1);
-  EXPECT_EQ(recorder.blobCount(), 0);
-}
-
-TEST_F(PainterTest, DrawStrokedTextImpeller) {
-  PretendImpellerIsEnabled(true);
-
-  auto style = makeStyle();
-  // What is your shtyle?
-  DlPaint foreground;
-  foreground.setDrawStyle(DlDrawStyle::kStroke);
-  style.foreground = foreground;
-
-  auto recorder = DlOpRecorder();
-  draw(style)->Dispatch(recorder);
-
-  EXPECT_EQ(recorder.textFrameCount(), 0);
-  EXPECT_EQ(recorder.blobCount(), 0);
-  EXPECT_EQ(recorder.pathCount(), 1);
-}
-
-TEST_F(PainterTest, DrawTextWithGradientImpeller) {
-  PretendImpellerIsEnabled(true);
-
-  auto style = makeStyle();
-  // how do you like my shtyle?
-  DlPaint foreground;
-  std::vector<DlColor> colors = {DlColor::kRed(), DlColor::kCyan()};
-  std::vector<float> stops = {0.0, 1.0};
-  foreground.setColorSource(DlColorSource::MakeLinear(
-      SkPoint::Make(0, 0), SkPoint::Make(100, 100), 2, colors.data(),
-      stops.data(), DlTileMode::kClamp));
-  style.foreground = foreground;
-
-  auto recorder = DlOpRecorder();
-  draw(style)->Dispatch(recorder);
-
-  EXPECT_EQ(recorder.textFrameCount(), 0);
-  EXPECT_EQ(recorder.blobCount(), 0);
-  EXPECT_EQ(recorder.pathCount(), 1);
-}
-
-TEST_F(PainterTest, DrawTextBlobNoImpeller) {
-  PretendImpellerIsEnabled(false);
-
-  auto recorder = DlOpRecorder();
-  draw(makeStyle())->Dispatch(recorder);
-
-  EXPECT_EQ(recorder.textFrameCount(), 0);
-  EXPECT_EQ(recorder.blobCount(), 1);
-}
-#endif  // IMPELLER_SUPPORTS_RENDERING
-
 }  // namespace testing
 }  // namespace flutter