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

#include "base/trace_event/trace_event.h"
#include "cc/layers/nine_patch_layer_impl.h"
#include "cc/resources/scoped_ui_resource.h"
#include "cc/resources/ui_resource_bitmap.h"
#include "cc/trees/layer_tree_host.h"

namespace cc {

scoped_refptr<NinePatchLayer> NinePatchLayer::Create() {
  return base::WrapRefCounted(new NinePatchLayer());
}

NinePatchLayer::NinePatchLayer()
    : UIResourceLayer(), fill_center_(false), nearest_neighbor_(false) {}

NinePatchLayer::~NinePatchLayer() = default;

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

void NinePatchLayer::SetBorder(const gfx::Rect& border) {
  if (border == border_)
    return;
  border_ = border;
  SetNeedsCommit();
}

void NinePatchLayer::SetAperture(const gfx::Rect& aperture) {
  if (image_aperture_ == aperture)
    return;

  image_aperture_ = aperture;
  SetNeedsCommit();
}

void NinePatchLayer::SetFillCenter(bool fill_center) {
  if (fill_center_ == fill_center)
    return;

  fill_center_ = fill_center;
  SetNeedsCommit();
}

void NinePatchLayer::SetNearestNeighbor(bool nearest_neighbor) {
  if (nearest_neighbor_ == nearest_neighbor)
    return;

  nearest_neighbor_ = nearest_neighbor;
  SetNeedsCommit();
}

void NinePatchLayer::SetLayerOcclusion(const gfx::Rect& occlusion) {
  if (layer_occlusion_ == occlusion)
    return;

  layer_occlusion_ = occlusion;
  SetNeedsCommit();
}

void NinePatchLayer::PushPropertiesTo(LayerImpl* layer) {
  UIResourceLayer::PushPropertiesTo(layer);
  TRACE_EVENT0("cc", "NinePatchLayer::PushPropertiesTo");
  NinePatchLayerImpl* layer_impl = static_cast<NinePatchLayerImpl*>(layer);

  if (resource_id()) {
    DCHECK(layer_tree_host());
    layer_impl->SetLayout(image_aperture_, border_, layer_occlusion_,
                          fill_center_, nearest_neighbor_);
  }
}

}  // namespace cc
