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

#ifndef UI_BASE_IME_COMPOSITION_UNDERLINE_H_
#define UI_BASE_IME_COMPOSITION_UNDERLINE_H_

#include <vector>

#include "base/basictypes.h"
#include "third_party/skia/include/core/SkColor.h"

namespace ui {

// Intentionally keep sync with blink::WebCompositionUnderline defined in:
// third_party/WebKit/public/web/WebCompositionUnderline.h
struct CompositionUnderline {
  CompositionUnderline()
      : start_offset(0),
        end_offset(0),
        color(SK_ColorTRANSPARENT),
        thick(false),
        background_color(SK_ColorTRANSPARENT) {}

  // TODO(huangs): remove this constructor.
  CompositionUnderline(uint32 s, uint32 e, SkColor c, bool t)
      : start_offset(s),
        end_offset(e),
        color(c),
        thick(t),
        background_color(SK_ColorTRANSPARENT) {}

  CompositionUnderline(uint32 s, uint32 e, SkColor c, bool t, SkColor bc)
      : start_offset(s),
        end_offset(e),
        color(c),
        thick(t),
        background_color(bc) {}

  bool operator==(const CompositionUnderline& rhs) const {
    return (this->start_offset == rhs.start_offset) &&
           (this->end_offset == rhs.end_offset) && (this->color == rhs.color) &&
           (this->thick == rhs.thick) &&
           (this->background_color == rhs.background_color);
  }

  bool operator!=(const CompositionUnderline& rhs) const {
    return !(*this == rhs);
  }

  uint32 start_offset;
  uint32 end_offset;
  SkColor color;
  bool thick;
  SkColor background_color;
};

typedef std::vector<CompositionUnderline> CompositionUnderlines;

}  // namespace ui

#endif  // UI_BASE_IME_COMPOSITION_UNDERLINE_H_
