diff --git a/config.js b/config.js index ad5562e..1b11044 100644 --- a/config.js +++ b/config.js @@ -6,7 +6,6 @@ //canvas layers var canvas_back = document.getElementById("canvas_back").getContext("2d"); //layer for grid/transparency -var canvas_main = document.getElementById("Background").getContext("2d"); //background var canvas_front = document.getElementById("canvas_front").getContext("2d"); //tmp layer var canvas_grid = document.getElementById("canvas_grid").getContext("2d"); //grid layer var canvas_preview = document.getElementById("canvas_preview").getContext("2d"); //mini preview diff --git a/index.html b/index.html index 220fcde..4285a70 100644 --- a/index.html +++ b/index.html @@ -64,7 +64,6 @@
Your browser doesn't support canvas.
-
diff --git a/js/edit.js b/js/edit.js index 2a4093d..dfee9d5 100644 --- a/js/edit.js +++ b/js/edit.js @@ -94,8 +94,8 @@ function EDIT_CLASS() { tmp = new Array(); var new_name = 'Layer #' + (LAYER.layers.length + 1); LAYER.create_canvas(new_name); - LAYER.layers.push({name: new_name, title: new_name, visible: true}); - LAYER.layer_active = LAYER.layers.length - 1; + LAYER.layers.unshift({name: new_name, title: new_name, visible: true}); + LAYER.layer_active = 0; canvas_active().drawImage(PASTE_DATA, 0, 0); LAYER.layer_renew(); }; diff --git a/js/events.js b/js/events.js index 56e6b15..02e8fb1 100644 --- a/js/events.js +++ b/js/events.js @@ -279,7 +279,7 @@ function EVENTS_CLASS() { } //n - new layer else if (k == 78) - LAYER.add_layer(); + LAYER.layer_add(); GUI.zoom(); return true; diff --git a/js/file.js b/js/file.js index 29289a9..c04d885 100644 --- a/js/file.js +++ b/js/file.js @@ -192,7 +192,7 @@ function FILE_CLASS() { } //take data - for (var i in LAYER.layers) { + for(var i = LAYER.layers.length-1; i >=0; i--){ if (LAYER.layers[i].visible == false) continue; if (user_response.layers == 'Selected' && user_response.type != 'JSON' && i != LAYER.layer_active) @@ -276,10 +276,10 @@ function FILE_CLASS() { //layers export_data.layers = []; - for (var i in LAYER.layers) { + for(var i = LAYER.layers.length-1; i >=0; i--){ var layer = { name:LAYER.layers[i].name, - title:LAYER.layers[i].name, + title:LAYER.layers[i].title, visible: 1, opacity: LAYER.layers[i].opacity, }; @@ -290,7 +290,7 @@ function FILE_CLASS() { //image data export_data.image_data = []; - for (var i in LAYER.layers) { + for(var i = LAYER.layers.length-1; i >=0; i--){ var data_tmp = document.getElementById(LAYER.layers[i].name).toDataURL("image/png"); export_data.image_data.push({name: LAYER.layers[i].name, data: data_tmp}); } @@ -351,14 +351,12 @@ function FILE_CLASS() { this.load_json = function (data) { var json = JSON.parse(data); - - //delete old layers - for (var i in LAYER.layers) - LAYER.layer_remove(i); //init new file GUI.ZOOM = 100; MAIN.init(); + + LAYER.remove_all_layers(); //set attributes WIDTH = parseInt(json.info.width); @@ -369,17 +367,16 @@ function FILE_CLASS() { for(var i in json.layers){ var layer = json.layers[i]; var name = layer.name.replace(/[^0-9a-zA-Z-_\. ]/g, ""); + var title = layer.title; var visible = parseInt(layer.visible); var opacity = parseInt(layer.opacity); - if (i > 0) { //first layer exists by default - Background - LAYER.layer_add(name); - //update attributes - LAYER.layers[LAYER.layer_active].name = name; - if (visible == 0) - LAYER.layer_visibility(LAYER.layer_active); - LAYER.layers[LAYER.layer_active].opacity = opacity; - } + LAYER.layer_add(name); + //update attributes + LAYER.layers[LAYER.layer_active].title = title; + if (visible == 0) + LAYER.layer_visibility(LAYER.layer_active); + LAYER.layers[LAYER.layer_active].opacity = opacity; } LAYER.layer_renew(); diff --git a/js/gui.js b/js/gui.js index 80bed8b..af6015b 100644 --- a/js/gui.js +++ b/js/gui.js @@ -210,7 +210,7 @@ function GUI_CLASS() { //redraw preview area canvas_preview.save(); canvas_preview.scale(GUI.PREVIEW_SIZE.w / WIDTH, GUI.PREVIEW_SIZE.h / HEIGHT); - for (var i in LAYER.layers) { + for(var i = LAYER.layers.length-1; i >=0; i--){ if (LAYER.layers[i].visible == false) continue; canvas_preview.drawImage(document.getElementById(LAYER.layers[i].name), 0, 0, WIDTH, HEIGHT); diff --git a/js/layers.js b/js/layers.js index 4fea014..75f7105 100644 --- a/js/layers.js +++ b/js/layers.js @@ -27,7 +27,132 @@ function LAYER_CLASS() { //new layer this.layer_new = function () { - this.add_layer(); + this.layer_add(); + }; + + //removes all layers + this.remove_all_layers = function(){ + //delete old layers + for (var i = LAYER.layers.length-1; i >= 0; i--) { + LAYER.layer_remove(i, true); + } + layer_max_index = 0; + this.layer_renew(); + }; + + //create layer + this.layer_add = function (name, data) { + layer_max_index++; + + //save selected area + var copy = false; + var last_layer = LAYER.layer_active; + if (DRAW.select_data != false && data == undefined) { + copy = document.createElement("canvas"); + copy.width = DRAW.select_data.w; + copy.height = DRAW.select_data.h; + copy.getContext("2d").drawImage(canvas_active(true), DRAW.select_data.x, DRAW.select_data.y, DRAW.select_data.w, DRAW.select_data.h, 0, 0, DRAW.select_data.w, DRAW.select_data.h); + } + + if (data == undefined) { + //empty layer + if (name == undefined) { + name = 'Layer #' + (layer_max_index); + } + var new_layer = []; + new_layer.name = name; + new_layer.title = name; + new_layer.visible = true; + new_layer.opacity = 1; + LAYER.create_canvas(name); + this.layers.unshift(new_layer); + + //add selected data + if (DRAW.select_data != false) { + //copy user selected data to new layer + canvas_active().drawImage(copy, 0, 0); + + //clear selection + DRAW.select_data = false; + canvas_front.clearRect(0, 0, WIDTH, HEIGHT); + + //switch back to old layer + LAYER.layer_active = last_layer; + } + } + else { + var img = new Image(); + if (data.substring(0, 4) == 'http') + img.crossOrigin = "Anonymous"; //data from other domain - turn on CORS + var _this = this; + + img.onload = function () { + //check size + if (img.width > WIDTH || img.height > HEIGHT) { + if (img.width > WIDTH) + WIDTH = img.width; + if (img.height > HEIGHT) + HEIGHT = img.height; + LAYER.set_canvas_size(); + } + if (_this.layers.length == 1 && EVENTS.autosize == true) { + var trim_info = IMAGE.trim_info(document.getElementById(_this.layers[0].name)); + if (trim_info.left == WIDTH) { + _this.layer_remove(0, true); + WIDTH = img.width; + HEIGHT = img.height; + LAYER.set_canvas_size(false); + } + } + + for (var i in _this.layers) { + if (_this.layers[i].name == name) { + name = 'Layer #' + (layer_max_index); + } + } + LAYER.create_canvas(name); + _this.layers.unshift({ + name: name, + title: name, + visible: true, + opacity: 1 + }); + LAYER.layer_active = 0; + + document.getElementById(name).getContext("2d").globalAlpha = 1; + document.getElementById(name).getContext('2d').drawImage(img, 0, 0); + LAYER.layer_renew(); + IMAGE.zoom_auto(true); + GUI.redraw_preview(); + }; + img.onerror = function (ex) { + POP.add({html: 'The image could not be loaded.

'}); + if (data.substring(0, 4) == 'http') + POP.add({title: "Reason:", value: 'Cross-origin resource sharing (CORS) not supported. Try to save image first.'}); + POP.show('Error', '.'); + }; + img.src = data; + } + LAYER.layer_active = 0; + document.getElementById(this.layers[LAYER.layer_active].name).getContext("2d").globalAlpha = 1; + this.layer_renew(); + }; + + this.layer_remove = function (i, force) { + if (this.layers.length == 1 && force == undefined){ + //only 1 layer left + canvas_active().clearRect(0, 0, WIDTH, HEIGHT); + return false; + } + element = document.getElementById(this.layers[i].name); + element.getContext("2d").clearRect(0, 0, WIDTH, HEIGHT); + element.parentNode.removeChild(element); + + this.layers.splice(i, 1); + if (LAYER.layer_active == i) + LAYER.layer_active = Math.max(0, LAYER.layer_active-1); + this.layer_renew(); + GUI.redraw_preview(); }; //dublicate @@ -38,9 +163,8 @@ function LAYER_CLASS() { EDIT.copy_to_clipboard(); DRAW.select_data = false; canvas_front.clearRect(0, 0, WIDTH, HEIGHT); - var tmp = LAYER.layer_active; EDIT.paste('menu'); - LAYER.layer_active = tmp; + LAYER.layer_active = 0; LAYER.layer_renew(); } else { @@ -52,10 +176,10 @@ function LAYER_CLASS() { tmp_data.getContext("2d").drawImage(canvas_active(true), 0, 0); //create - var new_name = 'Layer #' + (layer_max_index + 1); + var new_name = 'Layer #' + (layer_max_index); LAYER.create_canvas(new_name); - this.layers.push({name: new_name, title: new_name, visible: true}); - LAYER.layer_active = this.layers.length - 1; + this.layers.unshift({name: new_name, title: new_name, visible: true}); + LAYER.layer_active = 0; canvas_active().drawImage(tmp_data, 0, 0); LAYER.layer_renew(); } @@ -172,7 +296,7 @@ function LAYER_CLASS() { "color-dodge", "color-burn", "hard-light", "soft-light", "difference", "exclusion", "hue", "saturation", "color", "luminosity"]; - if (parseInt(LAYER.layer_active) + 1 >= this.layers.length) { + if (LAYER.layer_active + 1 >= this.layers.length) { POP.add({html: 'This can not be last layer.'}); POP.show('Error', ''); return false; @@ -188,16 +312,18 @@ function LAYER_CLASS() { var param3 = response.param3; EDIT.save_state(); + //copy - LAYER.layer_active++; var tmp_data = document.createElement("canvas"); tmp_data.width = WIDTH; tmp_data.height = HEIGHT; tmp_data.getContext("2d").drawImage(LAYER.canvas_active(true), 0, 0); //paste - LAYER.layer_active--; LAYER.canvas_active().save(); + LAYER.canvas_active().clearRect(0, 0, WIDTH, HEIGHT); + LAYER.canvas_active().drawImage(document.getElementById(LAYER.layers[LAYER.layer_active + 1].name), 0, 0); + if (param3 == "Composite") LAYER.canvas_active().globalCompositeOperation = param1; else @@ -214,21 +340,18 @@ function LAYER_CLASS() { var param2 = response.param2; var param3 = response.param3; - //copy - LAYER.layer_active++; - var tmp_data = document.createElement("canvas"); - tmp_data.width = w; - tmp_data.height = h; - tmp_data.getContext("2d").drawImage(LAYER.canvas_active(true), 0, 0, WIDTH, HEIGHT, 0, 0, w, h); - //paste - LAYER.layer_active--; canvas_preview.save(); + canvas_preview.clearRect(0, 0, w, h); + LAYER.layer_active++; + canvas_preview.drawImage(LAYER.canvas_active(true), 0, 0, WIDTH, HEIGHT, 0, 0, w, h); + LAYER.layer_active--; + if (param3 == "Composite") canvas_preview.globalCompositeOperation = param1; else canvas_preview.globalCompositeOperation = param2; - canvas_preview.drawImage(tmp_data, 0, 0); + canvas_preview.drawImage(LAYER.canvas_active(true), 0, 0, WIDTH, HEIGHT, 0, 0, w, h); canvas_preview.restore(); } ); @@ -239,101 +362,29 @@ function LAYER_CLASS() { EDIT.save_state(); if (this.layers.length == 1) return false; + LAYER.layer_active = 0; tmp_data = document.createElement("canvas"); tmp_data.width = WIDTH; tmp_data.height = HEIGHT; - for (var i = 1; i < this.layers.length; i++) { + for (var i = this.layers.length-2; i >= 0; i--) { //copy LAYER.layer_active = i; tmp_data.getContext("2d").clearRect(0, 0, WIDTH, HEIGHT); tmp_data.getContext("2d").drawImage(canvas_active(true), 0, 0); //paste - LAYER.layer_active = 0; + LAYER.layer_active = this.layers.length-1; canvas_active().drawImage(tmp_data, 0, 0); } - for (var i = this.layers.length - 1; i > 0; i--) { - //delete layer + + //delete layers + for (var i = this.layers.length-2; i >= 0; i--) { LAYER.layer_active = i; LAYER.layer_remove(LAYER.layer_active); } LAYER.layer_renew(); }; - - //create layer - this.layer_add = function (name, data, type) { - tmp = new Array(); - layer_max_index++; - if (data == undefined) { - //empty layer - if (name == undefined) { - name = 'Layer #' + (layer_max_index + 1); - } - tmp.name = name; - tmp.title = name; - tmp.visible = true; - tmp.opacity = 1; - if (this.layers.length == 0) - tmp.primary = 1; - else - LAYER.create_canvas(name); - this.layers.push(tmp); - } - else { - var img = new Image(); - if (data.substring(0, 4) == 'http') - img.crossOrigin = "Anonymous"; //data from other domain - turn on CORS - var _this = this; - img.onload = function () { - //check size - if (img.width > WIDTH || img.height > HEIGHT) { - if (img.width > WIDTH) - WIDTH = img.width; - if (img.height > HEIGHT) - HEIGHT = img.height; - LAYER.set_canvas_size(); - } - if (_this.layers.length == 1 && EVENTS.autosize == true) { - var trim_info = IMAGE.trim_info(document.getElementById(_this.layers[0].name)); - if (trim_info.left == WIDTH) { - WIDTH = img.width; - HEIGHT = img.height; - LAYER.set_canvas_size(false); - } - } - - for (var i in _this.layers) { - if (_this.layers[i].name == name) { - name = 'Layer #' + (layer_max_index + 1); - } - } - LAYER.create_canvas(name); - _this.layers.push({ - name: name, - title: name, - visible: true, - opacity: 1 - }); - LAYER.layer_active = _this.layers.length - 1; - - document.getElementById(name).getContext("2d").globalAlpha = 1; - document.getElementById(name).getContext('2d').drawImage(img, 0, 0); - LAYER.layer_renew(); - IMAGE.zoom_auto(true); - GUI.redraw_preview(); - }; - img.onerror = function (ex) { - POP.add({html: 'The image could not be loaded.

'}); - if (data.substring(0, 4) == 'http') - POP.add({title: "Reason:", value: 'Cross-origin resource sharing (CORS) not supported. Try to save image first.'}); - POP.show('Error', '.'); - }; - img.src = data; - } - LAYER.layer_active = this.layers.length - 1; - document.getElementById(this.layers[LAYER.layer_active].name).getContext("2d").globalAlpha = 1; - this.layer_renew(); - }; + this.create_canvas = function (canvas_id) { var new_canvas = document.createElement('canvas'); new_canvas.setAttribute('id', canvas_id); @@ -354,51 +405,39 @@ function LAYER_CLASS() { this.move_layer = function (direction) { if (this.layers.length < 2) return false; - if (this.layers[LAYER.layer_active].primary == 1) - return false; - LAYER.layer_active = parseInt(LAYER.layer_active); - - var layer_from = this.layers[LAYER.layer_active]; - var content = document.getElementById(this.layers[LAYER.layer_active].name); - var parent = content.parentNode; + var layer_from = this.layers[this.layer_active]; + var parent = document.getElementById('canvas_more'); + var content = document.getElementById(this.layers[this.layer_active].name); if (direction == 'up') { - if (this.layers[LAYER.layer_active - 1] == undefined) + if (this.layer_active == 0) return false; - if (this.layers[LAYER.layer_active - 1].primary == 1) - return false; - var layer_to = this.layers[LAYER.layer_active - 1]; - parent.insertBefore(content, parent.firstChild); + var layer_to = this.layers[this.layer_active - 1]; + + if(this.layer_active != 1) + parent.insertBefore(content, document.getElementById(this.layers[this.layer_active-2].name)); + else + parent.insertBefore(content, null); + + this.layer_active--; } - else { - if (this.layers[LAYER.layer_active + 1] == undefined) + else if(direction == 'down') { + if (this.layer_active == this.layers.length-1) return false; - var layer_to = this.layers[LAYER.layer_active + 1]; - var content = document.getElementById(this.layers[LAYER.layer_active + 1].name); - parent.insertBefore(content, parent.firstChild); + + parent.insertBefore(content, document.getElementById(this.layers[this.layer_active+1].name)); + + this.layer_active++; + } + //switch attribures + var layer_to = this.layers[this.layer_active]; + for(var i in layer_to){ + var tmp = layer_to[i]; + layer_to[i] = layer_from[i]; + layer_from[i] = tmp; } - //switch name - var tmp = layer_to.name; - layer_to.name = layer_from.name; - layer_from.name = tmp; - //switch visible - var tmp = layer_to.visible; - layer_to.visible = layer_from.visible; - layer_from.visible = tmp; - //switch opacity - var tmp = layer_to.opacity; - layer_to.opacity = layer_from.opacity; - layer_from.opacity = tmp; - - LAYER.layer_active = this.layers.length - 1; - for (var i in this.layers) { - if (this.layers[i].name == layer_to.name) { - LAYER.layer_active = i; - break; - } - } this.layer_renew(); GUI.zoom(); return true; @@ -417,19 +456,7 @@ function LAYER_CLASS() { this.layer_renew(); GUI.redraw_preview(); }; - this.layer_remove = function (i) { - if (this.layers[i].primary == 1) - return false; - element = document.getElementById(this.layers[i].name); - element.getContext("2d").clearRect(0, 0, WIDTH, HEIGHT); - element.parentNode.removeChild(element); - this.layers.splice(i, 1); - if (LAYER.layer_active >= this.layers.length) - LAYER.layer_active = this.layers.length - 1; - this.layer_renew(); - GUI.redraw_preview(); - }; this.layer_move_active = function (x, y) { var distance = 10; if (EVENTS.ctrl_pressed == true) @@ -446,7 +473,7 @@ function LAYER_CLASS() { }; this.select_layer = function (i) { if (LAYER.layer_active != i) { - LAYER.layer_active = i; //select + LAYER.layer_active = parseInt(i); //select this.layer_renew(); } LAYER.shake(i); @@ -461,11 +488,7 @@ function LAYER_CLASS() { html += '
'; var title = this.layers[i].title; html += '' + HELPER.escapeHtml(title) + ''; - if (this.layers[i].primary != 1) { - html += ''; - } - else - html += ''; + html += ''; //hide if (this.layers[i].visible == true) html += ''; @@ -614,44 +637,10 @@ function LAYER_CLASS() { ); }; this.canvas_active = function (base) { - for (var i in this.layers) { - if (LAYER.layer_active == i) { - if (base == undefined) - return document.getElementById(this.layers[i].name).getContext("2d"); - else - return document.getElementById(this.layers[i].name); - } - } - }; - - this.add_layer = function () { - EDIT.save_state(); - - var tmp = false; - var last_layer = LAYER.layer_active; - if (DRAW.select_data != false) { - tmp = document.createElement("canvas"); - tmp.width = DRAW.select_data.w; - tmp.height = DRAW.select_data.h; - tmp.getContext("2d").drawImage(canvas_active(true), DRAW.select_data.x, DRAW.select_data.y, DRAW.select_data.w, DRAW.select_data.h, 0, 0, DRAW.select_data.w, DRAW.select_data.h); - } - - //crete layer - LAYER.layer_add(); - - if (DRAW.select_data != false) { - //copy user selected data to new layer - canvas_active().drawImage(tmp, 0, 0); - LAYER.layer_renew(); - - //clear selection - DRAW.select_data = false; - canvas_front.clearRect(0, 0, WIDTH, HEIGHT); - - //switch back to old layer - LAYER.layer_active = last_layer; - LAYER.layer_renew(); - } + if (base == undefined) + return document.getElementById(LAYER.layers[LAYER.layer_active].name).getContext("2d"); + else + return document.getElementById(LAYER.layers[LAYER.layer_active].name); }; this.calc_differences = function (sensitivity, canvas_preview, w, h) { @@ -714,13 +703,5 @@ function LAYER_CLASS() { } function canvas_active(base) { - for (var i in LAYER.layers) { - if (LAYER.layer_active == i) { - if (base == undefined) - return document.getElementById(LAYER.layers[i].name).getContext("2d"); - else - return document.getElementById(LAYER.layers[i].name); - } - } - console.log('Error, can not find active layer.'); + return LAYER.canvas_active(base); } diff --git a/js/main.js b/js/main.js index 5e017d9..288f1dd 100644 --- a/js/main.js +++ b/js/main.js @@ -1,5 +1,5 @@ /* global HELPER, EVENTS, LAYER, POP, FILE, GUI, DRAW */ -/* global WIDTH, HEIGHT, canvas_main, canvas_back, canvas_grid, COLOR, ALPHA */ +/* global WIDTH, HEIGHT, canvas_back, canvas_grid, COLOR, ALPHA */ var MAIN = new MAIN_CLASS(); document.onload = MAIN.init(true); @@ -23,12 +23,9 @@ function MAIN_CLASS() { }; DRAW.select_data = false; - for (var i = LAYER.layers.length-1; i>0; i--) { - LAYER.layer_remove(i); - } + LAYER.remove_all_layers(); LAYER.layers = []; - canvas_main.clearRect(0, 0, WIDTH, HEIGHT); - LAYER.layer_add("Background"); + LAYER.layer_add(); LAYER.set_canvas_size(); GUI.draw_background(canvas_back, WIDTH, HEIGHT); document.getElementById("canvas_preview").width = GUI.PREVIEW_SIZE.w; diff --git a/js/tools.js b/js/tools.js index 799e86d..7449c7f 100644 --- a/js/tools.js +++ b/js/tools.js @@ -135,7 +135,7 @@ function TOOLS_CLASS() { tmp.height = HEIGHT; var W = WIDTH; var H = HEIGHT; - for (var i in LAYER.layers) { + for(var i = LAYER.layers.length-1; i >=0; i--){ if (i == LAYER.layer_active) continue; //end if (LAYER.layers[i].visible == false)