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 })()