// Copyright (c) 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.

#include "views/layer_helper.h"

#include "views/layer_property_setter.h"
#include "ui/gfx/compositor/layer.h"
#include "ui/gfx/transform.h"

namespace views {

namespace internal {

LayerHelper::LayerHelper()
    : bitmap_needs_updating_(true),
      layer_updated_externally_(false),
      paint_to_layer_(false),
      property_setter_explicitly_set_(false),
      needs_paint_all_(true) {
}

LayerHelper::~LayerHelper() {
  if (property_setter_.get() && layer_.get())
    property_setter_->Uninstalled(layer_.get());
  property_setter_.reset();
  layer_.reset();
}

void LayerHelper::SetTransform(const ui::Transform& transform) {
  transform_.reset(transform.HasChange() ? new ui::Transform(transform) : NULL);
}

void LayerHelper::SetLayer(ui::Layer* layer) {
  if (property_setter_.get() && this->layer())
    property_setter_->Uninstalled(this->layer());
  layer_.reset(layer);
  if (layer) {
    if (!property_setter_.get())
      property_setter_.reset(LayerPropertySetter::CreateDefaultSetter());
    property_setter_->Installed(this->layer());
  } else if (!property_setter_explicitly_set_) {
    property_setter_.reset(NULL);
  }
}

void LayerHelper::SetPropertySetter(LayerPropertySetter* setter) {
  if (property_setter_.get() && layer())
    property_setter_->Uninstalled(layer());
  property_setter_.reset(setter);
  if (layer()) {
    if (!setter)
      property_setter_.reset(LayerPropertySetter::CreateDefaultSetter());
    property_setter_->Installed(layer());
  }
}

bool LayerHelper::ShouldPaintToLayer() const {
  return paint_to_layer_ || (transform_.get() && transform_->HasChange());
}

} // namespace internal

}  // namespace views
