Andreas also filed bug 904328, which has a patch that handles the last few items on the list already.
- Matt On 23/08/13 9:42 AM, Matt Woodrow wrote: > I think we definitely want to make scrolled items have coordinates > relative to their scrolled root. > > The problem with just doing this, and applying a transform to the > context when drawing them is that it makes visibility calcuations much > harder. > > nsDisplayList::ComputeVisibility assumes that all child items are in the > same coordinate space, and changing this would be difficult. > > I think we instead need to make sure that all scrolled items are within > a 'wrapper' item and have that as the point where we change coordinate > systems. This is what we are currently doing for nsDisplayTransform. > > Things that need to be done: > > Make sure we always build nsDisplayScrollLayer > (http://mxr.mozilla.org/mozilla-central/source/layout/generic/nsGfxScrollFrame.cpp#2310) > for active scroll frames, instead of only when we have async scrolling. > > Convert nsDisplayScrollLayer to be inherit directly from nsDisplayItem > instead of nsDisplayWrapList. nsDisplayWrapList implement > GetSameCoordinateSystemChildren > (http://mxr.mozilla.org/mozilla-central/source/layout/base/nsDisplayList.h#2391) > which we *don't* want. We just want to implement GetChildren() instead. > > Make nsDisplayScrollLayer::HitTest, BuildLayer, ComputeVisibility etc > handle the change in coordinate space. nsDisplayTransform does this by > adding a translate into the computed matrix in > nsDisplayTransform::GetTransform. I think we'll just want to manually > shift the visible rect/hit test rect before passing it on to our children. > > Make children of the scrolled content choose the scrolled root as their > reference point. We currently do this calculation in two places: > http://mxr.mozilla.org/mozilla-central/source/layout/base/nsDisplayList.h#195, > and > http://mxr.mozilla.org/mozilla-central/source/layout/base/nsDisplayList.h#519. > Note that these have special handling for transforms, and we need to add > the equivalent for scrolled roots. > > This function should be what decides if a scroll frame should be a > reference frame for its children: > http://mxr.mozilla.org/mozilla-central/source/layout/base/nsLayoutUtils.cpp#1079 > > Hopefully that helps! Let me know if you have any more questions :) > > - Matt > > > On 23/08/13 1:57 AM, Thinker K.F. Li wrote: >> "Robert O'Callahan" <[email protected]> writes: >> >>> On Thu, Aug 22, 2013 at 10:34 PM, Thinker K.F. Li >>> <[email protected]>wrote: >>> >>>> After a discussion with Kan-Ru, I get more about the problem itself. >>>> Since the positions of all display items in a nsIScrollableFrame are >>>> relative to nsIScrollableFrame itself. By keeping display itmes in the >>>> cache and applying a translation (shift) to the gfxContext before >>>> calling paint() on display items, we don't need to change the display >>>> items in the cache. Of course, invalidate regions should be translated >>>> too. >>>> >>> The offset to apply to each display item would have to be stored somewhere, >>> and then those offsets will all have to be updated. >>> >>> It seems simpler and more efficient to me to make the display items be >>> relative to their active scrolled root, then nothing will have to be >>> updated. Matt can explain more of the details of what we think needs to be >>> done. >> It seems very similar to what I told. I would very like to know the >> details you mentioned. >> > > _______________________________________________ > dev-tech-layout mailing list > [email protected] > https://lists.mozilla.org/listinfo/dev-tech-layout _______________________________________________ dev-tech-layout mailing list [email protected] https://lists.mozilla.org/listinfo/dev-tech-layout

