String [] letters = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; PFont f; int ypos, ypos2; int xpos, xpos2; PGraphics masker; PImage img; String basetext; String masktext; void setup() { size(400, 410); img = createImage(); f = createFont("sans-serif", 500); textFont(f); masker = createGraphics(width, height); basetext = letters[int(random(letters.length))]; masktext = letters[int(random(letters.length))]; ypos = height*.95; ypos2 = height + 200; xpos = width*.5; xpos2 = width*.5; frameRate(30); smooth(); } void draw () { background(255); masker.beginDraw(); masker.textAlign(CENTER); masker.textFont(f); masker.background(255); masker.fill(0); masker.text(masktext, xpos, ypos); masker.endDraw(); textAlign(CENTER); textFont(f); fill(0); text(basetext, xpos2, ypos2); img = masker.get(); blend(img, 0, 0, masker.width, masker.height, 0, 0, width, height, ADD); textSize(16); text(str(basetext) + " as seen through " + str(masktext), width*.5, height-textDescent()-2); ypos2 -= 5; if (ypos2 < 10) { ypos2 = height + 400; basetext = letters[int(random(letters.length))]; masktext = letters[int(random(letters.length))]; } }