pseudo code:
map<ActiveScrolledRoot*, WrClipID> asrMap;
static
GetWrScrollNodeForASR(ActiveScrolledRoot* aASR)
{
if (asrMap.has(aASR)) {
return asrMap.get(aASR);
}
WrClipID parentASRWrID = GetWrScrollNodeForASR(aASR->mParent);
WrClipID clipID = WrMakeClipIDForASR(parentASRWrID, ??);
asrMap.add(aASR, clipID);
return clipID;
}
map<DisplayItemClipChain*, WrClipID> clipChainMap;
static WrClipID
GetWrClipNodeForClipChain(DisplayItemClipChain* aClipChain)
{
if (clipChainMap.has(aClipChain)) {
return clipChainMap.get(aClipChain);
}
WrClipID parentClipID = GetWrClipNodeForClipChain(aClipChain->mParent);
WrClipID asrClipID = GetWrScrollNodeForASR(aClipChain->mASR);
// need to find one node for these two nodes somehow
WrClipID clipID = WrMakeClipIDForClip(parentClipID, asrClipID, aClipChain.mClip.GetRect(), aClipChain.mClip.GetRoundedRects());
clipChainMap.add(aClipChain, clipID);
return clipID;
}
for (each display item) {
DisplayItemClipChain* clipChain = item->GetClipChain();
WrClipID wrClipNode = GetWrClipNodeForClipChain(clipChain);
ActiveScrolledRoot* asr = item->GetActiveScrollRoot();
WrClipID wrScrollNode = GetWrScrollNodeForASR(asr);
WrPushItem(item, wrClipNode, wrScrollNode);
}