From 324e5571cafe7838a1d3ecd5cb2b3dd7e8d54bbe Mon Sep 17 00:00:00 2001 From: Guillaume Munch Date: Thu, 29 Sep 2016 20:20:33 +0200 Subject: [PATCH] Fix borders of InsetMathGrid * New virtual functions leftMargin() and rightMargin() to get rid of drawWithMargin() * Factor and rewrite code for borders. * Fix several offset calculations. Known issues: * Borders of multicols look too good and do not correspond to the pdf output. (non-regression) * Bounding box for Hull (Regexp) not pixel-perfect. * Bounding boxes of Diagram, XYmatrix, are too tight when there are borders. Also border should be disabled. (non-regression) --- src/mathed/InsetMathAMSArray.cpp | 3 +- src/mathed/InsetMathAMSArray.h | 5 ++ src/mathed/InsetMathArray.cpp | 11 +--- src/mathed/InsetMathArray.h | 7 +- src/mathed/InsetMathCases.cpp | 11 +--- src/mathed/InsetMathCases.h | 7 +- src/mathed/InsetMathGrid.cpp | 109 +++++++++++++------------------ src/mathed/InsetMathGrid.h | 14 ++-- src/mathed/InsetMathTabular.cpp | 11 +--- src/mathed/InsetMathTabular.h | 6 +- 10 files changed, 80 insertions(+), 104 deletions(-) diff --git a/src/mathed/InsetMathAMSArray.cpp b/src/mathed/InsetMathAMSArray.cpp index 426362dfd7..6ec781c6b0 100644 --- a/src/mathed/InsetMathAMSArray.cpp +++ b/src/mathed/InsetMathAMSArray.cpp @@ -88,7 +88,6 @@ void InsetMathAMSArray::metrics(MetricsInfo & mi, Dimension & dim) const Changer dummy = mi.base.changeStyle(LM_ST_TEXT, mi.base.style == LM_ST_DISPLAY); InsetMathGrid::metrics(mi, dim); - dim.wid += 14; } @@ -101,7 +100,7 @@ void InsetMathAMSArray::draw(PainterInfo & pi, int x, int y) const mathed_draw_deco(pi, x + dim.width() - 8, yy, 5, dim.height(), from_ascii(name_right())); Changer dummy = pi.base.changeStyle(LM_ST_TEXT, pi.base.style == LM_ST_DISPLAY); - InsetMathGrid::drawWithMargin(pi, x, y, 6, 8); + InsetMathGrid::draw(pi, x, y); } diff --git a/src/mathed/InsetMathAMSArray.h b/src/mathed/InsetMathAMSArray.h index ceb3069c28..584397302d 100644 --- a/src/mathed/InsetMathAMSArray.h +++ b/src/mathed/InsetMathAMSArray.h @@ -54,6 +54,11 @@ public: char const * name_left() const; /// char const * name_right() const; + /// + int leftMargin() const { return 6; } //override + /// + int rightMargin() const { return 8; } //override + private: virtual Inset * clone() const; /// diff --git a/src/mathed/InsetMathArray.cpp b/src/mathed/InsetMathArray.cpp index 22f8471bfe..727d45998b 100644 --- a/src/mathed/InsetMathArray.cpp +++ b/src/mathed/InsetMathArray.cpp @@ -77,15 +77,6 @@ void InsetMathArray::metrics(MetricsInfo & mi, Dimension & dim) const Changer dummy = mi.base.changeStyle(LM_ST_TEXT, mi.base.style == LM_ST_DISPLAY); InsetMathGrid::metrics(mi, dim); - dim.wid += 6; -} - - -Dimension const InsetMathArray::dimension(BufferView const & bv) const -{ - Dimension dim = InsetMathGrid::dimension(bv); - dim.wid += 6; - return dim; } @@ -94,7 +85,7 @@ void InsetMathArray::draw(PainterInfo & pi, int x, int y) const setPosCache(pi, x, y); Changer dummy = pi.base.changeStyle(LM_ST_TEXT, pi.base.style == LM_ST_DISPLAY); - InsetMathGrid::drawWithMargin(pi, x, y, 4, 2); + InsetMathGrid::draw(pi, x, y); } diff --git a/src/mathed/InsetMathArray.h b/src/mathed/InsetMathArray.h index 79236882c7..a3875e58b7 100644 --- a/src/mathed/InsetMathArray.h +++ b/src/mathed/InsetMathArray.h @@ -31,8 +31,6 @@ public: /// void metrics(MetricsInfo & mi, Dimension & dim) const; /// - Dimension const dimension(BufferView const &) const; - /// void draw(PainterInfo & pi, int x, int y) const; /// InsetMathArray * asArrayInset() { return this; } @@ -51,6 +49,11 @@ public: void validate(LaTeXFeatures & features) const; /// InsetCode lyxCode() const { return MATH_ARRAY_CODE; } + /// + int leftMargin() const { return 4; } //override + /// + int rightMargin() const { return 2; } //override + private: virtual Inset * clone() const; /// diff --git a/src/mathed/InsetMathCases.cpp b/src/mathed/InsetMathCases.cpp index 10d889555b..f510278708 100644 --- a/src/mathed/InsetMathCases.cpp +++ b/src/mathed/InsetMathCases.cpp @@ -46,15 +46,6 @@ Inset * InsetMathCases::clone() const void InsetMathCases::metrics(MetricsInfo & mi, Dimension & dim) const { InsetMathGrid::metrics(mi, dim); - dim.wid += 8; -} - - -Dimension const InsetMathCases::dimension(BufferView const & bv) const -{ - Dimension dim = InsetMathGrid::dimension(bv); - dim.wid += 8; - return dim; } @@ -62,7 +53,7 @@ void InsetMathCases::draw(PainterInfo & pi, int x, int y) const { Dimension const dim = dimension(*pi.base.bv); mathed_draw_deco(pi, x + 1, y - dim.ascent(), 6, dim.height(), from_ascii("{")); - InsetMathGrid::drawWithMargin(pi, x, y, 8, 0); + InsetMathGrid::draw(pi, x, y); setPosCache(pi, x, y); } diff --git a/src/mathed/InsetMathCases.h b/src/mathed/InsetMathCases.h index 7820922f07..3b44b823ca 100644 --- a/src/mathed/InsetMathCases.h +++ b/src/mathed/InsetMathCases.h @@ -27,8 +27,6 @@ public: /// void metrics(MetricsInfo & mi, Dimension & dim) const; /// - Dimension const dimension(BufferView const &) const; - /// void draw(PainterInfo & pi, int x, int y) const; /// virtual void doDispatch(Cursor & cur, FuncRequest & cmd); @@ -54,6 +52,11 @@ public: InsetCode lyxCode() const { return MATH_CASES_CODE; } /// int displayColSpace(col_type) const; + /// + int leftMargin() const { return 8; } //override + /// + int rightMargin() const { return 0; } //override + private: virtual Inset * clone() const; }; diff --git a/src/mathed/InsetMathGrid.cpp b/src/mathed/InsetMathGrid.cpp index 018c96f8e2..e7e20df68a 100644 --- a/src/mathed/InsetMathGrid.cpp +++ b/src/mathed/InsetMathGrid.cpp @@ -418,7 +418,6 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const rowinfo_[row].ascent_ = asc; rowinfo_[row].descent_ = desc; } - rowinfo_[0].ascent_ += hlinesep() * rowinfo_[0].lines_; rowinfo_[nrows()].ascent_ = 0; rowinfo_[nrows()].descent_ = 0; @@ -482,7 +481,7 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const colinfo_[ncols()].width_ = 0; // compute horizontal offsets - colinfo_[0].offset_ = border(); + colinfo_[0].offset_ = border() + colinfo_[0].lines_ * vlinesep();; for (col_type col = 1; col <= ncols(); ++col) { colinfo_[col].offset_ = colinfo_[col - 1].offset_ + @@ -535,7 +534,7 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const dim.des = rowinfo_[nrows() - 1].offset_ + rowinfo_[nrows() - 1].descent_ + hlinesep() * rowinfo_[nrows()].lines_ - + border(); + + border() + 1; /* @@ -588,20 +587,38 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const cxrow->setBaseline(cxrow->getBaseline() - ascent); } */ + dim.wid += leftMargin() + rightMargin(); metricsMarkers2(dim); // Cache the inset dimension. setDimCache(mi, dim); } -void InsetMathGrid::draw(PainterInfo & pi, int x, int y) const +int InsetMathGrid::vLineHOffset(col_type col, unsigned int line) const { - drawWithMargin(pi, x, y, 1, 1); + if (col < ncols()) + return leftMargin() + colinfo_[col].offset_ + - (colinfo_[col].lines_ - line - 1) * vlinesep() + - vlinesep()/2 - colsep()/2; + else { + LASSERT(col == ncols(), return 0); + return leftMargin() + colinfo_[col-1].offset_ + colinfo_[col-1].width_ + + line * vlinesep() + + vlinesep()/2 + colsep()/2; + } } -void InsetMathGrid::drawWithMargin(PainterInfo & pi, int x, int y, - int lmargin, int rmargin) const +int InsetMathGrid::hLineVOffset(row_type row, unsigned int line) const +{ + return rowinfo_[row].offset_ + - rowinfo_[row].ascent_ + - line * hlinesep() + - hlinesep()/2 - rowsep()/2; +} + + +void InsetMathGrid::draw(PainterInfo & pi, int x, int y) const { Dimension const dim = dimension(*pi.base.bv); BufferView const & bv = *pi.base.bv; @@ -609,68 +626,37 @@ void InsetMathGrid::drawWithMargin(PainterInfo & pi, int x, int y, for (idx_type idx = 0; idx < nargs(); ++idx) { if (cellinfo_[idx].multi_ != CELL_PART_OF_MULTICOLUMN) { cell(idx).draw(pi, - x + lmargin + cellXOffset(bv, idx), - y + cellYOffset(idx)); + x + leftMargin() + cellXOffset(bv, idx), + y + cellYOffset(idx)); - // draw inner lines cell by cell because of possible multicolumns - // FIXME: multicolumn lines are not yet considered - row_type const r = row(idx); - col_type const c = col(idx); - if (r > 0 && r < nrows()) { - for (unsigned int i = 0; i < rowinfo_[r].lines_; ++i) { - int const yy = y + rowinfo_[r].offset_ - - rowinfo_[r].ascent_ - - i * hlinesep() - - hlinesep()/2 - rowsep()/2; - int const xx1 = x + lmargin + colinfo_[c].offset_; - int const xx2 = (c + 1 == ncols()) ? - // last column - xx1 + colinfo_[c].width_ : - // first columns - x + lmargin + colinfo_[c+1].offset_; - pi.pain.line(xx1, yy, xx2, yy, Color_foreground); - } - } - if (c > 0 && c < ncols()) { + row_type r = row(idx); + int const yy1 = y + hLineVOffset(r, 0); + int const yy2 = y + hLineVOffset(r + 1, rowinfo_[r + 1].lines_ - 1); + auto draw_left_borders = [&](col_type c) { for (unsigned int i = 0; i < colinfo_[c].lines_; ++i) { - int const xx = x + lmargin - + colinfo_[c].offset_ - - i * vlinesep() - - vlinesep()/2 - colsep()/2; - int top_offset; - // prevRowHasLine needs to be changed if multicolumn lines are supported - bool const prevRowHasLine(r > 0); - if (prevRowHasLine) - // start from offset of previous row to create a continous line - top_offset = rowinfo_[r - 1].offset_ + rowinfo_[r - 1].descent_; - else - top_offset = rowinfo_[r].offset_- rowinfo_[r].ascent_; - pi.pain.line(xx, y + top_offset, - xx, y + rowinfo_[r].offset_ + rowinfo_[r].descent_, - Color_foreground); + int const xx = x + vLineHOffset(c, i); + pi.pain.line(xx, yy1, xx, yy2, Color_foreground); } - } + }; + col_type c = col(idx); + // Draw inner left borders cell-by-cell because of multicolumns + draw_left_borders(c); + // Draw the right border (only once) + if (c == 0) + draw_left_borders(ncols()); } } - // draw outer lines in one go - for (row_type row = 0; row <= nrows(); row += nrows()) - for (unsigned int i = 0; i < rowinfo_[row].lines_; ++i) { - int yy = y + rowinfo_[row].offset_ - rowinfo_[row].ascent_ - - i * hlinesep() - hlinesep()/2 - rowsep()/2; - pi.pain.line(x + lmargin + 1, yy, - x + dim.width() - rmargin - 1, yy, - Color_foreground); + // Draw horizontal borders + for (row_type r = 0; r <= nrows(); ++r) { + int const xx1 = x + vLineHOffset(0, 0); + int const xx2 = x + vLineHOffset(ncols(), colinfo_[ncols()].lines_ - 1); + for (unsigned int i = 0; i < rowinfo_[r].lines_; ++i) { + int const yy = y + hLineVOffset(r, i); + pi.pain.line(xx1, yy, xx2, yy, Color_foreground); } + } - for (col_type col = 0; col <= ncols(); col += ncols()) - for (unsigned int i = 0; i < colinfo_[col].lines_; ++i) { - int xx = x + lmargin + colinfo_[col].offset_ - - i * vlinesep() - vlinesep()/2 - colsep()/2; - pi.pain.line(xx, y - dim.ascent() + 1, - xx, y + dim.descent() - 1, - Color_foreground); - } drawMarkers2(pi, x, y); } @@ -699,7 +685,6 @@ void InsetMathGrid::metricsT(TextMetricsInfo const & mi, Dimension & dim) const rowinfo_[row].ascent_ = asc; rowinfo_[row].descent_ = desc; } - //rowinfo_[0].ascent_ += hlinesep() * rowinfo_[0].lines_; rowinfo_[nrows()].ascent_ = 0; rowinfo_[nrows()].descent_ = 0; diff --git a/src/mathed/InsetMathGrid.h b/src/mathed/InsetMathGrid.h index de5b64507c..61e7e235c8 100644 --- a/src/mathed/InsetMathGrid.h +++ b/src/mathed/InsetMathGrid.h @@ -103,9 +103,6 @@ public: void metrics(MetricsInfo & mi, Dimension &) const; /// void draw(PainterInfo & pi, int x, int y) const; - /// - void drawWithMargin(PainterInfo & pi, int x, int y, - int lmargin = 0, int rmargin = 0) const; /// draw decorations. void drawDecoration(PainterInfo & pi, int x, int y) const { drawMarkers2(pi, x, y); } @@ -248,6 +245,11 @@ protected: int cellYOffset(idx_type idx) const; /// Width of cell, taking combined columns into account int cellWidth(idx_type idx) const; + /// + virtual int leftMargin() const { return 1; } + /// + virtual int rightMargin() const { return 1; } + /// returns proper 'end of line' code for LaTeX virtual docstring eolString(row_type row, bool fragile, bool latex, bool last_eoln) const; @@ -269,6 +271,10 @@ protected: /// The value of a fixed col spacing for a certain hull type static int colSpace(HullType type, col_type col); + /// positions of vertical and horizontal lines + int vLineHOffset(col_type col, unsigned int line) const; + int hLineVOffset(row_type row, unsigned int line) const; + /// row info. /// rowinfo_[nrows()] is a dummy row used only for hlines. std::vector rowinfo_; @@ -282,7 +288,7 @@ protected: private: /// - char v_align_; // add approp. type + char v_align_; // FIXME: add approp. type /// Inset * clone() const; }; diff --git a/src/mathed/InsetMathTabular.cpp b/src/mathed/InsetMathTabular.cpp index 89a8f26289..e4123a5655 100644 --- a/src/mathed/InsetMathTabular.cpp +++ b/src/mathed/InsetMathTabular.cpp @@ -47,22 +47,13 @@ void InsetMathTabular::metrics(MetricsInfo & mi, Dimension & dim) const { Changer dummy = mi.base.changeFontSet("textnormal"); InsetMathGrid::metrics(mi, dim); - dim.wid += 6; -} - - -Dimension const InsetMathTabular::dimension(BufferView const & bv) const -{ - Dimension dim = InsetMathGrid::dimension(bv); - dim.wid += 6; - return dim; } void InsetMathTabular::draw(PainterInfo & pi, int x, int y) const { Changer dummy = pi.base.changeFontSet("textnormal"); - InsetMathGrid::drawWithMargin(pi, x, y, 4, 2); + InsetMathGrid::draw(pi, x, y); } diff --git a/src/mathed/InsetMathTabular.h b/src/mathed/InsetMathTabular.h index a4aa50f1b9..ed88bd633f 100644 --- a/src/mathed/InsetMathTabular.h +++ b/src/mathed/InsetMathTabular.h @@ -29,8 +29,6 @@ public: /// void metrics(MetricsInfo & mi, Dimension & dim) const; /// - Dimension const dimension(BufferView const &) const; - /// void draw(PainterInfo & pi, int x, int y) const; /// InsetMathTabular * asTabularInset() { return this; } @@ -47,6 +45,10 @@ public: void maple(MapleStream &) const; /// InsetCode lyxCode() const { return MATH_TABULAR_CODE; } + /// + int leftMargin() const { return 4; } //override + /// + int rightMargin() const { return 2; } //override private: Inset * clone() const;