topical media & game development
graphic-canvas-util-liquid-liquid-canvas.js / js
Liquid Canvas jQuery Plugin
Version 0.3
Steffen Rusitschka http://www.ruzee.com MIT licensed
(function(.extend(this, {
width: canvas.width, height: canvas.height, ctx: canvas.getContext("2d"),
save: function() {
this.ctx.save();
stack.push({ width: this.width, height: this.height });
},
restore: function() {
this.ctx.restore();
.extend({}, Plugin, hash, { opts: opts, savedOpts: opts });
}
function pluginFromPlugins(plugins) {
return newPlugin({
paint: function(area) {
area.save();
this.action.opts = .each(plugins, function() { this.paint(area); });
area.restore();
},
setAction: function(action) {
this.action = action; // should call super if it existed ...
.extend({}, plugin.defaultOpts || {}, opts);
return newPlugin(plugin, opts);
}
function parse(s) {
s += " ";
var index = 0;
function err(m) { msg = m + " at " + index + ": ..." + s.substring(index) + "\nin " + s; alert(msg); throw msg; }
function cur() { return s.charAt(index); }
function next() { if (index > s.length) throw("Unexpected end"); return s.charAt(index + 1) }
function eat() { return s.charAt(index++); }
function skipWhite() { while (/\s/.exec(cur())) eat(); }
function check(c) {
skipWhite();
for (var i=0; i<c.length; ++i) {
if (cur() != c.charAt(i)) err("Expected '" + c.charAt(i) + "' found '" + cur() + "'");
eat();
}
}
//var parseApplications; // forward reference
function parseWord() {
skipWhite();
for (var word = []; /\w/.exec(cur()); word.push(eat()));
return word.join("");
}
function parseNumber() {
skipWhite();
for (var n = []; /\d/.exec(cur()); n.push(eat()));
return parseInt(n.join(""));
}
function parseString() {
skipWhite();
var s = [], start = cur();
if (/[^\'\"]/.exec(start)) { err("String expected") }
eat();
while (cur() != start) { if (cur() == "\\") s.eat(); s.push(eat()); }
check(start);
return s.join("");
}
// Yeah, strange thing - this does the CSS value like parsing
function parseValue() {
skipWhite();
for (var s = []; /[^;}]/.exec(cur()); s.push(eat()));
return s.join("");
}
function parseLiteral() {
skipWhite();
if (/\d/.exec(cur())) return parseNumber();
if (/['"]/.exec(cur())) return parseString();
return parseValue();
}
function parseOpts() {
check("{");
skipWhite();
var opts = {};
while (cur() != "}") {
var key = parseWord();
check(":");
opts[key] = parseLiteral();
skipWhite();
if (cur() == "}") break;
check(";");
}
check("}");
return opts;
}
function parsePlugin() {
var name = parseWord();
skipWhite();
opts = cur() == "{" ? parseOpts() : {};
return pluginFromName(name, opts);
}
function parsePlugins() {
check("[");
skipWhite();
var plugins = [];
while (cur() != "]") {
plugins.push(parsePlugin());
skipWhite();
}
check("]");
return pluginFromPlugins(plugins);
}
function parseActors() {
skipWhite();
return cur() == "[" ? parsePlugins() : parsePlugin();
}
function parseAction() {
var action;
skipWhite();
if (cur() == "(") {
eat();
action = parseApplications();
check(")");
} else {
action = parsePlugin();
}
return action;
}
function parseApplication() {
var actors = parseActors();
check("=>");
var action = parseAction();
actors.setAction(action);
return actors;
}
function parseApplications() {
var applications = [];
while (true) {
applications.push(parseApplication());
skipWhite();
if (cur() != ",") break;
check(",");
}
return pluginFromApplications(applications);
}
return parseApplications();
}
function checkResize(container, force) {
var container.data('liquid-canvas');
if (!data) return;
var canvas = data.canvas;
var container.outerWidth();
var h = canvas.css({ left: container.offsetLeft + "px", top: container.offsetTop + "px" });
canvas.width = w;
canvas.height = h;
var area = new Area(canvas);
area.save();
data.paint(area);
area.restore();
}
}
function checkAllResize(force) {
.isFunction(func)) {
paint = func;
} else {
var plugin = parse(func)
paint = function(area) { plugin.paint(area); };
}
this.data("liquid-canvas", {
"canvas": canvas,
"paint": paint
});
this.css({ background: "transparent" });
if (this.css("position") != "absolute") this.css({ position: "relative" });
canvasElements.push(this);
checkResize(this, true);
});
}
});
jQuery.extend({
registerLiquidCanvasPlugin: function(plugin) {
plugins[plugin.name] =
(C) Æliens
20/2/2008
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.