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

#include "cc/test/begin_frame_args_test.h"
#include "cc/test/fake_layer_tree_host_impl.h"
#include "cc/test/test_shared_bitmap_manager.h"
#include "cc/trees/layer_tree_impl.h"

namespace cc {

FakeLayerTreeHostImpl::FakeLayerTreeHostImpl(Proxy* proxy,
                                             SharedBitmapManager* manager,
                                             TaskGraphRunner* task_graph_runner)
    : LayerTreeHostImpl(LayerTreeSettings(),
                        &client_,
                        proxy,
                        &stats_instrumentation_,
                        manager,
                        NULL,
                        task_graph_runner,
                        0) {
  // Explicitly clear all debug settings.
  SetDebugState(LayerTreeDebugState());
  SetViewportSize(gfx::Size(100, 100));

  // Avoid using Now() as the frame time in unit tests.
  base::TimeTicks time_ticks = base::TimeTicks::FromInternalValue(1);
  SetCurrentBeginFrameArgs(
      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
}

FakeLayerTreeHostImpl::FakeLayerTreeHostImpl(const LayerTreeSettings& settings,
                                             Proxy* proxy,
                                             SharedBitmapManager* manager,
                                             TaskGraphRunner* task_graph_runner)
    : LayerTreeHostImpl(settings,
                        &client_,
                        proxy,
                        &stats_instrumentation_,
                        manager,
                        NULL,
                        task_graph_runner,
                        0) {
  // Explicitly clear all debug settings.
  SetDebugState(LayerTreeDebugState());

  // Avoid using Now() as the frame time in unit tests.
  base::TimeTicks time_ticks = base::TimeTicks::FromInternalValue(1);
  SetCurrentBeginFrameArgs(
      CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, time_ticks));
}

FakeLayerTreeHostImpl::~FakeLayerTreeHostImpl() {}

void FakeLayerTreeHostImpl::CreatePendingTree() {
  LayerTreeHostImpl::CreatePendingTree();
  float arbitrary_large_page_scale = 100000.f;
  pending_tree()->PushPageScaleFromMainThread(
      1.f, 1.f / arbitrary_large_page_scale, arbitrary_large_page_scale);
}

BeginFrameArgs FakeLayerTreeHostImpl::CurrentBeginFrameArgs() const {
  if (!current_begin_frame_args_.IsValid())
    return LayerTreeHostImpl::CurrentBeginFrameArgs();
  return current_begin_frame_args_;
}

void FakeLayerTreeHostImpl::SetCurrentBeginFrameArgs(
    const BeginFrameArgs& args) {
  current_begin_frame_args_ = args;
}

int FakeLayerTreeHostImpl::RecursiveUpdateNumChildren(LayerImpl* layer) {
  int num_children_that_draw_content = 0;
  for (size_t i = 0; i < layer->children().size(); ++i) {
    num_children_that_draw_content +=
        RecursiveUpdateNumChildren(layer->children()[i]);
  }
  if (layer->DrawsContent() && layer->HasDelegatedContent())
    num_children_that_draw_content += 1000;
  layer->SetNumDescendantsThatDrawContent(num_children_that_draw_content);
  return num_children_that_draw_content + (layer->DrawsContent() ? 1 : 0);
}

void FakeLayerTreeHostImpl::UpdateNumChildrenAndDrawPropertiesForActiveTree() {
  UpdateNumChildrenAndDrawProperties(active_tree());
}

void FakeLayerTreeHostImpl::UpdateNumChildrenAndDrawProperties(
    LayerTreeImpl* layerTree) {
  RecursiveUpdateNumChildren(layerTree->root_layer());
  bool update_lcd_text = false;
  layerTree->UpdateDrawProperties(update_lcd_text);
}

}  // namespace cc
