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