updateState()

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});
  }