joon hee - Canvas.TextFunctions-1.0

Documentation | Source

NAME

Canvas.TextFunctions -renders ASCII letters on a Canvas

SYNOPSIS

        JSAN.use('Canvas.TextFunctions');
        Canvas.TextFunctions.draw(ctx, Canvas.TextFunctions.letters, 15, 50, 20, "Hello World");

DESCRIPTION

This module renders letters on a Canvas by associating each letter with an array of coordinates and then by graphing through each of those coordinates. The data behind this is stored in Canvas.TextFunctions.letters, the primary function for drawing is Canvas.TextFunctions.draw().

Right now one of the biggest disadvantages of the Canvas tag for drawing graphics is the lack of text support, as such many solutions have been devised to solve this problem including converting truetype fonts to Canvas. Right now this module is a lightweight solution that is the most cost-efficient.

Web browser developers such as Mozilla and Safari have noticed the lack of textual support and they will hopefully eventually replace this module with a much more efficient CanvasRenderingContext2D.prototype.drawString() method. This may still need to be kept around for compatability purposes though for those people that still use old versions of Firefox and other web browsers.

DEPENDENCIES

CanvasRenderingContext2D

PROPERTIES

letters

This is an associative array which stores all the letters in Canvas.TextFunctions such as [A-Z][a-z][0..9] as keys and the values are arrays of coordinates which represent what the letter will look like when drawn.

Note that this is note a fixed-width font as such some letters are bigger then others, as such the width can be accessed as such:

        Canvas.TextFunctions.letters["0"].width; // returns 20

METHODS

letter(ch)

This returns the data behind a letter, this is the same as Canvas.TextFunctions.letter[ch].

        Canvas.TextFunctions.letter("U").width; // returns 22

ascent(font,size)

This returns the size.

        Canvas.TextFunctions.ascent(5,10);  // returns 10

descent(font, size)

This returns 7*size/25 which is what is needed to descend the font.

        Canvas.TextFunctions.descent(5,25); // returns 7

measure(font, size, str)

This will take a string argument, a font, and the size and it will return the total measurement.

        Canvas.TextFunctions.measure(Canvas.TextFunctions.letters,15,"abcdefghijklmnopqrstuvwxyz");

draw(ctx,font,size,x,y,str)

This is how you make text render onto the Canvas instance. The position is based on the x,y coordinates specified in the arguments, and it renders the text based on str. This is the primary function of the Canvas.TextFunctions module.

        var ctx = document.getElementById("canvas").getContext("2d");
        Canvas.TextFunctions.draw(ctx, Canvas.TextFunctions.letters, 15, 25, 25, "Hello World");

enable(ctx)

This takes an instance of CanvasRenderingContext2D or essentially just a canvas element and then it will attach drawText, measureText, fontDescent, and fontAscent methods to the instance. The methods attached are essentially the same except you do not need to specify the first ctx argument.

        var ctx = document.getElementById("canvas").getContext("2d");
        Canvas.TextFunctions.enable(ctx);
        
        ctx.drawText(Canvas.TextFunctions.letters, 15, 50, 50, "Canvas Enabled!");

AUTHORS

Jim Studt Jhuni, <jhuni_x@yahoo.com>

COPYRIGHT

Public Domain

if( typeof Canvas === 'undefined' ) { 
	Canvas = {};
}
Canvas.TextFunctions = { };

Canvas.TextFunctions.letters = {
    ' ': { width: 16, points: [] },
    '!': { width: 10, points: [[5,21],[5,7],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]] },
    '"': { width: 16, points: [[4,21],[4,14],[-1,-1],[12,21],[12,14]] },
    '#': { width: 21, points: [[11,25],[4,-7],[-1,-1],[17,25],[10,-7],[-1,-1],[4,12],[18,12],[-1,-1],[3,6],[17,6]] },
    '$': { width: 20, points: [[8,25],[8,-4],[-1,-1],[12,25],[12,-4],[-1,-1],[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] },
    '%': { width: 24, points: [[21,21],[3,0],[-1,-1],[8,21],[10,19],[10,17],[9,15],[7,14],[5,14],[3,16],[3,18],[4,20],[6,21],[8,21],[10,20],[13,19],[16,19],[19,20],[21,21],[-1,-1],[17,7],[15,6],[14,4],[14,2],[16,0],[18,0],[20,1],[21,3],[21,5],[19,7],[17,7]] },
    '&': { width: 26, points: [[23,12],[23,13],[22,14],[21,14],[20,13],[19,11],[17,6],[15,3],[13,1],[11,0],[7,0],[5,1],[4,2],[3,4],[3,6],[4,8],[5,9],[12,13],[13,14],[14,16],[14,18],[13,20],[11,21],[9,20],[8,18],[8,16],[9,13],[11,10],[16,3],[18,1],[20,0],[22,0],[23,1],[23,2]] },
    '\'': { width: 10, points: [[5,19],[4,20],[5,21],[6,20],[6,18],[5,16],[4,15]] },
    '(': { width: 14, points: [[11,25],[9,23],[7,20],[5,16],[4,11],[4,7],[5,2],[7,-2],[9,-5],[11,-7]] },
    ')': { width: 14, points: [[3,25],[5,23],[7,20],[9,16],[10,11],[10,7],[9,2],[7,-2],[5,-5],[3,-7]] },
    '*': { width: 16, points: [[8,21],[8,9],[-1,-1],[3,18],[13,12],[-1,-1],[13,18],[3,12]] },
    '+': { width: 26, points: [[13,18],[13,0],[-1,-1],[4,9],[22,9]] },
    ',': { width: 10, points: [[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] },
    '-': { width: 26, points: [[4,9],[22,9]] },
    '.': { width: 10, points: [[5,2],[4,1],[5,0],[6,1],[5,2]] },
    '/index.html': { width: 22, points: [[20,25],[2,-7]] },
    '0': { width: 20, points: [[9,21],[6,20],[4,17],[3,12],[3,9],[4,4],[6,1],[9,0],[11,0],[14,1],[16,4],[17,9],[17,12],[16,17],[14,20],[11,21],[9,21]] },
    '1': { width: 20, points: [[6,17],[8,18],[11,21],[11,0]] },
    '2': { width: 20, points: [[4,16],[4,17],[5,19],[6,20],[8,21],[12,21],[14,20],[15,19],[16,17],[16,15],[15,13],[13,10],[3,0],[17,0]] },
    '3': { width: 20, points: [[5,21],[16,21],[10,13],[13,13],[15,12],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] },
    '4': { width: 20, points: [[13,21],[3,7],[18,7],[-1,-1],[13,21],[13,0]] },
    '5': { width: 20, points: [[15,21],[5,21],[4,12],[5,13],[8,14],[11,14],[14,13],[16,11],[17,8],[17,6],[16,3],[14,1],[11,0],[8,0],[5,1],[4,2],[3,4]] },
    '6': { width: 20, points: [[16,18],[15,20],[12,21],[10,21],[7,20],[5,17],[4,12],[4,7],[5,3],[7,1],[10,0],[11,0],[14,1],[16,3],[17,6],[17,7],[16,10],[14,12],[11,13],[10,13],[7,12],[5,10],[4,7]] },
    '7': { width: 20, points: [[17,21],[7,0],[-1,-1],[3,21],[17,21]] },
    '8': { width: 20, points: [[8,21],[5,20],[4,18],[4,16],[5,14],[7,13],[11,12],[14,11],[16,9],[17,7],[17,4],[16,2],[15,1],[12,0],[8,0],[5,1],[4,2],[3,4],[3,7],[4,9],[6,11],[9,12],[13,13],[15,14],[16,16],[16,18],[15,20],[12,21],[8,21]] },
    '9': { width: 20, points: [[16,14],[15,11],[13,9],[10,8],[9,8],[6,9],[4,11],[3,14],[3,15],[4,18],[6,20],[9,21],[10,21],[13,20],[15,18],[16,14],[16,9],[15,4],[13,1],[10,0],[8,0],[5,1],[4,3]] },
    ':': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[5,2],[4,1],[5,0],[6,1],[5,2]] },
    ',': { width: 10, points: [[5,14],[4,13],[5,12],[6,13],[5,14],[-1,-1],[6,1],[5,0],[4,1],[5,2],[6,1],[6,-1],[5,-3],[4,-4]] },
    '<': { width: 24, points: [[20,18],[4,9],[20,0]] },
    '=': { width: 26, points: [[4,12],[22,12],[-1,-1],[4,6],[22,6]] },
    '>': { width: 24, points: [[4,18],[20,9],[4,0]] },
    '?': { width: 18, points: [[3,16],[3,17],[4,19],[5,20],[7,21],[11,21],[13,20],[14,19],[15,17],[15,15],[14,13],[13,12],[9,10],[9,7],[-1,-1],[9,2],[8,1],[9,0],[10,1],[9,2]] },
    '@': { width: 27, points: [[18,13],[17,15],[15,16],[12,16],[10,15],[9,14],[8,11],[8,8],[9,6],[11,5],[14,5],[16,6],[17,8],[-1,-1],[12,16],[10,14],[9,11],[9,8],[10,6],[11,5],[-1,-1],[18,16],[17,8],[17,6],[19,5],[21,5],[23,7],[24,10],[24,12],[23,15],[22,17],[20,19],[18,20],[15,21],[12,21],[9,20],[7,19],[5,17],[4,15],[3,12],[3,9],[4,6],[5,4],[7,2],[9,1],[12,0],[15,0],[18,1],[20,2],[21,3],[-1,-1],[19,16],[18,8],[18,6],[19,5]] },
    'A': { width: 18, points: [[9,21],[1,0],[-1,-1],[9,21],[17,0],[-1,-1],[4,7],[14,7]] },
    'B': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[-1,-1],[4,11],[13,11],[16,10],[17,9],[18,7],[18,4],[17,2],[16,1],[13,0],[4,0]] },
    'C': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5]] },
    'D': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[11,21],[14,20],[16,18],[17,16],[18,13],[18,8],[17,5],[16,3],[14,1],[11,0],[4,0]] },
    'E': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11],[-1,-1],[4,0],[17,0]] },
    'F': { width: 18, points: [[4,21],[4,0],[-1,-1],[4,21],[17,21],[-1,-1],[4,11],[12,11]] },
    'G': { width: 21, points: [[18,16],[17,18],[15,20],[13,21],[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[18,8],[-1,-1],[13,8],[18,8]] },
    'H': { width: 22, points: [[4,21],[4,0],[-1,-1],[18,21],[18,0],[-1,-1],[4,11],[18,11]] },
    'I': { width: 8, points: [[4,21],[4,0]] },
    'J': { width: 16, points: [[12,21],[12,5],[11,2],[10,1],[8,0],[6,0],[4,1],[3,2],[2,5],[2,7]] },
    'K': { width: 21, points: [[4,21],[4,0],[-1,-1],[18,21],[4,7],[-1,-1],[9,12],[18,0]] },
    'L': { width: 17, points: [[4,21],[4,0],[-1,-1],[4,0],[16,0]] },
    'M': { width: 24, points: [[4,21],[4,0],[-1,-1],[4,21],[12,0],[-1,-1],[20,21],[12,0],[-1,-1],[20,21],[20,0]] },
    'N': { width: 22, points: [[4,21],[4,0],[-1,-1],[4,21],[18,0],[-1,-1],[18,21],[18,0]] },
    'O': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21]] },
    'P': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,14],[17,12],[16,11],[13,10],[4,10]] },
    'Q': { width: 22, points: [[9,21],[7,20],[5,18],[4,16],[3,13],[3,8],[4,5],[5,3],[7,1],[9,0],[13,0],[15,1],[17,3],[18,5],[19,8],[19,13],[18,16],[17,18],[15,20],[13,21],[9,21],[-1,-1],[12,4],[18,-2]] },
    'R': { width: 21, points: [[4,21],[4,0],[-1,-1],[4,21],[13,21],[16,20],[17,19],[18,17],[18,15],[17,13],[16,12],[13,11],[4,11],[-1,-1],[11,11],[18,0]] },
    'S': { width: 20, points: [[17,18],[15,20],[12,21],[8,21],[5,20],[3,18],[3,16],[4,14],[5,13],[7,12],[13,10],[15,9],[16,8],[17,6],[17,3],[15,1],[12,0],[8,0],[5,1],[3,3]] },
    'T': { width: 16, points: [[8,21],[8,0],[-1,-1],[1,21],[15,21]] },
    'U': { width: 22, points: [[4,21],[4,6],[5,3],[7,1],[10,0],[12,0],[15,1],[17,3],[18,6],[18,21]] },
    'V': { width: 18, points: [[1,21],[9,0],[-1,-1],[17,21],[9,0]] },
    'W': { width: 24, points: [[2,21],[7,0],[-1,-1],[12,21],[7,0],[-1,-1],[12,21],[17,0],[-1,-1],[22,21],[17,0]] },
    'X': { width: 20, points: [[3,21],[17,0],[-1,-1],[17,21],[3,0]] },
    'Y': { width: 18, points: [[1,21],[9,11],[9,0],[-1,-1],[17,21],[9,11]] },
    'Z': { width: 20, points: [[17,21],[3,0],[-1,-1],[3,21],[17,21],[-1,-1],[3,0],[17,0]] },
    '[': { width: 14, points: [[4,25],[4,-7],[-1,-1],[5,25],[5,-7],[-1,-1],[4,25],[11,25],[-1,-1],[4,-7],[11,-7]] },
    '\\': { width: 14, points: [[0,21],[14,-3]] },
    ']': { width: 14, points: [[9,25],[9,-7],[-1,-1],[10,25],[10,-7],[-1,-1],[3,25],[10,25],[-1,-1],[3,-7],[10,-7]] },
    '^': { width: 16, points: [[6,15],[8,18],[10,15],[-1,-1],[3,12],[8,17],[13,12],[-1,-1],[8,17],[8,0]] },
    '_': { width: 16, points: [[0,-2],[16,-2]] },
    '`': { width: 10, points: [[6,21],[5,20],[4,18],[4,16],[5,15],[6,16],[5,17]] },
    'a': { width: 19, points: [[15,14],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
    'b': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] },
    'c': { width: 18, points: [[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
    'd': { width: 19, points: [[15,21],[15,0],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
    'e': { width: 18, points: [[3,8],[15,8],[15,10],[14,12],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
    'f': { width: 12, points: [[10,21],[8,21],[6,20],[5,17],[5,0],[-1,-1],[2,14],[9,14]] },
    'g': { width: 19, points: [[15,14],[15,-2],[14,-5],[13,-6],[11,-7],[8,-7],[6,-6],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
    'h': { width: 19, points: [[4,21],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] },
    'i': { width: 8, points: [[3,21],[4,20],[5,21],[4,22],[3,21],[-1,-1],[4,14],[4,0]] },
    'j': { width: 10, points: [[5,21],[6,20],[7,21],[6,22],[5,21],[-1,-1],[6,14],[6,-3],[5,-6],[3,-7],[1,-7]] },
    'k': { width: 17, points: [[4,21],[4,0],[-1,-1],[14,14],[4,4],[-1,-1],[8,8],[15,0]] },
    'l': { width: 8, points: [[4,21],[4,0]] },
    'm': { width: 30, points: [[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0],[-1,-1],[15,10],[18,13],[20,14],[23,14],[25,13],[26,10],[26,0]] },
    'n': { width: 19, points: [[4,14],[4,0],[-1,-1],[4,10],[7,13],[9,14],[12,14],[14,13],[15,10],[15,0]] },
    'o': { width: 19, points: [[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3],[16,6],[16,8],[15,11],[13,13],[11,14],[8,14]] },
    'p': { width: 19, points: [[4,14],[4,-7],[-1,-1],[4,11],[6,13],[8,14],[11,14],[13,13],[15,11],[16,8],[16,6],[15,3],[13,1],[11,0],[8,0],[6,1],[4,3]] },
    'q': { width: 19, points: [[15,14],[15,-7],[-1,-1],[15,11],[13,13],[11,14],[8,14],[6,13],[4,11],[3,8],[3,6],[4,3],[6,1],[8,0],[11,0],[13,1],[15,3]] },
    'r': { width: 13, points: [[4,14],[4,0],[-1,-1],[4,8],[5,11],[7,13],[9,14],[12,14]] },
    's': { width: 17, points: [[14,11],[13,13],[10,14],[7,14],[4,13],[3,11],[4,9],[6,8],[11,7],[13,6],[14,4],[14,3],[13,1],[10,0],[7,0],[4,1],[3,3]] },
    't': { width: 12, points: [[5,21],[5,4],[6,1],[8,0],[10,0],[-1,-1],[2,14],[9,14]] },
    'u': { width: 19, points: [[4,14],[4,4],[5,1],[7,0],[10,0],[12,1],[15,4],[-1,-1],[15,14],[15,0]] },
    'v': { width: 16, points: [[2,14],[8,0],[-1,-1],[14,14],[8,0]] },
    'w': { width: 22, points: [[3,14],[7,0],[-1,-1],[11,14],[7,0],[-1,-1],[11,14],[15,0],[-1,-1],[19,14],[15,0]] },
    'x': { width: 17, points: [[3,14],[14,0],[-1,-1],[14,14],[3,0]] },
    'y': { width: 16, points: [[2,14],[8,0],[-1,-1],[14,14],[8,0],[6,-4],[4,-6],[2,-7],[1,-7]] },
    'z': { width: 17, points: [[14,14],[3,0],[-1,-1],[3,14],[14,14],[-1,-1],[3,0],[14,0]] },
    '{': { width: 14, points: [[9,25],[7,24],[6,23],[5,21],[5,19],[6,17],[7,16],[8,14],[8,12],[6,10],[-1,-1],[7,24],[6,22],[6,20],[7,18],[8,17],[9,15],[9,13],[8,11],[4,9],[8,7],[9,5],[9,3],[8,1],[7,0],[6,-2],[6,-4],[7,-6],[-1,-1],[6,8],[8,6],[8,4],[7,2],[6,1],[5,-1],[5,-3],[6,-5],[7,-6],[9,-7]] },
    '|': { width: 8, points: [[4,25],[4,-7]] },
    '}': { width: 14, points: [[5,25],[7,24],[8,23],[9,21],[9,19],[8,17],[7,16],[6,14],[6,12],[8,10],[-1,-1],[7,24],[8,22],[8,20],[7,18],[6,17],[5,15],[5,13],[6,11],[10,9],[6,7],[5,5],[5,3],[6,1],[7,0],[8,-2],[8,-4],[7,-6],[-1,-1],[8,8],[6,6],[6,4],[7,2],[8,1],[9,-1],[9,-3],[8,-5],[7,-6],[5,-7]] },
    '~': { width: 24, points: [[3,6],[3,8],[4,11],[6,12],[8,12],[10,11],[14,8],[16,7],[18,7],[20,8],[21,10],[-1,-1],[3,8],[4,10],[6,11],[8,11],[10,10],[14,7],[16,6],[18,6],[20,7],[21,10],[21,12]] }
};

Canvas.TextFunctions.letter = function( ch ) {
    return this.letters[ch];
};

Canvas.TextFunctions.ascent = function( font, size ) {
    return size;
};

Canvas.TextFunctions.descent = function( font, size ) {
    return 7.0 *size/ 25.0;
};

Canvas.TextFunctions.measure = function( font, size, str ) {
    var total = 0;
    var len = str.length;

    for ( i = 0; i < len; i++) {
		var c = this.letter( str.charAt(i));
		if ( c) {
			total += c.width * size / 25.0;
		}
    }
    return total;
};

Canvas.TextFunctions.draw = function( ctx,font,size,x,y,str ) {
    var total = 0;
    var len = str.length;
    var mag = size / 25.0;

    ctx.save();
    ctx.lineCap = "round";
    ctx.lineWidth = 2 * mag;

    for ( i = 0; i < len; i++) {
		var c = this.letter( str.charAt(i));
		if ( !c) { continue; }

		ctx.beginPath();

		var penUp = 1;
		var needStroke = 0;
		
		for ( j = 0; j < c.points.length; j++) {
			var a = c.points[j];
			
			if ( a[0] == -1 && a[1] == -1) {
				penUp = 1;
				continue;
			}
			
			if ( penUp) {
				ctx.moveTo( x + a[0]*mag, y - a[1]*mag);
				penUp = false;
			} else {
				ctx.lineTo( x + a[0]*mag, y - a[1]*mag);
			}
		}
		ctx.stroke();
		x += c.width*mag;
    }
    
    ctx.restore();
    return total;
};

Canvas.TextFunctions.enable = function( ctx ) {
	
	var t = this;
	
    ctx.drawText = function(font,size,x,y,text) { return t.draw( ctx, font,size,x,y,text); };
    ctx.measureText = function(font,size,text) { return t.measure( font,size,text); };
    ctx.fontAscent = function(font,size) { return t.ascent(font,size); };
    ctx.fontDescent = function(font,size) { return t.descent(font,size); };

    ctx.drawTextRight = function(font,size,x,y,text) { 
		var w = t.measure(font,size,text);
		return t.draw( ctx, font,size,x-w,y,text); 
    };
    
    ctx.drawTextCenter = function(font,size,x,y,text) { 
		var w = t.measure(font,size,text);
		return t.draw( ctx, font,size,x-w/2,y,text); 
    };
    
};

/*

=pod

=head1 NAME

Canvas.TextFunctions -renders ASCII letters on a Canvas 

=head1 SYNOPSIS

	JSAN.use('Canvas.TextFunctions');
	Canvas.TextFunctions.draw(ctx, Canvas.TextFunctions.letters, 15, 50, 20, "Hello World");
	
=head1 DESCRIPTION

This module renders letters on a Canvas by associating each letter with an array of coordinates and then by graphing through each of those coordinates. The data behind this is stored in Canvas.TextFunctions.letters, the primary function for drawing is Canvas.TextFunctions.draw().

Right now one of the biggest disadvantages of the Canvas tag for drawing graphics is the lack of text support, as such many solutions have been devised to solve this problem including converting truetype fonts to Canvas. Right now this module is a lightweight solution that is the most cost-efficient.

Web browser developers such as Mozilla and Safari have noticed the lack of textual support and they will hopefully eventually replace this module with a much more efficient CanvasRenderingContext2D.prototype.drawString() method. This may still need to be kept around for compatability purposes though for those people that still use old versions of Firefox and other web browsers.

=head1 DEPENDENCIES

CanvasRenderingContext2D

=head1 PROPERTIES

=head2 letters

This is an associative array which stores all the letters in Canvas.TextFunctions such as [A-Z][a-z][0..9] as keys and the values are arrays of coordinates which represent what the letter will look like when drawn.

Note that this is note a fixed-width font as such some letters are bigger then others, as such the width can be accessed as such:

	Canvas.TextFunctions.letters["0"].width; // returns 20
	
=head1 METHODS

=head2 letter(ch)

This returns the data behind a letter, this is the same as Canvas.TextFunctions.letter[ch].

	Canvas.TextFunctions.letter("U").width; // returns 22
	
=head2 ascent(font,size)

This returns the size.

	Canvas.TextFunctions.ascent(5,10);  // returns 10

=head2 descent(font, size)

This returns 7*size/25 which is what is needed to descend the font.

	Canvas.TextFunctions.descent(5,25); // returns 7

=head2 measure(font, size, str)

This will take a string argument, a font, and the size and it will return the total measurement.

	Canvas.TextFunctions.measure(Canvas.TextFunctions.letters,15,"abcdefghijklmnopqrstuvwxyz");

=head2 draw(ctx,font,size,x,y,str)

This is how you make text render onto the Canvas instance. The position is based on the x,y coordinates specified in the arguments, and it renders the text based on str. This is the primary function of the Canvas.TextFunctions module.

	var ctx = document.getElementById("canvas").getContext("2d");
	Canvas.TextFunctions.draw(ctx, Canvas.TextFunctions.letters, 15, 25, 25, "Hello World");

=head2 enable(ctx)

This takes an instance of CanvasRenderingContext2D or essentially just a canvas element and then it will attach drawText, measureText, fontDescent, and fontAscent methods to the instance. The methods attached are essentially the same except you do not need to specify the first ctx argument.

	var ctx = document.getElementById("canvas").getContext("2d");
	Canvas.TextFunctions.enable(ctx);
	
	ctx.drawText(Canvas.TextFunctions.letters, 15, 50, 50, "Canvas Enabled!");

=head1 AUTHORS

Jim Studt
Jhuni, <jhuni_x@yahoo.com>

=head1 COPYRIGHT

Public Domain

=cut

*/