172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be
372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file.
472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#ifndef BASE_I18N_BIDI_LINE_ITERATOR_H_
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#define BASE_I18N_BIDI_LINE_ITERATOR_H_
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#pragma once
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "unicode/ubidi.h"
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/basictypes.h"
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/string16.h"
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace base {
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace i18n {
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// A simple wrapper class for the bidirectional iterator of ICU.
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// This class uses the bidirectional iterator of ICU to split a line of
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// bidirectional texts into visual runs in its display order.
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass BiDiLineIterator {
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public:
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  BiDiLineIterator();
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ~BiDiLineIterator();
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Initializes the bidirectional iterator with the specified text.  Returns
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // whether initialization succeeded.
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool Open(const string16& text, bool right_to_left, bool url);
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Returns the number of visual runs in the text, or zero on error.
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  int CountRuns();
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Gets the logical offset, length, and direction of the specified visual run.
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  UBiDiDirection GetVisualRun(int index, int* start, int* length);
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Given a start position, figure out where the run ends (and the BiDiLevel).
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void GetLogicalRun(int start, int* end, UBiDiLevel* level);
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen private:
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  UBiDi* bidi_;
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DISALLOW_COPY_AND_ASSIGN(BiDiLineIterator);
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen};
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace i18n
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace base
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif  // BASE_I18N_BIDI_LINE_ITERATOR_H_
48