summaryrefslogtreecommitdiff
path: root/js/ui/transform.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/ui/transform.js')
-rw-r--r--js/ui/transform.js156
1 files changed, 156 insertions, 0 deletions
diff --git a/js/ui/transform.js b/js/ui/transform.js
new file mode 100644
index 0000000..b0ef894
--- /dev/null
+++ b/js/ui/transform.js
@@ -0,0 +1,156 @@
+var transform = (function(){
+
+ var p = [0,0], q = [0,0]
+ var mode
+ var copy
+
+ function down (e, lex, point){
+ p[0] = point[0]
+ p[1] = point[1]
+ q[0] = e.pageX
+ q[1] = e.pageY
+ undo.new()
+ undo.save_rect(0, 0, canvas.w, canvas.h)
+ copy = canvas.clone()
+ mode.init(e)
+ }
+ function move (e, lex, point){
+ var pdx = point[0] - p[0]
+ var pdy = point[1] - p[1]
+ var dx = e.pageX - q[0]
+ var dy = e.pageY - q[1]
+ var w = canvas.w
+ var h = canvas.h
+ mode.before(dx, dy, pdx, pdy)
+ for (var x = 0; x < w; x++) {
+ for (var y = 0; y < h; y++) {
+ lex = canvas.get(x, y)
+ if (! mode.shade( copy, canvas, lex, x, y, w, h )) {
+ lex.build()
+ }
+ }
+ }
+ }
+ function up (e){
+ }
+
+ var modes = {
+
+ rotate: {
+ init: function(e){
+ mode.theta = 0
+ },
+ before: function(dx, dy){
+ var radius = dist(0, 0, dx, dy)
+ if (radius < 10) return
+ mode.theta = angle(0, 0, dx, -dy)
+ },
+ shade: function(src, dest, lex, x, y, w, h){
+ x = (x/w) * 2 - 1
+ y = (y/h) * 2 - 1
+ var ca = cos(mode.theta)
+ var sa = sin(mode.theta)
+ var a = x * ca - y * sa
+ var b = x * sa + y * ca
+ x = (a + 1) / 2 * w
+ y = (b + 1) / 2 * h
+ var copy = src.get(x, y)
+ lex.assign(copy)
+ return true
+ },
+ },
+
+/*
+ scale: {
+ init: function(e){
+ },
+ before: function(dx, dy){
+ },
+ shade: function(src, dest, lex, x, y, w, h){
+ x = (x/w) * 2 - 1
+ y = (y/h) * 2 - 1
+ x *= this.x_scale
+ y *= this.y_scale
+ x = (x + 1) / 2 * w
+ y = (y + 1) / 2 * h
+ var copy = src.get(x, y)
+ lex.assign(copy)
+ return true
+ },
+ },
+*/
+
+ translate: {
+ init: function(e){
+ mode.dx = mode.dy = 0
+ },
+ before: function(dx, dy, pdx, pdy){
+ mode.dx = -pdx
+ mode.dy = -pdy
+ },
+ shade: function(src, dest, lex, x, y, w, h){
+ var copy = src.get(x+mode.dx, y+mode.dy)
+ lex.assign(copy)
+ return true
+ },
+ },
+
+ slice: {
+ init: function(e){
+ mode.position = 0
+ },
+ before: function(dx, dy){
+ var dd = mode.is_y ? dy : dx
+ mode.position = mod(mode.position + dd, mode.limit)
+ mode.direction = dy
+ copy.assign(canvas)
+ },
+ shade: function(src, dest, lex, x, y, w, h){
+ if (mode.is_y) {
+ if (y >= mode.position) {
+ var copy = src.get(x + mode.direction, y)
+ lex.assign(copy)
+ }
+ }
+ else if (x >= mode.position) {
+ var copy = src.get(x, y + mode.direction)
+ lex.assign(copy)
+ }
+ return true
+ },
+ },
+
+/*
+ mode: {
+ init: function(e){
+ },
+ before: function(dx, dy){
+ },
+ shade: function(src, dest, lex, x, y, w, h){
+ },
+ },
+*/
+ }
+
+ function set_mode(m){
+ if (m in modes) {
+ mode = modes[m]
+ transforming = true
+ }
+ }
+
+ function done(){
+ transforming = false
+ copy && copy.demolish()
+ }
+
+ return {
+ down: down,
+ move: move,
+ up: up,
+ set_mode: set_mode,
+ modes: modes,
+ done: done,
+ }
+
+})() \ No newline at end of file