///|
/// Replay all queued commands through resources, preserving checked replay errors.
pub fn RenderPipeline::replay_with_renderer_resources_result(
  self : RenderPipeline,
  renderer : Renderer,
  resources : RendererResources,
) -> Result[
  RenderPipelineResourceReplayResult,
  RenderPipelineResourceReplayError,
] {
  let canvas = renderer.get_canvas()
  let replay_state = RenderPipelineResourceReplayState::new()
  for command in self.commands {
    match command {
      Clear(color) => {
        canvas.clear(color)
        replay_state.clear_count += 1
      }
      FillRect(x, y, width, height, paint) => {
        canvas.fill_rect(x, y, width, height, paint)
        replay_state.fill_count += 1
      }
      StrokeRect(x, y, width, height, paint) => {
        canvas.stroke_rect(x, y, width, height, paint)
        replay_state.stroke_count += 1
      }
      FillPath(path, paint) => {
        canvas.fill_path(path, paint)
        replay_state.fill_count += 1
      }
      StrokePath(path, paint) => {
        canvas.stroke_path(path, paint)
        replay_state.stroke_count += 1
      }
      DrawPixmap(pixmap, x, y, paint) => {
        canvas.draw_pixmap(pixmap, x, y, paint)
        replay_state.image_count += 1
      }
      DrawPixmapKeyed(resource_key, pixmap, x, y, paint) => {
        let result = renderer.draw_pixmap_cached_with_renderer_resources(
          pixmap, x, y, resources, resource_key, paint,
        )
        replay_state.image_cache_counters.record_cached_image(
          result.did_hit_cache(),
        )
        replay_state.image_count += 1
      }
      DrawBmpBytesKeyed(resource_key, image_data, x, y, paint) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_bmp_bytes_cached_with_renderer_resources(
              image_data, x, y, resources, resource_key, paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawPngBytesKeyed(resource_key, image_data, x, y, paint) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_png_bytes_cached_with_renderer_resources(
              image_data, x, y, resources, resource_key, paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawRgbaBytesKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        x,
        y,
        paint
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_rgba_bytes_cached_with_renderer_resources(
              image_data, image_width, image_height, x, y, resources, resource_key,
              paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawSampledBmpBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_sampled_bmp_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawSampledPngBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_sampled_png_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawSampledRgbaBytesKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_sampled_rgba_bytes_cached_with_renderer_resources(
              image_data, image_width, image_height, x, y, width, height, resources,
              resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawQualityBmpBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_quality_bmp_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawQualityBmpBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_quality_bmp_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawQualityPngBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_quality_png_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawQualityPngBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_quality_png_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawQualityRgbaBytesKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_quality_rgba_bytes_cached_with_renderer_resources(
              image_data, image_width, image_height, x, y, width, height, resources,
              resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawQualityRgbaBytesRectKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_quality_rgba_bytes_rect_cached_with_renderer_resources(
              image_data, image_width, image_height, src_rect, x, y, width, height,
              resources, resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedSampledBmpBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_sampled_bmp_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedSampledBmpBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_sampled_bmp_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedQualityBmpBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_quality_bmp_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedQualityBmpBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_quality_bmp_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedSampledPngBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_sampled_png_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedSampledPngBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_sampled_png_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedQualityPngBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_quality_png_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedQualityPngBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_quality_png_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedSampledRgbaBytesKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_sampled_rgba_bytes_cached_with_renderer_resources(
              image_data, image_width, image_height, x, y, width, height, resources,
              resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedSampledRgbaBytesRectKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_sampled_rgba_bytes_rect_cached_with_renderer_resources(
              image_data, image_width, image_height, src_rect, x, y, width, height,
              resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedQualityRgbaBytesKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_quality_rgba_bytes_cached_with_renderer_resources(
              image_data, image_width, image_height, x, y, width, height, resources,
              resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedQualityRgbaBytesRectKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_quality_rgba_bytes_rect_cached_with_renderer_resources(
              image_data, image_width, image_height, src_rect, x, y, width, height,
              resources, resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawSampledBmpBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_sampled_bmp_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawSampledPngBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_sampled_png_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawSampledRgbaBytesRectKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_sampled_rgba_bytes_rect_cached_with_renderer_resources(
              image_data, image_width, image_height, src_rect, x, y, width, height,
              resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawBmpBytesRectKeyed(resource_key, image_data, src_rect, x, y, paint) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_bmp_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, resources, resource_key, paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawPngBytesRectKeyed(resource_key, image_data, src_rect, x, y, paint) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_png_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, resources, resource_key, paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawRgbaBytesRectKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        src_rect,
        x,
        y,
        paint
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_rgba_bytes_rect_cached_with_renderer_resources(
              image_data, image_width, image_height, src_rect, x, y, resources, resource_key,
              paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTiledBmpBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_tiled_bmp_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTiledPngBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_tiled_png_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTiledRgbaBytesRectKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        src_rect,
        x,
        y,
        width,
        height,
        paint
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_tiled_rgba_bytes_rect_cached_with_renderer_resources(
              image_data, image_width, image_height, src_rect, x, y, width, height,
              resources, resource_key, paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawNinePatchBmpBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        insets,
        paint,
        sampling
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_nine_patch_bmp_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, insets, resources, resource_key, paint,
              sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawNinePatchPngBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        insets,
        paint,
        sampling
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_nine_patch_png_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, insets, resources, resource_key, paint,
              sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawNinePatchRgbaBytesKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        x,
        y,
        width,
        height,
        insets,
        paint,
        sampling
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_nine_patch_rgba_bytes_cached_with_renderer_resources(
              image_data, image_width, image_height, x, y, width, height, insets,
              resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawPixmapRect(pixmap, src_rect, x, y, paint) => {
        canvas.draw_pixmap_rect(pixmap, src_rect, x, y, paint)
        replay_state.image_count += 1
      }
      DrawPixmapRectKeyed(resource_key, pixmap, src_rect, x, y, paint) => {
        let result = renderer.draw_pixmap_rect_cached_with_renderer_resources(
          pixmap, src_rect, x, y, resources, resource_key, paint,
        )
        replay_state.image_cache_counters.record_cached_image(
          result.did_hit_cache(),
        )
        replay_state.image_count += 1
      }
      DrawTextFace(face, text, x, y, config, paint) => {
        renderer.draw_text_face(face, text, x, y, config, paint)
        replay_state.text_count += 1
      }
      DrawTextFaceKeyed(resource_key, face, text, x, y, config, paint) => {
        let result = renderer.draw_text_face_cached_with_renderer_resources(
          face, text, x, y, config, resources, resource_key, paint,
        )
        replay_state.text_cache_counters.record_cached_text_mask(
          result.did_hit_cache(),
        )
        replay_state.text_count += 1
      }
      DrawFontBytesKeyed(
        font_key,
        font_data,
        text_key,
        text,
        x,
        y,
        config,
        paint
      ) => {
        match
          renderer.draw_font_bytes_cached_with_renderer_resources(
            font_data, text, x, y, config, resources, font_key, text_key, paint,
          ) {
          Ok(result) => {
            replay_state.font_cache_counters.record_font_lookup(
              result.did_hit_font_cache(),
            )
            replay_state.text_cache_counters.record_cached_text_mask(
              result.did_hit_text_cache(),
            )
          }
          Err(error) => return Err(FontParseFailed(font_key, error))
        }
        replay_state.text_count += 1
      }
      DrawFontBytesAtlasKeyed(
        font_key,
        font_data,
        glyph_key_prefix,
        text,
        x,
        y,
        config,
        paint
      ) => {
        match
          renderer.draw_font_bytes_atlas_with_renderer_resources(
            font_data, text, x, y, config, resources, font_key, glyph_key_prefix,
            paint,
          ) {
          Ok(result) => {
            replay_state.font_cache_counters.record_font_lookup(
              result.did_hit_font_cache(),
            )
            replay_state.atlas_cache_counters.record_atlas_text(
              result.get_cache_hit_count(),
              result.get_rasterized_glyph_count(),
              result.get_atlas_hit_count(),
              result.get_atlas_inserted_count(),
              result.did_clear_atlas(),
              1,
            )
          }
          Err(error) => return Err(FontParseFailed(font_key, error))
        }
        replay_state.text_count += 1
      }
      DrawFontBytesFallbackKeyed(
        sources,
        text_key_prefix,
        text,
        x,
        y,
        config,
        paint
      ) => {
        match
          renderer.draw_font_bytes_fallback_line_cached_with_renderer_resources(
            sources, text, x, y, config, resources, text_key_prefix, paint,
          ) {
          Ok(result) => {
            replay_state.font_cache_counters.record_font_lookups(
              sources.length(),
              result.get_font_cache_hit_count(),
              result.get_parsed_font_count(),
            )
            replay_state.text_cache_counters.record_cached_text_spans(
              result.get_text_cache_hit_count(),
              result.get_rendered_mask_count(),
              result.get_drawn_span_count(),
            )
          }
          Err(error) =>
            return Err(
              FontParseFailed(
                render_pipeline_first_font_source_key(sources),
                error,
              ),
            )
        }
        replay_state.text_count += 1
      }
      DrawFontBytesFallbackAtlasKeyed(
        sources,
        glyph_key_prefix,
        text,
        x,
        y,
        config,
        paint
      ) => {
        match
          renderer.draw_font_bytes_fallback_line_atlas_with_renderer_resources(
            sources, text, x, y, config, resources, glyph_key_prefix, paint,
          ) {
          Ok(result) => {
            replay_state.font_cache_counters.record_font_lookups(
              sources.length(),
              result.get_font_cache_hit_count(),
              result.get_parsed_font_count(),
            )
            replay_state.atlas_cache_counters.record_atlas_text(
              result.get_cache_hit_count(),
              result.get_rasterized_glyph_count(),
              result.get_atlas_hit_count(),
              result.get_atlas_inserted_count(),
              result.did_clear_atlas(),
              result.get_drawn_span_count(),
            )
          }
          Err(error) =>
            return Err(
              FontParseFailed(
                render_pipeline_first_font_source_key(sources),
                error,
              ),
            )
        }
        replay_state.text_count += 1
      }
      DrawLoadedFontKeyed(font_key, _, _, _, _, _, _) =>
        return Err(FontLoaderRequired(font_key))
      DrawLoadedFontFallbackKeyed(font_keys, _, _, _, _, _, _) =>
        return Err(
          FontLoaderRequired(render_pipeline_first_font_key(font_keys)),
        )
      DrawLoadedFontFallbackAtlasKeyed(font_keys, _, _, _, _, _, _) =>
        return Err(
          FontLoaderRequired(render_pipeline_first_font_key(font_keys)),
        )
      DrawLoadedFontAtlasKeyed(font_key, _, _, _, _, _, _) =>
        return Err(FontLoaderRequired(font_key))
    }
  }
  Ok(replay_state.to_result(self.commands.length()))
}

///|
fn render_pipeline_first_font_source_key(
  sources : Array[FontBytesFallbackSource],
) -> String {
  match sources.get(0) {
    Some(source) => source.get_font_key()
    None => ""
  }
}

///|
fn render_pipeline_font_load_error_to_resource_replay_error(
  error : @text.FontLoadError,
) -> RenderPipelineResourceReplayError {
  match error {
    MissingFontData(font_key) => FontDataMissing(font_key)
    FontFileReadFailed(font_key, path) => FontFileReadFailed(font_key, path)
    FontParseFailed(font_key, error) => FontParseFailed(font_key, error)
  }
}

///|
/// Replay all queued commands through resources and a font loader, preserving checked replay errors.
pub fn[L : @text.FontLoader] RenderPipeline::replay_with_font_loader_resources_result(
  self : RenderPipeline,
  renderer : Renderer,
  resources : RendererResources,
  loader : L,
) -> Result[
  RenderPipelineResourceReplayResult,
  RenderPipelineResourceReplayError,
] {
  let canvas = renderer.get_canvas()
  let replay_state = RenderPipelineResourceReplayState::new()
  for command in self.commands {
    match command {
      Clear(color) => {
        canvas.clear(color)
        replay_state.clear_count += 1
      }
      FillRect(x, y, width, height, paint) => {
        canvas.fill_rect(x, y, width, height, paint)
        replay_state.fill_count += 1
      }
      StrokeRect(x, y, width, height, paint) => {
        canvas.stroke_rect(x, y, width, height, paint)
        replay_state.stroke_count += 1
      }
      FillPath(path, paint) => {
        canvas.fill_path(path, paint)
        replay_state.fill_count += 1
      }
      StrokePath(path, paint) => {
        canvas.stroke_path(path, paint)
        replay_state.stroke_count += 1
      }
      DrawPixmap(pixmap, x, y, paint) => {
        canvas.draw_pixmap(pixmap, x, y, paint)
        replay_state.image_count += 1
      }
      DrawPixmapKeyed(resource_key, pixmap, x, y, paint) => {
        let result = renderer.draw_pixmap_cached_with_renderer_resources(
          pixmap, x, y, resources, resource_key, paint,
        )
        replay_state.image_cache_counters.record_cached_image(
          result.did_hit_cache(),
        )
        replay_state.image_count += 1
      }
      DrawBmpBytesKeyed(resource_key, image_data, x, y, paint) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_bmp_bytes_cached_with_renderer_resources(
              image_data, x, y, resources, resource_key, paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawPngBytesKeyed(resource_key, image_data, x, y, paint) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_png_bytes_cached_with_renderer_resources(
              image_data, x, y, resources, resource_key, paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawRgbaBytesKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        x,
        y,
        paint
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_rgba_bytes_cached_with_renderer_resources(
              image_data, image_width, image_height, x, y, resources, resource_key,
              paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawSampledBmpBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_sampled_bmp_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawSampledPngBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_sampled_png_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawSampledRgbaBytesKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_sampled_rgba_bytes_cached_with_renderer_resources(
              image_data, image_width, image_height, x, y, width, height, resources,
              resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawQualityBmpBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_quality_bmp_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawQualityBmpBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_quality_bmp_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawQualityPngBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_quality_png_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawQualityPngBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_quality_png_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawQualityRgbaBytesKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_quality_rgba_bytes_cached_with_renderer_resources(
              image_data, image_width, image_height, x, y, width, height, resources,
              resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawQualityRgbaBytesRectKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_quality_rgba_bytes_rect_cached_with_renderer_resources(
              image_data, image_width, image_height, src_rect, x, y, width, height,
              resources, resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawSampledBmpBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_sampled_bmp_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawSampledPngBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_sampled_png_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawSampledRgbaBytesRectKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_sampled_rgba_bytes_rect_cached_with_renderer_resources(
              image_data, image_width, image_height, src_rect, x, y, width, height,
              resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawBmpBytesRectKeyed(resource_key, image_data, src_rect, x, y, paint) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_bmp_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, resources, resource_key, paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawPngBytesRectKeyed(resource_key, image_data, src_rect, x, y, paint) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_png_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, resources, resource_key, paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawRgbaBytesRectKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        src_rect,
        x,
        y,
        paint
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_rgba_bytes_rect_cached_with_renderer_resources(
              image_data, image_width, image_height, src_rect, x, y, resources, resource_key,
              paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTiledBmpBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_tiled_bmp_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTiledPngBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_tiled_png_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTiledRgbaBytesRectKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        src_rect,
        x,
        y,
        width,
        height,
        paint
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_tiled_rgba_bytes_rect_cached_with_renderer_resources(
              image_data, image_width, image_height, src_rect, x, y, width, height,
              resources, resource_key, paint,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawNinePatchBmpBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        insets,
        paint,
        sampling
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_nine_patch_bmp_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, insets, resources, resource_key, paint,
              sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawNinePatchPngBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        insets,
        paint,
        sampling
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_nine_patch_png_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, insets, resources, resource_key, paint,
              sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawNinePatchRgbaBytesKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        x,
        y,
        width,
        height,
        insets,
        paint,
        sampling
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_nine_patch_rgba_bytes_cached_with_renderer_resources(
              image_data, image_width, image_height, x, y, width, height, insets,
              resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawPixmapRect(pixmap, src_rect, x, y, paint) => {
        canvas.draw_pixmap_rect(pixmap, src_rect, x, y, paint)
        replay_state.image_count += 1
      }
      DrawPixmapRectKeyed(resource_key, pixmap, src_rect, x, y, paint) => {
        let result = renderer.draw_pixmap_rect_cached_with_renderer_resources(
          pixmap, src_rect, x, y, resources, resource_key, paint,
        )
        replay_state.image_cache_counters.record_cached_image(
          result.did_hit_cache(),
        )
        replay_state.image_count += 1
      }
      DrawTextFace(face, text, x, y, config, paint) => {
        renderer.draw_text_face(face, text, x, y, config, paint)
        replay_state.text_count += 1
      }
      DrawTextFaceKeyed(resource_key, face, text, x, y, config, paint) => {
        let result = renderer.draw_text_face_cached_with_renderer_resources(
          face, text, x, y, config, resources, resource_key, paint,
        )
        replay_state.text_cache_counters.record_cached_text_mask(
          result.did_hit_cache(),
        )
        replay_state.text_count += 1
      }
      DrawFontBytesKeyed(
        font_key,
        font_data,
        text_key,
        text,
        x,
        y,
        config,
        paint
      ) => {
        match
          renderer.draw_font_bytes_cached_with_renderer_resources(
            font_data, text, x, y, config, resources, font_key, text_key, paint,
          ) {
          Ok(result) => {
            replay_state.font_cache_counters.record_font_lookup(
              result.did_hit_font_cache(),
            )
            replay_state.text_cache_counters.record_cached_text_mask(
              result.did_hit_text_cache(),
            )
          }
          Err(error) => return Err(FontParseFailed(font_key, error))
        }
        replay_state.text_count += 1
      }
      DrawFontBytesAtlasKeyed(
        font_key,
        font_data,
        glyph_key_prefix,
        text,
        x,
        y,
        config,
        paint
      ) => {
        match
          renderer.draw_font_bytes_atlas_with_renderer_resources(
            font_data, text, x, y, config, resources, font_key, glyph_key_prefix,
            paint,
          ) {
          Ok(result) => {
            replay_state.font_cache_counters.record_font_lookup(
              result.did_hit_font_cache(),
            )
            replay_state.atlas_cache_counters.record_atlas_text(
              result.get_cache_hit_count(),
              result.get_rasterized_glyph_count(),
              result.get_atlas_hit_count(),
              result.get_atlas_inserted_count(),
              result.did_clear_atlas(),
              1,
            )
          }
          Err(error) => return Err(FontParseFailed(font_key, error))
        }
        replay_state.text_count += 1
      }
      DrawFontBytesFallbackKeyed(
        sources,
        text_key_prefix,
        text,
        x,
        y,
        config,
        paint
      ) => {
        let faces : Array[@text.FontFace] = []
        let mut command_font_parse_count = 0
        let mut command_font_cache_hit_count = 0
        for source in sources {
          match
            resources
            .get_font_face_cache()
            .get_or_parse_result(source.get_font_key(), source.get_font_data()) {
            Ok(parse_result) => {
              faces.push(parse_result.get_face())
              if parse_result.did_parse() {
                command_font_parse_count += 1
              } else {
                command_font_cache_hit_count += 1
              }
            }
            Err(error) =>
              return Err(FontParseFailed(source.get_font_key(), error))
          }
        }
        let result = renderer.draw_text_fallback_line_cached_with_renderer_resources(
          faces, text, x, y, config, resources, text_key_prefix, paint,
        )
        replay_state.font_cache_counters.record_font_lookups(
          sources.length(),
          command_font_cache_hit_count,
          command_font_parse_count,
        )
        replay_state.text_cache_counters.record_cached_text_spans(
          result.get_cache_hit_count(),
          result.get_rendered_mask_count(),
          result.get_drawn_span_count(),
        )
        replay_state.text_count += 1
      }
      DrawFontBytesFallbackAtlasKeyed(
        sources,
        glyph_key_prefix,
        text,
        x,
        y,
        config,
        paint
      ) => {
        let faces : Array[@text.FontFace] = []
        let mut command_font_parse_count = 0
        let mut command_font_cache_hit_count = 0
        for source in sources {
          match
            resources
            .get_font_face_cache()
            .get_or_parse_result(source.get_font_key(), source.get_font_data()) {
            Ok(parse_result) => {
              faces.push(parse_result.get_face())
              if parse_result.did_parse() {
                command_font_parse_count += 1
              } else {
                command_font_cache_hit_count += 1
              }
            }
            Err(error) =>
              return Err(FontParseFailed(source.get_font_key(), error))
          }
        }
        let result = renderer.draw_text_fallback_line_atlas_with_renderer_resources(
          faces, text, x, y, config, resources, glyph_key_prefix, paint,
        )
        replay_state.font_cache_counters.record_font_lookups(
          sources.length(),
          command_font_cache_hit_count,
          command_font_parse_count,
        )
        replay_state.atlas_cache_counters.record_atlas_text(
          result.get_cache_hit_count(),
          result.get_rasterized_glyph_count(),
          result.get_atlas_hit_count(),
          result.get_atlas_inserted_count(),
          result.did_clear_atlas(),
          result.get_drawn_span_count(),
        )
        replay_state.text_count += 1
      }
      DrawTransformedSampledBmpBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_sampled_bmp_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedSampledBmpBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_sampled_bmp_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedQualityBmpBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_quality_bmp_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedQualityBmpBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_bmp_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_quality_bmp_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedSampledPngBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_sampled_png_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedSampledPngBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_sampled_png_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedSampledRgbaBytesKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_sampled_rgba_bytes_cached_with_renderer_resources(
              image_data, image_width, image_height, x, y, width, height, resources,
              resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedSampledRgbaBytesRectKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        sampling
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_sampled_rgba_bytes_rect_cached_with_renderer_resources(
              image_data, image_width, image_height, src_rect, x, y, width, height,
              resources, resource_key, paint, sampling,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedQualityRgbaBytesKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_quality_rgba_bytes_cached_with_renderer_resources(
              image_data, image_width, image_height, x, y, width, height, resources,
              resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedQualityRgbaBytesRectKeyed(
        resource_key,
        image_data,
        image_width,
        image_height,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_rgba_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_quality_rgba_bytes_rect_cached_with_renderer_resources(
              image_data, image_width, image_height, src_rect, x, y, width, height,
              resources, resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedQualityPngBytesKeyed(
        resource_key,
        image_data,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_quality_png_bytes_cached_with_renderer_resources(
              image_data, x, y, width, height, resources, resource_key, paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawTransformedQualityPngBytesRectKeyed(
        resource_key,
        image_data,
        src_rect,
        x,
        y,
        width,
        height,
        paint,
        quality
      ) =>
        match
          record_png_resource_image_replay_result(
            replay_state,
            resource_key,
            renderer.draw_transformed_quality_png_bytes_rect_cached_with_renderer_resources(
              image_data, src_rect, x, y, width, height, resources, resource_key,
              paint, quality,
            ),
          ) {
          Ok(count) => replay_state.image_count += count
          Err(error) => return Err(error)
        }
      DrawLoadedFontKeyed(font_key, text_key, text, x, y, config, paint) => {
        match
          renderer.draw_loaded_font_cached_with_renderer_resources(
            loader, text, x, y, config, resources, font_key, text_key, paint,
          ) {
          Ok(result) => {
            replay_state.font_cache_counters.record_font_lookup(
              result.did_hit_font_cache(),
            )
            replay_state.text_cache_counters.record_cached_text_mask(
              result.did_hit_text_cache(),
            )
          }
          Err(error) =>
            return Err(
              render_pipeline_font_load_error_to_resource_replay_error(error),
            )
        }
        replay_state.text_count += 1
      }
      DrawLoadedFontFallbackKeyed(
        font_keys,
        text_key_prefix,
        text,
        x,
        y,
        config,
        paint
      ) => {
        let faces : Array[@text.FontFace] = []
        let mut command_font_parse_count = 0
        let mut command_font_cache_hit_count = 0
        for font_key in font_keys {
          match
            resources.get_font_face_cache().get_or_load_result(font_key, loader) {
            Ok(load_result) => {
              faces.push(load_result.get_face())
              if load_result.did_parse() {
                command_font_parse_count += 1
              } else {
                command_font_cache_hit_count += 1
              }
            }
            Err(error) =>
              return Err(
                render_pipeline_font_load_error_to_resource_replay_error(error),
              )
          }
        }
        let result = renderer.draw_text_fallback_line_cached_with_renderer_resources(
          faces, text, x, y, config, resources, text_key_prefix, paint,
        )
        replay_state.font_cache_counters.record_font_lookups(
          font_keys.length(),
          command_font_cache_hit_count,
          command_font_parse_count,
        )
        replay_state.text_cache_counters.record_cached_text_spans(
          result.get_cache_hit_count(),
          result.get_rendered_mask_count(),
          result.get_drawn_span_count(),
        )
        replay_state.text_count += 1
      }
      DrawLoadedFontFallbackAtlasKeyed(
        font_keys,
        glyph_key_prefix,
        text,
        x,
        y,
        config,
        paint
      ) => {
        let faces : Array[@text.FontFace] = []
        let mut command_font_parse_count = 0
        let mut command_font_cache_hit_count = 0
        for font_key in font_keys {
          match
            resources.get_font_face_cache().get_or_load_result(font_key, loader) {
            Ok(load_result) => {
              faces.push(load_result.get_face())
              if load_result.did_parse() {
                command_font_parse_count += 1
              } else {
                command_font_cache_hit_count += 1
              }
            }
            Err(error) =>
              return Err(
                render_pipeline_font_load_error_to_resource_replay_error(error),
              )
          }
        }
        let result = renderer.draw_text_fallback_line_atlas_with_renderer_resources(
          faces, text, x, y, config, resources, glyph_key_prefix, paint,
        )
        replay_state.font_cache_counters.record_font_lookups(
          font_keys.length(),
          command_font_cache_hit_count,
          command_font_parse_count,
        )
        replay_state.atlas_cache_counters.record_atlas_text(
          result.get_cache_hit_count(),
          result.get_rasterized_glyph_count(),
          result.get_atlas_hit_count(),
          result.get_atlas_inserted_count(),
          result.did_clear_atlas(),
          result.get_drawn_span_count(),
        )
        replay_state.text_count += 1
      }
      DrawLoadedFontAtlasKeyed(
        font_key,
        glyph_key_prefix,
        text,
        x,
        y,
        config,
        paint
      ) => {
        match
          renderer.draw_loaded_font_atlas_with_renderer_resources(
            loader, text, x, y, config, resources, font_key, glyph_key_prefix, paint,
          ) {
          Ok(result) => {
            replay_state.font_cache_counters.record_font_lookup(
              result.did_hit_font_cache(),
            )
            replay_state.atlas_cache_counters.record_atlas_text(
              result.get_cache_hit_count(),
              result.get_rasterized_glyph_count(),
              result.get_atlas_hit_count(),
              result.get_atlas_inserted_count(),
              result.did_clear_atlas(),
              1,
            )
          }
          Err(error) =>
            return Err(
              render_pipeline_font_load_error_to_resource_replay_error(error),
            )
        }
        replay_state.text_count += 1
      }
    }
  }
  Ok(replay_state.to_result(self.commands.length()))
}