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