// 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/layers/nine_patch_layer_impl.h"

#include "base/strings/stringprintf.h"
#include "base/values.h"
#include "cc/base/math_util.h"
#include "cc/trees/layer_tree_impl.h"
#include "cc/trees/occlusion.h"
#include "components/viz/common/quads/texture_draw_quad.h"
#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/geometry/rect_f.h"

namespace cc {

NinePatchLayerImpl::NinePatchLayerImpl(LayerTreeImpl* tree_impl, int id)
    : UIResourceLayerImpl(tree_impl, id) {}

NinePatchLayerImpl::~NinePatchLayerImpl() = default;

std::unique_ptr<LayerImpl> NinePatchLayerImpl::CreateLayerImpl(
    LayerTreeImpl* tree_impl) {
  return NinePatchLayerImpl::Create(tree_impl, id());
}

void NinePatchLayerImpl::PushPropertiesTo(LayerImpl* layer) {
  UIResourceLayerImpl::PushPropertiesTo(layer);
  NinePatchLayerImpl* layer_impl = static_cast<NinePatchLayerImpl*>(layer);

  layer_impl->quad_generator_ = this->quad_generator_;
}

void NinePatchLayerImpl::SetLayout(const gfx::Rect& aperture,
                                   const gfx::Rect& border,
                                   const gfx::Rect& layer_occlusion,
                                   bool fill_center,
                                   bool nearest_neighbor) {
  // This check imposes an ordering on the call sequence.  An UIResource must
  // exist before SetLayout can be called.
  DCHECK(ui_resource_id_);

  if (!quad_generator_.SetLayout(image_bounds_, bounds(), aperture, border,
                                 layer_occlusion, fill_center,
                                 nearest_neighbor))
    return;

  NoteLayerPropertyChanged();
}

void NinePatchLayerImpl::AppendQuads(viz::RenderPass* render_pass,
                                     AppendQuadsData* append_quads_data) {
  DCHECK(!bounds().IsEmpty());
  quad_generator_.CheckGeometryLimitations();

  viz::SharedQuadState* shared_quad_state =
      render_pass->CreateAndAppendSharedQuadState();
  bool is_resource =
      ui_resource_id_ &&
      layer_tree_impl()->ResourceIdForUIResource(ui_resource_id_);
  bool are_contents_opaque =
      is_resource ? layer_tree_impl()->IsUIResourceOpaque(ui_resource_id_) ||
                        contents_opaque()
                  : false;
  PopulateSharedQuadState(shared_quad_state, are_contents_opaque);
  AppendDebugBorderQuad(render_pass, gfx::Rect(bounds()), shared_quad_state,
                        append_quads_data);

  if (!is_resource)
    return;

  std::vector<NinePatchGenerator::Patch> patches =
      quad_generator_.GeneratePatches();

  for (auto& patch : patches)
    patch.output_rect =
        gfx::RectF(gfx::ToFlooredRectDeprecated(patch.output_rect));

  quad_generator_.AppendQuads(this, ui_resource_id_, render_pass,
                              shared_quad_state, patches);
}

const char* NinePatchLayerImpl::LayerTypeAsString() const {
  return "cc::NinePatchLayerImpl";
}

std::unique_ptr<base::DictionaryValue> NinePatchLayerImpl::LayerAsJson() const {
  std::unique_ptr<base::DictionaryValue> result = LayerImpl::LayerAsJson();
  quad_generator_.AsJson(result.get());
  return result;
}

}  // namespace cc
