From 971c543b34253e6ded4afdd644fee8ba89df2b05 Mon Sep 17 00:00:00 2001 From: Abdelrazak Younes Date: Tue, 28 Aug 2007 08:57:13 +0000 Subject: [PATCH] - Transfer rowpainter.cpp:paintPar() to TextMetrics::drawParagraph() - move RowPainter class out of the anonymous namespace so that it can be used by TextMetrics::drawParagraph(). git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@19848 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/BufferView.cpp | 6 +- src/TextMetrics.cpp | 91 ++++++++++++++++++++++- src/TextMetrics.h | 4 ++ src/rowpainter.cpp | 171 +------------------------------------------- src/rowpainter.h | 84 ++++++++++++++++++++-- 5 files changed, 180 insertions(+), 176 deletions(-) diff --git a/src/BufferView.cpp b/src/BufferView.cpp index cb59a98575..c5a1375a72 100644 --- a/src/BufferView.cpp +++ b/src/BufferView.cpp @@ -1548,15 +1548,17 @@ void BufferView::draw(frontend::Painter & pain) pain.fillRectangle(0, metrics_info_.y1, width_, metrics_info_.y2 - metrics_info_.y1, text.backgroundColor()); + TextMetrics const & tm = text_metrics_[&text]; + if (select) text.drawSelection(pi, 0, 0); int yy = metrics_info_.y1; // draw contents for (pit_type pit = metrics_info_.p1; pit <= metrics_info_.p2; ++pit) { - ParagraphMetrics const & pm = parMetrics(&text, pit); + ParagraphMetrics const & pm = tm.parMetrics(pit); yy += pm.ascent(); - paintPar(pi, text, pit, 0, yy, repaintAll); + tm.drawParagraph(pi, pit, 0, yy, repaintAll); yy += pm.descent(); } diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index caa6d5de52..1cc4b127a2 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -973,11 +973,100 @@ void TextMetrics::draw(PainterInfo & pi, int x, int y) const for (; it != end; ++it) { ParagraphMetrics const & pmi = it->second; y += pmi.ascent(); - paintPar(pi, *text_, it->first, x, y, true); + drawParagraph(pi, it->first, x, y, true); y += pmi.descent(); } } +namespace { + +bool CursorOnRow(PainterInfo & pi, pit_type const pit, + RowList::const_iterator rit, Text const & text) +{ + // Is there a cursor on this row (or inside inset on row) + Cursor & cur = pi.base.bv->cursor(); + for (size_type d = 0; d < cur.depth(); ++d) { + CursorSlice const & sl = cur[d]; + if (sl.text() == &text + && sl.pit() == pit + && sl.pos() >= rit->pos() + && sl.pos() <= rit->endpos()) + return true; + } + return false; +} + +} // namespace anon + + +void TextMetrics::drawParagraph(PainterInfo & pi, pit_type pit, int x, int y, + bool repaintAll) const +{ +// lyxerr << " paintPar: pit: " << pit << " at y: " << y << endl; + int const ww = bv_->workHeight(); + + bv_->coordCache().parPos()[text_][pit] = Point(x, y); + + ParagraphMetrics const & pm = par_metrics_[pit]; + if (pm.rows().empty()) + return; + + RowList::const_iterator const rb = pm.rows().begin(); + RowList::const_iterator const re = pm.rows().end(); + + Bidi bidi; + + y -= rb->ascent(); + size_type rowno = 0; + for (RowList::const_iterator rit = rb; rit != re; ++rit, ++rowno) { + y += rit->ascent(); + // Row signature; has row changed since last paint? + bool row_has_changed = pm.rowChangeStatus()[rowno]; + + bool cursor_on_row = CursorOnRow(pi, pit, rit, *text_); + + // If selection is on, the current row signature differs + // from cache, or cursor is inside an inset _on this row_, + // then paint the row + if (repaintAll || row_has_changed || cursor_on_row) { + bool const inside = (y + rit->descent() >= 0 + && y - rit->ascent() < ww); + // it is not needed to draw on screen if we are not inside. + pi.pain.setDrawingEnabled(inside); + RowPainter rp(pi, *text_, pit, *rit, bidi, x, y); + // Clear background of this row + // (if paragraph background was not cleared) + if (!repaintAll && row_has_changed) + pi.pain.fillRectangle(x, y - rit->ascent(), + width(), rit->height(), + text_->backgroundColor()); + + // Instrumentation for testing row cache (see also + // 12 lines lower): + if (lyxerr.debugging(Debug::PAINTING)) { + if (text_->isMainText(bv_->buffer())) + LYXERR(Debug::PAINTING) << "#"; + else + LYXERR(Debug::PAINTING) << "[" << + repaintAll << row_has_changed << + cursor_on_row << "]"; + } + rp.paintAppendix(); + rp.paintDepthBar(); + rp.paintChangeBar(); + if (rit == rb) + rp.paintFirst(); + rp.paintText(); + if (rit + 1 == re) + rp.paintLast(); + } + y += rit->descent(); + } + // Re-enable screen drawing for future use of the painter. + pi.pain.setDrawingEnabled(true); + + LYXERR(Debug::PAINTING) << "." << endl; +} //int Text::pos2x(pit_type pit, pos_type pos) const //{ diff --git a/src/TextMetrics.h b/src/TextMetrics.h index 19adbaa30d..4ab6174f1c 100644 --- a/src/TextMetrics.h +++ b/src/TextMetrics.h @@ -73,7 +73,11 @@ public: * the cursor and when creating a visible row */ RowMetrics computeRowMetrics(pit_type pit, Row const & row) const; + /// void draw(PainterInfo & pi, int x, int y) const; + + void drawParagraph(PainterInfo & pi, pit_type pit, int x, int y, + bool repaintAll) const; private: /// diff --git a/src/rowpainter.cpp b/src/rowpainter.cpp index dbd9d0f0e3..d627e82adc 100644 --- a/src/rowpainter.cpp +++ b/src/rowpainter.cpp @@ -43,89 +43,15 @@ #include - -namespace lyx { - -using frontend::Painter; -using frontend::FontMetrics; - using std::endl; using std::max; using std::string; -namespace { - -/** - * A class used for painting an individual row of text. - */ -class RowPainter { -public: - /// initialise and run painter - RowPainter(PainterInfo & pi, Text const & text, - pit_type pit, Row const & row, Bidi & bidi, int x, int y); - - // paint various parts - void paintAppendix(); - void paintDepthBar(); - void paintChangeBar(); - void paintFirst(); - void paintLast(); - void paintText(); - -private: - void paintForeignMark(double orig_x, Font const & font, int desc = 0); - void paintHebrewComposeChar(pos_type & vpos, Font const & font); - void paintArabicComposeChar(pos_type & vpos, Font const & font); - void paintChars(pos_type & vpos, Font const & font, - bool hebrew, bool arabic); - int paintAppendixStart(int y); - void paintFromPos(pos_type & vpos); - void paintInset(pos_type const pos, Font const & font); - - /// return left margin - int leftMargin() const; - - /// return the label font for this row - Font const getLabelFont() const; - - /// bufferview to paint on - BufferView & bv_; - - /// Painter to use - Painter & pain_; - - /// Text for the row - Text const & text_; - TextMetrics & text_metrics_; - ParagraphList const & pars_; - - /// The row to paint - Row const & row_; - - /// Row's paragraph - pit_type const pit_; - Paragraph const & par_; - ParagraphMetrics const & pm_; - - /// bidi cache, comes from outside the rowpainter because - /// rowpainters are normally created in a for loop and there only - /// one of them is active at a time. - Bidi & bidi_; - - /// is row erased? (change tracking) - bool erased_; - - // Looks ugly - is - double const xo_; - int const yo_; // current baseline - double x_; - int width_; - double separator_; - double hfill_; - double label_hfill_; -}; +namespace lyx { +using frontend::Painter; +using frontend::FontMetrics; RowPainter::RowPainter(PainterInfo & pi, Text const & text, pit_type pit, Row const & row, Bidi & bidi, int x, int y) @@ -859,95 +785,4 @@ void RowPainter::paintText() } } - -bool CursorOnRow(PainterInfo & pi, pit_type const pit, - RowList::const_iterator rit, Text const & text) -{ - // Is there a cursor on this row (or inside inset on row) - Cursor & cur = pi.base.bv->cursor(); - for (size_type d = 0; d < cur.depth(); ++d) { - CursorSlice const & sl = cur[d]; - if (sl.text() == &text - && sl.pit() == pit - && sl.pos() >= rit->pos() - && sl.pos() <= rit->endpos()) - return true; - } - return false; -} - -} // namespace anon - - -void paintPar - (PainterInfo & pi, Text const & text, pit_type pit, int x, int y, - bool repaintAll) -{ -// lyxerr << " paintPar: pit: " << pit << " at y: " << y << endl; - int const ww = pi.base.bv->workHeight(); - - pi.base.bv->coordCache().parPos()[&text][pit] = Point(x, y); - - TextMetrics const & tm = pi.base.bv->textMetrics(&text); - ParagraphMetrics const & pm = tm.parMetrics(pit); - if (pm.rows().empty()) - return; - - RowList::const_iterator const rb = pm.rows().begin(); - RowList::const_iterator const re = pm.rows().end(); - - Bidi bidi; - - y -= rb->ascent(); - size_type rowno = 0; - for (RowList::const_iterator rit = rb; rit != re; ++rit, ++rowno) { - y += rit->ascent(); - // Row signature; has row changed since last paint? - bool row_has_changed = pm.rowChangeStatus()[rowno]; - - bool cursor_on_row = CursorOnRow(pi, pit, rit, text); - - // If selection is on, the current row signature differs - // from cache, or cursor is inside an inset _on this row_, - // then paint the row - if (repaintAll || row_has_changed || cursor_on_row) { - bool const inside = (y + rit->descent() >= 0 - && y - rit->ascent() < ww); - // it is not needed to draw on screen if we are not inside. - pi.pain.setDrawingEnabled(inside); - RowPainter rp(pi, text, pit, *rit, bidi, x, y); - // Clear background of this row - // (if paragraph background was not cleared) - if (!repaintAll && row_has_changed) - pi.pain.fillRectangle(x, y - rit->ascent(), - tm.width(), rit->height(), - text.backgroundColor()); - - // Instrumentation for testing row cache (see also - // 12 lines lower): - if (lyxerr.debugging(Debug::PAINTING)) { - if (text.isMainText(pi.base.bv->buffer())) - LYXERR(Debug::PAINTING) << "#"; - else - LYXERR(Debug::PAINTING) << "[" << - repaintAll << row_has_changed << - cursor_on_row << "]"; - } - rp.paintAppendix(); - rp.paintDepthBar(); - rp.paintChangeBar(); - if (rit == rb) - rp.paintFirst(); - rp.paintText(); - if (rit + 1 == re) - rp.paintLast(); - } - y += rit->descent(); - } - // Re-enable screen drawing for future use of the painter. - pi.pain.setDrawingEnabled(true); - - LYXERR(Debug::PAINTING) << "." << endl; -} - } // namespace lyx diff --git a/src/rowpainter.h b/src/rowpainter.h index fab612735b..6a4561835a 100644 --- a/src/rowpainter.h +++ b/src/rowpainter.h @@ -18,17 +18,91 @@ namespace lyx { -class Text; +class Bidi; class BufferView; +class Font; class PainterInfo; +class Paragraph; +class ParagraphList; +class ParagraphMetrics; +class Row; +class Text; +class TextMetrics; class ViewMetricsInfo; namespace frontend { class Painter; } -/// paint paragraph. -void paintPar - (PainterInfo & pi, Text const & text, pit_type pit, int x, int y, - bool repaintAll); +/** + * A class used for painting an individual row of text. + * FIXME: get rid of that class. + */ +class RowPainter { +public: + /// initialise and run painter + RowPainter(PainterInfo & pi, Text const & text, + pit_type pit, Row const & row, Bidi & bidi, int x, int y); + + /// paint various parts + /// FIXME: transfer to TextMetrics + void paintAppendix(); + void paintDepthBar(); + void paintChangeBar(); + void paintFirst(); + void paintLast(); + void paintText(); + +private: + void paintForeignMark(double orig_x, Font const & font, int desc = 0); + void paintHebrewComposeChar(pos_type & vpos, Font const & font); + void paintArabicComposeChar(pos_type & vpos, Font const & font); + void paintChars(pos_type & vpos, Font const & font, + bool hebrew, bool arabic); + int paintAppendixStart(int y); + void paintFromPos(pos_type & vpos); + void paintInset(pos_type const pos, Font const & font); + + /// return left margin + int leftMargin() const; + + /// return the label font for this row + Font const getLabelFont() const; + + /// bufferview to paint on + BufferView & bv_; + + /// Painter to use + frontend::Painter & pain_; + + /// Text for the row + Text const & text_; + TextMetrics & text_metrics_; + ParagraphList const & pars_; + + /// The row to paint + Row const & row_; + + /// Row's paragraph + pit_type const pit_; + Paragraph const & par_; + ParagraphMetrics const & pm_; + + /// bidi cache, comes from outside the rowpainter because + /// rowpainters are normally created in a for loop and there only + /// one of them is active at a time. + Bidi & bidi_; + + /// is row erased? (change tracking) + bool erased_; + + // Looks ugly - is + double const xo_; + int const yo_; // current baseline + double x_; + int width_; + double separator_; + double hfill_; + double label_hfill_; +}; /// some space for drawing the 'nested' markers (in pixel) inline int nestMargin() { return 15; } -- 2.39.2