// Copyright 2014 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/resources/drawing_display_item.h"

#include <string>

#include "base/logging.h"
#include "base/strings/stringprintf.h"
#include "base/trace_event/trace_event_argument.h"
#include "cc/debug/picture_debug_util.h"
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkDrawPictureCallback.h"
#include "third_party/skia/include/core/SkMatrix.h"
#include "third_party/skia/include/core/SkPicture.h"
#include "third_party/skia/include/utils/SkPictureUtils.h"

namespace cc {

DrawingDisplayItem::DrawingDisplayItem(skia::RefPtr<SkPicture> picture)
    : picture_(picture) {
}

DrawingDisplayItem::~DrawingDisplayItem() {
}

void DrawingDisplayItem::Raster(SkCanvas* canvas,
                                SkDrawPictureCallback* callback) const {
  canvas->save();
  if (callback)
    picture_->playback(canvas, callback);
  else
    canvas->drawPicture(picture_.get());
  canvas->restore();
}

void DrawingDisplayItem::RasterForTracing(SkCanvas* canvas) const {
  canvas->save();
  // The picture debugger in about:tracing doesn't drill down into |drawPicture|
  // operations. Calling |playback()| rather than |drawPicture()| causes the
  // skia operations in |picture_| to appear individually in the picture
  // produced for tracing rather than being hidden inside a drawPicture
  // operation.
  picture_->playback(canvas);
  canvas->restore();
}

bool DrawingDisplayItem::IsSuitableForGpuRasterization() const {
  return picture_->suitableForGpuRasterization(NULL);
}

int DrawingDisplayItem::ApproximateOpCount() const {
  return picture_->approximateOpCount();
}

size_t DrawingDisplayItem::PictureMemoryUsage() const {
  DCHECK(picture_);
  return SkPictureUtils::ApproximateBytesUsed(picture_.get());
}

void DrawingDisplayItem::AsValueInto(
    base::trace_event::TracedValue* array) const {
  array->BeginDictionary();
  array->SetString("name", "DrawingDisplayItem");
  array->SetString(
      "cullRect",
      base::StringPrintf("[%f,%f,%f,%f]", picture_->cullRect().x(),
                         picture_->cullRect().y(), picture_->cullRect().width(),
                         picture_->cullRect().height()));
  std::string b64_picture;
  PictureDebugUtil::SerializeAsBase64(picture_.get(), &b64_picture);
  array->SetString("skp64", b64_picture);
  array->EndDictionary();
}

}  // namespace cc
