asciiblaster- draw irc art in your web browser |
git clone git://git.acid.vegas/asciiblaster.git |
Log | Files | Refs | Archive | README |
transform.js (4162B)
1 var transform = (function(){ 2 3 var p = [0,0], q = [0,0] 4 var mode 5 var copy 6 7 function down (e, lex, point){ 8 p[0] = point[0] 9 p[1] = point[1] 10 q[0] = e.pageX 11 q[1] = e.pageY 12 undo.new() 13 undo.save_rect(0, 0, canvas.w, canvas.h) 14 copy = canvas.clone() 15 mode.init(e) 16 } 17 function move (e, lex, point){ 18 var pdx = point[0] - p[0] 19 var pdy = point[1] - p[1] 20 var dx = e.pageX - q[0] 21 var dy = e.pageY - q[1] 22 var w = canvas.w 23 var h = canvas.h 24 mode.before(dx, dy, pdx, pdy, point) 25 for (var x = 0; x < w; x++) { 26 for (var y = 0; y < h; y++) { 27 lex = canvas.get(x, y) 28 if (! mode.shade( copy, canvas, lex, x, y, w, h )) { 29 lex.build() 30 } 31 } 32 } 33 } 34 function up (e){ 35 } 36 37 var modes = { 38 39 rotate: { 40 init: function(e){ 41 mode.theta = 0 42 }, 43 before: function(dx, dy){ 44 var radius = dist(0, 0, dx, dy) 45 if (radius < 10) return 46 mode.theta = angle(0, 0, dx, -dy) 47 }, 48 shade: function(src, dest, lex, x, y, w, h){ 49 x = (x/w) * 2 - 1 50 y = (y/h) * 2 - 1 51 var ca = cos(mode.theta) 52 var sa = sin(mode.theta) 53 var a = x * ca - y * sa 54 var b = x * sa + y * ca 55 x = (a + 1) / 2 * w 56 y = (b + 1) / 2 * h 57 var copy = src.get(x, y) 58 lex.assign(copy) 59 return true 60 }, 61 }, 62 63 scale: { 64 init: function(e){ 65 mode.independent = e.shiftKey || e.altKey || e.metaKey 66 mode.x_scale = mode.y_scale = 0 67 }, 68 before: function(dx, dy, pdx, pdy){ 69 if (mode.independent) { 70 mode.x_scale = Math.pow(2, -pdx / (canvas.w / 8)) 71 mode.y_scale = Math.pow(2, -pdy / (canvas.h / 8)) 72 } 73 else { 74 mode.x_scale = mode.y_scale = Math.pow(2, -pdx / (canvas.w / 8)) 75 } 76 }, 77 shade: function(src, dest, lex, x, y, w, h){ 78 x = ((x-p[0])/w) * 2 - 1 79 y = ((y-p[1])/h) * 2 - 1 80 x *= mode.x_scale 81 y *= mode.y_scale 82 x = (x + 1) / 2 * w 83 y = (y + 1) / 2 * h 84 var copy = src.get(x+p[0], y+p[1]) 85 lex.assign(copy) 86 return true 87 }, 88 }, 89 90 translate: { 91 init: function(e){ 92 mode.dx = mode.dy = 0 93 }, 94 before: function(dx, dy, pdx, pdy){ 95 mode.dx = -pdx 96 mode.dy = -pdy 97 }, 98 shade: function(src, dest, lex, x, y, w, h){ 99 var copy = src.get(x+mode.dx, y+mode.dy) 100 lex.assign(copy) 101 return true 102 }, 103 }, 104 105 slice: { 106 init: function(e){ 107 mode.is_y = ! (e.altKey || e.metaKey) 108 mode.reverse = !! (e.shiftKey) 109 mode.position = 0 110 mode.direction = 0 111 mode.last_dd = -1 112 }, 113 before: function(dx, dy, pdx, pdy, point){ 114 var new_position = mode.is_y ? point[1] : point[0] 115 var dd = mode.is_y ? pdx : pdy 116 117 if (mode.position !== new_position) { 118 mode.position = new_position 119 mode.direction = 0 120 } 121 if (mode.last_dd !== -1) { 122 mode.direction = mode.last_dd - dd 123 } 124 console.log(mode.position) 125 mode.last_dd = dd 126 copy.assign(canvas) 127 }, 128 shade: function(src, dest, lex, x, y, w, h){ 129 if (mode.is_y) { 130 if (y >= mode.position || (mode.reverse && mode.position >= y)) { 131 var copy = src.get(x + mode.direction, y) 132 lex.assign(copy) 133 } 134 } 135 else if (x >= mode.position || (mode.reverse && mode.position >= x)) { 136 var copy = src.get(x, y + mode.direction) 137 lex.assign(copy) 138 } 139 return true 140 }, 141 }, 142 143 /* 144 mode: { 145 init: function(e){ 146 }, 147 before: function(dx, dy, pdx, pdy){ 148 }, 149 shade: function(src, dest, lex, x, y, w, h){ 150 }, 151 }, 152 */ 153 } 154 155 function set_mode(m){ 156 if (m in modes) { 157 mode = modes[m] 158 transforming = true 159 } 160 } 161 162 function done(){ 163 transforming = false 164 copy && copy.demolish() 165 } 166 167 return { 168 down: down, 169 move: move, 170 up: up, 171 set_mode: set_mode, 172 modes: modes, 173 done: done, 174 } 175 176 })()