From 17a8409a680b6ebe0d9c59dfd9c26b0640da2a52 Mon Sep 17 00:00:00 2001 From: Mahdi Dibaiee Date: Sun, 2 Feb 2014 23:46:28 +0330 Subject: [PATCH] Undo/Redo --- css/main.less | 7 ++++ img/icons/1.png | Bin 0 -> 48026 bytes img/icons/demo1.png | Bin 0 -> 7287 bytes index.html | 5 ++- js/functions.js | 82 +++++++++++++++++++++++++++++++++++++------- js/main.js | 37 +++++++++++--------- manifest.webapp | 26 ++++++++++++++ 7 files changed, 127 insertions(+), 30 deletions(-) create mode 100644 img/icons/1.png create mode 100644 img/icons/demo1.png create mode 100644 manifest.webapp diff --git a/css/main.less b/css/main.less index 15b4769..a6fcb61 100644 --- a/css/main.less +++ b/css/main.less @@ -10,8 +10,15 @@ html, body { outline: none; } +div#container { + position: absolute; +} + canvas { border: 1px solid gray; + position: absolute; + top: 0; + left: 0; } header { diff --git a/img/icons/1.png b/img/icons/1.png new file mode 100644 index 0000000000000000000000000000000000000000..9ece55688f94e302e6551b9e9ff2df318178d8b6 GIT binary patch literal 48026 zcmeEs_g7Qd_jU*bh9Fo7phUnjLIlA=?+6H^2qcn(UL2HOL=3$J4Tu=fVML`Dm5@-S z_Y4XQ(uL4FQVas2gkIk34B~wLgZGE;S&PNWJ?EaX%d?-o&y7GD=yF2^p&$^5`}%L% zw?H6{b`Xd)^S5! z8=t$w@7FI0Mm$N=F@_l%Uq{1a>y^dR($bEypvojp{lfG2JzWhH8hC7#=Al1+F0NEG zzF&_v{~?euJ1mT1doZ<~QDL1+HuBtD`I^+m`tAwcFt}y}3~b^5+W$%5|0M8#68Jv} z{C^^W-raA=A#eJT{q0;L2$3I>)5#ymJMW0B`wt7GjaA<&Wo~LPXPjEzMC?Dc(U}tL zoHWLckljeaR~*mmKYsPxlEO-9p?Onkveo`@^xS`p#WQKUMB29zN7!_7tLx9l{>EF_ z1=8-j&9Ak|x;IaJk6hoI-R&HY58L`Q9BqvfOdhtLlf5nVZx85I#0LEY4MXc8*HF}~ z6D_jiFA3~-HGiz4c#?CmBRSQmArm3FyNDm}0Ox9u#TEuvY+h#$(T8aDoSrQI_EDQv zaxdTA?W_-6HYYdO>nrcSLiuQoRVVKnGZX3S^xL$-KU4QRY_P+9ujKZUY0(s8>{^1% z(f#Mm?H;rmS<%*DvnpBV{{7ia&UulntamCm)oE?y7TWgDSz>q7HZ$mZ*gcCx(>c|j z@=F!Nsyp6H*we!WG5@}qxUYn~8!9QA1N2~dx5N>Xs!}uMpGSK!M0Q8-rC;_4GGbQK zch9%|SQ;XSPNwWuZ8|au^h!FDrYhPD+25;lzHL$FrYSR>9#5O1|4C;!z5JT?LmmWDgF#R>n z;6Fp?8#FlOu>7axXyYDiykOnN37Rt5{_fJr{k`(hpVK7Bk-!mNqF>70SUD`?mXvHJ zG-$HOvwvWT)@owovJsqjT0r*6vV=fVaF$Y;pIMPz+SC0JdHOBJy4Va%vP+hudR2Ma zWy0=rdb5u2{FLI4Il5!Wa0*<*Ht$q%wKX-8)RPr!e`3{mzg+6QjV~&1t#_r422B7Q^bIIc^GY?=NaM zy;4tKO_qDtrjAN9uPXNY@~CXT%f?O)tDY5fYbTKT!pRf&0C%s*tK4C~^OACp@m{yd z&~7%}h~`hW$9O0H#D`{2vWUEBTg`yUNYJO+*$Tr~TtAkhcM>b6M{=u8EG?_v_1l*J z_G3PCU5vFeY-WVwMlv7?$5tFz@|oo9pk9-aT^c=se)*@{T{Fn4M(%v~Ry~?Wng6~W zP{o(u(#>h=z4($8U1c_y zjvVZ1DSVB{HMbU$Bdvi(FDkA=y2n; zS65&^cJ=w8AY^ljPNsjRTha-dA6-S@@q)=qq;3lZTnhFNk3|5214u-i8}5xY6`86XfC@J{V#79p?uGRn)# z-z!xq-5y)~OmBDk@StOVdp2IHfDU`m0$4F@25=;Mw0E+U;E%nxo`p|tyaP~gjf?VutSYMaqf>h24SkcoUC+IuM_Drt?s%oK zxAPN7znw%|A`^`g0s9Snqm<)k$9(*sPL=mc1)IIK$qSCKnQ3erSyA6|39&w&|Bccon?ZcW=`8;lo7Nvi*Oa|^rocGHGAMc<}> zqp#F!Z*oyAGoU|Qx!`@ZpD8npPO2AQJB$&KbxW-&-;8Pe`~&+B&0!KPs;VzX1bN|Z z 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 NUfjYCQ*#>3*FP1z8b|;D literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 3689c33..df69f90 100644 --- a/index.html +++ b/index.html @@ -14,7 +14,10 @@ - +

+ + +
diff --git a/js/functions.js b/js/functions.js index f227afe..de4ea5a 100644 --- a/js/functions.js +++ b/js/functions.js @@ -6,11 +6,8 @@ function sizeAndPos() { var data = c.getImageData(0,0, $c.width(), $c.height()); var w = $(window).width(), h = $(window).height(); - $c.css({'margin-left': w * .05, - 'margin-top': h * .05 - }) - $c.attr('width', w * .9); - $c.attr('height',h * .9 - 50); + $c.attr('width', w); + $c.attr('height',h - 50); c.clearRect(0,0, $c.width(), $c.height()); c.putImageData(data, 0, 0); } @@ -28,8 +25,10 @@ function threshold(x1, y1, x2, y2, threshold) { return false; } -function line(x1, y1, x2, y2, opts) { +function line(x1, y1, x2, y2, opts, overlay) { opts = opts || {}; + var c = window.c; + if( overlay ) var c = window.o; c.beginPath(); c.lineCap = opts.lineCap || settings.lineCap; c.lineJoin = opts.lineJoin || settings.lineJoin; @@ -40,13 +39,47 @@ function line(x1, y1, x2, y2, opts) { c.stroke(); } +function erase(x1, y1, x2, y2, overlay) { + var c = window.c; + if( overlay ) var c = window.o; + c.clearRect(x1, y1, x2 - x1, y2 - y1); +} + +function undo() { + var history = window.points.history; + if( history.last > 1 ) { + var step = history[history.last-1]; + c.putImageData(step.data, 0, 0); + window.points = step.points.slice(0); + window.points.history = history; + window.points.history.last = history.last-1; + } else { + c.clearRect(0,0, $c.width(), $c.height()); + window.points = []; + window.points.history = history; + window.points.history.last = 0; + } + +} + +function redo() { + var history = window.points.history; + if( history.last < history.length-1 ) { + var step = history[history.last+1]; + c.putImageData(step.data, 0, 0); + window.points = step.points.slice(0); + window.points.history = history; + window.points.history.last = history.last+1; + } +} + /*** END ***/ function startPoint(x, y) { - // If not previous point exists, make the first one. - if( !points.length ) points.push({x: x, y: y, type: settings.type, start: {x: x, y: y}}); + // If no previous point exists, make the first one. + if( !points.length ) points.push({x: x, y: y, type: '', start: {x: x, y: y}}); var old = points[points.length-1], start = old.start, @@ -56,10 +89,12 @@ function startPoint(x, y) { start : old.start || {x: x, y: y}, type : settings.type } - // Just draws a circle - line(x,y,x,y); + if( old.type !== 'line' && current.type == 'line' ) { + line(x,y,x,y, {lineWidth: 5, strokeStyle: 'red'}, true); + } if( old.type == 'line' ) { + if( points[points.indexOf(old)-1].type !== 'line' ) erase(old.x-5, old.y-5, old.x+5, old.y+5, true); line(old.x, old.y, x, y); } @@ -70,6 +105,10 @@ function startPoint(x, y) { return; } + if(current.type == 'ribbon') { + settings.ribbonTimes = 1; + } + points.push(current); } @@ -101,7 +140,7 @@ function drawPoint(x,y) { points.push(current); for( var i = 0, len = points.length-1; i < len; i++ ) { - if( threshold(points[i].x, points[i].y, current.x, current.y, 40)) { + if(threshold(points[i].x, points[i].y, current.x, current.y, 40)) { var x = points[i].x - current.x, y = points[i].y - current.y; @@ -110,7 +149,26 @@ function drawPoint(x,y) { } break; } + case 'fur': { + line(capture.x, capture.y, x, y); + var current = { + x : x, + y : y, + start : capture.start, + type : capture.type + } + points.push(current); + + for( var i = 0, len = points.length-1; i < len; i++ ) { + if(threshold(points[i].x, points[i].y, current.x, current.y, 40)) { + var x = points[i].x - current.x, + y = points[i].y - current.y; + var l = settings.furLength || 0.2; + line(points[i].x + x*l, points[i].y + y*l, current.x - x*l, current.y - y*l, {strokeStyle: 'rgba(0,0,0,0.4)', lineWidth: settings.lineWidth/2}) + } + } + break; + } } } - diff --git a/js/main.js b/js/main.js index 44cd40a..7bcf841 100644 --- a/js/main.js +++ b/js/main.js @@ -1,47 +1,50 @@ "use strict"; $(document).ready(function() { - window.c = $('canvas')[0].getContext('2d'); + window.c = $('canvas')[0].getContext('2d'); + window.o = $('canvas')[1].getContext('2d'); window.settings = { lineWidth : 0.2, strokeStyle : 'black', type: 'sketch', lineCap: 'round', - lineJoin: 'round' + lineJoin: 'round', + ribbonEnd: 50, + ribbonTurn : 0 }; window.points = []; window.$c = $('canvas'); + window.points.history = [{ data: c.createImageData($c.width(), $c.height()), points: []}]; sizeAndPos(); $(window).resize(sizeAndPos); - $c.bind('mousedown', function(e) { + $c.last().bind('mousedown touchstart', function(e) { e.preventDefault(); + if( e.changedTouches ) e = e.changedTouches[0]; var xy = relative(e.pageX, e.pageY); startPoint(xy.x, xy.y); window.active = true; - }).bind('mousemove', function(e) { + }).bind('mousemove touchmove', function(e) { e.preventDefault(); if (!window.active || settings.type == 'line') return; + if( e.changedTouches ) e = e.changedTouches[0]; var xy = relative(e.pageX, e.pageY); drawPoint(xy.x, xy.y); }).bind('mouseup touchend', function(e) { e.preventDefault(); window.active = false; - }).bind('touchstart', function(e) { - e.preventDefault(); - var touch = e.changedTouches[0]; - var xy = relative(touch.pageX, touch.pageY); - startPoint(xy.x, xy.y); - window.active = true; - }).bind('touchmove', function(e) { - e.preventDefault(); - if(!window.active || settings.type =='line') return; - var touch = e.changedTouches[0]; - var xy = relative(touch.pageX, touch.pageY); - drawPoint(xy.x, xy.y); - window.active = true; + + if(window.points.history.last < window.points.history.length-1) { + window.points.history.splice(window.points.history.last+1); + } + + window.points.history.push({ + data: c.getImageData(0, 0, $c.width(), $c.height()), + points: window.points.slice(0) + }) + window.points.history.last = window.points.history.length-1; }) }) diff --git a/manifest.webapp b/manifest.webapp new file mode 100644 index 0000000..ea81b9b --- /dev/null +++ b/manifest.webapp @@ -0,0 +1,26 @@ +{ + "name": "Sketchy", + "description": "Free Sketch/Paint app", + "version": 1, + "launch_path": "/index.html", + "icons": { + "16": "/images/logo16.png", + "32": "/images/logo32.png", + "48": "/images/logo48.png", + "60": "/images/logo60.png", + "64": "/images/logo64.png", + "90": "/images/logo90.png", + "120": "/images/logo120.png", + "128": "/images/logo128.png" + }, + "developer": { + "name": "Mahdi Dibaiee", + "url": "https://twitter.com/mdibaiee" + }, + "locales": { + "fa": { + "name": "Sketchy", + "description": "برنامه‌ی رایگان طراحی/نقاشی" + } + } +}