G.O.O.G.L.E. Tag

By ysugano Last update Jan 27, 2010 — Installed 458 times.

There are 7 previous versions of this script.

// ==UserScript==
// @name			G.O.O.G.L.E. Tag
// @namespace		http://tokyo.fffff.at/
// @include			http://www.google.tld/
// @include			http://www.google.tld/intl/*/
// @include			http://www.google.tld/webhp*
// @require			http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js
// ==/UserScript==

(function() {

// logo position
var logo = $("#logo");
var base = logo.parent();

// canvas settings
var width = 2*logo.width();
var height = logo.height();
var offset_top = logo.offset().top;
var offset_left = logo.offset().left - 0.5*logo.width();

// press num key to change colors
var colors = [
	"red",
	"green",
	"blue",
	"cyan",
	"magenta",
	"yellow",
	"black",
	"white"
];

// canvas to show strokes
var canvas_front = unsafeWindow.document.createElement("canvas"); // unsafe!!!
$(canvas_front).attr("width", width);
$(canvas_front).attr("height", height);
$(canvas_front).css("top", offset_top);
$(canvas_front).css("left", offset_left);
$(canvas_front).css("position", "absolute");
$(canvas_front).attr("id", "front");

var ctx_front = canvas_front.getContext("2d");
ctx_front.strokeStyle = colors[0];
ctx_front.lineWidth = 5;
ctx_front.lineJoin = "round";
ctx_front.lineCap = "round";

// canvas to show drips
var canvas_back = canvas_front.cloneNode(false);
$(canvas_back).attr("id", "back");

var ctx_back = canvas_back.getContext("2d");
ctx_back.strokeStyle = colors[0];
ctx_back.lineWidth = 2;
ctx_back.lineJoin = "round";
ctx_back.lineCap = "round";

// class for dripping effect
var drip_step = 2;
var drip_max_length = 30;
var drip_creation_rate = 0.1;
var drip_stop_rate = 0.05;
var drips = new Array();

var Drip = function(init_x, init_y) {
	this.x = init_x;
	this.y = init_y;
	
	this.drip_length = 0;
	
	this.dripping = true;
	
	this.draw = function(context) {
		context.beginPath();
		context.moveTo(this.x, this.y);
		this.y += drip_step;
		context.lineTo(this.x, this.y);
		context.stroke();
		context.closePath();
		
		this.drip_length += drip_step;
		
		if(this.drip_length > drip_max_length || Math.random() < drip_stop_rate) {
			this.dripping = false;
		}
	};
};

// ref. http://gist.github.com/226604

var spray_x = -1;
var spray_y = -1;

$(canvas_front).mousedown(function(e) {
	spray_x = window.pageXOffset + e.clientX - offset_left;
	spray_y = window.pageYOffset + e.clientY - offset_top;
	
	ctx_front.beginPath();
	ctx_front.moveTo(spray_x, spray_y);
});

$(canvas_front).mouseup(function(e) {
	spray_x = -1;
	spray_y = -1;
	ctx_front.closePath();
});

$(canvas_front).mouseout(function(e) { // same as above
	spray_x = -1;
	spray_y = -1;
	ctx_front.closePath();
});

$(canvas_front).mousemove(function(e) {
	if (spray_x < 0 || spray_y < 0) {
		return;
	}
	
	spray_x = window.pageXOffset + e.clientX - offset_left;
	spray_y = window.pageYOffset + e.clientY - offset_top;
	
	if(Math.random() < drip_creation_rate) {
		drips.push(new Drip(spray_x, spray_y));
	}
	
	ctx_front.lineTo(spray_x, spray_y);
	ctx_front.stroke();
	
	ctx_front.moveTo(spray_x, spray_y);
});

// hook keypress to change colors
$(document).keypress(function(e) {
	var key_num = parseInt(String.fromCharCode(e.which));
	if(key_num < colors.length) changeColor(key_num);
});

logo.after($(canvas_front));
logo.after($(canvas_back));

setInterval(drawDrips, 100);

// dripping effect
function drawDrips() {
	for(var i=0; i<drips.length; i++) {
		if(drips[i].dripping) {
			drips[i].draw(ctx_back);
		}
	}
}

// color change
function changeColor(i) {
	// merge canvases
	ctx_back.drawImage(canvas_front, 0, 0);
	var empty_img = ctx_front.createImageData(width, height);
	ctx_front.putImageData(empty_img, 0, 0);
	
	// clear drips
	drips = new Array();
	
	// change color
	ctx_front.strokeStyle = colors[i];
	ctx_back.strokeStyle = colors[i];
}

})();