├── .gitattributes ├── README.md ├── as ├── DRAWING_TOOL.fla └── as │ ├── ARRAYS.as │ ├── AUTHENTICIFY.as │ ├── CLIPBOARD.as │ ├── FILEREFERENCE.as │ ├── FX.as │ ├── MATH.as │ ├── MISC.as │ ├── SAVING_SHARED.as │ ├── SOUND.as │ ├── WRITE_TEXT.as │ ├── drawingtool │ ├── ASCIIPAINT.as │ ├── BACON.as │ ├── BLEND_AND_DISPLACE.as │ ├── COLORFACTORY.as │ ├── CUSTOMINK.as │ ├── DOTTEDLINES.as │ ├── DRAW_AND_FILL.as │ ├── EGGS.as │ ├── GIFBRUSH.as │ ├── GLASS_STAMPS.as │ ├── GOLDFISH.as │ ├── LOWINK.as │ ├── PATTERNSPRAY.as │ ├── PERLINBRUSH.as │ ├── PERLINCHALK.as │ ├── RAINBOWPAINT.as │ ├── RUNNYINK.as │ ├── SCREAM_INTO_THE_VOID.as │ ├── SMUDGE.as │ ├── SOFTBRUSH.as │ ├── SOUND_FILES.as │ ├── SPRAY.as │ ├── TOAST.as │ ├── _BITMAP.as │ ├── _DRAWING.as │ ├── _DRAWING_UI.as │ ├── _SETUP.as │ └── _UNDO_REDO_CLEARALL.as │ ├── misc │ └── DIALOGUE.as │ └── tools │ ├── AUTHENTICIFY_UI.as │ ├── COLOR.as │ ├── COLOR_SPECIALFX.as │ ├── DISPLACEMENT.as │ └── SMOOSHER.as ├── build └── DRAWING_TOOL.swf ├── cpp └── .gitkeep └── js ├── .gitkeep └── ASCIIPAINT ├── fontquirrels ├── fsex300-demo.html ├── fsex300-webfont.eot ├── fsex300-webfont.svg ├── fsex300-webfont.ttf ├── fsex300-webfont.woff ├── generator_config.txt ├── specimen_files │ ├── easytabs.js │ ├── fsex300-cleartype.png │ ├── grid_12-825-55-15.css │ └── specimen_stylesheet.css └── stylesheet.css ├── images ├── IMG_BLUE.png └── IMG_BLUE_SML.png └── index.html /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | *.js linguist-detectable=true 3 | *.as linguist-language=ActionScript 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # The Electric Zine Maker Source Code... 2 | 3 | Thanks to a contribution by the [Clinic for Open Source Arts (COSA) at the University of Denver](https://www.du.edu/ahss/opensourcearts/) the [Electric Zine Maker](https://alienmelon.itch.io/electric-zine-maker) is now open sourced. 4 | 5 | This is a VERY early stage of the open sourcing process. All of the Electric Zine Maker, the various language renditions that it will undergo, and all the messy prototype bits, will be available here thanks to this grant. 6 | 7 | This early version of it should be strongly viewed as a code prototype. It in no way reflects a finished version or is reflective of whatever technology the finished version will be in. When I make things I usually make them in a few different things and re-write them a lot. 8 | 9 | The undergoing philosophy, and reason, that the Electric Zine Maker is being built like this is that it is in part a code-preservation project for old "code memes" that used to be popular in the Flash days (many of these are my takes of these "code memes"). 10 | This is important to me because the Flash community had a very specific "look", or aesthetic, that also defined the early internet. I've been going through great pains to re-discover, re-write, and otherwise capture a lot of these memes. 11 | When I say "code meme" I am talking about the type of project where one dev says "look at this cool visual thing I built!" and you had about twenty others trying to recreate it and put their "take" on it. Many of these where viral and where generously shared everywhere. Wonderfl was maybe the last place where this happened before shutting down. 12 | The internet, and developing for it, has changed a lot and you don't really see these types of technical memes as much as you used to. 13 | The authenticity of these are very important to me. A technology expresses a visual style that is unique to it, especially if it was a predominant one. The mentalities, philosophies, and expression surrounding that technology is unique. "Saving" a part of that fingerprint is important. 14 | 15 | So the Electric Zine Maker's toolset is built around many of these old aesthetic code memes. ASCII art conversion, water over an image, diffusion, blending, "fake" 3D (that looks so unique for how "bad" it was), intense gradients... These are all things that have been informing the EZM toolset. 16 | I'm writing it this way to capture and in a way preserve much of this old code. 17 | Code is a form of literature. Code is poetry. Code can sometimes become kind of like a "proverb" or "common saying" in developer spaces surrounding a technology. 18 | I don't want this "literature" to be lost, so I started building this early prototype this way. 19 | 20 | Every technology has experiments that are unique to it. Especially the experiments that deal with visuals. Flash had those, and so many that are worth aesthetically preserving in a tool. 21 | I think this is very interesting and I would encourage anyone to gather visual experiments that define a technology and build an art tool around your interpretation of those, treating them like they are tools for drawing. 22 | I believe that computers have enabled a lot of amazing styles that would never have been possible, or thought of, with traditional physical mediums. I don't understand why we spend so much time trying to simulate watercolors, pencil textures, crayons.... when we can build around glitch art, ASCII, fuzzy textures, interpolation, strange and wonderful visual math experiments... these are things that define the visual style of computers. Every technology has "takes" that are unique to it. THESE can be the art tools that artists use to paint their pictures. 23 | So the Electric Zine Maker's art tool is my collection of hunting down and "saving" Flash ones. 24 | 25 | Source is commented with where what may have come from. I understand that I should have done a better job at compiling a history, but I never had any intention of open sourcing this (or sharing any of this), so that aspect is very rushed. I will do a better job later in development. 26 | 27 | Later versions of the Electric Zine Maker will be ported to javascript so there can be a web version. 28 | There will also (very likely) be a Haxe version so Linux users can enjoy it too (although I'm not completely set on Haxe, I may choose something else for its Linux support). 29 | 30 | Once the code prototype of the Electric Zine Maker is complete (in entirety) then versions in other languages will be made available here. 31 | 32 | Note that the Electric Zine Maker being built this way was always the plan. I just had no intention of open sourcing it since my code is very messy, and I didn't think there was interest in a project like this. 33 | 34 | Also note that everything is provided "as is". I can't help with code here or requests. If (in the very strange) case that you want to use this or work with this... you're welcome to it! and are on your own... but thank you for your interest in it! 35 | 36 | Also, final note, I am not a good programmer. I am self taught and never had any formal training. What you see is how I roll... sorry. 37 | 38 | !["COSA logo"](http://nathalielawhead.com/noodles/cosaSticker1.png) 39 | -------------------------------------------------------------------------------- /as/DRAWING_TOOL.fla: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alienmelon/Electric-Zine-Maker/0670e9356823e4ee17ce99ef60e3a909d6e24694/as/DRAWING_TOOL.fla -------------------------------------------------------------------------------- /as/as/ARRAYS.as: -------------------------------------------------------------------------------- 1 | //punctuation 2 | var arr_punctuation:Array = new Array("...", "...", "...", ".", ".", ".", "!", "?", "!?", "??"); 3 | // 4 | var arr_potato_click:Array = new Array("Zines are pretty great! I hope this tool helps.", "Please make a zine about a potato! Thank u!", "I'm so happy to be part of your creative process!", "I'm just happy to be here and be able to share in the creative process.", "Thank you for letting me help!", "I'm a good potato!", "I have a lot of respect for DIY artists. It's so cool to be part of this!", "I love DIY art things. Zines are so cool.", "Zines are awesome! Yay!", "I love zines.", "I love zines, although I'm not 100% certain how to pronounce the word. It's kinda too late to ask. It would be awkward.", "How do you pronounce zine anyway...?", "alienmelon made this tool because they really wanted something like MS Paint but for zines.", "How are you? I'm doing great! I'm a potato helper!", "I'm not really an Electric Love Potato yet. I'm volunteering in this software to earn my stripes so I can be one!", "I'm volunteering being a potato assistant in this zine tool so I can earn my stripes and become a full fledged Electric Love Potato.", "OH MY GOD I LOVE ZINES!", "I LOVE ZINES!", "Hey! You're pretty great!", "Haha! That tickles!", "You're so talented, oh my god!", "Hey! Draw me!!!", "Draw me! Draw me!!", "Ha! That tickles! OMG!", "omg draw me! Draw me! Yay!", "Whenever I have writers block I think of potatoes and that always inspires me. I'm a potato. I inspire myself!", "I'm a potato! One of the best!", "I'm a potato assistant. I'm one of the best! Ha!", "Haha!", "Oh!", "Oh haha!", "Yay!", "I'm so happy!", "I love zines! Yes!", "I love zines! No doubt! Yup!", "Writers block is all part of the creative process. No worries if you're having it! Just believe in yourself!", "Just believe in yourself and your creative process. You'll do great!", "You'll do great! Just make art and put yourself out there!", "Zines are fun!", "Yay! I love zines! I love being here!", "I love being here! Thank you for using this program!", "Yay! Thank you for using this program! It keeps me employed.", "I'm employed right now because you're running this program, so thank you for that. I love this job!", "I love this job! I love being a potato assistant. I give the best tool-tips! Yup!!", "Yay! I'm happy!", "Yay! I'm so happy to be part of the creative process! You have no idea...", "alienmelon loves UI work. As you can tell. They really got into the colors with this one.", "Haha! omg that tickles!", "Yay! I love being clicked! Clicks actually tickle. Haha!", "Omg haha! Mouse clicks tickle!"); 5 | //print messages 6 | var arr_printMsg:Array = new Array("Printing a zine!", "Printing a zine!", "Printing a zine :)", "A zine is printing, yay!", "Yay! Zine incoming!", "Yay! A zine is printing!", "Your zine is printing :D", "A tiny zine is being printed!", "Yay! Here comes your zine!", "Your zine is being printed :D", "Printing a tiny zine!", "Printing a zine! :D", "Zine printing! :)", "Yay! A zine is printing. :)"); 7 | //fanzine tagline 8 | var arr_fanzineline:Array = new Array("What's it take to graduate from 'fanzine' to 'zine', you ask? This tool will help!", "Authenticity ensures that you graduate from 'fanzine' to 'zine'!", "Authenticity is the difference between an ordinary 'fanzine' and a legit 'zine'!", "Authenticity is the difference between a regular 'fanzine' and an actual 'zine'.", "The Authenticity tool will ensure that you graduate from 'fanzine' to 'zine'!", "Tired of telling them that it's a 'zine' and not 'fanzine'? Add authenticity!"); 9 | //invisible creature 10 | var arr_invisibleCreature:Array = new Array("\n\n\n..(-.-)..", "\n\n\n..(-.-)..", "\n\n\n..(-.-)..", "\n\n\n..(-.-)..", "\n\n\n..(-.-)..", "\n\n\n..(-.-)..", "\n\n\n..(-_-)..", "\n\n\n..(-_-)..", "\n\n\n..(-_-)..", "\n\n\n..(-_-)..", "\n\n\n..(-_-)..", "\n\n\n..(-_-)..", ":o hey! this is my secret space!", "an invisible creature occupies this space!", "shhh! an invisible creature is napping here!", "oh hey! i am an invisible creature. this is my home.", "something is hiding behind this UI. it looks invisible.", "something invisible is hiding here!", ":D", ":)", ":p", ":0", ":o", ":|", "*growl*", "*giggles*", "uh oh!", "haha!", "oh hey!", "hey!", "hi!"); 11 | //dotted line compliments 12 | var arr_dottedLines:Array = new Array("This tool is made possible because of virtual ants.", "Release the virtual ants!", "Hey! You're doing great!", "You're doing so good!", "I LOVE your art.", "You're such a good artist.", "Good job!", "Yes. Love what you're doing.", "The digital ants make these lines possible.", "Haha, that tickles!", "Hey! You're cool.", "I like your stuff.", "Nice work. Very nice. Yes.", "I like your zines :3", ":3 hey~", "I love your work :3", "Looking good!", "This zine is going to be so good...", "This zine is going to be great!", "lol this zine is going to be so good!", "Yes. Good job zine making!", "Excellent zine making skills!", "These are some excellent zine making skills.", "Impressive zine making prowess, yes.", "Nice!", "Yay!", ":3", ":3", ";3", "I like your work :3", "I like your art :3"); 13 | //VOID 14 | var arr_void:Array = new Array("the void is pleased with your cries. it rewards you with great art", "the void consumes your art. it is pleased", "the void consumes your art", "ah yes, the torment of artistic authenticity", "the void embraces your screams and rewards you with great art", "the void rewards you with great art. you are heard", "the void rewards your tormented genius with great art", "ah yes, the cold brutal torment of the artistic genius", "you feel validated", "you feel understood", "you feel less frustrated", "ah yes... that was good", "at last! you feel understood", "yes... you feel validated", "you feel so validated right now", "such validation", "the void hears you... great art comes with great validation", "ah yes, you feel less consumed by the passion to create great art", "such great art", "as your screams echo back, you feel validated by the resulting art", "you feel validated by the resulting art. it was worth it", "you feel validated. it was worth it. such great art"); 15 | //the void ____ you 16 | var arr_void_actions:Array = new Array("validates", "hears", "acknowledges", "understands", "takes note of", "ignores", "is indignant towards", "receives", "gets", "gets", "knows", "appreciates", "notices", "recognizes", "approves of", "certifies", "justifies", "legitimizes", "verifies", "approves of", "approves"); 17 | //skeleton facts (for the ascii tool) 18 | var arr_skeleton_didyouknow: Array = new Array("Did you know? Skeletons hold your body together. Without them you would be a puddle!", "Did you know? Without skeletons there would be no people!", "Did you know? Skeletons keep us from being people puddles. Please thank your skeleton!", "Did you know? Skeletons are awesome, and everybody has one!", "Did you know? There is a skeleton hiding in your body just waiting to pop out!", "Did you know? One day all skeletons plan on popping out of their human hosts at the same time!", "Did you know? Without your skeleton you would collapse in on yourself!", "Did you know? Skeletons are pretty awesome and very necessary.", "Did you know? Before skeletons where invented humans where actually slugs!", "Did you know? Humanity invented skeletons to keep them from being gross people puddles!", "Skeletons always look like they are smiling because they are happy about being dead!", "Did you know? If you had no skeleton you would implode on yourself! That would be gross!", "Did you know? Without your skeleton you would be a disgusting mess. You are welcome!", "Did you know? Slugs don't have skeletons. Without your skeleton you would be a slug. Gross!", "Did you know? Skeletons keep humanity from being gross. Without them you would be a slug!", "Did you know? Skeletons can be used to make a broth after they are no longer used.", "Did you know? A skeletons primary function is to prop up your body. You are welcome!", "Did you know? A skeleton is basically the framework of your body. Humans need us!", "Did you know? A skeleton is a pretty awesome thing and you should appreciate us!", "Did you know? Skeletons can break, but we heal too. We are self-sustaining!", "Did you know? Without their skeletons humanity would be a weird gross pile of skin!"); 19 | //compliments in the PAINT AND FILL tool 20 | var arr_paintandfill_compliments:Array = new Array("Hey! You're pretty lovely!", "You're doing great!", "I love your style :)", "You're pretty cool!", "Hey! You're nice!", "Hey! I like you! :)", "You're doing great! :D", "You got this! :)", "You can do it! :D", "Hey! You're pretty great!", "Yay! You're doing it!", "Yay! You go!", "Look at you go! :D", "Yay! So cool!!", "Woohoo!", "Hello :)", "Oh hey :D", "Yay!"); 21 | 22 | 23 | function rand_array(arr:Array){ 24 | return arr[Math.ceil(Math.random()*arr.length)-1]; 25 | }; -------------------------------------------------------------------------------- /as/as/AUTHENTICIFY.as: -------------------------------------------------------------------------------- 1 |  2 | //Floyd, stucki, false floyd... 3 | //TODO: THESE HAVE BEEN REMOVED FOR FIXING 4 | 5 | function dither_floyd(_bitmapData:BitmapData, num_amnt:Number, grayscale:Boolean){ 6 | 7 | } 8 | 9 | function dither_falseFloyd(_bitmapData:BitmapData, num_amnt:Number, grayscale:Boolean){ 10 | 11 | } 12 | 13 | function dither_stucki(_bitmapData:BitmapData, num_amnt:Number, grayscale:Boolean){ 14 | 15 | } 16 | 17 | function dither_noDither(_bitmapData:BitmapData, num_amnt:Number, grayscale:Boolean){ 18 | 19 | } 20 | 21 | //DESATURATE AT A LEVEL 22 | 23 | function desaturate_dither(bitmapData:BitmapData, level:Number){ 24 | 25 | 26 | } 27 | 28 | ///MONOCRHOME IMAGE 29 | //myBitmapData.draw(sendToGray(myBitmapData.width, myBitmapData.height, myBitmapImage)); 30 | function sendToGray(w: int, h: int, drawItem): Bitmap { 31 | var myBitmapData: BitmapData = new BitmapData(w, h); 32 | myBitmapData.draw(drawItem); 33 | 34 | var bmp: Bitmap = new Bitmap(setGrayScale(myBitmapData)); 35 | 36 | return bmp; 37 | } 38 | 39 | function setGrayScale(obj: BitmapData): BitmapData { 40 | 41 | var rLum: Number = 0.2225; 42 | var gLum: Number = 0.7169; 43 | var bLum: Number = 0.0606; 44 | 45 | var matrix: Array = [rLum, gLum, bLum, 0, 0, 46 | rLum, gLum, bLum, 0, 0, 47 | rLum, gLum, bLum, 0, 0, 48 | 0, 0, 0, 1, 0 49 | ]; 50 | 51 | var filter: ColorMatrixFilter = new ColorMatrixFilter(matrix); 52 | obj.applyFilter(obj, new Rectangle(0, 0, obj.width, obj.height), new Point(0, 0), filter); 53 | 54 | return obj; 55 | }; 56 | 57 | //pixelate an image 58 | function filt_pixelate(bmData:BitmapData, bm:Bitmap, blockSize:Number) 59 | { 60 | var bitmap:Bitmap = new Bitmap( bmData ); 61 | bitmap.smoothing = true; 62 | // 63 | var bmd_pixeldiv:BitmapData = new BitmapData(bmData.width/blockSize, bmData.height/blockSize); 64 | var matrix:Matrix = new Matrix(); 65 | matrix.scale(1/blockSize, 1/blockSize); 66 | bmd_pixeldiv.draw(bitmap, matrix); 67 | // Avoid "bitmap.smoothing = true" here to keep it bmd_pixel 68 | matrix.invert(); // opposite effect from before 69 | bmData.draw( bmd_pixeldiv, matrix, null, null, null, false); 70 | // 71 | bmd_pixeldiv.dispose(); // always dispose BitmapData no longer needed 72 | // 73 | } 74 | 75 | //input bitmapData that should be monochromed 76 | function monochrome(bmd: BitmapData): void { 77 | var bmd_copy: BitmapData = bmd.clone(); 78 | // source pixels will be compared with this value 79 | var level: uint = 0xFFAAAAAA; 80 | // 81 | var rect: Rectangle = new Rectangle(0, 0, bmd.width, bmd.height); 82 | // The point within the current BitmapData instance that corresponds to the upper-left corner of the source rectangle. 83 | var dest: Point = new Point(); 84 | // 85 | bmd.threshold(bmd_copy, rect, dest, ">", level, 0xFFFFFFFF, 0xFFFFFFFF); 86 | bmd.threshold(bmd_copy, rect, dest, "<=", level, 0xFF000000, 0xFFFFFFFF); 87 | bmd_copy.dispose(); 88 | } 89 | 90 | //FIRST HALFTONE, makes image larger to set to halftone, smaller turns it into grayscale with interesting block patterns, good for playing with values and getting a b&w glitch type effect 91 | //Draws a halftone version of a bitmap onto a sprite. 92 | //draw_large_halftone(BitmapData, Bitmap, 1, 0x000000, false, 1, false); 93 | 94 | function draw_large_halftone(bmpSource: BitmapData, bmp:Bitmap, pointRadius: int, fgColor: uint, isReversed: Boolean, pointMultiplier: Number, isAlreadyGrayscale: Boolean, restrainSize:Boolean = true) { 95 | 96 | var s:Sprite = new Sprite(); 97 | this.addChild(s); 98 | 99 | if (bmpSource == null || s == null) return; 100 | 101 | if (pointRadius <= 0) pointRadius = 5; 102 | else pointRadius = int(Math.abs(pointRadius)); 103 | if (pointMultiplier <= 0) pointMultiplier = 1; 104 | else pointMultiplier = Math.abs(pointMultiplier); 105 | 106 | // ========================================== 107 | 108 | var pointRadiusHalf: Number = int(pointRadius / 2); 109 | 110 | var ratio: Number = pointRadius / 256 / 2 * (pointMultiplier * 1.25); 111 | var ptX: int, ptY: int; 112 | var thisPx: int, lastPx: int; 113 | 114 | ptY = pointRadiusHalf; 115 | 116 | for (var y: int = 0; y < bmpSource.height; y += 2) { 117 | // even row: 118 | ptX = pointRadiusHalf; 119 | for (var x0: int = 0; x0 < bmpSource.width - 1; x0++) { 120 | var sca0: int = getBlackLevel(bmpSource.getPixel(x0, y), isReversed, isAlreadyGrayscale); 121 | 122 | var rad0: Number = sca0 * ratio; 123 | s.graphics.beginFill(fgColor, 1); 124 | s.graphics.drawCircle(ptX, ptY, rad0); 125 | s.graphics.endFill(); 126 | 127 | ptX += pointRadius; 128 | } 129 | 130 | // odd row: 131 | if (y + 1 == bmpSource.height) continue; 132 | 133 | ptX = pointRadius; 134 | thisPx = getBlackLevel(bmpSource.getPixel(0, y + 1), isReversed, isAlreadyGrayscale); 135 | for (var x1: int = 1; x1 < bmpSource.width - 1; x1++) { 136 | lastPx = thisPx; 137 | thisPx = getBlackLevel(bmpSource.getPixel(x1, y + 1), isReversed, isAlreadyGrayscale); 138 | var sca1: int = (thisPx + lastPx) / 2; 139 | 140 | var rad1: Number = sca1 * ratio; 141 | s.graphics.beginFill(fgColor, 1); 142 | s.graphics.drawCircle(ptX, ptY + pointRadius, rad1); 143 | s.graphics.endFill(); 144 | 145 | ptX += pointRadius; 146 | } 147 | ptY += pointRadius * 2; 148 | } 149 | 150 | //trace("ADD AN OPTION TO RESTRAIN THE SIZE"); 151 | if(restrainSize){ 152 | s.width = bmpSource.width; 153 | s.height = bmpSource.height; 154 | }; 155 | 156 | var matrix:Matrix = s.transform.matrix; 157 | 158 | bmp.bitmapData.draw(s, matrix, null, null, null, true); 159 | 160 | s.graphics.clear(); 161 | this.removeChild(s); 162 | } 163 | 164 | function getBlackLevel(v: uint, isReversed: Boolean, isAlreadyGrayscale: Boolean): int { 165 | if (isAlreadyGrayscale) { 166 | if (!isReversed) return 255 - (v & 0xff); 167 | else return (v & 0xff); 168 | } 169 | var red: Number = v >> 16; 170 | var green: Number = v >> 8 & 0xff; 171 | var blue: Number = v & 0xff; 172 | 173 | if (!isReversed) return 255 - int((red + green + blue) / 3); 174 | else return int((red + green + blue) / 3); 175 | }; 176 | 177 | function draw_default_halftone(bmData:BitmapData, bmp:Bitmap, sampleSize:int, brushSize:int) { 178 | 179 | //values 180 | var pixelsTall: uint = bmData.height; 181 | var pixelsWide: uint = bmData.width; 182 | var rect: Rectangle = new Rectangle(0, 0, sampleSize, sampleSize); 183 | var totalBytesToScan: uint = pixelsWide * pixelsTall; 184 | var position: uint = 0; 185 | var offset: Number = sampleSize * 0.5; 186 | var averageColor: uint; 187 | var pixels: Vector.; 188 | var darks: Number; 189 | var scale: Number; 190 | 191 | var halftone: Shape = new Shape(); 192 | 193 | while (position <= totalBytesToScan) { 194 | pixels = bmData.getVector(rect); 195 | averageColor = grayScaleAverage(pixels); 196 | darks = brightness(averageColor); 197 | if (darks > 0) { 198 | halftone.graphics.beginFill(averageColor, 1); 199 | scale = (255 - darks) / 255; 200 | halftone.graphics.drawCircle(rect.x + offset, rect.y + offset, scale * brushSize); 201 | } 202 | if (rect.x >= pixelsWide) { 203 | rect.x = 0; 204 | rect.y += sampleSize; 205 | } else { 206 | rect.x += sampleSize; 207 | } 208 | position += sampleSize * sampleSize; 209 | } 210 | 211 | function brightness(color: uint): int { 212 | var R: uint = color >> 16 & 0xff; 213 | var G: uint = color >> 8 & 0xff; 214 | var B: uint = color & 0xff; 215 | return int(0.2126 * R + 0.7152 * G + 0.0722 * B); 216 | } 217 | 218 | function rgbAverage(pixels: Vector. ): uint { 219 | var color: uint; 220 | var pixelLength: int = pixels.length; 221 | var averageR: uint = 0; 222 | var averageG: uint = 0; 223 | var averageB: uint = 0; 224 | while (--pixelLength >= 0) { 225 | color = pixels[pixelLength]; 226 | averageR += color >> 16 & 0xFF; 227 | averageG += color >> 8 & 0xFF; 228 | averageB += color & 0xFF; 229 | } 230 | averageR /= pixels.length; 231 | averageG /= pixels.length; 232 | averageB /= pixels.length; 233 | color = averageR << 16 | averageG << 8 | averageB; 234 | return color; 235 | } 236 | 237 | function grayScaleAverage(pixels: Vector. ): uint { 238 | var color: uint; 239 | var pixelLength: int = pixels.length; 240 | var averageR: uint; 241 | var averageG: uint; 242 | var averageB: uint; 243 | while (--pixelLength >= 0) { 244 | color = pixels[pixelLength]; 245 | averageR += color >> 16 & 0xFF; 246 | averageG += color >> 8 & 0xFF; 247 | averageB += color & 0xFF; 248 | } 249 | averageR /= pixels.length; 250 | averageG /= pixels.length; 251 | averageB /= pixels.length; 252 | var luma: int = averageR * 0.3 + averageG * 0.59 + averageB * 0.11; 253 | color = luma << 16 | luma << 8 | luma; 254 | return color; 255 | }; 256 | 257 | //update bitmaps and clear sprites 258 | this.addChild(halftone); 259 | 260 | var matrix:Matrix = halftone.transform.matrix; 261 | 262 | bmp.bitmapData.draw(halftone, matrix, null, null, null, true); 263 | 264 | halftone.graphics.clear(); 265 | this.removeChild(halftone); 266 | 267 | }; 268 | 269 | /////REDUCE COLORS 270 | //reduceColors(myBitmapData, 4, false, true); 271 | //toCGA(myBitmapData, true, true); 272 | function reduceColors(img: BitmapData, number: int = 16, grayScale: Boolean = false, affectAlpha: Boolean = false): void { 273 | var i: int; 274 | var j: int = 0; 275 | 276 | var val: int = 0; 277 | 278 | 279 | var total: int = 255; 280 | number -= 2; 281 | if (number <= 0) number = 1; 282 | if (number >= 255) number = 254; 283 | 284 | var step: Number = total / number; 285 | var offset: Number = (total - (total / (number + 1))) / total; 286 | var values: Array = []; 287 | for (i = 0; i < total; i++) { 288 | 289 | if (i >= (j * step * offset)) { 290 | j++; 291 | } 292 | values.push(Math.floor((Math.ceil(j * step) - step))); 293 | 294 | } 295 | var a: int; 296 | var r: int; 297 | var g: int; 298 | var b: int; 299 | var c: int; 300 | 301 | var iw: int = img.width; 302 | var ih: int = img.height; 303 | 304 | img.lock(); 305 | 306 | if (affectAlpha) { 307 | // GRAYSCALE WITH ALPHA AFFECTED 308 | if (grayScale) { 309 | for (i = 0; i < iw; i++) { 310 | for (j = 0; j < ih; j++) { 311 | 312 | val = img.getPixel32(i, j); 313 | 314 | a = values[ (val >>> 24) - 1]; 315 | r = values[ (val >>> 16 & 0xFF) - 1]; 316 | g = values[(val >>> 8 & 0xFF) - 1]; 317 | b = values[(val & 0xFF) - 1]; 318 | c = Math.ceil(((r + g + b) / 3)); 319 | img.setPixel32(i, j, (a << 24 | c << 16 | c << 8 | c)); 320 | 321 | } 322 | } 323 | 324 | } else { 325 | 326 | // COLORS WITH ALPHA AFFECTED 327 | for (i = 0; i < iw; i++) { 328 | for (j = 0; j < ih; j++) { 329 | 330 | val = img.getPixel32(i, j); 331 | 332 | a = values[ (val >>> 24) - 1]; 333 | r = values[ (val >>> 16 & 0xFF) - 1]; 334 | g = values[(val >>> 8 & 0xFF) - 1]; 335 | b = values[(val & 0xFF) - 1]; 336 | 337 | img.setPixel32(i, j, (a << 24 | r << 16 | g << 8 | b)); 338 | 339 | } 340 | } 341 | } 342 | 343 | } else { 344 | 345 | // GRAYSCALE WITH ALPHA NOT AFFECTED 346 | if (grayScale) { 347 | for (i = 0; i < iw; i++) { 348 | for (j = 0; j < ih; j++) { 349 | 350 | val = img.getPixel32(i, j); 351 | 352 | r = values[ (val >>> 16 & 0xFF) - 1]; 353 | g = values[(val >>> 8 & 0xFF) - 1]; 354 | b = values[(val & 0xFF) - 1]; 355 | c = Math.ceil(((r + g + b) / 3)); 356 | img.setPixel32(i, j, ((val >>> 24) << 24 | c << 16 | c << 8 | c)); 357 | 358 | } 359 | } 360 | 361 | } else { 362 | 363 | // COLORS WITH ALPHA NOT AFFECTED 364 | for (i = 0; i < iw; i++) { 365 | for (j = 0; j < ih; j++) { 366 | 367 | val = img.getPixel32(i, j); 368 | 369 | r = values[ (val >>> 16 & 0xFF) - 1]; 370 | g = values[(val >>> 8 & 0xFF) - 1]; 371 | b = values[(val & 0xFF) - 1]; 372 | 373 | img.setPixel32(i, j, ((val >>> 24) << 24 | r << 16 | g << 8 | b)); 374 | 375 | } 376 | } 377 | } 378 | } 379 | img.unlock(); 380 | 381 | } 382 | // 383 | function toCGA(bmpd: BitmapData, grayscale: Boolean = false, alpha: Boolean = false): void { 384 | reduceColors(bmpd, 0, grayscale, alpha); 385 | } 386 | function toEGA(bmpd: BitmapData, grayscale: Boolean = false, alpha: Boolean = false): void { 387 | reduceColors(bmpd, 4, grayscale, alpha); 388 | } 389 | function toHAM(bmpd: BitmapData, grayscale: Boolean = false, alpha: Boolean = false): void { 390 | reduceColors(bmpd, 6, grayscale, alpha); 391 | } 392 | function toVGA(bmpd: BitmapData, grayscale: Boolean = false, alpha: Boolean = false): void { 393 | reduceColors(bmpd, 8, grayscale, alpha); 394 | } 395 | function toSVGA(bmpd: BitmapData, grayscale: Boolean = false, alpha: Boolean = false): void { 396 | reduceColors(bmpd, 16, grayscale, alpha); 397 | } 398 | 399 | -------------------------------------------------------------------------------- /as/as/CLIPBOARD.as: -------------------------------------------------------------------------------- 1 | /* 2 | CLIPBOARD SPECIFIC 3 | */ 4 | 5 | //save bitmapdata to clipboard 6 | //can paste into any image editing app 7 | function saveBitmapToClipboard(bd:BitmapData){ 8 | try{ 9 | Clipboard.generalClipboard.clear(); 10 | Clipboard.generalClipboard.setData(ClipboardFormats.BITMAP_FORMAT, bd, false); 11 | trace("saveBitmapToClipboard()"); 12 | }catch(e:Error){ 13 | trace("error saveBitmapToClipboard"); 14 | } 15 | } 16 | 17 | //bitmapdata = writeBitmapFromClipboard(); 18 | function writeBitmapFromClipboard(bdTo:BitmapData, numWidth:Number = 421, numHeight:Number = 595){ 19 | if (Clipboard.generalClipboard.hasFormat(ClipboardFormats.BITMAP_FORMAT)) { 20 | trace("bitmapdata copied from clipboard"); 21 | bdTo.draw(BitmapData(Clipboard.generalClipboard.getData(ClipboardFormats.BITMAP_FORMAT)));//, null, null, null, null, true 22 | // 23 | } else { 24 | trace("no bitmapdata in clipboard"); 25 | //return null; 26 | } 27 | } 28 | 29 | //to clipboard 30 | function saveAsciiToClipboard(str:String){ 31 | Clipboard.generalClipboard.clear(); 32 | Clipboard.generalClipboard.setData(ClipboardFormats.TEXT_FORMAT, str); 33 | } -------------------------------------------------------------------------------- /as/as/FILEREFERENCE.as: -------------------------------------------------------------------------------- 1 |  2 | //TODO: THIS IS BAD, FIX ALL OF IT (SHOULD ONLY HAVE ONE) 3 | 4 | //loader for import image. for reading width and height sizes to draw to canvas 5 | var loader_importImage:Loader; 6 | 7 | function load_bitmapSprayImage(_bitmapData:BitmapData, num_width:Number, num_height:Number) { 8 | var fileRef: FileReference; 9 | fileRef = new FileReference(); 10 | 11 | _setListeners(); 12 | _openBrowse(); 13 | 14 | function _setListeners() { 15 | //stage.addEventListener(MouseEvent.MOUSE_DOWN, _onDown); 16 | fileRef.cancel(); 17 | //remove first 18 | stage.removeEventListener(MouseEvent.MOUSE_DOWN, _onDown); 19 | fileRef.removeEventListener(Event.CANCEL, _onCancel); 20 | fileRef.removeEventListener(IOErrorEvent.IO_ERROR, _onError); 21 | fileRef.removeEventListener(Event.COMPLETE, _onLoaded); 22 | //re-add 23 | //stage.addEventListener(MouseEvent.MOUSE_DOWN, _onDown); 24 | fileRef.addEventListener(Event.CANCEL, _onCancel); 25 | fileRef.addEventListener(IOErrorEvent.IO_ERROR, _onError); 26 | }; 27 | 28 | function _openBrowse(){ 29 | // 30 | fileRef.browse([new FileFilter("Images", "*.jpg;*.gif;*.png")]); 31 | //fileRef.cancel(); // Important 32 | // 33 | fileRef.addEventListener(IOErrorEvent.IO_ERROR, _onError); 34 | fileRef.addEventListener(Event.SELECT, _onSelected); 35 | stage.removeEventListener(MouseEvent.MOUSE_DOWN, _onDown); 36 | }; 37 | 38 | function _onCancel(evt: Event) { 39 | trace("_onCancel"); 40 | _setListeners(); 41 | }; 42 | 43 | function _onError(evt: IOErrorEvent) { 44 | trace("error"); 45 | _setListeners(); 46 | } 47 | 48 | function _onDown(evt: MouseEvent): void { 49 | _openBrowse(); 50 | } 51 | 52 | function _onSelected(evt: Event): void { 53 | // 54 | //var fr:File= evt.target as FileReference; 55 | // 56 | /*if (fr.type != ".gif" && fr.type!= ".jpg" && fr.type != ".png"){ 57 | trace("ERROR: error loading. file not compatible"); 58 | }else{*/ 59 | // 60 | fileRef.load(); 61 | // 62 | fileRef.addEventListener(Event.COMPLETE, _onLoaded); 63 | fileRef.removeEventListener(Event.SELECT, _onSelected); 64 | } 65 | 66 | function _onLoaded(evt: Event): void { 67 | // 68 | var loader: Loader = new Loader(); 69 | loader.loadBytes(evt.target.data); 70 | // 71 | loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, _onError); 72 | loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onComplete); 73 | //addChild(loader); 74 | fileRef.removeEventListener(Event.COMPLETE, _onLoaded); 75 | } 76 | 77 | function _onComplete(e: Event) { 78 | // 79 | var loaderInfo: LoaderInfo = e.target as LoaderInfo; 80 | loaderInfo.removeEventListener(Event.COMPLETE, _onComplete); 81 | //get loader info as bitmap 82 | var _bitmap = Bitmap(LoaderInfo(e.target).content);//.bitmapData; 83 | // 84 | //var _bitmap_data = Bitmap(LoaderInfo(e.target).content).bitmapData; 85 | //for reading width/height if needed? 86 | var loader: Loader = loaderInfo.loader; 87 | trace("loader size: ", loader.width, loader.height); 88 | // 89 | //addChild(bitmap); 90 | var matrix:Matrix = new Matrix(); 91 | matrix.scale(num_width / loader.width, num_height / loader.height); 92 | //matrix.scale(num_width*scale, num_height*scale); 93 | // 94 | //draw to bitmap 95 | _bitmapData.draw(_bitmap.bitmapData, matrix, null, null, null, true); 96 | // 97 | } 98 | }; 99 | 100 | 101 | function load_penTexture() { 102 | var fileRef: FileReference; 103 | fileRef = new FileReference(); 104 | 105 | _setListeners(); 106 | _openBrowse(); 107 | 108 | function _setListeners() { 109 | //s 110 | fileRef.cancel(); 111 | //remove first 112 | stage.removeEventListener(MouseEvent.MOUSE_DOWN, _onDown); 113 | fileRef.removeEventListener(Event.CANCEL, _onCancel); 114 | fileRef.removeEventListener(IOErrorEvent.IO_ERROR, _onError); 115 | fileRef.removeEventListener(Event.COMPLETE, _onLoaded); 116 | //re-add 117 | fileRef.addEventListener(Event.CANCEL, _onCancel); 118 | fileRef.addEventListener(IOErrorEvent.IO_ERROR, _onError); 119 | //reset UI so it doesn't allow you to paint empty bitmaps 120 | mc_imageTexture.visible = false; 121 | set_tool("PENCIL", btn_pen); 122 | }; 123 | 124 | function _openBrowse(){ 125 | // 126 | fileRef.browse([new FileFilter("Images", "*.jpg;*.gif;*.png")]); 127 | // 128 | fileRef.addEventListener(IOErrorEvent.IO_ERROR, _onError); 129 | fileRef.addEventListener(Event.SELECT, _onSelected); 130 | stage.removeEventListener(MouseEvent.MOUSE_DOWN, _onDown); 131 | }; 132 | 133 | function _onCancel(evt: Event) { 134 | trace("_onCancel"); 135 | _setListeners(); 136 | }; 137 | 138 | function _onError(evt: IOErrorEvent) { 139 | trace("error"); 140 | _setListeners(); 141 | } 142 | 143 | function _onDown(evt: MouseEvent): void { 144 | _openBrowse(); 145 | } 146 | 147 | function _onSelected(evt: Event): void { 148 | // 149 | fileRef.load(); 150 | // 151 | fileRef.addEventListener(Event.COMPLETE, _onLoaded); 152 | fileRef.removeEventListener(Event.SELECT, _onSelected); 153 | } 154 | 155 | function _onLoaded(evt: Event): void { 156 | // 157 | var loader: Loader = new Loader(); 158 | loader.loadBytes(evt.target.data); 159 | // 160 | loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, _onError); 161 | loader.contentLoaderInfo.addEventListener(Event.COMPLETE, _onComplete); 162 | //addChild(loader); 163 | fileRef.removeEventListener(Event.COMPLETE, _onLoaded); 164 | } 165 | 166 | function _onComplete(e: Event) { 167 | // 168 | var loaderInfo: LoaderInfo = e.target as LoaderInfo; 169 | loaderInfo.removeEventListener(Event.COMPLETE, _onComplete); 170 | //get loader info as bitmap 171 | var _bitmap = Bitmap(LoaderInfo(e.target).content).bitmapData; 172 | penTextureBitmapData = _bitmap; 173 | //penTextureBitmapData = _bitmap; 174 | var loader: Loader = loaderInfo.loader; 175 | // 176 | pen_texture.lineStyle(num_pen_size); 177 | pen_texture.lineBitmapStyle(_bitmap); 178 | //modify the small tab of image texture 179 | var matrix:Matrix = new Matrix(); 180 | matrix.scale(mc_imageTexture.mc_imageTexture.width / loader.width, mc_imageTexture.mc_imageTexture.height / loader.height); 181 | // 182 | //update the small image tab showing what's loaded 183 | penTextureBitmap.bitmapData.draw(_bitmap, matrix, null, null, null, true); 184 | // 185 | set_tool("TEXTURE PEN", btn_loadTexture);//reset to tool after successful load (listener sets back to PEN incase of cancel...) 186 | mc_imageTexture.visible = true; 187 | mc_slider.visible = true; 188 | 189 | // 190 | } 191 | }; 192 | 193 | //FUNCTIONS FOR THE GENERIC LOADING IMAGE 194 | //called for all states to manage UI 195 | function UI_load_image_default_setListeners(){ 196 | btn_importimage_import01.visible = true; 197 | btn_importimage_import02.visible = true; 198 | btn_importAnother.visible = false; 199 | } 200 | function UI_load_image_default_onSelected(){ 201 | btn_importimage_import01.visible = false; 202 | btn_importimage_import02.visible = false; 203 | } 204 | function UI_load_impage_default_onComplete(){ 205 | btn_importAnother.visible = true; 206 | } 207 | //DISPLACEMENT LOADING IMAGE UI (for blend & displacer-izer) 208 | function UI_load_image_displacement_setListeners(){ 209 | // 210 | mc_blend_and_displace.btn_load.visible = true; 211 | mc_blend_and_displace.btn_load_another.visible = false; 212 | mc_blend_and_displace.mc_hideUI.visible = true; 213 | trace("UI_load_image_displacement_setListeners()"); 214 | } 215 | function UI_load_image_displacement_onSelected(){ 216 | // 217 | mc_blend_and_displace.btn_load.visible = false; 218 | } 219 | function UI_load_impage_displacement_onComplete(){ 220 | mc_blend_and_displace.btn_load_another.visible = true; 221 | mc_blend_and_displace.btn_save.visible = true; 222 | mc_blend_and_displace.mc_hideUI.visible = false; 223 | } 224 | //same as UI load image but for load another 225 | function UI_load_image_displacement_setListeners_loadAnother(){ 226 | UI_load_impage_displacement_onComplete(); 227 | mc_blend_and_displace.mc_hideUI.visible = true; 228 | } 229 | 230 | function load_image(clip:MovieClip, num_width:Number, num_height:Number, setListenersFunc:Function, onSelectedFunc:Function, onCompleteFunc:Function, bool_fill:Boolean){ 231 | var fileRef: FileReference; 232 | fileRef = new FileReference(); 233 | 234 | _setListeners(); 235 | _openBrowse(); 236 | 237 | function _setListeners() { 238 | //stage.addEventListener(MouseEvent.MOUSE_DOWN, _onDown); 239 | fileRef.cancel(); 240 | //remove first 241 | stage.removeEventListener(MouseEvent.MOUSE_DOWN, _onDown); 242 | fileRef.removeEventListener(Event.CANCEL, _onCancel); 243 | fileRef.removeEventListener(IOErrorEvent.IO_ERROR, _onError); 244 | fileRef.removeEventListener(Event.COMPLETE, _onLoaded); 245 | //re-add 246 | //stage.addEventListener(MouseEvent.MOUSE_DOWN, _onDown); 247 | fileRef.addEventListener(Event.CANCEL, _onCancel); 248 | fileRef.addEventListener(IOErrorEvent.IO_ERROR, _onError); 249 | //restart 250 | setListenersFunc(); 251 | }; 252 | 253 | function _openBrowse(){ 254 | // 255 | fileRef.browse([new FileFilter("Images", "*.jpg;*.gif;*.png")]); 256 | //fileRef.cancel(); // Important 257 | // 258 | fileRef.addEventListener(IOErrorEvent.IO_ERROR, _onError); 259 | fileRef.addEventListener(Event.SELECT, _onSelected); 260 | stage.removeEventListener(MouseEvent.MOUSE_DOWN, _onDown); 261 | }; 262 | 263 | function _onCancel(evt: Event) { 264 | trace("_onCancel"); 265 | _setListeners(); 266 | }; 267 | 268 | function _onError(evt: IOErrorEvent) { 269 | trace("error"); 270 | _setListeners(); 271 | } 272 | 273 | function _onDown(evt: MouseEvent): void { 274 | _openBrowse(); 275 | } 276 | 277 | function _onSelected(evt: Event): void { 278 | // 279 | onSelectedFunc(); 280 | // 281 | fileRef.load(); 282 | // 283 | fileRef.addEventListener(Event.COMPLETE, _onLoaded); 284 | fileRef.removeEventListener(Event.SELECT, _onSelected); 285 | } 286 | 287 | function _onLoaded(evt: Event): void { 288 | // 289 | //var loader: Loader = new Loader(); 290 | loader_importImage = new Loader(); 291 | loader_importImage.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, _onError); 292 | loader_importImage.loadBytes(evt.target.data); 293 | loader_importImage.contentLoaderInfo.addEventListener(Event.COMPLETE, _onComplete); 294 | //addChild(loader); 295 | clip.addChild(loader_importImage); 296 | // 297 | fileRef.removeEventListener(Event.COMPLETE, _onLoaded); 298 | } 299 | 300 | function _onComplete(e: Event) { 301 | // 302 | var loaderInfo: LoaderInfo = e.target as LoaderInfo; 303 | loaderInfo.removeEventListener(Event.COMPLETE, _onComplete); 304 | //get loader info as bitmap 305 | var _bitmap = Bitmap(LoaderInfo(e.target).content);//.bitmapData; 306 | // 307 | //var _bitmap_data = Bitmap(LoaderInfo(e.target).content).bitmapData; 308 | //for reading width/height if needed? 309 | loader_importImage = loaderInfo.loader; 310 | trace("loader size: ", loader_importImage.width, loader_importImage.height); 311 | // 312 | var scaleWidth:Number = mc_draw.width / loader_importImage.width; 313 | var scaleHeight:Number = mc_draw.height / loader_importImage.height; 314 | //adjust the scale 315 | if(bool_fill){ 316 | clip.width = num_width; 317 | clip.height = num_height; 318 | }; 319 | //too big for stage 320 | if(!bool_fill && (loader_importImage.width > 400 || loader_importImage.height > 500)){ 321 | clip.scaleX = mc_draw.scaleX/3; 322 | clip.scaleY = mc_draw.scaleY/3; 323 | 324 | }; 325 | // 326 | set_transformTool(clip); 327 | // 328 | trace("clip size: ", clip_importImage.width, clip_importImage.height); 329 | //set "import another to true" 330 | onCompleteFunc(); 331 | } 332 | } 333 | 334 | //save to text file 335 | //used for saving ascii art 336 | function saveAsciiToTextFile(str:String, fileName:String){ 337 | var tFR:FileReference = new FileReference(); 338 | tFR.save(str, fileName + ".txt"); 339 | } -------------------------------------------------------------------------------- /as/as/FX.as: -------------------------------------------------------------------------------- 1 | import fl.motion.AdjustColor; 2 | import flash.filters.ColorMatrixFilter; 3 | 4 | //CHANGING COLOR OF STAGE 5 | var stage_fade_transform = new ColorTransform(); 6 | var num_fade_stage = 0; 7 | 8 | var arr_stage_colors: Array = new Array(0x000000, 0xFF9AFF, 0xF2CAFF, 0x55F2FF, 0x6766FF, 0xFF4E43, 0xFF9400, 0x39C3FF); 9 | var stage_curr_color = 0xFF9AFF; 10 | var stage_new_color; 11 | 12 | //COLOR HIGHLIGHTS OF SELECTED OBJECTS 13 | var color_filter_selected: AdjustColor = new AdjustColor(); 14 | var color_matrix_selected: ColorMatrixFilter; 15 | var arr_color_matrix_selected: Array = []; 16 | // 17 | function fade_hex(hex, hex2, ratio) { 18 | var r = hex >> 16; 19 | var g = hex >> 8 & 0xFF; 20 | var b = hex & 0xFF; 21 | r += ((hex2 >> 16) - r) * ratio; 22 | g += ((hex2 >> 8 & 0xFF) - g) * ratio; 23 | b += ((hex2 & 0xFF) - b) * ratio; 24 | return (r << 16 | g << 8 | b); 25 | } 26 | // 27 | 28 | function event_fadeStage(event: Event) { 29 | // 30 | num_fade_stage += .05; 31 | //stage_fade_transform.color = fadeHex(startHex, endHex, num_fade); 32 | //test.transform.colorTransform = stage_fade_transform; 33 | //trace(num_fade_stage); 34 | // 35 | stage.color = fade_hex(stage_curr_color, stage_new_color, num_fade_stage); 36 | // 37 | if (num_fade_stage >= 1) { 38 | stage_curr_color = stage_new_color; 39 | stage.removeEventListener(Event.ENTER_FRAME, event_fadeStage); 40 | }; 41 | }; 42 | 43 | function fade_stage() { 44 | num_fade_stage = 0; 45 | stage_new_color = rand_array(arr_stage_colors); 46 | // 47 | stage.removeEventListener(Event.ENTER_FRAME, event_fadeStage); 48 | stage.addEventListener(Event.ENTER_FRAME, event_fadeStage); 49 | }; 50 | 51 | //COLOR FOR SELECTING/DESELECTING TOOLS 52 | function selectedColor(clip){ 53 | color_filter_selected = new AdjustColor(); 54 | color_filter_selected.hue = 180; 55 | color_filter_selected.saturation = 100; 56 | color_filter_selected.brightness = -50; 57 | color_filter_selected.contrast = 12; 58 | arr_color_matrix_selected = color_filter_selected.CalculateFinalFlatArray(); 59 | color_matrix_selected = new ColorMatrixFilter(arr_color_matrix_selected); 60 | clip.filters = [color_matrix_selected]; 61 | //trace("selectedColor on: " + clip.name); 62 | }; 63 | 64 | //clear 65 | function deselectColor(clip){ 66 | clip.filters = []; 67 | }; 68 | 69 | function deselectAll(arr:Array){ 70 | for(var i:Number = 0; i < arr.length; ++i){ 71 | deselectColor(arr[i]); 72 | }; 73 | }; -------------------------------------------------------------------------------- /as/as/MATH.as: -------------------------------------------------------------------------------- 1 | //MATH 2 | //include "as/Maths.as"; 3 | // 4 | 5 | function RGBtoRGBA(hexStr:String,alpha:uint):uint{ 6 | var rgb:uint = (uint)(hexStr.replace("#","0x")); 7 | var a:uint = (uint)((alpha * .01) * 255); 8 | return (rgb << 8 | a); 9 | } 10 | 11 | function toARGB(rgb:uint, newAlpha:uint):uint{ 12 | var argb:uint = 0; 13 | argb = (rgb); 14 | argb += (newAlpha<<25); //24 15 | return argb; 16 | } 17 | 18 | function hex_to_ARGB(col:uint, a:uint){ 19 | 20 | var rgb:uint = col; 21 | var a:uint = (uint)((a * .01) * 255); 22 | var rgba:uint = rgb << 8 | a; 23 | var argb:uint = a << 24 | rgb; 24 | 25 | return argb; 26 | }; 27 | 28 | //returns maximum pixels per inch supported by printer 29 | function return_max_DPI(){ 30 | var printJob: PrintJob = new PrintJob(); 31 | return printJob.maxPixelsPerInch; 32 | } 33 | 34 | //convert inches to pixels 35 | function inch_toPixel(inches:Number):int{ 36 | return Math.round(Capabilities.screenDPI*inches); 37 | } 38 | //millimeters to pixel 39 | function mm_toPixel(mm:Number):int{ 40 | return Math.round(Capabilities.screenDPI*(mm/25.4)); 41 | } 42 | 43 | //save mm as pixels at 72 dpi 44 | function return_mmAsPixel(mm:Number){ 45 | return Math.round(72 * (mm / 25.4)); 46 | } 47 | 48 | function radiansToDegrees(radians:Number):Number { 49 | var degrees:Number = radians * (180 / Math.PI); 50 | return degrees; 51 | } 52 | 53 | function degreesToRadians(degrees:Number):Number { 54 | var radians:Number = degrees * (Math.PI / 180); 55 | return radians; 56 | } 57 | 58 | //make number to decimal (for alpha 100 becomes 1, 50 becomes 0.5...) 59 | function convert_to_decimal(num:Number){ 60 | var _format:Number = num * 0.01; 61 | return _format; 62 | } 63 | 64 | //format a number 65 | function formatNumber(num:Number) { 66 | var nf: NumberFormatter = new NumberFormatter("en-US"); 67 | return (nf.formatNumber(num)); 68 | }; 69 | 70 | //random number range 71 | function Math_randomRange(num_min:Number, num_max:Number){ 72 | return Math.ceil(num_min + (num_max - num_min) * Math.random()); 73 | } 74 | //same as above but decimal 75 | function Math_randomRange_dec(num_min:Number, num_max:Number){ 76 | return num_min + (num_max - num_min) * Math.random(); 77 | } 78 | 79 | //random sign (utils) -- return 1 or -1 ... 80 | function randomSign(chance: Number = 0.5): int { 81 | return (Math.random() < chance) ? 1 : -1; 82 | } 83 | 84 | // 85 | function range(min:Number, max:Number){ 86 | return min + (max - min) * Math.random(); 87 | } 88 | 89 | function randomNumber(n:Number) { 90 | return Math.ceil(Math.random()*n); 91 | } 92 | 93 | //return percent (100) 94 | function return_percent(currVal:Number, totalVal:Number){ 95 | var calc_percent:Number = Math.ceil((currVal/totalVal)*100); 96 | return calc_percent; 97 | } 98 | 99 | //extract number from this string (regexp) 100 | //var str:String = regex_getNumber("this10test"), returns 10 101 | function regex_getNumber(str:String){ 102 | return str.replace(/[^\d.]/g,""); 103 | } 104 | 105 | // 106 | //calculate the rotation and friction of a clip in relation to a target location 107 | function Math_frictionRotation(clip:MovieClip, target, num_fric:Number) { 108 | // 109 | //how far and friction 110 | var num_distX:Number = (target.x-clip.x)/num_fric; 111 | var num_distY:Number = (target.y-clip.y)/num_fric; 112 | // 113 | //calculate rotation 114 | var num_rads:Number = Math.atan2(num_distY, num_distX); 115 | var num_degs:Number = Math.round(num_rads*180/Math.PI)+90; 116 | // 117 | //apply all of the above 118 | clip.x += num_distX; 119 | clip.y += num_distY; 120 | clip.rotation = num_degs; 121 | } 122 | // 123 | 124 | //positive or negative 125 | function mathPosNeg(num) { 126 | if(Math.random()*100 > 70){ 127 | num = num; 128 | }else{ 129 | num = num*-1; 130 | } 131 | return num; 132 | } -------------------------------------------------------------------------------- /as/as/MISC.as: -------------------------------------------------------------------------------- 1 | //PARSING TEXT AND OTHER THINGS// 2 | 3 | //var n:Number = string_getNumber("testing1"); 4 | function string_getNumber(source:String):Number 5 | { 6 | var pattern:RegExp = /[^0-9]/g; 7 | return Number(source.replace(pattern, '')); 8 | } 9 | 10 | //open a URL 11 | function openURL(str_URL:String){ 12 | var openPage:URLRequest = new URLRequest(str_URL); 13 | navigateToURL(openPage,"_blank"); 14 | } 15 | -------------------------------------------------------------------------------- /as/as/SAVING_SHARED.as: -------------------------------------------------------------------------------- 1 | //basic saving 2 | //shared between the drawing UI and the zine maker main menu 3 | 4 | import flash.filesystem.File; 5 | import flash.filesystem.FileStream; 6 | import flash.display.PNGEncoderOptions; 7 | import flash.utils.ByteArray; 8 | import flash.filesystem.*; 9 | 10 | //save only part of stage from certain x and y AS A TRANSPARENT PNG 11 | function save_pic_PNG_xy(num_width: Number, num_height: Number, num_x: Number, num_y: Number, str_filename: String) { 12 | var bitmapdata: BitmapData = new BitmapData(stage.stageWidth, stage.stageHeight, true, 0); 13 | bitmapdata.draw(stage); 14 | //cut part 15 | var bitmapDataA: BitmapData = new BitmapData(num_width, num_height, true, 0); 16 | bitmapDataA.copyPixels(bitmapdata, new Rectangle(num_x, num_y, num_width, num_height), new Point(0, 0)); 17 | //encode 18 | var byteArray: ByteArray = bitmapDataA.encode(bitmapDataA.rect, new flash.display.PNGEncoderOptions(), byteArray); 19 | //done 20 | var fileReference: FileReference = new FileReference(); 21 | fileReference.save(byteArray, str_filename + ".png"); 22 | } 23 | 24 | function save_bitmapdata_PNG(bitmapData:BitmapData, str_filename: String){ 25 | var byteArray: ByteArray = bitmapData.encode(bitmapData.rect, new flash.display.PNGEncoderOptions(), byteArray); 26 | //done 27 | var fileReference: FileReference = new FileReference(); 28 | fileReference.save(byteArray, str_filename + ".png"); 29 | } -------------------------------------------------------------------------------- /as/as/SOUND.as: -------------------------------------------------------------------------------- 1 | var snd_chan:SoundChannel = new SoundChannel(); //channel (controls all) 2 | 3 | function play_sound(snd){ 4 | snd_chan.stop(); 5 | //here 6 | snd_chan = snd.play(); 7 | } 8 | 9 | function play_sound_array(arr:Array){ 10 | play_sound(arr[Math.ceil(Math.random()*arr.length)-1]); 11 | } -------------------------------------------------------------------------------- /as/as/WRITE_TEXT.as: -------------------------------------------------------------------------------- 1 | /* 2 | this was taken from my javascript example 3 | */ 4 | 5 | var arr_write:Array = new Array(); 6 | var num_write:Number = 0;//the current array element (word) 7 | 8 | var int_write:uint;//writing interval 9 | var num_intAmnt:Number = 200; 10 | var resetCount:Number = 100; 11 | 12 | //writing 13 | function write_words(str:String, txt_field:TextField){ 14 | arr_write = []; 15 | num_write = 0; 16 | txt_field.text = ""; 17 | resetCount = 200; 18 | // 19 | arr_write = str.split(" "); 20 | // 21 | clearInterval(int_write); 22 | int_write = setInterval(_write, num_intAmnt, txt_field); 23 | // 24 | } 25 | 26 | function _write(txt_field:TextField){ 27 | // 28 | var str = arr_write[num_write]; 29 | // 30 | txt_field.appendText(" " + str); 31 | num_write += 1; 32 | // 33 | if(num_write > arr_write.length-1){ 34 | clearInterval(int_write); 35 | } 36 | } 37 | 38 | function end_write_set(str:String, txt_field:TextField){ 39 | clearInterval(int_write); 40 | txt_field.text = ""; 41 | txt_field.text = str; 42 | } 43 | 44 | function stop_writing(){ 45 | clearInterval(int_write); 46 | } -------------------------------------------------------------------------------- /as/as/drawingtool/ASCIIPAINT.as: -------------------------------------------------------------------------------- 1 | /* 2 | ASCII Paint lets you paint ASCII art. it draws a text grid over the canvas, and text is placed on each input text while you mouse over. 3 | input updates everytime you mouse over it. paint is "random" based on a set of strings (eraser, random, dingbats, blocks, alphanumeric, intput) 4 | each sets the ASCII to a different character set... "input" is if you want to paint with a user inputed string... 5 | once you're done drawing you can save your ASCII to the canvas. the grid is removed, and everything cleared, when you're done. 6 | 7 | the input strings (randomAscii, and randomDingbat) are from an old code example. probably nobody will get the throwback, but it's cute to include anyway :D 8 | */ 9 | 10 | //str_tool = "ASCIIPAINT" 11 | 12 | //////////////ASCII PAINT/////////// 13 | //cell width and height (for padding) 14 | var num_asciiCellWidth: Number = 19; 15 | var num_asciiCellHeight: Number = 21; 16 | var int_asciiColor: int = 0x000000; 17 | //size of the grid that gets drawn (this is very flexible and you can make a larger canvas here) 18 | var num_asciiMaxWidth: Number = Math.ceil(mc_draw.width / num_asciiCellWidth) - 1; //width number of cels 19 | var num_asciiMaxHeight: Number = Math.ceil(mc_draw.height / num_asciiCellHeight) - 1; ///height number of cels 20 | //containers 21 | var clip_ascii: MovieClip = new MovieClip; //contains the ascii (inside of mc_draw) 22 | var arr_asciiGrid: Array = new Array(); //contains the entire ascii grid 23 | //draw modes 24 | var str_ascii_drawMode: String = "dingbats"; //eraser, random, dingbats, blocks, alphanumeric, intput 25 | //ascii string types 26 | var str_randomAscii: String = "!\"#$%&'()*+,-./:;<=>?@[]^_`{|}~¡¢£¤¥„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿×ǀǁǂǃʻʼʽʾʿˀˁ˂˃˄˅ˆˇˈˉˊˋˌˍˎˏːˑ˒˓˔˕˖˗˘˙˚˛˜˝˞˟ˠˡˢˣˤ˥˦˧˨˩˪˫ˬ˭ˮ˯˰˱˲˳˴˵˶˷˸˹˺˻˼˽˾˿̴̵̶̷̸̡̢̧̨̛̖̗̘̙̜̝̞̟̠̣̤̥̦̩̪̫̬̭̮̯̰̱̲̳̹̺̻̼͇͈͉͍͎̀́̂̃̄̅̆̇̈̉̊̋̌̍̎̏̐̑̒̓̔̽̾̿͂͆͊͋͌̕̚ͅ͏͓͔͕͖͙͚͐͑͒͗͛҃҄҅҆҇͘͜͟͢͝͞͠͡ՙ՚՛՜՝՞՟ᅡᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵᅶᅷᅸᅹᅺᅻᅼᅽᅾᅿᆀᆁᆂᆃᆄᆅᆆᆇᆈᆉᆊᆋᆌᆍᆎᆏᆐᆑᆒᆓᆔᆕᆖᆗᆘᆙᆚᆛᆜᆝᆞᆟᆠᆡᆢ‐‑‒–—―‖‗‘’‚‛“”„‟†‡•‣․‥…‧‵‶‷‸‹›※‼‽‾‿⁀⁁⁂⁃⁄⁅⁆−∓∔∕∖∗∘∙√∛∜∝∞∟∠∡∢∣∤∥∦∧∨∩∪∫∬∴∵∶∷∸∹∺∻∼∽∾∿≠≡≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊹⊺⊻⊼⊽⊾⊿⋀⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯✁✂✃✄✆✇✈✉✌✍✎✏"; 27 | var str_randomDingbat: String = "✀✁✂✃✄✅✆✇✈✉✊✋✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡✢✣✤✥✦✧✨✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄❅❆❇❈❉❊❋❌❍❎❏❐❑❒❓❔❕❖❗❘❙❚❛❜❝❞❟❠❡❢❣❤❥❦❧❨❩❪❫❬❭❮❯❰❱❲❳❴❵❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔➕➖➗➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➰➱➲➳➴➵➶➷➸➹➺➻➼➽➾➿"; 28 | var str_randomBlocks: String = "▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟"; 29 | var str_randomLetterNumber: String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 30 | var str_currAsciiLetters: String = "HELLO WORLD!"; //currently inputted letters, can have multiple -- "input" for drawmode 31 | /////////////////////////////////// 32 | 33 | //returns the entire art grid as a formatted string 34 | function returnAsciiGrid() { 35 | var j: Number = 1; 36 | var str: String = ""; 37 | for (var i: Number = 0; i < arr_asciiGrid.length; ++i) { 38 | // 39 | j++; 40 | str += (arr_asciiGrid[i].text + " "); 41 | // 42 | if (j > num_asciiMaxWidth) { 43 | str += ("\r\n"); 44 | j = 1; 45 | } 46 | } 47 | // 48 | return str; 49 | } 50 | 51 | function saveAsciiToBitmap(bm: BitmapData) { 52 | //canvasBitmapData.draw(mc_draw.clip_ascii); 53 | update_after_draw(); 54 | //deleteAscii(); 55 | var bmd: BitmapData = new BitmapData(mc_draw.width, mc_draw.height, true, 0); 56 | bmd.draw(clip_ascii, null, null, null, null, true); 57 | // 58 | var mat: Matrix = new Matrix(); //canvas_textField.transform.matrix; 59 | mat.translate(clip_ascii.x, clip_ascii.y); 60 | bm.draw(bmd, mat, null, null, null, true); 61 | //delete 62 | bmd.dispose(); 63 | // 64 | deleteAscii(); 65 | } 66 | 67 | //return a random ascii character from string 68 | function randomAsciiCharacter(str: String) { 69 | var bits: Array; 70 | var randBit: String; 71 | bits = str.split(""); 72 | randBit = bits[Math.ceil(Math.random() * bits.length) - 1]; 73 | return randBit; 74 | } 75 | 76 | function returnAsciiFormat(textField: TextField) { 77 | var embeddedFont:Font = new TXT_ARIAL(); 78 | var textFormat: TextFormat = new TextFormat(); 79 | textFormat.font = embeddedFont.fontName; 80 | //textField.autoSize = TextFieldAutoSize.LEFT; 81 | //textField.background = true; 82 | //textField.border = true; 83 | //textField.width = num_asciiCellWidth; 84 | //textField.height = num_asciiCellHeight; 85 | // 86 | //textFormat.font = "Arial"; 87 | textFormat.size = 20; 88 | textFormat.color = int_asciiColor; 89 | textField.setTextFormat(textFormat); 90 | } 91 | 92 | //delete ascii first 93 | function deleteAscii() { 94 | //remove grid 95 | try { 96 | for (var i: Number = 0; i < arr_asciiGrid.length; ++i) { 97 | arr_asciiGrid[i].removeEventListener(MouseEvent.MOUSE_OVER, event_ascii_textField_OVER); 98 | arr_asciiGrid[i].removeEventListener(MouseEvent.MOUSE_DOWN, event_ascii_textField_DOWN); 99 | clip_ascii.removeChild(arr_asciiGrid[i]); 100 | } 101 | } catch (e: Error) { 102 | //null 103 | } 104 | //remove parent 105 | try { 106 | mc_draw.removeChild(clip_ascii); 107 | } catch (e: Error) { 108 | //null 109 | } 110 | // 111 | arr_asciiGrid = [];//clear grid at end so it doesn't save every rendition of the drawing... 112 | mc_draw.removeEventListener(MouseEvent.MOUSE_DOWN, event_ascii_DOWN); 113 | mc_draw.removeEventListener(MouseEvent.MOUSE_UP, event_ascii_UP); 114 | } 115 | 116 | //make input 117 | function makeAsciiGrid() { 118 | // 119 | //remove all and delete first 120 | deleteAscii(); 121 | //add here 122 | mc_draw.addChild(clip_ascii); 123 | //pixels are 20x20 in size 124 | for (var j: Number = 0; j < num_asciiMaxHeight; ++j) { 125 | for (var i: Number = 0; i < num_asciiMaxWidth; ++i) { 126 | // 127 | var clip: TextField = new TextField(); 128 | //var clip: INPUT = new INPUT(); 129 | clip_ascii.addChild(clip); 130 | //place (multiply!) 131 | clip.name = "mc_clip_" + j + "_" + i; 132 | clip.x += (i * num_asciiCellWidth); 133 | clip.y += (j * num_asciiCellHeight); 134 | clip.text = " "; 135 | // 136 | //formatting 137 | //returnAsciiFormat(clip); // REMOVED: HEAVY LAG ON WINDOWS IF YOU DO THIS 138 | clip.selectable = false; 139 | clip.type = TextFieldType.DYNAMIC; 140 | //event 141 | clip.addEventListener(MouseEvent.MOUSE_OVER, event_ascii_textField_OVER); 142 | clip.addEventListener(MouseEvent.MOUSE_DOWN, event_ascii_textField_DOWN); 143 | // 144 | arr_asciiGrid.push(clip); 145 | } 146 | } 147 | // 148 | mc_draw.addEventListener(MouseEvent.MOUSE_DOWN, event_ascii_DOWN); 149 | mc_draw.addEventListener(MouseEvent.MOUSE_UP, event_ascii_UP); 150 | }; 151 | 152 | function resetAsciiGrid() { 153 | deleteAscii(); 154 | makeAsciiGrid(); 155 | } 156 | 157 | function drawAscii(clip) { 158 | // 159 | if (str_ascii_drawMode == "random") { 160 | clip.text = randomAsciiCharacter(str_randomAscii); 161 | returnAsciiFormat(clip); 162 | } 163 | if (str_ascii_drawMode == "dingbats") { 164 | clip.text = randomAsciiCharacter(str_randomDingbat); 165 | returnAsciiFormat(clip); 166 | } 167 | if (str_ascii_drawMode == "blocks") { 168 | clip.text = randomAsciiCharacter(str_randomBlocks); 169 | returnAsciiFormat(clip); 170 | } 171 | if (str_ascii_drawMode == "alphanumeric") { 172 | clip.text = randomAsciiCharacter(str_randomLetterNumber); 173 | returnAsciiFormat(clip); 174 | } 175 | if (str_ascii_drawMode == "input") { 176 | clip.text = randomAsciiCharacter(str_currAsciiLetters); 177 | returnAsciiFormat(clip); 178 | } 179 | if(str_ascii_drawMode == "eraser"){ 180 | clip.text = " "; 181 | returnAsciiFormat(clip); 182 | } 183 | } 184 | 185 | //drawing it (listeners placed on each input cell) 186 | //ASCII drawing is different from normal drawing because all it does is impose a text grid over the canvas 187 | //when you're done, then the text is drawn to actual canvas (see saveAsciiToBitmap) 188 | 189 | //these togle ONLY the bool and are registered to the draw clip 190 | function event_ascii_DOWN(event: MouseEvent) { 191 | bool_isMouseDown = true; 192 | } 193 | 194 | function event_ascii_UP(event: MouseEvent) { 195 | bool_isMouseDown = false; 196 | } 197 | 198 | //clicking the texti field, or moving over it 199 | //handled in two separate ways 200 | //OVER is mouse move over all so it needs the bool 201 | function event_ascii_textField_DOWN(event:MouseEvent){ 202 | drawAscii(event.currentTarget); 203 | } 204 | function event_ascii_textField_OVER(event: MouseEvent) { 205 | // 206 | if (bool_isMouseDown) { 207 | drawAscii(event.currentTarget); 208 | }; 209 | } -------------------------------------------------------------------------------- /as/as/drawingtool/BACON.as: -------------------------------------------------------------------------------- 1 | /* 2 | the bacon tool draws 4 lines next to eachother like a stripe pattern 3 | similar to the pen tool, but with 4 different lines to manage and a separate UI that manages color 4 | some settings exist to change the lines or make them more jaggedy 5 | default pen valies, size and alpha, apply to it 6 | 7 | color selection for tools like bacon, that use independent UI's to set color are still a work in progress 8 | and anything that sets their colors is a quick hack to just get it done... 9 | */ 10 | 11 | //str_tool = "BACON" 12 | 13 | //BACON TOOL// 14 | var baconPenSprite_line1:Sprite = new Sprite(); 15 | var baconPenSprite_line2:Sprite = new Sprite(); 16 | var baconPenSprite_line3:Sprite = new Sprite(); 17 | var baconPenSprite_line4:Sprite = new Sprite(); 18 | // 19 | var ct_baconCol1:ColorTransform = new ColorTransform(); 20 | var ct_baconCol2:ColorTransform = new ColorTransform(); 21 | var ct_baconCol3:ColorTransform = new ColorTransform(); 22 | var ct_baconCol4:ColorTransform = new ColorTransform(); 23 | // 24 | var baconPen_color1:int = 0xFF3300; 25 | var baconPen_color2:int = 0xFFEBEB; 26 | var baconPen_color3:int = 0xCC3300; 27 | var baconPen_color4:int = 0xFFCCCC; 28 | // 29 | var str_currPenColor:String = "1";//currently selected (check against) 30 | // 31 | var arr_baconPenSprites:Array = new Array(baconPenSprite_line1, baconPenSprite_line2, baconPenSprite_line3, baconPenSprite_line4); 32 | //bacon tool offset values 33 | var num_bacon_x_MIN:Number = 0; 34 | var num_bacon_x_MAX:Number = 0; 35 | var num_bacon_y_MIN:Number = 0; 36 | var num_bacon_y_MAX:Number = 0; 37 | //////////////////////// 38 | 39 | function returnBaconColor(num_i:Number){ 40 | var arr:Array = new Array(baconPen_color1, baconPen_color2, baconPen_color3, baconPen_color4); 41 | // 42 | return arr[num_i]; 43 | } 44 | 45 | function set_bacon() { 46 | //set bacon lines to current mouse (mouse down, first place) 47 | for (var i: Number = 0; i < arr_baconPenSprites.length; ++i) { 48 | var pens = arr_baconPenSprites[i]; 49 | //move to and line to +size * array item 50 | pens.graphics.moveTo(mouseX, mouseY); 51 | } 52 | } 53 | 54 | //usage: mouse MOVE draw_bacon(event.localX, event.localY); 55 | function draw_bacon(event_localX:Number, event_localY:Number) { 56 | if (bool_isMouseDown) { 57 | //draw all lines 58 | for (var i: Number = 0; i < arr_baconPenSprites.length; ++i) { 59 | var pens = arr_baconPenSprites[i]; 60 | var col: int = returnBaconColor(i); 61 | // 62 | var num_xOffset:Number = Math_randomRange_dec(num_bacon_x_MIN, num_bacon_x_MAX); 63 | var num_yOffset:Number = Math_randomRange_dec(num_bacon_y_MIN, num_bacon_y_MAX); 64 | //setup 65 | pens.graphics.lineStyle(num_pen_size, col, pen_alpha); 66 | // 67 | var numX: Number = num_pen_size * i; 68 | var numY: Number = num_pen_size * i; 69 | //move to and line to +size * array item 70 | pens.graphics.moveTo(num_prevMouseX + numX, num_prevMouseY); 71 | 72 | //TODO: THESE HAVE VALUES YOU CAN ADD TO TO OFFSET 73 | //event.localY + Math.random()*100 !! MATH RANDOM IS FOR FRIED EFFECT 74 | //event.localY + Math_randomRange_dec(-100, 100) !! FUZZY STRING EFFECT 75 | pens.graphics.lineTo(event_localX + numX + num_xOffset, event_localY + num_yOffset); //(minus Y is adjustable -- adjust value offset for ALL of these) 76 | // 77 | 78 | canvasBitmapData.draw(pens); 79 | //clear for restart 80 | pens.graphics.clear(); 81 | // 82 | } 83 | }; 84 | } -------------------------------------------------------------------------------- /as/as/drawingtool/BLEND_AND_DISPLACE.as: -------------------------------------------------------------------------------- 1 | /* 2 | recreate Flash specific blend modes and blend layering 3 | this is important because it's very iconic to old-school Flash aesthetic 4 | all blend modes applied to importing and image then layering that image over your art 5 | image is imported into separate bitmap, once blend mode is selected, and size/placement is done, then it's drawn to the main canvas... 6 | //load an image from your drive and 7 | //merge one image with another 8 | */ 9 | 10 | //str_tool == "BLEND & DISPLACER-izer"; 11 | 12 | //BLEND AND DISPLACE// 13 | //blend and displace values 14 | //displacement shared (set in UI) 15 | var blend_and_displace_componentX:uint = BitmapDataChannel.ALPHA; 16 | var blend_and_displace_componentY:uint = BitmapDataChannel.GREEN; 17 | var arr_displacement_componentModes:Array = new Array([BitmapDataChannel.ALPHA, "ALPHA"], [BitmapDataChannel.BLUE, "BLUE"], [BitmapDataChannel.GREEN, "GREEN"], [BitmapDataChannel.RED, "RED"]); 18 | var num_componentX_arr:Number = 0; 19 | var num_componentY_arr:Number = 3; 20 | //color modes 21 | var blend_and_displace_mode:String = DisplacementMapFilterMode.COLOR; 22 | var arr_displacement_modes:Array = new Array([DisplacementMapFilterMode.WRAP, "WRAP"], [DisplacementMapFilterMode.CLAMP, "CLAMP"], [DisplacementMapFilterMode.IGNORE, "IGNORE"], [DisplacementMapFilterMode.COLOR, "COLOR"]); 23 | var num_displacementNode_arr:Number = 3; 24 | //////////////////////// 25 | 26 | //see COLOR.as for all blendmodes 27 | //the rest of the code is in _DRAWING_UI.as since it's entirely UI related... -------------------------------------------------------------------------------- /as/as/drawingtool/COLORFACTORY.as: -------------------------------------------------------------------------------- 1 | /* 2 | COLOR FACTORY itself is primarily UI, so everything is in _DRAWING_UI.as 3 | the UI gives you access (and ability to customize) various effects to apply to the canvas 4 | these effects are largely based on older Flash experiments that used to be popular, 5 | and kind of defined the experimental Flash aesthetic (prelude to processing community experiments) 6 | most of these effects where like code-memes. everyone had their own take at re-creating them. 7 | some of these are captured in the COLOR FACTORY 8 | see COLOR.as... 9 | */ 10 | 11 | //str_tool = "COLOR FACTORY" 12 | 13 | //COLOR FACTORY VARS 14 | var num_color_factory_dialogue:Number = 0; //current dialogue from the color factory 15 | var num_color_factory_shuffle_ARROWS:Number = 0; //stepping up/down arr_color_factory_shuffle_valsWH for the shuffle Tile size field 16 | var str_color_factory_MIRROR_TYPE:String = "0"; //currently selected mirror mode: 0, 1, 2, 3, or RANDOM 17 | // 18 | var color_factory_window = mc_color_factory.mc_settings; 19 | //values related to color factory (clips and numbers) 20 | var arr_color_factory_shuffle_valsWH:Array = new Array([5, 7], [7, 10], [15, 21], [27, 39], [46, 65]); 21 | // 22 | var arr_color_factory_allFields:Array = new Array(color_factory_window.btn_asciiart_save, color_factory_window.btn_asciiart_clipboard, color_factory_window.txt_perlin_baseX, color_factory_window.txt_perlin_baseY, color_factory_window.txt_perlin_numOctaves, color_factory_window.txt_perlin_randomSeed, color_factory_window.txt_perlin_stitch, color_factory_window.txt_perlin_fractalNoise, color_factory_window.txt_perlin_channelOptions, color_factory_window.txt_perlin_grayScale, color_factory_window.txt_perlin_scale, color_factory_window.txt_perlin_RANDOM, color_factory_window.txt_perlin_tip, color_factory_window.txt_mirror, color_factory_window.btn_mirror_01, color_factory_window.btn_mirror_02, color_factory_window.btn_mirror_03, color_factory_window.btn_mirror_04, color_factory_window.btn_mirror_05, color_factory_window.btn_asciiart, color_factory_window.txt_asciiart, color_factory_window.txt_shuffle_spacing, color_factory_window.txt_shuffle_spacing_x, color_factory_window.txt_shuffle_spacing_y, color_factory_window.txt_shuffle_size, color_factory_window.txt_shuffle_RANDOM, color_factory_window.btn_shuffle, color_factory_window.btn_pixelblast, color_factory_window.txt_pixelblast, color_factory_window.txt_colorTransform_redMultiplier, color_factory_window.txt_colorTransform_redOffset, color_factory_window.txt_colorTransform_greenMultiplier, color_factory_window.txt_colorTransform_greenOffset, color_factory_window.txt_colorTransform_blueMultiplier, color_factory_window.txt_colorTransform_blueOffset, color_factory_window.txt_colorTransform_alphaMultiplier, color_factory_window.txt_colorTransform_alphaOffset, color_factory_window.txt_colorTransform_RANDOM, color_factory_window.txt_colorTransform_instructions, color_factory_window.txt_rgbshift_RED, color_factory_window.txt_rgbshift_GREEN, color_factory_window.txt_rgbshift_BLUE, color_factory_window.txt_rgbshift_RANDOM, color_factory_window.txt_rgbshift_RED_X, color_factory_window.txt_rgbshift_RED_Y, color_factory_window.txt_rgbshift_GREEN_X, color_factory_window.txt_rgbshift_GREEN_Y, color_factory_window.txt_rgbshift_BLUE_X, color_factory_window.txt_rgbshift_BLUE_Y, color_factory_window.txt_convolution_MATRIX, color_factory_window.txt_convolution_MULTIPLIER, color_factory_window.txt_convolution_RANDOM, color_factory_window.txt_colorMatrix_RANDOM, color_factory_window.txt_colorMatrix_INSTRUCTIONS, color_factory_window.txt_colorMatrix_ALPHA, color_factory_window.txt_colorMatrix_BLUE, color_factory_window.txt_colorMatrix_GREEN, color_factory_window.txt_colorMatrix_RED, color_factory_window.txt_blurX, color_factory_window.txt_blurY, color_factory_window.txt_blurX_input, color_factory_window.txt_blurY_input); 23 | //color matrix input fields 24 | var arr_color_factory_colorMatrixInputFields:Array = new Array(color_factory_window.txt_colorMatrix_RED_01, color_factory_window.txt_colorMatrix_RED_02, color_factory_window.txt_colorMatrix_RED_03, color_factory_window.txt_colorMatrix_RED_04, color_factory_window.txt_colorMatrix_RED_05, color_factory_window.txt_colorMatrix_GREEN_01, color_factory_window.txt_colorMatrix_GREEN_02, color_factory_window.txt_colorMatrix_GREEN_03, color_factory_window.txt_colorMatrix_GREEN_04, color_factory_window.txt_colorMatrix_GREEN_05, color_factory_window.txt_colorMatrix_BLUE_01, color_factory_window.txt_colorMatrix_BLUE_02, color_factory_window.txt_colorMatrix_BLUE_03, color_factory_window.txt_colorMatrix_BLUE_04, color_factory_window.txt_colorMatrix_BLUE_05, color_factory_window.txt_colorMatrix_ALPHA_01, color_factory_window.txt_colorMatrix_ALPHA_02, color_factory_window.txt_colorMatrix_ALPHA_03, color_factory_window.txt_colorMatrix_ALPHA_04, color_factory_window.txt_colorMatrix_ALPHA_05); 25 | //convolution filter input and arrows 26 | var arr_color_factory_convolution_ARROWS:Array = new Array(color_factory_window.btn_convolution_matrix_01_UP, color_factory_window.btn_convolution_matrix_01_DOWN, color_factory_window.btn_convolution_matrix_02_UP, color_factory_window.btn_convolution_matrix_02_DOWN, color_factory_window.btn_convolution_matrix_03_UP, color_factory_window.btn_convolution_matrix_03_DOWN, color_factory_window.btn_convolution_matrix_04_UP, color_factory_window.btn_convolution_matrix_04_DOWN, color_factory_window.btn_convolution_matrix_05_UP, color_factory_window.btn_convolution_matrix_05_DOWN, color_factory_window.btn_convolution_matrix_06_UP, color_factory_window.btn_convolution_matrix_06_DOWN, color_factory_window.btn_convolution_matrix_07_UP, color_factory_window.btn_convolution_matrix_07_DOWN, color_factory_window.btn_convolution_matrix_08_UP, color_factory_window.btn_convolution_matrix_08_DOWN, color_factory_window.btn_convolution_matrix_09_UP, color_factory_window.btn_convolution_matrix_09_DOWN, color_factory_window.btn_convolution_multiplyer_01_UP, color_factory_window.btn_convolution_multiplyer_01_DOWN); 27 | var arr_color_factory_convolution_INPUTS:Array = new Array(color_factory_window.txt_convolution_matrix_01, color_factory_window.txt_convolution_matrix_02, color_factory_window.txt_convolution_matrix_03, color_factory_window.txt_convolution_matrix_04, color_factory_window.txt_convolution_matrix_05, color_factory_window.txt_convolution_matrix_06, color_factory_window.txt_convolution_matrix_07, color_factory_window.txt_convolution_matrix_08, color_factory_window.txt_convolution_matrix_09, color_factory_window.txt_convolution_multiplyer_01); 28 | //rgb color shifting 29 | var arr_color_factory_RGBshift_ARROWS:Array = new Array(color_factory_window.btn_rgbshift_RED_X_INPUT_UP, color_factory_window.btn_rgbshift_RED_X_INPUT_DOWN, color_factory_window.btn_rgbshift_RED_Y_INPUT_UP, color_factory_window.btn_rgbshift_RED_Y_INPUT_DOWN, color_factory_window.btn_rgbshift_GREEN_X_INPUT_UP, color_factory_window.btn_rgbshift_GREEN_X_INPUT_DOWN, color_factory_window.btn_rgbshift_GREEN_Y_INPUT_UP, color_factory_window.btn_rgbshift_GREEN_Y_INPUT_DOWN, color_factory_window.btn_rgbshift_BLUE_X_INPUT_UP, color_factory_window.btn_rgbshift_BLUE_X_INPUT_DOWN, color_factory_window.btn_rgbshift_BLUE_Y_INPUT_UP, color_factory_window.btn_rgbshift_BLUE_Y_INPUT_UP_DOWN); 30 | var arr_color_factory_RGBshift_INPUTS:Array = new Array(color_factory_window.txt_rgbshift_RED_X_INPUT, color_factory_window.txt_rgbshift_RED_Y_INPUT, color_factory_window.txt_rgbshift_GREEN_X_INPUT, color_factory_window.txt_rgbshift_GREEN_Y_INPUT, color_factory_window.txt_rgbshift_BLUE_X_INPUT, color_factory_window.txt_rgbshift_BLUE_Y_INPUT); 31 | //color transform inputs 32 | var arr_color_factory_ColorTransform_INPUTS:Array = new Array(color_factory_window.txt_colorTransform_redMultiplier_INPUT, color_factory_window.txt_colorTransform_redOffset_INPUT, color_factory_window.txt_colorTransform_greenMultiplier_INPUT, color_factory_window.txt_colorTransform_greenOffset_INPUT, color_factory_window.txt_colorTransform_blueMultiplier_INPUT, color_factory_window.txt_colorTransform_blueOffset_INPUT, color_factory_window.txt_colorTransform_alphaMultiplier_INPUT, color_factory_window.txt_colorTransform_alphaOffset_INPUT); 33 | //shuffle inputes (shuffle bitmap) 34 | var arr_color_factory_Shuffle_INPUTS:Array = new Array(color_factory_window.txt_shuffle_spacing_x_INPUT, color_factory_window.txt_shuffle_spacing_y_INPUT, color_factory_window.txt_shuffle_size_rows_INPUT, color_factory_window.txt_shuffle_size_cols_INPUT); 35 | var arr_color_factory_Shuffle_ARROWS:Array = new Array(color_factory_window.txt_shuffle_spacing_INPUT_UP, color_factory_window.txt_shuffle_spacing_INPUT_DOWN, color_factory_window.txt_shuffle_size_INPUT_UP, color_factory_window.txt_shuffle_size_INPUT_DOWN); 36 | //perlin noise texture 37 | var arr_color_factory_PerinTexture_INPUTS:Array = new Array(color_factory_window.txt_perlin_baseX_INPUT, color_factory_window.txt_perlin_baseY_INPUT, color_factory_window.txt_perlin_numOctavesINPUT, color_factory_window.txt_perlin_randomSeed_INPUT, color_factory_window.txt_perlin_channelOptions_INPUT, color_factory_window.txt_perlin_scale_INPUT); 38 | //perlin noise bools 39 | var arr_color_factory_PerlinTexture_BOOLS:Array = new Array(color_factory_window.txt_perlin_fractalNoise_INPUT, color_factory_window.txt_perlin_stitch_INPUT, color_factory_window.txt_perlin_grayScale_INPUT); 40 | //fuzzy fields (all) 41 | var arr_color_factory_fuzzyFields:Array = new Array(color_factory_window.txt_fuzzy_speed_INPUT, color_factory_window.txt_fuzzy_segment_INPUT, color_factory_window.txt_fuzzy_length_INPUT, color_factory_window.txt_fuzzy_fuzziness_INPUT, color_factory_window.txt_fuzzy_random_INPUT, color_factory_window.txt_fuzzy_unruly_INPUT, color_factory_window.txt_fuzzy_badhair_INPUT, color_factory_window.txt_fuzzy_how, color_factory_window.btn_grow, color_factory_window.btn_reset_hair, color_factory_window.txt_fuzzy_speed, color_factory_window.txt_fuzzy_segment, color_factory_window.txt_fuzzy_length, color_factory_window.txt_fuzzy_unruly, color_factory_window.txt_fuzzy_badhair, color_factory_window.txt_fuzzy_RANDOM, color_factory_window.txt_fuzzy_fuzziness, color_factory_window.txt_fuzzy_random); 42 | var arr_color_factory_fuzzy_BOOLS:Array = new Array(color_factory_window.txt_fuzzy_unruly_INPUT, color_factory_window.txt_fuzzy_badhair_INPUT); 43 | var arr_color_factory_fuzzy_INPUTS:Array = new Array(color_factory_window.txt_fuzzy_speed_INPUT, color_factory_window.txt_fuzzy_segment_INPUT, color_factory_window.txt_fuzzy_length_INPUT, color_factory_window.txt_fuzzy_fuzziness_INPUT, color_factory_window.txt_fuzzy_random_INPUT); 44 | ///////////////////////////// 45 | 46 | //setting and refreshing filters, and drawing to bitmap 47 | //all else is in UI because it's entirely UI related 48 | 49 | function color_factory_resetAllFilters(bool_clearTemp:Boolean = false){ 50 | // 51 | mc_draw.filters = []; 52 | reset_colorTransform(mc_draw); 53 | bool_isMouseDown = false; 54 | //clear fuzzy 55 | deleteFuzzy(); 56 | //clear temp bitmaps from the temp bitmap array 57 | //only done if you save the image -- so it doesn't full reset 58 | //all other cases use color_factory_resetTempBitmaps 59 | if(bool_clearTemp){ 60 | arr_savedBitmaps = []; 61 | }; 62 | }; 63 | 64 | function color_factory_resetTempBitmaps(bool_clear:Boolean = true){ 65 | //reset demo bitmap to saved version before modidying it 66 | //only if bool_resetBitmap is true, else don't mess with the array 67 | try{ 68 | //pass it a value and only set back to ending one 69 | //if constantly refresh then it loses the source when you are paging up and down the values 70 | //may want to loop through... 71 | //this is similar to undo levels 72 | update_bitmaps_from(arr_savedBitmaps[arr_savedBitmaps.length-1], bitmapData_canvasDemo, bitmap_canvasDemo); 73 | if(bool_clear){ 74 | arr_savedBitmaps = []; 75 | }; 76 | // 77 | }catch(e:Error){ 78 | trace("color_factory_resetAllFilters: Invalid BitmapData"); 79 | } 80 | } 81 | 82 | function color_factory_refreshColorMatrix(){ 83 | color_factory_resetAllFilters(); 84 | applyColorMatrix(mc_draw, [color_factory_window.txt_colorMatrix_RED_01.text, color_factory_window.txt_colorMatrix_RED_02.text, color_factory_window.txt_colorMatrix_RED_03.text, color_factory_window.txt_colorMatrix_RED_04.text, color_factory_window.txt_colorMatrix_RED_05.text], [color_factory_window.txt_colorMatrix_GREEN_01.text, color_factory_window.txt_colorMatrix_GREEN_02.text, color_factory_window.txt_colorMatrix_GREEN_03.text, color_factory_window.txt_colorMatrix_GREEN_04.text, color_factory_window.txt_colorMatrix_GREEN_05.text], [color_factory_window.txt_colorMatrix_BLUE_01.text, color_factory_window.txt_colorMatrix_BLUE_02.text, color_factory_window.txt_colorMatrix_BLUE_03.text, color_factory_window.txt_colorMatrix_BLUE_04.text, color_factory_window.txt_colorMatrix_BLUE_05.text], [color_factory_window.txt_colorMatrix_ALPHA_01.text, color_factory_window.txt_colorMatrix_ALPHA_02.text, color_factory_window.txt_colorMatrix_ALPHA_03.text, color_factory_window.txt_colorMatrix_ALPHA_04.text, color_factory_window.txt_colorMatrix_ALPHA_05.text]); 85 | } 86 | 87 | function color_factory_refreshConvolution(){ 88 | color_factory_resetAllFilters(); 89 | applyConvolutionFilter(mc_draw, [color_factory_window.txt_convolution_matrix_01.text, color_factory_window.txt_convolution_matrix_02.text, color_factory_window.txt_convolution_matrix_03.text, color_factory_window.txt_convolution_matrix_04.text, color_factory_window.txt_convolution_matrix_05.text, color_factory_window.txt_convolution_matrix_06.text, color_factory_window.txt_convolution_matrix_07.text, color_factory_window.txt_convolution_matrix_08.text, color_factory_window.txt_convolution_matrix_09.text], color_factory_window.txt_convolution_multiplyer_01.text); 90 | } 91 | 92 | function color_factory_refreshColorTransform(){ 93 | color_factory_resetAllFilters(); 94 | set_colorTransform(mc_draw, [color_factory_window.txt_colorTransform_redMultiplier_INPUT.text, color_factory_window.txt_colorTransform_greenMultiplier_INPUT.text, color_factory_window.txt_colorTransform_blueMultiplier_INPUT.text, color_factory_window.txt_colorTransform_alphaMultiplier_INPUT.text, color_factory_window.txt_colorTransform_redOffset_INPUT.text, color_factory_window.txt_colorTransform_greenOffset_INPUT.text, color_factory_window.txt_colorTransform_blueOffset_INPUT.text, color_factory_window.txt_colorTransform_alphaOffset_INPUT.text]); 95 | } 96 | 97 | function color_factory_refreshRGBshift(){ 98 | // 99 | color_factory_resetTempBitmaps(false); 100 | RGBshift(bitmap_canvasDemo, mc_draw, color_factory_window.txt_rgbshift_RED_X_INPUT.text, color_factory_window.txt_rgbshift_RED_Y_INPUT.text, color_factory_window.txt_rgbshift_GREEN_X_INPUT.text, color_factory_window.txt_rgbshift_GREEN_Y_INPUT.text, color_factory_window.txt_rgbshift_BLUE_X_INPUT.text, color_factory_window.txt_rgbshift_BLUE_Y_INPUT.text); 101 | } 102 | 103 | function color_factory_refreshPixelBlast(){ 104 | // 105 | pixelblast(bitmapData_canvasDemo); 106 | // 107 | } 108 | 109 | function color_factory_refreshShuffle(){ 110 | //call but without clearing or refreshing 111 | shuffle_bitmap(bitmap_canvasDemo, mc_draw, color_factory_window.txt_shuffle_spacing_x_INPUT.text, color_factory_window.txt_shuffle_spacing_y_INPUT.text, color_factory_window.txt_shuffle_size_rows_INPUT.text, color_factory_window.txt_shuffle_size_cols_INPUT.text); 112 | // 113 | } 114 | 115 | function color_factory_refreshASCII(){ 116 | drawAsciiToBitmap(bitmap_canvasDemo, bitmapData_canvasDemo); 117 | } 118 | 119 | function color_factory_refreshMirror(str_type:String = "RANDOM"){ 120 | // 121 | if(str_type == "RANDOM"){ 122 | bitmapMirror(bitmapData_canvasDemo, Math_randomRange(0, 3)); 123 | }else{ 124 | bitmapMirror(bitmapData_canvasDemo, Number(str_type)); 125 | } 126 | } 127 | 128 | function color_factory_refreshPerlin(){ 129 | // 130 | color_factory_resetTempBitmaps(false); 131 | // 132 | //convert string to boolean 133 | var stitch:Boolean = (color_factory_window.txt_perlin_stitch_INPUT.text == "true") ? true : false; 134 | var fractalNoise:Boolean = (color_factory_window.txt_perlin_fractalNoise_INPUT.text == "true") ? true : false; 135 | var grayScale:Boolean = (color_factory_window.txt_perlin_grayScale_INPUT.text == "true") ? true : false; 136 | // 137 | perlin_texture(bitmap_canvasDemo, color_factory_window.txt_perlin_scale_INPUT.text, 1, color_factory_window.txt_perlin_baseX_INPUT.text, color_factory_window.txt_perlin_baseY_INPUT.text, color_factory_window.txt_perlin_numOctavesINPUT.text, color_factory_window.txt_perlin_randomSeed_INPUT.text, stitch, fractalNoise, color_factory_window.txt_perlin_channelOptions_INPUT.text, grayScale, color_factory_window.txt_perlin_scale_INPUT.text); 138 | } 139 | 140 | function color_factory_refreshFuzzy(){ 141 | //set bools here 142 | 143 | //reset here maybe 144 | 145 | //set 146 | nextFuzzy(bitmapData_canvasDemo, bitmap_canvasDemo); 147 | } -------------------------------------------------------------------------------- /as/as/drawingtool/CUSTOMINK.as: -------------------------------------------------------------------------------- 1 | /* 2 | code partly addapted from HIDIHO en.nicoptere.net (site has been archived) 3 | see also: http://www.barradeau.com/hidiho/index.html 4 | can customize an inky brush stroke 5 | smoothness also depends on speed of drawing 6 | can be ink or can be set to a range to draw random lines within a range around the mouse 7 | alpha can be set for more gentle art (shading) 8 | 9 | this is a very modified version of the PEN/ERASE tool 10 | */ 11 | 12 | //str_tool = "CUSTOM INK" 13 | 14 | //CUSOM INK// 15 | var customInk_brush:Shape = new Shape(); 16 | //input values 17 | var num_customInk_maxSize:Number = 2; 18 | var num_customInk_precision:Number = 30; //higher values = precise & thicker stroke (10 - 30 = recommended range) 19 | var num_customInk_alpha:Number = 5; 20 | //custom ink random linerange to control current xy and prev xy 21 | var num_customInk_lineRange_X1:Number = 10; 22 | var num_customInk_lineRange_Y1:Number = 10; 23 | var num_customInk_lineRange_X2:Number = 10; 24 | var num_customInk_lineRange_Y2:Number = 10; 25 | //bool for controling randomness 26 | var bool_customInk_lineRange:Boolean = false; //no range keeps it restricted to cursor, range lets you control line randomness around cursor 27 | 28 | //the draw function 29 | //exmaple (on move): 30 | //set cur xy 31 | //call: customInk_draw(customInk_brush.graphics, [new Point(num_curMouseX, num_curMouseY), new Point(num_prevMouseX, num_prevMouseY)], canvas); 32 | //set prev xy 33 | function customInk_draw(graphics:Graphics, pts:Array, _bitmapData:BitmapData, color:uint = 0){ 34 | var i:int; 35 | var j:int; 36 | var tmp:Array; 37 | var strokeWeight:Number = num_customInk_maxSize; 38 | var strokeAlpha:Number = convert_to_decimal(num_customInk_alpha); 39 | var points:Array = pts; 40 | // 41 | customInk_brush.graphics.lineStyle(0, color); 42 | // 43 | for( i = 0; i < points.length; i++ ) 44 | { 45 | //set x/y values 46 | var p0:Point = points[i]; 47 | var p1:Point = points[(i + 1) % points.length ]; 48 | //customInk_calcPoints the stroke with new x/y values (pecision is an input) 49 | tmp = customInk_calcPoints( p0, p1, num_customInk_precision); 50 | j = 0; 51 | //move to new points 52 | customInk_brush.graphics.moveTo( tmp[0].x, tmp[0].y ); 53 | //make stroke random 54 | while( j < tmp.length ) 55 | { 56 | //restrict sizes 57 | strokeWeight += ( Math.random() - .5 ) * 2; 58 | strokeWeight = ( strokeWeight > 20 ) ? 20 : ( strokeWeight < 1 ) ? 1 : strokeWeight; 59 | // 60 | customInk_brush.graphics.lineStyle( strokeWeight + Math.random(), color, strokeAlpha); 61 | //if it should be drawn as a range around the mouse, or a straight smooth line 62 | if(!bool_customInk_lineRange){ 63 | customInk_brush.graphics.lineTo( tmp[j].x, tmp[j].y ); 64 | }else{ 65 | customInk_brush.graphics.lineTo( Math_randomRange(tmp[j].x - num_customInk_lineRange_X1, tmp[j].x + num_customInk_lineRange_Y1), Math_randomRange(tmp[j].y - num_customInk_lineRange_X2, tmp[j].y + num_customInk_lineRange_Y2)) 66 | } 67 | //increment 68 | j++; 69 | // 70 | } 71 | 72 | } 73 | //draw and clear 74 | _bitmapData.draw(customInk_brush, customInk_brush.transform.matrix, null); 75 | customInk_brush.graphics.clear(); 76 | 77 | //for testing... TODO: ADD MORE EFFECTS TO THIS 78 | // var blur:BitmapData = canvas.clone(); 79 | // blur.applyFilter(blur, blur.rect, new Point(0,0), new BlurFilter(10,10,1)); 80 | //canvas.draw(blur);//, null, null, BlendMode.ADD); 81 | } 82 | 83 | //adjust line and velocity 84 | function customInk_calcPoints( p0:Point, p1:Point, precision:int = 20 ):Array 85 | { 86 | var tmp:Array = []; 87 | // 88 | var ox:Number = p0.x; 89 | var oy:Number = p0.y; 90 | var dx:Number = p1.x - ox; 91 | var dy:Number = p1.y - oy; 92 | // 93 | var offset:Number = Math.sqrt( dx*dx + dy*dy ) / 100; 94 | var angle:Number = Math.atan2( dy, dx ); 95 | var intermediate:Point; 96 | var multi:Number = ( 1 + Math.random() * 5 ) * ( (Math.random() > .5 ) ? 3 : 1 ); 97 | // 98 | var t:Number = 0; 99 | var step:Number = 1 / precision; 100 | //calc 101 | ox += Math.cos( angle ) * -offset * multi; 102 | oy += Math.sin( angle ) * -offset * multi; 103 | // 104 | dx += Math.cos( angle ) * offset * multi*2; 105 | dy += Math.sin( angle ) * offset * multi*2; 106 | // 107 | while( t <= 1 ) 108 | { 109 | // 110 | t += step; 111 | intermediate = new Point(); 112 | // 113 | intermediate.x = ox + ( dx * t ) + ( Math.random() - .5 ) * offset; 114 | intermediate.y = oy + ( dy * t ) + ( Math.random() - .5 ) * offset; 115 | // 116 | tmp.push( intermediate ); 117 | } 118 | // 119 | return tmp; 120 | } -------------------------------------------------------------------------------- /as/as/drawingtool/DOTTEDLINES.as: -------------------------------------------------------------------------------- 1 | /* 2 | code adapted/inspired from a community discussion from Snipplr 3 | http://www.macromedia.com/devnet/mx/flash/articles/adv_draw_methods.html 4 | and warmforestflash.com 5 | 6 | draws a dotted line 7 | speed of mouse also matters in placing the dots 8 | can set dot spacing, dot length, and random dots (like sprinkles on a cake) 9 | 10 | */ 11 | 12 | //str_tool = "DOTTED LINES" 13 | 14 | //DOTTED LINES// 15 | var num_dottedLength:Number = .2; 16 | var num_dottedSpacing:Number = 200; 17 | var num_dottedSprinkle:Number = 0; //random x or y for mouse 18 | 19 | /* 20 | usage: in mouse MOVE 21 | //draw_dotted(penSprite, num_prevMouseX, num_prevMouseY, event.localX, event.localY, num_dottedLength, num_dottedSpacing); 22 | draw_dotted(penSprite, Math_randomRange(num_prevMouseX-num_dottedSprinkle, num_prevMouseX+num_dottedSprinkle), Math_randomRange(num_prevMouseY-num_dottedSprinkle, num_prevMouseY+num_dottedSprinkle), Math_randomRange(event.localX-num_dottedSprinkle, event.localX+num_dottedSprinkle), Math_randomRange(event.localY-num_dottedSprinkle, event.localY+num_dottedSprinkle), num_dottedLength, num_dottedSpacing); 23 | //draw to canvas and clear 24 | canvasBitmapData.draw(penSprite); 25 | penSprite.graphics.clear(); 26 | */ 27 | 28 | function draw_dotted(target:Sprite, x1: Number, y1: Number, x2: Number, y2: Number, dashLength: Number = 5, spaceLength: Number = 5): void { 29 | 30 | var x: Number = x2 - x1; 31 | var y: Number = y2 - y1; 32 | var hyp: Number = Math.sqrt((x) * (x) + (y) * (y)); 33 | var units: Number = hyp / (dashLength + spaceLength); 34 | var dashSpaceRatio: Number = dashLength / (dashLength + spaceLength); 35 | var dashX: Number = (x / units) * dashSpaceRatio; 36 | var spaceX: Number = (x / units) - dashX; 37 | var dashY: Number = (y / units) * dashSpaceRatio; 38 | var spaceY: Number = (y / units) - dashY; 39 | 40 | target.graphics.lineStyle(num_pen_size, pen_color, pen_alpha); 41 | target.graphics.moveTo(x1, y1); 42 | 43 | while (hyp > 0) { 44 | x1 += dashX; 45 | y1 += dashY; 46 | hyp -= dashLength; 47 | if (hyp < 0) { 48 | x1 = x2; 49 | y1 = y2; 50 | } 51 | target.graphics.lineTo(x1, y1); 52 | x1 += spaceX; 53 | y1 += spaceY; 54 | target.graphics.moveTo(x1, y1); 55 | hyp -= spaceLength; 56 | 57 | } 58 | // 59 | target.graphics.moveTo(x2, y2); 60 | } -------------------------------------------------------------------------------- /as/as/drawingtool/DRAW_AND_FILL.as: -------------------------------------------------------------------------------- 1 | /* 2 | inspired by projects once hosted on wonderfl, and other places like senocular and ctyeung 3 | this code is a simplified version adapted from above 4 | draw a line and fill with chosen color after drawing (mouse up) 5 | auto fill lines... 6 | you can choose line and fill color, you can also set line size and alpha 7 | this is an expanded on version of the pen tool and pen tool values apply to this 8 | */ 9 | 10 | //str_tool = "DRAW AND FILL" 11 | 12 | //DRAW AND FILL (DRAW AND AUTO FILL ON MOUSE UP) 13 | //DRAW & FILL vars 14 | var pt_drawAndFill_lastPos: Point; //last mouse position 15 | var vec_drawAndFill_pathComnd: Vector.; //graphics path command 16 | var vec_drawAndFill_mousePos: Vector.; //current mouse position 17 | //DRAW AND FILL color selection in the UI 18 | var ct_drawAndFill_lineCol:ColorTransform = new ColorTransform(); 19 | var ct_drawAndFill_fillCol:ColorTransform = new ColorTransform(); 20 | var drawAndFill_lineCol: uint = 0x000000; 21 | var drawAndFill_fillCol: uint = 0xFFFFFF; 22 | var str_drawAndFill_currSelection:String = "line"; //UI: currently selected color tab (line or fill) 23 | ///////////////////////////////////// 24 | 25 | function drawAndFill_startDraw(event_localX:Number, event_localY:Number){ 26 | // 27 | pt_drawAndFill_lastPos = new Point(event_localX, event_localY); 28 | vec_drawAndFill_pathComnd = new Vector.(); 29 | vec_drawAndFill_mousePos = new Vector.(); 30 | vec_drawAndFill_pathComnd.push(GraphicsPathCommand.MOVE_TO); 31 | vec_drawAndFill_mousePos.push(event_localX); 32 | vec_drawAndFill_mousePos.push(event_localY); 33 | // 34 | } 35 | 36 | function drawAndFill_moveDraw(event_localX:Number, event_localY:Number){ 37 | // 38 | penSprite.graphics.lineStyle(num_pen_size, drawAndFill_lineCol); 39 | penSprite.graphics.moveTo(pt_drawAndFill_lastPos.x, pt_drawAndFill_lastPos.y); 40 | penSprite.graphics.lineTo(event_localX, event_localY); 41 | pt_drawAndFill_lastPos.x = event_localX; 42 | pt_drawAndFill_lastPos.y = event_localY; 43 | //update vectors for filling on mouse up... 44 | vec_drawAndFill_pathComnd.push(GraphicsPathCommand.LINE_TO); 45 | vec_drawAndFill_mousePos.push(event_localX); 46 | vec_drawAndFill_mousePos.push(event_localY); 47 | // 48 | } 49 | 50 | function drawAndFill_endDraw(){ 51 | // 52 | penSprite.graphics.beginFill(drawAndFill_fillCol); 53 | //drawPath(commands:Vector., mousePos:Vector., winding:String = "evenOdd"):void 54 | penSprite.graphics.drawPath(vec_drawAndFill_pathComnd, vec_drawAndFill_mousePos, GraphicsPathWinding.EVEN_ODD); //NON_ZERO 55 | penSprite.graphics.endFill(); 56 | //important to clear all first, else error occurs with penSprite colors between tools... 57 | drawAndFill_clear(); 58 | //push to canvas here 59 | canvasBitmapData.draw(penSprite, penSprite.transform.matrix); 60 | //clear all pen sprites and start over... 61 | penSprite.graphics.clear(); 62 | // 63 | } 64 | 65 | //clear all values and vectors (reset) 66 | function drawAndFill_clear(){ 67 | pt_drawAndFill_lastPos = null; 68 | vec_drawAndFill_pathComnd.length = 0; 69 | vec_drawAndFill_mousePos.length = 0; 70 | } 71 | 72 | /* 73 | usage: 74 | on mouse move: 75 | drawAndFill_moveDraw(event.localX, event.localY); 76 | 77 | on mouse up: 78 | drawAndFill_endDraw(); 79 | 80 | on mouse down: 81 | drawAndFill_startDraw(event.localX, event.localY); 82 | */ -------------------------------------------------------------------------------- /as/as/drawingtool/EGGS.as: -------------------------------------------------------------------------------- 1 | /* 2 | adapted from the dead code preservation project (as3 works from wonderfl.net) wa.zozuar.org 3 | this used to be a "meme" and was kind of an iconic effect for a while, therefore it is included as a tool throwing back to that... 4 | eggs is a tool that draws lines and ocasionally sets splashies. lines and splashes are both different colors, and there are a number of options to adjust the tool's effects. the best is the "glitch" effect with takes advantage of a graphical glitch and draws extremely wild lines. this one will probably be the hardest to port (although it's very important that behavior is identical since it also throws back to a popular Flash specific visual style that was once popular on "high end" designer websites). 5 | */ 6 | 7 | //str_tool = "EGGS" 8 | 9 | ///////EGGS TOOL///////////// 10 | var egg_sprite: Sprite = new Sprite(); 11 | //set the type of egg (round or square) and the "mood" (chaotic, nice...) 12 | var str_eggType:String = "round"; //"round" "cubed" 13 | var str_eggMood:String = "good"; //"good" "messy" "chaos" "eggnog" "glitch" 14 | //egg colors 15 | var ct_eggCol1:ColorTransform = new ColorTransform(); 16 | var ct_eggCol2:ColorTransform = new ColorTransform(); 17 | var egg_color1: uint = 0xFFFAD3; 18 | var egg_color2: uint = 0xFFCC00; 19 | var str_currEggColor:String = "1"; //currently selected egg tab 20 | //egg filter array & filters (used for eggnog) 21 | var filter_eggGlow:GlowFilter = new GlowFilter(); 22 | var arr_eggFilters:Array = new Array(); 23 | //filter settings 24 | var num_eggGlow_blur:Number = 5; 25 | var num_eggGlow_strength:Number = 2; 26 | //////////////////////// 27 | 28 | //EGG DRAWING 29 | //first run 30 | function egg_init(){ 31 | egg_delete();//in case it exists already 32 | mc_draw.addChild(egg_sprite); 33 | egg_updateFilters(); 34 | } 35 | //delete the egg 36 | function egg_delete(){ 37 | // 38 | arr_eggFilters = []; 39 | // 40 | try{ 41 | egg_sprite.filters = []; 42 | egg_sprite.graphics.clear(); 43 | }catch(e:Error){ 44 | trace("null egg filters"); 45 | } 46 | // 47 | try{ 48 | mc_draw.removeChild(egg_sprite); 49 | }catch(e:Error){ 50 | trace("null egg"); 51 | } 52 | } 53 | //set the egg's filter 54 | //updated whenever a color change happens 55 | //or if you enable/disable eggnog 56 | //call whenever switching egg modes 57 | function egg_updateFilters(){ 58 | //GHOST EGG 59 | //TURN KNOCKOUT ON AND MAKE IT A DARKER COLOR 60 | //when turning on ghostegg, enable knockout and hide the color tab that's not in use 61 | //encourage them to change the colors 62 | //default values stay the same (glow is very faint) 63 | filter_eggGlow.blurX = filter_eggGlow.blurY = num_eggGlow_blur; 64 | filter_eggGlow.alpha = .5; 65 | filter_eggGlow.color = egg_color1; 66 | filter_eggGlow.inner = false; 67 | //if eggnog or not 68 | if(str_eggMood == "eggnog"){ 69 | filter_eggGlow.knockout = true; 70 | }else{ 71 | filter_eggGlow.knockout = false; 72 | } 73 | filter_eggGlow.quality = BitmapFilterQuality.HIGH; 74 | filter_eggGlow.strength = num_eggGlow_strength; 75 | 76 | //reset filters first (in case updated) 77 | arr_eggFilters = []; 78 | egg_sprite.filters = []; 79 | //push new 80 | arr_eggFilters.push(filter_eggGlow); 81 | egg_sprite.filters = arr_eggFilters; 82 | }; 83 | //update the eggo coords for MOUSE_DOWN 84 | //first click... 85 | function egg_setCoords(event_localX:Number, event_localY:Number){ 86 | //update coords... 87 | num_curMouseX = event_localX; 88 | num_curMouseY = event_localY; 89 | num_prevMouseX = event_localX; 90 | num_prevMouseY = event_localY; 91 | //move to 92 | egg_sprite.graphics.moveTo(event_localX, event_localY); 93 | }; 94 | 95 | //paint with egg (MOUSE_MOVE) 96 | function egg_paint(event_localX:Number, event_localY:Number){ 97 | // 98 | var distance: Number = Math.sqrt(Math.pow(num_prevMouseX - num_curMouseX, 2) + Math.pow(num_prevMouseY - num_curMouseY, 2)); 99 | var a: Number = distance * 10 * (Math.pow(Math.random(), 2) - 0.5); 100 | var r: Number = Math.random() - 0.5; 101 | //size determined by pen size slider 102 | var size: Number = Math.random() * num_pen_size / distance; 103 | // 104 | var paintSize:Number = ((Math.random() + num_pen_size / 10 - 0.5) * size + (1 - Math.random() + num_pen_size / 20 - 0.5) * size); 105 | // 106 | var color:uint; 107 | //These are set in the UI (toggle) 108 | var capsStyle; 109 | var jointStyle; 110 | //set caps and joint... 111 | if(str_eggType == "round" && str_eggMood != "chaos" && str_eggMood != "glitch"){ 112 | capsStyle = CapsStyle.ROUND; 113 | }else{ 114 | //cubed 115 | capsStyle = CapsStyle.SQUARE; 116 | }; 117 | if(str_eggType == "round" && str_eggMood != "chaos" && str_eggMood != "glitch"){ 118 | jointStyle = JointStyle.BEVEL; 119 | }else{ 120 | //cubed 121 | jointStyle = JointStyle.MITER; 122 | } 123 | //control the colors 124 | if(Math.ceil(a) == Math.ceil(r) || size > distance && Math.random()*100 > 90){ 125 | color = egg_color1; 126 | }else{ 127 | color = egg_color2; 128 | } 129 | // 130 | if(size > distance/2){ 131 | color = egg_color1; 132 | } 133 | 134 | //IF size is bigger than something set color to darker 135 | //if size is smaller then color is lighter 136 | 137 | num_mouseDisX = (num_prevMouseX - num_curMouseX) * Math.sin(0.5) + num_curMouseX; 138 | num_mouseDisY = (num_prevMouseY - num_curMouseY) * Math.cos(0.5) + num_curMouseY; 139 | 140 | num_curMouseX = num_prevMouseX; 141 | num_curMouseY = num_prevMouseY; 142 | num_prevMouseX = event_localX; 143 | num_prevMouseY = event_localY; 144 | 145 | //////////////////// 146 | 147 | egg_sprite.graphics.beginFill(color); 148 | 149 | //this is necessary. it breaks if it's not here. this is the glitch feature 150 | if(str_eggMood != "glitch"){ 151 | egg_sprite.graphics.moveTo(num_curMouseX, num_curMouseY); 152 | }; 153 | 154 | //CHAOS 155 | if(str_eggMood == "chaos" || str_eggMood == "glitch"){ 156 | egg_sprite.graphics.curveTo(Math_randomRange_dec(num_mouseDisX-10, num_mouseDisX+10), Math_randomRange_dec(num_mouseDisY-10, num_mouseDisY+10), Math_randomRange_dec(num_prevMouseX-10, num_prevMouseX+10), Math_randomRange_dec(num_prevMouseY-10, num_prevMouseY+10)); 157 | egg_sprite.graphics.curveTo(num_mouseDisX, num_mouseDisY, num_prevMouseX + r, num_prevMouseY + r + a); //make a leaf. reamove r and a for normal curve... 158 | }; 159 | //MESSY 160 | if(str_eggMood == "messy"){ 161 | egg_sprite.graphics.curveTo(Math_randomRange_dec(num_mouseDisX-50, num_mouseDisX+50), Math_randomRange_dec(num_mouseDisY-50, num_mouseDisY+50), Math_randomRange_dec(num_prevMouseX-10, num_prevMouseX+10), Math_randomRange_dec(num_prevMouseY-10, num_prevMouseY+10)); 162 | } 163 | 164 | //if square (default line always shows ALONG WITH curveTO) 165 | egg_sprite.graphics.moveTo(num_curMouseX, num_curMouseY); 166 | egg_sprite.graphics.lineTo(num_prevMouseX, num_prevMouseY); 167 | 168 | egg_sprite.graphics.lineStyle(paintSize, color, 1, false, LineScaleMode.NONE, capsStyle, jointStyle); 169 | 170 | //this makes the splotches (remove for chaos) 171 | if(str_eggMood != "chaos" && str_eggMood != "glitch"){ 172 | egg_sprite.graphics.moveTo(num_curMouseX + a, num_curMouseY + a); 173 | }; 174 | 175 | egg_sprite.graphics.lineTo(num_curMouseX + r + a, num_curMouseY + r + a); 176 | // 177 | 178 | if(str_eggMood != "chaos" && str_eggMood != "glitch"){ 179 | egg_sprite.graphics.lineStyle(paintSize, color, 1, false, LineScaleMode.NONE, capsStyle, jointStyle); 180 | }; 181 | 182 | egg_sprite.graphics.endFill(); 183 | 184 | }; -------------------------------------------------------------------------------- /as/as/drawingtool/GIFBRUSH.as: -------------------------------------------------------------------------------- 1 | /* 2 | a simple gif loading and playback tool 3 | loads an animated gif, and draws with its frames 4 | see gifbrush_draw (for drawing with animation) 5 | */ 6 | 7 | 8 | //str_tool = "GIF BRUSH"; 9 | 10 | //GIF BRUSH (PAINT WITH AN ANIMATED GIF) 11 | var fileReference_gifbrush: FileReference = new FileReference();//opening the gif 12 | //var gifbrush_gifPlayer: GIFPlayer = new GIFPlayer();//the actual player 13 | var gifbrush_gifContainer:MovieClip = new MovieClip();//containing clip used to set to mouse position 14 | ///////////////////////////// 15 | 16 | //the gif should follow the mouse around 17 | //it's only visible if MOUSE_OVER mc_draw is true... 18 | function gifbrush_setMouseAsGif(event:Event){ 19 | gifbrush_gifContainer.x = mouseX - Math.ceil(gifbrush_gifContainer.width/2); 20 | gifbrush_gifContainer.y = mouseY - Math.ceil(gifbrush_gifContainer.height/2); 21 | //use the slider to convert_to_decimal(num_pen_size * 2) 22 | //always called so gif is always being sized (instead of relying on slider to call that...) 23 | //gifbrush_gifPlayer.scaleX = gifbrush_gifPlayer.scaleY = convert_to_decimal(num_pen_size * 2); 24 | // 25 | } 26 | 27 | //visibility based on over/out of canvas 28 | function gifbrush_overCanvas(event:MouseEvent){ 29 | gifbrush_gifContainer.visible = true; 30 | } 31 | function gifbrush_outCanvas(event:MouseEvent){ 32 | gifbrush_gifContainer.visible = false; 33 | } 34 | 35 | //if you're mousing over the canvas then enable this 36 | //else disable 37 | //used as FRAME_RENDERED event: .addEventListener(GIFPlayerEvent.FRAME_RENDERED, FUNCTION_NAME); 38 | function gifbrush_draw(event_localX:Number, event_localY:Number){ 39 | // 40 | var mat:Matrix=new Matrix(); 41 | mat.translate(event_localX - Math.ceil(gifbrush_gifContainer.width/2), event_localY- Math.ceil(gifbrush_gifContainer.height/2)); 42 | mat.scale(gifbrush_gifContainer.scaleX, gifbrush_gifContainer.scaleY); 43 | // 44 | canvasBitmapData.draw(gifbrush_gifContainer, mat);//gifbrush_gifContainer.transform.matrix); 45 | } 46 | 47 | //INIT: call this to start 48 | //setup the player 49 | //container 50 | //and reference for loading the brush 51 | //!! clear all first 52 | function gifbrush_setupLoader(){ 53 | //delete all first 54 | gifbrush_clearAll(); 55 | // 56 | stage.addChild(gifbrush_gifContainer); 57 | //start listeners 58 | fileReference_gifbrush.addEventListener(Event.SELECT, event_gifbrushFileRef_SELECT); 59 | fileReference_gifbrush.addEventListener(Event.CANCEL, event_gifbrushFileRef_CANCEL); 60 | fileReference_gifbrush.addEventListener(Event.COMPLETE, event_gifbrushFileRef_LOADED); 61 | mc_setting_gifbrush.btn_loadgif.addEventListener(MouseEvent.MOUSE_UP, event_gifbrush_OPENFILE); 62 | // 63 | } 64 | 65 | function gifbrush_clearAll(){ 66 | //remove all listeners 67 | fileReference_gifbrush.removeEventListener(Event.SELECT, event_gifbrushFileRef_SELECT); 68 | fileReference_gifbrush.removeEventListener(Event.CANCEL, event_gifbrushFileRef_CANCEL); 69 | fileReference_gifbrush.removeEventListener(Event.COMPLETE, event_gifbrushFileRef_LOADED); 70 | mc_setting_gifbrush.btn_loadgif.removeEventListener(MouseEvent.MOUSE_UP, event_gifbrush_OPENFILE); 71 | // 72 | mc_draw.removeEventListener(Event.ENTER_FRAME, gifbrush_setMouseAsGif); 73 | mc_draw.removeEventListener(MouseEvent.MOUSE_OVER, gifbrush_overCanvas); 74 | mc_draw.removeEventListener(MouseEvent.MOUSE_OUT, gifbrush_outCanvas); 75 | //clear all 76 | try{ 77 | gifbrush_gifContainer.removeChildren(); 78 | }catch(e:Error){ 79 | trace("gifbrush_gifContainer: gifbrush_gifPlayer object not removed"); 80 | } 81 | //clear container 82 | try{ 83 | stage.removeChild(gifbrush_gifContainer); 84 | }catch(e:Error){ 85 | trace("gifbrush_gifContainer not removed"); 86 | } 87 | // 88 | } 89 | 90 | //setup listeners (load success) 91 | function gifbrush_loadSuccess(){ 92 | //important: disable gif so that coordinates get fed and it can actually draw to canvas (not intersept mouse clicks) 93 | gifbrush_gifContainer.mouseEnabled = false; 94 | //following the mouse and handle showing it... 95 | mc_draw.addEventListener(Event.ENTER_FRAME, gifbrush_setMouseAsGif); 96 | mc_draw.addEventListener(MouseEvent.MOUSE_OVER, gifbrush_overCanvas); 97 | mc_draw.addEventListener(MouseEvent.MOUSE_OUT, gifbrush_outCanvas); 98 | } 99 | 100 | function event_gifbrush_OPENFILE(event:MouseEvent): void { 101 | fileReference_gifbrush.browse([new FileFilter("Image Files (*.gif)", "*.gif")]); 102 | } 103 | 104 | function event_gifbrushFileRef_SELECT(event: Event): void { 105 | fileReference_gifbrush.load(); 106 | } 107 | 108 | function event_gifbrushFileRef_CANCEL(event: Event): void { 109 | trace("Canceled file selection."); 110 | } 111 | 112 | function event_gifbrushFileRef_LOADED(event: Event): void { 113 | // 114 | } 115 | 116 | function handleGifLoadComplete(): void { 117 | //Gif load complete, adding to stage... 118 | //init gif listeners... 119 | gifbrush_loadSuccess(); 120 | } -------------------------------------------------------------------------------- /as/as/drawingtool/GLASS_STAMPS.as: -------------------------------------------------------------------------------- 1 | /* 2 | code adapted from AS3 photo booth filters 3 | rakuto.blogspot.com/2008/02/as3filters-photo-boothas3.html stackoverflow and the AS3 docs 4 | largely inspired from an old article in the AS3 docs (likely not online anymore) 5 | 6 | this is a windowed tool, it edits and updates a cloned bitmap of the canvas made with create_canvasDemo()... 7 | the clone is edited. when the tool is closed, changes are saved to the main canvas. 8 | this uses DisplacementMapFilters to get the effects 9 | see DISPLACEMENT.as... 10 | */ 11 | 12 | //str_tool = "GLASS STAMPS" 13 | //GLASS STAMPS VALUES// 14 | //types of filters and stamps (for random) 15 | var arr_glassStamp_filters:Array = new Array("fisheye", "twirl", "bulge", "squeeze", "pinch", "tunel", "stretch"); 16 | var arr_glassStamp_types:Array = new Array("square", "circle"); 17 | //currently selected type 18 | var str_glassStamp_currType:String = "circle"; 19 | var str_glassStamp_currFilter:String = "twirl"; 20 | //values for glass stamps (shared) 21 | var num_glassStamp_radius: uint = 50;//stamp size value 22 | var shape_glassStamp_xCircle: Shape; 23 | var shape_glassStamp_yCircle: Shape; 24 | //maps 25 | var bitmapData_glassStamp_map: BitmapData; 26 | var bitmapData_glassStamp_mapBitmap: Bitmap; 27 | //values for all fields 28 | var num_glassStamp_twirl:Number = 5; 29 | var num_glassStamp_buldge:Number = .5; 30 | var num_glassStamp_squeeze:Number = 1.1; 31 | var num_glassStamp_pinch:Number = .35; 32 | var num_glassStamp_strech:Number = 100; 33 | var num_glassStamp_lense:Number = 0.8; 34 | //value for size text field 35 | //var num_glassStamp_size:Number = 50; 36 | //should you draw or stamp the glass stamp 37 | var bool_glassStamp_stamp:Boolean = true; 38 | //////////////////////// 39 | 40 | //set up the maping shapes and gradients 41 | //shape is mapped from a sprite that's drawn and added to the UI 42 | function glassStamp_setupCircles(str_type:String = "circle"){ 43 | //clear sprites first 44 | try{ 45 | shape_glassStamp_xCircle.graphics.clear(); 46 | shape_glassStamp_yCircle.graphics.clear(); 47 | }catch(e:Error){ 48 | //trace(e); 49 | } 50 | // Create the gradient circles that will together form the 51 | // displacement map image 52 | //THIS IS THE SQUARE OR CIRCULAR SELECTION, TOGGLE BETWEEN "LINEAR" OR "RADIAL" 53 | var type: String = GradientType.LINEAR; 54 | //if(str_type == "LINEAR"){ 55 | // type = GradientType.LINEAR; 56 | //}else{ 57 | // type = GradientType.RADIAL; 58 | //}; 59 | // 60 | var redColors: Array = [0xFF0000, 0x000000]; 61 | var blueColors: Array = [0x0000FF, 0x000000]; 62 | var alphas: Array = [1, 1]; 63 | var ratios: Array = [0, 255]; 64 | var xMatrix: Matrix = new Matrix(); 65 | xMatrix.createGradientBox(num_glassStamp_radius * 2, num_glassStamp_radius * 2); 66 | var yMatrix: Matrix = new Matrix(); 67 | yMatrix.createGradientBox(num_glassStamp_radius * 2, num_glassStamp_radius * 2, Math.PI / 2); 68 | 69 | //genearte the shapes 70 | shape_glassStamp_xCircle = new Shape(); 71 | shape_glassStamp_xCircle.graphics.lineStyle(0, 0, 0); 72 | shape_glassStamp_xCircle.graphics.beginGradientFill(type, redColors, alphas, ratios, xMatrix); 73 | 74 | if(str_type == "circle"){ 75 | shape_glassStamp_xCircle.graphics.drawCircle(num_glassStamp_radius, num_glassStamp_radius, num_glassStamp_radius); 76 | }else{ 77 | shape_glassStamp_xCircle.graphics.drawRect(0,0,num_glassStamp_radius*2,num_glassStamp_radius*2); 78 | }; 79 | 80 | shape_glassStamp_yCircle = new Shape(); 81 | shape_glassStamp_yCircle.graphics.lineStyle(0, 0, 0); 82 | shape_glassStamp_yCircle.graphics.beginGradientFill(type, blueColors, alphas, ratios, yMatrix); 83 | 84 | if(str_type == "circle"){ 85 | shape_glassStamp_yCircle.graphics.drawCircle(num_glassStamp_radius, num_glassStamp_radius, num_glassStamp_radius); 86 | }else{ 87 | shape_glassStamp_yCircle.graphics.drawRect(0,0,num_glassStamp_radius*2,num_glassStamp_radius*2); 88 | }; 89 | }; 90 | 91 | function glassStamps_clearSprites(){ 92 | try{ 93 | mc_glass_stamps.mc_ico_circle.mc_loader.removeChild(bitmapData_glassStamp_mapBitmap); 94 | }catch(e:Error){ 95 | //null 96 | } 97 | try{ 98 | mc_glass_stamps.mc_ico_square.mc_loader.removeChild(bitmapData_glassStamp_mapBitmap); 99 | }catch(e:Error){ 100 | //null 101 | } 102 | try{ 103 | mc_glass_stamps.mc_ico_random.mc_loader.removeChild(bitmapData_glassStamp_mapBitmap); 104 | }catch(e:Error){ 105 | //null 106 | } 107 | try{ 108 | // 109 | bitmapData_glassStamp_map.dispose(); 110 | bitmapData_glassStamp_mapBitmap = null; 111 | // 112 | }catch(e:Error){ 113 | //null 114 | } 115 | } 116 | 117 | //set up the stamp (add child into previews) 118 | function glassStamp_setupMap(str_filter:String, icoClip:MovieClip, bool_isRandom:Boolean = false){ 119 | // 120 | var filter: DisplacementMapFilter; 121 | var region: Rectangle = new Rectangle(0, 0, num_glassStamp_radius * 2, num_glassStamp_radius * 2); 122 | //remove icon first before re-generating 123 | glassStamps_clearSprites(); 124 | // Create the map image by combining the two gradient circles. 125 | bitmapData_glassStamp_map = new BitmapData(shape_glassStamp_xCircle.width, shape_glassStamp_xCircle.height, false, 0x7F7F7F); //0x7F7F7F 126 | bitmapData_glassStamp_map.draw(shape_glassStamp_xCircle); 127 | var yMap: BitmapData = new BitmapData(shape_glassStamp_yCircle.width, shape_glassStamp_yCircle.height, false, 0x7F7F7F); //0x7F7F7F 128 | yMap.draw(shape_glassStamp_yCircle); 129 | bitmapData_glassStamp_map.copyChannel(yMap, yMap.rect, new Point(0, 0), BitmapDataChannel.BLUE, BitmapDataChannel.BLUE); 130 | yMap.dispose(); 131 | 132 | //////DISPLAY IN UI AS CURRENT SELECTION -- ALSO MAKE BLACK AND WHITE 133 | // Display the map image on the Stage, for reference. 134 | bitmapData_glassStamp_mapBitmap = new Bitmap(bitmapData_glassStamp_map); 135 | //add here 136 | icoClip.mc_loader.addChild(bitmapData_glassStamp_mapBitmap); 137 | //restrict size 138 | icoClip.mc_loader.width = 100; 139 | icoClip.mc_loader.height = 100; 140 | 141 | //MANAGE VALUES ACORDING TO UI INPUT HERE (REFRESH ON KEY DOWN) 142 | //the bool_isRandom is a quick hack, each needs to have a random value if you are generating a random one 143 | //random value for bool_isRandom is independent of other UI elements 144 | if(str_filter == "twirl"){ 145 | if(!bool_isRandom){ 146 | filter = twirlFilter(bitmapData_glassStamp_map, region, num_glassStamp_twirl); 147 | }else{ 148 | filter = twirlFilter(bitmapData_glassStamp_map, region, Math_randomRange(2, 500)); 149 | } 150 | } 151 | if(str_filter == "bulge"){ 152 | if(!bool_isRandom){ 153 | filter = bulgeFilter(bitmapData_glassStamp_map, region, num_glassStamp_buldge); 154 | }else{ 155 | filter = bulgeFilter(bitmapData_glassStamp_map, region, Math_randomRange(2, 500)); 156 | } 157 | } 158 | if(str_filter == "squeeze"){ 159 | if(!bool_isRandom){ 160 | filter = squeezeFilter(bitmapData_glassStamp_map, region, num_glassStamp_squeeze); 161 | }else{ 162 | filter = squeezeFilter(bitmapData_glassStamp_map, region, Math_randomRange(2, 500)); 163 | } 164 | } 165 | if(str_filter == "pinch"){ 166 | if(!bool_isRandom){ 167 | filter = pinchFilter(bitmapData_glassStamp_map, region, num_glassStamp_pinch); 168 | }else{ 169 | filter = pinchFilter(bitmapData_glassStamp_map, region, Math_randomRange_dec(2, 500)); 170 | } 171 | } 172 | if(str_filter == "tunel"){ 173 | filter = photicTunnelFilter(bitmapData_glassStamp_map, region); 174 | } 175 | if(str_filter == "stretch"){// 176 | if(!bool_isRandom){ 177 | filter = strechFilter(bitmapData_glassStamp_map, num_glassStamp_strech); 178 | }else{ 179 | filter = strechFilter(bitmapData_glassStamp_map, Math_randomRange_dec(.001, 500)); 180 | } 181 | } 182 | //if(str_filter == "mirror"){ 183 | // bitmapData_glassStamp_map = mirror(bitmapData_glassStamp_map, 5); 184 | //} 185 | if(str_filter == "fisheye"){// 186 | if(!bool_isRandom){ 187 | filter = fisheyeFilter(bitmapData_glassStamp_map, num_glassStamp_lense); 188 | }else{ 189 | filter = fisheyeFilter(bitmapData_glassStamp_map, Math_randomRange(.01, 5)); 190 | } 191 | } 192 | //apply filter now 193 | bitmapData_glassStamp_map.applyFilter(bitmapData_glassStamp_map, bitmapData_glassStamp_map.rect, new Point(0, 0), filter); 194 | }; 195 | 196 | //this function creates the displacement. should be called on mouseMove 197 | function glassStamp_magnify(_bitmap:Bitmap, x_mouse, y_mouse): void { 198 | // Position the filter. 199 | var filterX: Number = (x_mouse) - (bitmapData_glassStamp_map.width / 2); 200 | var filterY: Number = (y_mouse) - (bitmapData_glassStamp_map.height / 2); 201 | var pt: Point = new Point(filterX, filterY); 202 | var xyFilter: DisplacementMapFilter = new DisplacementMapFilter(); 203 | xyFilter.mapBitmap = bitmapData_glassStamp_map; 204 | xyFilter.mapPoint = pt; 205 | // The red in the map image will control x displacement. 206 | xyFilter.componentX = BitmapDataChannel.RED; 207 | // The blue in the map image will control y displacement. 208 | xyFilter.componentY = BitmapDataChannel.BLUE; 209 | xyFilter.scaleX = 35; 210 | xyFilter.scaleY = 35; 211 | xyFilter.mode = DisplacementMapFilterMode.IGNORE; 212 | bitmap_canvasDemo.filters = [xyFilter]; 213 | } 214 | 215 | function update_glassStamp(str_filter:String, str_type:String, iconClip:MovieClip, bool_isRandom:Boolean = false){ 216 | 217 | glassStamp_setupCircles(str_type); 218 | glassStamp_setupMap(str_filter, iconClip, bool_isRandom); 219 | 220 | }; -------------------------------------------------------------------------------- /as/as/drawingtool/GOLDFISH.as: -------------------------------------------------------------------------------- 1 | /* 2 | a distortion effect for the canvas that simulates water (splashing in water) 3 | there are some modes, and settings available in the UI, to adjust the water 4 | a "water effect" over a drawing is as old as javascript 5 | early javascript experiments (and i mean EARLY, like web 1.0) would try this all the time 6 | it's a code-meme, was completely pointless, but popular all the same 7 | the Flash community would make these too... this is adapted from some of the experiments that where on wonderfl 8 | */ 9 | 10 | //str_tool = "GOLDFISH"; 11 | 12 | //GOLDFISH (FLUID DYNAMICS) 13 | var num_water_bufferScale: Number = .3; //menu item: distance, displays as full number but is decimal 14 | var int_water_rippleSize: int = 5; //20; //menu item: ripple size, is a whole number 15 | var str_water_drawType: String = "draw"; //menu item: splash, draw -- splash = animated, draw captures each stroke and saves on up 16 | var bool_water_rain:Boolean = false; //menu item: toggle rainmode or not 17 | //water bitmaps 18 | var bitmap_water_sample: Bitmap; 19 | var bitmapData_water_defData: BitmapData; 20 | var bitmapData_water_buffer2: BitmapData; 21 | var bitmapData_water_buffer1: BitmapData; 22 | //draw areas 23 | var rect_water_drawRect: Rectangle; 24 | var rect_water_fullRect: Rectangle; 25 | //filters 26 | var matrix_water: Matrix; 27 | var cf_water_convoFilter: ConvolutionFilter; 28 | var df_water_filter: DisplacementMapFilter; 29 | var ct_water_colorTransform: ColorTransform; 30 | ///////////////////////////// 31 | 32 | //these two events handle the water animation 33 | //depending on if the mouse is down or not 34 | //if "splash" is set then it animates freely 35 | function event_runWaterAnimation(event: Event): void { 36 | 37 | if (bool_isMouseDown) { 38 | water_manageBitmapDraw(); 39 | } 40 | 41 | } 42 | 43 | //depending on the draw type 44 | //save to canvas and reset, or do nothing and keep running 45 | function event_drawWater_MOVE(event: MouseEvent): void { 46 | 47 | if (bool_isMouseDown) { 48 | water_updateDrawRect(); 49 | } 50 | 51 | } 52 | 53 | //for MOUSE_UP in the default draw event 54 | //save it here and push to bitmapdata depending on draw type 55 | function event_water_MOUSEUP(){ 56 | if(str_water_drawType == "draw"){ 57 | // 58 | save_waterDraw(canvasBitmapData); 59 | // 60 | }else{ 61 | //if str_water_drawType == "splash" 62 | //don't save to canvas, keep animating on mouse up... 63 | } 64 | } 65 | 66 | function water_switchBuffers(): void { 67 | var _local_1: BitmapData; 68 | _local_1 = bitmapData_water_buffer1; 69 | bitmapData_water_buffer1 = bitmapData_water_buffer2; 70 | bitmapData_water_buffer2 = _local_1; 71 | } 72 | 73 | function water_manageBitmapDraw() { 74 | var _local_2: BitmapData = bitmapData_water_buffer2.clone(); 75 | bitmapData_water_buffer2.applyFilter(bitmapData_water_buffer1, rect_water_fullRect, new Point(), cf_water_convoFilter); 76 | bitmapData_water_buffer2.draw(_local_2, null, null, BlendMode.SUBTRACT, null, false); 77 | bitmapData_water_defData.draw(bitmapData_water_buffer2, matrix_water, ct_water_colorTransform, null, null, true); 78 | df_water_filter.mapBitmap = bitmapData_water_defData; 79 | bitmap_water_sample.filters = [df_water_filter]; 80 | _local_2.dispose(); 81 | water_switchBuffers(); 82 | } 83 | 84 | 85 | function water_updateDrawRect() { 86 | var _local_2: int = int(((int_water_rippleSize / 2) * -1)); 87 | 88 | //menu option: make it rain, or normal splashes 89 | if(!bool_water_rain){ 90 | //default 91 | rect_water_drawRect.x = ((_local_2 + bitmap_water_sample.mouseX) * num_water_bufferScale); 92 | rect_water_drawRect.y = ((_local_2 + bitmap_water_sample.mouseY) * num_water_bufferScale); 93 | }else{ 94 | //rain 95 | rect_water_drawRect.x = Math.random()*((_local_2 + bitmap_water_sample.mouseX) * num_water_bufferScale); 96 | rect_water_drawRect.y = Math.random()*((_local_2 + bitmap_water_sample.mouseY) * num_water_bufferScale); 97 | } 98 | 99 | // 100 | rect_water_drawRect.width = (rect_water_drawRect.height = (int_water_rippleSize * num_water_bufferScale)); 101 | bitmapData_water_buffer1.fillRect(rect_water_drawRect, 0xFF); 102 | } 103 | 104 | //call this to start the water (setup)... 105 | function init_water(canvasBD:BitmapData){ 106 | 107 | bitmap_water_sample = new Bitmap(canvasBD); 108 | mc_draw.addChild(bitmap_water_sample); 109 | 110 | bitmapData_water_buffer1 = new BitmapData((bitmap_water_sample.width * num_water_bufferScale), (bitmap_water_sample.height * num_water_bufferScale), false, 0); 111 | bitmapData_water_buffer2 = new BitmapData(bitmapData_water_buffer1.width, bitmapData_water_buffer1.height, false, 0); 112 | bitmapData_water_defData = new BitmapData(bitmap_water_sample.width, bitmap_water_sample.height, false, 0x7F7F7F); 113 | rect_water_fullRect = new Rectangle(0, 0, bitmapData_water_buffer1.width, bitmapData_water_buffer1.height); 114 | rect_water_drawRect = new Rectangle(); 115 | df_water_filter = new DisplacementMapFilter(bitmapData_water_buffer1, new Point(), BitmapDataChannel.BLUE, BitmapDataChannel.BLUE, 50, 50, DisplacementMapFilterMode.WRAP); 116 | bitmap_water_sample.filters = [df_water_filter]; 117 | 118 | cf_water_convoFilter = new ConvolutionFilter(3, 3, [0.5, 1, 0.5, 1, 0, 1, 0.5, 1, 0.5], 3); 119 | ct_water_colorTransform = new ColorTransform(1, 1, 1, 1, 0, 128, 128); 120 | matrix_water = new Matrix((this.bitmapData_water_defData.width / bitmapData_water_buffer1.width), 0, 0, (bitmapData_water_defData.height / bitmapData_water_buffer1.height)); 121 | 122 | stage.addEventListener(Event.ENTER_FRAME, event_runWaterAnimation); 123 | stage.addEventListener(MouseEvent.MOUSE_MOVE, event_drawWater_MOVE); 124 | 125 | water_manageBitmapDraw();//update only once for first run 126 | 127 | } 128 | 129 | function clear_water(){ 130 | 131 | /*all bitmaps used: 132 | var bitmap_water_sample: Bitmap; 133 | var bitmapData_water_defData: BitmapData; 134 | var bitmapData_water_buffer2: BitmapData; 135 | var bitmapData_water_buffer1: BitmapData;*/ 136 | 137 | try{ 138 | bitmapData_water_buffer1.dispose(); 139 | bitmapData_water_buffer2.dispose(); 140 | bitmapData_water_defData.dispose(); 141 | }catch(e:Error){ 142 | //null 143 | } 144 | 145 | try{ 146 | bitmap_water_sample.filters = []; 147 | }catch(e:Error){ 148 | //null 149 | } 150 | 151 | try{ 152 | mc_draw.removeChild(bitmap_water_sample); 153 | }catch(e:Error){ 154 | //null 155 | } 156 | 157 | try{ 158 | 159 | bitmap_water_sample = null; 160 | 161 | rect_water_fullRect = null; 162 | rect_water_drawRect = null; 163 | df_water_filter = null; 164 | df_water_filter = null; 165 | cf_water_convoFilter = null; 166 | ct_water_colorTransform = null; 167 | matrix_water = null; 168 | 169 | }catch(e:Error){ 170 | //null 171 | } 172 | 173 | stage.removeEventListener(Event.ENTER_FRAME, event_runWaterAnimation); 174 | stage.removeEventListener(MouseEvent.MOUSE_MOVE, event_drawWater_MOVE); 175 | } 176 | 177 | //reset water for when you update draw values 178 | //or restart the tool 179 | function reset_water(){ 180 | clear_water(); 181 | init_water(canvasBitmap.bitmapData); 182 | } 183 | 184 | //special undo for water 185 | //for "splash" must check difference and set only for major changes to the bitmap... 186 | function water_updateUndo(){ 187 | //only push default undo if "draw" mode is selected 188 | //else check for major changes and push only if bitmap is different 189 | if(str_water_drawType == "draw"){ 190 | // 191 | update_after_draw();//push water state undo ON_DOWN 192 | // 193 | }else if(Math.ceil(getBitmapDifference(arr_undo[arr_undo.length-1], canvasBitmap.bitmapData))){ 194 | //splash mode (update undo based on similarity) 195 | //true, update undo 196 | update_after_draw(); 197 | } 198 | } 199 | 200 | 201 | //save the current splash and push it to canvas 202 | //reset all and start it up again (used when drawType is "draw") 203 | function save_waterDraw(canvasBD:BitmapData){ 204 | // 205 | //do not update undo here, it will flood with unchanged bitmaps 206 | //save and start again... 207 | save_transform_to_canvas(canvasBD, true); 208 | clear_water(); 209 | init_water(canvasBD); 210 | } 211 | // 212 | 213 | /* 214 | usage: 215 | (SEE _DRAWING.as) 216 | 217 | MOUSE_UP: 218 | event_water_MOUSEUP(); 219 | 220 | MOUSE_DOWN: TODO: FIX THIS (THIS IS A QUICK HACK/FIX) 221 | //update undo and draw rectangle 222 | try{ 223 | water_updateUndo(); 224 | water_updateDrawRect(); 225 | }catch(e:Error){ 226 | //TODO: FIX THIS 227 | //if you import a zine, then open the drawing tool (0 undos) 228 | //and undo, then SPLASH mode, it will generate bug... 229 | //see if this happens to other tools with 0 undo stack 230 | trace("Error: undo is null, reset first..."); 231 | update_after_draw(); 232 | save_waterDraw(canvasBitmapData); 233 | } 234 | */ -------------------------------------------------------------------------------- /as/as/drawingtool/LOWINK.as: -------------------------------------------------------------------------------- 1 | /* 2 | LOW INK is a line tool that reduces the line size as you draw (like runing out of ink) 3 | there are a few settings to adjust the mode 4 | default = running out of ink and then stops 5 | random = random line sizes as you draw 6 | pulse = like a hearbeat 7 | wave = like default but then increases when you run out, then reduces as you reach maximum... 8 | the tool lets you adjust the fade-rate, which is how fast the line animates 9 | and minimum size + maximum (starting) size 10 | */ 11 | 12 | //str_tool = "LOW INK" 13 | //LOW INK VALUES// 14 | var str_lowInk_type: String = "default"; //"default"; "random" "pulse" "wave" 15 | var num_lowInk_fadeRate: Number = 5; 16 | var bool_lowInk_waveToggle: Boolean = false; //toggle for the wave (direction) 17 | 18 | function lowInk_setValues(){ 19 | if (num_pen_size_defaultMax <= 0) { 20 | num_pen_size_defaultMax = 2; 21 | } 22 | if (num_pen_size_MIN <= 0) { 23 | num_pen_size_MIN = 0; 24 | } 25 | if (num_pen_size_MIN >= num_pen_size_defaultMax) { 26 | num_pen_size_MIN = num_pen_size_defaultMax - 5; 27 | } 28 | if (num_pen_size_defaultMax <= num_pen_size_MIN) { 29 | num_pen_size_defaultMax = num_pen_size_MIN + 5; 30 | } 31 | num_pen_size_MAX = num_pen_size_defaultMax; 32 | 33 | //convert to decimal 34 | //this pulls directly from the UI and converts it... 35 | //if not then conversion piles up. this should idealy be done another way... 36 | var num_convert = Number(mc_setting_lowink.txt_fadeRate.text); 37 | num_lowInk_fadeRate = convert_to_decimal(num_convert); 38 | 39 | //reset everything 40 | lowInk_resetValues(); 41 | // 42 | /*trace("num_pen_size_MIN: " + num_pen_size_MIN); 43 | trace("num_pen_size_MAX: " + num_pen_size_MAX); 44 | trace("num_lowInk_fadeRate: " + num_lowInk_fadeRate);*/ 45 | } 46 | 47 | function lowInk_resetValues(){ 48 | num_pen_size_MAX = num_pen_size_defaultMax; 49 | bool_lowInk_waveToggle = false; //set this to default too else it breaks 50 | } 51 | 52 | //TODO: THIS IS NOT NECESSARY, REMOVE IT AFTER UPDATE 53 | function lowInk_resetUp(){ 54 | num_pen_size_MAX = num_pen_size_defaultMax; 55 | } 56 | 57 | /* 58 | usage: in mouse MOVE 59 | lowInk_drawInk(event.localX, event.localY); 60 | canvasBitmapData.draw(penSprite); 61 | penSprite.graphics.clear(); 62 | */ 63 | function lowInk_drawInk(event_localX:Number, event_localY:Number){ 64 | //normal mode 65 | if (num_pen_size_MAX > num_pen_size_MIN && str_lowInk_type == "default") { 66 | num_pen_size_MAX -= num_lowInk_fadeRate; 67 | } 68 | //pulse (like a heartbeat) 69 | if (num_pen_size_MAX > num_pen_size_MIN && str_lowInk_type == "pulse") { 70 | // 71 | num_pen_size_MAX -= num_lowInk_fadeRate; 72 | //set back 73 | if (num_pen_size_MAX <= num_pen_size_MIN) { 74 | num_pen_size_MAX = num_pen_size_defaultMax; 75 | } 76 | } 77 | //wave (up and down) 78 | if (str_lowInk_type == "wave") { 79 | //increment and decrement (toggle direction if lower or greater) 80 | if (num_pen_size_MAX >= num_pen_size_MIN && !bool_lowInk_waveToggle) { 81 | // 82 | num_pen_size_MAX -= num_lowInk_fadeRate; 83 | // 84 | if (num_pen_size_MAX <= num_pen_size_MIN) { 85 | bool_lowInk_waveToggle = !bool_lowInk_waveToggle; 86 | } 87 | // 88 | } 89 | if (num_pen_size_MAX < num_pen_size_defaultMax && bool_lowInk_waveToggle) { 90 | // 91 | num_pen_size_MAX += num_lowInk_fadeRate; 92 | // 93 | if (num_pen_size_MAX >= num_pen_size_defaultMax) { 94 | bool_lowInk_waveToggle = !bool_lowInk_waveToggle; 95 | } 96 | // 97 | } 98 | } 99 | //random ink 100 | if (str_lowInk_type == "random") { 101 | num_pen_size_MAX = Math_randomRange_dec(num_pen_size_MIN, num_pen_size_defaultMax); 102 | } 103 | //NORMAL MODE (if it reaches 0 then set alpha to 0) 104 | //alpha is set to linestyle so it trails off 105 | penSprite.graphics.lineStyle(num_pen_size_MAX, pen_color, num_pen_size_MAX); 106 | //move and place line 107 | penSprite.graphics.moveTo(num_prevMouseX, num_prevMouseY); 108 | penSprite.graphics.lineTo(event_localX, event_localY); 109 | //draw to canvas and then clear 110 | canvasBitmapData.draw(penSprite); //, penSprite.transform.matrix); 111 | penSprite.graphics.clear(); 112 | } -------------------------------------------------------------------------------- /as/as/drawingtool/PATTERNSPRAY.as: -------------------------------------------------------------------------------- 1 | /* 2 | Pattern Spray lets you draw in a miny canvas (canvasBitmapData_drawSpray) and then "sprays" that onto the main canvas 3 | you can control some settings (like remove random rotation and size) 4 | this is a very simple tool, drawing is separate from the pen tool (Pattern Spray specific) 5 | */ 6 | 7 | //str_tool = "PATTERNSPRAY" 8 | //PATTERN SPRAY 9 | var penSprite_drawSpray: Sprite = new Sprite(); 10 | //bitmapdata for mini-canvas for draw spray 11 | var canvasBitmap_drawSpray: Bitmap; 12 | var canvasBitmapData_drawSpray: BitmapData = new BitmapData(mc_draw_spray.width, mc_draw_spray.height, true, 0); 13 | canvasBitmap_drawSpray = new Bitmap(canvasBitmapData_drawSpray, "auto", true); 14 | //UPDATE WITH SIZE AND COLOR LATER 15 | penSprite_drawSpray.graphics.lineStyle(2, pen_color, pen_alpha); 16 | //add to draw spray mini-canvas 17 | mc_patternspray_outline.addChild(canvasBitmap_drawSpray); 18 | mc_draw_spray.addChild(penSprite_drawSpray); 19 | //if spray pattern should have random rotation or size 20 | var bool_sprayPattern_rotation: Boolean = true; 21 | var bool_sprayPattern_size: Boolean = true; 22 | 23 | //DRAWING on the mini-canvas 24 | function mouseDown_sprayPattern(e: MouseEvent) { 25 | // 26 | penSprite_drawSpray.graphics.moveTo(e.localX, e.localY); 27 | // 28 | mc_draw_spray.addEventListener(MouseEvent.MOUSE_MOVE, mouseMove_sprayPattern); 29 | mc_draw_spray.addEventListener(MouseEvent.MOUSE_UP, mouseUp_sprayPattern); 30 | }; 31 | 32 | function mouseMove_sprayPattern(e: MouseEvent) { 33 | // 34 | penSprite_drawSpray.graphics.lineTo(e.localX, e.localY); 35 | // 36 | }; 37 | function mouseUp_sprayPattern(e: MouseEvent) { 38 | // 39 | canvasBitmapData_drawSpray.draw(penSprite_drawSpray, null, null, null, null, true); 40 | // 41 | mc_draw_spray.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMove_sprayPattern); 42 | mc_draw_spray.removeEventListener(MouseEvent.MOUSE_UP, mouseUp_sprayPattern); 43 | //reset 44 | reset_pen_sprayPattern(); 45 | }; 46 | 47 | //actually placing the pattern on the default canvas 48 | //usage: on mouse MOVE call, draw_sprayPattern(event.localX, event.localY); 49 | function draw_sprayPattern(x: Number, y: Number) { 50 | // 51 | var _scale = Math_randomRange_dec(0.01, 1); 52 | var _rotate = Math_randomRange_dec(1, 360); 53 | // 54 | var bmd: BitmapData = new BitmapData(mc_draw_spray.width, mc_draw_spray.height, true, 0); 55 | //edit can be the contents of the clip too, but swapped to bitmap for performance (remove lines on up) 56 | bmd.draw(canvasBitmapData_drawSpray, null, null, null, null, true); //mc_draw_spray); 57 | var mat: Matrix = new Matrix(); 58 | //rotation and size 59 | if (bool_sprayPattern_size) { 60 | mat.scale(_scale, _scale); 61 | }; 62 | if (bool_sprayPattern_rotation) { 63 | mat.rotate(_rotate); 64 | }; 65 | //place center mouse position (width/height/2) 66 | //this is placed differently if rotation is enabled 67 | if(!bool_sprayPattern_rotation){ 68 | mat.translate((x - mc_draw_spray.width/2), (y - mc_draw_spray.height/2)); 69 | }else{ 70 | mat.translate((x - mc_draw_spray.width/4), (y - mc_draw_spray.height/4)); 71 | } 72 | 73 | canvasBitmapData.draw(bmd, mat, null, null, null, true);//canvas bitmap can never be transparent because of fill issue 74 | 75 | bmd.dispose(); 76 | }; 77 | 78 | //clear the mini-canvas (reseting) 79 | function clear_sprayPatternCanvas() { 80 | //reset_pen_sprayPattern(); 81 | //clear pen and re-set it 82 | penSprite_drawSpray.graphics.clear(); 83 | // 84 | //clear and re-set them 85 | canvasBitmapData_drawSpray.dispose(); 86 | canvasBitmapData_drawSpray = new BitmapData(mc_draw_spray.width, mc_draw_spray.height, true, 0); 87 | canvasBitmap_drawSpray = new Bitmap(canvasBitmapData_drawSpray, "auto", true); 88 | // 89 | penSprite_drawSpray.graphics.lineStyle(num_pen_size, pen_color, pen_alpha); 90 | // 91 | try { 92 | mc_draw_spray.removeChild(canvasBitmap_drawSpray); 93 | mc_draw_spray.removeChild(penSprite_drawSpray); 94 | } catch (e: Error) { 95 | trace("event_undo: error in remove"); 96 | } 97 | 98 | try { 99 | mc_draw_spray.addChild(canvasBitmap_drawSpray); 100 | mc_draw_spray.addChild(penSprite_drawSpray); 101 | } catch (e: Error) { 102 | trace("event_undo: error in add"); 103 | } 104 | }; 105 | 106 | //clear pen for spray pattern's mini-canvas 107 | function reset_pen_sprayPattern() { 108 | penSprite_drawSpray.graphics.clear(); 109 | mc_draw_spray.removeChild(penSprite_drawSpray); 110 | penSprite_drawSpray.graphics.lineStyle(num_pen_size, pen_color, pen_alpha); 111 | mc_draw_spray.addChild(penSprite_drawSpray); 112 | }; -------------------------------------------------------------------------------- /as/as/drawingtool/PERLINBRUSH.as: -------------------------------------------------------------------------------- 1 | /* 2 | the perlin brush tool 3 | gradient mask of a perlin texture 4 | makes a radial brush, then draw the texture 5 | the brush is generated with draw_texture(event.localX, event.localY); 6 | texture is set up using bitmapdata_texture (the perlin texture) and bitmapdata_tool (the tool/mask) with makeRadialBrush 7 | */ 8 | 9 | //str_tool = "PERLIN BRUSH" 10 | 11 | //PERLIN BRUSH values 12 | //numbers 13 | var num_perlinBrush_baseX:Number = 80; 14 | var num_perlinBrush_baseY:Number = 80; 15 | var num_perlinBrush_seed:Number = 50; 16 | var num_perlinBrush_octaves:Number = 10; 17 | var num_perlinBrush_channelOptions:Number = 7; 18 | //bools 19 | var bool_perlinBrush_fractalNoise:Boolean = false; 20 | var bool_perlinBrush_stitch:Boolean = false; 21 | var bool_perlinBrush_grayScale:Boolean = false; 22 | 23 | //UI BOOLS 24 | //draw a randomly generated one, everytime mouse_up 25 | var bool_perlinBrush_drawRandom:Boolean = false; 26 | //drawing noise or perlin 27 | var bool_perlinBrush_drawNoise:Boolean = false; 28 | 29 | 30 | function perlin_randomValues(){ 31 | //random values 32 | num_perlinBrush_channelOptions = Math_randomRange(1, 7); 33 | num_perlinBrush_baseX = Math.floor(Math.random() * 100); 34 | num_perlinBrush_baseY = Math.floor(Math.random() * 100); 35 | num_perlinBrush_octaves = Math.floor(Math.random() * 10); 36 | num_perlinBrush_seed = Math.floor(Math.random() * 100); 37 | 38 | //random stitch 39 | if(Math.random()*100 > 50){ 40 | bool_perlinBrush_stitch = true; 41 | }else{ 42 | bool_perlinBrush_stitch = false; 43 | } 44 | //random fractal noise 45 | if(Math.random()*100 > 50){ 46 | bool_perlinBrush_fractalNoise = true; 47 | }else{ 48 | bool_perlinBrush_fractalNoise = false; 49 | } 50 | //grayscale 51 | if(Math.random()*100 > 50){ 52 | bool_perlinBrush_grayScale = true; 53 | }else{ 54 | bool_perlinBrush_grayScale = false; 55 | } 56 | //update UI (incase of draw random) 57 | perlin_updateUI(); 58 | } 59 | 60 | function perlin_generateBitmapData(){ 61 | //either "perlin" or "noise" 62 | //perlin 63 | //bool_perlinBrush_drawNoise = should it be noise or not 64 | //draw random 65 | if(bool_perlinBrush_drawRandom && !bool_perlinBrush_drawNoise){ 66 | perlin_randomValues(); 67 | }; 68 | //default = 7 69 | var channels: uint = num_perlinBrush_channelOptions; 70 | //values (set them) 71 | var baseX:Number = num_perlinBrush_baseX; 72 | var baseY:Number = num_perlinBrush_baseY; 73 | var numOctaves:Number = num_perlinBrush_octaves; 74 | var seed: Number = num_perlinBrush_seed; 75 | var bool_stitch:Boolean = bool_perlinBrush_stitch; 76 | var bool_fractalNoise:Boolean = bool_perlinBrush_fractalNoise; 77 | var bool_grayscale:Boolean = bool_perlinBrush_grayScale; 78 | // 79 | if(!bool_perlinBrush_drawNoise){ 80 | bitmapdata_texture = new BitmapData(mc_draw.width, mc_draw.height, false, 0x00FF0000); 81 | bitmapdata_texture.perlinNoise(baseX, baseY, numOctaves, seed, bool_stitch, bool_fractalNoise, channels, bool_grayscale, null); 82 | }else{ 83 | bitmapdata_texture = new BitmapData(mc_draw.width, mc_draw.height, false, 0xff000000); 84 | bitmapdata_texture.noise(500, 0, 255, channels, false); 85 | } 86 | } 87 | 88 | function reset_perlinBrush(){ 89 | delete_perlinBrush(); 90 | delete_perlin(); 91 | //reset 92 | setup_perlin(); 93 | } 94 | 95 | function delete_perlinBrush():void{ 96 | // 97 | try{ 98 | bitmapdata_tool.dispose(); 99 | }catch(e:Error){ 100 | trace("delete_perlinBrush: bitmapdata_tool.dispose(); error"); 101 | } 102 | } 103 | 104 | function delete_perlin():void{ 105 | // 106 | delete_perlinBrush(); 107 | //delete bitmaps too 108 | try{ 109 | bitmapdata_texture.dispose(); 110 | }catch(e:Error){ 111 | trace("delete_perlin: bitmapdata_texture.dispose(); error"); 112 | } 113 | } 114 | 115 | function setup_perlin(){ 116 | perlin_generateBitmapData(); 117 | makeRadialBrush(); 118 | } -------------------------------------------------------------------------------- /as/as/drawingtool/PERLINCHALK.as: -------------------------------------------------------------------------------- 1 | //PERLIN CHALK 2 | //randomly placed pixels that are blurred and simulate a gentle "chalk" texture 3 | //chalk can fade as you draw, or stays (like softbrush) 4 | //you draw on a bitmap (bitmapdata_tool) that's over the canvas, then that bitmap is saved to canvas on UP 5 | //WAS a perlin texture, but pixels worked better... 6 | //size UI is shared with SOFTBRUSH 7 | // 8 | //str_tool = "PERLIN CHALK" 9 | // 10 | //vars and numbers 11 | //shared: num_airbrushSize = size 12 | //shared: bool_airbrushFade = should the chalk do a trailing fade 13 | //filters 14 | var perlinChalk_BF: BlurFilter = new BlurFilter(1.05, 1.05, 3); 15 | perlinChalk_BF.quality = BitmapFilterQuality.HIGH; 16 | 17 | //basic setup of bitmaps 18 | //apply filters... 19 | function perlinChalk_setupBitmap(){ 20 | trace("perlinChalk_setupBitmap"); 21 | //delete first (in case) 22 | perlinChalk_DELETEALL(); 23 | // 24 | //setup 25 | bitmapdata_tool = new BitmapData(mc_draw.width, mc_draw.height, true, 0xffffff); 26 | bitmap_tool = new Bitmap(bitmapdata_tool, "auto", false); 27 | mc_draw.addChild(bitmap_tool); 28 | bitmap_tool.filters = [new BlurFilter(1.4, 1.4, 3)]; 29 | // 30 | } 31 | 32 | //completely delete everything 33 | function perlinChalk_DELETEALL(){ 34 | // 35 | try{ 36 | bitmap_tool.filters = []; 37 | }catch(e:Error){ 38 | trace("perlinChalk_DELETEALL bitmap_tool.filters = [] error"); 39 | } 40 | // 41 | try{ 42 | bitmapdata_tool.dispose(); 43 | }catch(e:Error){ 44 | trace("perlinChalk_DELETEALL bitmapdata_tool.dispose() error"); 45 | } 46 | // 47 | try{ 48 | mc_draw.removeChild(bitmap_tool); 49 | }catch(e:Error){ 50 | trace("perlinChalk_DELETEALL mc_draw.removeChild error"); 51 | } 52 | } 53 | 54 | //usage: on mouse MOVE perlinChalk_draw(event.localX, event.localY); 55 | function perlinChalk_draw(event_localX:Number, event_localY:Number){ 56 | // 57 | //color conversion for colors with alpha 58 | var num_sizeAdd:Number = 2; 59 | var col = hex_to_ARGB(selected_color , 100); 60 | // 61 | if(num_airbrushSize < 10){ 62 | num_sizeAdd = 1; 63 | } 64 | if(num_airbrushSize > 50){ 65 | num_sizeAdd = Math.ceil(num_airbrushSize/8); 66 | } 67 | // 68 | for (var i: int = 0; i < 100*num_sizeAdd; i++) { 69 | bitmapdata_tool.setPixel32(event_localX + Math.random() * num_airbrushSize - (num_airbrushSize/2), 70 | event_localY + Math.random() * num_airbrushSize - (num_airbrushSize/2), 71 | col); 72 | } 73 | // 74 | if(bool_airbrushFade){ 75 | bitmapdata_tool.applyFilter(bitmapdata_tool, bitmapdata_tool.rect, new Point(0, 0), perlinChalk_BF); 76 | }; 77 | } -------------------------------------------------------------------------------- /as/as/drawingtool/RAINBOWPAINT.as: -------------------------------------------------------------------------------- 1 | /* 2 | Rainbow Paint is a tool that lets you draw gradient lines 3 | it's an extended version of the default drawing (pen) tool 4 | you can customize the gradient, and choose colors 5 | you can choose between linear or radial gradients 6 | this is a very simple tool 7 | */ 8 | 9 | //str_tool = "RAINBOW PAINT"; 10 | 11 | //RAINBOW PAINT (GRADIENT BRUSH) 12 | //create arrays 13 | //populate acording to length of color (alpha and ratio for each) 14 | //increment ratios accurately (evenly spread chosen colors) 15 | var arr_rainbowColor: Array = new Array(0xFF0000, 0x0000FF, 0x00FF00, 0xFFFF00, 0x0000FF, 0xFFFF00);// !!!MENU ITEM 16 | //this array draws from the above color array and sets that as a color transform value for the tabs in the UI 17 | var arr_rainbowColorTransform:Array = new Array(new ColorTransform(), new ColorTransform(), new ColorTransform(), new ColorTransform(), new ColorTransform(), new ColorTransform()); 18 | //populate based on color array 19 | var arr_rainbowAlphas: Array = new Array(); 20 | var arr_rainbowRatios: Array = new Array(); 21 | //!!!MENU ITEM 22 | var rainbowGradientType = GradientType.RADIAL; //GradientType.LINEAR or GradientType.RADIAL 23 | var rainbowSpreadMethod = SpreadMethod.REPEAT; //SpreadMethod.PAD SpreadMethod.REFLECT SpreadMethod.REPEAT 24 | var rainbowInterpolationMethod = InterpolationMethod.LINEAR_RGB; //InterpolationMethod.LINEAR_RGB InterpolationMethod.RGB 25 | var num_rainbowGradientWidth:Number = mc_draw.width; 26 | var num_rainbowGradientHeight:Number = mc_draw.height; 27 | var num_rainbowGradientX:Number = 0;//make min 0, and max the max width of stage 28 | var num_rainbowGradientY:Number = 0;//make min 0, and max the max height of stage 29 | /*focalPointRatio:Number (default = 0) — A number that controls the location of the focal point of the gradient. (stretch) 30 | The value 0 means the focal point is in the center. 31 | The value 1 means the focal point is at one border of the gradient circle. 32 | The value -1 means that the focal point is at the other border of the gradient circle. 33 | Values less than -1 or greater than 1 are rounded to -1 or 1. 34 | The following image shows a gradient with a focalPointRatio of -0.75: */ 35 | var num_rainbowGradientOffset:Number = 0;//extra value that tweaks the focal point 36 | //var num_rainbowFocalPointRatio:Number = 0; //from -100 - 100, convert to decimal, 0 = center 37 | ////////////RAINBOW LINES UI STRINGS//////////// 38 | //currently selected color tab (check against) 39 | var str_currRainbowColor:String = "1"; 40 | ///////////////////////////// 41 | 42 | //init the colors (setup) 43 | //call this before starting 44 | function rainbowPaint_initColors(){ 45 | //populate based on color array 46 | var l: int = arr_rainbowColor.length; 47 | //reset first 48 | arr_rainbowAlphas = []; 49 | arr_rainbowRatios = []; 50 | // 51 | for (var i: int = 0; i < l; i++) { 52 | arr_rainbowAlphas.push(pen_alpha);//1 is default 53 | arr_rainbowRatios.push((0xFF / l) * i + 1); 54 | } 55 | } 56 | 57 | //ON MOUSE DOWN/MOVE 58 | //draw_rainbowPaint(event.localX, event.localY); 59 | function draw_rainbowPaint(_mouseX:Number, _mouseY:Number){ 60 | // 61 | penSprite.graphics.lineStyle(num_pen_size); 62 | // 63 | var gradientBoxMatrix: Matrix = new Matrix(); 64 | gradientBoxMatrix.createGradientBox(num_rainbowGradientWidth, num_rainbowGradientHeight, num_rainbowGradientOffset, num_rainbowGradientX, num_rainbowGradientY); 65 | // 66 | penSprite.graphics.lineGradientStyle( 67 | rainbowGradientType, 68 | arr_rainbowColor, 69 | arr_rainbowAlphas, 70 | arr_rainbowRatios, 71 | gradientBoxMatrix, 72 | rainbowSpreadMethod, 73 | rainbowInterpolationMethod, 74 | num_rainbowGradientOffset 75 | ); 76 | //draw it, send to bitmap, clear after 77 | //TODO: (if you want the alpha mode not to have the texture, then don't clear canvas right after drawing. 78 | //clear only on mouse up.) 79 | penSprite.graphics.moveTo(num_prevMouseX, num_prevMouseY); 80 | penSprite.graphics.lineTo(_mouseX, _mouseY); 81 | canvasBitmapData.draw(penSprite); 82 | penSprite.graphics.clear(); 83 | num_prevMouseX = _mouseX; 84 | num_prevMouseY = _mouseY; 85 | } -------------------------------------------------------------------------------- /as/as/drawingtool/RUNNYINK.as: -------------------------------------------------------------------------------- 1 | //the RUNNY INK tool 2 | //ink expands as you draw, with color combinations depending on color choices 3 | //convolution is repeatedly applied to pixels 4 | //this draws on a bitmap (bitmap_tool) that's placed over the canvas, when drawing is done it's drawn to the canvas then reset 5 | //str_tool = "RUNNY INK" 6 | // 7 | 8 | //RUNNY INK// 9 | var num_runnyInkSize:Number = 20; 10 | var num_runnyInkAlpha:Number = 50; 11 | //convolution filter for RUNNY INK 12 | var runnyInk_CF_clamp: Boolean = true; 13 | var runnyInk_CF_clampColor: Number = 0x000000; 14 | var runnyInk_CF_clampAlpha: Number = 1; 15 | var runnyInk_CF_bias: Number = -1; 16 | var runnyInk_CF_preserveAlpha: Boolean = false; 17 | var runnyInk_CF_matrixCols: Number = 3; 18 | var runnyInk_CF_matrixRows: Number = 3; 19 | var runnyInk_CF_matrix: Array = [1, 1, 1, 20 | 1, 1, 1, 21 | 2, 1, 1 22 | ]; 23 | var runnyInk_convolutionFilter: ConvolutionFilter = new ConvolutionFilter(runnyInk_CF_matrixCols, runnyInk_CF_matrixRows, runnyInk_CF_matrix, runnyInk_CF_matrix.length, runnyInk_CF_bias, runnyInk_CF_preserveAlpha, runnyInk_CF_clamp, runnyInk_CF_clampColor, runnyInk_CF_clampAlpha); 24 | //var runnyInk_convolutionFilter:ConvolutionFilter = new ConvolutionFilter(3, 3, [1, 1, 1, 1, 1, 1, 1, 1, 1]); 25 | 26 | 27 | //completely delete 28 | function delete_runnyInk(){ 29 | //clear all 30 | //bitmap, remove... 31 | try{ 32 | bitmapdata_tool.dispose(); 33 | }catch(e:Error){ 34 | trace("delete_runnyInk: bitmapdata_tool.dispose error"); 35 | } 36 | // 37 | try{ 38 | mc_draw.removeChild(bitmap_tool); 39 | }catch(e:Error){ 40 | trace("delete_runnyInk: removeChild(bitmap_tool) error"); 41 | } 42 | } 43 | 44 | //setup or reset... 45 | function setup_runyInk(){ 46 | //call first, in case... 47 | delete_runnyInk(); 48 | //setup... 49 | bitmapdata_tool = new BitmapData(mc_draw.width, mc_draw.height, true, 0xffffff); 50 | bitmap_tool = new Bitmap(bitmapdata_tool, "auto", false); 51 | //add 52 | mc_draw.addChild(bitmap_tool); 53 | //update clamp color 54 | } 55 | 56 | //usage: in mouse MOVE draw_runnyInk(event.localX, event.localY); 57 | function draw_runnyInk(event_localX:Number, event_localY:Number): void { 58 | 59 | var mp: Matrix = new Matrix(); 60 | mp.tx = event_localX; 61 | mp.ty = event_localY; 62 | 63 | var col = hex_to_ARGB(selected_color , num_runnyInkAlpha); 64 | 65 | for (var i:uint = 0; i < 100; i++) { 66 | var x_:uint = event_localX + Math.random() * num_runnyInkSize - (num_runnyInkSize/2); 67 | var y_:uint = event_localY + Math.random() * num_runnyInkSize - (num_runnyInkSize/2); 68 | bitmapdata_tool.setPixel32(x_, y_, col); 69 | } 70 | 71 | bitmapdata_tool.applyFilter(bitmapdata_tool, bitmapdata_tool.rect, new Point(0, 0), runnyInk_convolutionFilter); 72 | //bitmapdata_tool.applyFilter(bitmapdata_tool, bitmapdata_tool.rect, new Point(0, 0), perlinChalk_BF); 73 | } -------------------------------------------------------------------------------- /as/as/drawingtool/SCREAM_INTO_THE_VOID.as: -------------------------------------------------------------------------------- 1 | /* 2 | code addapted from experiments on ActionSnippet and other community tinkering... 3 | distorts the canvas bitmap with perlin noise, or just noise. distortion is random, and also depends on how often the user screamed into the void... 4 | */ 5 | //str_tool = "SCREAM INTO THE VOID" 6 | 7 | //SCREAM INTO THE VOID// 8 | var num_voidScreams:Number = 0;//keep track of how often you screamed 9 | var str_voidScreams:String = ""; //comment about screaming into the void 10 | 11 | //usage: 12 | //scream_into_the_void(canvasBitmapData); 13 | //num_voidScreams += 1; 14 | function scream_into_the_void(bmd: BitmapData) { 15 | // 16 | //scaleX = scaleY = 1; //0.5; 17 | var w: int = bmd.width; 18 | var hw: int = w / 2; 19 | var hhw: int = hw / 2; 20 | var size: int = bmd.width * bmd.height; 21 | var col:uint; 22 | //random perlin SOMETIMES 23 | if(Math.random()*100 > 70 && num_voidScreams > 5){ 24 | bmd.perlinNoise(hhw, hhw, 2, Math.random() * 100, false, false, 1, true); 25 | }; 26 | // 27 | for (var i: int = 0; i < size; i++) { 28 | var xp: int = i % w; 29 | var yp: int = int(i / w); 30 | // 31 | if(Math.random()*100 > 50 && num_voidScreams > 10){ 32 | col = bmd.getPixel(xp, yp) / (xp + yp - w/Math_randomRange(1, 5)) >> 5 & 0xFF; 33 | }else{ 34 | col = bmd.getPixel(xp, yp) / (xp|yp-w)>> 8 & 0xFF; 35 | }; 36 | // 37 | bmd.setPixel(xp, yp, col << 16 | col << 8 | col); 38 | } 39 | // 40 | if(Math.random()*100 > 60){ 41 | var blur:BitmapData = bmd.clone(); 42 | blur.applyFilter(blur, blur.rect, new Point(0,0), new BlurFilter(10,10,1)); 43 | bmd.draw(blur, null, null, BlendMode.DARKEN); 44 | blur.dispose(); 45 | }; 46 | } -------------------------------------------------------------------------------- /as/as/drawingtool/SMUDGE.as: -------------------------------------------------------------------------------- 1 | /* 2 | code for the smudge tool 3 | 4 | smudges colors by blending a copied gradient over the surface 5 | addapted from code found on snipplr (social snipped repository), actionsnippet, and stack overflow 6 | */ 7 | 8 | //SMUDGE 9 | //str_tool = "SMUDGE" 10 | var smudge_brush:Shape = new Shape(); 11 | var smudge_diameter:Number = num_pen_size; 12 | var smudge_radius:Number = smudge_diameter / 2; 13 | var smudge_matrix:Matrix = new Matrix(); 14 | //setup 15 | var smudge_brushAlpha:BitmapData = new BitmapData(smudge_diameter, smudge_diameter, true, 0x00000000); 16 | //calc vals 17 | var s_xp:Number = 0, s_yp:Number = 0, s_px:Number = 0, s_py:Number = 0; 18 | var s_dx:Number, s_dy:Number; 19 | 20 | function event_smudge_MOVE(evt:MouseEvent):void { 21 | s_xp = evt.localX - smudge_radius; 22 | s_yp = evt.localY - smudge_radius; 23 | s_dx = s_xp - s_px; 24 | s_dy = s_yp - s_py; 25 | canvasBitmapData.copyPixels(canvasBitmapData, 26 | new Rectangle(s_px, s_py, smudge_diameter, smudge_diameter), 27 | new Point(s_xp, s_yp), smudge_brushAlpha, new Point(0,0), true); 28 | s_px = s_xp; 29 | s_py = s_yp 30 | } 31 | 32 | //TODO: different customizable gradient types to add texture to the smudges... 33 | function smudge_drawRadial(){ 34 | smudge_matrix.createGradientBox(smudge_diameter, smudge_diameter, 0, 0, 0); 35 | with (smudge_brush.graphics){ 36 | beginGradientFill(GradientType.RADIAL, [0xFFFFFF, 0xFFFFFF], [1,0], [0, 255], smudge_matrix, SpreadMethod.PAD); //REFLECT REPEAT 37 | drawCircle(smudge_radius, smudge_radius, smudge_radius); 38 | } 39 | } 40 | 41 | //INIT 42 | function init_smudge(){ 43 | smudge_drawRadial(); 44 | smudge_brushAlpha.draw(smudge_brush); 45 | } 46 | 47 | //called when brush size is updated 48 | function reset_smudge(){ 49 | // 50 | //clear smudge_brushAlpha 51 | //start again... 52 | // 53 | s_xp = 0; 54 | s_yp = 0; 55 | s_px = 0; 56 | s_py = 0; 57 | s_dx = 0; 58 | s_dy = 0; 59 | //reset radius size based on pen size... 60 | smudge_diameter = calc_scrubber_val(mc_slider, num_minVal, num_maxVal_tool); 61 | smudge_radius = smudge_diameter / 2; 62 | //reset matrix 63 | smudge_matrix = null; 64 | smudge_matrix = new Matrix(); 65 | smudge_brush.graphics.clear(); 66 | // 67 | try{ 68 | smudge_brushAlpha.dispose(); 69 | }catch(e:Error){ 70 | trace("reset_smudge() smudge_brushAlpha.dispose() error, unable to disposed"); 71 | } 72 | //setup again... 73 | smudge_brushAlpha = new BitmapData(smudge_diameter, smudge_diameter, true, 0x00000000); 74 | // 75 | init_smudge(); 76 | } 77 | 78 | function event_smudge_down(event:MouseEvent){ 79 | // 80 | update_after_draw(); 81 | // 82 | stage.addEventListener(MouseEvent.MOUSE_MOVE, event_smudge_MOVE); 83 | }; 84 | 85 | function event_smudge_up(event:MouseEvent){ 86 | stage.removeEventListener(MouseEvent.MOUSE_MOVE, event_smudge_MOVE); 87 | }; 88 | 89 | //usage 90 | /* 91 | mc_draw.addEventListener(MouseEvent.MOUSE_DOWN, event_smudge_down); 92 | mc_draw.addEventListener(MouseEvent.MOUSE_UP, event_smudge_up); 93 | mc_draw.addEventListener(MouseEvent.RELEASE_OUTSIDE, event_smudge_up); 94 | */ -------------------------------------------------------------------------------- /as/as/drawingtool/SOFTBRUSH.as: -------------------------------------------------------------------------------- 1 | /* 2 | AIRBRUSH 3 | 4 | gradient brush that fades as you draw 5 | or just paints gradients without fade 6 | UI controls the diameter (size) and toggles fade 7 | colors are also ajdusted 8 | 9 | */ 10 | 11 | //AIRBRUSH 12 | //str_tool = "SOFT BRUSH" 13 | var sprite_airbrush: Sprite; //gradient graphic 14 | var sprite_airbrushMap: BitmapData; //gradient graphic is drawn to this map 15 | var bool_airbrushFade:Boolean = true; //toggled in UI 16 | var num_airbrushSize:Number = 50; //size of airbrush (set in UI) 17 | 18 | function delete_airbrush(): void{ 19 | try{ 20 | sprite_airbrush.graphics.clear(); 21 | }catch(e:Error){ 22 | trace("sprite_airbrush.graphics.clear error: null"); 23 | } 24 | try{ 25 | sprite_airbrushMap.dispose(); 26 | }catch(e:Error){ 27 | trace("sprite_airbrushMap.dispose() is null"); 28 | } 29 | try{ 30 | bitmapdata_tool.dispose(); 31 | }catch(e:Error){ 32 | trace("bitmapdata_tool is null"); 33 | } 34 | try{ 35 | mc_draw.removeChild(bitmap_tool); 36 | }catch(e:Error){ 37 | trace("removeChild(bitmap_tool) is null"); 38 | } 39 | } 40 | 41 | 42 | //brush setup (called only on creating and when setting size) 43 | function setup_airbrush(): void { 44 | var m: Matrix = new Matrix(); 45 | m.createGradientBox(num_airbrushSize * 2, num_airbrushSize * 2, 0, -num_airbrushSize, -num_airbrushSize); 46 | //delete first (to reset all...) 47 | delete_airbrush(); 48 | //refresh here 49 | bitmapdata_tool = new BitmapData(canvasBitmapData.width, canvasBitmapData.height, true, selected_color); 50 | bitmap_tool = new Bitmap(bitmapdata_tool, PixelSnapping.ALWAYS, true); 51 | mc_draw.addChild(bitmap_tool); 52 | //create 53 | sprite_airbrush = new Sprite(); 54 | sprite_airbrushMap = new BitmapData(num_airbrushSize * 2, num_airbrushSize * 2, true, 0x00ffffff); 55 | // 56 | sprite_airbrush.graphics.beginGradientFill(GradientType.RADIAL, [selected_color, selected_color], [1, 0], [0, 250], m); 57 | sprite_airbrush.graphics.drawCircle(0, 0, num_airbrushSize); 58 | sprite_airbrush.graphics.endFill(); 59 | } 60 | 61 | //todo... 62 | //var rc:Number = 1/3, gc:Number = 1/2, bc:Number = 1/6; 63 | //new ColorMatrixFilter([rc, gc, bc, 0, 0,rc, gc, bc, 0, 0, rc, gc, bc, 0, 0, 0, 0, 0, 1, 0])); 64 | // 65 | //call this to draw it (set to localX and localY of mouse position over the canvas) 66 | function draw_airbrush(event_localX:Number, event_localY:Number){ 67 | var mp: Matrix = new Matrix(); 68 | mp.tx = event_localX; 69 | mp.ty = event_localY; 70 | bitmapdata_tool.draw(sprite_airbrush, mp); 71 | //fade trail 72 | //UI: TOGGLE 73 | if(bool_airbrushFade){ 74 | bitmapdata_tool.applyFilter(bitmapdata_tool, new Rectangle(0, 0, stage.stageWidth, stage.stageHeight), new Point(), new BlurFilter(2, 2, BitmapFilterQuality.HIGH)); 75 | }; 76 | } 77 | 78 | /* 79 | example 80 | MOUSE_MOVE 81 | draw_airbrush(event.localX, event.localY); 82 | 83 | MOUSE_UP 84 | canvasBitmapData.draw(bitmapdata_tool); 85 | setup_airbrush(); 86 | */ -------------------------------------------------------------------------------- /as/as/drawingtool/SOUND_FILES.as: -------------------------------------------------------------------------------- 1 | var arr_snd_voidScreams:Array = new Array(new AUD_AAAH_01(), new AUD_AAAH_02(), new AUD_AAAH_03(), new AUD_AAAH_04(), new AUD_AAAH_05(), new AUD_AAAH_06(), new AUD_AAAH_07(), new AUD_AAAH_08(), new AUD_AAAH_09(), new AUD_AAAH_10(), new AUD_AAAH_11(), new AUD_AAAH_12(), new AUD_AAAH_13(), new AUD_AAAH_14(), new AUD_AAAH_15(), new AUD_AAAH_16(), new AUD_AAAH_17(), new AUD_AAAH_18(), new AUD_AAAH_19(), new AUD_AAAH_20()); 2 | var arr_snd_cat:Array = new Array(new AUD_CAT_01(), new AUD_CAT_02(), new AUD_CAT_03(), new AUD_CAT_04(), new AUD_CAT_05(), new AUD_CAT_06(), new AUD_CAT_07(), new AUD_CAT_08(), new AUD_CAT_09(), new AUD_CAT_10(), new AUD_CAT_11(), new AUD_CAT_12(), new AUD_CAT_13(), new AUD_CAT_14(), new AUD_CAT_15(), new AUD_CAT_16(), new AUD_CAT_17(), new AUD_CAT_18()); -------------------------------------------------------------------------------- /as/as/drawingtool/SPRAY.as: -------------------------------------------------------------------------------- 1 | /* 2 | very simple spray paint (identical to MS Paint "spray" tool) 3 | uses size and color values from the pen tool 4 | */ 5 | 6 | //str_tool = "SPRAY" 7 | 8 | function draw_spray(event_localX, event_localY){ 9 | var angle: Number; 10 | var xpos: Number; 11 | var ypos: Number; 12 | var radius: Number; 13 | for (var i = 0; i < num_pen_size; i++) { 14 | angle = Math.random() * Math.PI * 2; 15 | radius = Math.random() * num_pen_size; //radius of the circle 16 | xpos = event_localX + Math.cos(angle) * radius; 17 | ypos = event_localY + Math.sin(angle) * radius; 18 | canvasBitmapData.setPixel32(xpos, ypos, pen_color); 19 | } 20 | } -------------------------------------------------------------------------------- /as/as/drawingtool/TOAST.as: -------------------------------------------------------------------------------- 1 | /* 2 | toast is a burn and sharpening tool 3 | toast is similar to PERLINBRUSH in that it creates a bitmap above the canvas that you draw over, then the canvas is updated with that drawing 4 | texture over the top with overlay (or other, strongest setting) 5 | 6 | the brush is generated with draw_texture(event.localX, event.localY); 7 | texture is set up using bitmapdata_texture (the perlin texture) and bitmapdata_tool (the tool/mask) with makeRadialBrush 8 | 9 | texture is ONLY setup, drawing takes place via draw_texture(event.localX, event.localY); in mouse MOVE 10 | in mouse UP reset_toastBrush is called to reset so you can layer burn strength 11 | 12 | TODO: set a color to burn to (see TINT) 13 | */ 14 | 15 | //str_tool = "TOAST" 16 | 17 | //////////TOAST/////////////// 18 | var num_toast_burnAmnt:Number = 50; //amount that is burned, is the contrast value of the image 19 | //how to draw the toast burn (special values) 20 | var bool_toast_outline:Boolean = false; 21 | var bool_toast_negative:Boolean = false; 22 | var bool_toast_grayscale:Boolean = false; 23 | ////////////////////////////// 24 | 25 | //call this on init/open... 26 | function reset_toastBrush(){ 27 | delete_toastBrush(); 28 | delete_toast(); 29 | //reset 30 | setup_toast(); 31 | } 32 | 33 | function delete_toastBrush(){ 34 | // 35 | try{ 36 | bitmapdata_tool.dispose(); 37 | }catch(e:Error){ 38 | trace("delete_toastBrush: bitmapdata_tool.dispose(); error"); 39 | } 40 | } 41 | 42 | function delete_toast(){ 43 | // 44 | delete_toastBrush(); 45 | //delete all bitmaps 46 | try{ 47 | bitmapdata_texture.dispose(); 48 | }catch(e:Error){ 49 | trace("delete_toast: bitmapdata_texture.dispose(); error"); 50 | } 51 | } 52 | 53 | function setup_toast() { 54 | toast_generateTexture(); 55 | makeRadialBrush(); 56 | } 57 | 58 | function toast_generateTexture() { 59 | // 60 | //this is the toast 61 | var bd_toast: BitmapData = new BitmapData(mc_draw.width, mc_draw.height, false, 0);//new test(); 62 | // 63 | bitmapdata_texture = new BitmapData(mc_draw.width, mc_draw.height, false, 0xff000000); 64 | bitmapdata_texture.draw(canvasBitmapData); 65 | //TEST: sketch(bitmapdata_texture); (TODO: THIS IS ALSO A COOL EFFECT, ADD THIS...) 66 | //this is in COLORS.as 67 | sharpenBitmap(bitmapdata_texture, num_toast_burnAmnt, bool_toast_outline, bool_toast_negative, bool_toast_grayscale); 68 | 69 | bitmapdata_texture.draw(bd_toast, new Matrix(1, 0, 0, 1), new ColorTransform(1, 1, 1, .45), BlendMode.OVERLAY); 70 | 71 | //remove temp after setup and adding to texture... 72 | bd_toast.dispose(); 73 | } -------------------------------------------------------------------------------- /as/as/drawingtool/_BITMAP.as: -------------------------------------------------------------------------------- 1 | /* 2 | shared bitmap information 3 | the actual canvas bitmap 4 | various shared bitmaps for tools (edit in a separate bitmap, then set to main canvas) 5 | saving and setting bitmap functions (shared) 6 | textures for drawing (draw gradients over a mask for tools like toast or perlin brush) 7 | */ 8 | 9 | //save drawing to this 10 | var canvasBitmap: Bitmap; 11 | var canvasBitmapData: BitmapData = new BitmapData(mc_draw.width, mc_draw.height, false); 12 | //clone of the canvas (used for various tools, save a copy, use tool, then save or revert to oritinal canvas) 13 | var bitmapData_canvasDemo:BitmapData;// = new BitmapData(mc_draw.width, mc_draw.height, false, 0); 14 | var bitmap_canvasDemo:Bitmap;// = new Bitmap(bitmapdata_copy, "auto", true); 15 | //temp for when the demo bitmaps are in use 16 | //used in the Color Factory during RGB shift or in other instances when both bitmaps are unusable 17 | var tempBitmapData:BitmapData; 18 | //any saved bitmap gets cloned to here, this is constantly emptied (while using a tool -- see color factory) 19 | var arr_savedBitmaps:Array = new Array(); 20 | 21 | //bitmaps and bitmap data (shared) for tools... airbrush, etc... 22 | var bitmapdata_tool:BitmapData;// = new BitmapData(canvasBitmapData.width, canvasBitmapData.height, true, selected_color); 23 | var bitmap_tool: Bitmap;// = new Bitmap(bitmapdata_tool, PixelSnapping.ALWAYS, true); 24 | var bitmapdata_texture:BitmapData;//textures like perlin noise and noise 25 | 26 | //create the bitmap for saving the drawing 27 | //try catch for main window, if no main window then make new one 28 | try { 29 | //populate from main window 30 | canvasBitmap = new Bitmap(stage_parent[curr_bitmap_data], "auto", false); 31 | canvasBitmapData = stage_parent[curr_bitmap_data]; 32 | // 33 | } catch (e: Error) { 34 | //parent is null, make new 35 | canvasBitmap = new Bitmap(canvasBitmapData, "auto", false); 36 | // 37 | }; 38 | 39 | 40 | /////CANVAS UPDATES (STATES)///// 41 | 42 | function parent_save_zineToDesktop(){ 43 | try{ 44 | stage_parent.save_zineToDesktop(false); 45 | }catch(e:Error){ 46 | trace("null parent, cannot save"); 47 | } 48 | } 49 | 50 | function save_art_to_parent() { 51 | //trace("save to parent, send it bitmap data as you draw, and then on close"); 52 | //stage_parent.canvasBitmap.bitmapData = canvasBitmapData; 53 | stage_parent[curr_bitmap].bitmapData = canvasBitmapData; 54 | stage_parent[curr_bitmap_data] = canvasBitmapData; 55 | // 56 | stage_parent.update_page_previews(stage_parent[curr_bitmap], stage_parent[curr_bitmap_data]); 57 | //save UI settings to parent 58 | /*stage_parent.arr_currFontList = arr_currFontList; 59 | stage_parent.num_currFontList = num_currFontList; 60 | stage_parent.currFont = currFont;*/ 61 | }; 62 | 63 | function update_after_draw() { 64 | //updates the canvases, icons, and undo state 65 | // 66 | canvasBitmap.bitmapData = canvasBitmapData; 67 | //update 68 | arr_undo.push(canvasBitmapData.clone()); 69 | arr_redo = []; 70 | //iconBmp.bitmapData = canvasBitmapData; 71 | // 72 | //SEND TO PARENT 73 | try { 74 | save_art_to_parent(); 75 | } catch (e: Error) { 76 | trace("save_art_to_parent() error: no parent"); 77 | } 78 | }; 79 | 80 | /////CANVAS MANAGMENT/// 81 | //updating, creating, and drawing to (transform drawing) 82 | 83 | function paste_bitmap(){ 84 | update_after_draw(); 85 | writeBitmapFromClipboard(canvasBitmap.bitmapData, mc_draw.width, mc_draw.height); 86 | } 87 | 88 | //create a canvas demo bitmap (for demoing effects before applying to canvas) 89 | function create_canvasDemo(){ 90 | bitmap_canvasDemo = new Bitmap(canvasBitmapData, "auto", true); 91 | bitmapData_canvasDemo = new BitmapData(mc_draw.width, mc_draw.height, false, 0x000000); 92 | bitmapData_canvasDemo.draw(bitmap_canvasDemo); 93 | bitmap_canvasDemo.bitmapData = bitmapData_canvasDemo; 94 | mc_draw.addChild(bitmap_canvasDemo); 95 | } 96 | //destroy the demo canvas 97 | function clear_canvasDemo(){ 98 | mc_draw.removeChild(bitmap_canvasDemo); 99 | bitmapData_canvasDemo.dispose(); 100 | } 101 | 102 | //update canvas bitmap with any transforms or filters (used for smoosher and others BEFORE removing filter) 103 | function save_transform_to_canvas(bitmapToDrawTo:BitmapData, bool_includeTransform:Boolean = false){ 104 | // 105 | //update_after_draw(); 106 | /*bmd.draw(source:IBitmapDrawable, matrix:Matrix = null, colorTransform:flash.geom:ColorTransform = null, blendMode:String = null, clipRect:Rectangle = null, smoothing:Boolean = false):void 107 | Draws the source display object onto the bitmap image, using the Flash runtime vector renderer.*/ 108 | // 109 | try{ 110 | var bmd: BitmapData = new BitmapData(mc_draw.width, mc_draw.height, false, 0); 111 | //set what type 112 | //if color transformation was applied save that 113 | if(!bool_includeTransform){ 114 | bmd.draw(mc_draw, null, null, null, null, false); 115 | }else{ 116 | //bmd.draw(mc_draw, mc_draw.transform.matrix, mc_draw.transform.colorTransform, null, null, false); 117 | bmd.draw(mc_draw, null, mc_draw.transform.colorTransform, null, null, false); 118 | }; 119 | //draw to source, then remove when done... 120 | bitmapToDrawTo.draw(bmd, null, null, null, null, false); 121 | bmd.dispose(); 122 | // 123 | }catch(e:Error){ 124 | trace("save_transform_to_canvas() error: " + e); 125 | } 126 | } 127 | 128 | function update_canvas_with(bitmapToDrawFrom:BitmapData){ 129 | canvasBitmapData.draw(bitmapToDrawFrom, null, null, null, null, false); 130 | canvasBitmap.bitmapData = canvasBitmapData; 131 | } 132 | 133 | //call to update a target bitmap (used for reseting from arrays) 134 | function update_bitmaps_from(bitmapToDrawFrom:BitmapData, targetBitmapData:BitmapData, targetBitmap:Bitmap){ 135 | targetBitmapData.draw(bitmapToDrawFrom, null, null, null, null, false); 136 | targetBitmap.bitmapData = targetBitmapData; 137 | } 138 | 139 | /////BITMAP CHECKING//// 140 | 141 | //compare the percentage difference between two bitmaps 142 | //detect if a bitmap has changed 143 | //this is used for undos where state is constantly updated (mouse_move) 144 | //and changes must be significant enough to push to undo 145 | // 146 | //usage: if(Math.ceil(getBitmapDifference(arr_undo[arr_undo.length-1], canvasBitmap.bitmapData))) 147 | function getBitmapDifference(bitmapData1:BitmapData, bitmapData2:BitmapData):Number 148 | { 149 | var bmpDataDif:BitmapData = bitmapData1.compare(bitmapData2) as BitmapData; 150 | if(!bmpDataDif) 151 | return 0; 152 | var differentPixelCount:int = 0; 153 | 154 | var pixelVector:Vector. = bmpDataDif.getVector(bmpDataDif.rect); 155 | var pixelCount:int = pixelVector.length; 156 | 157 | for (var i:int = 0; i < pixelCount; i++) 158 | { 159 | if (pixelVector[i] != 0) 160 | differentPixelCount ++; 161 | } 162 | 163 | return (differentPixelCount / pixelCount)*100; 164 | } 165 | 166 | /////BITMAP DRAWING & TEXTURES//// 167 | //shared bitmap drawing, like textures and masks 168 | 169 | //OTHER TYPES OF PENS// 170 | //was perlin_makeBrush 171 | //used for the perlin brush and toast brush 172 | function makeRadialBrush(){ 173 | //make the brush... 174 | // draw an alphaChannel (radial gradient) 175 | var diameter: Number = num_pen_size * 2; 176 | //var pixNum: int; = size * size; 177 | var pixNum:int = diameter * diameter; 178 | var xp: int 179 | var yp: int; 180 | 181 | var dx: int, dy: int; 182 | var ratio: Number = 255 / num_pen_size; 183 | var a: int; 184 | 185 | bitmapdata_tool = new BitmapData(diameter, diameter, true, 0x00000000); 186 | 187 | bitmapdata_tool.lock(); 188 | for (var i:Number = 0; i < pixNum; i++) { 189 | xp = i % diameter; 190 | yp = i / diameter; 191 | dx = xp - num_pen_size; 192 | dy = yp - num_pen_size; 193 | a = int(255 - Math.min(255, Math.sqrt(dx * dx + dy * dy) * ratio)); 194 | bitmapdata_tool.setPixel32(xp, yp, a << 24); 195 | } 196 | bitmapdata_tool.unlock(); 197 | }; 198 | //Draw a generated texture to the canvas 199 | //Used for perlin noise and toast 200 | function draw_texture(event_localX:Number, event_localY:Number): void { 201 | // draw the gradient onto the canvas using the alphaChannel (bitmapdata_tool); 202 | var xp = event_localX - num_pen_size; 203 | var yp = event_localY - num_pen_size; 204 | var diameter: Number = num_pen_size * 2; 205 | // 206 | canvasBitmapData.copyPixels(bitmapdata_texture, 207 | new Rectangle(xp, yp, diameter, diameter), 208 | new Point(xp, yp), bitmapdata_tool, new Point(0, 0), true); 209 | // 210 | } 211 | 212 | //DRAWING TO CANVAS FROM VARIOUS TOOLS// 213 | 214 | //place the text field on the screen (draw to canvas) 215 | function draw_textField() { 216 | //trace(canvas_textField.transform.matrix); 217 | var bool_quality:Boolean; 218 | //if rotated adjust the quality 219 | //rotated text loses quality if set to false 220 | //this is a hack, text needs to be re-worked (TODO) 221 | if(num_currFont_rotation!=0){ 222 | bool_quality = true; 223 | }else{ 224 | bool_quality = false; 225 | }; 226 | //must pass entire draw region otherwise you get cut off 227 | var bmd: BitmapData = new BitmapData(mc_draw.width + stage.stageWidth, mc_draw.height + stage.stageHeight, true, 0); 228 | bmd.draw(canvas_textField_container, null, null, null, null, bool_quality); 229 | // 230 | var mat: Matrix = new Matrix();//canvas_textField.transform.matrix; 231 | //rotation and size 232 | //mat.scale(canvas_textField.scaleX, canvas_textField.scaleY); 233 | mat.rotate(degreesToRadians(num_currFont_rotation));//canvas_textField.rotation); 234 | //place 235 | mat.translate(canvas_textField_container.x, canvas_textField_container.y); 236 | //mat.scale(mc_draw.scaleX, mc_draw.scaleY); 237 | 238 | canvasBitmapData.draw(bmd, mat, null, null, null, bool_quality); 239 | bmd.dispose(); 240 | }; 241 | 242 | //draw imported image into the canvas 243 | function draw_import_fill(){ 244 | // 245 | update_after_draw(); 246 | // 247 | //loader_importImage is in FILEREFERENCE.as, it's set after image is loaded so width height can be read 248 | try{ 249 | var bmd: BitmapData = new BitmapData(loader_importImage.width, loader_importImage.height, true, 0); 250 | bmd.draw(clip_importImage, null, null, null, null, false); 251 | // 252 | var mat: Matrix = clip_importImage.transform.matrix; 253 | // 254 | canvasBitmapData.draw(bmd, mat, null, null, null, false); 255 | bmd.dispose(); 256 | // 257 | //update_after_draw(); 258 | // 259 | }catch(e:Error){ 260 | trace("draw_import_fill error: no bitmap is loaded"); 261 | } 262 | } -------------------------------------------------------------------------------- /as/as/drawingtool/_UNDO_REDO_CLEARALL.as: -------------------------------------------------------------------------------- 1 | /* 2 | basic state management 3 | manage two arrays (undo and redo) 4 | bitmapdata is saved there... 5 | this is a simple implementation that needs to be re-visited later 6 | 7 | TODO: rework this 8 | */ 9 | 10 | //////////////STATE (UNDO/REDO) 11 | //undo is pushed to this 12 | //save bitmap data... 13 | var arr_undo: Array = new Array(); 14 | var arr_redo:Array = new Array(); 15 | ////////////// 16 | 17 | //UNDO / REDO 18 | 19 | //update undo/redo for specific tools 20 | //that modify the canvas but are conditional 21 | function _undo_specialCase(){ 22 | if(str_tool == "GOLDFISH"){ 23 | reset_water(); 24 | } 25 | } 26 | 27 | function _undo(){ 28 | 29 | reset_pen(); 30 | 31 | //update specific cases for tools 32 | _undo_specialCase(); 33 | 34 | if (arr_undo[0] != null) { 35 | //push to redo (save canvas FIRST before undoing) 36 | arr_redo.push(canvasBitmapData.clone()); 37 | //trace("arr_redo.length: " + arr_redo.length); 38 | update_canvas_with(arr_undo[arr_undo.length - 1]); 39 | //remove from undo 40 | arr_undo.removeAt(arr_undo.length - 1); 41 | // 42 | } else { 43 | arr_undo = []; 44 | }; 45 | 46 | //SEND TO PARENT 47 | try { 48 | save_art_to_parent(); 49 | } catch (e: Error) { 50 | trace("save_art_to_parent() error: no parent"); 51 | } 52 | } 53 | 54 | function _redo(){ 55 | //if not null 56 | if(arr_redo[0] != null){ 57 | //push to undo 58 | arr_undo.push(canvasBitmapData.clone()); 59 | //update canvas 60 | update_canvas_with(arr_redo[arr_redo.length - 1]); 61 | //remove after 62 | arr_redo.removeAt(arr_redo.length - 1); 63 | 64 | //update specific cases for tools 65 | _undo_specialCase(); 66 | 67 | //SEND TO PARENT 68 | try { 69 | save_art_to_parent(); 70 | } catch (e: Error) { 71 | trace("save_art_to_parent() error: no parent"); 72 | } 73 | }else{ 74 | arr_redo = []; 75 | } 76 | } 77 | 78 | function event_undo(event: MouseEvent) { 79 | 80 | _undo(); 81 | 82 | }; 83 | 84 | function event_redo(event:MouseEvent){ 85 | _redo(); 86 | }; 87 | 88 | 89 | function event_clear_all(event: MouseEvent) { 90 | 91 | //arr_undo = []; 92 | update_after_draw(); 93 | //clear pen and re-set it 94 | penSprite.graphics.clear(); 95 | 96 | //clear and re-set them 97 | canvasBitmapData.dispose(); 98 | canvasBitmapData = new BitmapData(mc_draw.width, mc_draw.height, false); 99 | canvasBitmap = new Bitmap(canvasBitmapData, "auto", false); 100 | 101 | penSprite.graphics.lineStyle(num_pen_size, pen_color, pen_alpha); 102 | pen_texture.lineStyle(num_pen_size); 103 | 104 | try { 105 | mc_draw.removeChild(canvasBitmap); 106 | mc_draw.removeChild(penSprite); 107 | } catch (e: Error) { 108 | trace("event_undo: error in remove"); 109 | } 110 | 111 | try { 112 | //addChildAt 1 is new. some children get sent to back if not (like eggs's depth issue)... 113 | mc_draw.addChildAt(canvasBitmap, 1);//mc_draw.numChildren - 1); 114 | mc_draw.addChild(penSprite); 115 | //mc_draw.setChildIndex(canvasBitmap, mc_draw.numChildren - 1); 116 | //trace(mc_draw.numChildren); 117 | } catch (e: Error) { 118 | trace("event_undo: error in add"); 119 | } 120 | 121 | //SEND TO PARENT 122 | try { 123 | save_art_to_parent(); 124 | } catch (e: Error) { 125 | trace("save_art_to_parent() error: no parent"); 126 | } 127 | 128 | }; -------------------------------------------------------------------------------- /as/as/misc/DIALOGUE.as: -------------------------------------------------------------------------------- 1 | //TODO: MOVE THIS 2 | var arr_dialogue_colors:Array = new Array("Use strong colors to make your work more gay!", "Strong colors have always been a way for me to signal who I am, long before I could come out.", "I used strong colors to celebrate myself!", "Looking at something colorful I made always comforted me.", "I feel safe in lots of wild colors.", "Colors still mean all this to me. It's my comfort zone!", "It was how I could feel proud, even tho I couldn't come out.", "When I couldn't be outgoing, my work signaled that for me.", "That's why lots of rainbow colors in my art are important to me.", "So go use strong colors! They are good and beautiful! :D", "~ happy end ~"); -------------------------------------------------------------------------------- /as/as/tools/AUTHENTICIFY_UI.as: -------------------------------------------------------------------------------- 1 | /* 2 | (LOOK AT LITERALLY EVERYTHING I MADE AND COLLECTED -- ALL THE NOTES, esp GLITCHMAP) 3 | [Threshold / Monochrome] (no values -- was kurt kobain lactose intollerant? 4 | [desaturate_dither] (values -- anarchist literature 5 | [Halftones] (values -- better quality anarchist literature 6 | [Tiny Halftones] 7 | [Floyd] (all the floyds with values -- images sourced from netscape navigator 8 | [FalseFloyd] 9 | [Stucki] 10 | [Pixel Art] (with values of size of pixel -- instant pixel art 11 | [ReduceColors -- toCGA, etc...] -- adjust some colors reduce channels... 12 | 13 | 14 | 15 | [Ascii Art] (values) 16 | 17 | AFTER HALFTONES MAKE A PIXELATE ONE WHERE U SET SIZE OF PIXELS!!! SEE GOGOFISH!!! 18 | 19 | [FalseFloyd] 20 | [Dither] //ALL THE ONES FROM GOGOFISH (FLOYDTEST) 21 | [Purely for demo purposes (no dither)] 22 | [Stucki] 23 | [Displace the Pixels] 24 | [Pixelate (from gogofish)] 25 | 26 | reduce colors 27 | */ 28 | 29 | /* 30 | window opens: 31 | add authenticity?? 32 | to your zine!! 33 | select an authenticify effect 34 | */ 35 | 36 | /* 37 | TODO: ALLOW FOR EFFECT STACKING 38 | */ 39 | 40 | //values for authenticity 41 | //PUNK AESTHETIC 42 | //(Desaturate Dither) 43 | var auth_num_desaturate:Number = 2; 44 | var auth_bool_desaturate:Boolean = false; 45 | //NETSCAPE NAVIGATOR 46 | //(Floyd) 47 | var auth_num_floyd:Number = 2; 48 | var auth_bool_floyd:Boolean = false; 49 | //(Dither) 50 | var auth_num_dither:Number = 2; 51 | var auth_bool_dither:Boolean = false; 52 | //(Stucki) 53 | var auth_num_stucki:Number = 2; 54 | var auth_bool_stucki:Boolean = false; 55 | //BAD PRINTSHOP 56 | //(Bad Halfotnes) 57 | var auth_num_badHalftone_pointRadius:Number = 1; 58 | var auth_num_badHalftone_pointMultiplier:Number = 1; 59 | var auth_col_badHalftone = 0xFFFFFF; 60 | var auth_bool_badHalftone_invert:Boolean = false; 61 | var auth_bool_badHalftone_grayscale:Boolean = false; 62 | //(Good Halftones) 63 | var auth_num_goodHalftone_sample:Number = 4; 64 | var auth_num_goodHalftone_brushsize:Number = 3; 65 | //Nice Things (Instant Pixel Art) 66 | var auth_num_pixelSize:Number = 5; 67 | //Color Management (Reduce Colors) 68 | var auth_num_reduceColor:Number = 2; 69 | var auth_bool_reduceColor:Boolean = false; 70 | 71 | //Authenticity UI specific 72 | 73 | //UI SPECIFIC 74 | function auth_reduceColors(){ 75 | authentic_resetBitmap(); 76 | reduceColors(bitmapData_canvasDemo, auth_num_reduceColor, auth_bool_reduceColor, false); 77 | } 78 | 79 | function auth_pixelArt(){ 80 | authentic_resetBitmap(); 81 | filt_pixelate(bitmapData_canvasDemo, bitmap_canvasDemo, auth_num_pixelSize); 82 | } 83 | 84 | function auth_goodHalftone(){ 85 | authentic_resetBitmap(); 86 | draw_default_halftone(bitmapData_canvasDemo, bitmap_canvasDemo, auth_num_goodHalftone_sample, auth_num_goodHalftone_brushsize); 87 | } 88 | 89 | function auth_badHalftone(){ 90 | authentic_resetBitmap(); 91 | draw_large_halftone(bitmapData_canvasDemo, bitmap_canvasDemo, auth_num_badHalftone_pointRadius, auth_col_badHalftone, auth_bool_badHalftone_invert, auth_num_badHalftone_pointMultiplier, auth_bool_badHalftone_grayscale, true); 92 | } 93 | 94 | function auth_floyd(){ 95 | authentic_resetBitmap(); 96 | dither_floyd(bitmapData_canvasDemo, auth_num_floyd, auth_bool_floyd); 97 | } 98 | 99 | function auth_dither(){ 100 | authentic_resetBitmap(); 101 | dither_noDither(bitmapData_canvasDemo, auth_num_dither, auth_bool_dither); 102 | } 103 | 104 | function auth_stucki(){ 105 | authentic_resetBitmap(); 106 | dither_stucki(bitmapData_canvasDemo, auth_num_stucki, auth_bool_stucki); 107 | } 108 | 109 | function auth_desaturate(){ 110 | authentic_resetBitmap(); 111 | desaturate_dither(bitmapData_canvasDemo, auth_num_desaturate); 112 | } -------------------------------------------------------------------------------- /as/as/tools/COLOR.as: -------------------------------------------------------------------------------- 1 | //set and remove color transforms 2 | function set_colorTransform(clip:MovieClip, arrVals:Array){ 3 | clip.transform.colorTransform = new ColorTransform(arrVals[0], arrVals[1], arrVals[2], arrVals[3], arrVals[4], arrVals[5], arrVals[6], arrVals[7]); 4 | }; 5 | function reset_colorTransform(clip:MovieClip){ 6 | trace("reset_colorTransform: " + clip.name); 7 | clip.transform.colorTransform = new ColorTransform(); 8 | }; 9 | 10 | //color matrix 11 | function applyColorMatrix(child: DisplayObject, _redMatrix:Array, _greenMatrix:Array, _blueMatrix:Array, _alphaMatrix:Array){// 12 | // 13 | var matrix: Array = new Array(); 14 | matrix = matrix.concat(_redMatrix); // red 15 | matrix = matrix.concat(_greenMatrix); // green 16 | matrix = matrix.concat(_blueMatrix); // blue 17 | matrix = matrix.concat(_alphaMatrix); // alpha 18 | // 19 | var filter: ColorMatrixFilter = new ColorMatrixFilter(matrix); 20 | var filters: Array = new Array(); 21 | filters.push(filter); 22 | child.filters = filters; 23 | } 24 | 25 | //convolution filter (bevel, blur, sharpen, etc...) 26 | function applyConvolutionFilter(child: DisplayObject, matrix: Array, divisor:Number = 9, matrixX:Number = 3, matrixY:Number = 3){ 27 | //matrixX and matrixY are the grid (3x3 grid is default) 28 | //divisor is multiplier 29 | var filter: BitmapFilter = new ConvolutionFilter(matrixX, matrixY, matrix, divisor); 30 | var filters: Array = new Array(); 31 | filters.push(filter); 32 | child.filters = filters; 33 | } 34 | 35 | //RGB shifting 36 | //bitmap is the source bitmap that's added to the clip (must be nested in clip) 37 | //clip is the source movieclip (like mc_draw) 38 | function RGBshift(bitmap:Bitmap, clip:MovieClip, xR:Number = 5, yR:Number = 0, xG:Number = 10, yG:Number = 0, xB:Number = 15, yB:Number = 0) { 39 | //setup temp bitmaps and bitmapdata 40 | var r:Bitmap; 41 | var g:Bitmap; 42 | var b:Bitmap; 43 | var _tempBmpData: BitmapData = new BitmapData(clip.width, clip.height, true, 0); 44 | //drawing... 45 | r = new Bitmap(_tempBmpData.clone()); 46 | _tempBmpData.draw(clip);//draw temp bmp for first time 47 | //clone from temp 48 | r.bitmapData.copyChannel(_tempBmpData, _tempBmpData.rect, new Point(), BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA); 49 | g = new Bitmap(r.bitmapData.clone()); 50 | b = new Bitmap(r.bitmapData.clone()); 51 | //set channels (only red green or blue) 52 | r.bitmapData.copyChannel(_tempBmpData, _tempBmpData.rect, new Point(), BitmapDataChannel.RED, BitmapDataChannel.RED); 53 | g.bitmapData.copyChannel(_tempBmpData, _tempBmpData.rect, new Point(), BitmapDataChannel.GREEN, BitmapDataChannel.GREEN); 54 | b.bitmapData.copyChannel(_tempBmpData, _tempBmpData.rect, new Point(), BitmapDataChannel.BLUE, BitmapDataChannel.BLUE); 55 | //set blend modes for fading over image 56 | r.blendMode = BlendMode.NORMAL; 57 | g.blendMode = BlendMode.SCREEN; 58 | b.blendMode = BlendMode.SCREEN; 59 | 60 | //add to adjust the random values 61 | clip.addChild(r); 62 | clip.addChild(g); 63 | clip.addChild(b); 64 | 65 | //set random values here 66 | r.x = xR; 67 | g.x = xG; 68 | b.x = xB; 69 | r.y = yR; 70 | g.y = yG; 71 | b.y = yB; 72 | 73 | //update source bitmap with new values 74 | //update, copy, and set 75 | _tempBmpData.draw(clip, null, null, null, null, false); 76 | bitmap.bitmapData.draw(_tempBmpData, null, null, null, null, false); 77 | _tempBmpData.dispose(); 78 | //delete and remove everything 79 | clip.removeChild(r); 80 | clip.removeChild(g); 81 | clip.removeChild(b); 82 | // 83 | //return bitmap.bitmapData; 84 | }; 85 | 86 | 87 | //blendmodes over a clip 88 | //used in the blend and displacer-izer 89 | 90 | //blend modes (universal) 91 | function blendMode_normal(clip:MovieClip){ 92 | clip.blendMode = BlendMode.NORMAL; 93 | clip.cacheAsBitmap = false; 94 | } 95 | function blendMode_alpha(clip:MovieClip){ 96 | clip.blendMode = BlendMode.ALPHA; 97 | clip.cacheAsBitmap = false; 98 | } 99 | function blendMode_add(clip:MovieClip){ 100 | clip.blendMode = BlendMode.ADD; 101 | clip.cacheAsBitmap = true; 102 | }; 103 | function blendMode_darken(clip:MovieClip){ 104 | clip.blendMode = BlendMode.DARKEN; 105 | clip.cacheAsBitmap = true; 106 | } 107 | function blendMode_difference(clip:MovieClip){ 108 | clip.blendMode = BlendMode.DIFFERENCE; 109 | clip.cacheAsBitmap = true; 110 | } 111 | function blendMode_hardlight(clip:MovieClip){ 112 | clip.blendMode = BlendMode.HARDLIGHT; 113 | clip.cacheAsBitmap = true; 114 | } 115 | function blendMode_invert(clip:MovieClip){ 116 | clip.blendMode = BlendMode.INVERT; 117 | clip.cacheAsBitmap = true; 118 | } 119 | function blendMode_lighten(clip:MovieClip){ 120 | clip.blendMode = BlendMode.LIGHTEN; 121 | clip.cacheAsBitmap = true; 122 | } 123 | function blendMode_multiply(clip:MovieClip){ 124 | clip.blendMode = BlendMode.MULTIPLY; 125 | clip.cacheAsBitmap = true; 126 | } 127 | function blendMode_overlay(clip:MovieClip){ 128 | clip.blendMode = BlendMode.OVERLAY; 129 | clip.cacheAsBitmap = true; 130 | } 131 | function blendMode_screen(clip:MovieClip){ 132 | clip.blendMode = BlendMode.SCREEN; 133 | clip.cacheAsBitmap = true; 134 | } 135 | function blendMode_subtract(clip:MovieClip){ 136 | clip.blendMode = BlendMode.SUBTRACT; 137 | clip.cacheAsBitmap = true; 138 | } 139 | 140 | //filters 141 | function setBlur(clip:MovieClip, numX:Number, numY:Number, numQuality:Number = 1){ 142 | var myBlur:BlurFilter = new BlurFilter(); 143 | myBlur.quality = numQuality; 144 | myBlur.blurX = numX; 145 | myBlur.blurY = numY; 146 | clip.filters = [myBlur]; 147 | } 148 | 149 | //TOAST EFFECT (burning as you paint) 150 | function sharpenBitmap(bd:BitmapData, num_burnAmnt:Number, bool_outline:Boolean = false, bool_negative:Boolean = false, bool_grayscale:Boolean = false){ 151 | 152 | //creates the outlines 153 | var outlines: BitmapData = bd.clone(); 154 | outlines.applyFilter(outlines, outlines.rect, new Point, sharpen()); 155 | outlines.applyFilter(outlines, outlines.rect, new Point, contrast(num_burnAmnt)); //100 156 | 157 | //part of the UI 158 | //toggle effects for drawing 159 | if(bool_outline){ 160 | outlines.applyFilter(outlines, outlines.rect, new Point, outline(80)); 161 | } 162 | if(bool_negative){ 163 | outlines.applyFilter(outlines, outlines.rect, new Point, negative); 164 | } 165 | if(bool_grayscale){ 166 | outlines.applyFilter(outlines, outlines.rect, new Point, grayscale); 167 | } 168 | 169 | //draws the outlines into the bd 170 | bd.draw(outlines); 171 | 172 | outlines.dispose(); 173 | } 174 | 175 | //SKETCH EFFECT 176 | function sketch(bd: BitmapData): void { 177 | 178 | // desaturation + brightness + contrast 179 | bd.applyFilter(bd, bd.rect, new Point, grayscale); //remove grayscale for a lightening effect 180 | bd.applyFilter(bd, bd.rect, new Point, brightness(25)); 181 | bd.applyFilter(bd, bd.rect, new Point, contrast(20)); 182 | bd.applyFilter(bd, bd.rect, new Point, brightness(35)); 183 | 184 | //creates the outlines 185 | var outlines: BitmapData = bd.clone(); 186 | outlines.applyFilter(outlines, outlines.rect, new Point, outline(80)); 187 | outlines.applyFilter(outlines, outlines.rect, new Point, negative); 188 | outlines.applyFilter(outlines, outlines.rect, new Point, grayscale); 189 | 190 | //draws the outlines into the bd 191 | bd.draw(outlines, new Matrix(1, 0, 0, 1), new ColorTransform(1, 1, 1, .75), BlendMode.MULTIPLY); 192 | 193 | //creates some additionnal noise 194 | var noise: BitmapData = bd.clone(); 195 | noise.noise(0, 0, 255, 7, true); 196 | 197 | //draws the extra noise 198 | bd.draw(noise, new Matrix(1, 0, 0, 1), new ColorTransform(1, 1, 1, 0.15), BlendMode.ADD); 199 | 200 | //clone again and then applyFilter and then draw to... 201 | //dispose at very end... 202 | outlines = bd.clone(); 203 | //final contrast pass 204 | outlines.applyFilter(outlines, outlines.rect, new Point, contrast(50)); 205 | 206 | bd.draw(outlines); 207 | //bd.filter = []; 208 | 209 | outlines.dispose(); 210 | 211 | } 212 | 213 | //color adjustment (for the sketch filter) 214 | function sharpen(){ 215 | return new ConvolutionFilter(3,3,new Array(0,-1,0,-1,7,-1,0,-1,0),3); 216 | } 217 | 218 | function outline(value: Number = 80): ConvolutionFilter { 219 | var q: Number = value / 4; 220 | return new ConvolutionFilter(3, 3, [ 221 | 0, q, 0, 222 | q, -value, q, 223 | 0, q, 0 224 | ], 10); 225 | } 226 | function get negative(): ColorMatrixFilter { 227 | return new ColorMatrixFilter([-1, 0, 0, 0, 0xFF, 228 | 0, -1, 0, 0, 0xFF, 229 | 0, 0, -1, 0, 0xFF, 230 | 0, 0, 0, 1, 0 231 | ]); 232 | } 233 | function get grayscale(): ColorMatrixFilter { 234 | return new ColorMatrixFilter([ 235 | .3086, .6094, .0820, 0, 0, 236 | .3086, .6094, .0820, 0, 0, 237 | .3086, .6094, .0820, 0, 0, 238 | 0, 0, 0, 1, 0 239 | ]); 240 | } 241 | function brightness(value: Number): ColorMatrixFilter { 242 | return new ColorMatrixFilter([ 243 | 1, 0, 0, 0, value, 244 | 0, 1, 0, 0, value, 245 | 0, 0, 1, 0, value, 246 | 0, 0, 0, 1, 0 247 | ]); 248 | } 249 | function contrast(value: Number): ColorMatrixFilter { 250 | var a: Number = (value * 0.01 + 1) 251 | var b: Number = 0x80 * (1 - a); 252 | return new ColorMatrixFilter([ 253 | a, 0, 0, 0, b, 254 | 0, a, 0, 0, b, 255 | 0, 0, a, 0, b, 256 | 0, 0, 0, 1, 0 257 | ]); 258 | } -------------------------------------------------------------------------------- /as/as/tools/COLOR_SPECIALFX.as: -------------------------------------------------------------------------------- 1 | //special bitmap effects used in color factory 2 | 3 | //FUZZY vars 4 | var int_fuzzy_iterator: int = 0; 5 | var fuzzy_canvas: Shape; 6 | fuzzy_canvas = new Shape(); 7 | //values set in the UI 8 | var num_fuzzy_scanSpeed:Number = 1; 9 | var num_fuzzy_segment:Number = 10; 10 | var num_fuzzy_fuzziness:Number = .01; 11 | var num_fuzzy_hairLength:Number = 5; 12 | var num_fuzzy_randomHair:Number = 20; 13 | var bool_fuzzy_unrulyHair:Boolean = true; 14 | var bool_fuzzy_badHairday:Boolean = false; 15 | 16 | //ASCII art vals 17 | var str_colorfactory_ascii:String = ""; //save the string for outputting to text 18 | 19 | //FUZZY EFFECT (see Fuzzy.as for class) 20 | //first run 21 | function setupFuzzy(src:BitmapData, srcBitmap:Bitmap){ 22 | 23 | } 24 | //reset (when loading ui, etc...) 25 | function resetFuzzy(src:BitmapData, srcBitmap:Bitmap){ 26 | 27 | } 28 | //delete fuzzy (fully delete) 29 | function deleteFuzzy(){ 30 | 31 | } 32 | //call when scanning (enter_frame or interval) 33 | function nextFuzzy(src:BitmapData, srcBitmap:Bitmap) { 34 | 35 | } 36 | function fuzzyCalcScan(bd: BitmapData) { 37 | 38 | } 39 | 40 | //PERLIN TEXTURE (add perlin noise over an image to texture it) 41 | function perlin_texture( input:Bitmap, scale:Number = 1, alpha:Number = 1, baseX:Number = 5, baseY:Number = 5, numOctaves:uint = 2, randomSeed:int = 1, stitch:Boolean = false, fractalNoise:Boolean = false, channelOptions:uint = 7, grayScale:Boolean = false, smooth:Boolean = true ){ 42 | // 43 | trace("stitch: " + stitch); 44 | trace("fractalNoise: " + fractalNoise); 45 | trace("grayScale: " + grayScale); 46 | //set a random seed if a value isn't exactly set 47 | if(randomSeed == 1) randomSeed = Math.random() * 0xFFFFFF; 48 | //adjust scale 49 | if( scale > 1 ) scale = 1; 50 | // 51 | var bd:BitmapData = input.bitmapData.clone(); 52 | bd.perlinNoise(baseX, baseY, numOctaves, randomSeed, stitch, fractalNoise, channelOptions, grayScale ); //SETTING FOR NOISE 53 | input.bitmapData.draw( bd, new Matrix( 1 / scale, 0, 0, 1 / scale ), new ColorTransform( 1,1,1, alpha ), BlendMode.OVERLAY, null, smooth ); 54 | bd.dispose(); 55 | } 56 | 57 | //MIRROR (like a kaleidoscope to bitmaps) 58 | //send it bitmapdata and it draws to it (best on enter_frame) 59 | function bitmapMirror( bd:BitmapData, direction:int = 0 ){ 60 | var w:int = bd.width; 61 | var h:int = bd.height; 62 | 63 | var vertices:Vector.; 64 | var indices:Vector.; 65 | var uvs:Vector.; 66 | var p0:Point, p1:Point, p2:Point, p3:Point; 67 | 68 | //TOP LEFT -> BOTTOM RIGHT 69 | if ( direction == 0 ) 70 | { 71 | 72 | p0 = new Point( 0, h ); 73 | p1 = new Point( 0, 0 ); 74 | p2 = new Point( w, 0 ); 75 | p3 = new Point( w, h ); 76 | uvs = Vector.( [ 0,1 , 0,0 , 1,0 , 0,0 ] ); 77 | 78 | } 79 | 80 | //TOP RIGHT -> BOTTOM LEFT 81 | if ( direction == 1 ) 82 | { 83 | 84 | p0 = new Point( 0, 0 ); 85 | p1 = new Point( w, 0 ); 86 | p2 = new Point( w, h ); 87 | p3 = new Point( 0, h ); 88 | uvs = Vector.( [ 0,0 , 1,0, 1,1 , 1,0 ] ); 89 | 90 | } 91 | 92 | //BOTTOM RIGHT -> TOP LEFT 93 | if ( direction == 2 ) 94 | { 95 | 96 | p0 = new Point( w, 0 ); 97 | p1 = new Point( w, h ); 98 | p2 = new Point( 0, h ); 99 | p3 = new Point( 0, 0 ); 100 | uvs = Vector.( [ 1,0 , 1,1 , 0,1 , 1,1 ] ); 101 | 102 | } 103 | 104 | //BOTTOM LEFT -> TOP RIGHT 105 | if ( direction == 3 ) 106 | { 107 | 108 | p0 = new Point( w, h ); 109 | p1 = new Point( 0, h ); 110 | p2 = new Point( 0, 0 ); 111 | p3 = new Point( w, 0 ); 112 | uvs = Vector.( [ 1,1 , 0,1 , 0,0 , 0,1 ] ); 113 | 114 | } 115 | vertices = Vector.( [ p0.x, p0.y, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y ] ); 116 | indices = Vector.< int >( [ 0, 1, 2, 0, 2, 3 ] ); 117 | 118 | for each( var i:Number in vertices ) 119 | 120 | var src:BitmapData = bd.clone(); 121 | var shape:Shape = new Shape(); 122 | shape.graphics.beginBitmapFill( bd, null, false ); 123 | shape.graphics.drawTriangles( vertices, indices, uvs ); 124 | src.draw( shape ); 125 | 126 | shape = null; 127 | indices = null; 128 | vertices = uvs = null; 129 | p0 = p1 = p2 = p3 = null; 130 | //return src; 131 | //draw and dispose 132 | bd.draw(src); 133 | src.dispose(); 134 | } 135 | 136 | 137 | 138 | //draw ASCII art to canvas 139 | //draw ascii to bitmap, send source bitmap and bitmapdata then update source with ascii 140 | function drawAsciiToBitmap(bp:Bitmap, bpData:BitmapData){ 141 | 142 | //copy source to bitmapdata 143 | //generate ascii to it 144 | //delete ascii and generated... 145 | 146 | reduceColors(bpData, 3, true); 147 | 148 | var _tempBitmapData: BitmapData = new BitmapData(bp.width, bp.height, false, 0xFFFFFF); 149 | var _tempBitmap:Bitmap = new Bitmap(bpData); 150 | 151 | var font = new ProggyCleanTT(); 152 | var textFormat = new TextFormat(); 153 | textFormat.font = font.fontName; 154 | textFormat.size = 16; 155 | textFormat.leading = -9; 156 | textFormat.letterSpacing = .9;//-.6; 157 | 158 | //ascii code goes here 159 | 160 | bp.bitmapData.draw(_tempBitmapData);//white first to clear 161 | 162 | //delete and clear all 163 | _tempBitmapData.dispose(); 164 | _tempBitmap = null; 165 | }; 166 | 167 | //explode the pixels (write it to source bitmap) 168 | function pixelblast(srcBmp: BitmapData) { 169 | 170 | var i:uint; 171 | var j:uint; 172 | 173 | var imageWidth: Number = srcBmp.width; 174 | var imageHeight: Number = srcBmp.height; 175 | 176 | var pixels: ByteArray = srcBmp.getPixels(new Rectangle(0, 0, imageWidth, imageHeight)); 177 | var copyBmp: BitmapData = new BitmapData(imageWidth, imageHeight, false); 178 | 179 | pixels.position = 0; 180 | 181 | for (i = 0; i < imageHeight; i++) { 182 | for (j = 0; j < imageWidth; j++) { 183 | copyBmp.setPixel(j + Math.random()*j / j - Math_randomRange(0, 100), i, pixels.readUnsignedInt()); 184 | } 185 | } 186 | 187 | srcBmp.draw(copyBmp); 188 | 189 | copyBmp.dispose(); 190 | pixels.clear(); 191 | 192 | }; 193 | 194 | //cuts upp a bitap into squares and randomly shuffles them 195 | //draw back to source bitmap 196 | function shuffle_bitmap(_bitmap:Bitmap, canvasContainer:MovieClip, num_imgWidth:Number = 10, num_imgHeight:Number = 10, num_rows:Number = 46, num_cols:Number = 65){ 197 | 198 | //canvasContainer = mc_draw 199 | //var bp: Bitmap = Bitmap(e.target.content); 200 | var bpHeight: Number = _bitmap.width / num_rows; 201 | var bpWidth: Number = _bitmap.height / num_cols; 202 | 203 | var imagesArr: Array = new Array(); 204 | var container:Sprite = new Sprite(); 205 | canvasContainer.addChild(container); 206 | 207 | for (var _x: uint = 0; _x < num_rows; _x++) { 208 | for (var _y: uint = 0; _y < num_cols; _y++) { 209 | 210 | var newBp: Bitmap = new Bitmap(new BitmapData(bpWidth, bpHeight)); 211 | newBp.bitmapData.copyPixels(_bitmap.bitmapData, 212 | new Rectangle(_x * bpWidth, _y * bpHeight, bpWidth, bpHeight), 213 | new Point(0, 0)); 214 | 215 | 216 | //add image holder 217 | var holder: Sprite = new Sprite(); 218 | holder.x = _x * bpWidth; 219 | holder.y = _y * bpHeight; 220 | 221 | container.addChild(holder); 222 | holder.addChild(newBp); 223 | 224 | imagesArr.push([holder, newBp]); 225 | 226 | } 227 | } 228 | 229 | //shuffle pieces 230 | if (imagesArr.length == (num_rows * num_cols)) { 231 | for (var i: uint = 0; i < imagesArr.length; i++) { 232 | var xPos: int = randomSign() * Math.random() * num_imgWidth / 2; 233 | var yPos: int = randomSign() * Math.random() * num_imgHeight / 2 234 | imagesArr[i][1].x = xPos; 235 | imagesArr[i][1].y = yPos; 236 | } 237 | } 238 | 239 | //draw to source first 240 | _bitmap.bitmapData.draw(container, null, null, null, null, true); 241 | 242 | //clear everything and delete 243 | for(var j:Number = 0; j 0) { 18 | var angle:Number = dr / radius * rotation; 19 | var dx:Number = xcoord * Math.cos(angle) - ycoord * Math.sin(angle) - xcoord; 20 | var dy:Number = xcoord * Math.sin(angle) + ycoord * Math.cos(angle) - ycoord; 21 | var blue:int = 0x80 + Math.round(dx / width * 0xff); 22 | var green:int = 0x80 + Math.round(dy / height * 0xff); 23 | dbmd.setPixel(x, y, green << 8 | blue); 24 | } 25 | } 26 | } 27 | return new DisplacementMapFilter(dbmd, 28 | new Point(0, 0), 29 | BitmapDataChannel.BLUE, 30 | BitmapDataChannel.GREEN, 31 | width, 32 | height, 33 | DisplacementMapFilterMode.IGNORE); 34 | } 35 | 36 | //myBitmapData.draw(mirror(myBitmapData, 5)); 37 | function mirror(source:BitmapData, num_width:Number = 2){ 38 | var bmd:BitmapData = new BitmapData(source.width, source.height, false); 39 | var halfWidth:int = Math.round(source.width / num_width); 40 | source.lock(); 41 | bmd.copyPixels(source, new Rectangle(0, 0, halfWidth, source.height), new Point(0,0)); 42 | for(var i:int=0;i 0 ? -1 : 1) * (d - radius) * Math.cos(angle) / width; 117 | var dy: Number = (ycoord > 0 ? -1 : 1) * (d - radius) * Math.sin(angle) / height; 118 | var blue: int = 0x80 + dx * 0xff; 119 | var green: int = 0x80 + dy * 0xff; 120 | dbmd.setPixel(x, y, green << 8 | blue); 121 | } 122 | } 123 | } 124 | return new DisplacementMapFilter(dbmd, 125 | new Point(0, 0), 126 | BitmapDataChannel.BLUE, 127 | BitmapDataChannel.GREEN, 128 | width, 129 | height, 130 | DisplacementMapFilterMode.CLAMP); 131 | } 132 | 133 | function strechFilter(source: BitmapData, amount: Number = 0.6) { 134 | var width: int = source.width; 135 | var height: int = source.height; 136 | var dbmd: BitmapData = new BitmapData(width, height, false, 0x8080); 137 | var centerX: int = width / 2; 138 | var centerY: int = height / 2; 139 | var vregion: Rectangle = new Rectangle(0, 0, width / 3, height); 140 | var hregion: Rectangle = new Rectangle(0, 0, width, height / 3); 141 | var blue: int; 142 | var green: int; 143 | for (var y: int = 0; y < height; ++y) { 144 | var ycoord: int = y - centerY; 145 | for (var x: int = 0; x < width; ++x) { 146 | var xcoord: int = x - centerX; 147 | var dx: int = (Math.abs(xcoord) < vregion.width) ? xcoord * (Math.pow(Math.abs(xcoord) / vregion.width, amount) - 1) : 0x0; 148 | var dy: int = (Math.abs(ycoord) < hregion.height) ? ycoord * (Math.pow(Math.abs(ycoord) / hregion.height, amount) - 1) : 0x0; 149 | blue = 0x80 + 0xff * dx / width; 150 | green = 0x80 + 0xff * dy / height; 151 | dbmd.setPixel(x, y, green << 8 | blue); 152 | } 153 | } 154 | return new DisplacementMapFilter(dbmd, 155 | new Point(0, 0), 156 | BitmapDataChannel.BLUE, 157 | BitmapDataChannel.GREEN, 158 | width, 159 | height, 160 | DisplacementMapFilterMode.CLAMP); 161 | } 162 | 163 | function fisheyeFilter(source: BitmapData, amount: Number = 0.8) { 164 | var width: int = source.width; 165 | var height: int = source.height; 166 | var dbmd: BitmapData = new BitmapData(width, height, false, 0x8080); 167 | var centerX: int = width / 2; 168 | var centerY: int = height / 2; 169 | var radius: Number = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2)); 170 | for (var y: int = 0; y < height; ++y) { 171 | var ycoord: int = y - centerY; 172 | for (var x: int = 0; x < width; ++x) { 173 | var xcoord: int = x - centerX; 174 | var d: Number = Math.sqrt(xcoord * xcoord + ycoord * ycoord); 175 | if (d < radius) { 176 | var t: Number = d == 0 ? 0 : Math.pow(Math.sin(Math.PI / 2 * d / radius), amount); 177 | var dx: Number = xcoord * (t - 1) / width; 178 | var dy: Number = ycoord * (t - 1) / height; 179 | var blue: int = 0x80 + dx * 0xff; 180 | var green: int = 0x80 + dy * 0xff; 181 | dbmd.setPixel(x, y, green << 8 | blue); 182 | } 183 | } 184 | } 185 | return new DisplacementMapFilter(dbmd, 186 | new Point(0, 0), 187 | BitmapDataChannel.BLUE, 188 | BitmapDataChannel.GREEN, 189 | width, 190 | height, 191 | DisplacementMapFilterMode.CLAMP); 192 | } -------------------------------------------------------------------------------- /as/as/tools/SMOOSHER.as: -------------------------------------------------------------------------------- 1 | //CODE FOR THE SMOOSHER 2 | //must set mousedown to true/false when running 3 | /* 4 | smoosher_parent.addEventListener(MouseEvent.MOUSE_DOWN, mouseDown); 5 | smoosher_parent.addEventListener(MouseEvent.MOUSE_UP, mouseUp); 6 | smoosher_parent.addEventListener(MouseEvent.MOUSE_MOVE, mouseMove); 7 | */ 8 | 9 | //var bool_isMouseDown: Boolean; //mouse presses for tool's that require multiple events (smoosher, etc...) 10 | 11 | var smoosher_parent: DisplayObjectContainer; 12 | var smoosher_bitmapObject: BitmapData; 13 | var smoosher_displacementFilter: DisplacementMapFilter; 14 | var smoosher_brushObject: Sprite; 15 | var smoosher_currentMousePos: Point = new Point(); 16 | var smoosher_lastMousePos: Point = new Point(); 17 | 18 | //updated values from text input 19 | var smoosher_displacementAmount: Number = 50; 20 | var smoosher_blurAmount: Number = 25; 21 | var num_smoosher_brushSize:Number = 20; 22 | var bool_smoosher_blur:Boolean = true; 23 | 24 | var bool_smoosher_startedSmooshing:Boolean = false; //if you have started drawing on the canvas 25 | 26 | var smoosher_rect: Sprite = new Sprite();//rectangle that's drawn 27 | 28 | var smoosher_bmpDisplay: Bitmap; 29 | var smoosher_bitmapDisplacer: BitmapData; 30 | 31 | function setup_smoosher(bitmapToDistort: BitmapData, debug: Boolean = false) { 32 | 33 | setup_smoosherBitmaps(); 34 | 35 | smoosher_bitmapObject = bitmapToDistort; 36 | smoosher_parent = mc_draw; 37 | 38 | //update bitmap values with the canvas here 39 | smoosher_bmpDisplay = bitmap_canvasDemo;//canvasBitmap; 40 | smoosher_bitmapObject = bitmapData_canvasDemo;//canvasBitmapData; 41 | 42 | init_smoosher(); 43 | 44 | } 45 | 46 | function setup_smoosherBitmaps(){ 47 | // 48 | trace("setup_smoosherBitmaps()"); 49 | // 50 | try{ 51 | mc_draw.removeChild(bitmap_canvasDemo); 52 | bitmapData_canvasDemo.dispose(); 53 | }catch(e:Error){ 54 | //null 55 | }; 56 | //set it up now... 57 | bitmap_canvasDemo = new Bitmap(canvasBitmapData, "auto", true); 58 | //draw it 59 | bitmapData_canvasDemo = new BitmapData(mc_draw.width, mc_draw.height, false, 0x000000); 60 | bitmapData_canvasDemo.draw(bitmap_canvasDemo); 61 | bitmap_canvasDemo.bitmapData = bitmapData_canvasDemo; 62 | // 63 | mc_draw.addChild(bitmap_canvasDemo); 64 | } 65 | 66 | function init_smoosher(){ 67 | //init smoosher here 68 | smoosher_bitmapDisplacer = new BitmapData(mc_draw.width, mc_draw.height, true, 0x7F7F7F); 69 | //init and setup 70 | smoosher_initDisplacementMap(); 71 | smoosher_initBrush(); 72 | // 73 | smoosher_bitmapDisplacer.draw(smoosher_createTransparentRect()); 74 | } 75 | 76 | function restart_smoosher(){ 77 | smoosher_bmpDisplay.filters = []; 78 | smoosher_initBrush(); 79 | } 80 | 81 | //completely resets the smoosher and elimiminates any children 82 | function destory_smoosher() { 83 | // 84 | try{ 85 | 86 | bitmapData_canvasDemo.dispose(); 87 | 88 | smoosher_bmpDisplay.filters = []; 89 | smoosher_brushObject.filters = []; 90 | 91 | smoosher_displacementFilter = null; 92 | smoosher_bitmapDisplacer.dispose(); 93 | 94 | smoosher_brushObject.graphics.clear(); 95 | smoosher_rect.graphics.clear(); 96 | 97 | mc_draw.removeChild(bitmap_canvasDemo); 98 | bitmapData_canvasDemo.dispose(); 99 | 100 | }catch(e:Error){ 101 | //null reference 102 | trace("destory_smoosher: " + e); 103 | } 104 | 105 | //init_smoosher(); 106 | } 107 | 108 | //smoosher setup and running 109 | function smoosher_createTransparentRect(alpha: Number = 1){ 110 | smoosher_rect = new Sprite(); 111 | smoosher_rect.graphics.beginFill(0x7F7F7F, alpha); 112 | smoosher_rect.graphics.drawRect(smoosher_bitmapDisplacer.rect.x, smoosher_bitmapDisplacer.rect.y, smoosher_bitmapDisplacer.rect.width, smoosher_bitmapDisplacer.rect.height); 113 | smoosher_rect.cacheAsBitmap = true; 114 | return smoosher_rect; 115 | } 116 | 117 | function smoosher_initDisplacementMap(): void { 118 | //clear first 119 | try{ 120 | //smoosher_displacementFilter = null; 121 | }catch(e:Error){ 122 | trace("smoosher_initDisplacementMap error: " + e); 123 | } 124 | //now start 125 | //smoosher_displacementAmount = 50; //SIZE: 50 126 | smoosher_displacementFilter = new DisplacementMapFilter(); 127 | //smoosher_displacementFilter.quality = BitmapFilterQuality.HIGH; 128 | smoosher_displacementFilter.mapBitmap = smoosher_bitmapDisplacer; 129 | smoosher_displacementFilter.mapPoint = new Point(-smoosher_bmpDisplay.x, -smoosher_bmpDisplay.y); 130 | smoosher_displacementFilter.componentX = BitmapDataChannel.RED; 131 | smoosher_displacementFilter.componentY = BitmapDataChannel.GREEN; 132 | smoosher_displacementFilter.scaleX = smoosher_displacementAmount; 133 | smoosher_displacementFilter.scaleY = smoosher_displacementAmount; 134 | smoosher_displacementFilter.mode = DisplacementMapFilterMode.COLOR; 135 | } 136 | 137 | function smoosher_initBrush(): void { 138 | //clear old before initiating a new one 139 | try{ 140 | smoosher_brushObject.filters = []; 141 | smoosher_brushObject.graphics.clear(); 142 | }catch(e:Error){ 143 | trace("smoosher_initBrush: " + e); 144 | } 145 | // 146 | // 147 | smoosher_brushObject = new Sprite(); 148 | var colorTrans: ColorTransform = new ColorTransform(); 149 | smoosher_brushObject.graphics.beginFill(colorTrans.color, .3); 150 | smoosher_brushObject.graphics.drawCircle(0, 0, num_smoosher_brushSize); 151 | //set blur here (toggle) ?? 152 | if(bool_smoosher_blur){ 153 | smoosher_brushObject.filters = [new BlurFilter(smoosher_blurAmount, smoosher_blurAmount, 1.5)]; 154 | }else{ 155 | smoosher_brushObject.filters = []; 156 | } 157 | smoosher_brushObject.cacheAsBitmap = true; 158 | } 159 | 160 | function smoosher_changeBrushColor(redAmount: Number, greenAmount: Number): Sprite { 161 | var colorTrans: ColorTransform = new ColorTransform(1, 1, 1, 1, redAmount, greenAmount, 255); 162 | smoosher_brushObject.transform.colorTransform = colorTrans; 163 | return smoosher_brushObject; 164 | } 165 | 166 | function smoosher_calculateBrushColor(): void { 167 | 168 | var dist: Number = 0; 169 | var redAmount: Number; 170 | var greenAmount: Number; 171 | 172 | var intensity:Number = 15; //intensity of motion 173 | 174 | if (smoosher_lastMousePos.x > smoosher_currentMousePos.x) { 175 | //is moving right 176 | dist = smoosher_lastMousePos.x - smoosher_currentMousePos.x; 177 | if (127 + (dist * intensity) >= 255) 178 | redAmount = 255; 179 | else 180 | redAmount = 127 + (dist * intensity) 181 | 182 | } else if (smoosher_lastMousePos.x < smoosher_currentMousePos.x) { 183 | //is moving left 184 | dist = smoosher_currentMousePos.x - smoosher_lastMousePos.x; 185 | if (127 + (dist * intensity) >= 255) 186 | redAmount = 10; 187 | else 188 | redAmount = 127 - (dist * intensity) 189 | } 190 | 191 | if (smoosher_lastMousePos.y > smoosher_currentMousePos.y) { 192 | //is moving up 193 | dist = smoosher_lastMousePos.y - smoosher_currentMousePos.y; 194 | if (127 + (dist * intensity) >= 255) 195 | greenAmount = 255; 196 | else 197 | greenAmount = 127 + (dist * intensity) 198 | 199 | } else if (smoosher_lastMousePos.y < smoosher_currentMousePos.y) { 200 | //is moving down 201 | dist = smoosher_currentMousePos.y - smoosher_lastMousePos.y; 202 | if (127 + (dist * intensity) >= 255) 203 | greenAmount = 10; 204 | else 205 | greenAmount = 127 - (dist * intensity) 206 | } 207 | 208 | smoosher_changeBrushColor(redAmount, greenAmount); 209 | } 210 | 211 | //set in MOUSE_MOVE function 212 | function event_runSmoosher(e_localX:Number, e_localY:Number){ 213 | //enter frame constant refresh 214 | smoosher_displacementFilter.mapBitmap = smoosher_bitmapDisplacer; 215 | smoosher_bmpDisplay.filters = [smoosher_displacementFilter]; 216 | smoosher_displacementFilter.mapPoint = new Point(-smoosher_bmpDisplay.x, -smoosher_bmpDisplay.y); 217 | // 218 | smoosher_lastMousePos = smoosher_currentMousePos; 219 | smoosher_currentMousePos = new Point(e_localX, e_localY); 220 | //move up and down motions 221 | smoosher_calculateBrushColor(); 222 | //update 223 | if (bool_isMouseDown) { 224 | var matrix: Matrix = smoosher_brushObject.transform.matrix; 225 | matrix.identity(); 226 | matrix.translate(e_localX, e_localY); 227 | smoosher_bitmapDisplacer.draw(smoosher_brushObject, matrix, smoosher_brushObject.transform.colorTransform, BlendMode.NORMAL, null, true); 228 | //show the run button 229 | bool_smoosher_startedSmooshing = true; 230 | mc_smooshzone.btn_smoosh_run.visible = bool_smoosher_startedSmooshing; 231 | } 232 | 233 | } -------------------------------------------------------------------------------- /build/DRAWING_TOOL.swf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alienmelon/Electric-Zine-Maker/0670e9356823e4ee17ce99ef60e3a909d6e24694/build/DRAWING_TOOL.swf -------------------------------------------------------------------------------- /cpp/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alienmelon/Electric-Zine-Maker/0670e9356823e4ee17ce99ef60e3a909d6e24694/cpp/.gitkeep -------------------------------------------------------------------------------- /js/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alienmelon/Electric-Zine-Maker/0670e9356823e4ee17ce99ef60e3a909d6e24694/js/.gitkeep -------------------------------------------------------------------------------- /js/ASCIIPAINT/fontquirrels/fsex300-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alienmelon/Electric-Zine-Maker/0670e9356823e4ee17ce99ef60e3a909d6e24694/js/ASCIIPAINT/fontquirrels/fsex300-webfont.eot -------------------------------------------------------------------------------- /js/ASCIIPAINT/fontquirrels/fsex300-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alienmelon/Electric-Zine-Maker/0670e9356823e4ee17ce99ef60e3a909d6e24694/js/ASCIIPAINT/fontquirrels/fsex300-webfont.ttf -------------------------------------------------------------------------------- /js/ASCIIPAINT/fontquirrels/fsex300-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alienmelon/Electric-Zine-Maker/0670e9356823e4ee17ce99ef60e3a909d6e24694/js/ASCIIPAINT/fontquirrels/fsex300-webfont.woff -------------------------------------------------------------------------------- /js/ASCIIPAINT/fontquirrels/generator_config.txt: -------------------------------------------------------------------------------- 1 | # Font Squirrel Font-face Generator Configuration File 2 | # Upload this file to the generator to recreate the settings 3 | # you used to create these fonts. 4 | 5 | {"mode":"optimal","formats":["ttf","woff","eotz"],"tt_instructor":"default","fix_vertical_metrics":"Y","fix_gasp":"xy","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"} -------------------------------------------------------------------------------- /js/ASCIIPAINT/fontquirrels/specimen_files/easytabs.js: -------------------------------------------------------------------------------- 1 | (function($){$.fn.easyTabs=function(option){var param=jQuery.extend({fadeSpeed:"fast",defaultContent:1,activeClass:'active'},option);$(this).each(function(){var thisId="#"+this.id;if(param.defaultContent==''){param.defaultContent=1;} 2 | if(typeof param.defaultContent=="number") 3 | {var defaultTab=$(thisId+" .tabs li:eq("+(param.defaultContent-1)+") a").attr('href').substr(1);}else{var defaultTab=param.defaultContent;} 4 | $(thisId+" .tabs li a").each(function(){var tabToHide=$(this).attr('href').substr(1);$("#"+tabToHide).addClass('easytabs-tab-content');});hideAll();changeContent(defaultTab);function hideAll(){$(thisId+" .easytabs-tab-content").hide();} 5 | function changeContent(tabId){hideAll();$(thisId+" .tabs li").removeClass(param.activeClass);$(thisId+" .tabs li a[href=#"+tabId+"]").closest('li').addClass(param.activeClass);if(param.fadeSpeed!="none") 6 | {$(thisId+" #"+tabId).fadeIn(param.fadeSpeed);}else{$(thisId+" #"+tabId).show();}} 7 | $(thisId+" .tabs li").click(function(){var tabId=$(this).find('a').attr('href').substr(1);changeContent(tabId);return false;});});}})(jQuery); -------------------------------------------------------------------------------- /js/ASCIIPAINT/fontquirrels/specimen_files/fsex300-cleartype.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alienmelon/Electric-Zine-Maker/0670e9356823e4ee17ce99ef60e3a909d6e24694/js/ASCIIPAINT/fontquirrels/specimen_files/fsex300-cleartype.png -------------------------------------------------------------------------------- /js/ASCIIPAINT/fontquirrels/specimen_files/grid_12-825-55-15.css: -------------------------------------------------------------------------------- 1 | /*Notes about grid: 2 | Columns: 12 3 | Grid Width: 825px 4 | Column Width: 55px 5 | Gutter Width: 15px 6 | -------------------------------*/ 7 | 8 | 9 | 10 | .section {margin-bottom: 18px; 11 | } 12 | .section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;} 13 | .section {*zoom: 1;} 14 | 15 | .section .firstcolumn, 16 | .section .firstcol {margin-left: 0;} 17 | 18 | 19 | /* Border on left hand side of a column. */ 20 | .border { 21 | padding-left: 7px; 22 | margin-left: 7px; 23 | border-left: 1px solid #eee; 24 | } 25 | 26 | /* Border with more whitespace, spans one column. */ 27 | .colborder { 28 | padding-left: 42px; 29 | margin-left: 42px; 30 | border-left: 1px solid #eee; 31 | } 32 | 33 | 34 | 35 | /* The Grid Classes */ 36 | .grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12 37 | {margin-left: 15px;float: left;display: inline; overflow: hidden;} 38 | 39 | 40 | .width1, .grid1, .span-1 {width: 55px;} 41 | .width1_2cols,.grid1_2cols {width: 20px;} 42 | .width1_3cols,.grid1_3cols {width: 8px;} 43 | .width1_4cols,.grid1_4cols {width: 2px;} 44 | .input_width1 {width: 49px;} 45 | 46 | .width2, .grid2, .span-2 {width: 125px;} 47 | .width2_3cols,.grid2_3cols {width: 31px;} 48 | .width2_4cols,.grid2_4cols {width: 20px;} 49 | .input_width2 {width: 119px;} 50 | 51 | .width3, .grid3, .span-3 {width: 195px;} 52 | .width3_2cols,.grid3_2cols {width: 90px;} 53 | .width3_4cols,.grid3_4cols {width: 37px;} 54 | .input_width3 {width: 189px;} 55 | 56 | .width4, .grid4, .span-4 {width: 265px;} 57 | .width4_3cols,.grid4_3cols {width: 78px;} 58 | .input_width4 {width: 259px;} 59 | 60 | .width5, .grid5, .span-5 {width: 335px;} 61 | .width5_2cols,.grid5_2cols {width: 160px;} 62 | .width5_3cols,.grid5_3cols {width: 101px;} 63 | .width5_4cols,.grid5_4cols {width: 72px;} 64 | .input_width5 {width: 329px;} 65 | 66 | .width6, .grid6, .span-6 {width: 405px;} 67 | .width6_4cols,.grid6_4cols {width: 90px;} 68 | .input_width6 {width: 399px;} 69 | 70 | .width7, .grid7, .span-7 {width: 475px;} 71 | .width7_2cols,.grid7_2cols {width: 230px;} 72 | .width7_3cols,.grid7_3cols {width: 148px;} 73 | .width7_4cols,.grid7_4cols {width: 107px;} 74 | .input_width7 {width: 469px;} 75 | 76 | .width8, .grid8, .span-8 {width: 545px;} 77 | .width8_3cols,.grid8_3cols {width: 171px;} 78 | .input_width8 {width: 539px;} 79 | 80 | .width9, .grid9, .span-9 {width: 615px;} 81 | .width9_2cols,.grid9_2cols {width: 300px;} 82 | .width9_4cols,.grid9_4cols {width: 142px;} 83 | .input_width9 {width: 609px;} 84 | 85 | .width10, .grid10, .span-10 {width: 685px;} 86 | .width10_3cols,.grid10_3cols {width: 218px;} 87 | .width10_4cols,.grid10_4cols {width: 160px;} 88 | .input_width10 {width: 679px;} 89 | 90 | .width11, .grid11, .span-11 {width: 755px;} 91 | .width11_2cols,.grid11_2cols {width: 370px;} 92 | .width11_3cols,.grid11_3cols {width: 241px;} 93 | .width11_4cols,.grid11_4cols {width: 177px;} 94 | .input_width11 {width: 749px;} 95 | 96 | .width12, .grid12, .span-12 {width: 825px;} 97 | .input_width12 {width: 819px;} 98 | 99 | /* Subdivided grid spaces */ 100 | .emptycols_left1, .prepend-1 {padding-left: 70px;} 101 | .emptycols_right1, .append-1 {padding-right: 70px;} 102 | .emptycols_left2, .prepend-2 {padding-left: 140px;} 103 | .emptycols_right2, .append-2 {padding-right: 140px;} 104 | .emptycols_left3, .prepend-3 {padding-left: 210px;} 105 | .emptycols_right3, .append-3 {padding-right: 210px;} 106 | .emptycols_left4, .prepend-4 {padding-left: 280px;} 107 | .emptycols_right4, .append-4 {padding-right: 280px;} 108 | .emptycols_left5, .prepend-5 {padding-left: 350px;} 109 | .emptycols_right5, .append-5 {padding-right: 350px;} 110 | .emptycols_left6, .prepend-6 {padding-left: 420px;} 111 | .emptycols_right6, .append-6 {padding-right: 420px;} 112 | .emptycols_left7, .prepend-7 {padding-left: 490px;} 113 | .emptycols_right7, .append-7 {padding-right: 490px;} 114 | .emptycols_left8, .prepend-8 {padding-left: 560px;} 115 | .emptycols_right8, .append-8 {padding-right: 560px;} 116 | .emptycols_left9, .prepend-9 {padding-left: 630px;} 117 | .emptycols_right9, .append-9 {padding-right: 630px;} 118 | .emptycols_left10, .prepend-10 {padding-left: 700px;} 119 | .emptycols_right10, .append-10 {padding-right: 700px;} 120 | .emptycols_left11, .prepend-11 {padding-left: 770px;} 121 | .emptycols_right11, .append-11 {padding-right: 770px;} 122 | .pull-1 {margin-left: -70px;} 123 | .push-1 {margin-right: -70px;margin-left: 18px;float: right;} 124 | .pull-2 {margin-left: -140px;} 125 | .push-2 {margin-right: -140px;margin-left: 18px;float: right;} 126 | .pull-3 {margin-left: -210px;} 127 | .push-3 {margin-right: -210px;margin-left: 18px;float: right;} 128 | .pull-4 {margin-left: -280px;} 129 | .push-4 {margin-right: -280px;margin-left: 18px;float: right;} -------------------------------------------------------------------------------- /js/ASCIIPAINT/fontquirrels/specimen_files/specimen_stylesheet.css: -------------------------------------------------------------------------------- 1 | @import url('grid_12-825-55-15.css'); 2 | 3 | /* 4 | CSS Reset by Eric Meyer - Released under Public Domain 5 | http://meyerweb.com/eric/tools/css/reset/ 6 | */ 7 | html, body, div, span, applet, object, iframe, 8 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 9 | a, abbr, acronym, address, big, cite, code, 10 | del, dfn, em, font, img, ins, kbd, q, s, samp, 11 | small, strike, strong, sub, sup, tt, var, 12 | b, u, i, center, dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, table, 14 | caption, tbody, tfoot, thead, tr, th, td 15 | {margin: 0;padding: 0;border: 0;outline: 0; 16 | font-size: 100%;vertical-align: baseline; 17 | background: transparent;} 18 | body {line-height: 1;} 19 | ol, ul {list-style: none;} 20 | blockquote, q {quotes: none;} 21 | blockquote:before, blockquote:after, 22 | q:before, q:after {content: ''; content: none;} 23 | :focus {outline: 0;} 24 | ins {text-decoration: none;} 25 | del {text-decoration: line-through;} 26 | table {border-collapse: collapse;border-spacing: 0;} 27 | 28 | 29 | 30 | 31 | body { 32 | color: #000; 33 | background-color: #dcdcdc; 34 | } 35 | 36 | a { 37 | text-decoration: none; 38 | color: #1883ba; 39 | } 40 | 41 | h1{ 42 | font-size: 32px; 43 | font-weight: normal; 44 | font-style: normal; 45 | margin-bottom: 18px; 46 | } 47 | 48 | h2{ 49 | font-size: 18px; 50 | } 51 | 52 | #container { 53 | width: 865px; 54 | margin: 0px auto; 55 | } 56 | 57 | 58 | #header { 59 | padding: 20px; 60 | font-size: 36px; 61 | background-color: #000; 62 | color: #fff; 63 | } 64 | 65 | #header span { 66 | color: #666; 67 | } 68 | #main_content { 69 | background-color: #fff; 70 | padding: 60px 20px 20px; 71 | } 72 | 73 | 74 | #footer p { 75 | margin: 0; 76 | padding-top: 10px; 77 | padding-bottom: 50px; 78 | color: #333; 79 | font: 10px Arial, sans-serif; 80 | } 81 | 82 | .tabs { 83 | width: 100%; 84 | height: 31px; 85 | background-color: #444; 86 | } 87 | .tabs li { 88 | float: left; 89 | margin: 0; 90 | overflow: hidden; 91 | background-color: #444; 92 | } 93 | .tabs li a { 94 | display: block; 95 | color: #fff; 96 | text-decoration: none; 97 | font: bold 11px/11px 'Arial'; 98 | text-transform: uppercase; 99 | padding: 10px 15px; 100 | border-right: 1px solid #fff; 101 | } 102 | 103 | .tabs li a:hover { 104 | background-color: #00b3ff; 105 | 106 | } 107 | 108 | .tabs li.active a { 109 | color: #000; 110 | background-color: #fff; 111 | } 112 | 113 | 114 | 115 | div.huge { 116 | 117 | font-size: 300px; 118 | line-height: 1em; 119 | padding: 0; 120 | letter-spacing: -.02em; 121 | overflow: hidden; 122 | } 123 | div.glyph_range { 124 | font-size: 72px; 125 | line-height: 1.1em; 126 | } 127 | 128 | .size10{ font-size: 10px; } 129 | .size11{ font-size: 11px; } 130 | .size12{ font-size: 12px; } 131 | .size13{ font-size: 13px; } 132 | .size14{ font-size: 14px; } 133 | .size16{ font-size: 16px; } 134 | .size18{ font-size: 18px; } 135 | .size20{ font-size: 20px; } 136 | .size24{ font-size: 24px; } 137 | .size30{ font-size: 30px; } 138 | .size36{ font-size: 36px; } 139 | .size48{ font-size: 48px; } 140 | .size60{ font-size: 60px; } 141 | .size72{ font-size: 72px; } 142 | .size90{ font-size: 90px; } 143 | 144 | 145 | .psample_row1 { height: 120px;} 146 | .psample_row1 { height: 120px;} 147 | .psample_row2 { height: 160px;} 148 | .psample_row3 { height: 160px;} 149 | .psample_row4 { height: 160px;} 150 | 151 | .psample { 152 | overflow: hidden; 153 | position: relative; 154 | } 155 | .psample p { 156 | line-height: 1.3em; 157 | display: block; 158 | overflow: hidden; 159 | margin: 0; 160 | } 161 | 162 | .psample span { 163 | margin-right: .5em; 164 | } 165 | 166 | .white_blend { 167 | width: 100%; 168 | height: 61px; 169 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==); 170 | position: absolute; 171 | bottom: 0; 172 | } 173 | .black_blend { 174 | width: 100%; 175 | height: 61px; 176 | background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC); 177 | position: absolute; 178 | bottom: 0; 179 | } 180 | .fullreverse { 181 | background: #000 !important; 182 | color: #fff !important; 183 | margin-left: -20px; 184 | padding-left: 20px; 185 | margin-right: -20px; 186 | padding-right: 20px; 187 | padding: 20px; 188 | margin-bottom:0; 189 | } 190 | 191 | 192 | .sample_table td { 193 | padding-top: 3px; 194 | padding-bottom:5px; 195 | padding-left: 5px; 196 | vertical-align: middle; 197 | line-height: 1.2em; 198 | } 199 | 200 | .sample_table td:first-child { 201 | background-color: #eee; 202 | text-align: right; 203 | padding-right: 5px; 204 | padding-left: 0; 205 | padding: 5px; 206 | font: 11px/12px "Courier New", Courier, mono; 207 | } 208 | 209 | code { 210 | white-space: pre; 211 | background-color: #eee; 212 | display: block; 213 | padding: 10px; 214 | margin-bottom: 18px; 215 | overflow: auto; 216 | } 217 | 218 | 219 | .bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;} 220 | 221 | .box { 222 | padding: 18px; 223 | margin-bottom: 18px; 224 | background: #eee; 225 | } 226 | 227 | .reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;} 228 | 229 | #bodycomparison { 230 | position: relative; 231 | overflow: hidden; 232 | font-size: 72px; 233 | height: 90px; 234 | white-space: nowrap; 235 | } 236 | 237 | #bodycomparison div{ 238 | font-size: 72px; 239 | line-height: 90px; 240 | display: inline; 241 | margin: 0 15px 0 0; 242 | padding: 0; 243 | } 244 | 245 | #bodycomparison div span{ 246 | font: 10px Arial; 247 | position: absolute; 248 | left: 0; 249 | } 250 | #xheight { 251 | float: none; 252 | position: absolute; 253 | color: #d9f3ff; 254 | font-size: 72px; 255 | line-height: 90px; 256 | } 257 | 258 | .fontbody { 259 | position: relative; 260 | } 261 | .arialbody{ 262 | font-family: Arial; 263 | position: relative; 264 | } 265 | .verdanabody{ 266 | font-family: Verdana; 267 | position: relative; 268 | } 269 | .georgiabody{ 270 | font-family: Georgia; 271 | position: relative; 272 | } 273 | 274 | /* @group Layout page 275 | */ 276 | 277 | #layout h1 { 278 | font-size: 36px; 279 | line-height: 42px; 280 | font-weight: normal; 281 | font-style: normal; 282 | } 283 | 284 | #layout h2 { 285 | font-size: 24px; 286 | line-height: 23px; 287 | font-weight: normal; 288 | font-style: normal; 289 | } 290 | 291 | #layout h3 { 292 | font-size: 22px; 293 | line-height: 1.4em; 294 | margin-top: 1em; 295 | font-weight: normal; 296 | font-style: normal; 297 | } 298 | 299 | 300 | #layout p.byline { 301 | font-size: 12px; 302 | margin-top: 18px; 303 | line-height: 12px; 304 | margin-bottom: 0; 305 | } 306 | #layout p { 307 | font-size: 14px; 308 | line-height: 21px; 309 | margin-bottom: .5em; 310 | } 311 | 312 | #layout p.large{ 313 | font-size: 18px; 314 | line-height: 26px; 315 | } 316 | 317 | #layout .sidebar p{ 318 | font-size: 12px; 319 | line-height: 1.4em; 320 | } 321 | 322 | #layout p.caption { 323 | font-size: 10px; 324 | margin-top: -16px; 325 | margin-bottom: 18px; 326 | } 327 | 328 | /* @end */ 329 | 330 | /* @group Glyphs */ 331 | 332 | #glyph_chart div{ 333 | background-color: #d9f3ff; 334 | color: black; 335 | float: left; 336 | font-size: 36px; 337 | height: 1.2em; 338 | line-height: 1.2em; 339 | margin-bottom: 1px; 340 | margin-right: 1px; 341 | text-align: center; 342 | width: 1.2em; 343 | position: relative; 344 | padding: .6em .2em .2em; 345 | } 346 | 347 | #glyph_chart div p { 348 | position: absolute; 349 | left: 0; 350 | top: 0; 351 | display: block; 352 | text-align: center; 353 | font: bold 9px Arial, sans-serif; 354 | background-color: #3a768f; 355 | width: 100%; 356 | color: #fff; 357 | padding: 2px 0; 358 | } 359 | 360 | 361 | #glyphs h1 { 362 | font-family: Arial, sans-serif; 363 | } 364 | /* @end */ 365 | 366 | /* @group Installing */ 367 | 368 | #installing { 369 | font: 13px Arial, sans-serif; 370 | } 371 | 372 | #installing p, 373 | #glyphs p{ 374 | line-height: 1.2em; 375 | margin-bottom: 18px; 376 | font: 13px Arial, sans-serif; 377 | } 378 | 379 | 380 | 381 | #installing h3{ 382 | font-size: 15px; 383 | margin-top: 18px; 384 | } 385 | 386 | /* @end */ 387 | 388 | #rendering h1 { 389 | font-family: Arial, sans-serif; 390 | } 391 | .render_table td { 392 | font: 11px "Courier New", Courier, mono; 393 | vertical-align: middle; 394 | } 395 | 396 | 397 | -------------------------------------------------------------------------------- /js/ASCIIPAINT/fontquirrels/stylesheet.css: -------------------------------------------------------------------------------- 1 | /* Generated by Font Squirrel (http://www.fontsquirrel.com) on April 17, 2014 */ 2 | 3 | 4 | 5 | @font-face { 6 | font-family: 'fixedsys_excelsior_3.01Rg'; 7 | src: url('fsex300-webfont.eot'); 8 | src: url('fsex300-webfont.eot?#iefix') format('embedded-opentype'), 9 | url('fsex300-webfont.woff') format('woff'), 10 | url('fsex300-webfont.ttf') format('truetype'), 11 | url('fsex300-webfont.svg#fixedsys_excelsior_3.01Rg') format('svg'); 12 | font-weight: normal; 13 | font-style: normal; 14 | 15 | } -------------------------------------------------------------------------------- /js/ASCIIPAINT/images/IMG_BLUE.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alienmelon/Electric-Zine-Maker/0670e9356823e4ee17ce99ef60e3a909d6e24694/js/ASCIIPAINT/images/IMG_BLUE.png -------------------------------------------------------------------------------- /js/ASCIIPAINT/images/IMG_BLUE_SML.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alienmelon/Electric-Zine-Maker/0670e9356823e4ee17ce99ef60e3a909d6e24694/js/ASCIIPAINT/images/IMG_BLUE_SML.png --------------------------------------------------------------------------------