// Copyright 2011 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_TREES_LAYER_TREE_HOST_COMMON_H_
#define CC_TREES_LAYER_TREE_HOST_COMMON_H_

#include <limits>
#include <vector>

#include "base/bind.h"
#include "base/memory/ref_counted.h"
#include "cc/base/cc_export.h"
#include "cc/base/scoped_ptr_vector.h"
#include "cc/layers/layer_lists.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/vector2d.h"
#include "ui/gfx/transform.h"

namespace cc {

class LayerImpl;
class Layer;
class SwapPromise;

class CC_EXPORT LayerTreeHostCommon {
 public:
  static gfx::Rect CalculateVisibleRect(const gfx::Rect& target_surface_rect,
                                        const gfx::Rect& layer_bound_rect,
                                        const gfx::Transform& transform);

  template <typename LayerType, typename RenderSurfaceLayerListType>
  struct CalcDrawPropsInputs {
   public:
    CalcDrawPropsInputs(LayerType* root_layer,
                        const gfx::Size& device_viewport_size,
                        const gfx::Transform& device_transform,
                        float device_scale_factor,
                        float page_scale_factor,
                        const LayerType* page_scale_application_layer,
                        const gfx::Vector2dF& elastic_overscroll,
                        const LayerType* elastic_overscroll_application_layer,
                        int max_texture_size,
                        bool can_use_lcd_text,
                        bool layers_always_allowed_lcd_text,
                        bool can_render_to_separate_surface,
                        bool can_adjust_raster_scales,
                        RenderSurfaceLayerListType* render_surface_layer_list,
                        int current_render_surface_layer_list_id)
        : root_layer(root_layer),
          device_viewport_size(device_viewport_size),
          device_transform(device_transform),
          device_scale_factor(device_scale_factor),
          page_scale_factor(page_scale_factor),
          page_scale_application_layer(page_scale_application_layer),
          elastic_overscroll(elastic_overscroll),
          elastic_overscroll_application_layer(
              elastic_overscroll_application_layer),
          max_texture_size(max_texture_size),
          can_use_lcd_text(can_use_lcd_text),
          layers_always_allowed_lcd_text(layers_always_allowed_lcd_text),
          can_render_to_separate_surface(can_render_to_separate_surface),
          can_adjust_raster_scales(can_adjust_raster_scales),
          render_surface_layer_list(render_surface_layer_list),
          current_render_surface_layer_list_id(
              current_render_surface_layer_list_id) {}

    LayerType* root_layer;
    gfx::Size device_viewport_size;
    const gfx::Transform& device_transform;
    float device_scale_factor;
    float page_scale_factor;
    const LayerType* page_scale_application_layer;
    gfx::Vector2dF elastic_overscroll;
    const LayerType* elastic_overscroll_application_layer;
    int max_texture_size;
    bool can_use_lcd_text;
    bool layers_always_allowed_lcd_text;
    bool can_render_to_separate_surface;
    bool can_adjust_raster_scales;
    RenderSurfaceLayerListType* render_surface_layer_list;
    int current_render_surface_layer_list_id;
  };

  template <typename LayerType, typename RenderSurfaceLayerListType>
  struct CalcDrawPropsInputsForTesting
      : public CalcDrawPropsInputs<LayerType, RenderSurfaceLayerListType> {
    CalcDrawPropsInputsForTesting(
        LayerType* root_layer,
        const gfx::Size& device_viewport_size,
        const gfx::Transform& device_transform,
        RenderSurfaceLayerListType* render_surface_layer_list);
    CalcDrawPropsInputsForTesting(
        LayerType* root_layer,
        const gfx::Size& device_viewport_size,
        RenderSurfaceLayerListType* render_surface_layer_list);

   private:
    const gfx::Transform identity_transform_;
  };

  typedef CalcDrawPropsInputs<Layer, RenderSurfaceLayerList>
      CalcDrawPropsMainInputs;
  typedef CalcDrawPropsInputsForTesting<Layer, RenderSurfaceLayerList>
      CalcDrawPropsMainInputsForTesting;
  static void CalculateDrawProperties(CalcDrawPropsMainInputs* inputs);

  typedef CalcDrawPropsInputs<LayerImpl, LayerImplList> CalcDrawPropsImplInputs;
  typedef CalcDrawPropsInputsForTesting<LayerImpl, LayerImplList>
      CalcDrawPropsImplInputsForTesting;
  static void CalculateDrawProperties(CalcDrawPropsImplInputs* inputs);

  template <typename LayerType>
  static bool RenderSurfaceContributesToTarget(LayerType*,
                                               int target_surface_layer_id);

  template <typename LayerType>
  static void CallFunctionForSubtree(
      LayerType* root_layer,
      const base::Callback<void(LayerType* layer)>& function);

  // Returns a layer with the given id if one exists in the subtree starting
  // from the given root layer (including mask and replica layers).
  template <typename LayerType>
  static LayerType* FindLayerInSubtree(LayerType* root_layer, int layer_id);

  static Layer* get_layer_as_raw_ptr(const LayerList& layers, size_t index) {
    return layers[index].get();
  }

  static LayerImpl* get_layer_as_raw_ptr(const OwnedLayerImplList& layers,
                                         size_t index) {
    return layers[index];
  }

  static LayerImpl* get_layer_as_raw_ptr(const LayerImplList& layers,
                                         size_t index) {
    return layers[index];
  }

  struct ScrollUpdateInfo {
    int layer_id;
    // TODO(miletus) : Use ScrollOffset once LayerTreeHost/Blink fully supports
    // franctional scroll offset.
    gfx::Vector2d scroll_delta;
  };
};

struct CC_EXPORT ScrollAndScaleSet {
  ScrollAndScaleSet();
  ~ScrollAndScaleSet();

  std::vector<LayerTreeHostCommon::ScrollUpdateInfo> scrolls;
  float page_scale_delta;
  gfx::Vector2dF elastic_overscroll_delta;
  float top_controls_delta;
  ScopedPtrVector<SwapPromise> swap_promises;
};

template <typename LayerType>
bool LayerTreeHostCommon::RenderSurfaceContributesToTarget(
    LayerType* layer,
    int target_surface_layer_id) {
  // A layer will either contribute its own content, or its render surface's
  // content, to the target surface. The layer contributes its surface's content
  // when both the following are true:
  //  (1) The layer actually has a render surface, and
  //  (2) The layer's render surface is not the same as the target surface.
  //
  // Otherwise, the layer just contributes itself to the target surface.

  return layer->render_surface() && layer->id() != target_surface_layer_id;
}

template <typename LayerType>
LayerType* LayerTreeHostCommon::FindLayerInSubtree(LayerType* root_layer,
                                                   int layer_id) {
  if (!root_layer)
    return NULL;

  if (root_layer->id() == layer_id)
    return root_layer;

  if (root_layer->mask_layer() && root_layer->mask_layer()->id() == layer_id)
    return root_layer->mask_layer();

  if (root_layer->replica_layer() &&
      root_layer->replica_layer()->id() == layer_id)
    return root_layer->replica_layer();

  for (size_t i = 0; i < root_layer->children().size(); ++i) {
    if (LayerType* found = FindLayerInSubtree(
            get_layer_as_raw_ptr(root_layer->children(), i), layer_id))
      return found;
  }
  return NULL;
}

template <typename LayerType>
void LayerTreeHostCommon::CallFunctionForSubtree(
    LayerType* root_layer,
    const base::Callback<void(LayerType* layer)>& function) {
  function.Run(root_layer);

  if (LayerType* mask_layer = root_layer->mask_layer())
    function.Run(mask_layer);
  if (LayerType* replica_layer = root_layer->replica_layer()) {
    function.Run(replica_layer);
    if (LayerType* mask_layer = replica_layer->mask_layer())
      function.Run(mask_layer);
  }

  for (size_t i = 0; i < root_layer->children().size(); ++i) {
    CallFunctionForSubtree(get_layer_as_raw_ptr(root_layer->children(), i),
                           function);
  }
}

template <typename LayerType, typename RenderSurfaceLayerListType>
LayerTreeHostCommon::CalcDrawPropsInputsForTesting<LayerType,
                                                   RenderSurfaceLayerListType>::
    CalcDrawPropsInputsForTesting(
        LayerType* root_layer,
        const gfx::Size& device_viewport_size,
        const gfx::Transform& device_transform,
        RenderSurfaceLayerListType* render_surface_layer_list)
    : CalcDrawPropsInputs<LayerType, RenderSurfaceLayerListType>(
          root_layer,
          device_viewport_size,
          device_transform,
          1.f,
          1.f,
          NULL,
          gfx::Vector2dF(),
          NULL,
          std::numeric_limits<int>::max() / 2,
          false,
          false,
          true,
          false,
          render_surface_layer_list,
          0) {
  DCHECK(root_layer);
  DCHECK(render_surface_layer_list);
}

template <typename LayerType, typename RenderSurfaceLayerListType>
LayerTreeHostCommon::CalcDrawPropsInputsForTesting<LayerType,
                                                   RenderSurfaceLayerListType>::
    CalcDrawPropsInputsForTesting(
        LayerType* root_layer,
        const gfx::Size& device_viewport_size,
        RenderSurfaceLayerListType* render_surface_layer_list)
    : CalcDrawPropsInputs<LayerType, RenderSurfaceLayerListType>(
          root_layer,
          device_viewport_size,
          identity_transform_,
          1.f,
          1.f,
          NULL,
          gfx::Vector2dF(),
          NULL,
          std::numeric_limits<int>::max() / 2,
          false,
          false,
          true,
          false,
          render_surface_layer_list,
          0) {
  DCHECK(root_layer);
  DCHECK(render_surface_layer_list);
}

}  // namespace cc

#endif  // CC_TREES_LAYER_TREE_HOST_COMMON_H_
