fancy_star = function fancy_star (context, nridges, samples_per_pixel) {
const c = context;
const {width:w, height:h} = c.canvas;
const image = c.getImageData(0, 0, w, h);
const image_data = image.data;
const radius = Math.min(w, h) * 0.5;
const scale = 0.190717999557544128;
let sum = 0
const float_image = new Float32Array(w*h);
const samples = new Float32Array((w+6)*(h+6));
for (let s = 0; s < samples_per_pixel; s++) {
const [offsetx, offsety] = plastic(s);
const offset_weights = [];
for (let j = 0; j <= 6; j++) {
for (let i = 0; i <= 6; i++) {
const x = i - 3 + offsetx;
const y = j - 3 + offsety;
sum += offset_weights[i + 7*j] = chebeval(
windowed_jinc_coeffs,
(x*x + y*y) * scale - 1);
}
}
for (let j = 0; j < h + 6; j++) {
for (let i = 0; i < w + 6; i++) {
const x = i - 3 + offsetx - w/2;
const y = j - 3 + offsety - h/2;
samples[i + (w+6)*j] = inverse_gamma(star_color(x, y, nridges));
}
}
for (let j = 0; j < h; j++) {
for (let i = 0; i < w; i++) {
for (let jj = 0; jj <= 6; jj++) {
for (let ii = 0; ii <= 6; ii++) {
float_image[i + j*w] +=
samples[(i + ii) + (j + jj)*(w+6)]*offset_weights[ii + jj*7];
}
}
}
}
}
const sum_inv = 1/sum;
for (let j = 0; j < h; j++) {
for (let i = 0; i < w; i++) {
const x = i - w/2;
const y = j - h/2;
const ii = i + j*w;
image_data[4*ii] = image_data[4*ii+1] = image_data[4*ii+2] = 255 * gamma(float_image[ii] * sum_inv);
image_data[4*ii + 3] = 255 * ((x*x + y*y) < radius*radius);
}
}
c.putImageData(image, 0, 0);
return c;
}