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

Reply via email to