in modules/aggregation-layers/src/heatmap-layer/heatmap-layer.js [112:156]
updateState(opts) {
if (!this.state.supported) {
return;
}
super.updateState(opts);
const {props, oldProps} = opts;
const changeFlags = this._getChangeFlags(opts);
if (changeFlags.viewportChanged) {
changeFlags.boundsChanged = this._updateBounds();
}
if (changeFlags.dataChanged || changeFlags.boundsChanged) {
this._updateWeightmap();
} else if (changeFlags.viewportZoomChanged) {
this._debouncedUpdateWeightmap();
}
if (props.colorRange !== oldProps.colorRange) {
this._updateColorTexture(opts);
}
if (changeFlags.viewportChanged) {
this._updateTextureRenderingBounds();
}
if (oldProps.colorDomain !== props.colorDomain || changeFlags.viewportChanged) {
const {viewport} = this.context;
const {weightsScale} = this.state;
const domainScale = (viewport ? 1024 / viewport.scale : 1) * weightsScale;
const colorDomain = props.colorDomain
? props.colorDomain.map(x => x * domainScale)
: DEFAULT_COLOR_DOMAIN;
if (colorDomain[1] > 0 && weightsScale < 1) {
// Hack - when low precision texture is used, aggregated weights are in the [0, 1]
// range. Scale colorDomain to fit.
const max = Math.min(colorDomain[1], 1);
colorDomain[0] *= max / colorDomain[1];
colorDomain[1] = max;
}
this.setState({colorDomain});
}
this.setState({zoom: opts.context.viewport.zoom});
}