Я использую Pango для набора Devanagari. Рассмотрим строку उम्कन्छौ, состоящую из БУКВЫ ДЕВАНАГАРИ U, БУКВЫ ДЕВАНАГАРИ MA, ЗНАКА ДЕВАНАГАРИ ВИРАМА, БУКВЫ ДЕВАНАГАРИ KA, БУКВЫ ДЕВАНАГАРИ NA, ЗНАКА ДЕВАНАГАРИ ВИРАМА, БУКВЫ ДЕВАНАГАРИ CHA, ЗНАКА ГЛАСНОЙ ДЕВАНАГАРИ AU. При наборе этой строки я хочу знать начальную точку छ (CHA), чтобы поставить визуальную метку.
Для обычных строк я бы взял длину предыдущей части, उम्कन्, но здесь это не работает, поскольку, как вы можете видеть, न् (половина न) сочетается с छ, поэтому результат немного отличается.
Есть ли способ получить правильную начальную точку буквы, когда используются комбинации?
Я пытался запросить макет Pango с помощью index_to_pos(), но, похоже, это работает на уровне байтов (а не символов).
Эта небольшая программа на Perl показывает проблему. Вертикальная линия смещена вправо.
use strict;
use warnings;
use utf8;
use Cairo;
use Pango;
my $surface = Cairo::PdfSurface->create ("out.pdf", 595, 842);
my $cr = Cairo::Context->create ($surface);
my $layout = Pango::Cairo::create_layout($cr);
my $font = Pango::FontDescription->from_string('Lohit Devanagari');
$layout->set_font_description($font);
# Two parts of the phrase. Phrase1 ends in न् (half न).
my $phrase1 = 'उम्कन्';
my $phrase2 = 'छौ';
# Set the first part of the phrase, and get its width.
$layout->set_markup($phrase1);
my $w = ($layout->get_size)[0]/1024;
# Set the complete phrase.
$layout->set_markup($phrase1.$phrase2);
my ($x, $y ) = ( 100, 100 );
# Show phrase.
$cr->move_to( $x, $y );
$cr->set_source_rgba( 0, 0, 0, 1 );
Pango::Cairo::show_layout($cr, $layout);
# Show marker at width.
$cr->set_line_width(0.25);
$cr->move_to( $x + $w, $y-10 );
$cr->line_to( $x + $w, $y+50 );
$cr->stroke;
$cr->show_page;