+ParagraphMetrics const & TextMetrics::parMetrics(pit_type pit) const
+{
+ return const_cast<TextMetrics *>(this)->parMetrics(pit, true);
+}
+
+
+ParagraphMetrics & TextMetrics::parMetrics(pit_type pit)
+{
+ return parMetrics(pit, true);
+}
+
+
+void TextMetrics::newParMetricsDown()
+{
+ pair<pit_type, ParagraphMetrics> const & last = *par_metrics_.rbegin();
+ pit_type const pit = last.first + 1;
+ if (pit == int(text_->paragraphs().size()))
+ return;
+
+ // do it and update its position.
+ redoParagraph(pit);
+ par_metrics_[pit].setPosition(last.second.position()
+ + last.second.descent() + par_metrics_[pit].ascent());
+ updatePosCache(pit);
+}
+
+
+void TextMetrics::newParMetricsUp()
+{
+ pair<pit_type, ParagraphMetrics> const & first = *par_metrics_.begin();
+ if (first.first == 0)
+ return;
+
+ pit_type const pit = first.first - 1;
+ // do it and update its position.
+ redoParagraph(pit);
+ par_metrics_[pit].setPosition(first.second.position()
+ - first.second.ascent() - par_metrics_[pit].descent());
+ updatePosCache(pit);
+}
+
+
+bool TextMetrics::metrics(MetricsInfo const & mi, Dimension & dim, int min_width,
+ bool const expand_on_multipars)