// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_CSSOM_COLOR_STOP_H_
#define COBALT_CSSOM_COLOR_STOP_H_

#include <string>

#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/scoped_vector.h"
#include "cobalt/cssom/length_value.h"
#include "cobalt/cssom/percentage_value.h"
#include "cobalt/cssom/property_value.h"
#include "cobalt/cssom/rgba_color_value.h"

namespace cobalt {
namespace cssom {

// A color stop is a combination of a color and a position. Percentages refer to
// the length of the gradient line, with 0% being at the starting point and 100%
// being at the ending point. Lengths are measured from the starting point in
// the direction of the ending point.
// See https://www.w3.org/TR/css3-images/#color-stop-syntax
// 4.4. Gradient Color-Stops for details.
class ColorStop {
 public:
  explicit ColorStop(const scoped_refptr<RGBAColorValue>& rgba)
      : rgba_(rgba), position_(NULL) {}

  ColorStop(const scoped_refptr<RGBAColorValue>& rgba,
            const scoped_refptr<PropertyValue>& position)
      : rgba_(rgba), position_(position) {}

  const scoped_refptr<RGBAColorValue>& rgba() const { return rgba_; }
  const scoped_refptr<PropertyValue>& position() const { return position_; }

  std::string ToString() const;

  bool operator==(const ColorStop& other) const;

 private:
  const scoped_refptr<RGBAColorValue> rgba_;
  const scoped_refptr<PropertyValue> position_;

  DISALLOW_COPY_AND_ASSIGN(ColorStop);
};

// A list of ColorStopValue. Color-stops are points placed along the line
// defined by gradient line at the beginning of the rule. Color-stops must be
// specified in order.
typedef ScopedVector<ColorStop> ColorStopList;

bool ColorStopListsEqual(const ColorStopList& lhs, const ColorStopList& rhs);

}  // namespace cssom
}  // namespace cobalt

#endif  // COBALT_CSSOM_COLOR_STOP_H_
