// Copyright 2016 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/layers/layer_impl_test_properties.h"

#include "cc/layers/layer_impl.h"
#include "cc/output/copy_output_request.h"
#include "cc/trees/layer_tree_impl.h"

namespace cc {

LayerImplTestProperties::LayerImplTestProperties(LayerImpl* owning_layer)
    : owning_layer(owning_layer),
      double_sided(true),
      force_render_surface(false),
      is_container_for_fixed_position_layers(false),
      should_flatten_transform(true),
      hide_layer_and_subtree(false),
      opacity_can_animate(false),
      num_descendants_that_draw_content(0),
      sorting_context_id(0),
      num_unclipped_descendants(0),
      opacity(1.f),
      blend_mode(SkBlendMode::kSrcOver),
      scroll_parent(nullptr),
      clip_parent(nullptr),
      mask_layer(nullptr),
      parent(nullptr) {}

LayerImplTestProperties::~LayerImplTestProperties() {}

void LayerImplTestProperties::AddChild(std::unique_ptr<LayerImpl> child) {
  child->test_properties()->parent = owning_layer;
  children.push_back(child.get());
  owning_layer->layer_tree_impl()->AddLayer(std::move(child));
  owning_layer->layer_tree_impl()->BuildLayerListForTesting();
}

std::unique_ptr<LayerImpl> LayerImplTestProperties::RemoveChild(
    LayerImpl* child) {
  auto it = std::find(children.begin(), children.end(), child);
  if (it != children.end())
    children.erase(it);
  owning_layer->layer_tree_impl()->property_trees()->RemoveIdFromIdToIndexMaps(
      child->id());
  auto layer = owning_layer->layer_tree_impl()->RemoveLayer(child->id());
  owning_layer->layer_tree_impl()->BuildLayerListForTesting();
  return layer;
}

void LayerImplTestProperties::SetMaskLayer(std::unique_ptr<LayerImpl> mask) {
  if (mask_layer)
    owning_layer->layer_tree_impl()->RemoveLayer(mask_layer->id());
  mask_layer = mask.get();
  if (mask)
    owning_layer->layer_tree_impl()->AddLayer(std::move(mask));
}

}  // namespace cc
