On Thu, Jun 29, 2006 at 11:05:31AM +0300, Martin Vermeer wrote:
> On Thu, Jun 29, 2006 at 01:08:32AM +0300, Martin Vermeer wrote:
> > On Wed, Jun 28, 2006 at 03:06:36PM +0200, Jean-Marc Lasgouttes wrote:
> > > >>>>> "Jean-Marc" == Jean-Marc Lasgouttes <[EMAIL PROTECTED]> writes:
> > > 
> > > Jean-Marc> This is because the rowpainter code sets Wide() on these
> > > Jean-Marc> insets, because they are alone on a row. The following
> > > Jean-Marc> patches test additionally that the inset is not the last
> > > Jean-Marc> element of the paragraph. It seems to work for me, but I am
> > > Jean-Marc> not sure it is the right condition to test.
> > 
> > No, I have serious doubts here. And there will be situations where an
> > inset is the last (or only) element of a paragraph, and contains lots of
> > texts that we want to render parsimoniously. So I am afraid that this
> > subverts the speed-up effect.
> 
> I enabled the painting debugging by -dbg PAINTING, and can confirm my
> doubts.
> 
> A Note inset, even if apparently alone on its row and followed by text
> in the same paragraph that has wrapped to the next row, will _never_ go
> Wide with your patch. (I tried the 1.4 version).
> 
> I expect Bennett would find the old slowness back.
> 
> Yes, it "fixes" -- rather, suppresses -- the note-in-tabular bug :-(

Here is my patch improved as I think it should be. This works, and
reserves even the right amount of space in a cell, not too much.

The expression for openinlined_ may perhaps be refined still, but main
thing is it shouldn't depend on mi.base.textwidth.

- Martin


Index: insetcollapsable.C
===================================================================
--- insetcollapsable.C  (revision 14237)
+++ insetcollapsable.C  (working copy)
@@ -138,7 +138,8 @@ void InsetCollapsable::metrics(MetricsIn
                dim = dimensionCollapsed();
                if (status() == Open) {
                        InsetText::metrics(mi, textdim_);
-                       openinlined_ = textdim_.wid + 2 * dim.wid <= 
mi.base.textwidth;
+                       // This expression should not contain mi.base.texwidth
+                       openinlined_ = textdim_.wid < 0.5 * 
mi.base.bv->workWidth();
                        if (openinlined_) {
                                // Correct for button width, and re-fit
                                mi.base.textwidth -= dim.wid;
Index: insettabular.C
===================================================================
--- insettabular.C      (revision 14262)
+++ insettabular.C      (working copy)
@@ -261,9 +261,15 @@ void InsetTabular::metrics(MetricsInfo &
                        tabular.getCellInset(cell)->metrics(m, dim);
                        if (!p_width.zero())
                                dim.wid = m.base.textwidth;
+                       tabular.setWidthOfCell(cell, dim.wid);
+                       if (p_width.zero()) {
+                               m.base.textwidth = dim.wid + 2 * 
ADD_TO_TABULAR_WIDTH;
+                               // FIXME there must be a way to get rid of 
+                               // the second metrics call
+                               tabular.getCellInset(cell)->metrics(m, dim);
+                       }
                        maxAsc  = max(maxAsc, dim.asc);
                        maxDesc = max(maxDesc, dim.des);
-                       tabular.setWidthOfCell(cell, dim.wid);
                        ++cell;
                }
                tabular.setAscentOfRow(i, maxAsc + ADD_TO_HEIGHT);

Attachment: pgpVMLyAbDD7z.pgp
Description: PGP signature

Reply via email to