[Impeller] Add GeometryResult enum with StC modes. (#50816)

Replace `prevent_overdraw` with an enum that also containing the two StC cases.
diff --git a/impeller/entity/contents/color_source_contents.h b/impeller/entity/contents/color_source_contents.h
index f3f7281..d89e522 100644
--- a/impeller/entity/contents/color_source_contents.h
+++ b/impeller/entity/contents/color_source_contents.h
@@ -123,7 +123,7 @@
     // increment the stencil buffer as we draw, preventing overlapping fragments
     // from drawing. Afterwards, we need to append another draw call to clean up
     // the stencil buffer (happens below in this method).
-    if (geometry_result.prevent_overdraw) {
+    if (geometry_result.mode == GeometryResult::Mode::kPreventOverdraw) {
       options.stencil_mode =
           ContentContextOptions::StencilMode::kLegacyClipIncrement;
     }
@@ -156,7 +156,7 @@
     // If we performed overdraw prevention, a subsection of the clip heightmap
     // was incremented by 1 in order to self-clip. So simply append a clip
     // restore to clean it up.
-    if (geometry_result.prevent_overdraw) {
+    if (geometry_result.mode == GeometryResult::Mode::kPreventOverdraw) {
       auto restore = ClipRestoreContents();
       restore.SetRestoreCoverage(GetCoverage(entity));
       return restore.Render(renderer, entity, pass);
diff --git a/impeller/entity/geometry/cover_geometry.cc b/impeller/entity/geometry/cover_geometry.cc
index 29518da..62c97c0 100644
--- a/impeller/entity/geometry/cover_geometry.cc
+++ b/impeller/entity/geometry/cover_geometry.cc
@@ -30,7 +30,6 @@
               .index_type = IndexType::k16bit,
           },
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
diff --git a/impeller/entity/geometry/fill_path_geometry.cc b/impeller/entity/geometry/fill_path_geometry.cc
index 8069ef9..5cd721a 100644
--- a/impeller/entity/geometry/fill_path_geometry.cc
+++ b/impeller/entity/geometry/fill_path_geometry.cc
@@ -32,7 +32,6 @@
         .type = PrimitiveType::kTriangleStrip,
         .vertex_buffer = vertex_buffer,
         .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-        .prevent_overdraw = false,
     };
   }
 
@@ -62,7 +61,6 @@
       .type = PrimitiveType::kTriangle,
       .vertex_buffer = vertex_buffer,
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
@@ -97,7 +95,6 @@
         .vertex_buffer =
             vertex_builder.CreateVertexBuffer(renderer.GetTransientsBuffer()),
         .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-        .prevent_overdraw = false,
     };
   }
 
@@ -130,7 +127,6 @@
       .vertex_buffer =
           vertex_builder.CreateVertexBuffer(renderer.GetTransientsBuffer()),
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
diff --git a/impeller/entity/geometry/geometry.cc b/impeller/entity/geometry/geometry.cc
index fe38adf..437dc45 100644
--- a/impeller/entity/geometry/geometry.cc
+++ b/impeller/entity/geometry/geometry.cc
@@ -51,7 +51,6 @@
               .index_type = IndexType::kNone,
           },
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
@@ -87,7 +86,6 @@
               .index_type = IndexType::kNone,
           },
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
@@ -159,7 +157,6 @@
               .index_type = IndexType::kNone,
           },
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
diff --git a/impeller/entity/geometry/geometry.h b/impeller/entity/geometry/geometry.h
index ef574fd..732e97d 100644
--- a/impeller/entity/geometry/geometry.h
+++ b/impeller/entity/geometry/geometry.h
@@ -18,10 +18,25 @@
 class Tessellator;
 
 struct GeometryResult {
-  PrimitiveType type;
+  enum class Mode {
+    /// The geometry has no overlapping triangles.
+    kNormal,
+    /// The geometry may have overlapping triangles. The geometry should be
+    /// stenciled with the NonZero fill rule.
+    kNonZero,
+    /// The geometry may have overlapping triangles. The geometry should be
+    /// stenciled with the EvenOdd fill rule.
+    kEvenOdd,
+    /// The geometry may have overlapping triangles, but they should not
+    /// overdraw or cancel each other out. This is a special case for stroke
+    /// geometry.
+    kPreventOverdraw,
+  };
+
+  PrimitiveType type = PrimitiveType::kTriangleStrip;
   VertexBuffer vertex_buffer;
   Matrix transform;
-  bool prevent_overdraw;
+  Mode mode = Mode::kNormal;
 };
 
 static const GeometryResult kEmptyResult = {
diff --git a/impeller/entity/geometry/geometry_unittests.cc b/impeller/entity/geometry/geometry_unittests.cc
index 6bc8c01..56354c1 100644
--- a/impeller/entity/geometry/geometry_unittests.cc
+++ b/impeller/entity/geometry/geometry_unittests.cc
@@ -208,5 +208,12 @@
   }
 }
 
+TEST(EntityGeometryTest, GeometryResultHasReasonableDefaults) {
+  GeometryResult result;
+  EXPECT_EQ(result.type, PrimitiveType::kTriangleStrip);
+  EXPECT_EQ(result.transform, Matrix());
+  EXPECT_EQ(result.mode, GeometryResult::Mode::kNormal);
+}
+
 }  // namespace testing
 }  // namespace impeller
diff --git a/impeller/entity/geometry/line_geometry.cc b/impeller/entity/geometry/line_geometry.cc
index 80b166b..e91d979 100644
--- a/impeller/entity/geometry/line_geometry.cc
+++ b/impeller/entity/geometry/line_geometry.cc
@@ -105,7 +105,6 @@
               .index_type = IndexType::kNone,
           },
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
@@ -158,7 +157,6 @@
               .index_type = IndexType::kNone,
           },
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
diff --git a/impeller/entity/geometry/point_field_geometry.cc b/impeller/entity/geometry/point_field_geometry.cc
index b1f142a..534ee53 100644
--- a/impeller/entity/geometry/point_field_geometry.cc
+++ b/impeller/entity/geometry/point_field_geometry.cc
@@ -30,7 +30,6 @@
       .type = PrimitiveType::kTriangleStrip,
       .vertex_buffer = vtx_builder->CreateVertexBuffer(host_buffer),
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
@@ -58,7 +57,6 @@
       .type = PrimitiveType::kTriangleStrip,
       .vertex_buffer = uv_vtx_builder.CreateVertexBuffer(host_buffer),
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
@@ -223,7 +221,6 @@
                         .vertex_count = total,
                         .index_type = IndexType::kNone},
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
diff --git a/impeller/entity/geometry/rect_geometry.cc b/impeller/entity/geometry/rect_geometry.cc
index 000e834..0790a97 100644
--- a/impeller/entity/geometry/rect_geometry.cc
+++ b/impeller/entity/geometry/rect_geometry.cc
@@ -22,7 +22,6 @@
               .index_type = IndexType::kNone,
           },
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
diff --git a/impeller/entity/geometry/stroke_path_geometry.cc b/impeller/entity/geometry/stroke_path_geometry.cc
index dc3ffae..c77045b 100644
--- a/impeller/entity/geometry/stroke_path_geometry.cc
+++ b/impeller/entity/geometry/stroke_path_geometry.cc
@@ -596,7 +596,7 @@
               .index_type = IndexType::kNone,
           },
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = true,
+      .mode = GeometryResult::Mode::kPreventOverdraw,
   };
 }
 
@@ -642,7 +642,7 @@
               .index_type = IndexType::kNone,
           },
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = true,
+      .mode = GeometryResult::Mode::kPreventOverdraw,
   };
 }
 
diff --git a/impeller/entity/geometry/vertices_geometry.cc b/impeller/entity/geometry/vertices_geometry.cc
index cfcc05b..7215603 100644
--- a/impeller/entity/geometry/vertices_geometry.cc
+++ b/impeller/entity/geometry/vertices_geometry.cc
@@ -139,7 +139,6 @@
                   index_count > 0 ? IndexType::k16bit : IndexType::kNone,
           },
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
@@ -184,7 +183,6 @@
                   index_count > 0 ? IndexType::k16bit : IndexType::kNone,
           },
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }
 
@@ -242,7 +240,6 @@
                   index_count > 0 ? IndexType::k16bit : IndexType::kNone,
           },
       .transform = pass.GetOrthographicTransform() * entity.GetTransform(),
-      .prevent_overdraw = false,
   };
 }