テキスト描画自体は、cairo::Contextにshow_textというのがあるので簡単だ。
context.move_to(100f64, 200f64);
context.set_source_rgb(0.0, 0.0, 0.0);
context.set_font_size(200.0);
context.show_text("Help");
context.stroke();
再描画の時のために描画領域を求める方法だが、cairo::Contextにtext_extentsがあって、これで得られる。ここには、width, height, x bearing, y bearing, x advance, y advanceが含まれている。このうちx advanceとy advanceが良く分からないが、残りの4つのパラメータで描画領域は計算できるようだ。
始点をx, yとすると、描画域は以下で得られるようだ。
左上: (x + x bearing, y + y bearing) 右上: (x + x bearing + width, y + y bearing) 右下: (x + x bearing + width, y + y bearing + height) 左下: (x + x bearing, y + y bearing + height)
サンプルは、GitHubに置いておいた。