From f91f682ef9e46e6f888da7bd559d61af39692805 Mon Sep 17 00:00:00 2001 From: Abdelrazak Younes Date: Sat, 18 Aug 2007 21:17:10 +0000 Subject: [PATCH] * Text: - singleWidth(Buffer...): transfered to TextMetrics. - singleWidth(Paragraph...): transfered to ParagraphMetrics. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19639 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/ParagraphMetrics.cpp | 28 ++++++++++++++++++++++++++ src/ParagraphMetrics.h | 2 ++ src/Text.cpp | 43 ++++------------------------------------ src/Text.h | 9 --------- src/TextMetrics.cpp | 43 ++++++++++++++++++++++++---------------- src/TextMetrics.h | 4 +++- src/rowpainter.cpp | 7 +++---- 7 files changed, 66 insertions(+), 70 deletions(-) diff --git a/src/ParagraphMetrics.cpp b/src/ParagraphMetrics.cpp index e7c1b5d2ca..9e2e7ba74d 100644 --- a/src/ParagraphMetrics.cpp +++ b/src/ParagraphMetrics.cpp @@ -189,4 +189,32 @@ int ParagraphMetrics::rightMargin(Buffer const & buffer) const return r_margin; } + +int ParagraphMetrics::singleWidth(pos_type pos, Font const & font) const +{ + char_type c = par_->getChar(pos); + + // The most special cases are handled first. + if (c == Paragraph::META_INSET) + return par_->getInset(pos)->width(); + + if (!isPrintable(c)) + return theFontMetrics(font).width(c); + + Language const * language = font.language(); + if (language->rightToLeft()) { + if (language->lang() == "arabic_arabtex" || + language->lang() == "arabic_arabi" || + language->lang() == "farsi") { + if (Encodings::isComposeChar_arabic(c)) + return 0; + c = par_->transformChar(c, pos); + } else if (language->lang() == "hebrew" && + Encodings::isComposeChar_hebrew(c)) + return 0; + } + return theFontMetrics(font).width(c); +} + + } // namespace lyx diff --git a/src/ParagraphMetrics.h b/src/ParagraphMetrics.h index 6d9a3fa828..72666da2cf 100644 --- a/src/ParagraphMetrics.h +++ b/src/ParagraphMetrics.h @@ -74,6 +74,8 @@ public: void updateRowChangeStatus(); /// int rightMargin(Buffer const & buffer) const; + /// + int singleWidth(pos_type pos, Font const & Font) const; /// dump some information to lyxerr void dump() const; diff --git a/src/Text.cpp b/src/Text.cpp index 81f4996ebe..d03cf5bffa 100644 --- a/src/Text.cpp +++ b/src/Text.cpp @@ -361,41 +361,6 @@ double Text::spacing(Buffer const & buffer, } -int Text::singleWidth(Buffer const & buffer, Paragraph const & par, - pos_type pos) const -{ - return singleWidth(par, pos, par.getChar(pos), - getFont(buffer, par, pos)); -} - - -int Text::singleWidth(Paragraph const & par, - pos_type pos, char_type c, Font const & font) const -{ - // The most common case is handled first (Asger) - if (isPrintable(c)) { - Language const * language = font.language(); - if (language->rightToLeft()) { - if (language->lang() == "arabic_arabtex" || - language->lang() == "arabic_arabi" || - language->lang() == "farsi") { - if (Encodings::isComposeChar_arabic(c)) - return 0; - c = par.transformChar(c, pos); - } else if (language->lang() == "hebrew" && - Encodings::isComposeChar_hebrew(c)) - return 0; - } - return theFontMetrics(font).width(c); - } - - if (c == Paragraph::META_INSET) - return par.getInset(pos)->width(); - - return theFontMetrics(font).width(c); -} - - int Text::leftMargin(Buffer const & buffer, int max_width, pit_type pit) const { BOOST_ASSERT(pit >= 0); @@ -1749,7 +1714,7 @@ int Text::cursorX(BufferView const & bv, CursorSlice const & sl, getLabelFont(buffer, par)); x += m.label_hfill + labelfm.width(par.layout()->labelsep); if (par.isLineSeparator(body_pos - 1)) - x -= singleWidth(buffer, par, body_pos - 1); + x -= tm.singleWidth(pit, body_pos - 1); } // Use font span to speed things up, see above @@ -1758,7 +1723,7 @@ int Text::cursorX(BufferView const & bv, CursorSlice const & sl, font = getFont(buffer, par, pos); } - x += singleWidth(par, pos, par.getChar(pos), font); + x += pm.singleWidth(pos, font); if (par.hfillExpansion(row, pos)) x += (pos >= body_pos) ? m.hfill : m.label_hfill; @@ -1769,9 +1734,9 @@ int Text::cursorX(BufferView const & bv, CursorSlice const & sl, // see correction above if (boundary_correction) { if (isRTL(buffer, sl, boundary)) - x -= singleWidth(buffer, par, ppos); + x -= tm.singleWidth(pit, ppos); else - x += singleWidth(buffer, par, ppos); + x += tm.singleWidth(pit, ppos); } return int(x); diff --git a/src/Text.h b/src/Text.h index 2ecaa3449c..ff9e8c2d05 100644 --- a/src/Text.h +++ b/src/Text.h @@ -295,15 +295,6 @@ public: /// \sa BufferView::getCoveringInset() to get the innermost inset. Inset * checkInsetHit(BufferView &, int x, int y); - /// - /// FIXME: move to TextMetrics. - int singleWidth(Buffer const &, Paragraph const & par, - pos_type pos) const; - /// - /// FIXME: move to TextMetrics. - int singleWidth(Paragraph const & par, pos_type pos, char_type c, - Font const & Font) const; - /// return the color of the canvas Color_color backgroundColor() const; diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 84cdac9195..7b10179f24 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -303,7 +303,7 @@ RowMetrics TextMetrics::computeRowMetrics(pit_type const pit, ++nlh; if (nlh && !par.getLabelWidthString().empty()) - result.label_hfill = labelFill(par, row) / double(nlh); + result.label_hfill = labelFill(pit, row) / double(nlh); } // are there any hfills in the row? @@ -395,9 +395,10 @@ RowMetrics TextMetrics::computeRowMetrics(pit_type const pit, } -int TextMetrics::labelFill(Paragraph const & par, Row const & row) const +int TextMetrics::labelFill(pit_type const pit, Row const & row) const { Buffer & buffer = *bv_->buffer(); + Paragraph const & par = text_->getPar(pit); pos_type last = par.beginOfBody(); BOOST_ASSERT(last > 0); @@ -411,7 +412,7 @@ int TextMetrics::labelFill(Paragraph const & par, Row const & row) const int w = 0; for (pos_type i = row.pos(); i <= last; ++i) - w += text_->singleWidth(buffer, par, i); + w += singleWidth(pit, i); docstring const & label = par.params().labelWidthString(); if (label.empty()) @@ -455,6 +456,7 @@ void TextMetrics::rowBreakPoint(int width, pit_type const pit, Row & row) const { Buffer & buffer = *bv_->buffer(); + ParagraphMetrics const & pm = par_metrics_[pit]; Paragraph const & par = text_->getPar(pit); pos_type const end = par.size(); pos_type const pos = row.pos(); @@ -493,8 +495,7 @@ void TextMetrics::rowBreakPoint(int width, pit_type const pit, pos_type point = end; pos_type i = pos; for ( ; i < end; ++i, ++fi) { - char_type const c = par.getChar(i); - int thiswidth = text_->singleWidth(par, i, c, *fi); + int thiswidth = pm.singleWidth(i, *fi); // add the auto-hfill from label end to the body if (body_pos && i == body_pos) { @@ -502,7 +503,7 @@ void TextMetrics::rowBreakPoint(int width, pit_type const pit, text_->getLabelFont(buffer, par)); int add = fm.width(layout->labelsep); if (par.isLineSeparator(i - 1)) - add -= text_->singleWidth(buffer, par, i - 1); + add -= singleWidth(pit, i - 1); add = std::max(add, label_end - x); thiswidth += add; @@ -573,7 +574,7 @@ void TextMetrics::setRowWidth(int right_margin, Buffer & buffer = *bv_->buffer(); // get the pure distance pos_type const end = row.endpos(); - + ParagraphMetrics const & pm = par_metrics_[pit]; Paragraph const & par = text_->getPar(pit); int w = text_->leftMargin(buffer, max_width_, pit, row.pos()); int label_end = labelEnd(pit); @@ -589,11 +590,10 @@ void TextMetrics::setRowWidth(int right_margin, text_->getLabelFont(buffer, par)); w += fm.width(par.layout()->labelsep); if (par.isLineSeparator(i - 1)) - w -= text_->singleWidth(buffer, par, i - 1); + w -= singleWidth(pit, i - 1); w = max(w, label_end); } - char_type const c = par.getChar(i); - w += text_->singleWidth(par, i, c, *fi); + w += pm.singleWidth(i, *fi); } } @@ -602,7 +602,7 @@ void TextMetrics::setRowWidth(int right_margin, text_->getLabelFont(buffer, par)); w += fm.width(par.layout()->labelsep); if (end > 0 && par.isLineSeparator(end - 1)) - w -= text_->singleWidth(buffer, par, end - 1); + w -= singleWidth(pit, end - 1); w = max(w, label_end); } @@ -850,21 +850,21 @@ pos_type TextMetrics::getColumnNearX(pit_type const pit, text_->getLabelFont(buffer, par)); tmpx += r.label_hfill + fm.width(layout->labelsep); if (par.isLineSeparator(body_pos - 1)) - tmpx -= text_->singleWidth(buffer, par, body_pos - 1); + tmpx -= singleWidth(pit, body_pos - 1); } if (par.hfillExpansion(row, c)) { - tmpx += text_->singleWidth(buffer, par, c); + tmpx += singleWidth(pit, c); if (c >= body_pos) tmpx += r.hfill; else tmpx += r.label_hfill; } else if (par.isSeparator(c)) { - tmpx += text_->singleWidth(buffer, par, c); + tmpx += singleWidth(pit, c); if (c >= body_pos) tmpx += r.separator; } else { - tmpx += text_->singleWidth(buffer, par, c); + tmpx += singleWidth(pit, c); } ++vc; } @@ -911,9 +911,9 @@ pos_type TextMetrics::getColumnNearX(pit_type const pit, // Newline inset, air gap below: if (row.pos() < end && c >= end && par.isNewline(end - 1)) { if (bidi.level(end -1) % 2 == 0) - tmpx -= text_->singleWidth(buffer, par, end - 1); + tmpx -= singleWidth(pit, end - 1); else - tmpx += text_->singleWidth(buffer, par, end - 1); + tmpx += singleWidth(pit, end - 1); c = end - 1; } @@ -955,6 +955,15 @@ pos_type TextMetrics::x2pos(pit_type pit, int row, int x) const } +int TextMetrics::singleWidth(pit_type pit, pos_type pos) const +{ + Buffer const & buffer = *bv_->buffer(); + ParagraphMetrics const & pm = par_metrics_[pit]; + + return pm.singleWidth(pos, text_->getFont(buffer, text_->getPar(pit), pos)); +} + + //int Text::pos2x(pit_type pit, pos_type pos) const //{ // ParagraphMetrics const & pm = par_metrics_[pit]; diff --git a/src/TextMetrics.h b/src/TextMetrics.h index ced273ad06..0e9df11111 100644 --- a/src/TextMetrics.h +++ b/src/TextMetrics.h @@ -62,6 +62,8 @@ public: /// int maxWidth() const { return max_width_; } + /// + int singleWidth(pit_type const pit, pos_type pos) const; /// int rightMargin(ParagraphMetrics const & pm) const; @@ -77,7 +79,7 @@ private: ParagraphMetrics & parMetrics(pit_type, bool redo_paragraph); /// the minimum space a manual label needs on the screen in pixels - int labelFill(Paragraph const & par, Row const & row) const; + int labelFill(pit_type const pit, Row const & row) const; /// FIXME?? int labelEnd(pit_type const pit) const; diff --git a/src/rowpainter.cpp b/src/rowpainter.cpp index 1fad8b4e4a..c1402e1c25 100644 --- a/src/rowpainter.cpp +++ b/src/rowpainter.cpp @@ -256,7 +256,7 @@ void RowPainter::paintHebrewComposeChar(pos_type & vpos, Font const & font) c = par_.getChar(i); if (!Encodings::isComposeChar_hebrew(c)) { if (isPrintableNonspace(c)) { - int const width2 = text_.singleWidth(par_, i, c, + int const width2 = pm_.singleWidth(i, text_.getFont(*bv_.buffer(), par_, i)); dx = (c == 0x05e8 || // resh c == 0x05d3) // dalet @@ -290,7 +290,7 @@ void RowPainter::paintArabicComposeChar(pos_type & vpos, Font const & font) c = par_.getChar(i); if (!Encodings::isComposeChar_arabic(c)) { if (isPrintableNonspace(c)) { - int const width2 = text_.singleWidth(par_, i, c, + int const width2 = pm_.singleWidth(i, text_.getFont(*bv_.buffer(), par_, i)); dx = (width2 - width) / 2; } @@ -784,8 +784,7 @@ void RowPainter::paintText() font = text_.getFont(buffer, par_, vpos); } - const int width_pos = - text_.singleWidth(par_, pos, par_.getChar(pos), font); + const int width_pos = pm_.singleWidth(pos, font); if (x_ + width_pos < 0) { x_ += width_pos;