// Copyright 2013 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/scheduler/scheduler_settings.h"

#include "base/debug/trace_event_argument.h"
#include "cc/trees/layer_tree_settings.h"

namespace cc {

SchedulerSettings::SchedulerSettings()
    : use_external_begin_frame_source(false),
      forward_begin_frames_to_children(false),
      main_frame_before_activation_enabled(false),
      impl_side_painting(false),
      timeout_and_draw_when_animation_checkerboards(true),
      maximum_number_of_failed_draws_before_draw_is_forced_(3),
      using_synchronous_renderer_compositor(false),
      throttle_frame_production(true),
      disable_hi_res_timer_tasks_on_battery(false),
      background_frame_interval(base::TimeDelta::FromSeconds(1)) {
}

SchedulerSettings::SchedulerSettings(const LayerTreeSettings& settings)
    : use_external_begin_frame_source(settings.use_external_begin_frame_source),
      forward_begin_frames_to_children(
          settings.forward_begin_frames_to_children),
      main_frame_before_activation_enabled(
          settings.main_frame_before_activation_enabled),
      impl_side_painting(settings.impl_side_painting),
      timeout_and_draw_when_animation_checkerboards(
          settings.timeout_and_draw_when_animation_checkerboards),
      maximum_number_of_failed_draws_before_draw_is_forced_(
          settings.maximum_number_of_failed_draws_before_draw_is_forced_),
      using_synchronous_renderer_compositor(
          settings.using_synchronous_renderer_compositor),
      throttle_frame_production(settings.throttle_frame_production),
      disable_hi_res_timer_tasks_on_battery(
          settings.disable_hi_res_timer_tasks_on_battery),
      background_frame_interval(base::TimeDelta::FromSecondsD(
          1.0 / settings.background_animation_rate)) {
}

SchedulerSettings::~SchedulerSettings() {}

scoped_refptr<base::debug::ConvertableToTraceFormat>
SchedulerSettings::AsValue() const {
  scoped_refptr<base::debug::TracedValue> state =
      new base::debug::TracedValue();
  state->SetBoolean("use_external_begin_frame_source",
                    use_external_begin_frame_source);
  state->SetBoolean("forward_begin_frames_to_children",
                    forward_begin_frames_to_children);
  state->SetBoolean("main_frame_before_activation_enabled",
                    main_frame_before_activation_enabled);
  state->SetBoolean("impl_side_painting", impl_side_painting);
  state->SetBoolean("timeout_and_draw_when_animation_checkerboards",
                    timeout_and_draw_when_animation_checkerboards);
  state->SetInteger("maximum_number_of_failed_draws_before_draw_is_forced_",
                    maximum_number_of_failed_draws_before_draw_is_forced_);
  state->SetBoolean("using_synchronous_renderer_compositor",
                    using_synchronous_renderer_compositor);
  state->SetBoolean("throttle_frame_production", throttle_frame_production);
  state->SetBoolean("disable_hi_res_timer_tasks_on_battery",
                    disable_hi_res_timer_tasks_on_battery);
  state->SetInteger("background_frame_interval",
                    background_frame_interval.InMicroseconds());
  return state;
}

}  // namespace cc
