// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "cc/paint/paint_recorder.h"

#include "cc/paint/display_item_list.h"
#include "ui/gfx/skia_util.h"

namespace cc {

PaintRecorder::PaintRecorder() {
  display_item_list_ = base::MakeRefCounted<DisplayItemList>(
      DisplayItemList::kToBeReleasedAsPaintOpBuffer);
}
PaintRecorder::~PaintRecorder() = default;

PaintCanvas* PaintRecorder::beginRecording(const SkRect& bounds) {
  display_item_list_->StartPaint();
  canvas_ = CreateCanvas(display_item_list_.get(), bounds);
  return getRecordingCanvas();
}

sk_sp<PaintRecord> PaintRecorder::finishRecordingAsPicture() {
  // SkPictureRecorder users expect that their saves are automatically
  // closed for them.
  //
  // NOTE: Blink paint in general doesn't appear to need this, but the
  // RecordingImageBufferSurface::fallBackToRasterCanvas finishing off the
  // current frame depends on this.  Maybe we could remove this assumption and
  // just have callers do it.
  canvas_->restoreToCount(1);

  // Some users (e.g. printing) use the existence of the recording canvas
  // to know if recording is finished, so reset it here.
  canvas_.reset();

  // The rect doesn't matter, since we just release the record.
  display_item_list_->EndPaintOfUnpaired(gfx::Rect());
  display_item_list_->Finalize();
  return display_item_list_->ReleaseAsRecord();
}

std::unique_ptr<RecordPaintCanvas> PaintRecorder::CreateCanvas(
    DisplayItemList* list,
    const SkRect& bounds) {
  return std::make_unique<RecordPaintCanvas>(list, bounds);
}

bool PaintRecorder::ListHasDrawOps() const {
  return display_item_list_->has_draw_ops();
}

size_t PaintRecorder::num_paint_ops() const {
  return display_item_list_->num_paint_ops();
}

}  // namespace cc
