cdf
Version:
A library for creating oldschool demo-like animations with JavaScript
69 lines (65 loc) • 2.51 kB
JavaScript
(function(global,cdf_varname){var lib = global[cdf_varname] || {};
var encodeNumber = function(num){
return (0+num).toString(26).split('').map(function(num){
var cc = num.charCodeAt(0);
return String.fromCharCode(cc+(cc<=57 ?49:10));
}).join('');
};
var decodeNumber = function(str){
return parseInt(str.split('').map(function(s){
var n = s.charCodeAt(0);
return String.fromCharCode((n-10<97)?n-49:n-10);
}).join(''),26)
};
lib.map = {
/**
* Draw a bit sequence onto canvas
* @param {cdf.Canvas} canvas c0deff canvas to draw bit sequence onto
* @param {string} bits A string of bits. For example, 0110
* @param {CanvasRenderingContext2D.fillStyle} fillStyle A fillstyle to put non-empty bits with
*/
draw: function(canvas, bits, fillStyle, invert){
bits = bits.split('')
bits.forEach(function(b,n){
if((b==0 && !invert) || (b!=0 && invert))return;
x = n%canvas.width;
y = Math.floor(n/canvas.width);
canvas.plot(x,y,1,fillStyle);
})
},
/**
* Turns bit sequence to map
* @param {string} bits A string of bits. For example, 0000110100100111111111100000000000000001101
* @return {string} A map, for example (4)2#1##1##10(16)2#1
*/
bitsToMap: function(bits){
return bits
.replace(/(0+)/g,function(a){return encodeNumber(a.length)})
.replace(/(1+)/g,function(a){return a.length});
},
/**
* Turns map to bit sequence
* @param {string} map A map, for example (4)2#1##1##10(16)2#1
* @return {string} A string of bits. For example, 0000110100100111111111100000000000000001101
*/
mapToBits: function(map){
return map
.replace(/\d+/g,function(a){return '1'.repeat(a)})
.replace(/[a-z]+/g,function(a){return '0'.repeat(decodeNumber(a))})
},
/**
* Create new canvas and draw a bit sequence onto it
* @param {int} width
* @param {int} height
* @param {string} bits
* @param {CanvasRenderingContext2D.fillStyle} fillStyle A fillstyle to put non-empty bits with
* @return {lib.canvas} Canvas filled with pattern
*/
c: function(width, height, bits, fillStyle){
var c = new lib.Canvas(width,height);
if(bits.match(/[a-z]/))bits = this.mapToBits(bits);
this.draw(c, bits, fillStyle);
return c;
}
}
if(cdf_varname) global[cdf_varname]=lib;})(window, (typeof module!=='undefined'&& module.exports)?false:'cdf');