UNPKG

vega-scenegraph

Version:

Vega scenegraph and renderers.

60 lines (46 loc) 1.27 kB
function compare(a, b) { return a.zindex - b.zindex || a.index - b.index; } export function zorder(scene) { if (!scene.zdirty) return scene.zitems; var items = scene.items, output = [], item, i, n; for (i=0, n=items.length; i<n; ++i) { item = items[i]; item.index = i; if (item.zindex) output.push(item); } scene.zdirty = false; return scene.zitems = output.sort(compare); } export function visit(scene, visitor) { var items = scene.items, i, n; if (!items || !items.length) return; const zitems = zorder(scene); if (zitems && zitems.length) { for (i=0, n=items.length; i<n; ++i) { if (!items[i].zindex) visitor(items[i]); } items = zitems; } for (i=0, n=items.length; i<n; ++i) { visitor(items[i]); } } export function pickVisit(scene, visitor) { var items = scene.items, hit, i; if (!items || !items.length) return null; const zitems = zorder(scene); if (zitems && zitems.length) items = zitems; for (i=items.length; --i >= 0;) { if (hit = visitor(items[i])) return hit; } if (items === zitems) { for (items=scene.items, i=items.length; --i >= 0;) { if (!items[i].zindex) { if (hit = visitor(items[i])) return hit; } } } return null; }