_changeNucleotidesReferenceGraph()

in client/client/modules/render/tracks/reference/referenceRenderer.js [47:118]


    _changeNucleotidesReferenceGraph(viewport, items, isReverse) {
        const height = this.height;
        const heightBlock = this._config.nucleotidesHeight;
        let startY;

        if (this.isRenderingStartsAtMiddle) {
            startY = isReverse ?
                height / 2.0 + heightBlock :
                height / 2.0 - heightBlock;
        } else {
            startY = isReverse ?
                heightBlock :
                height - heightBlock;
        }

        const block = new PIXI.Graphics();
        const pixelsPerBp = viewport.factor;
        let padding = pixelsPerBp / 2.0;
        const lowScaleMarginThreshold = 4;
        const lowScaleMarginOffset = -0.5;
        if (pixelsPerBp > lowScaleMarginThreshold)
            padding += lowScaleMarginOffset;
        let prevX = null;
        for (let i = 0; i < items.length; i++) {
            const item = items[i];
            if (viewport.isShortenedIntronsMode && !viewport.shortenedIntronsViewport.checkFeature(item))
                continue;
            let startX = Math.round(this.correctedXPosition(item.xStart) - padding);
            let endX = Math.round(this.correctedXPosition(item.xEnd) + padding);
            if (pixelsPerBp >= this._config.largeScale.separateBarsAfterBp && prevX !== null && prevX === startX) {
                startX++;
            }
            startX = this.correctCanvasXPosition(startX, viewport);
            endX = this.correctCanvasXPosition(endX, viewport);
            block.beginFill(this._config.largeScale[item.value.toUpperCase()], 1);
            block.moveTo(startX, isReverse ? startY + lowScaleMarginOffset : startY - lowScaleMarginOffset);
            if (this.isRenderingStartsAtMiddle) {
                block.lineTo(startX, height / 2.0);
                block.lineTo(endX, height / 2.0);
            } else {
                block.lineTo(startX, isReverse ? 0 : height);
                block.lineTo(endX, isReverse ? 0 : height);
            }
            block.lineTo(endX, isReverse ? startY + lowScaleMarginOffset : startY - lowScaleMarginOffset);
            block.lineTo(startX, isReverse ? startY + lowScaleMarginOffset : startY - lowScaleMarginOffset);
            block.endFill();
            prevX = endX;
        }
        this.dataContainer.addChild(block);

        for (let i = 0; i < items.length; i++) {
            const item = items[i];
            if (viewport.isShortenedIntronsMode && !viewport.shortenedIntronsViewport.checkFeature(item))
                continue;
            if (pixelsPerBp >= this._config.largeScale.labelDisplayAfterPixelsPerBp) {
                const label = this.labelsManager
                    ? this.labelsManager.getLabel(item.value, this._config.largeScale.labelStyle)
                    : undefined;
                if (label) {
                    const labelHeight = label.height;
                    const labelWidth = label.width;
                    label.x = this.correctCanvasXPosition(
                        Math.round(this.correctedXPosition(item.xStart) - labelWidth / 2.0),
                        viewport
                    );
                    label.y = Math.round(isReverse ? startY - heightBlock / 2.0 - labelHeight / 2.0 : startY + heightBlock / 2.0 - labelHeight / 2.0 - 1);

                    this.dataContainer.addChild(label);
                }
            }
        }
    }