private setSprites()

in src/WordCloud.ts [1178:1247]


    private setSprites(context: CanvasRenderingContext2D, words: WordCloudDataPoint[]): void {
        let pixels: Uint8ClampedArray,
            sprites: number[] = [];

        pixels = context.getImageData(
            WordCloud.ContextStartPosition,
            WordCloud.ContextStartPosition,
            this.canvasViewport.width << WordCloud.WidthOffset,
            this.canvasViewport.height).data;

        for (let i: number = words.length - 1; i >= 0; i--) {
            let currentWordData: WordCloudDataPoint = words[i],
                width: number = currentWordData.width,
                width32: number = width >> 5,
                height: number = currentWordData.y1 - currentWordData.y0,
                x: number = 0,
                y: number = 0,
                seen: number = 0,
                seenRow: number = 0;

            if (currentWordData.xOff + width >= (this.canvasViewport.width << WordCloud.WidthOffset)
                || currentWordData.yOff + height >= this.canvasViewport.height) {
                currentWordData.sprite = null;

                continue;
            }

            for (let j: number = 0; j < height * width32; j++) {
                sprites[j] = 0;
            }

            if (currentWordData.xOff !== null) {
                x = currentWordData.xOff;
            } else {
                return;
            }

            y = currentWordData.yOff;

            seen = 0;
            seenRow = -1;

            for (let j: number = 0; j < height; j++) {
                for (let k: number = 0; k < width; k++) {
                    const l: number = width32 * j + (k >> WordCloud.WidthOffset),
                        index: number = ((y + j)
                            * (this.canvasViewport.width << WordCloud.WidthOffset)
                            + (x + k)) << WordCloud.IndexOffset,
                        m: number = pixels[index]
                            ? 1 << (WordCloud.ByteMask - (k % WordCloud.TheFirstByteMask))
                            : 0;

                    sprites[l] |= m;
                    seen |= m;
                }

                if (seen) {
                    seenRow = j;
                } else {
                    currentWordData.y0++;
                    height--;
                    j--;
                    y++;
                }
            }

            currentWordData.y1 = currentWordData.y0 + seenRow;
            currentWordData.sprite = sprites.slice(0, (currentWordData.y1 - currentWordData.y0) * width32);
        }
    }