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