// version 3.0 (C) 2001-2002 Joe Maller // Explanations available on my web site: // http://www.joemaller.com filter "Joe's Pixelizer"; group "Joe's Filters"; input shape, "Shape", Popup, 1, "square", "circle", "diamond"; input colorMethod, "Color:", Popup, 1, "Center Point (fast & chunky)", "Block Average (slow & smooth)"; input blocksize, "Block Size", slider, 25, 5, 100; input stagger, "Stagger", checkbox, 0; input Vspace, "V Space", slider, 0, -2, 100; input Hspace, "H Space", slider, 0, -2, 100; input VScatter, "V Scatter", slider, 0, 0, 100; input HScatter, "H Scatter", slider, 0, 0, 100; input ScatterDance, "Dancing Scatter", checkbox, 0; input blurvalue, "Blur", slider, 0, 0, 25; input ApplyAs, "Mode", Popup, 1, "Normal", "Multiply", "Screen", "Overlay", "Lighten", "Darken", "Add", "Subtract", "Difference"; input BlockOpacity, "Opacity", Slider, 100, 0, 100; input bgcolor, "Background", Color, 255, 0, 0, 0; input bgOpacity, "BG Fill", Slider, 0, 0, 100; input transparentBG, "Transparent", checkbox, 0; input Voffset, "V Offset", slider, 0, -50, 50 label "%" detent 0; input Hoffset, "H Offset", slider, 0, -50, 50 label "%" detent 0; input title, "www.joemaller.com", Label,""; ProducesAlpha; code exposedbackground = 1; randomseed(ScatterDance * -1 + 1); float w, h, i, j, shuffler, shapeArray[4], shapefix, diamondScale; color pointColor; point WhereAmI, altPoint, ScatterPoint; dimensionsOf(Dest, w, h); image xbuffer[w][h], xbuffer2[w][h]; float zoomfactor; zoomfactor = w/720; WhereAmI.x *= w; WhereAmI.y *= h; Hoffset = integer (Hoffset * blocksize/100); Voffset = integer (Voffset * blocksize/100); Hspace += 1; Vspace += 1; //corrects for built in overlap in DrawSoftDot shapeArray[1] = ksquare; shapeArray[2] = kround; shapeArray[3] = kdiamond; if colorMethod == 2; blur(src1, xbuffer2, blocksize/2 * zoomfactor, aspectof(dest)); else; xbuffer2 = src1; end if if bgOpacity > 0; ChannelFill(xbuffer, 255, bgcolor.r, bgcolor.g, bgcolor.b); matte(xbuffer, src1, dest, bgOpacity/100, kalpha); else; dest = src1; end if; xbuffer = dest; ChannelFill(xbuffer, 0, -1, -1, -1); //corrects for Alpha compositing halo diamondScale = 1; shapefix = 1; if shape == 2 && stagger == 1; shapefix = 0.866 ; end if; if shape == 3; diamondscale = sqrt(2); if stagger == 1; shapefix = 0.5; end if; end if; WhereAmI = {integer(w/-2 + (Hoffset - blocksize/2) * zoomfactor) , integer(h/-2 + (Voffset - blocksize/aspectOf(dest)/2) * zoomfactor)}; repeat while (WhereAmI.y < h + (2 * blocksize / aspectof(dest)) * zoomfactor); repeat while (whereAmI.x < w + (2 * blocksize) * zoomfactor); if WhereAmI.y > h/2 - 2; //last two rows of pixels are weird ScatterPoint = {whereAmI.x, h/2 - 2}; ColorOf(xbuffer2, ScatterPoint, pointColor); else; ColorOf(xbuffer2, WhereAmI, pointColor); end if; if HScatter > 0 || VScatter > 0; ScatterPoint.x = whereAmI.x + Random(-1 * HScatter/2, HScatter/2 * zoomfactor); ScatterPoint.y = whereAmI.y + Random(-1 * VScatter/aspectof(dest)/2, VScatter/aspectof(dest)/2 * zoomfactor); else; ScatterPoint = WhereAmI; end if; DrawSoftDot(xbuffer, ScatterPoint, shapeArray[shape], blocksize / diamondScale * zoomfactor, 0, 20, pointColor, 1, aspectOf(dest)); WhereAmI.x = WhereAmI.x + integer((blocksize + Hspace) * zoomfactor); End Repeat; if stagger == 1; if shuffler == 0.5; shuffler = 0; else; shuffler = 0.5; end if; else; shuffler = 0 end if WhereAmI.x = integer(w/-2 + ((Hoffset - blocksize/2) + ((blocksize + Hspace) * shuffler)) * zoomfactor) WhereAmI.y = WhereAmI.y + integer((integer(blocksize /aspectof(dest)) + integer(Vspace /aspectof(dest))) * shapefix * zoomfactor) end repeat; if blurvalue > 0; xbuffer2 = xbuffer; blur(xbuffer2, xbuffer, blurvalue, aspectof(dest)); end if; if transparentBG != 0; dest = xbuffer; else; if ApplyAs ==1; Matte(xbuffer, dest, dest, blockOpacity/100, kalpha); end if; if ApplyAs ==2; Multiply(dest, xbuffer, dest, blockOpacity/100, kalpha); end if; if ApplyAs ==3; Screen(dest, xbuffer, dest, blockOpacity/100, kalpha); end if; if ApplyAs ==4; Overlay(dest, xbuffer, dest, blockOpacity/100, kalpha); end if; if ApplyAs ==5; Lighten(dest, xbuffer, dest, blockOpacity/100, kalpha); end if; if ApplyAs ==6; Darken(dest, xbuffer, dest, blockOpacity/100, kalpha); end if; if ApplyAs ==7; add(dest, xbuffer, dest, blockOpacity/100, kalpha); end if; if ApplyAs ==8; subtract(dest, xbuffer, dest, blockOpacity/100, kalpha); ChannelCopy(src1, dest, kalpha, knone, knone, knone); end if; if ApplyAs ==9; Difference(dest, xbuffer, xbuffer, kalpha); ChannelCopy(src1, xbuffer, kalpha, knone, knone, knone); Matte(xbuffer, dest, dest, blockOpacity/100, knone); end if; end if;