///|
/// Diff two retained pipelines against this renderer's canvas dimensions.
pub fn Renderer::diff_pipelines(
  self : Renderer,
  previous : RenderPipeline,
  next : RenderPipeline,
) -> RenderPipelineDiffResult {
  let pixmap = self.get_canvas().get_pixmap()
  RenderPipeline::diff(previous, next, pixmap.get_width(), pixmap.get_height())
}

///|
/// Diff two retained display lists and estimate the dirty region to redraw.
pub fn RenderPipeline::diff(
  previous : RenderPipeline,
  next : RenderPipeline,
  width : Int,
  height : Int,
) -> RenderPipelineDiffResult {
  let dirty_region = @graphics.DirtyRegion::new()
  let canvas_bounds = @graphics.PixelRect::new(x=0, y=0, width~, height~)
  let previous_len = previous.commands.length()
  let next_len = next.commands.length()
  let common_len = previous_len.min(next_len)
  let mut retained_count = 0
  let mut changed_count = 0
  for index in 0.. previous_len {
      next_len - previous_len
    } else {
      0
    },
    removed_command_count: if previous_len > next_len {
      previous_len - next_len
    } else {
      0
    },
    dirty_region,
  }
}