gtk — ориентация текста на C ++ pango

Я пытаюсь пометить ось Y на графике, построенном с использованием панго.

Я не могу ориентировать текст так, чтобы он проходил вертикально вдоль оси Y.

Соответствующая часть кода:

 #include <gtkmm.h>

Pango::FontDescription font;
cr->save();  // where cr is Glib::RefPtr<Cairo::Context> const &
cr->set_source_rgba(1.0,1.0,1.0,0.5);
font.set_family("Monospace");
font.set_style(Pango::STYLE_ITALIC);
font.set_weight(Pango::WEIGHT_BOLD);
font.set_absolute_size(20);
Glib::RefPtr<Pango::Layout> x_axis_label = this->create_pango_layout("x-axis label");
x_axis_label->set_font_description(font);
cr->move_to(0.38,0.465);
x_axis_label->show_in_cairo_context(cr);

// so far so good, renders as expected

// now trying to render the y-axis label
Glib::RefPtr<Pango::Context> t_y_axis_label_ctxt = x_axis_label->get_context();
Pango::Matrix p_matrix;
// apply some transformation
p_matrix.xx = 0.0;
p_matrix.xy = 1.0;
p_matrix.yx = 1.0;
p_matrix.yy = 0.0;
p_matrix.x0 = 0.0;
p_matrix.y0 = 0.0;
t_y_axis_label_ctxt->set_matrix(p_matrix);
Glib::RefPtr<Pango::Layout> y_axis_label = Pango::Layout::create(t_y_axis_label_ctxt);

y_axis_label->set_text("y-axis label"); // if this line of code is omitted I would expect, at least the text "x-axis label" to be rendered. But this does not happen.
y_axis_label->set_font_description(font);
cr->move_to(0.0,0.0);
y_axis_label->show_in_cairo_context(cr);  // renders no output
cr->restore();

Я подозреваю, что проблема связана с контекстом, который я извлекаю из метки оси X, и ожидаемое поведение при копировании не проявляется.

2

Решение

Вы уверены, что хотите повернуть контекст Панго? Я считаю, что функциональность была введена в предкаирские дни; теперь вы просто вращаете каирский контекст, например:

cr->save();
cr->rotate_degrees(90);
Glib::RefPtr<Pango::Layout> y_axis_label = this->create_pango_layout("y-axis label");
y_axis_label->set_font_description(font);
cr->move_to(...); // wherever you wanna put it
y_axis_label->show_in_cairo_context(cr);
cr->restore();

Если вы все еще ничего не видите, убедитесь, что вы не перемещаете этикетку из видимой области.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector