blob: 16e50dda0ac1e82d7e054c20770cf08919fd4eea [file]
// Copyright 2026 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CORE_FXCRT_CFX_BIDI_RESOLVER_H_
#define CORE_FXCRT_CFX_BIDI_RESOLVER_H_
#include <memory>
#include <string>
#include <vector>
struct UBiDi;
// Wraps ICU's UBiDi engine to extract visual text runs from a logical
// paragraph.
class CFX_BidiResolver {
public:
enum class ParagraphDirection { kAuto, kLeftToRight, kRightToLeft };
struct ResolvedRun {
int start;
int length;
bool is_rtl;
};
static std::unique_ptr<CFX_BidiResolver> Create(std::u16string utf16_text,
ParagraphDirection direction);
~CFX_BidiResolver();
// Extracts visual runs for a subset of the paragraph. Returns an empty
// vector if the line limits are invalid.
std::vector<ResolvedRun> GetVisualRunsForLine(int line_start,
int line_length) const;
private:
struct UBiDiDeleter {
void operator()(UBiDi* bidi) const;
};
using ScopedUBiDi = std::unique_ptr<UBiDi, UBiDiDeleter>;
CFX_BidiResolver(std::u16string utf16_text, ParagraphDirection direction);
const std::u16string utf16_text_;
ScopedUBiDi paragraph_bidi_;
};
#endif // CORE_FXCRT_CFX_BIDI_RESOLVER_H_