Re: Extended Layout Summary



Am Dienstag, den 20.11.2007, 20:45 -0500 schrieb Behdad Esfahbod:
> On Tue, 2007-11-20 at 20:09 -0500, Behdad Esfahbod wrote:
> > On Tue, 2007-11-20 at 07:23 -0500, Mathias Hasselmann wrote:
> > > 
> > > When a container widget got more space allocated than requested, it
> > > considers the difference between natural and requested size of its
> > > children to distribute that additional space, in relation to the child's
> > > difference between natural and minimum-size. Let's use an example for
> > > demonstration:
> > > 
> > >     Assume we have a container with two children. Both children request
> > >     a_min = b_min = 50 pixels as minimum size. The first child announces
> > >     a_nat = 100 pixels, the second announces b_nat = 200 pixels as
> > >     natural size.
> > > 
> > >     This gives a requested size of c_min = 100 pixels, and a natural
> > >     size of 300 pixels (c_nat) for the container. Now the container gets
> > >     allocated at a size of 200 pixels (c_cur). This are 100 pixels to
> > >     distribute (c_gap).
> > > 
> > >     So the first child gets:
> > > 
> > >       a_cur = a_min + c_gap * (a_nat - a_min) / (c_nat - c_nat) 
> > >             = 50    + 100   * 50              / 200
> > >             = 75 pixels.
> > > 
> > >     The second child gets:
> > > 
> > >       b_cur = b_min + b_gap * (b_nat - b_min) / (c_nat - c_nat) 
> > >             = 50    + 100   * 150             / 200
> > >             = 125 pixels.
> > 
> > Something that Ryan brought up, and I was hoping that Havoc answer is
> > that the above algorithm is not optimal, you can easily do better.
> > Quoting Havoc's words: "bring smaller items up to natural size first".
> > Read his entire "TEXT LAYOUT THAT WORKS PROPERLY?" post here:
> > 
> >   http://log.ometer.com/2006-10.html
> 
> Without checking HippoCanvas's implementation, I think this is how it
> should work:
> 
>   Say there are n child widgets c^0 .. c^{n-1}, let
> 
> 	c^i_diff = c^i_nat - c^i_min
> 
>   We want to assign c^i_gap such that the sum of c^i_gap's is equal to
> c_gap, the container's extra space to distribute.  We only consider the
> case that there's not enough space for all children to take their
> natural size.  The goals we want to achieve:
> 
>     a) Maximize number of children taking their natural size.
> 
>     b) The allocated size of children should be a continuous function of
> c_gap.  That is, increasing the container size by one pixel should never
> make drastic changes in the distribution.
> 
> 
> Goal a rules your current algorithm out as yours essentially keeps all
> children off their natural size until there's enough room for all.
> 
> Goal b means that you cannot start from the least child gap, fulfill
> them and then distribute the remaining gap between the rest of the
> children, because when enough gap becomes available for you to
> accommodate one more natural child, the allocations jump
> noncontinuously.
> 
> This algorithm achieves both goals:  Distribute gap to children equally
> (not linearly) and not more than they need.  That is:
> 
>   - Sort children with decreasing c^i_diff.  Use child order in the
> container to break ties.

I have some concerns that the sorting step changes the complexity class
for some containers from O(n) to O(n log n). On the other hand we have
O(n^2) in GtkTable already. So probably this doesn't hurt too much, I
guess.

>   - Allocate like this:
> 
>     for (i = n - 1; i >= 0; i--)
>       {
>         double share = (double) c_gap / (i + 1);
> 
>         if (share >= c^i_diff)
>           c^i_gap = c^i_diff;
>         else
>           c^i_gap = ceil (share);
> 
>         c_gap -= c^i_gap;
>       }
> 

So it sounds interesting to try. But as Matthias pointed out already,
the use of natural size information is an implementation detail. So the
question is, if I should try that variant before my code is merged.

> Something completely unrelated: now that you are adding extended layout
> features, should we switch to doubles or some fixed subpixel format for
> size negotiation?  The idea being, making it easier to make Gtk+
> dpi-independent in the future.

From my observation late conversion to integer values could save some
pixels wasted due pessimistic rounding, which would be another
advantage.

Ciao,
Mathias
-- 
Mathias Hasselmann <mathias hasselmann gmx de>
http://taschenorakel.de/

Attachment: signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]