From 99b64f351e737f9593e96d247b256377f62ca5a5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Andr=C3=A9=20P=C3=B6nitz?= Date: Fri, 18 Jul 2003 07:47:07 +0000 Subject: [PATCH] two-phase-drawing for InsetText & InsetTabular git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@7312 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/ChangeLog | 11 ++++++ src/insets/ChangeLog | 19 +++++++++ src/insets/inset.C | 21 +++------- src/insets/inset.h | 9 +++-- src/insets/insetbibitem.C | 3 +- src/insets/insetcollapsable.C | 30 +++++++------- src/insets/insetcommand.C | 1 + src/insets/insetert.C | 5 ++- src/insets/insetexternal.C | 1 + src/insets/insetgraphics.C | 1 + src/insets/insetinclude.h | 1 - src/insets/insetlatexaccent.C | 5 ++- src/insets/insetlatexaccent.h | 2 - src/insets/insetminipage.C | 8 +++- src/insets/insetnewline.C | 1 + src/insets/insetquotes.C | 1 + src/insets/insetspace.C | 3 +- src/insets/insetspecialchar.C | 1 + src/insets/insettabular.C | 73 ++++++++++++++--------------------- src/insets/insettabular.h | 2 +- src/insets/insettext.C | 16 ++++++-- src/insets/insettext.h | 4 +- src/insets/updatableinset.C | 21 +++++----- src/lyxtext.h | 8 ++-- src/metricsinfo.C | 8 ++-- src/metricsinfo.h | 4 +- src/rowpainter.C | 63 +++++++++++++++--------------- src/text.C | 57 +++++++++++++-------------- src/text2.C | 22 +++++------ src/text3.C | 8 ++-- 30 files changed, 217 insertions(+), 192 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index dd6a846295..70c92ad362 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,14 @@ +2003-07-18 André Pönitz + + * lyxtext.h: + * metricsinfo.C: + * metricsinfo.h: + * rowpainter.C: + * text.C: + * text2.C: + * text3.C: two-phase drawing for InsetText and InsetTabular + some float -> int changes. + 2003-07-18 Alfredo Braunstein * lyx_main.C: fix a crash in batch mode if no files specified diff --git a/src/insets/ChangeLog b/src/insets/ChangeLog index 1f20b4bad0..b1f6fce049 100644 --- a/src/insets/ChangeLog +++ b/src/insets/ChangeLog @@ -1,4 +1,23 @@ +2003-07-18 André Pönitz + + * inset.[Ch]: + * insetbibitem.C: + * insetcollapsable.C: + * insetcommand.C: + * insetert.C: + * insetexternal.C: + * insetgraphics.[Ch]: + * insetlatexaccent.[Ch]: + * insetminipage.C: + * insetnewline.C: + * insetquotes.C: + * insetspace.C: + * insetspecialchar.C: + * insettabular.[Ch]: + * insettext.[Ch]: + * updatableinset.C: two-phase-drawing for InsetText & InsetTabular + 2003-07-17 André Pönitz * insetcollapsable.C: diff --git a/src/insets/inset.C b/src/insets/inset.C index 82f19f801c..49b657f946 100644 --- a/src/insets/inset.C +++ b/src/insets/inset.C @@ -142,28 +142,19 @@ int Inset::latexTextWidth(BufferView * bv) const } -int Inset::ascent(BufferView * bv, LyXFont const & font) const +int Inset::ascent() const { - Dimension dim; - MetricsInfo mi(bv, font); - metrics(mi, dim); - return dim.ascent(); + return dim_.asc; } -int Inset::descent(BufferView * bv, LyXFont const & font) const +int Inset::descent() const { - Dimension dim; - MetricsInfo mi(bv, font); - metrics(mi, dim); - return dim.descent(); + return dim_.des; } -int Inset::width(BufferView * bv, LyXFont const & font) const +int Inset::width() const { - Dimension dim; - MetricsInfo mi(bv, font); - metrics(mi, dim); - return dim.width(); + return dim_.wid; } diff --git a/src/insets/inset.h b/src/insets/inset.h index f5c9635678..64dc72012a 100644 --- a/src/insets/inset.h +++ b/src/insets/inset.h @@ -17,6 +17,7 @@ #include "LColor.h" #include "insetbase.h" +#include "dimension.h" #include "support/types.h" #include @@ -157,11 +158,11 @@ public: /// Inset(Inset const & in); /// - int ascent(BufferView *, LyXFont const &) const; + int ascent() const; /// - int descent(BufferView *, LyXFont const &) const; + int descent() const; /// - int width(BufferView *, LyXFont const &) const; + int width() const; /// what appears in the minibuffer when opening virtual string const editMessage() const; /// @@ -331,6 +332,8 @@ protected: unsigned int id_; /// static unsigned int inset_id; + /// + mutable Dimension dim_; private: /// diff --git a/src/insets/insetbibitem.C b/src/insets/insetbibitem.C index b9698e3d03..12d1a4ad88 100644 --- a/src/insets/insetbibitem.C +++ b/src/insets/insetbibitem.C @@ -141,7 +141,8 @@ int bibitemMaxWidth(BufferView * bv, LyXFont const & font) ParagraphList::iterator end = bv->buffer()->paragraphs.end(); for (; it != end; ++it) { if (it->bibitem()) { - int const wx = it->bibitem()->width(bv, font); +#warning metrics broken! + int const wx = it->bibitem()->width(); if (wx > w) w = wx; } diff --git a/src/insets/insetcollapsable.C b/src/insets/insetcollapsable.C index e68267c85d..3adf4c17ef 100644 --- a/src/insets/insetcollapsable.C +++ b/src/insets/insetcollapsable.C @@ -129,13 +129,15 @@ int InsetCollapsable::height_collapsed() const void InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const { + //lyxerr << "InsetCollapsable::metrics: width: " << mi.base.textwidth << "\n"; dimension_collapsed(dim); - if (collapsed_) - return; - Dimension insetdim; - inset.metrics(mi, insetdim); - dim.des += insetdim.height() + TEXT_TO_BOTTOM_OFFSET; - dim.wid = max(dim.wid, insetdim.wid); + if (!collapsed_) { + Dimension insetdim; + inset.metrics(mi, insetdim); + dim.des += insetdim.height() + TEXT_TO_BOTTOM_OFFSET; + dim.wid = max(dim.wid, insetdim.wid); + } + dim_ = dim; } @@ -156,7 +158,7 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y, bool inlined) const Dimension dim_collapsed; dimension_collapsed(dim_collapsed); - int const aa = ascent(pi.base.bv, pi.base.font); + int const aa = ascent(); button_length = dim_collapsed.width(); button_top_y = -aa; button_bottom_y = -aa + dim_collapsed.height(); @@ -180,8 +182,7 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y, bool inlined) const inset.draw(pi, x, y); } else { draw_collapsed(pi, old_x, bl); - int const yy = bl + dim_collapsed.descent() - + inset.ascent(pi.base.bv, pi.base.font); + int const yy = bl + dim_collapsed.descent() + inset.ascent(); inset.draw(pi, x, yy); } } @@ -221,10 +222,8 @@ void InsetCollapsable::insetUnlock(BufferView * bv) FuncRequest InsetCollapsable::adjustCommand(FuncRequest const & cmd) { - LyXFont font(LyXFont::ALL_SANE); FuncRequest cmd1 = cmd; - cmd1.y = ascent(cmd.view(), font) + cmd.y - - (height_collapsed() + inset.ascent(cmd.view(), font)); + cmd1.y = ascent() + cmd.y - (height_collapsed() + inset.ascent()); return cmd1; } @@ -341,9 +340,7 @@ Inset::RESULT InsetCollapsable::localDispatch(FuncRequest const & cmd) if (cmd.y <= button_bottom_y) { cmd1.y = 0; } else { - LyXFont font(LyXFont::ALL_SANE); - cmd1.y = ascent(bv, font) + cmd.y - - (height_collapsed() + inset.ascent(bv, font)); + cmd1.y = ascent() + cmd.y - (height_collapsed() + inset.ascent()); } inset.localDispatch(cmd); } @@ -465,8 +462,7 @@ void InsetCollapsable::deleteLyXText(BufferView * bv, bool recursive) const void InsetCollapsable::resizeLyXText(BufferView * bv, bool force) const { inset.resizeLyXText(bv, force); - LyXFont font(LyXFont::ALL_SANE); - oldWidth = width(bv, font); + oldWidth = width(); } diff --git a/src/insets/insetcommand.C b/src/insets/insetcommand.C index b6561066ed..f6583849e6 100644 --- a/src/insets/insetcommand.C +++ b/src/insets/insetcommand.C @@ -47,6 +47,7 @@ void InsetCommand::metrics(MetricsInfo & mi, Dimension & dim) const editable() != NOT_EDITABLE); } button_.metrics(mi, dim); + dim_ = dim; } diff --git a/src/insets/insetert.C b/src/insets/insetert.C index 9ac0dbe808..0a635c911d 100644 --- a/src/insets/insetert.C +++ b/src/insets/insetert.C @@ -297,9 +297,9 @@ bool InsetERT::lfunMouseRelease(FuncRequest const & cmd) (cmd.y >= button_top_y) && (cmd.y <= button_bottom_y)) { updateStatus(bv, true); } else { - LyXFont font(LyXFont::ALL_SANE); FuncRequest cmd1 = cmd; - cmd1.y = ascent(bv, font) + cmd.y - inset.ascent(bv, font); +#warning metrics? + cmd1.y = ascent() + cmd.y - inset.ascent(); // inlined is special - the text appears above // button_bottom_y @@ -554,6 +554,7 @@ void InsetERT::metrics(MetricsInfo & mi, Dimension & dim) const inset.metrics(mi, dim); else InsetCollapsable::metrics(mi, dim); + dim_ = dim; } diff --git a/src/insets/insetexternal.C b/src/insets/insetexternal.C index bd0c1177ec..4683130594 100644 --- a/src/insets/insetexternal.C +++ b/src/insets/insetexternal.C @@ -170,6 +170,7 @@ dispatch_result InsetExternal::localDispatch(FuncRequest const & cmd) void InsetExternal::metrics(MetricsInfo & mi, Dimension & dim) const { renderer_->metrics(mi, dim); + dim_ = dim; } diff --git a/src/insets/insetgraphics.C b/src/insets/insetgraphics.C index 9a60febe9f..17923ea174 100644 --- a/src/insets/insetgraphics.C +++ b/src/insets/insetgraphics.C @@ -204,6 +204,7 @@ dispatch_result InsetGraphics::localDispatch(FuncRequest const & cmd) void InsetGraphics::metrics(MetricsInfo & mi, Dimension & dim) const { graphic_->metrics(mi, dim); + dim_ = dim; } diff --git a/src/insets/insetinclude.h b/src/insets/insetinclude.h index 160c2a8931..19a14d2807 100644 --- a/src/insets/insetinclude.h +++ b/src/insets/insetinclude.h @@ -133,7 +133,6 @@ private: boost::scoped_ptr const preview_; /// cache - mutable Dimension dim_; mutable bool set_label_; mutable ButtonRenderer button_; }; diff --git a/src/insets/insetlatexaccent.C b/src/insets/insetlatexaccent.C index 76223c833d..a41deb33a9 100644 --- a/src/insets/insetlatexaccent.C +++ b/src/insets/insetlatexaccent.C @@ -404,7 +404,8 @@ void InsetLatexAccent::draw(PainterInfo & pi, int x, int baseline) const // closer to the top of the dot-less 'i' or 'j'. char tmpic = ic; // store the ic when we ic = 'x'; // calculates the ascent of - int asc = ascent(bv, font); // the dot-less version (here: 'x') +#warning metrics? + int asc = ascent(); // the dot-less version (here: 'x') ic = tmpic; // set the orig ic back y = baseline - asc; // update to new y coord. } @@ -473,7 +474,7 @@ void InsetLatexAccent::draw(PainterInfo & pi, int x, int baseline) const case CIRCLE: // circle { - LyXFont tmpf(font); + LyXFont tmpf = font; tmpf.decSize().decSize(); pi.pain.text(int(x2 - (font_metrics::rbearing(0xB0, tmpf) - font_metrics::lbearing(0xB0, tmpf)) / 2.0), int(baseline - font_metrics::ascent(ic, font) - font_metrics::descent(0xB0, tmpf) - (font_metrics::ascent(0xB0, tmpf) + font_metrics::descent(0xB0, tmpf)) / 3.0), diff --git a/src/insets/insetlatexaccent.h b/src/insets/insetlatexaccent.h index 2aaab8dbb9..0df84768fc 100644 --- a/src/insets/insetlatexaccent.h +++ b/src/insets/insetlatexaccent.h @@ -129,8 +129,6 @@ private: bool plusdesc; /// international char mutable char ic; - /// - mutable Dimension dim_; }; diff --git a/src/insets/insetminipage.C b/src/insets/insetminipage.C index 69e84c7cd0..cc8a22cce4 100644 --- a/src/insets/insetminipage.C +++ b/src/insets/insetminipage.C @@ -24,6 +24,7 @@ #include "lyxlex.h" #include "lyxtext.h" #include "Lsstream.h" +#include "metricsinfo.h" #include "frontends/LyXView.h" #include "frontends/Dialogs.h" @@ -220,7 +221,9 @@ void InsetMinipage::metrics(MetricsInfo & mi, Dimension & dim) const dimension_collapsed(dim); else { Dimension d; - InsetCollapsable::metrics(mi, d); + MetricsInfo m = mi; + m.base.textwidth = params_.width.inPixels(mi.base.textwidth); + InsetCollapsable::metrics(m, d); switch (params_.pos) { case top: dim.asc = d.asc; @@ -237,6 +240,7 @@ void InsetMinipage::metrics(MetricsInfo & mi, Dimension & dim) const } dim.wid = d.wid; } + dim_ = dim; } @@ -347,7 +351,7 @@ void InsetMinipageMailer::string2params(string const & in, return; istringstream data(STRCONV(in)); - LyXLex lex(0,0); + LyXLex lex(0, 0); lex.setStream(data); if (lex.isOK()) { diff --git a/src/insets/insetnewline.C b/src/insets/insetnewline.C index d3cc33a0db..40d3596278 100644 --- a/src/insets/insetnewline.C +++ b/src/insets/insetnewline.C @@ -44,6 +44,7 @@ void InsetNewline::metrics(MetricsInfo & mi, Dimension & dim) const dim.asc = font_metrics::maxAscent(font); dim.des = font_metrics::maxDescent(font); dim.wid = font_metrics::width('n', font); + dim_ = dim; } diff --git a/src/insets/insetquotes.C b/src/insets/insetquotes.C index 14097c37de..b7f34d98c8 100644 --- a/src/insets/insetquotes.C +++ b/src/insets/insetquotes.C @@ -189,6 +189,7 @@ void InsetQuotes::metrics(MetricsInfo & mi, Dimension & dim) const else dim.wid += font_metrics::width(',', font); } + dim_ = dim; } diff --git a/src/insets/insetspace.C b/src/insets/insetspace.C index 5cee67dcd4..f17e374418 100644 --- a/src/insets/insetspace.C +++ b/src/insets/insetspace.C @@ -71,12 +71,13 @@ void InsetSpace::metrics(MetricsInfo & mi, Dimension & dim) const dim.wid = 10; break; } + dim_ = dim; } void InsetSpace::draw(PainterInfo & pi, int x, int y) const { - int const w = width(pi.base.bv, pi.base.font); + int const w = width(); int const h = font_metrics::ascent('x', pi.base.font); int xp[4], yp[4]; diff --git a/src/insets/insetspecialchar.C b/src/insets/insetspecialchar.C index 194d2d5e9d..61fc798a7e 100644 --- a/src/insets/insetspecialchar.C +++ b/src/insets/insetspecialchar.C @@ -56,6 +56,7 @@ void InsetSpecialChar::metrics(MetricsInfo & mi, Dimension & dim) const dim.wid = font_metrics::width(s, font); if (kind_ == HYPHENATION && dim.wid > 5) dim.wid -= 2; // to make it look shorter + dim_ = dim; } diff --git a/src/insets/insettabular.C b/src/insets/insettabular.C index 35f367743c..25bd89c1f8 100644 --- a/src/insets/insettabular.C +++ b/src/insets/insettabular.C @@ -263,33 +263,18 @@ void InsetTabular::metrics(MetricsInfo & mi, Dimension & dim) const Assert(0); } - calculate_dimensions_of_cells(mi.base.bv); - //lyxerr << "InsetTabular::metrics, bv: " << mi.base.bv << endl; - for (int i = 0; i < tabular.getNumberOfCells(); ++i) { - LyXTabular::cellstruct * ci = tabular.cellinfo_of_cell(i); - int col = tabular.column_of_cell(i); - InsetText & cell = ci->inset; - cell.text_.bv_owner = mi.base.bv; - int wid = tabular.column_info[col].p_width.inPixels(mi.base.textwidth); - //lyxerr << " " << i << " - " << ci->width_of_cell << " - " - // << tabular.column_info[col].width_of_column << " - " - // << wid << " "; - MetricsInfo m = mi; - m.base.textwidth = wid; - Dimension d; - cell.metrics(m, d); - } - //lyxerr << endl; + calculate_dimensions_of_cells(mi); dim.asc = tabular.getAscentOfRow(0); dim.des = tabular.getHeightOfTabular() - tabular.getAscentOfRow(0) + 1; dim.wid = tabular.getWidthOfTabular() + 2 * ADD_TO_TABULAR_WIDTH; + dim_ = dim; } void InsetTabular::draw(PainterInfo & pi, int x, int y) const { - lyxerr << "InsetTabular::draw: " << x << " " << y << "\n"; + //lyxerr << "InsetTabular::draw: " << x << " " << y << "\n"; if (nodraw()) { need_update = FULL; return; @@ -454,9 +439,6 @@ void InsetTabular::insetUnlock(BufferView * bv) void InsetTabular::updateLocal(BufferView * bv, UpdateCodes what) const { lyxerr << "InsetTabular::updateLocal: " << what << "\n"; - if (what == INIT) { - calculate_dimensions_of_cells(bv); - } if (!locked && what == CELL) what = FULL; if (need_update < what) // only set this if it has greater update @@ -1246,30 +1228,31 @@ void InsetTabular::validate(LaTeXFeatures & features) const } -void InsetTabular::calculate_dimensions_of_cells(BufferView * bv) const +void InsetTabular::calculate_dimensions_of_cells(MetricsInfo & mi) const { - // FIXME: since InsetText ignores this anyway, it doesn't - // matter what we pass it. Ugly - LyXFont font; - +#if 1 // if we have a locking_inset we should have to check only this cell for - // change so I'll try this to have a boost, but who knows ;) + // change so I'll try this to have a boost, but who knows ;) (Jug?) + // This is _really_ important (André) if (need_update != INIT && the_locking_inset == tabular.getCellInset(actcell)) { int maxAsc = 0; int maxDesc = 0; - for(int i = 0; i < tabular.columns(); ++i) { + for (int j = 0; j < tabular.columns(); ++j) { Dimension dim; - MetricsInfo mi(bv, font); - tabular.getCellInset(actrow, i)->metrics(mi, dim); - maxAsc = max(dim.asc, maxAsc); + MetricsInfo m = mi; + m.base.textwidth = + tabular.column_info[j].p_width.inPixels(mi.base.textwidth); + tabular.getCellInset(actrow, j)->metrics(m, dim); + maxAsc = max(dim.asc, maxAsc); maxDesc = max(dim.des, maxDesc); } - tabular.setWidthOfCell(actcell, the_locking_inset->width(bv, font)); + tabular.setWidthOfCell(actcell, the_locking_inset->width()); tabular.setAscentOfRow(actrow, maxAsc + ADD_TO_HEIGHT); tabular.setDescentOfRow(actrow, maxDesc + ADD_TO_HEIGHT); return; } +#endif int cell = -1; bool changed = false; @@ -1281,17 +1264,19 @@ void InsetTabular::calculate_dimensions_of_cells(BufferView * bv) const continue; ++cell; Dimension dim; - MetricsInfo mi(bv, font); - tabular.getCellInset(cell)->metrics(mi, dim); - maxAsc = max(maxAsc, dim.asc); + MetricsInfo m = mi; + m.base.textwidth = + tabular.column_info[j].p_width.inPixels(mi.base.textwidth); + tabular.getCellInset(cell)->metrics(m, dim); + maxAsc = max(maxAsc, dim.asc); maxDesc = max(maxDesc, dim.des); changed = tabular.setWidthOfCell(cell, dim.wid) || changed; } changed = tabular.setAscentOfRow(i, maxAsc + ADD_TO_HEIGHT) || changed; changed = tabular.setDescentOfRow(i, maxDesc + ADD_TO_HEIGHT) || changed; } - if (changed) - tabular.reinit(); + //if (changed) + // tabular.reinit(); } @@ -2051,15 +2036,15 @@ void InsetTabular::tabularFeatures(BufferView * bv, } -bool InsetTabular::activateCellInset(BufferView * bv, int x, int y, mouse_button::state button, - bool behind) +bool InsetTabular::activateCellInset(BufferView * bv, int x, int y, + mouse_button::state button, bool behind) { UpdatableInset * inset = static_cast(tabular.getCellInset(actcell)); - LyXFont font(LyXFont::ALL_SANE); if (behind) { - x = inset->x() + inset->width(bv, font); - y = inset->descent(bv, font); +#warning metrics? + x = inset->x() + inset->width(); + y = inset->descent(); } //inset_x = cursor.x() - top_x + tabular.getBeginningOfTextInCell(actcell); //inset_y = cursor.y(); @@ -2083,8 +2068,8 @@ bool InsetTabular::activateCellInsetAbs(BufferView * bv, int x, int y, bool InsetTabular::insetHit(BufferView *, int x, int) const { - return (x + top_x) - > (cursor_.x() + tabular.getBeginningOfTextInCell(actcell)); + return x + top_x + > cursor_.x() + tabular.getBeginningOfTextInCell(actcell); } diff --git a/src/insets/insettabular.h b/src/insets/insettabular.h index 9b2347a3d1..6b4e735aef 100644 --- a/src/insets/insettabular.h +++ b/src/insets/insettabular.h @@ -240,7 +240,7 @@ private: /// void lfunMouseMotion(FuncRequest const &); /// - void calculate_dimensions_of_cells(BufferView *) const; + void calculate_dimensions_of_cells(MetricsInfo & mi) const; /// void drawCellLines(Painter &, int x, int baseline, int row, int cell) const; diff --git a/src/insets/insettext.C b/src/insets/insettext.C index 5b35e1cd0d..7b6378411a 100644 --- a/src/insets/insettext.C +++ b/src/insets/insettext.C @@ -152,12 +152,14 @@ InsetText & InsetText::operator=(InsetText const & it) void InsetText::init(InsetText const * ins) { if (ins) { + textwidth_ = ins->textwidth_; text_.bv_owner = ins->text_.bv_owner; setParagraphData(ins->paragraphs); autoBreakRows = ins->autoBreakRows; drawFrame_ = ins->drawFrame_; frame_color = ins->frame_color; } else { + textwidth_ = 0; // unbounded drawFrame_ = NEVER; frame_color = LColor::insetframe; autoBreakRows = false; @@ -274,7 +276,10 @@ void InsetText::read(Buffer const * buf, LyXLex & lex) void InsetText::metrics(MetricsInfo & mi, Dimension & dim) const { - //lyxerr << "InsetText::metrics: width: " << mi.base.textwidth << "\n"; + //lyxerr << "InsetText::metrics: " << getInsetName() + // << " width: " << mi.base.textwidth << "\n"; + if (mi.base.textwidth) + textwidth_ = mi.base.textwidth; BufferView * bv = mi.base.bv; setViewCache(bv); text_.rebuild(mi.base.textwidth); @@ -288,6 +293,7 @@ void InsetText::metrics(MetricsInfo & mi, Dimension & dim) const int InsetText::textWidth(BufferView * bv, bool fordraw) const { +/* int w = autoBreakRows ? getMaxWidth(bv, this) : -1; if (fordraw) @@ -298,6 +304,10 @@ int InsetText::textWidth(BufferView * bv, bool fordraw) const return -1; return w - 2 * TEXT_TO_INSET_OFFSET; + lyxerr << "InsetText::textWidth: " << getInsetName() + << " " << textwidth_ << endl; +*/ + return textwidth_; } @@ -1866,7 +1876,7 @@ int InsetText::cx(BufferView * bv) const LyXFont font = text_.getFont(bv->buffer(), text_.cursor.par(), text_.cursor.pos()); if (font.isVisibleRightToLeft()) - x -= the_locking_inset->width(bv, font); + x -= the_locking_inset->width(); } return x; } @@ -1879,7 +1889,7 @@ int InsetText::cix(BufferView * bv) const LyXFont font = text_.getFont(bv->buffer(), text_.cursor.par(), text_.cursor.pos()); if (font.isVisibleRightToLeft()) - x -= the_locking_inset->width(bv, font); + x -= the_locking_inset->width(); } return x; } diff --git a/src/insets/insettext.h b/src/insets/insettext.h index ee68e49e44..62e4bfad06 100644 --- a/src/insets/insettext.h +++ b/src/insets/insettext.h @@ -328,8 +328,6 @@ private: /// mutable bool locked; /// - mutable Dimension dim_; - /// mutable int top_y; /// ParagraphList::iterator inset_par; @@ -371,5 +369,7 @@ public: void reinitLyXText() const; /// mutable LyXText text_; + /// + mutable int textwidth_; }; #endif diff --git a/src/insets/updatableinset.C b/src/insets/updatableinset.C index b8489ad5f3..d9ad5d2d10 100644 --- a/src/insets/updatableinset.C +++ b/src/insets/updatableinset.C @@ -73,21 +73,18 @@ void UpdatableInset::scroll(BufferView * bv, float s) const int const workW = bv->workWidth(); int const tmp_top_x = top_x - scx; - if (tmp_top_x > 0 && - (tmp_top_x + width(bv, font)) < workW) + if (tmp_top_x > 0 && tmp_top_x + width() < workW) return; if (s > 0 && top_x > 0) return; - // int mx_scx=abs((width(bv,font) - bv->workWidth())/2); - //int const save_scx = scx; - scx = int(s * workW / 2); // if (!display()) // scx += 20; - if ((tmp_top_x + scx + width(bv, font)) < (workW / 2)) { - scx += (workW / 2) - (tmp_top_x + scx + width(bv, font)); +#warning metrics? + if (tmp_top_x + scx + width() < workW / 2) { + scx += workW / 2 - (tmp_top_x + scx + width()); } } @@ -102,11 +99,11 @@ void UpdatableInset::scroll(BufferView * bv, int offset) const else scx += offset; } else { - LyXFont const font; - if (!scx && (top_x + width(bv, font)) < (bv->workWidth() - 20)) +#warning metrics? + if (!scx && top_x + width() < bv->workWidth() - 20) return; - if ((top_x - scx + offset + width(bv, font)) < (bv->workWidth() - 20)) { - scx = bv->workWidth() - width(bv, font) - top_x + scx - 20; + if (top_x - scx + offset + width() < bv->workWidth() - 20) { + scx += bv->workWidth() - width() - top_x - 20; } else { scx += offset; } @@ -141,7 +138,7 @@ int UpdatableInset::getMaxWidth(BufferView * bv, UpdatableInset const *) const int w; if (owner()) { - w = static_cast(owner())->getMaxWidth(bv, this); + w = owner()->getMaxWidth(bv, this); } else { w = bv->text->workWidth(this); } diff --git a/src/lyxtext.h b/src/lyxtext.h index f967ee8a9c..b7249fed6f 100644 --- a/src/lyxtext.h +++ b/src/lyxtext.h @@ -495,10 +495,10 @@ public: /** this calculates the specified parameters. needed when setting * the cursor and when creating a visible row */ - void prepareToPrint(RowList::iterator row, float & x, - float & fill_separator, - float & fill_hfill, - float & fill_label_hfill, + void prepareToPrint(RowList::iterator row, int & x, + int & fill_separator, + int & fill_hfill, + int & fill_label_hfill, bool bidi = true) const; private: diff --git a/src/metricsinfo.C b/src/metricsinfo.C index 78c251b7d7..8980218c8d 100644 --- a/src/metricsinfo.C +++ b/src/metricsinfo.C @@ -16,9 +16,9 @@ MetricsBase::MetricsBase() -MetricsBase::MetricsBase(BufferView * b, LyXFont const & f) +MetricsBase::MetricsBase(BufferView * b, LyXFont const & f, int w) : bv(b), font(f), style(LM_ST_TEXT), fontname("mathnormal"), - restrictwidth(false), textwidth(0) + restrictwidth(false), textwidth(w) {} @@ -27,8 +27,8 @@ MetricsInfo::MetricsInfo() {} -MetricsInfo::MetricsInfo(BufferView * bv, LyXFont const & font) - : base(bv, font) +MetricsInfo::MetricsInfo(BufferView * bv, LyXFont const & font, int textwidth) + : base(bv, font, textwidth) {} diff --git a/src/metricsinfo.h b/src/metricsinfo.h index 512a5a26ba..f48e6bd4d3 100644 --- a/src/metricsinfo.h +++ b/src/metricsinfo.h @@ -28,7 +28,7 @@ struct MetricsBase { /// MetricsBase(); /// - MetricsBase(BufferView * bv, LyXFont const & font); + MetricsBase(BufferView * bv, LyXFont const & font, int textwidth); /// the current view BufferView * bv; @@ -53,7 +53,7 @@ struct MetricsInfo { /// MetricsInfo(); /// - MetricsInfo(BufferView * bv, LyXFont const & font); + MetricsInfo(BufferView * bv, LyXFont const & font, int textwidth); /// MetricsBase base; diff --git a/src/rowpainter.C b/src/rowpainter.C index 92000456b5..dfdac82d68 100644 --- a/src/rowpainter.C +++ b/src/rowpainter.C @@ -74,7 +74,7 @@ private: void paintChangeBar(); void paintFirst(); void paintLast(); - void paintForeignMark(float const orig_x, LyXFont const & orig_font); + void paintForeignMark(int orig_x, LyXFont const & orig_font); void paintHebrewComposeChar(lyx::pos_type & vpos); void paintArabicComposeChar(lyx::pos_type & vpos); void paintChars(lyx::pos_type & vpos, bool hebrew, bool arabic); @@ -118,12 +118,12 @@ private: // Looks ugly - is int xo_; int yo_; - float x_; + int x_; int y_; int width_; - float separator_; - float hfill_; - float label_hfill_; + int separator_; + int hfill_; + int label_hfill_; }; RowPainter::RowPainter(BufferView const & bv, LyXText const & text, @@ -178,11 +178,15 @@ void RowPainter::paintInset(pos_type const pos) Assert(inset); + MetricsInfo mi(perv(bv_), getFont(pos), text_.workWidth()); + Dimension dim; + inset->metrics(mi, dim); + PainterInfo pi(perv(bv_)); pi.base.font = getFont(pos); - int const w = inset->width(perv(bv_), pi.base.font); +#warning metrics? inset->draw(pi, int(x_), yo_ + row_->baseline()); - x_ += w; + x_ += dim.wid; } @@ -310,7 +314,7 @@ void RowPainter::paintChars(pos_type & vpos, bool hebrew, bool arabic) } -void RowPainter::paintForeignMark(float const orig_x, LyXFont const & orig_font) +void RowPainter::paintForeignMark(int orig_x, LyXFont const & orig_font) { if (!lyxrc.mark_foreign_language) return; @@ -330,7 +334,7 @@ void RowPainter::paintFromPos(pos_type & vpos) LyXFont const & orig_font = getFont(pos); - float const orig_x = x_; + int const orig_x = x_; char const c = pit_->getChar(pos); @@ -430,11 +434,11 @@ void RowPainter::paintSelection() pos_type const body_pos = pit_->beginningOfBody(); pos_type const last = lastPrintablePos(text_, row_); - float tmpx = x_; + int tmpx = x_; for (pos_type vpos = row_->pos(); vpos <= last; ++vpos) { pos_type pos = text_.vis2log(vpos); - float const old_tmpx = tmpx; + int const old_tmpx = tmpx; if (body_pos > 0 && pos == body_pos - 1) { LyXLayout_ptr const & layout = pit_->layout(); LyXFont const lfont = getLabelFont(); @@ -714,7 +718,7 @@ void RowPainter::paintFirst() y_top += asc; - int const w = (text_.isInInset() ? text_.inset_owner->width(perv(bv_), font) : ww); + int const w = (text_.isInInset() ? text_.inset_owner->width() : ww); int const xp = static_cast(text_.isInInset() ? xo_ : 0); pain_.line(xp, yo_ + y_top, xp + w, yo_ + y_top, LColor::topline, Painter::line_solid, @@ -733,7 +737,7 @@ void RowPainter::paintFirst() LyXFont font = getLabelFont(); if (!pit_->getLabelstring().empty()) { - float x = x_; + int x = x_; string const str = pit_->getLabelstring(); // this is special code for the chapter layout. This is @@ -757,7 +761,7 @@ void RowPainter::paintFirst() font_metrics::width(str, font); } - pain_.text(int(x), + pain_.text(x, yo_ + row_->baseline() - row_->ascent_of_text() - maxdesc, str, font); @@ -771,7 +775,7 @@ void RowPainter::paintFirst() - font_metrics::width(str, font); } - pain_.text(int(x), yo_ + row_->baseline(), str, font); + pain_.text(x, yo_ + row_->baseline(), str, font); } } @@ -795,7 +799,7 @@ void RowPainter::paintFirst() int(font_metrics::maxDescent(font) * layout->spacing.getValue() * spacing_val + (layout->labelbottomsep * defaultRowHeight())); - float x = x_; + int x = x_; if (layout->labeltype == LABEL_CENTERED_TOP_ENVIRONMENT) { x = ((is_rtl ? leftMargin() : x_) + ww - text_.rightMargin(*bv_.buffer(), *row_)) / 2; @@ -804,7 +808,7 @@ void RowPainter::paintFirst() x = ww - leftMargin() - font_metrics::width(str, font); } - pain_.text(int(x), yo_ + row_->baseline() + pain_.text(x, yo_ + row_->baseline() - row_->ascent_of_text() - maxdesc, str, font); } @@ -842,7 +846,7 @@ void RowPainter::paintLast() y_bottom -= asc; - int const w = (text_.isInInset() ? text_.inset_owner->width(perv(bv_), font) : ww); + int const w = text_.isInInset() ? text_.inset_owner->width() : ww; int const xp = static_cast(text_.isInInset() ? xo_ : 0); int const y = yo_ + y_bottom; pain_.line(xp, y, xp + w, y, LColor::topline, Painter::line_solid, @@ -879,7 +883,7 @@ void RowPainter::paintLast() LyXFont font = getLabelFont(); string const & str = pit_->layout()->endlabelstring(); int const x = is_rtl ? - int(x_) - font_metrics::width(str, font) + x_ - font_metrics::width(str, font) : ww - text_.rightMargin(*bv_.buffer(), *row_) - row_->fill(); pain_.text(x, yo_ + row_->baseline(), str, font); break; @@ -904,7 +908,7 @@ void RowPainter::paintText() bool running_strikeout = false; bool is_struckout = false; - float last_strikeout_x = 0.0; + int last_strikeout_x = 0; pos_type vpos = row_->pos(); while (vpos <= last) { @@ -938,7 +942,7 @@ void RowPainter::paintText() if (running_strikeout && (highly_editable_inset || !is_struckout)) { int const middle = yo_ + row_->top_of_text() + ((row_->baseline() - row_->top_of_text()) / 2); - pain_.line(int(last_strikeout_x), middle, int(x_), middle, + pain_.line(last_strikeout_x, middle, x_, middle, LColor::strikeout, Painter::line_solid, Painter::line_thin); running_strikeout = false; } @@ -957,28 +961,25 @@ void RowPainter::paintText() int const y0 = yo_ + row_->baseline(); int const y1 = y0 - defaultRowHeight() / 2; - pain_.line(int(x_), y1, int(x_), y0, + pain_.line(x_, y1, x_, y0, LColor::added_space); if (hfillExpansion(text_, row_, pos)) { int const y2 = (y0 + y1) / 2; if (pos >= body_pos) { - pain_.line(int(x_), y2, - int(x_ + hfill_), y2, + pain_.line(x_, y2, x_ + hfill_, y2, LColor::added_space, Painter::line_onoffdash); x_ += hfill_; } else { - pain_.line(int(x_), y2, - int(x_ + label_hfill_), y2, + pain_.line(x_, y2, + x_ + label_hfill_, y2, LColor::added_space, Painter::line_onoffdash); x_ += label_hfill_; } - pain_.line(int(x_), y1, - int(x_), y0, - LColor::added_space); + pain_.line(x_, y1, x_, y0, LColor::added_space); } x_ += 2; ++vpos; @@ -996,7 +997,7 @@ void RowPainter::paintText() if (running_strikeout) { int const middle = yo_ + row_->top_of_text() + ((row_->baseline() - row_->top_of_text()) / 2); - pain_.line(int(last_strikeout_x), middle, int(x_), middle, + pain_.line(last_strikeout_x, middle, x_, middle, LColor::strikeout, Painter::line_solid, Painter::line_thin); running_strikeout = false; } @@ -1059,7 +1060,7 @@ int getLengthMarkerHeight(BufferView const & bv, VSpace const & vsp) return 0; int const arrow_size = 4; - int const space_size = int(vsp.inPixels(bv)); + int const space_size = vsp.inPixels(bv); LyXFont font; font.decSize(); diff --git a/src/text.C b/src/text.C index f7a698e0ea..c8f8cbebe9 100644 --- a/src/text.C +++ b/src/text.C @@ -322,13 +322,12 @@ int LyXText::singleWidth(ParagraphList::iterator pit, // should be changed! (Jug 20011204) //tmpinset->update(bv()); Dimension dim; - MetricsInfo mi; - mi.base.bv = bv(); - mi.base.font = font; + MetricsInfo mi(bv(), font, workWidth()); tmpinset->metrics(mi, dim); -#endif - //return tmpinset->width(bv(), font); return dim.wid; +#else + return tmpinset->width(); +#endif } return 0; } @@ -1084,18 +1083,20 @@ void LyXText::setHeightOfRow(RowList::iterator rit) tmpfont = getFont(bv()->buffer(), pit, pos); tmpinset = pit->getInset(pos); if (tmpinset) { -#if 1 // this is needed for deep update on initialitation +#if 0 // this is needed for deep update on initialitation #warning inset->update FIXME //tmpinset->update(bv()); Dimension dim; - MetricsInfo mi; - mi.base.bv = bv(); - mi.base.font = tmpfont; + MetricsInfo mi(bv(), tmpfont, workWidth()); tmpinset->metrics(mi, dim); -#endif maxwidth += dim.wid; maxasc = max(maxasc, dim.asc); maxdesc = max(maxdesc, dim.des); +#else + maxwidth += tmpinset->width(); + maxasc = max(maxasc, tmpinset->ascent()); + maxdesc = max(maxdesc, tmpinset->descent()); +#endif } } else { maxwidth += singleWidth(pit, pos); @@ -1317,9 +1318,9 @@ void LyXText::setHeightOfRow(RowList::iterator rit) rit->top_of_text(rit->baseline() - font_metrics::maxAscent(font)); - float x = 0; + int x = 0; if (layout->margintype != MARGIN_RIGHT_ADDRESS_BOX) { - float dummy; + int dummy; // this IS needed rit->width(maxwidth); prepareToPrint(rit, x, dummy, dummy, dummy, false); @@ -1826,13 +1827,13 @@ void LyXText::charInserted() } -void LyXText::prepareToPrint(RowList::iterator rit, float & x, - float & fill_separator, - float & fill_hfill, - float & fill_label_hfill, +void LyXText::prepareToPrint(RowList::iterator rit, int & x, + int & fill_separator, + int & fill_hfill, + int & fill_label_hfill, bool bidi) const { - float w = rit->fill(); + int w = rit->fill(); fill_hfill = 0; fill_label_hfill = 0; fill_separator = 0; @@ -1842,12 +1843,10 @@ void LyXText::prepareToPrint(RowList::iterator rit, float & x, bool const is_rtl = pit->isRightToLeftPar(bv()->buffer()->params); - if (is_rtl) { - x = (workWidth() > 0) - ? rightMargin(*bv()->buffer(), *rit) : 0; - } else - x = (workWidth() > 0) - ? leftMargin(*rit) : 0; + if (is_rtl) + x = workWidth() > 0 ? rightMargin(*bv()->buffer(), *rit) : 0; + else + x = workWidth() > 0 ? leftMargin(*rit) : 0; // is there a manual margin with a manual label LyXLayout_ptr const & layout = pit->layout(); @@ -1855,7 +1854,7 @@ void LyXText::prepareToPrint(RowList::iterator rit, float & x, if (layout->margintype == MARGIN_MANUAL && layout->labeltype == LABEL_MANUAL) { /// We might have real hfills in the label part - float nlh = numberOfLabelHfills(*this, rit); + int nlh = numberOfLabelHfills(*this, rit); // A manual label par (e.g. List) has an auto-hfill // between the label text and the body of the @@ -1866,12 +1865,12 @@ void LyXText::prepareToPrint(RowList::iterator rit, float & x, ++nlh; if (nlh && !pit->getLabelWidthString().empty()) { - fill_label_hfill = labelFill(*rit) / nlh; + fill_label_hfill = int(labelFill(*rit) / nlh); } } // are there any hfills in the row? - float const nh = numberOfHfills(*this, rit); + int const nh = numberOfHfills(*this, rit); if (nh) { if (w > 0) @@ -1879,7 +1878,7 @@ void LyXText::prepareToPrint(RowList::iterator rit, float & x, // we don't have to look at the alignment if it is ALIGN_LEFT and // if the row is already larger then the permitted width as then // we force the LEFT_ALIGN'edness! - } else if (static_cast(rit->width()) < workWidth()) { + } else if (int(rit->width()) < workWidth()) { // is it block, flushleft or flushright? // set x how you need it int align; @@ -1908,7 +1907,7 @@ void LyXText::prepareToPrint(RowList::iterator rit, float & x, switch (align) { case LYX_ALIGN_BLOCK: { - float const ns = numberOfSeparators(*this, rit); + int const ns = numberOfSeparators(*this, rit); RowList::iterator next_row = boost::next(rit); ParagraphList::iterator next_pit = next_row->par(); @@ -2661,6 +2660,7 @@ LyXText::getRow(ParagraphList::iterator pit, pos_type pos) const return rit; } + // returns pointer to a specified row RowList::iterator LyXText::getRow(ParagraphList::iterator pit, pos_type pos, int & y) const @@ -2690,6 +2690,7 @@ LyXText::getRow(ParagraphList::iterator pit, pos_type pos, int & y) const return rit; } + // returns pointer to some fancy row 'below' specified row RowList::iterator LyXText::cursorIRow() const { diff --git a/src/text2.C b/src/text2.C index fb161bc801..79c0211c7f 100644 --- a/src/text2.C +++ b/src/text2.C @@ -1615,10 +1615,10 @@ float LyXText::getCursorX(RowList::iterator rit, pos_type pos, pos_type last, bool boundary) const { pos_type cursor_vpos = 0; - float x; - float fill_separator; - float fill_hfill; - float fill_label_hfill; + int x; + int fill_separator; + int fill_hfill; + int fill_label_hfill; // This call HAS to be here because of the BidiTables!!! prepareToPrint(rit, x, fill_separator, fill_hfill, fill_label_hfill); @@ -1752,13 +1752,12 @@ void LyXText::setCurrentFont() pos_type LyXText::getColumnNearX(RowList::iterator rit, int & x, bool & boundary) const { - float tmpx = 0.0; - float fill_separator; - float fill_hfill; - float fill_label_hfill; + int tmpx = 0; + int fill_separator; + int fill_hfill; + int fill_label_hfill; - prepareToPrint(rit, tmpx, fill_separator, - fill_hfill, fill_label_hfill); + prepareToPrint(rit, tmpx, fill_separator, fill_hfill, fill_label_hfill); pos_type vc = rit->pos(); pos_type last = lastPrintablePos(*this, rit); @@ -1870,7 +1869,8 @@ void LyXText::setCursorFromCoordinates(int x, int y) setCursorFromCoordinates(cursor, x, y); setCurrentFont(); - deleteEmptyParagraphMechanism(old_cursor); +#warning DEPM disabled, otherwise crash when entering new table + //deleteEmptyParagraphMechanism(old_cursor); } diff --git a/src/text3.C b/src/text3.C index 2aee646a7d..936ebe8169 100644 --- a/src/text3.C +++ b/src/text3.C @@ -115,15 +115,15 @@ namespace { LyXFont const & font = text.getFont(bv->buffer(), par, pos); - int const width = inset->width(bv, font); + int const width = inset->width(); int const inset_x = font.isVisibleRightToLeft() ? (cur.ix() - width) : cur.ix(); Box b( inset_x + inset->scroll(), inset_x + width, - cur.iy() - inset->ascent(bv, font), - cur.iy() + inset->descent(bv, font) + cur.iy() - inset->ascent(), + cur.iy() + inset->descent() ); if (!b.contained(x, y)) { @@ -1297,7 +1297,7 @@ Inset::RESULT LyXText::dispatch(FuncRequest const & cmd) LyXCursor cursor = bv->text->cursor; LyXFont font = bv->text->getFont(bv->buffer(), cursor.par(), cursor.pos()); - int width = tli->width(bv, font); + int width = tli->width(); int inset_x = font.isVisibleRightToLeft() ? cursor.ix() - width : cursor.ix(); int start_x = inset_x + tli->scroll(); -- 2.39.5