| // Copyright 2016 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. |
| |
| #include "ui/gfx/win/text_analysis_source.h" |
| |
| #include "base/check.h" |
| |
| namespace gfx { |
| namespace win { |
| |
| HRESULT TextAnalysisSource::Create( |
| IDWriteTextAnalysisSource** text_analysis_out, |
| const std::wstring& text, |
| const std::wstring& locale_name, |
| IDWriteNumberSubstitution* number_substitution, |
| DWRITE_READING_DIRECTION reading_direction) { |
| return Microsoft::WRL::MakeAndInitialize<gfx::win::TextAnalysisSource>( |
| text_analysis_out, text, locale_name, number_substitution, |
| reading_direction); |
| } |
| |
| TextAnalysisSource::TextAnalysisSource() = default; |
| TextAnalysisSource::~TextAnalysisSource() = default; |
| |
| HRESULT TextAnalysisSource::GetLocaleName(UINT32 text_position, |
| UINT32* text_length, |
| const WCHAR** locale_name) { |
| if (text_position >= text_.length() || !text_length || !locale_name) |
| return E_INVALIDARG; |
| *text_length = text_.length() - text_position; |
| *locale_name = locale_name_.c_str(); |
| return S_OK; |
| } |
| |
| HRESULT TextAnalysisSource::GetNumberSubstitution( |
| UINT32 text_position, |
| UINT32* text_length, |
| IDWriteNumberSubstitution** number_substitution) { |
| if (text_position >= text_.length() || !text_length || !number_substitution) |
| return E_INVALIDARG; |
| *text_length = text_.length() - text_position; |
| number_substitution_.CopyTo(number_substitution); |
| return S_OK; |
| } |
| |
| DWRITE_READING_DIRECTION TextAnalysisSource::GetParagraphReadingDirection() { |
| return reading_direction_; |
| } |
| |
| HRESULT TextAnalysisSource::GetTextAtPosition(UINT32 text_position, |
| const WCHAR** text_string, |
| UINT32* text_length) { |
| if (!text_length || !text_string) |
| return E_INVALIDARG; |
| if (text_position >= text_.length()) { |
| *text_string = nullptr; |
| *text_length = 0; |
| return S_OK; |
| } |
| *text_string = text_.c_str() + text_position; |
| *text_length = text_.length() - text_position; |
| return S_OK; |
| } |
| |
| HRESULT TextAnalysisSource::GetTextBeforePosition(UINT32 text_position, |
| const WCHAR** text_string, |
| UINT32* text_length) { |
| if (!text_length || !text_string) |
| return E_INVALIDARG; |
| if (text_position < 1 || text_position > text_.length()) { |
| *text_string = nullptr; |
| *text_length = 0; |
| return S_OK; |
| } |
| *text_string = text_.c_str(); |
| *text_length = text_position; |
| return S_OK; |
| } |
| |
| HRESULT TextAnalysisSource::RuntimeClassInitialize( |
| const std::wstring& text, |
| const std::wstring& locale_name, |
| IDWriteNumberSubstitution* number_substitution, |
| DWRITE_READING_DIRECTION reading_direction) { |
| DCHECK(number_substitution); |
| text_ = text; |
| locale_name_ = locale_name; |
| number_substitution_ = number_substitution; |
| reading_direction_ = reading_direction; |
| return S_OK; |
| } |
| |
| } // namespace win |
| } // namespace gfx |