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#include "base/i18n/bidi_line_iterator.h"
672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/logging.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace base {
1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace i18n {
1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBiDiLineIterator::BiDiLineIterator() : bidi_(NULL) {
1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenBiDiLineIterator::~BiDiLineIterator() {
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (bidi_) {
1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ubidi_close(bidi_);
1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    bidi_ = NULL;
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenbool BiDiLineIterator::Open(const string16& text,
2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            bool right_to_left,
2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            bool url) {
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(!bidi_);
2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  UErrorCode error = U_ZERO_ERROR;
2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bidi_ = ubidi_openSized(static_cast<int>(text.length()), 0, &error);
2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (U_FAILURE(error))
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return false;
3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  if (right_to_left && url)
3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ubidi_setReorderingMode(bidi_, UBIDI_REORDER_RUNS_ONLY);
3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ubidi_setPara(bidi_, text.data(), static_cast<int>(text.length()),
3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                right_to_left ? UBIDI_DEFAULT_RTL : UBIDI_DEFAULT_LTR,
3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                NULL, &error);
3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return U_SUCCESS(error) ? true : false;
3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenint BiDiLineIterator::CountRuns() {
3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(bidi_ != NULL);
4072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  UErrorCode error = U_ZERO_ERROR;
4172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const int runs = ubidi_countRuns(bidi_, &error);
4272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return U_SUCCESS(error) ? runs : 0;
4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenUBiDiDirection BiDiLineIterator::GetVisualRun(int index,
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                              int* start,
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                              int* length) {
4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(bidi_ != NULL);
4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  return ubidi_getVisualRun(bidi_, index, start, length);
5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid BiDiLineIterator::GetLogicalRun(int start,
5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     int* end,
5472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     UBiDiLevel* level) {
5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  DCHECK(bidi_ != NULL);
5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ubidi_getLogicalRun(bidi_, start, end, level);
5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}
5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace i18n
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace base
61