From cf3107793295e5550c67a1bd7e26776309e5dbc7 Mon Sep 17 00:00:00 2001 From: Jean-Marc Lasgouttes Date: Fri, 14 Jun 2013 19:24:29 +0200 Subject: [PATCH] Change TextMetrics::rowHeight to setRowHeight This new function takes a row as parameter. Also, add direct access to Row::dim_ --- src/Row.cpp | 6 --- src/Row.h | 4 +- src/TextMetrics.cpp | 92 +++++++++++++++++++++++---------------------- src/TextMetrics.h | 13 ++----- 4 files changed, 52 insertions(+), 63 deletions(-) diff --git a/src/Row.cpp b/src/Row.cpp index 66b1726d89..5fd2abb8f5 100644 --- a/src/Row.cpp +++ b/src/Row.cpp @@ -41,12 +41,6 @@ void Row::setCrc(size_type crc) const } -void Row::setDimension(Dimension const & dim) -{ - dim_ = dim; -} - - void Row::pos(pos_type p) { pos_ = p; diff --git a/src/Row.h b/src/Row.h index c26752bde8..2806824fe2 100644 --- a/src/Row.h +++ b/src/Row.h @@ -61,10 +61,10 @@ public: /// pos_type endpos() const { return end_; } /// - void setDimension(Dimension const & dim); - /// Dimension const & dimension() const { return dim_; } /// + Dimension & dimension() { return dim_; } + /// int height() const { return dim_.height(); } /// int width() const { return dim_.wid; } diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 3026367601..6880e14901 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -460,32 +460,27 @@ bool TextMetrics::redoParagraph(pit_type const pit) pos_type first = 0; size_t row_index = 0; // maximum pixel width of a row - int width = max_width_ - right_margin; // - leftMargin(max_width_, pit, row); do { - Dimension dim; - pos_type end = rowBreakPoint(width, pit, first); - if (row_index || end < par.size()) + if (row_index == pm.rows().size()) + pm.rows().push_back(Row()); + Row & row = pm.rows()[row_index]; + row.pos(first); + breakRow(row, right_margin, pit); + setRowHeight(row, pit); + row.dimension().wid = rowWidth(right_margin, pit, first, row.endpos()); + row.setChanged(false); + if (row_index || row.endpos() < par.size()) // If there is more than one row, expand the text to // the full allowable width. This setting here is needed // for the computeRowMetrics() below. dim_.wid = max_width_; - - dim = rowHeight(pit, first, end); - dim.wid = rowWidth(right_margin, pit, first, end); - if (row_index == pm.rows().size()) - pm.rows().push_back(Row()); - Row & row = pm.rows()[row_index]; - row.setChanged(false); - row.pos(first); - row.endpos(end); - row.setDimension(dim); - int const max_row_width = max(dim_.wid, dim.wid); + int const max_row_width = max(dim_.wid, row.width()); computeRowMetrics(pit, row, max_row_width); - first = end; + first = row.endpos(); ++row_index; - pm.dim().wid = max(pm.dim().wid, dim.wid); - pm.dim().des += dim.height(); + pm.dim().wid = max(pm.dim().wid, row.width()); + pm.dim().des += row.height(); } while (first < par.size()); if (row_index < pm.rows().size()) @@ -494,18 +489,17 @@ bool TextMetrics::redoParagraph(pit_type const pit) // Make sure that if a par ends in newline, there is one more row // under it if (first > 0 && par.isNewline(first - 1)) { - Dimension dim = rowHeight(pit, first, first); - dim.wid = rowWidth(right_margin, pit, first, first); if (row_index == pm.rows().size()) pm.rows().push_back(Row()); Row & row = pm.rows()[row_index]; - row.setChanged(false); row.pos(first); row.endpos(first); - row.setDimension(dim); - int const max_row_width = max(dim_.wid, dim.wid); + row.dimension().wid = rowWidth(right_margin, pit, first, first); + setRowHeight(row, pit); + row.setChanged(false); + int const max_row_width = max(dim_.wid, row.width()); computeRowMetrics(pit, row, max_row_width); - pm.dim().des += dim.height(); + pm.dim().des += row.height(); } pm.dim().asc += pm.rows()[0].ascent(); @@ -719,7 +713,7 @@ int TextMetrics::labelFill(pit_type const pit, Row const & row) const #if 0 -// Not used, see TextMetrics::rowBreakPoint. +// Not used, see TextMetrics::breakRow // this needs special handling - only newlines count as a break point static pos_type addressBreakPoint(pos_type i, Paragraph const & par) { @@ -801,13 +795,17 @@ private: } // anon namespace -pos_type TextMetrics::rowBreakPoint(int const width, pit_type const pit, - pos_type const pos) const +void TextMetrics::breakRow(Row & row, int const right_margin, pit_type const pit) const { Paragraph const & par = text_->getPar(pit); pos_type const end = par.size(); - if (pos == end || width < 0) - return end; + pos_type const pos = row.pos(); + int const left = leftMargin(max_width_, pit, pos); + int const width = max_width_ - right_margin; + if (pos == end || width < 0) { + row.endpos(end); + return; + } ParagraphMetrics const & pm = par_metrics_[pit]; ParagraphList const & pars = text_->paragraphs(); @@ -831,7 +829,6 @@ pos_type TextMetrics::rowBreakPoint(int const width, pit_type const pit, inlineCompletionLPos = inlineCompletionPos.pos() - 1; } - int const left = leftMargin(max_width_, pit, pos); pos_type const body_pos = par.beginOfBody(); int x = left; pos_type point = end; @@ -940,7 +937,7 @@ pos_type TextMetrics::rowBreakPoint(int const width, pit_type const pit, if (body_pos && point < body_pos) point = body_pos; - return point; + row.endpos(point); } @@ -1018,8 +1015,8 @@ int TextMetrics::rowWidth(int right_margin, pit_type const pit, } -Dimension TextMetrics::rowHeight(pit_type const pit, pos_type const first, - pos_type const end, bool topBottomSpace) const +void TextMetrics::setRowHeight(Row & row, pit_type const pit, + bool topBottomSpace) const { Paragraph const & par = text_->getPar(pit); // get the maximum ascent and the maximum descent @@ -1037,7 +1034,7 @@ Dimension TextMetrics::rowHeight(pit_type const pit, pos_type const first, // start with so we don't have to do the assignment below too // often. Buffer const & buffer = bv_->buffer(); - Font font = displayFont(pit, first); + Font font = displayFont(pit, row.pos()); FontSize const tmpsize = font.fontInfo().size(); font.fontInfo() = text_->layoutFont(pit); FontSize const size = font.fontInfo().size(); @@ -1060,7 +1057,7 @@ Dimension TextMetrics::rowHeight(pit_type const pit, pos_type const first, InsetList::const_iterator ii = par.insetList().begin(); InsetList::const_iterator iend = par.insetList().end(); for ( ; ii != iend; ++ii) { - if (ii->pos >= first && ii->pos < end) { + if (ii->pos >= row.pos() && ii->pos < row.endpos()) { Dimension const & dim = pm.insetDimension(ii->inset); maxasc = max(maxasc, dim.ascent()); maxdesc = max(maxdesc, dim.descent()); @@ -1073,7 +1070,7 @@ Dimension TextMetrics::rowHeight(pit_type const pit, pos_type const first, int labeladdon = 0; FontSize maxsize = - par.highestFontInRange(first, end, size); + par.highestFontInRange(row.pos(), row.endpos(), size); if (maxsize > font.fontInfo().size()) { // use standard paragraph font with the maximal size FontInfo maxfont = font.fontInfo(); @@ -1091,7 +1088,7 @@ Dimension TextMetrics::rowHeight(pit_type const pit, pos_type const first, Inset const & inset = text_->inset(); // is it a top line? - if (first == 0 && topBottomSpace) { + if (row.pos() == 0 && topBottomSpace) { BufferParams const & bufparams = buffer.params(); // some parskips VERY EASY IMPLEMENTATION if (bufparams.paragraph_separation == BufferParams::ParagraphSkipSeparation @@ -1131,7 +1128,7 @@ Dimension TextMetrics::rowHeight(pit_type const pit, pos_type const first, && prevpar.getLabelWidthString() == par.getLabelWidthString()) { layoutasc = layout.itemsep * dh; - } else if (pit != 0 || first != 0) { + } else if (pit != 0 || row.pos() != 0) { if (layout.topsep > 0) layoutasc = layout.topsep * dh; } @@ -1149,7 +1146,7 @@ Dimension TextMetrics::rowHeight(pit_type const pit, pos_type const first, } // is it a bottom line? - if (end >= par.size() && topBottomSpace) { + if (row.endpos() >= par.size() && topBottomSpace) { // add the layout spaces, for example before and after // a section, or between the items of a itemize or enumerate // environment @@ -1184,15 +1181,16 @@ Dimension TextMetrics::rowHeight(pit_type const pit, pos_type const first, // main Text. The following test is thus bogus. // Top and bottom margin of the document (only at top-level) if (main_text_ && topBottomSpace) { - if (pit == 0 && first == 0) + if (pit == 0 && row.pos() == 0) maxasc += 20; if (pit + 1 == pit_type(pars.size()) && - end == par.size() && - !(end > 0 && par.isNewline(end - 1))) + row.endpos() == par.size() && + !(row.endpos() > 0 && par.isNewline(row.endpos() - 1))) maxdesc += 20; } - return Dimension(0, maxasc + labeladdon, maxdesc); + row.dimension().asc = maxasc + labeladdon; + row.dimension().des = maxdesc; } @@ -1214,7 +1212,7 @@ pos_type TextMetrics::getColumnNearX(pit_type const pit, bidi.computeTables(par, buffer, row); pos_type vc = row.pos(); - pos_type end = row.endpos(); + pos_type const end = row.endpos(); pos_type c = 0; Layout const & layout = par.layout(); @@ -2230,7 +2228,11 @@ void TextMetrics::completionPosAndDim(Cursor const & cur, int & x, int & y, Point rxy = cur.bv().getPos(bvcur); // calculate dimensions of the word - dim = rowHeight(bvcur.pit(), wordStart.pos(), bvcur.pos(), false); + Row row; + row.pos(wordStart.pos()); + row.endpos(bvcur.pos()); + setRowHeight(row, bvcur.pit(), false); + dim = row.dimension(); dim.wid = abs(rxy.x_ - lxy.x_); // calculate position of word diff --git a/src/TextMetrics.h b/src/TextMetrics.h index 2acded9067..39fd2dac64 100644 --- a/src/TextMetrics.h +++ b/src/TextMetrics.h @@ -124,11 +124,8 @@ public: /// Returns the height of the row (width member is set to 0). /// If \c topBottomSpace is true, extra space is added for the /// top and bottom row. - Dimension rowHeight( - pit_type const pit, - pos_type const first, - pos_type const end, - bool topBottomSpace = true) const; + void setRowHeight(Row & row, pit_type const pit, + bool topBottomSpace = true) const; private: /// @@ -142,11 +139,7 @@ private: /// sets row.end to the pos value *after* which a row should break. /// for example, the pos after which isNewLine(pos) == true - pos_type rowBreakPoint( - int width, - pit_type const pit, - pos_type first - ) const; + void breakRow(Row & row, int right_margin, pit_type const pit) const; /// returns the minimum space a row needs on the screen in pixel int rowWidth(