キャンバスで遊び中 - テキスト表示


http://www.fujidig.com/misc/js/canvas/chars.html
キャンバスはテキストの表示ができませんが、ASCII文字テーブルの画像を用意して切り貼りすればそれっぽいことができます。

var run = function() {
	
	var draw_str = function(str, dx, dy, size) {
		var x = dx;
		var y = dy;
		var sWidth = 64;
		var sHeight = 152;
		var zoom = size / 128;
		var dWidth = sWidth * zoom;
		var dHeight = sHeight * zoom;
		
		var char_canvas = document.createElement('canvas');
		char_canvas.width = dWidth;
		char_canvas.height = dHeight;
		var char_ctx = char_canvas.getContext('2d');
		
		for( var i = 0, len = str.length; i < len; i ++) {
			var c = str.charCodeAt(i);
			if (c >= 0x7e) c = 0x3f; // '~' 以降は '?' に化かす
			if (c == 0x0a) { // '\n'
				x = dx;
				y += dHeight;
				continue;
			}
			if (c == 0x09) { // '\t'
				x = (((x - dx) / dWidth + 8) & ~7) * dWidth + dx;
				continue;
			}
			if (c < 0x20) c = 0x20; // その他の各種制御コード
			
			var sx = 64 * (c - 0x20);
			var sy = 0;
			char_ctx.globalCompositeOperation = 'source-over';
			char_ctx.clearRect(0, 0, dWidth, dHeight);
			char_ctx.fillStyle = ctx.fillStyle;
			char_ctx.fillRect(0, 0, dWidth, dHeight);
			char_ctx.globalCompositeOperation = 'destination-in';
			char_ctx.drawImage(imgChars, sx, sy, sWidth, sHeight, 0, 0, dWidth, dHeight);
			
			ctx.drawImage(char_canvas, x, y);
			x += dWidth;
		}
	};
	var canvas = document.body.appendChild(document.createElement('canvas'));
	canvas.width = 480;
	canvas.height = 360;
	var ctx = canvas.getContext('2d');
	draw_str('Hello, world!', 0, 0, 70);
	ctx.fillStyle = '#f00';
	draw_str('(>_<;)', 0, 80, 160);
}

var imgChars = new Image;
imgChars.onload = run;
imgChars.src = "chars.png";

追記(2008-06-14 17:04:41)

char_ctx.globalCompositeOperation = 'source-over'; を char_ctx.clearRect(0, 0, dWidth, dHeight); の前に移動した。
半透明の色でOperaでうまくクリアされてなかったので。