// v3.5 // // wvwwvwvww // \ / // \______/ // // Joe's Filters // for Final Cut Pro // (C) 2002 Joe Maller // http://www.joesfilters.com // http://www.fxscriptreference.org filter "Joe's Soft Shapes"; group "Joe's Soft Stuff"; input ShapeWidth, "Width", Slider, 150, 1, 1000 ramp 80; input ShapeHeight, "Height", Slider, 150, 1, 1000 ramp 80; input ShapeScale, "Scale", Slider, 100, 1, 1000; input origin, "Origin", point, 0, 0; input numSides, "Sides", Slider, 4, 3, 12 detent 3, 4, 5, 6, 7, 8, 9, 10, 11, 12; input ShapeAngle, "Angle", Angle, 0, -360, 360; input BlurAmount, "Blur", Slider, 10, 0, 250 ramp 85; input MaskBlur, "Softness", Slider, 5, 0, 250 ramp 85; input SpotInvert, "Invert", checkbox, 0; input ApplyAs, "Mode", Popup, 1, "Normal", "Shape Only", "Multiply", "Screen", "Overlay", "Lighten", "Darken", "Add", "Subtract", "Difference"; input Opacity, "Opacity", slider, 100, 0, 100; input shape, "Shape Preview", Label,""; input shapePreview, "Draw Shape", checkbox, 0; input frameColor, "Frame Color", color, 255, 255, 255, 255; input frameWidth, "Frame Width", slider, 2, 1, 25; input frameSoft, "Frame Softness", slider, 0, 0, 25; input frameOpacity, "Frame Opacity", slider, 50, 0, 100; input title, "Joe's Filters", Label,""; input title1, "www.joesfilters.com", Label,""; ProducesAlpha code exposedbackground=1 float h, w, i, angleFix; point ShapeCorners[numSides]; dimensionsof(dest, w, h); image xbuffer[w][h]; float zoomfactor; zoomfactor = w/720 angleFix = (numSides == 4 || numSides == 6 || numSides == 8) ? 360/numsides/2 : 0 // corrects the rotation of squares, hexagons and octagons, which I prefer flat-side top origin.x *= w; origin.y *= h; for i = 1 to numSides; ShapeCorners[i-1].x = origin.x + ShapeScale/100 * ShapeWidth * cos(360/numSides * i -90 - angleFix) * zoomfactor; ShapeCorners[i-1].y = origin.y + ShapeScale/100 * ShapeHeight * sin(360/numSides * i -90 - angleFix) * zoomfactor / aspectOf(dest); next; Rotate(ShapeCorners, origin, ShapeAngle, aspectOf(dest)); ChannelFill(dest, 255, 0, 0, 0); FillPoly(ShapeCorners, dest, kWhite); if MaskBlur > 0; Blur(dest, xbuffer, MaskBlur * zoomfactor, aspectof(dest)); else xbuffer = dest; end if; Blur(src1, dest, BlurAmount * zoomfactor, aspectOf(dest)); ChannelCopy(xbuffer, dest, kred, knone, knone, knone); xbuffer = dest if SpotInvert == 1 InvertChannel(xbuffer, xbuffer, 1, 0, 0, 0) end if if ApplyAs == 1; Matte(xbuffer, src1, dest, opacity/100, kalpha); end if if ApplyAs == 2; ChannelFill(dest, 0, 0, 0, 0); ChannelMultiply(xbuffer, dest, opacity/100, 1, 1, 1); end if; if ApplyAs == 3; Multiply(src1, xbuffer, dest, opacity/100, kalpha); end if if ApplyAs == 4; Screen(src1, xbuffer, dest, opacity/100, kalpha); end if if ApplyAs == 5; Overlay(src1, xbuffer, dest, opacity/100, kalpha); end if if ApplyAs == 6; Lighten(src1, xbuffer, dest, opacity/100, kalpha); end if if ApplyAs == 7; Darken(src1, xbuffer, dest, opacity/100, kalpha); end if if ApplyAs == 8; add(src1, xbuffer, dest, opacity/100, kalpha); end if; if ApplyAs == 9; subtract(src1, xbuffer, dest, opacity/100, kalpha); end if; if ApplyAs == 10; Difference(src1, xbuffer, dest, kalpha); ChannelCopy(src1, dest, kalpha, knone, knone, knone); Matte(dest, src1, dest, opacity/100, knone); end if; if shapePreview == 1; frameWidth *= zoomfactor; point sourceRect[4], destRect[4]; color frameTempColor frameOpacity *= 255/100 frameTempColor = {255, frameOpacity, frameOpacity, frameOpacity}; image aspectBuffer[w][h * aspectOf(dest)]; ChannelFill(aspectBuffer, 255, 0, 0, 0); //fills scalebuffer with empty pixels ChannelFill(xbuffer, 255, 0, 0, 0); //fills xbuffer with empty pixels for i = 0 to (numSides - 1) ShapeCorners[i].y *= aspectOf(dest); next FramePoly(ShapeCorners, aspectBuffer, frameTempColor, frameWidth); boundsOf(aspectBuffer, sourceRect); boundsOf(dest, destRect); BlitRect(aspectBuffer, SourceRect, xbuffer, DestRect); if frameSoft > 0 image blurbuffer[w][h]; blurbuffer = xbuffer BlurChannel(blurbuffer, xbuffer, frameSoft * zoomfactor, 0, 1, 0, 0, aspectOf(dest)); end if; ChannelCopy(xbuffer, xbuffer, kred, knone, knone, knone); ChannelFill(xbuffer, -1, frameColor.r, frameColor.g, frameColor.b); Matte(xbuffer, dest, dest, 1, kalpha); end if;