// Copyright 2012 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.

#ifndef CC_DEBUG_RENDERING_STATS_H_
#define CC_DEBUG_RENDERING_STATS_H_

#include <stdint.h>

#include <memory>
#include <vector>

#include "base/time/time.h"
#include "base/trace_event/trace_event_argument.h"
#include "base/values.h"
#include "cc/debug/debug_export.h"

namespace cc {

struct CC_DEBUG_EXPORT RenderingStats {
  // Stores a sequence of TimeDelta objects.
  class CC_DEBUG_EXPORT TimeDeltaList {
   public:
    TimeDeltaList();
    TimeDeltaList(const TimeDeltaList& other);
    ~TimeDeltaList();

    void Append(base::TimeDelta value);
    void AddToTracedValue(const char* name,
                          base::trace_event::TracedValue* list_value) const;

    void Add(const TimeDeltaList& other);

    base::TimeDelta GetLastTimeDelta() const;

   private:
    std::vector<base::TimeDelta> values;
  };

  RenderingStats();
  RenderingStats(const RenderingStats& other);
  ~RenderingStats();

  int64_t frame_count;
  int64_t visible_content_area;
  int64_t approximated_visible_content_area;
  int64_t checkerboarded_visible_content_area;
  int64_t checkerboarded_no_recording_content_area;
  int64_t checkerboarded_needs_raster_content_area;

  TimeDeltaList draw_duration;
  TimeDeltaList draw_duration_estimate;
  TimeDeltaList begin_main_frame_to_commit_duration;
  TimeDeltaList commit_to_activate_duration;
  TimeDeltaList commit_to_activate_duration_estimate;

  std::unique_ptr<base::trace_event::ConvertableToTraceFormat> AsTraceableData()
      const;
};

}  // namespace cc

#endif  // CC_DEBUG_RENDERING_STATS_H_
