|
|
|
let c2d = null;
|
|
|
|
let raster_queue = [];
|
|
|
|
|
|
|
|
function init_rasterizer() {
|
|
|
|
c2d = document.querySelector('#offscreen').getContext('2d');
|
|
|
|
c2d.canvas.width = config.w;
|
|
|
|
c2d.canvas.height = config.h;
|
|
|
|
c2d.font = '16px ibm8x16';
|
|
|
|
//c2d.font = '14px monospace';
|
|
|
|
c2d.textAlign = 'center';
|
|
|
|
c2d.textBaseline = 'middle';
|
|
|
|
c2d.fillStyle = '#eeeeee';
|
|
|
|
}
|
|
|
|
|
|
|
|
function rasterize(text) {
|
|
|
|
c2d.clearRect(0, 0, c2d.canvas.width, c2d.canvas.height);
|
|
|
|
c2d.fillText(text, config.w / 2, config.h / 2);
|
|
|
|
//c2d.fillRect(0, 0, 32, 32);
|
|
|
|
}
|
|
|
|
|
|
|
|
function rasterize_row(value) {
|
|
|
|
// from 1 to value
|
|
|
|
}
|
|
|
|
|
|
|
|
function queue_rasterize(text, at) {
|
|
|
|
raster_queue.push({'text': text, 'at': at});
|
|
|
|
}
|
|
|
|
|
|
|
|
function copy_canvas_to_texture(at) {
|
|
|
|
gl.texSubImage2D(gl.TEXTURE_2D, 0,
|
|
|
|
at.x * config.w, at.y * config.h,
|
|
|
|
config.w, config.h,
|
|
|
|
gl.RGBA, gl.UNSIGNED_BYTE,
|
|
|
|
c2d.canvas
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
function rasterize_and_upload_batch(batch_size) {
|
|
|
|
let head = 0;
|
|
|
|
|
|
|
|
gl.bindTexture(gl.TEXTURE_2D, textures['raster']);
|
|
|
|
|
|
|
|
for (let i = 0; i < batch_size && i < raster_queue.length; ++i) {
|
|
|
|
const entry = raster_queue[i];
|
|
|
|
rasterize(entry.text);
|
|
|
|
copy_canvas_to_texture(entry.at);
|
|
|
|
head = i + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
raster_queue.splice(0, head);
|
|
|
|
|
|
|
|
return raster_queue.length;
|
|
|
|
}
|