in web/src/app/timeline/canvas/timeline_gl_row_renderer.ts [228:278]
public updateInteractiveBuffer(
selectedLogIndex: number,
highlightedLogIndices: Set<number>,
filteredLogIndices: Set<number>,
) {
this.ignoreGLContextLostException(() => {
for (const [index, revision] of this.timeline.revisions.entries()) {
let status = SelectionStatusForShader.Default;
if (filteredLogIndices.has(revision.logIndex)) {
status = SelectionStatusForShader.FilteredOut;
} else if (revision.revisionStateCssSelector !== 'inferred') {
// When the timeline is `inferred`, there are no actual related log. shouldn't be highlighted/selected.
if (
selectedLogIndex !== -1 &&
revision.logIndex === selectedLogIndex
) {
status = SelectionStatusForShader.Selected;
} else if (highlightedLogIndices.has(revision.logIndex)) {
status = SelectionStatusForShader.Highlighted;
}
}
this.revisionIntMetaBufferSource[index * 2 + 1] = status;
}
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.revisionIntMetaBuffer);
this.gl.bufferData(
this.gl.ARRAY_BUFFER,
this.revisionIntMetaBufferSource,
this.gl.DYNAMIC_DRAW,
);
for (const [index, event] of this.timeline.events.entries()) {
let status = SelectionStatusForShader.Default;
if (filteredLogIndices.has(event.logIndex)) {
status = SelectionStatusForShader.FilteredOut;
} else {
if (selectedLogIndex !== -1 && event.logIndex === selectedLogIndex) {
status = SelectionStatusForShader.Selected;
} else if (highlightedLogIndices.has(event.logIndex)) {
status = SelectionStatusForShader.Highlighted;
}
}
this.eventIntMetaBufferSource[index] = status;
}
this.gl.bindBuffer(this.gl.ARRAY_BUFFER, this.eventIntMetaBuffer);
this.gl.bufferData(
this.gl.ARRAY_BUFFER,
this.eventIntMetaBufferSource,
this.gl.DYNAMIC_DRAW,
);
});
}