Compare commits

...

646 Commits

Author SHA1 Message Date
Jeffrey Warren
daaada1a9d Merge branch 'main' into edge-detect-horizontal 2020-10-17 11:35:08 -04:00
Adam G
8c461bbeee Make the site responsive (#1382)
* Removed line 47 & 68, added line 154

* Line 61 removed inline styles from header

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-10-17 11:34:18 -04:00
Jeffrey Warren
94b9330284 Merge branch 'main' into edge-detect-horizontal 2020-10-17 11:22:55 -04:00
dependabot-preview[bot]
11478ce421 Bump lodash from 4.17.19 to 4.17.20 (#1720)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.19 to 4.17.20.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.19...4.17.20)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
2020-10-17 11:16:52 -04:00
Harsh Khandeparkar
4fa11d3011 Merge branch 'main' into edge-detect-horizontal 2020-10-17 19:28:57 +05:30
dependabot-preview[bot]
fa02c9f1c4 Bump jsqr from 1.2.0 to 1.3.1
Bumps [jsqr](https://github.com/cozmo/jsQR) from 1.2.0 to 1.3.1.
- [Release notes](https://github.com/cozmo/jsQR/releases)
- [Commits](https://github.com/cozmo/jsQR/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-17 06:51:12 +00:00
Jeffrey Warren
1742f28cbb Merge branch 'main' into edge-detect-horizontal 2020-10-16 17:06:30 -04:00
Shazeb Ata
f4baebd7c7 Change dimension upon loading through camera (#1456)
Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-10-16 16:56:40 -04:00
dependabot-preview[bot]
d0172f91ff Bump @babel/plugin-proposal-object-rest-spread from 7.11.0 to 7.12.1 (#1726)
Bumps [@babel/plugin-proposal-object-rest-spread](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-proposal-object-rest-spread) from 7.11.0 to 7.12.1.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.1/packages/babel-plugin-proposal-object-rest-spread)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-10-16 11:16:42 -04:00
HarshKhandeparkar
827b8a8a55 test: fix edge detect tests 2020-10-16 13:46:23 +05:30
HarshKhandeparkar
af411968fa fix: edge detect horizontal angle fixed 2020-10-16 13:35:49 +05:30
Shazeb Ata
c0cf8798a7 Hide ui on each draw (#1559)
Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
2020-10-16 10:24:57 +05:30
Rishabh Shukla
d33afe09da refactored resize (#1562)
Co-authored-by: h <f>
Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-10-16 10:04:59 +05:30
Akshay Gupta
1713751728 Colorbar module default overlay shift fixed (#1542)
* Fixes #1538

* Fixes #1538

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
2020-10-16 09:48:55 +05:30
Harsh Khandeparkar
a7993d5f7b Text Overlay Works (#1561)
Co-authored-by: Rishabh Shukla <42492389+blurry-x-face@users.noreply.github.com>
2020-10-16 08:55:11 +05:30
Mansi Sharma
31eaba8912 Updated config.yml according to plots2 file (#1566)
* Updated config.yml according to plots2 file

* Corrected according to suggestions

* minor change

* minor change

* minor change

* minor change

* minor change

* minor changes

Co-authored-by: sharmamansi <mansisharma785622gmail.com>
Co-authored-by: Rishabh Shukla <42492389+blurry-x-face@users.noreply.github.com>
Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
2020-10-16 01:20:53 +05:30
Naimish Rastogi
c372b7d950 VersionText color change (#1567)
Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-10-15 11:19:23 -04:00
dependabot-preview[bot]
765dbc5c9c Bump jasmine from 3.5.0 to 3.6.1 (#1723)
Bumps [jasmine](https://github.com/jasmine/jasmine-npm) from 3.5.0 to 3.6.1.
- [Release notes](https://github.com/jasmine/jasmine-npm/releases)
- [Commits](https://github.com/jasmine/jasmine-npm/compare/v3.5.0...v3.6.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-10-15 07:42:48 -04:00
Harsh Khandeparkar
8e3abcccd6 Create CODEOWNERS (#1719)
* Create CODEOWNERS

* Update .github/CODEOWNERS

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>

* Update .github/CODEOWNERS

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>

* Update .github/CODEOWNERS

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-10-14 19:47:56 -04:00
dependabot-preview[bot]
68a0995997 Bump @babel/core from 7.9.0 to 7.12.0 (#1721)
Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.9.0 to 7.12.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.12.0/packages/babel-core)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-10-14 19:05:04 -04:00
Jeffrey Warren
47fd8fe6db bump tape-run to ^8.0.0 (#1722) 2020-10-14 18:42:40 -04:00
dependabot-preview[bot]
2914aaef70 Bump jpegtran-bin from 4.0.0 to 5.0.2 (#1699)
Bumps [jpegtran-bin](https://github.com/imagemin/jpegtran-bin) from 4.0.0 to 5.0.2.
- [Release notes](https://github.com/imagemin/jpegtran-bin/releases)
- [Commits](https://github.com/imagemin/jpegtran-bin/compare/v4.0.0...v5.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-10-14 16:09:50 -04:00
dependabot-preview[bot]
e2dd5a7309 Bump imagemin-pngquant from 8.0.0 to 9.0.1 (#1715)
Bumps [imagemin-pngquant](https://github.com/imagemin/imagemin-pngquant) from 8.0.0 to 9.0.1.
- [Release notes](https://github.com/imagemin/imagemin-pngquant/releases)
- [Commits](https://github.com/imagemin/imagemin-pngquant/compare/v8.0.0...v9.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-10-14 16:02:20 -04:00
dependabot-preview[bot]
eb497e1a62 [Security] Bump bl from 1.2.2 to 1.2.3
Bumps [bl](https://github.com/rvagg/bl) from 1.2.2 to 1.2.3. **This update includes a security fix.**
- [Release notes](https://github.com/rvagg/bl/releases)
- [Commits](https://github.com/rvagg/bl/compare/v1.2.2...v1.2.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-10-06 15:55:34 +00:00
bajajvinamr
8a929c4b4d Update defaultHtmlSequencerUi.js (#1712)
Fixed Module Selector dropdown showing error in console publiclab#1531

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-10-01 16:29:40 -04:00
Jeffrey Warren
b95af7672c Update README.md 2020-10-01 12:57:54 -04:00
dependabot-preview[bot]
eb5672c433 [Security] Bump decompress from 4.2.0 to 4.2.1
Bumps [decompress](https://github.com/kevva/decompress) from 4.2.0 to 4.2.1. **This update includes a security fix.**
- [Release notes](https://github.com/kevva/decompress/releases)
- [Commits](https://github.com/kevva/decompress/compare/v4.2.0...v4.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-09-21 21:51:45 +00:00
dependabot-preview[bot]
c0b9f88818 Bump lint-staged from 10.1.3 to 10.2.11
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.1.3 to 10.2.11.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.1.3...v10.2.11)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-05 23:31:58 +00:00
dependabot-preview[bot]
4810a3b975 Bump gpu.js from 2.9.4 to 2.9.5
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.9.4 to 2.9.5.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/commits/2.9.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-04 15:51:26 +00:00
dependabot-preview[bot]
07c6d1497a Bump lodash from 4.17.15 to 4.17.19 (#1697)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-08-04 11:15:24 -04:00
dependabot-preview[bot]
8ddf05f0bc Bump @babel/plugin-proposal-object-rest-spread from 7.8.3 to 7.11.0
Bumps [@babel/plugin-proposal-object-rest-spread](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-proposal-object-rest-spread) from 7.8.3 to 7.11.0.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/commits/v7.11.0/packages/babel-plugin-proposal-object-rest-spread)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-04 03:19:53 +00:00
dependabot-preview[bot]
456a22a845 [Security] Bump elliptic from 6.4.1 to 6.5.3
Bumps [elliptic](https://github.com/indutny/elliptic) from 6.4.1 to 6.5.3. **This update includes a security fix.**
- [Release notes](https://github.com/indutny/elliptic/releases)
- [Commits](https://github.com/indutny/elliptic/compare/v6.4.1...v6.5.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-08-04 03:12:35 +00:00
dependabot-preview[bot]
740693b655 Bump geotiff from 1.0.0-beta.6 to 1.0.0-beta.13 (#1677)
Bumps [geotiff](https://github.com/geotiffjs/geotiff.js) from 1.0.0-beta.6 to 1.0.0-beta.13.
- [Release notes](https://github.com/geotiffjs/geotiff.js/releases)
- [Commits](https://github.com/geotiffjs/geotiff.js/compare/v1.0.0-beta.6...v1.0.0-beta.13)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-07-12 16:14:07 -04:00
Shazeb Ata
23ddf1fce0 Added test for Apply button (#1579)
* Added test for Apply button

* Refactored

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-07-12 16:03:10 -04:00
Jeffrey Warren
b7eb9cfc45 update gitpod badge URL due to referrer issues
https://github.com/gitpod-io/gitpod/issues/688
2020-07-11 13:26:59 -04:00
Yogesh Sharma
da9b167258 Updated Link (#1627)
Co-authored-by: Rishabh Shukla <42492389+blurry-x-face@users.noreply.github.com>
Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-07-11 10:56:39 -04:00
dependabot-preview[bot]
3b6eac4a96 Bump gpu.js from 2.9.3 to 2.9.4
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.9.3 to 2.9.4.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-10 21:45:20 +00:00
dependabot-preview[bot]
8367f4bc26 Bump jsdom from 15.2.1 to 16.3.0 (#1691)
Bumps [jsdom](https://github.com/jsdom/jsdom) from 15.2.1 to 16.3.0.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/15.2.1...16.3.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-07-10 14:50:53 -04:00
dependabot-preview[bot]
a5abbeaf76 Bump imagemin-jpegtran from 6.0.0 to 7.0.0
Bumps [imagemin-jpegtran](https://github.com/imagemin/imagemin-jpegtran) from 6.0.0 to 7.0.0.
- [Release notes](https://github.com/imagemin/imagemin-jpegtran/releases)
- [Commits](https://github.com/imagemin/imagemin-jpegtran/compare/v6.0.0...v7.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-07 21:23:59 +00:00
Jeffrey Warren
d55752827d Update .travis.yml 2020-07-07 18:58:58 +00:00
dependabot-preview[bot]
1658220198 Bump jest from 25.1.0 to 26.1.0
Bumps [jest](https://github.com/facebook/jest) from 25.1.0 to 26.1.0.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/compare/v25.1.0...v26.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-07-07 18:58:58 +00:00
Jeffrey Warren
54722a35f7 Update README.md (#1688) 2020-07-07 14:43:59 -04:00
Harsh Khandeparkar
eb381555c4 Edge Detect Fixed! (#1629)
* FIX!

* fix the test

* trigger travis

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-07-07 11:52:12 -04:00
Jeffrey Warren
917979267a Update .gitpod.yml to include gitpod dependencies in a mini dockerfile (#1685)
* Update .gitpod.yml

* Create .gitpod.dockerfile

* Update .gitpod.dockerfile

* Update .gitpod.dockerfile

* Update .gitpod.dockerfile

* Update .gitpod.dockerfile
2020-07-07 10:15:25 -04:00
dependabot-preview[bot]
fb303a8ca9 [Security] Bump websocket-extensions from 0.1.3 to 0.1.4 (#1671)
Bumps [websocket-extensions](https://github.com/faye/websocket-extensions-node) from 0.1.3 to 0.1.4. **This update includes a security fix.**
- [Release notes](https://github.com/faye/websocket-extensions-node/releases)
- [Changelog](https://github.com/faye/websocket-extensions-node/blob/master/CHANGELOG.md)
- [Commits](https://github.com/faye/websocket-extensions-node/compare/0.1.3...0.1.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-07-07 00:20:51 -04:00
Jeffrey Warren
102b82bd34 Split tests into separate Travis jobs with better labeling (#1684)
* Split tests into separate Travis jobs with better labeling

* format test browserification

* more descriptive labels

* combine grunt browserify of tests and the run of those tests
2020-07-07 00:03:02 -04:00
dependabot-preview[bot]
222d217d6d Bump tape-run from 6.0.1 to 7.0.0 (#1662)
Bumps [tape-run](https://github.com/juliangruber/tape-run) from 6.0.1 to 7.0.0.
- [Release notes](https://github.com/juliangruber/tape-run/releases)
- [Changelog](https://github.com/juliangruber/tape-run/blob/master/History.md)
- [Commits](https://github.com/juliangruber/tape-run/compare/v6.0.1...v7.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-07-06 11:50:29 -04:00
Jeffrey Warren
ef3afc00e2 .gitpod.yml - default branch prebuilds are on by default so removing
this also undoes #1680
2020-07-06 08:57:33 -04:00
Jeffrey Warren
325a5660d5 update gitpod conf to main branch? (#1680) 2020-07-05 18:22:46 -04:00
dependabot-preview[bot]
21a7dd4e4c Bump buffer from 5.4.3 to 5.6.0 (#1661)
Bumps [buffer](https://github.com/feross/buffer) from 5.4.3 to 5.6.0.
- [Release notes](https://github.com/feross/buffer/releases)
- [Commits](https://github.com/feross/buffer/compare/v5.4.3...v5.6.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-07-05 18:02:23 -04:00
Nisar Hassan Naqvi
feba2e72b7 simplify code contributions by fully automating the dev setup. (#1668)
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-07-05 17:46:17 -04:00
Jeffrey Warren
1926c01fd6 color halftone and module test (#1678) 2020-07-05 17:00:53 -04:00
dependabot-preview[bot]
b05e1eb198 Bump grunt from 1.0.4 to 1.1.0 (#1660)
Bumps [grunt](https://github.com/gruntjs/grunt) from 1.0.4 to 1.1.0.
- [Release notes](https://github.com/gruntjs/grunt/releases)
- [Changelog](https://github.com/gruntjs/grunt/blob/master/CHANGELOG)
- [Commits](https://github.com/gruntjs/grunt/compare/v1.0.4...v1.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-07-05 16:42:01 -04:00
dependabot-preview[bot]
52d923dac5 [Security] Bump handlebars from 4.5.3 to 4.7.6 (#1670)
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.5.3 to 4.7.6. **This update includes a security fix.**
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/handlebars-lang/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.5.3...v4.7.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
2020-06-30 15:25:54 -04:00
dependabot-preview[bot]
0875df2bec Bump gpu.js from 2.6.6 to 2.9.3 (#1656) 2020-04-15 07:42:35 +00:00
dependabot-preview[bot]
e15d063a1a [Security] Bump ecstatic from 4.1.2 to 4.1.4 (#1655) 2020-04-15 07:01:04 +00:00
dependabot-preview[bot]
d431b836f7 Bump @babel/core from 7.8.3 to 7.9.0 (#1645) 2020-04-15 06:45:40 +00:00
dependabot-preview[bot]
6c615ed227 Bump lint-staged from 10.0.3 to 10.1.3
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 10.0.3 to 10.1.3.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v10.0.3...v10.1.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-04-14 21:00:35 +00:00
Deogle
600cce0be3 Removed all instances of mode: 'test' (#1599) 2020-01-31 10:58:12 -05:00
keshav234156
5f745ef4bd preview optimization (#1573)
Co-authored-by: Rishabh Shukla <42492389+blurry-x-face@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-29 10:48:23 -05:00
dependabot-preview[bot]
28cedd72a6 Bump @babel/core from 7.7.7 to 7.8.3
Bumps [@babel/core](https://github.com/babel/babel) from 7.7.7 to 7.8.3.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.7.7...v7.8.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-28 20:19:21 +00:00
Nirav Asher
9260bc2278 circular gradient module (#1496)
* circular gradient module

* circular gradient option inside gradient module

* Added test for gradient module

* final shadow module with module test

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-28 15:02:06 -05:00
Harsh Khandeparkar
8c4c607f2c Fixed Setup Script Typo (#1588)
* Fix typo

* Update package.json

Co-authored-by: Rishabh Shukla <42492389+blurry-x-face@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-28 14:31:30 -05:00
dependabot-preview[bot]
8483c07847 Bump lint-staged from 9.5.0 to 10.0.3
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 9.5.0 to 10.0.3.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v9.5.0...v10.0.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-28 17:30:21 +00:00
dependabot-preview[bot]
4bba811848 Bump @babel/plugin-syntax-object-rest-spread from 7.7.4 to 7.8.3
Bumps [@babel/plugin-syntax-object-rest-spread](https://github.com/babel/babel) from 7.7.4 to 7.8.3.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.7.4...v7.8.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-28 16:52:49 +00:00
Naman Aggarwal
166a0d894c Adding Test modules for GIF's (#1530)
* Test for GIF

* some cleanup

* Some cleanup

* Some code cleanup

* cleanup

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
Co-authored-by: Rishabh Shukla <42492389+blurry-x-face@users.noreply.github.com>
Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
2020-01-28 11:01:41 -05:00
Naman Aggarwal
3ffea1f5e9 [FIXED]Draw rectangle's rectangle shinking down with every frame in gif's (#1535)
* Fix

* .

Co-authored-by: Rishabh Shukla <42492389+blurry-x-face@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-28 10:52:40 -05:00
Shazeb Ata
79472baec4 Clear step (#1386)
* Added test clear_step

* Updated clear step test

* Changed name of clear step

* Changed name of clear step

* Added delete step

* Added Linebreaks

* Added clear and delete step

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-27 17:40:22 -05:00
dependabot-preview[bot]
70003521c6 Bump gpu.js from 2.6.2 to 2.6.6
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.6.2 to 2.6.6.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-27 22:24:36 +00:00
dependabot-preview[bot]
f6d53163b9 Bump tape from 4.12.1 to 4.13.0 (#1449) 2020-01-22 17:22:02 +00:00
dependabot-preview[bot]
19ae9262f2 Bump jest from 24.9.0 to 25.1.0 (#1556)
Bumps [jest](https://github.com/facebook/jest) from 24.9.0 to 25.1.0.
- [Release notes](https://github.com/facebook/jest/releases)
- [Changelog](https://github.com/facebook/jest/blob/master/CHANGELOG.md)
- [Commits](https://github.com/facebook/jest/compare/v24.9.0...v25.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-22 12:09:00 -05:00
Ove Sundal
2378a67895 remove redundant function (#1532)
Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-22 11:31:06 -05:00
dependabot-preview[bot]
ecaa3ecd13 Bump @babel/plugin-proposal-object-rest-spread from 7.7.7 to 7.8.3 (#1494) 2020-01-21 22:05:49 +00:00
Rishabh Shukla
2cd728b54c Fix minify Module (#1512)
* Fix minify Module

* fix minify module
2020-01-21 16:25:34 -05:00
Naman Aggarwal
40dc23bedd [FIXED] travis test not failing when module test fails (#1550)
* travis test error fix

* Updated PULL_REQUEST template

* code cleanup

* ..

* some minor changes

* some minor changes

* Trying to restrat the build

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
Co-authored-by: Rishabh Shukla <42492389+blurry-x-face@users.noreply.github.com>
2020-01-21 16:22:46 -05:00
Rishabh Shukla
8b18d2d780 fix extraManipulation (#1551)
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-21 14:53:32 -05:00
dependabot-preview[bot]
b6d07c035f Bump gpu.js from 2.4.8 to 2.6.2 (#1544)
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.4.8 to 2.6.2.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-21 14:32:42 -05:00
Arghadip Chakraborty
7c63bb53a4 Fixed issue #1528: UI Learn More Link Should Lead to the README (#1539)
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-21 12:58:54 -05:00
Olusola
5b92ba5dc5 Fixed paint bucket fill color error (#1519)
* fillColor getting correct color

* Fixed #1488

Corrected the multiplier from 256 to 255

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-21 12:44:06 -05:00
Naman Aggarwal
2b3e5a2915 Added options startingX and startingY in Add-Qr Module (#1520)
* Added options startingX and startingY in Add-Qr Module

* requeste changes

* Fixing Qr Code at the end when not fit in the image

Co-authored-by: Rishabh Shukla <42492389+blurry-x-face@users.noreply.github.com>
2020-01-18 19:48:52 -05:00
Shazeb Ata
2fba0d2074 Added url for canvas (#1533) 2020-01-18 10:47:34 -05:00
Vladimir Mikulic
afc903192c FIX: Histogram module selected value not displayed (#1510)
The histogram module values are "true" and "false".
jQuery would coerce them to Boolean true and false instead of String
"true" and "false" which would result in empty value being displayed.

Resolves #1295
2020-01-17 16:44:05 -05:00
Naman Aggarwal
c703836198 Draw Rectangle default values (#1443)
Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-17 16:43:09 -05:00
Rishabh Shukla
c22c6c70d0 Adding easier to use interface for blend module and different blend modes (#1453)
* Bump data-uri-to-buffer from 2.0.1 to 3.0.0

Bumps [data-uri-to-buffer](https://github.com/TooTallNate/node-data-uri-to-buffer) from 2.0.1 to 3.0.0.
- [Release notes](https://github.com/TooTallNate/node-data-uri-to-buffer/releases)
- [Commits](https://github.com/TooTallNate/node-data-uri-to-buffer/compare/2.0.1...3.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

* add blend modes

* fix toCliString test

* add docs link for blend modes

* fix crop module

* undo last commit

* minor change

* change default to custom

* add docs link

Co-authored-by: dependabot-preview[bot] <27856297+dependabot-preview[bot]@users.noreply.github.com>
Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-17 15:47:47 -05:00
Rishabh Shukla
1fa8c6b8c1 Refactoring isGIF() as a utility function (#1511)
* refactor isGif

* refactor isGif

* fix isGif func

* Update isGif.js

* Update isGif.js
2020-01-17 15:27:05 -05:00
Rishabh Shukla
89fb3585ac Tests for checking image change upon change in options (#1490)
* add test for change in option for colormap

* add test for change in option for colormap

* add comments

* add few tests

* Add options change test for 14 more modules

* add test

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
2020-01-17 15:00:13 -05:00
keshav234156
d1b9b8becc Fixes disabling of clicking after crop is deleted and added test for the cropUI (#1481)
* crop-ui

* crop-ui

* Added test

* Adding test

* improving comments

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-16 17:18:34 -05:00
keshav234156
1a0f4d4042 Blend new (#1499)
* fixes blend

* change info.json

* improve readablity and comments

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-16 17:00:13 -05:00
Naman Aggarwal
9a2f4c1d19 Fix for Dynamic module (#1451)
* ..

* fix Dynamic Module

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-16 16:26:52 -05:00
Rishabh Shukla
b8c7df760a Add ranged input for overlay module. (#1459)
* add ranged input for overlay module

* fix bug

* change input type to integer

* Add tests

* Add tests

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-16 15:07:35 -05:00
Naman Aggarwal
2736b481a4 Added aspect ratio module (#1454)
* Base file

* Added aspect ratio module

* Compatiable with Experimental GIF Manipulation

* some refactoring

* Changed the name from aspect-ratio to Constrained Crop

* cleanup

* Changes requested

* Added test module

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-16 14:40:30 -05:00
Naman Aggarwal
5ae545904d Fix Average module editing the UI from the source (#1469)
* Fix Average module editing the UI from the source

* requested changes

* Delete demo.js

* cleanup

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-16 14:16:51 -05:00
Rishabh Shukla
b0ddea012a Add test for import image (#1513)
* add test for import image

* add test for import image

* remove log

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-16 13:55:43 -05:00
Rishabh Shukla
94caefa2cd Contrast module now uses changePixel Method (#1482)
* contrast module uses changePixel Method

* change if block to Math function

* fix bug

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-16 12:47:55 -05:00
Oktawian Jurkiewicz
45c54bb9af crop default options changes (#1487)
Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-16 12:29:58 -05:00
Rishabh Shukla
c1c682c0a6 Fix color picker bug (#1465)
* fix color picker bug

* minor change

* change step to stepAll

* add test

* add comments to colorpicker UI test

* add space

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-16 12:23:36 -05:00
Shazeb Ata
423422a61f Remove Multiple Downloads (#1428)
* Removed event listeners

* Added Unbind

* Removed Event Listener

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-15 18:56:06 -05:00
Sanjana Nayar
cded94509b Updated defaultHtmlStepUi.js to add docs link in UI (#1506) 2020-01-15 16:22:32 -05:00
Rishabh Shukla
bfff7e7b99 fix crop module (#1463) 2020-01-13 17:36:53 -05:00
dependabot-preview[bot]
12c422a07b Bump gpu.js from 2.4.7 to 2.4.8
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.4.7 to 2.4.8.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/compare/2.4.7...2.4.8)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-12 17:28:12 +00:00
Harsh Khandeparkar
ea2069d7f6 [GCI] Experimental GIF Manipulation (#1404)
* wasmSuccess

* modules use wasmSuccess

* modules use wasmSuccess

* add the tooltip

* add GIF support

* fix imageDImensions function

* fix inputCoordinatesParser function

* show correct image dimensions

* show correct image dimensions

* don't allow save as PDF for GIFs

* fix QR module

* fix BlobAnalysis

* fix Blur

* fix Colorbar

* fix Crop

* fix crop defaults

* fix DrawRectangle

* fix EdgeDetect

* fix FlipImage

* fix Gradient

* fix Invert

* fix Overlay

* fix Resize

* fix Rotate

* fix TextOverlay

* fix parse input test

* make GIFs work in nodejs

* sample GIF test

* small change

* cleanup

* cleanup

* cleanup

* small fix

* small change

* handle errors

* proper error handling and fix tests

* cleanup

* try a fix

* try another fix

* fix module benchmarks

* try more fixes

* revert

* try fixing the tests

* fix overlay test

* add the gif tests

* remove unnecessary changes

* fix tests

* whoops

* add some docs

* inBrowser

* fix all module tests

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-11 12:05:10 -05:00
dependabot-preview[bot]
61b2d75383 Bump data-uri-to-buffer from 2.0.1 to 3.0.0 (#1437)
Bumps [data-uri-to-buffer](https://github.com/TooTallNate/node-data-uri-to-buffer) from 2.0.1 to 3.0.0.
- [Release notes](https://github.com/TooTallNate/node-data-uri-to-buffer/releases)
- [Commits](https://github.com/TooTallNate/node-data-uri-to-buffer/compare/2.0.1...3.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-09 16:05:56 -05:00
dependabot-preview[bot]
20f7d7ca2e Bump jsdom from 15.1.1 to 15.2.1 (#1438)
Bumps [jsdom](https://github.com/jsdom/jsdom) from 15.1.1 to 15.2.1.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/15.1.1...15.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-08 18:16:05 -05:00
dependabot-preview[bot]
9ef5d38084 Bump @babel/plugin-syntax-object-rest-spread from 7.2.0 to 7.7.4 (#1444)
Bumps [@babel/plugin-syntax-object-rest-spread](https://github.com/babel/babel) from 7.2.0 to 7.7.4.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.2.0...v7.7.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-08 16:56:41 -05:00
Rishabh Shukla
c453bbbd92 Fix Meta modules and add inputs to ndvi-colormap (#1432)
* fix meta module bug

* fix create meta module and add inputs to ndvi-colormap

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-08 16:14:50 -05:00
dependabot-preview[bot]
448848b2d1 Bump gpu.js from 2.4.6 to 2.4.7 (#1434)
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.4.6 to 2.4.7.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/compare/2.4.6...2.4.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-07 17:03:13 -05:00
dependabot-preview[bot]
9822da6a78 Bump ndarray from 1.0.18 to 1.0.19 (#1436)
Bumps [ndarray](https://github.com/mikolalysenko/ndarray) from 1.0.18 to 1.0.19.
- [Release notes](https://github.com/mikolalysenko/ndarray/releases)
- [Commits](https://github.com/mikolalysenko/ndarray/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-07 16:39:32 -05:00
Naman Aggarwal
d215b43a09 Fixing defaults in various modules (#1441)
* Fix AddQr

* Fix Threshold

* Fix ReplaceColor Modulr

* Fix Overlay Module

* Fix FlipImage Module

* fix Colorbar Module

* Fix colormap module

* fix overlay

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-07 16:18:45 -05:00
anthony-zhou
00ed0f148d Expand out offline app features for smoother cache clearing and version tracking (#1384)
* Add version number to bottom

* Get latest version number from GitHub

* Create versionManagement.js

Fetching the latest and local version number is now done through versionManagement.js

* Add popup to prompt for refresh when a new version is available

A new version is available whenever the sw.js file is changed.

* Add version number fixed in top right corner

* Fix Codeclimate issues

* Update versionManagement.js

* Update versionManagement.js

* Make update prompt appear at front of page

Changed z-index

* Delete unecessary code

* Create task to automatically update sw.js

Used grunt-text-replace

* Uninstall semver

* Add replace task to serve and production tasks

* Update demo.js

Make version statements more descriptive.

* Update versionManagement.js

Remove unused versionCompare function

* Change URL for getting latest version

Changed the URL for getting the latest NPM version to be based on the package.json file's attribute for "homepage".

* Update index.html

* Update demo.css

* Added explanatory comments

* Update versionManagement.js

* Update versionManagement.js

* Updates for readability

Changed single-line comments to multiline comments.

* Update versionManagement.js

* Update versionManagement.js

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-07 14:56:34 -05:00
dependabot-preview[bot]
ab793bcf4e Bump commander from 4.0.1 to 4.1.0 (#1435)
Bumps [commander](https://github.com/tj/commander.js) from 4.0.1 to 4.1.0.
- [Release notes](https://github.com/tj/commander.js/releases)
- [Changelog](https://github.com/tj/commander.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tj/commander.js/compare/4.0.1...v4.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-07 12:02:23 -05:00
dependabot-preview[bot]
865e4bc268 Bump jasmine from 3.4.0 to 3.5.0 (#1433)
Bumps [jasmine](https://github.com/jasmine/jasmine-npm) from 3.4.0 to 3.5.0.
- [Release notes](https://github.com/jasmine/jasmine-npm/releases)
- [Commits](https://github.com/jasmine/jasmine-npm/compare/v3.4.0...v3.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-07 11:35:53 -05:00
Rishabh Shukla
6420bb05e8 fix meta module bug (#1426) 2020-01-06 16:26:35 -05:00
dependabot-preview[bot]
79d395bf24 Bump ora from 3.4.0 to 4.0.3 (#1415)
Bumps [ora](https://github.com/sindresorhus/ora) from 3.4.0 to 4.0.3.
- [Release notes](https://github.com/sindresorhus/ora/releases)
- [Commits](https://github.com/sindresorhus/ora/compare/v3.4.0...v4.0.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-06 13:59:57 -05:00
dependabot-preview[bot]
17ea0c8b44 Bump compressorjs from 1.0.5 to 1.0.6 (#1414)
Bumps [compressorjs](https://github.com/fengyuanchen/compressorjs) from 1.0.5 to 1.0.6.
- [Release notes](https://github.com/fengyuanchen/compressorjs/releases)
- [Changelog](https://github.com/fengyuanchen/compressorjs/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fengyuanchen/compressorjs/compare/v1.0.5...v1.0.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-06 13:48:26 -05:00
Shazeb Ata
81ef136b20 Change dimension upon loading an Image through UI (#1395)
* Change dimension upon loading an Image

* Refactored changedimension

* Refactored changedimension

* Added Comments

* Added description

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-06 13:38:48 -05:00
dependabot-preview[bot]
639eaf644f Bump readline-sync from 1.4.9 to 1.4.10 (#1206)
Bumps [readline-sync](https://github.com/anseki/readline-sync) from 1.4.9 to 1.4.10.
- [Release notes](https://github.com/anseki/readline-sync/releases)
- [Commits](https://github.com/anseki/readline-sync/compare/1.4.9...1.4.10)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-06 13:31:48 -05:00
dependabot-preview[bot]
a5da2ebc24 Bump @babel/plugin-proposal-object-rest-spread from 7.4.3 to 7.7.7 (#1372)
Bumps [@babel/plugin-proposal-object-rest-spread](https://github.com/babel/babel) from 7.4.3 to 7.7.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.4.3...v7.7.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-06 13:00:36 -05:00
dependabot-preview[bot]
6654e2a3f7 Bump jest-puppeteer from 4.3.0 to 4.4.0 (#1424)
Bumps [jest-puppeteer](https://github.com/smooth-code/jest-puppeteer) from 4.3.0 to 4.4.0.
- [Release notes](https://github.com/smooth-code/jest-puppeteer/releases)
- [Changelog](https://github.com/smooth-code/jest-puppeteer/blob/master/CHANGELOG.md)
- [Commits](https://github.com/smooth-code/jest-puppeteer/compare/v4.3.0...v4.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-06 10:34:10 -05:00
dependabot-preview[bot]
7473a256e9 Bump looks-same from 7.2.1 to 7.2.2 (#1423)
Bumps [looks-same](https://github.com/gemini-testing/looks-same) from 7.2.1 to 7.2.2.
- [Release notes](https://github.com/gemini-testing/looks-same/releases)
- [Changelog](https://github.com/gemini-testing/looks-same/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gemini-testing/looks-same/compare/v7.2.1...v7.2.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-06 10:07:51 -05:00
dependabot-preview[bot]
76e5eb85ce Bump imagemin from 7.0.0 to 7.0.1 (#1425)
Bumps [imagemin](https://github.com/imagemin/imagemin) from 7.0.0 to 7.0.1.
- [Release notes](https://github.com/imagemin/imagemin/releases)
- [Commits](https://github.com/imagemin/imagemin/compare/v7.0.0...v7.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-06 08:50:43 -05:00
Sparks
a8b6aac5b3 Update defaultHtmlStepUi.js (#1388)
Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-03 14:19:53 -05:00
dependabot-preview[bot]
d3b49ff187 Bump jasmine-core from 3.4.0 to 3.5.0 (#1408)
Bumps [jasmine-core](https://github.com/jasmine/jasmine) from 3.4.0 to 3.5.0.
- [Release notes](https://github.com/jasmine/jasmine/releases)
- [Changelog](https://github.com/jasmine/jasmine/blob/master/RELEASE.md)
- [Commits](https://github.com/jasmine/jasmine/compare/v3.4.0...v3.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-03 14:16:13 -05:00
dependabot-preview[bot]
cd41d1e8d9 Bump qrcode from 1.4.1 to 1.4.4 (#1416)
Bumps [qrcode](https://github.com/soldair/node-qrcode) from 1.4.1 to 1.4.4.
- [Release notes](https://github.com/soldair/node-qrcode/releases)
- [Changelog](https://github.com/soldair/node-qrcode/blob/master/CHANGELOG.md)
- [Commits](https://github.com/soldair/node-qrcode/compare/v1.4.1...v1.4.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-03 13:01:26 -05:00
dependabot-preview[bot]
33d601fb58 Bump gpu.js from 2.3.1 to 2.4.6 (#1417)
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.3.1 to 2.4.6.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/compare/2.3.1...2.4.6)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-03 12:20:20 -05:00
dependabot-preview[bot]
4e96b7fb55 Bump commander from 3.0.1 to 4.0.1 (#1406)
Bumps [commander](https://github.com/tj/commander.js) from 3.0.1 to 4.0.1.
- [Release notes](https://github.com/tj/commander.js/releases)
- [Changelog](https://github.com/tj/commander.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tj/commander.js/compare/v3.0.1...4.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-02 17:48:26 -05:00
Shazeb Ata
12a78c5745 Created a new object instead of passing by reference (#1379)
* Creating copy of object

* Creating copy of object

* Create new object

Co-authored-by: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-02 15:46:50 -05:00
Naman Aggarwal
6ffba532c3 Fixed bug => Color Temperature showing black image when set on default. (#1401)
* fixed issue #1392

* required changes fix

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-02 13:43:03 -05:00
keshav234156
7905cc9252 fixing module test (#1410) 2020-01-02 12:53:50 -05:00
dependabot-preview[bot]
fd138ffb47 Bump tape from 4.11.0 to 4.12.1 (#1405)
Bumps [tape](https://github.com/substack/tape) from 4.11.0 to 4.12.1.
- [Release notes](https://github.com/substack/tape/releases)
- [Commits](https://github.com/substack/tape/compare/v4.11.0...v4.12.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-02 11:36:50 -05:00
dependabot-preview[bot]
0ceb354c56 Bump browserify from 16.2.3 to 16.5.0 (#1207)
Bumps [browserify](https://github.com/browserify/browserify) from 16.2.3 to 16.5.0.
- [Release notes](https://github.com/browserify/browserify/releases)
- [Changelog](https://github.com/browserify/browserify/blob/master/changelog.markdown)
- [Commits](https://github.com/browserify/browserify/compare/v16.2.3...v16.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-02 08:46:06 -05:00
dependabot-preview[bot]
48c65d3c64 Bump buffer from 5.4.2 to 5.4.3 (#1254)
Bumps [buffer](https://github.com/feross/buffer) from 5.4.2 to 5.4.3.
- [Release notes](https://github.com/feross/buffer/releases)
- [Commits](https://github.com/feross/buffer/compare/v5.4.2...v5.4.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-01 19:52:03 -05:00
dependabot-preview[bot]
4539f264b3 Bump lint-staged from 9.2.1 to 9.5.0 (#1308)
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 9.2.1 to 9.5.0.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v9.2.1...v9.5.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-01 18:47:36 -05:00
dependabot-preview[bot]
b43cfc522f Bump jsqr from 1.1.1 to 1.2.0 (#1214)
Bumps [jsqr](https://github.com/cozmo/jsQR) from 1.1.1 to 1.2.0.
- [Release notes](https://github.com/cozmo/jsQR/releases)
- [Commits](https://github.com/cozmo/jsQR/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-01-01 16:37:57 -05:00
dependabot-preview[bot]
8d38088914 [Security] Bump handlebars from 4.1.2 to 4.5.3 (#1397)
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.1.2 to 4.5.3. **This update includes a security fix.**
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/wycats/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.1.2...v4.5.3)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-01 16:24:59 -05:00
Naman Aggarwal
772a56989f fix issue 1394 (#1399) 2020-01-01 15:04:53 -05:00
Srihari
13270a668c fix case (#1387) 2020-01-01 14:47:20 -05:00
Isaac Miti
cb47bf2341 Change the button to blue from green (#1380) 2020-01-01 14:41:18 -05:00
dependabot-preview[bot]
4097361599 Bump @babel/core from 7.5.5 to 7.7.7 (#1371)
Bumps [@babel/core](https://github.com/babel/babel) from 7.5.5 to 7.7.7.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.5.5...v7.7.7)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-01 13:46:58 -05:00
Harsh Khandeparkar
0bf178022d standardise comments (#1347) 2020-01-01 13:32:34 -05:00
Harsh Khandeparkar
51ce1c52f4 [GCI] Standardised Edge Detect module code comments (#1346)
* standardise comments

* more fixes

* fix

* Apply suggestions from code review

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-01 12:51:53 -05:00
Harsh Khandeparkar
1af9655bca [GCI] Standardised UI code comments (#1345)
* standardise comments

* fix some stuff

* A googol issues fixed

* Update examples/demo.js

* .

* .

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-01 12:39:17 -05:00
Harsh Khandeparkar
1db650cdd7 [GCI] Standardised UI util code comments (#1344)
* standardise comments

* small fix

Co-authored-by: Jeffrey Warren <jeff@unterbahn.com>
2020-01-01 12:26:41 -05:00
Veer Gadodia
d83703cf02 Update README.md (#1326) 2020-01-01 11:38:14 -05:00
Harsh Khandeparkar
c370a8b4ea Install GPU.js v2.3.1 (#1374)
* fix: Upgrade GPU.js to v2.3.0 and handle browserifying it

* fix?

* fiiix

* fix

* fix tests browserify

Co-authored-by: Robert Plummer <robertleeplummerjr@gmail.com>
2019-12-21 11:59:11 -05:00
Harsh Khandeparkar
6476b8d698 [GCI] Added Lightning Bolt for WASM accelerated modules (#1365)
* wasmSuccess

* modules use wasmSuccess

* modules use wasmSuccess

* add the tooltip
2019-12-19 18:45:42 -05:00
keshav234156
b7d5a98cdb seprated the title and radio group file (#1367) 2019-12-18 23:28:37 -05:00
Đoàn Ngọc Huân
2e94f20875 Update demo.css (#1368)
https://github.com/publiclab/image-sequencer/issues/1314
2019-12-18 13:30:18 -05:00
keshav234156
ed0f76c78d test for add step (#1366)
* test for add step

* adding relative path and testing with npm run test-ui(for testing in travis but it will abort previous test-ui)

* checking index.html

* checking index.html

* changing test location and reverting index.html

* remove console.log
2019-12-17 19:37:27 -05:00
Harsh Khandeparkar
4a86abbafd [GCI] InsertStep functionality added for loadImage step (#1360)
* add markuo

* add markupfix insertPreview

* fix insertPreview test

* make the new insertPreview work

* fix disabled

* small fix

* fix comments

* remove console log

* fix enabling/disabling of insert-step btn
2019-12-16 13:42:15 -05:00
Harsh Khandeparkar
426733f625 [GCI] Standardised Core code comments (#1343)
* standardise comments

* fix

* fixes

* add docs links

* remove extra .

* ., this and other changes
2019-12-16 12:56:03 -05:00
Harsh Khandeparkar
0ce2cf9492 [GCI] Standardised Blob Analysis module comments (#1351)
* fix comments

* Update src/modules/BlobAnalysis/BlobAnalysis.js

Fix double image

* Update src/modules/BlobAnalysis/BlobAnalysis.js

* . fix
2019-12-16 12:47:25 -05:00
Ryan10145
3d4025fd93 Disables Take a Photo Button and File Chooser While Camera is Active (#1357)
* Disables Other Buttons While Camera is Active

* Remove dropzone-text id from ImportImage UI
2019-12-16 11:53:32 -05:00
Sparks
76575b567a Dropdown 'Select a Module' fix (#1352)
* Update demo.js

* Codeclimate

* Update demo.js

* Code comments

* Comments codestyle

* Update demo.js
2019-12-12 11:53:18 -05:00
keshav234156
86dca0400e Allow saving onto Publiclab.org (#1353)
* Allow saving onto Publiclab.org

* success to primary

* fixing merge conflictx
2019-12-11 15:20:03 -05:00
anthony-zhou
5421a80fb3 Add Save as PDF option (#1349)
* Add Save as PDF option

* Edit coments for consistency

Edits follow the JSDoc guidelines. Comments begin with a capital letter and end with a period.
2019-12-11 13:23:13 -05:00
Vladimir Mikulic
bb4fc5b691 FIX: Dragzone overlapping (#1333)
* FIX: Dragzone overlapping

Changes:
- inline styles moved from ../ImportImage/Ui.js to demo.css
- minor code improvements

The change was necessary because in the old UI dragzone was overlapping
an image.

Resolves #1294

* FIX: Improve commit #ead4b932

Changes:
- rollback .dropzone input style
- add styles to  .import-image-zone input element

* FIX:  .import-image-zone input element width

Changes:
-  max-width increased to 120% on import-image-zone input element

* FIX: .import-image-zone max-width

Changes:
- rollback .import-image-zone input max-width to fit-content
- increase .import-image-zone max-width from 230px to 250px

* FIX: .import-image-zone input element max-width

Changes:
 - max-width set to 100%
2019-12-10 11:07:43 -05:00
Ryan10145
d371a0f2e4 Add Missing Modules to Documentation (#1325) 2019-12-10 11:02:07 -05:00
keshav234156
2459e53fda Fixes unexpected behavior of step panel dropdown (#1328)
* Fixes  dropdown

* Update defaultHtmlStepUi.js

* Update intermediateHtmlStepUi.js
2019-12-09 17:59:14 -05:00
keshav234156
032971d269 Fixes window error in Average module.Commented the test that were affecting other modules (#1330) 2019-12-09 17:52:01 -05:00
anthony-zhou
510fd7a934 Make "Add Step" button blue (#1331)
Changed the button's class from "btn-success" to "btn-primary."
2019-12-09 17:18:19 -05:00
Sasha Boginsky
5c76cb4012 Update CODE_OF_CONDUCT.md (#1248)
update to reflect the updates on 
https://publiclab.org/conduct Aug 28 2019, and also standardize format to match LDI, Mk, etc.
2019-12-09 16:58:29 -05:00
Rishabh Shukla
f1c94fd788 Display width and height of image at each step (#1309) 2019-11-28 14:42:25 -05:00
dependabot-preview[bot]
89626838e3 [Security] Bump https-proxy-agent from 2.2.1 to 2.2.4 (#1301)
Bumps [https-proxy-agent](https://github.com/TooTallNate/node-https-proxy-agent) from 2.2.1 to 2.2.4. **This update includes security fixes.**
- [Release notes](https://github.com/TooTallNate/node-https-proxy-agent/releases)
- [Commits](https://github.com/TooTallNate/node-https-proxy-agent/compare/2.2.1...2.2.4)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-11-18 15:15:56 -05:00
VAIBHAV MATTA
cff82c998f Small Typo Error Corrected (#1278) 2019-10-29 22:45:14 +01:00
keshav234156
b1600af374 fixes insert-step functionality (#1266) 2019-10-28 19:21:43 +01:00
keshav234156
43e81c3847 fixes bugs in gamma-correction module (#1256)
* fixes gamma-correction module slider

* Update info.json
2019-10-07 12:03:00 -04:00
Samagra Gupta
44f5cb4e03 cursor change into pointer (#1259) 2019-10-01 14:23:19 -04:00
keshav234156
3eb741c6d9 rotate module (#1218)
* this PR solves the problem of clipping of the image while rotating

* a little clipping was still present .so made the changes

* Splitted into two files

* ommitted extra declared variables

* Update Module.js

* Update Rotate.js

* Update Rotate.js
2019-09-24 16:45:02 -04:00
duyquangnguyenhac
33f32251ec Document noise reduction module (#1189)
* Added documentation for noise reduction module

* Added fixed documentation for noise reduction module

* Update MODULES.md

* Minor Changes to Noise-Reduction description.

* Update docs/MODULES.md

Co-Authored-By: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>

* Move documentation to alphabetical order

* Update MODULES.md
2019-09-23 10:56:38 -04:00
dependabot-preview[bot]
5253e08d57 Bump gpu.js from 2.0.0-rc.26 to 2.0.0 (#1257)
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.0.0-rc.26 to 2.0.0.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/compare/2.0.0-rc.26...2.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-18 09:20:59 -04:00
keshav234156
d782c147c5 fixes add-QR and color-picker in draw-rectangle,grid-overlay (#1250) 2019-09-11 15:28:02 -04:00
Devesh Kaushik
339df8768d Updated CONTRIBUTION.md (#1231)
* Update Contribution.md

As directed by rexagod

* Update Contribution.md

added libxext-dev

* Update CONTRIBUTING.md

Co-Authored-By: Harsh Khandeparkar <34770591+HarshKhandeparkar@users.noreply.github.com>
2019-09-11 11:18:44 -04:00
dependabot-preview[bot]
4a0207bc27 Bump buffer from 5.4.0 to 5.4.2 (#1246)
Bumps [buffer](https://github.com/feross/buffer) from 5.4.0 to 5.4.2.
- [Release notes](https://github.com/feross/buffer/releases)
- [Commits](https://github.com/feross/buffer/compare/v5.4.0...v5.4.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-07 10:52:00 -04:00
dependabot-preview[bot]
9ad6bde18e Bump husky from 2.3.0 to 3.0.5 (#1243)
Bumps [husky](https://github.com/typicode/husky) from 2.3.0 to 3.0.5.
- [Release notes](https://github.com/typicode/husky/releases)
- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)
- [Commits](https://github.com/typicode/husky/compare/v2.3.0...v3.0.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-04 16:17:36 -04:00
dependabot-preview[bot]
740acaeec7 Bump gpu.js from 2.0.0-rc.25 to 2.0.0-rc.26 (#1228)
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.0.0-rc.25 to 2.0.0-rc.26.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-04 15:16:33 -04:00
dependabot-preview[bot]
256e1d65c7 [Security] Bump mixin-deep from 1.3.1 to 1.3.2 (#1234)
Bumps [mixin-deep](https://github.com/jonschlinkert/mixin-deep) from 1.3.1 to 1.3.2. **This update includes a security fix.**
- [Release notes](https://github.com/jonschlinkert/mixin-deep/releases)
- [Commits](https://github.com/jonschlinkert/mixin-deep/compare/1.3.1...1.3.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-03 14:06:03 -04:00
dependabot-preview[bot]
bab7573f4a Bump commander from 2.19.0 to 3.0.1 (#1244)
Bumps [commander](https://github.com/tj/commander.js) from 2.19.0 to 3.0.1.
- [Release notes](https://github.com/tj/commander.js/releases)
- [Changelog](https://github.com/tj/commander.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tj/commander.js/compare/v2.19.0...v3.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-09-03 13:58:19 -04:00
Jeffrey Warren
776cb42bd6 Revert extra test until complete 2019-09-01 16:14:52 -04:00
Jeffrey Warren
fb452f7788 add UI test for quick selector add step
re #1000
2019-09-01 16:09:49 -04:00
Tudor Anghelina
3741d679bd Update Module.js (#1090)
Added const $ = window.$; at line 19 inside extraManipulation(pixels)
2019-08-30 12:58:05 -04:00
Rishabh Shukla
1cc9fd1a50 Update Pull_Request.md (#1233)
* Update pull request template

* Update Pull_Request.md
2019-08-28 17:59:54 -04:00
keshav234156
6613af810c make select a module responsive (#1208) 2019-08-26 09:42:10 -04:00
dependabot-preview[bot]
1b3e95fdd9 Bump tape-run from 6.0.0 to 6.0.1 (#1222)
Bumps [tape-run](https://github.com/juliangruber/tape-run) from 6.0.0 to 6.0.1.
- [Release notes](https://github.com/juliangruber/tape-run/releases)
- [Changelog](https://github.com/juliangruber/tape-run/blob/master/History.md)
- [Commits](https://github.com/juliangruber/tape-run/compare/v6.0.0...v6.0.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-23 08:02:59 -04:00
dependabot-preview[bot]
560e027954 Bump ora from 3.0.0 to 3.4.0 (#1220)
Bumps [ora](https://github.com/sindresorhus/ora) from 3.0.0 to 3.4.0.
- [Release notes](https://github.com/sindresorhus/ora/releases)
- [Commits](https://github.com/sindresorhus/ora/compare/v3.0.0...v3.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-22 14:09:26 -04:00
dependabot-preview[bot]
b43695cedb Bump buffer from 5.2.1 to 5.4.0 (#1221)
Bumps [buffer](https://github.com/feross/buffer) from 5.2.1 to 5.4.0.
- [Release notes](https://github.com/feross/buffer/releases)
- [Commits](https://github.com/feross/buffer/compare/v5.2.1...v5.4.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-22 12:50:08 -04:00
dependabot-preview[bot]
142c499119 Bump eslint from 6.1.0 to 6.2.1 (#1219)
Bumps [eslint](https://github.com/eslint/eslint) from 6.1.0 to 6.2.1.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v6.1.0...v6.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-21 11:32:22 -04:00
dependabot-preview[bot]
03e9e42324 Bump qrcode from 1.3.3 to 1.4.1 (#1176)
Bumps [qrcode](https://github.com/soldair/node-qrcode) from 1.3.3 to 1.4.1.
- [Release notes](https://github.com/soldair/node-qrcode/releases)
- [Changelog](https://github.com/soldair/node-qrcode/blob/master/CHANGELOG.md)
- [Commits](https://github.com/soldair/node-qrcode/compare/v1.3.3...v1.4.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-21 10:02:17 -04:00
dependabot-preview[bot]
128e31492d Bump gpu.js from 2.0.0-rc.13 to 2.0.0-rc.25 (#1196)
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.0.0-rc.13 to 2.0.0-rc.25.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/commits)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-19 17:02:23 -04:00
aashna27
c7980c1158 grid-overlay for negetive input and 0 (#1205) 2019-08-19 10:59:09 -04:00
dependabot-preview[bot]
66e845d189 Bump @babel/core from 7.4.3 to 7.5.5 (#1177)
Bumps [@babel/core](https://github.com/babel/babel) from 7.4.3 to 7.5.5.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.4.3...v7.5.5)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-16 13:02:15 -04:00
dependabot-preview[bot]
a95e57173b Bump lodash from 4.17.13 to 4.17.15 (#1209)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.13 to 4.17.15.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.13...4.17.15)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-16 10:08:46 -04:00
dependabot-preview[bot]
df3b16a1ed Bump jsdom from 15.0.0 to 15.1.1 (#1210)
Bumps [jsdom](https://github.com/jsdom/jsdom) from 15.0.0 to 15.1.1.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/15.0.0...15.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-16 09:45:11 -04:00
dependabot-preview[bot]
9fb87d7831 Bump eslint from 5.16.0 to 6.1.0 (#1182)
Bumps [eslint](https://github.com/eslint/eslint) from 5.16.0 to 6.1.0.
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/master/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v5.16.0...v6.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-15 16:41:37 -04:00
dependabot-preview[bot]
451a4ac3f2 Bump tape from 4.10.2 to 4.11.0 (#1139)
Bumps [tape](https://github.com/substack/tape) from 4.10.2 to 4.11.0.
- [Release notes](https://github.com/substack/tape/releases)
- [Commits](https://github.com/substack/tape/compare/v4.10.2...v4.11.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-15 15:44:10 -04:00
aashna27
5b98d5cf44 Pixel set redundancy removed (#1188)
* Pixels.set Redundancy removed

* eslint fixes

* move require to top with const
2019-08-14 15:34:14 -04:00
aashna27
1b5607a339 save dropdown connectivity (#1197)
* dropdown connectivity for 2 options

* comment added

* save gif corrected and preview gif refactored
2019-08-14 14:21:20 -04:00
dependabot-preview[bot]
5dca76c952 Bump lint-staged from 9.1.0 to 9.2.1 (#1190)
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 9.1.0 to 9.2.1.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v9.1.0...v9.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-09 17:41:27 +06:00
Devavrat Kalam
74ef42f485 Alphabetically arranged the MODULES.md file #1167 - Sorted index and the corpus (#1186)
* Sorted index and the corpus

* Changed text overlay sequence
2019-08-03 12:05:54 +03:00
dependabot-preview[bot]
e526fa47c6 Bump lodash from 4.17.11 to 4.17.13 (#1165)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.11 to 4.17.13.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.11...4.17.13)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-08-03 09:51:20 +03:00
aashna27
68d5db7cff Opencv.js via npm for blob-detection (#1185) 2019-08-02 16:56:03 +03:00
dependabot-preview[bot]
4dfdccada9 Bump puppeteer from 1.15.0 to 1.19.0 (#1183)
Bumps [puppeteer](https://github.com/GoogleChrome/puppeteer) from 1.15.0 to 1.19.0.
- [Release notes](https://github.com/GoogleChrome/puppeteer/releases)
- [Commits](https://github.com/GoogleChrome/puppeteer/compare/v1.15.0...v1.19.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-07-26 12:34:48 -05:00
aashna27
0db0943358 resize before loading previews (#1180)
* resize before loading previews

* min resize percentage calculated
2019-07-21 21:54:48 -04:00
aashna27
9464522017 text-overlay in Node (#1125)
* text-overlay in node

* text-overlay in node

* docs added
2019-07-15 12:17:47 -04:00
Slytherin
1b26f71654 Add minify-image module (#1149)
* Add minify-image module

* Add node modules

* corrected path

* Add browser func

* Add test and documentation
2019-07-09 19:38:06 -04:00
dependabot-preview[bot]
8033af9130 Bump gpu.js from 2.0.0-rc.13 to 2.0.0-rc.20 (#1156)
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.0.0-rc.13 to 2.0.0-rc.20.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/compare/2.0.0-rc.13...2.0.0-rc.20)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-07-09 18:33:04 -04:00
dependabot-preview[bot]
45aba96989 Bump lint-staged from 8.1.7 to 9.1.0 (#1158)
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 8.1.7 to 9.1.0.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v8.1.7...v9.1.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-07-09 17:58:29 -04:00
Harsh Khandeparkar
eff0d383c8 Fix ScopeQuery (#1132)
* update dist

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

dist update

Revert "dist update"

This reverts commit 9ee2a987e8f978961656ae8f71f6e6702bbbd30d.

* Merge remote-tracking branch 'upstream/main' into main

* add dist

* add new func

* update itermediate

* changes

* fix gitignore

* use scopeQuery

* add mapHtmlTypes test

* scopeQuery tests added

* try something

* change

* fix stepui test

* Remove double quotes

* update new code

* refactor to spec

* fix link elems, add a new scopeQuery Method

* fixed undefined error

* fix everything

* getScope to scopeAll

* add new methods to CONTRIBUTING file
2019-07-01 11:32:11 -04:00
Slytherin
2c58edfe9a Temporary fix for insert-step btn not working (#1131)
* Temporary fix for insert-step btn not working

* Bump to v3.5.1
2019-06-25 20:28:10 -04:00
Harsh Khandeparkar
257113a948 Shorten UI code with new $step method (#710)
* update dist

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

dist update

Revert "dist update"

This reverts commit 9ee2a987e8f978961656ae8f71f6e6702bbbd30d.

* Merge remote-tracking branch 'upstream/main' into main

* add dist

* add new func

* update itermediate

* changes

* fix gitignore

* use scopeQuery

* add mapHtmlTypes test

* scopeQuery tests added

* try something

* change

* fix stepui test

* Remove double quotes

* update new code

* refactor to spec
2019-06-21 15:11:10 -04:00
jywarren
0eb3f263f9 version bump to v3.5.0 with WebAssembly acceleration 2019-06-21 12:15:51 -04:00
Slytherin
30659d4656 Using wasm to accelerate PixelManipulation.js (#1093)
* Add wasm code

* First working model

* Add PixelManipulation web assembly code to browser and node

* Tests corrected for modules

* Corrected test script

* Add wasm bechmarks

* Update Readme

* Applies toggling functionality and refactored PixelManipulation code

* Added documentation and corrected wasm toggling

* change noise reduction module to use wasm code

* Corrected formatting  and removed extra comments

* Add default wasm option and made README changes

* Fixed negative test timings

* combined benchmarks file

* Update benchmark.js

* Removed copies of wasm file and corrected test format

* Update package.json

Co-Authored-By: Jeffrey Warren <jeff@unterbahn.com>

* Added wasm file and removed redundant code

* Removed earlier benchmarks

* move test/core/sequencer/benchmark.js to its own test command, not passing to tape-spec

* Solves memory leaks and blank lines

* Solves memory leaks and blank lines

* Added handler for node code

* Modify test script

* Modify test script

* Correct doc and removed pace fuctionality
2019-06-21 10:54:56 -04:00
dependabot-preview[bot]
c3af98ea93 Bump gpu.js from 2.0.0-rc.14 to 2.0.0-rc.15 (#1116)
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.0.0-rc.14 to 2.0.0-rc.15.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/compare/2.0.0-rc.14...2.0.0-rc.15)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-06-18 08:03:01 -04:00
aashna27
b34ec00efd Added Color Picker for selecting RGBA values in modules (#1095)
* Added Color Picker for selecting RGBA values in modules

* added scripts from node_modules

* selector-all added and alpha removed for some modules

* Modified description
2019-06-16 13:38:51 -04:00
jywarren
e1e9d57d7a bump to v3.4.5 2019-06-15 14:30:56 -04:00
aashna27
ec6ce155f5 Solved Module undefined error (#1104)
* Resolve Module undefined  error

* Lower-case-hyphen module names
2019-06-15 14:25:53 -04:00
dependabot-preview[bot]
70e7876230 Bump lint-staged from 8.2.0 to 8.2.1 (#1111)
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 8.2.0 to 8.2.1.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v8.2.0...v8.2.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-06-15 12:18:50 -04:00
Varun Gupta
80cb5b1194 Make progress bars on UI true (#1112)
* Make progress bars on UI true

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update docs

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix typo

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2019-06-15 10:51:02 -04:00
freerangeandy
f5d7b0ae09 add moduleInfo to step construction (#1107) (#1110) 2019-06-14 12:32:58 -04:00
aashna27
440c3e0ad0 Eslint operator spacing config (#1109)
* Eslint operator spacing config

* consistent spacing after comma

* comma styling config

* Trailing spaces config
2019-06-13 16:59:43 -04:00
aashna27
9eac21897a Added noise reduction module (#1105)
* Added Noise Removal Module

* Remove ChangePixel Function
2019-06-13 13:09:13 -04:00
dependabot-preview[bot]
cfdb7e2606 Bump @babel/plugin-proposal-object-rest-spread from 7.4.3 to 7.4.4 (#1056)
Bumps [@babel/plugin-proposal-object-rest-spread](https://github.com/babel/babel) from 7.4.3 to 7.4.4.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.4.3...v7.4.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-06-12 15:49:40 -04:00
dependabot-preview[bot]
278016fb8f Bump husky from 2.3.0 to 2.4.1 (#1106)
Bumps [husky](https://github.com/typicode/husky) from 2.3.0 to 2.4.1.
- [Release notes](https://github.com/typicode/husky/releases)
- [Changelog](https://github.com/typicode/husky/blob/master/CHANGELOG.md)
- [Commits](https://github.com/typicode/husky/compare/v2.3.0...v2.4.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-06-12 15:48:45 -04:00
dependabot-preview[bot]
64ad4b4a95 Bump lint-staged from 8.1.7 to 8.2.0 (#1102)
Bumps [lint-staged](https://github.com/okonet/lint-staged) from 8.1.7 to 8.2.0.
- [Release notes](https://github.com/okonet/lint-staged/releases)
- [Commits](https://github.com/okonet/lint-staged/compare/v8.1.7...v8.2.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2019-06-12 15:48:18 -04:00
Johan Uribe
52ef31cdab Show default cursor on hover (#1036)
Show default cursor on hover
2019-06-10 12:54:50 -04:00
aashna27
c653ce65b9 Modified jasmine script (#1101)
* jasmine script modified

* added jasmine script

* Jasmine install script removed from travis
2019-06-07 08:17:47 -07:00
dependabot-preview[bot]
abc4b51de9 Bump jsdom from 15.0.0 to 15.1.1 (#1085) 2019-06-05 19:03:48 +00:00
dependabot-preview[bot]
8d9a3c1f4f Bump puppeteer from 1.15.0 to 1.17.0 (#1077)
Bumps [puppeteer](https://github.com/GoogleChrome/puppeteer) from 1.15.0 to 1.17.0.
- [Release notes](https://github.com/GoogleChrome/puppeteer/releases)
- [Commits](https://github.com/GoogleChrome/puppeteer/compare/v1.15.0...v1.17.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-06-05 14:48:07 -04:00
dependabot-preview[bot]
d6bb1ba5b9 Bump @babel/core from 7.4.3 to 7.4.5 (#1071)
Bumps [@babel/core](https://github.com/babel/babel) from 7.4.3 to 7.4.5.
- [Release notes](https://github.com/babel/babel/releases)
- [Changelog](https://github.com/babel/babel/blob/master/CHANGELOG.md)
- [Commits](https://github.com/babel/babel/compare/v7.4.3...v7.4.5)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-06-05 14:47:54 -04:00
aashna27
427c81d8fe Added Download button (#1096) 2019-06-05 14:46:25 -04:00
dependabot-preview[bot]
31bc45cb91 Bump gpu.js from 2.0.0-rc.13 to 2.0.0-rc.14 (#1097)
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.0.0-rc.13 to 2.0.0-rc.14.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/compare/2.0.0-rc.13...2.0.0-rc.14)
2019-06-04 15:16:27 -04:00
jywarren
81f13c03a7 v3.3.5 2019-05-27 13:58:23 -04:00
dependabot-preview[bot]
c5ca02bcb3 Bump gpu.js from 2.0.0-rc.12 to 2.0.0-rc.13 (#1053)
Bumps [gpu.js](https://github.com/gpujs/gpu.js) from 2.0.0-rc.12 to 2.0.0-rc.13.
- [Release notes](https://github.com/gpujs/gpu.js/releases)
- [Commits](https://github.com/gpujs/gpu.js/compare/2.0.0-rc.12...2.0.0-rc.13)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-05-27 13:55:18 -04:00
dependabot-preview[bot]
45df69e8e1 Bump looks-same from 7.2.0 to 7.2.1 (#1067)
Bumps [looks-same](https://github.com/gemini-testing/looks-same) from 7.2.0 to 7.2.1.
- [Release notes](https://github.com/gemini-testing/looks-same/releases)
- [Changelog](https://github.com/gemini-testing/looks-same/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gemini-testing/looks-same/compare/v7.2.0...v7.2.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-05-27 13:54:51 -04:00
dependabot-preview[bot]
dd3d15eef2 Bump tape from 4.10.1 to 4.10.2 (#1081)
Bumps [tape](https://github.com/substack/tape) from 4.10.1 to 4.10.2.
- [Release notes](https://github.com/substack/tape/releases)
- [Commits](https://github.com/substack/tape/compare/v4.10.1...v4.10.2)
2019-05-27 13:54:22 -04:00
Varun Gupta
641ffd7a1a Fix overlay (#1082)
* fix Overlay

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update canvas background color

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2019-05-27 13:53:55 -04:00
aashna27
ca73a4115e dist ignored from eslint and documentation added (#1083) 2019-05-27 08:17:13 -04:00
jywarren
a7fe5edb4b v3.3.4 2019-05-25 13:39:58 -04:00
Jeffrey Warren
f222bf7669 Update CONTRIBUTING.md 2019-05-25 13:37:59 -04:00
Varun Gupta
b506f7a356 fix import-image and canvas-resize (#1079)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2019-05-25 12:38:01 -04:00
jywarren
ba39a40c7e bump to v3.3.3 2019-05-25 12:01:15 -04:00
Bhavay Anand
461f3f905a fix: module names had spaces instead of hyphen (#1073) 2019-05-25 11:42:47 -04:00
dependabot-preview[bot]
6f4cf80648 [Security] Bump tar from 2.2.1 to 2.2.2 (#1078)
Bumps [tar](https://github.com/npm/node-tar) from 2.2.1 to 2.2.2. **This update includes security fixes.**
- [Release notes](https://github.com/npm/node-tar/releases)
- [Commits](https://github.com/npm/node-tar/compare/v2.2.1...v2.2.2)
2019-05-24 15:32:17 -04:00
aashna27
102d2b21ca ESLINT config added (#1063) 2019-05-24 01:02:20 -04:00
jywarren
dc2375043f bump to v3.3.2 2019-05-23 22:01:25 -04:00
Jeffrey Warren
e1e23c213c Update CONTRIBUTING.md 2019-05-23 15:15:03 -04:00
Varun Gupta
8751211967 fix webgl-distort (#1074)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2019-05-23 14:40:55 -04:00
aashna27
c784de0c19 Added Eslint and husky (#1062) 2019-05-11 10:39:15 -04:00
Harsh Khandeparkar
0c3d7be7e2 Module tests (#1058)
* change all old module benchmarks

* no node 6

* add average module tests

* edge-detect test added

* edge detect tests

* flip-image tests

* tint tests

* saturation tests

* gradient tests

* exposure tests

* draw-rectangle tests

* color-temperature tests

* convolution tests

* paint-bucket tests

* ndvi tests

* ndvi-colormap tests

* histogram tests

* crop tests

* gamma-correction tests

* dynamic tests

* colorbar tests

* webgl-distort tests

* fisheye-gl tests

* blend module tests

* overlay module tests
2019-05-06 15:41:42 -04:00
dependabot[bot]
06ac596d7e [Security] Bump static-eval from 0.2.4 to 2.0.2 (#1051) 2019-05-04 19:15:22 +00:00
dependabot[bot]
3220886db0 Bump jquery from 3.4.0 to 3.4.1 (#1052) 2019-05-04 19:06:53 +00:00
Harsh Khandeparkar
bfff8f093b drop nodejs 6 support (#1057) 2019-05-04 14:49:20 -04:00
dependabot[bot]
d6cb02cd52 Bump tape-run from 5.0.0 to 6.0.0 (#1054)
Bumps [tape-run](https://github.com/juliangruber/tape-run) from 5.0.0 to 6.0.0.
- [Release notes](https://github.com/juliangruber/tape-run/releases)
- [Changelog](https://github.com/juliangruber/tape-run/blob/master/History.md)
- [Commits](https://github.com/juliangruber/tape-run/compare/v5.0.0...v6.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-05-04 14:48:03 -04:00
Harsh Khandeparkar
b0096a13f4 GPU Acceleration achieved! (#1038)
* add gpu.js 2.0.0-rc.7

* add gpuUtils

* add gpuUtil convolve

* add convolution to edgeDetect

* bench it

* bench change

* newline

* pipeline

* revert edge-detect

* gpu accelerate gaussian blur

* edgeDetect use blur

* tweak values

* remove ndarray-gaussian-filter

* audit

* turn on previews

* remove oldPix

* fix travis

* Travis fix

* Try fixing travis

* Fix

* Retry

* tweaks

* convolution module on GPU

* use babelify

* trial

* remove logs

* Update .travis.yml

* Update .travis.yml

* bump version

* bump to rc.9

* rc.10

* rc.11

* Update package.json

* convolution fix

* unit test gpuUtils

* tests changed, fixed

* new fix

* more obvious parseFloat

* remove old commented code
2019-05-02 12:53:57 -04:00
Jeffrey Warren
43a8d0f2c1 update puppeteer for headless (#1031)
* update puppeteer for headless

* version bump for v3.1.1 bugfix

* --disable-setuid-sandbox

* remove --no-sandbox but leave --disable-setuid-sandbox

* Update gl-context.js

* ['--no-sandbox', '--disable-setuid-sandbox']
2019-04-30 14:41:41 -04:00
dependabot[bot]
8b110c241f Bump jsdom from 14.0.0 to 15.0.0 (#1037)
Bumps [jsdom](https://github.com/jsdom/jsdom) from 14.0.0 to 15.0.0.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/14.0.0...15.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-04-29 15:00:53 -04:00
Guillermo Murua
5566152e52 Fixed unresponsive webcam preview window (#1047) 2019-04-29 15:00:41 -04:00
Slytherin
269215f48b Fixes threshold bug (#1041)
* Fixes threshold bug

* Update examples/lib/defaultHtmlSequencerUi.js

Co-Authored-By: Divy123 <31225007+Divy123@users.noreply.github.com>

* Fix threshold module bug
2019-04-27 17:18:20 -04:00
Jeffrey Warren
1aa9a0e99c codecov badge url 2019-04-26 15:45:44 -04:00
aashna27
ff8c27eac2 Fixes Grid-Overlay with node Compatibility (#1024)
* Fixes Grid-Overlay

* Tests

* Correct bounds

Co-Authored-By: aashna27 <aashna.mittal27@gmail.com>

* Correct bounds

Co-Authored-By: aashna27 <aashna.mittal27@gmail.com>

* Correct bounds

Co-Authored-By: aashna27 <aashna.mittal27@gmail.com>

* Correct bounds

Co-Authored-By: aashna27 <aashna.mittal27@gmail.com>
2019-04-26 15:40:22 -04:00
dependabot[bot]
9eed50153c Bump puppeteer from 1.14.0 to 1.15.0 (#1043)
Bumps [puppeteer](https://github.com/GoogleChrome/puppeteer) from 1.14.0 to 1.15.0.
- [Release notes](https://github.com/GoogleChrome/puppeteer/releases)
- [Commits](https://github.com/GoogleChrome/puppeteer/compare/v1.14.0...v1.15.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-04-26 08:43:49 -04:00
Vibhor Gupta
df09cf62d0 Close parenthesis fix (#580)
* close parenthesis fix

* possible map fix

* remove ending parenthesis when passing options
2019-04-19 18:15:19 -04:00
Jeffrey Warren
e7fbada71e Update README.md 2019-04-19 13:31:20 -04:00
Varun Gupta
c36922dbdf attempting webgl-distort (#1022)
* attempting webgl-distort

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fixed the error

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* WIP

* custom inputs for distort

* added test suite

* test fix and input parse

* test fix

* 3.3.0
2019-04-19 13:10:58 -04:00
jywarren
c1996e576e v3.2.0 2019-04-19 12:46:22 -04:00
Jeffrey Warren
04838d3c2e Audit fix (#1028)
* bump v3.1.0

* audit fix
2019-04-19 12:36:01 -04:00
Jeffrey Warren
a35433acfe bump v3.1.0 (#1027) 2019-04-19 12:27:45 -04:00
Vibhor Gupta
ec40224831 Detect and Parse string separated module names (#787)
* detecting and parsing string separated module names

* test fix

* parsing multiple input methods

* travis fix

* test cases

* requested changes made

* test fix

* rebase and fix conflicts
2019-04-18 16:12:33 -04:00
Slytherin
84aede7bc3 Add meta description with keywords for SEO (#1018) 2019-04-18 16:10:17 -04:00
Vibhor Gupta
6339229836 Refactor: String parsing methods (#667)
* WIP

* string methods refactor

* fixed refactor
2019-04-18 07:59:38 -04:00
Slytherin
2be7a3dca6 Fixes crop module bug (#1019)
* Fixes crop module bug

* Fixes crop functionality

* Add looks like test for crop module
2019-04-18 07:40:36 -04:00
hodbadger
6fa8b1b880 Add a description of the scopeQuery method (#916)
* Add a description of the scopeQuery method

* Added changes to the description of scopeQuery

* Added changes to the description of scopeQuery
2019-04-15 18:10:49 -05:00
dependabot[bot]
900e0eda57 Bump data-uri-to-buffer from 2.0.0 to 2.0.1 (#989)
Bumps [data-uri-to-buffer](https://github.com/TooTallNate/node-data-uri-to-buffer) from 2.0.0 to 2.0.1.
- [Release notes](https://github.com/TooTallNate/node-data-uri-to-buffer/releases)
- [Changelog](https://github.com/TooTallNate/node-data-uri-to-buffer/blob/master/History.md)
- [Commits](https://github.com/TooTallNate/node-data-uri-to-buffer/compare/2.0.0...2.0.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-04-15 18:09:13 -05:00
Jeffrey Warren
3b9bacb2fb Add codecov comments (#1016)
* Add codecov comments

* Update .codecov.yml
2019-04-15 17:21:44 -05:00
Jeffrey Warren
11f73242fa Update README.md (#1015) 2019-04-15 16:33:41 -05:00
Harsh Khandeparkar
3772f78f51 1000 contributions PR (#1008)
* Update PULL_REQUEST_TEMPLATE.md

* changes
2019-04-15 16:24:29 -05:00
Slytherin
6ba604550b Add codecov (#1014) 2019-04-15 15:58:58 -05:00
Harsh Khandeparkar
2f86dcb0c8 Fixed Service Worker (#976)
* Update cache.js

* Update cache.js

* Create sw.js

* Delete sw.js
2019-04-15 12:38:39 -05:00
dependabot[bot]
fd981634fa Bump commander from 2.19.0 to 2.20.0 (#980)
Bumps [commander](https://github.com/tj/commander.js) from 2.19.0 to 2.20.0.
- [Release notes](https://github.com/tj/commander.js/releases)
- [Changelog](https://github.com/tj/commander.js/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tj/commander.js/compare/v2.19.0...v2.20.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-04-15 12:33:00 -05:00
dependabot[bot]
142464bb8b Bump ora from 3.2.0 to 3.4.0 (#981)
Bumps [ora](https://github.com/sindresorhus/ora) from 3.2.0 to 3.4.0.
- [Release notes](https://github.com/sindresorhus/ora/releases)
- [Commits](https://github.com/sindresorhus/ora/compare/v3.2.0...v3.4.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-04-15 12:32:09 -05:00
dependabot[bot]
78d9cd91e7 Bump jasmine-core from 3.3.0 to 3.4.0 (#986)
Bumps [jasmine-core](https://github.com/jasmine/jasmine) from 3.3.0 to 3.4.0.
- [Release notes](https://github.com/jasmine/jasmine/releases)
- [Changelog](https://github.com/jasmine/jasmine/blob/master/RELEASE.md)
- [Commits](https://github.com/jasmine/jasmine/compare/v3.3.0...v3.4.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-04-15 09:18:26 -05:00
Vibhor Gupta
e22eacf666 Add: white balance module (#1011)
* WIP

* added white balance and renamed temperature module

* import defaults

* white balance module test
2019-04-15 07:21:39 -05:00
Varun Gupta
c3e8c3fb74 Gl puppeteer (#1007)
* add geotiff

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* now running gl using localhost fixes #216

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* modularize api and fix tests

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* finishing up

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add docs

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fixes

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix benchmark.js

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2019-04-14 10:50:26 -05:00
aashna27
4e43c9123a Fixes Text-Overlay (#1004) 2019-04-12 10:11:00 -04:00
dependabot[bot]
914a172f5d Bump jquery from 3.3.1 to 3.4.0 (#1001)
Bumps [jquery](https://github.com/jquery/jquery) from 3.3.1 to 3.4.0.
- [Release notes](https://github.com/jquery/jquery/releases)
- [Commits](https://github.com/jquery/jquery/compare/3.3.1...3.4.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-04-11 04:42:32 -04:00
Lohitha
e4ddb04601 Add spinner while gif is generating (#991)
fixes #843
2019-04-08 19:47:26 -04:00
Harshith pabbati
edcc253029 fixed the bug (#999) 2019-04-08 08:26:39 -04:00
Terrence
51a38fe3cf More Modules option removed. Placeholder text added (#996)
* More Modules option removed. Placeholder text added

* 'A' changed to 'a' in placeholder text

* Update examples/lib/intermediateHtmlStepUi.js

Suggested update

Co-Authored-By: teisenhower <47988669+teisenhower@users.noreply.github.com>
2019-04-07 13:12:18 -04:00
Varun Gupta
e4e4548c09 add canvas resize module (#994)
* add canvas resize module

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add tests

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2019-04-07 12:41:14 -04:00
Vajean Stan
7cf96df1ee Removed redundant parameters in ImageSequencer.js (#967)
* Removed redundant parameters in ImageSequencer.js

* Re-added loadImages, deleted loadImage

* Left both loadImage and loadImages in

I think I need more details to the last phrase in the instructions, telling me to remove the export of loadImages, I tried deleting that line and cannot pass the test.
2019-04-05 18:03:04 -04:00
Harsh Khandeparkar
2a0eff41f4 Fix insert step and allow "closing" it (#655)
* update dist

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

dist update

Revert "dist update"

This reverts commit 9ee2a987e8f978961656ae8f71f6e6702bbbd30d.

* fix insert step button

* add icon

* add dist

* use normal functions

* use normal functions

* no lag

* changes

* changes

* changes

* Update intermediateHtmlStepUi.js

* toggleDiv global

- Globalised toggleDiv
- toggleDiv has default callback which does nothing.
2019-04-05 15:08:42 -04:00
Harsh Khandeparkar
b95728f95c Create fto-template.md (#977)
* Create fto-template.md

* Create first-timers.yml
2019-04-05 14:42:34 -04:00
Harshith pabbati
d63aab79a6 Added doc for grid-overlay (#983) 2019-04-05 14:37:17 -04:00
Harshith pabbati
0e7323efa9 Grid-Overlay module. (#974)
* Grid-Overlay module

* Added the X and Y for inputs
2019-04-03 08:46:57 -04:00
Harshith pabbati
1de170c978 made few changes to css (#975) 2019-04-02 09:37:39 -04:00
Jeffrey Warren
9a666a2f06 add maintainability badge from codeclimate 2019-04-01 14:33:02 -04:00
Harshith pabbati
985c67847e Changes to make the insert-step disable at the first step (#968) 2019-04-01 10:36:45 -04:00
Jeffrey Warren
690c126f41 ui-tweaks (#960) 2019-03-30 12:47:56 -04:00
Harshith pabbati
bc1151c340 Made it to work (#958) 2019-03-29 18:21:01 -04:00
Jeffrey Warren
32268c54df remove container class from step div (#956) 2019-03-28 21:35:10 -04:00
dependabot[bot]
12df02a0fd Bump jsdom from 13.2.0 to 14.0.0 (#845)
Bumps [jsdom](https://github.com/jsdom/jsdom) from 13.2.0 to 14.0.0.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/13.2.0...14.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-03-28 21:32:05 -04:00
MichaelLin250
a51644963a TRYING SO HARD TO FIX IT (#950) 2019-03-28 21:29:41 -04:00
Harshith pabbati
9f524615a5 Bootstrap panel (#942)
* Bootstrap panel

* Indentation.

* css tidying

* more tweaks
2019-03-28 20:59:21 -04:00
aashna27
8ad171ee56 Tests added (#943) 2019-03-27 07:49:42 -04:00
vaari gupta
a8757a888a Improved Footer (#904)
* improved footer

* corrected Footer

* Delete image-sequencer-ui.js

* Delete image-sequencer-ui.min.js

* Delete image-sequencer.js

* Delete image-sequencer.min.js
2019-03-26 18:33:48 -04:00
Harsh Khandeparkar
24fb83a565 Delete image-sequencer-ui.js (#941)
* Delete image-sequencer-ui.js

* fix link
2019-03-25 16:53:06 -04:00
aashna27
60cfcb4d30 Added Text Overlay module (#917) 2019-03-25 15:58:02 -04:00
Jeffrey Warren
488bbd86da Rearrange buttons in UI (#936) 2019-03-25 15:57:18 -04:00
Harsh Khandeparkar
a923f48c87 gitignore dist and update links (#908)
* Update .gitignore

* Delete image-sequencer-ui.min.js

* Delete image-sequencer.js

* Delete image-sequencer.min.js

* Update README.md

* Update README.md

* Update CONTRIBUTING.md

* Update .npmignore

* Update README.md

* Update .npmignore

* Update CONTRIBUTING.md
2019-03-25 15:55:34 -04:00
dependabot[bot]
15e93f09bd Bump grunt from 1.0.3 to 1.0.4 (#939)
Bumps [grunt](https://github.com/gruntjs/grunt) from 1.0.3 to 1.0.4.
- [Release notes](https://github.com/gruntjs/grunt/releases)
- [Changelog](https://github.com/gruntjs/grunt/blob/master/CHANGELOG)
- [Commits](https://github.com/gruntjs/grunt/compare/v1.0.3...v1.0.4)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-03-25 11:01:52 -04:00
dependabot[bot]
eb12d061ee Bump looks-same from 7.1.1 to 7.2.0 (#940)
Bumps [looks-same](https://github.com/gemini-testing/looks-same) from 7.1.1 to 7.2.0.
- [Release notes](https://github.com/gemini-testing/looks-same/releases)
- [Changelog](https://github.com/gemini-testing/looks-same/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gemini-testing/looks-same/commits/v7.2.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-03-25 11:01:42 -04:00
Harsh Khandeparkar
95efe812c3 Rename White balance to ColorTemperature (#931)
* Update and rename src/modules/WhiteBalance/Module.js to src/modules/ColorTemperature/Module.js

* Rename src/modules/WhiteBalance/index.js to src/modules/ColorTemperature/index.js

* Update and rename src/modules/WhiteBalance/info.json to src/modules/ColorTemperature/info.json

* Update Modules.js

* Update MODULES.md

* Update MODULES.md

* Update Module.js

* Update info.json
2019-03-25 10:11:55 -04:00
rohithGoudM
9be102e1dd Fixed Unresponsive Select Step Box (#927)
* The cursor changes to pointer when hovered over select element

* Cursor to pointer changes added to demo.css

* adding csrtoptr class directly to dist file

* small bug in ui fixed through bootstrap

* small bug in ui fixed through bootstrap

* Fixed unresponsive bug in ui with bootstrap

* all changes have been deleted regarding the cursor bug. only unresponsive bug has been solved
2019-03-25 10:11:09 -04:00
Jeffrey Warren
b0a00a71d3 Update diagram (#921) 2019-03-24 12:08:57 -04:00
dependabot[bot]
001ad61954 Bump looks-same from 7.1.0 to 7.1.1 (#907)
Bumps [looks-same](https://github.com/gemini-testing/looks-same) from 7.1.0 to 7.1.1.
- [Release notes](https://github.com/gemini-testing/looks-same/releases)
- [Changelog](https://github.com/gemini-testing/looks-same/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gemini-testing/looks-same/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-03-22 19:21:12 -04:00
Jeffrey Warren
ca8b7ecb95 Update CONTRIBUTING.md 2019-03-22 14:37:22 -04:00
Harshith pabbati
33dcb5794f clear cache offline button (#910) 2019-03-21 18:51:36 -04:00
Harshith pabbati
9ffd60c707 Seo tags for google search (#914)
* Seo tags for google search

* changes

* changes
2019-03-21 16:50:24 -04:00
Harsh Khandeparkar
32bd372139 Minify JS for production (#897)
* Create prod.js

* Delete prod.js

* add production task

* add grunt tasks to contributing file

* add default task.
2019-03-20 23:19:18 -04:00
Slytherin
bae2013243 Fixed quick buttons issue (#905) 2019-03-20 17:21:57 -04:00
Varun Gupta
cb53efbe21 redid import-image and fix ExportBin fixes #899 (#900)
* redid import-image and fix ExportBin fixes #899

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* 3.0.1

* bypass import-image

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2019-03-20 13:53:02 -04:00
MAYANK CHHIPA
21ff486618 Add Dropdown Transitions (#881)
* Add Dropdown Transitions

* Add Dropdown Transitions

* Update defaultHtmlStepUi.js

* Add Dropdown Transitions

* Add Dropdown Transitions

* Add Dropdown Transitions
2019-03-19 15:28:05 -04:00
Harsh Khandeparkar
951afdbc4f add grunt build to setup script (#895) 2019-03-19 11:50:09 -04:00
aashna27
709df84cb2 Corrected view (#867) 2019-03-19 11:41:39 -04:00
Harsh Khandeparkar
f852730d98 Is Nightly Completed (#893)
* beta demo

* config.yml

* Update config.yml

* Update ISSUE_TEMPLATE.md

* Update package.json

* mistake

* mistake
2019-03-19 10:25:06 -04:00
Vibhor Gupta
e5cf6a311f Add: Exposure Module (#721)
* exposure module

* requested changes

* update module
2019-03-19 08:02:28 -04:00
Harsh Khandeparkar
b8beec96be Revise Gruntfile (#887) 2019-03-18 19:10:03 -04:00
Slytherin
5e33c69736 Add search functionality in choose Module select (#750)
* Add Search functionality in choose functionalityoption

* Adds grunt build changes

* Adds node module for selectize and changed path
2019-03-18 17:28:19 -04:00
Slytherin
bd68245a12 Update Readme.md that includes importJSON section (#744)
* Update Readme.md that includes importJSON docs

* Adds command JSON object step addition format to README.md

* Added reference to the appropriate test

* Resolved missing rebase

* Deleted images in test_outputs directory and put it in .gitignore file
2019-03-18 16:37:44 -04:00
Harsh Khandeparkar
c6457323cc Complete Edge Detect Module (#771)
* update dist

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

dist update

Revert "dist update"

This reverts commit 9ee2a987e8f978961656ae8f71f6e6702bbbd30d.

* fix insert step button

* add icon

* add dist

* use normal functions

* use normal functions

* add new function

* add dist

* remove console logs

* changes

* refactor

* add dist

* Bump looks-same from 5.0.2 to 6.0.0 (#729)

Bumps [looks-same](https://github.com/gemini-testing/looks-same) from 5.0.2 to 6.0.0.
- [Release notes](https://github.com/gemini-testing/looks-same/releases)
- [Changelog](https://github.com/gemini-testing/looks-same/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gemini-testing/looks-same/compare/v5.0.2...v6.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>

* Setup UI testing (#720)

* default sequencer ui test

* default step ui test suite

* intermediate step ui test

* preview ui test suite

* url methods test suite

* add set url params method test suite

* argument call tests

* test directory refactor

* travis fix

* CLI code refactor (#665)

* CLI refactor

* es6 rollback

* Travis fix

* syntax fix

* clustered require statements

* travis debug

* travis debug

* Added line that selects the "More modules..." after adding a step. (#713)

* Added line making module selection correct after adding a step

* Added line with appropriate module selection

* Add: Module tests (#748)

* WIP

* module testing harness

* adjustments

* Fix choose file option and insert step functionality (#712)

* Fix choose file option

* changes

* Parse info.json to set module defaults (#650)

* changes

* changes

* changes

* changes

* changes

* changes

* Update package-lock.json

* Bump jsqr from 1.1.1 to 1.2.0 (#749)

Bumps [jsqr](https://github.com/cozmo/jsQR) from 1.1.1 to 1.2.0.
- [Release notes](https://github.com/cozmo/jsQR/releases)
- [Commits](https://github.com/cozmo/jsQR/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>

* Bump jsqr from 1.1.1 to 1.2.0 (#749)

Bumps [jsqr](https://github.com/cozmo/jsQR) from 1.1.1 to 1.2.0.
- [Release notes](https://github.com/cozmo/jsQR/releases)
- [Commits](https://github.com/cozmo/jsQR/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>

* dist

* changes

* working

* final touches

* revert mapTypes

* proper revert

* Fix arctangent

* working hysteresis

* hysteresis optional
2019-03-17 17:05:24 -04:00
aashna27
e1a113cde1 Added tests for more modules (#752) 2019-03-16 12:26:40 -04:00
MAYANK CHHIPA
24fb0ca9e4 Adds a reference to sequencer in replaceImage() (#865)
* Fixes #864

* Adds a reference to sequencer in replaceImage()
2019-03-16 12:24:32 -04:00
Harshith pabbati
a2fb2689a6 Made the flip image work in correct way (#854) 2019-03-14 19:32:29 -04:00
Harsh Prabhu
0be9e3f33b Centered the cropped image (#705)
* Updated demo.css

* Updated defaultHtmlStepUI.js

* Updated defaultHtmlStepUI.js

* Updated defaultHtmlStepUI.js

* Updated demo.css

* Updated defaultHtmlStepUi.js

* Updated defaultHtmlStepUi.js

* Added semi-colons in demo.css

* removed the style attribute from the img element
2019-03-14 19:07:18 -04:00
Jeffrey Warren
30e9f359d5 change insertPreview quick add defaults (#855) 2019-03-14 18:59:00 -04:00
maks-ostashkevich
3c1b6f2019 Change Footer Links In index.html (#848)
* Lines 202, 205, 211 have been changed in examples/index.html.

* Update examples/index.html line 211

Co-Authored-By: maks-ostashkevich <33810779+maks-ostashkevich@users.noreply.github.com>

* Update examples/index.html line 202

Co-Authored-By: maks-ostashkevich <33810779+maks-ostashkevich@users.noreply.github.com>

* Update examples/index.html line 205

Co-Authored-By: maks-ostashkevich <33810779+maks-ostashkevich@users.noreply.github.com>
2019-03-14 11:06:28 -04:00
Varun Gupta
96299ed6f7 3.0.0 (#783) 2019-03-14 11:05:15 -04:00
Slytherin
2f21bec80a Restructure API (#824)
* Change addsteps(), loadImages(), run() and default UI

* Restructure API completely

* Add updated dist files

* Removed extra comments

*  Indentation improved

* Update README.md
2019-03-14 11:04:02 -04:00
dependabot[bot]
3d1bbe5940 Bump looks-same from 7.0.0 to 7.1.0 (#853)
Bumps [looks-same](https://github.com/gemini-testing/looks-same) from 7.0.0 to 7.1.0.
- [Release notes](https://github.com/gemini-testing/looks-same/releases)
- [Changelog](https://github.com/gemini-testing/looks-same/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gemini-testing/looks-same/compare/v7.0.0...v7.1.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-03-14 10:58:08 -04:00
Lohitha
0865bc44d2 Document the new modules and docs-link for all modules (#841)
* Document the new modules and doc-link for all modules

This commit introdueces new modules to image-sequencer
	- Dither
	- Draw Rectangle
	- Paint Bucket
	- Tint
	- Threshold
	- WhiteBalance

fixes #719

* Update docs/MODULES.md

Co-Authored-By: lohitha02 <lohithabhagam123@gmail.com>

* Update MODULES.md

* Update info.json

* Update MODULES.md

* Update info.json

* Update info.json
2019-03-08 12:18:37 -05:00
Mridul97
055b17c75f Add replace color module (#724)
* Add color separation module

* changes

* changes

* changes

* changes

* Add test
2019-03-04 19:19:39 -05:00
dependabot[bot]
bf2fd7ede6 Bump ora from 3.1.0 to 3.2.0 (#830)
Bumps [ora](https://github.com/sindresorhus/ora) from 3.1.0 to 3.2.0.
- [Release notes](https://github.com/sindresorhus/ora/releases)
- [Commits](https://github.com/sindresorhus/ora/compare/v3.1.0...v3.2.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-03-04 17:55:14 -05:00
Harsh Khandeparkar
1e08d7c1da Map types to html types (#754)
* fix insert step button

* add dist

* add new function

* remove console logs

* refactor

* Setup UI testing (#720)

* default sequencer ui test

* default step ui test suite

* intermediate step ui test

* preview ui test suite

* url methods test suite

* add set url params method test suite

* argument call tests

* test directory refactor

* travis fix

* CLI code refactor (#665)

* CLI refactor

* es6 rollback

* Travis fix

* syntax fix

* clustered require statements

* travis debug

* travis debug

* Added line that selects the "More modules..." after adding a step. (#713)

* Added line making module selection correct after adding a step

* Added line with appropriate module selection

* Add: Module tests (#748)

* WIP

* module testing harness

* adjustments

* Update package-lock.json

* Bump jsqr from 1.1.1 to 1.2.0 (#749)

Bumps [jsqr](https://github.com/cozmo/jsQR) from 1.1.1 to 1.2.0.
- [Release notes](https://github.com/cozmo/jsQR/releases)
- [Commits](https://github.com/cozmo/jsQR/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>

* refactor without spread syntax
2019-03-04 17:54:28 -05:00
Harsh Khandeparkar
ac57b32ec6 Added New FlipImage Module (#696)
* update dist

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

dist update

Revert "dist update"

This reverts commit 9ee2a987e8f978961656ae8f71f6e6702bbbd30d.

* rebase and rebuild

* add dist

* flip image

* Changes

* Changes

* add dist

* missed one
2019-03-02 13:40:04 -05:00
Aneal Sharma
9f5a7bb49a Update "Installation" section of README.md (#817)
* Update "Installation" section of README.md

The following changes make the section more concise by removing unnecessary words.

* Update README.md

* Updated README.md further

-made additional grammatical and word choice improvements
2019-03-01 13:28:54 -05:00
dependabot[bot]
af033d15c6 Bump looks-same from 5.1.0 to 7.0.0 (#823)
Bumps [looks-same](https://github.com/gemini-testing/looks-same) from 5.1.0 to 7.0.0.
- [Release notes](https://github.com/gemini-testing/looks-same/releases)
- [Changelog](https://github.com/gemini-testing/looks-same/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gemini-testing/looks-same/compare/v5.1.0...v7.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-03-01 10:57:48 -05:00
Mary Ramirez
273f1eb494 Update index.html (#815)
Replaced line 214 with by changing the "improve this tool" button to primary.
2019-02-27 19:25:56 -05:00
Lokesh
6a450c743e Format the "Take a Photo" button (#739)
* Update index.html

added bootstrap classes btn brn-default btn-md for Take a photo button

* changed brn-default btn-primary

* changed button color and size
2019-02-23 07:45:55 -06:00
igorwilbert
bed23c8974 Adds data model diagram in README (#811) 2019-02-22 13:29:38 -06:00
aashna27
3c5f0a2a30 Typecast removed (#802) 2019-02-21 18:21:12 -06:00
aashna27
ffed3d1af1 Corrected default view for Saturation module (#772)
* Corrected default view for Saturation module

* package lock
2019-02-21 17:14:05 -06:00
aashna27
92aaaa9a42 RGB values on hover (#808) 2019-02-21 13:38:49 -08:00
Slytherin
6dd7738476 Adds "Add QR" module (#736)
* Adds Add QR module

* Grunt build changes

* Rremoved copyPixels function and added test for QR module

* Resolved test fail issues

* Adds look same test

* Change default to get from info.json
2019-02-21 10:02:24 -08:00
Lohitha
600ddece58 Fix "Save As" overflow on small screens (#795)
* Fixed #789 issue

* Fix #789 Save As overflow on small screens
2019-02-20 17:01:42 -08:00
Vibhor Gupta
29b0571c64 Add: UI test script to Travis (#791)
* codecov

* travis ui test fix

* undo

* fix
2019-02-20 16:48:14 -08:00
aashna27
cc0c5411d9 Fixes Crop module (#803) 2019-02-20 16:29:48 -08:00
Harshith pabbati
194e6fc441 Added a footer to the main page (#776)
* Added the footer to the main page

* Added the footer with link of the github issues
2019-02-20 10:37:54 -08:00
Harshith pabbati
fdb38f7fdf Added the resize quick button (#782)
* Added the resize module

* Added the resize quick button

* Made the icon to fit into the box

* Added the footer to the main page

* Added the resize quick button

* Added the resize quick button

* Added the resize quick button
2019-02-17 18:16:15 -06:00
Slytherin
c3abdaf3aa Add sequencer.getSteps() (#777)
* create getSteps() and test it

* Adds test with new sequencer instance and updated Readme
2019-02-17 18:14:59 -06:00
Varun Gupta
761142d9d3 createMetaModule generator (#779)
* initial createMetaModule

* fixes

* fix

* Update createMetaModule.js

* Update createMetaModule.js

* refactor and fix

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update ndvi-colormap

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix test

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add docs

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2019-02-16 22:33:45 +05:30
Varun Gupta
81b06d1b42 Benchmarks (#781)
* benchmarks initial try

* added test to package.json

* Update benchmark.js

* Update benchmark.js

* Update benchmark.js

* Update benchmark.js

* bigger image

* change load-Image to browser only and fix benchmark

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* run on same image

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2019-02-16 21:25:23 +05:30
Varun Gupta
75dc23fb55 Improve Code Quality and Optimize (#763)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2019-02-16 11:05:32 +05:30
Mridul97
f42aa2fd67 changes (#704) 2019-02-15 13:36:33 -05:00
dependabot[bot]
e0ed73a24e Bump bootstrap from 3.4.0 to 3.4.1 (#769)
Bumps [bootstrap](https://github.com/twbs/bootstrap) from 3.4.0 to 3.4.1.
- [Release notes](https://github.com/twbs/bootstrap/releases)
- [Commits](https://github.com/twbs/bootstrap/compare/v3.4.0...v3.4.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-02-14 12:29:40 -05:00
dependabot[bot]
c2bc12a112 Bump tape from 4.10.0 to 4.10.1 (#770)
Bumps [tape](https://github.com/substack/tape) from 4.10.0 to 4.10.1.
- [Release notes](https://github.com/substack/tape/releases)
- [Commits](https://github.com/substack/tape/compare/v4.10.0...v4.10.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-02-14 07:47:12 -05:00
Varun Gupta
fa30c1b30f Opaque meta module + test - colorbar (#764)
* opaque colorbar test

* build

* rebase + build

* fixed opaque meta modules yay

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add test and prevent internal logs

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* Update meta-modules.js
2019-02-13 10:36:11 -05:00
Sand
53db6bd2ce Assigned ref.images[image].steps[i] to a variable to stop duplication (#756) 2019-02-11 19:19:41 -05:00
aashna27
f4a80a0490 Default values added for few modules (#757) 2019-02-11 19:18:49 -05:00
dependabot[bot]
9836314f1f Bump ora from 3.0.0 to 3.1.0 (#758)
Bumps [ora](https://github.com/sindresorhus/ora) from 3.0.0 to 3.1.0.
- [Release notes](https://github.com/sindresorhus/ora/releases)
- [Commits](https://github.com/sindresorhus/ora/compare/v3.0.0...v3.1.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-02-11 19:18:09 -05:00
dependabot[bot]
6e193d48fc Bump tape from 4.9.2 to 4.10.0 (#759)
Bumps [tape](https://github.com/substack/tape) from 4.9.2 to 4.10.0.
- [Release notes](https://github.com/substack/tape/releases)
- [Commits](https://github.com/substack/tape/compare/v4.9.2...v4.10.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-02-11 19:17:47 -05:00
igorwilbert
1a0ae054c8 New layout for Save and Add areas (#745) 2019-02-09 08:54:50 -05:00
Jeffrey Warren
b638ceb1db Change default of Rotate module to 90 (#734) 2019-02-08 17:37:40 -05:00
aashna27
f09df0d042 Fixes Decode-qr (#680) 2019-02-08 17:35:32 -05:00
jywarren
044a120468 bumped to v2.5.0 2019-02-08 13:24:20 -05:00
Mridul97
2d8b93020a Add tint module (#701)
* Add tint module

* rebased, rebuilt
2019-02-08 13:20:47 -05:00
Mridul97
90c57af332 Change threshold range (#700)
* change tolerance values

* changes
2019-02-08 13:03:20 -05:00
Harsh Khandeparkar
78cbaa262b rebuild rebase (#674) 2019-02-08 12:10:24 -05:00
aashna27
ddde6e1e2e Added Threshold (#722) 2019-02-08 11:50:45 -05:00
Harsh Khandeparkar
2d8bb53402 Used pixels.set To Refactor DrawRectangle (#690)
* update dist

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

dist update

Revert "dist update"

This reverts commit 9ee2a987e8f978961656ae8f71f6e6702bbbd30d.

* use pixel.set for drawRectangle

* chnage thickness
2019-02-08 11:21:24 -05:00
dependabot[bot]
b47de40292 Bump jsqr from 1.1.1 to 1.2.0 (#749)
Bumps [jsqr](https://github.com/cozmo/jsQR) from 1.1.1 to 1.2.0.
- [Release notes](https://github.com/cozmo/jsQR/releases)
- [Commits](https://github.com/cozmo/jsQR/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-02-07 18:01:44 -05:00
jywarren
0a091a611f version bump to 2.4.0 2019-02-06 19:52:05 -05:00
Aneal Sharma
2274ce6785 Update "Why" section in README.md (#742) 2019-02-06 19:30:04 -05:00
Jeffrey Warren
58c6cbff24 Update package-lock.json 2019-02-06 16:32:01 -05:00
Mridul97
6153dbfdaa Parse info.json to set module defaults (#650)
* changes

* changes

* changes

* changes

* changes

* changes
2019-02-06 11:10:54 -05:00
Mridul97
6b305a02f5 Fix choose file option and insert step functionality (#712)
* Fix choose file option

* changes
2019-02-05 11:32:16 -05:00
Vibhor Gupta
57e4849d35 Add: Module tests (#748)
* WIP

* module testing harness

* adjustments
2019-02-05 11:31:13 -05:00
Gabriel Ting
3081dccf19 Added line that selects the "More modules..." after adding a step. (#713)
* Added line making module selection correct after adding a step

* Added line with appropriate module selection
2019-02-01 12:28:49 -05:00
David Koch
fa047ce6a9 minor fix for better readability (#730)
* minor fix for better readability

* added one '#'
2019-01-31 13:01:24 -05:00
Vibhor Gupta
d0bf9de71a CLI code refactor (#665)
* CLI refactor

* es6 rollback

* Travis fix

* syntax fix

* clustered require statements

* travis debug

* travis debug
2019-01-31 13:01:03 -05:00
Vibhor Gupta
0cd3156c06 Setup UI testing (#720)
* default sequencer ui test

* default step ui test suite

* intermediate step ui test

* preview ui test suite

* url methods test suite

* add set url params method test suite

* argument call tests

* test directory refactor

* travis fix
2019-01-31 12:56:34 -05:00
dependabot[bot]
8880a580dd Bump looks-same from 5.0.2 to 6.0.0 (#729)
Bumps [looks-same](https://github.com/gemini-testing/looks-same) from 5.0.2 to 6.0.0.
- [Release notes](https://github.com/gemini-testing/looks-same/releases)
- [Changelog](https://github.com/gemini-testing/looks-same/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gemini-testing/looks-same/compare/v5.0.2...v6.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-30 06:00:00 -06:00
dependabot[bot]
c445070937 Bump jsdom from 13.1.0 to 13.2.0 (#709)
Bumps [jsdom](https://github.com/jsdom/jsdom) from 13.1.0 to 13.2.0.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/compare/13.1.0...13.2.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-24 09:04:41 -03:00
dependabot[bot]
d792f21147 Update jsdom requirement from ^11.12.0 to ^13.1.0 (#703)
Updates the requirements on [jsdom](https://github.com/jsdom/jsdom) to permit the latest version.
- [Release notes](https://github.com/jsdom/jsdom/releases)
- [Changelog](https://github.com/jsdom/jsdom/blob/master/Changelog.md)
- [Commits](https://github.com/jsdom/jsdom/commits/13.1.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-23 21:15:24 -03:00
Nicole Ortiz García
ad60c91d6b Updating demo.css to only remove padding on sliders (#702)
* Update demo.css

removed padding only on sliders -- added the attribute selector [type="range"] on the demo.css file.

* Update demo.css

removed space between .form-control and [type="range"] -- pull request review.
2019-01-23 19:09:53 -03:00
aashna27
3c2d6542dc Added second spinner (#691) 2019-01-23 19:08:53 -03:00
atsutton
b64e7cefc0 Switch to npm for gifshot (#689)
* Switch to npm for gifshot

* Added a refreshed package-lock.json

* Updated package.json and package-lock.json

* Cleared cache, resync with trunk
2019-01-23 19:08:11 -03:00
Harpinder
eb3b3df800 Changed New PR Welcome Comment issue: #684 (#688) 2019-01-22 18:16:13 -04:00
Mridul97
0e6e1837a6 Use browserify for ui js files and refactor ui js files (#668)
* changes

* changes

* changes
2019-01-22 18:15:23 -04:00
Maseu
dc361a3ab8 Fixed Import Image Text Overflow (#695)
* Replace dropzone id with dropzone class

* Added dropzone class to div container

* Updated dropZone listener

* Changed #dropzone input to .dropzone input
2019-01-22 16:26:04 -04:00
Slytherin
3d2d7844b6 Added thumbnails to insert preview. (#653)
* Adds thumbnail to insert step view

* removed redundant code

* Resolved merge conflicts

* Resolved merge conflicts

* made changes in intermediateHtmlStepUi

* Update intermediateHtmlStepUi.js
2019-01-22 16:24:59 -04:00
Slytherin
8fd4efc621 Add tests for notify() (#686)
* Added HTML-UI test

* Added test for notify()

* Updated Readme's
2019-01-22 10:43:39 -04:00
Harsh Prabhu
413a235594 updated PULL-REQUEST-TEMPLATE.md (#682)
* updated PULL-REQUEST-TEMPLATE.md

* Updated PULL-REQUEST_TEMPLATE.md
2019-01-22 09:14:19 -04:00
Himanshu
0e87c8b1df Remove console logs (#685)
* Removed logs

* Update demo.js
2019-01-22 09:13:50 -04:00
Mridul97
4fd814dd95 Add paint bucket module (#556)
* Add paint-bucket

* Add tolerance input
2019-01-22 09:03:42 -04:00
Slytherin
17d79c4b44 Fixed PR template test command (#677) 2019-01-17 18:52:20 -05:00
Slytherin
85a53325d2 Changes travis configuration to remove test for node v4 (#683) 2019-01-17 17:43:35 -05:00
Slytherin
81719a9e13 Stops loading of blend-module when offset unavailable (#654)
* Stops loading of blend-module when offset unavailable

* Added improvements

* Update demo.css

* Update notification.js

* Update defaultHtmlStepUi.js

* Update Module.js

* Update notification.js

* adds generic UI function to user-interface

* Added changes
2019-01-16 17:41:33 -05:00
VIRIK JAIN
fc02e7aea0 Add CODE_OF_CONDUCT.md (#681) 2019-01-16 22:55:54 +05:30
Mridul97
f68983d6d7 Fix toggle-able collapse (#651)
* fix toggle

* changes

* dist changes

* changes

* changes

* changes

* changes
2019-01-14 17:05:23 -05:00
Harsh Khandeparkar
b5fcba3c54 Refactor Draw Rectangle Module (#664)
* update dist

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

dist update

Revert "dist update"

This reverts commit 9ee2a987e8f978961656ae8f71f6e6702bbbd30d.

* change template

* refactor drawRectangle

* changes

* changes
2019-01-14 15:57:49 -05:00
Jeffrey Warren
f6b1f7b201 Add code climate coverage reporting in Travis (#635)
* Add code climate coverage reporting in Travis

* Update .travis.yml
2019-01-14 15:53:58 -05:00
HarshKhandeparkar
2399e511a0 New pr template (#663)
* update dist

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

dist update

Revert "dist update"

This reverts commit 9ee2a987e8f978961656ae8f71f6e6702bbbd30d.

* change template
2019-01-12 08:47:13 -05:00
dependabot[bot]
cfdb54359c Bump looks-same from 5.0.1 to 5.0.2 (#652)
Bumps [looks-same](https://github.com/gemini-testing/looks-same) from 5.0.1 to 5.0.2.
- [Release notes](https://github.com/gemini-testing/looks-same/releases)
- [Changelog](https://github.com/gemini-testing/looks-same/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gemini-testing/looks-same/compare/v5.0.1...v5.0.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-11 12:37:10 -05:00
Mridul97
9e5f252fd4 Fix scroll up button (#638)
* fix scroll-up button

* dist changes

* changes

* changes
2019-01-10 21:22:51 -05:00
aashna27
2e9689b905 TakePhoto fixes (#641) 2019-01-10 18:11:03 -05:00
Mridul97
c72beb7359 test brightness module (#624) 2019-01-09 14:24:17 -05:00
aashna27
e5d26815d7 toggle-able collapse added for modules (#636) 2019-01-08 15:22:25 -05:00
aashna27
73b917f036 Header opens a new page (#619) 2019-01-08 15:18:32 -05:00
Mridul97
0248bc7124 Compilation of ui js files (#627)
* changes

* changes
2019-01-08 11:40:28 -05:00
Mridul97
89345f32b3 Add a 'Start a new sequence' button (#589)
* add start a new sequence button

* changes

* reset sequence

* changes

* changes

* changes

* changes

* changes
2019-01-07 18:22:51 -05:00
HarshKhandeparkar
4e5f8728fa Fixed Save Button (#562)
* update dist

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

dist update

Revert "dist update"

This reverts commit 9ee2a987e8f978961656ae8f71f6e6702bbbd30d.

* fix save button

* cleanup

* fix update initValue

* fix select type inputs

* fix integer type values

* fix integer type values

* cleanup

* changes and cleanup

* changes

* changes

* better solution

cleanup

* change detection finalized

* Fix <form> placement

* fix form ending

* changes

* cleanup

* fix merge conflicts

* better event listener

* cleanup

* cleanup

* Changes

* cleanup
2019-01-07 15:16:25 -05:00
Bhavay Anand
c2477bc3f7 fixed excessive space around thumbnail grid (#629) 2019-01-07 10:41:04 -05:00
Vibhor Gupta
ef4a4d3055 removed crop div (#623) 2019-01-07 09:40:53 -05:00
aashna27
20d49456fd Modified style for step remove notification (#620)
* modified style for step remove notification

* Update defaultHtmlStepUi.js
2019-01-06 14:44:25 -05:00
aashna27
2aa7e9b96c Dithering module added (#617) 2019-01-06 10:47:23 -05:00
jywarren
52c9c35398 version bump 2019-01-05 21:01:58 -05:00
Vibhor Gupta
a522e13613 media query for buttons (#583)
* media query for buttons

* easy fix

* quick icon scroll for small screens

* rebuild
2019-01-05 20:53:45 -05:00
Jeffrey Warren
f41f564bd9 npm audit (#614) 2019-01-05 20:51:24 -05:00
Vibhor Gupta
1a98247858 import/export bug fix (#608) 2019-01-05 20:37:42 -05:00
Mridul97
4369137336 update value below the slider (#565)
* update value below the slider

* changes
2019-01-05 20:17:39 -05:00
Mridul97
595d66ecd5 remove extra clear cache button and isolate cache code (#609)
* remove extra clear cache button

* isolate cache code

* changes
2019-01-05 17:28:11 -05:00
Mridul97
6d9f656a1e Show a message where to find saved sequence on saving a sequence (#586)
* show message on save sequence

* chaanges

* changes
2019-01-05 14:32:18 -05:00
Mridul97
69ed689ad7 refactor/speed-up brightness module (#558)
* refactor/speed-up brightness module

* changes
2019-01-05 11:23:29 -05:00
Jeffrey Warren
107b4c22e4 new defaults (#607) 2019-01-04 18:13:28 -05:00
jywarren
e5d36ca317 demo tweak 2019-01-04 15:08:41 -05:00
aashna27
eb595d6139 added sliders (#603) 2019-01-04 14:35:39 -05:00
MargaretAN9
2bdd532848 Fix fastie (#594)
* fixed fastie

* fixed greyscale (#593)

* add local to locally stored modules (#596)

* Add drawing rectangles module (#566)

* add drawing rectangle module

* changes

* White balance module (#585)

* white baalance module

* improved algorithm

* limit check

* Ability to set background color when "over cropping" to enlarge canvas (#563)

* ability to set background color when over cropping to enlarge canvas

* changes

* Clarify that saved sequence will only be available in this browser (#587)

* clarify that saved sequence will only be available in this browser

* changes

* changes

* changes

* Added a function to sequencer and then made the functionality available to crop and overlay module. (#592)

* Add manifest.json and cache static assets for offline use (#331)

* Add manifest.json

* cache static assets for offline use

* update cache

* add meta theme-color and change static files to be cache

* cache the files on network request

* caching on first run

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add a button to clear cache

* add styling to clear cache link

* Update Modules.js (#452)

I've arranged the modules in alphabetical order.

* Added a function to parse Input coordinates and added the functionality for crop and overlay modules

* Added changed dist files

* Revert "Added changed dist files"

This reverts commit dbda25a228.

* Changed function name and added the functionaity to src/utils folder

* Added unit test

* Added unit test to /test/util

* Add border thickness and color in DrawRectangle module (#602)

* added border thickness functionality

* add color functionality

* Bump tape from 4.9.1 to 4.9.2 (#579)

Bumps [tape](https://github.com/substack/tape) from 4.9.1 to 4.9.2.
- [Release notes](https://github.com/substack/tape/releases)
- [Commits](https://github.com/substack/tape/compare/v4.9.1...v4.9.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>

* Bump looks-same from 4.1.0 to 5.0.1 (#559)

Bumps [looks-same](https://github.com/gemini-testing/looks-same) from 4.1.0 to 5.0.1.
- [Release notes](https://github.com/gemini-testing/looks-same/releases)
- [Changelog](https://github.com/gemini-testing/looks-same/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gemini-testing/looks-same/compare/v4.1.0...v5.0.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>

* Bump jsqr from 0.2.2 to 1.1.1 (#532)

Bumps [jsqr](https://github.com/cozmo/jsQR) from 0.2.2 to 1.1.1.
- [Release notes](https://github.com/cozmo/jsQR/releases)
- [Commits](https://github.com/cozmo/jsQR/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>

* Update color drop down (#595)

* updated drop down

* fixed greyscale (#593)

* add local to locally stored modules (#596)

* Add drawing rectangles module (#566)

* add drawing rectangle module

* changes

* White balance module (#585)

* white baalance module

* improved algorithm

* limit check

* Ability to set background color when "over cropping" to enlarge canvas (#563)

* ability to set background color when over cropping to enlarge canvas

* changes

* Clarify that saved sequence will only be available in this browser (#587)

* clarify that saved sequence will only be available in this browser

* changes

* changes

* changes

* Added a function to sequencer and then made the functionality available to crop and overlay module. (#592)

* Add manifest.json and cache static assets for offline use (#331)

* Add manifest.json

* cache static assets for offline use

* update cache

* add meta theme-color and change static files to be cache

* cache the files on network request

* caching on first run

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add a button to clear cache

* add styling to clear cache link

* Update Modules.js (#452)

I've arranged the modules in alphabetical order.

* Added a function to parse Input coordinates and added the functionality for crop and overlay modules

* Added changed dist files

* Revert "Added changed dist files"

This reverts commit dbda25a228.

* Changed function name and added the functionaity to src/utils folder

* Added unit test

* Added unit test to /test/util

* Add border thickness and color in DrawRectangle module (#602)

* added border thickness functionality

* add color functionality

* rebuild
2019-01-04 14:05:59 -05:00
MargaretAN9
d104ea744b Update color drop down (#595)
* updated drop down

* fixed greyscale (#593)

* add local to locally stored modules (#596)

* Add drawing rectangles module (#566)

* add drawing rectangle module

* changes

* White balance module (#585)

* white baalance module

* improved algorithm

* limit check

* Ability to set background color when "over cropping" to enlarge canvas (#563)

* ability to set background color when over cropping to enlarge canvas

* changes

* Clarify that saved sequence will only be available in this browser (#587)

* clarify that saved sequence will only be available in this browser

* changes

* changes

* changes

* Added a function to sequencer and then made the functionality available to crop and overlay module. (#592)

* Add manifest.json and cache static assets for offline use (#331)

* Add manifest.json

* cache static assets for offline use

* update cache

* add meta theme-color and change static files to be cache

* cache the files on network request

* caching on first run

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add a button to clear cache

* add styling to clear cache link

* Update Modules.js (#452)

I've arranged the modules in alphabetical order.

* Added a function to parse Input coordinates and added the functionality for crop and overlay modules

* Added changed dist files

* Revert "Added changed dist files"

This reverts commit dbda25a228.

* Changed function name and added the functionaity to src/utils folder

* Added unit test

* Added unit test to /test/util

* Add border thickness and color in DrawRectangle module (#602)

* added border thickness functionality

* add color functionality
2019-01-04 12:34:13 -05:00
dependabot[bot]
bc122af258 Bump jsqr from 0.2.2 to 1.1.1 (#532)
Bumps [jsqr](https://github.com/cozmo/jsQR) from 0.2.2 to 1.1.1.
- [Release notes](https://github.com/cozmo/jsQR/releases)
- [Commits](https://github.com/cozmo/jsQR/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-04 12:21:51 -05:00
dependabot[bot]
11476d5084 Bump looks-same from 4.1.0 to 5.0.1 (#559)
Bumps [looks-same](https://github.com/gemini-testing/looks-same) from 4.1.0 to 5.0.1.
- [Release notes](https://github.com/gemini-testing/looks-same/releases)
- [Changelog](https://github.com/gemini-testing/looks-same/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gemini-testing/looks-same/compare/v4.1.0...v5.0.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-04 12:20:49 -05:00
dependabot[bot]
a2157be2da Bump tape from 4.9.1 to 4.9.2 (#579)
Bumps [tape](https://github.com/substack/tape) from 4.9.1 to 4.9.2.
- [Release notes](https://github.com/substack/tape/releases)
- [Commits](https://github.com/substack/tape/compare/v4.9.1...v4.9.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2019-01-04 12:19:50 -05:00
Mridul97
b71e9dec12 Add border thickness and color in DrawRectangle module (#602)
* added border thickness functionality

* add color functionality
2019-01-04 11:27:29 -05:00
Slytherin
aad1f823d3 Added a function to sequencer and then made the functionality available to crop and overlay module. (#592)
* Add manifest.json and cache static assets for offline use (#331)

* Add manifest.json

* cache static assets for offline use

* update cache

* add meta theme-color and change static files to be cache

* cache the files on network request

* caching on first run

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add a button to clear cache

* add styling to clear cache link

* Update Modules.js (#452)

I've arranged the modules in alphabetical order.

* Added a function to parse Input coordinates and added the functionality for crop and overlay modules

* Added changed dist files

* Revert "Added changed dist files"

This reverts commit dbda25a228.

* Changed function name and added the functionaity to src/utils folder

* Added unit test

* Added unit test to /test/util
2019-01-04 11:27:00 -05:00
Mridul97
b520622bfd Clarify that saved sequence will only be available in this browser (#587)
* clarify that saved sequence will only be available in this browser

* changes

* changes

* changes
2019-01-03 16:22:21 -05:00
Mridul97
6028520197 Ability to set background color when "over cropping" to enlarge canvas (#563)
* ability to set background color when over cropping to enlarge canvas

* changes
2019-01-03 15:00:11 -05:00
Vibhor Gupta
a60acd5a72 White balance module (#585)
* white baalance module

* improved algorithm

* limit check
2019-01-03 14:26:06 -05:00
Mridul97
0fc8007e79 Add drawing rectangles module (#566)
* add drawing rectangle module

* changes
2019-01-03 13:41:34 -05:00
Mridul97
5bdaea3688 add local to locally stored modules (#596) 2019-01-03 12:23:16 -05:00
MargaretAN9
e353465dce fixed greyscale (#593) 2019-01-03 00:39:31 -05:00
Vibhor Gupta
39c70d1304 updating description text to default (#574) 2019-01-02 19:06:20 -05:00
HarshKhandeparkar
611016b022 Fixed Gif Generation (#561)
* update dist

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

dist update

Revert "dist update"

This reverts commit 9ee2a987e8f978961656ae8f71f6e6702bbbd30d.

* Fix Gif
2018-12-28 22:10:02 +05:30
Varun Gupta
f77cface7b Merge pull request #560 from tech4GT/updateDist2
update dist
2018-12-27 12:33:34 +05:30
tech4GT
f3291e201f update dist
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-12-27 12:32:34 +05:30
Varun Gupta
901cf6a96c Merge pull request #555 from Divy123/docs-improve
Added documentation for all remaining modules
2018-12-27 12:30:38 +05:30
divy123
7f4f9a0950 Added dist file changes 2018-12-26 22:36:24 +05:30
divy123
3a39d2b4bb Merge remote-tracking branch 'upstream/main' into docs-improve 2018-12-26 22:05:02 +05:30
Slytherin
3ab02125cb Fixed a typo. 2018-12-26 20:25:30 +05:30
Varun Gupta
d5aac98a29 Merge pull request #554 from HarshKhandeparkar/btn-rearrange
Rearrange Sequence Buttons
2018-12-26 19:49:06 +05:30
divy123
8ff09e26cc Corrected markdown format-2 2018-12-26 00:33:30 +05:30
divy123
d7b175eceb Corrected markdown format 2018-12-26 00:26:14 +05:30
divy123
ee5a3a5e4f Added index to MODULES.md 2018-12-26 00:21:19 +05:30
divy123
35b95a68b1 Added documentation for all modules in Modules.md and added a link in info.json of each Module 2018-12-25 03:59:39 +05:30
HarshKhandeparkar
5288973a48 cleanup 2018-12-23 17:27:58 +05:30
HarshKhandeparkar
d49acd504e btn-fix 2018-12-23 17:26:06 +05:30
HarshKhandeparkar
ac9086e4ef rearrange buttons 2018-12-21 00:17:28 +05:30
Varun Gupta
94e4dfe1b9 Merge pull request #553 from tech4GT/deadLink
fix contributing.md
2018-12-20 08:51:48 +05:30
tech4GT
056e57af8b fix contributing.md
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-12-20 08:50:30 +05:30
Varun Gupta
9fedf4b9c7 Merge pull request #552 from tech4GT/dependencies
Update dist files
2018-12-19 17:20:04 +05:30
tech4GT
300d972718 update dist files
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-12-19 17:17:57 +05:30
Varun Gupta
e2f1fb9729 Merge pull request #548 from publiclab/dependabot/npm_and_yarn/tape-run-5.0.0
Bump tape-run from 4.0.0 to 5.0.0
2018-12-19 17:16:57 +05:30
Varun Gupta
3e5cec32e4 Merge pull request #549 from aashna27/Take-Photo-functionality
TakePhoto functionality added
2018-12-19 17:12:09 +05:30
tech4GT
8a96bd8cac update dist files
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-12-19 17:04:09 +05:30
tech4GT
7cd89c4481 Merge branch 'main' of https://github.com/publiclab/image-sequencer into local 2018-12-19 17:01:45 +05:30
Varun Gupta
980966ecfa Merge pull request #551 from tech4GT/fixInsertStep
fix bug preventing insert-step
2018-12-19 17:01:17 +05:30
tech4GT
eebf149532 fix bug preventing insert-step
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-12-19 17:00:09 +05:30
aashna27
59898d72fe TakePhoto functionality added 2018-12-18 02:43:28 +05:30
Varun Gupta
23f4851bb5 Merge pull request #545 from Divy123/add-step-btn
Added insert step button at every step
2018-12-17 16:34:57 +05:30
divy123
6bab70ad09 Add step butoon disabled for last step 2018-12-17 16:02:32 +05:30
tech4GT
327b421284 remove excess logs
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-12-17 11:54:25 +05:30
tech4GT
98e4eca24f update sequence expansion
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-12-17 11:50:16 +05:30
dependabot[bot]
a93440093b Bump tape-run from 4.0.0 to 5.0.0
Bumps [tape-run](https://github.com/juliangruber/tape-run) from 4.0.0 to 5.0.0.
- [Release notes](https://github.com/juliangruber/tape-run/releases)
- [Changelog](https://github.com/juliangruber/tape-run/blob/master/History.md)
- [Commits](https://github.com/juliangruber/tape-run/compare/v4.0.0...v5.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-17 06:12:30 +00:00
tech4GT
0c2d2a47d8 fix save-sequence and refactor
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-12-17 10:56:17 +05:30
tech4GT
16debae154 fixes #544 and final changes
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-12-16 20:01:53 +05:30
tech4GT
3e30c0f7ed Merge branch 'add-step-btn' of https://github.com/Divy123/image-sequencer into divy 2018-12-16 16:32:07 +05:30
divy123
fd78285ac7 Merge branch 'add-step-btn' of https://github.com/Divy123/image-sequencer into add-step-btn 2018-12-16 16:03:56 +05:30
divy123
4eb386eb47 Added font-awesome icon and added colors to it 2018-12-16 16:02:49 +05:30
divy123
f27b09793c Changed arrow functions to normal functions 2018-12-16 15:39:48 +05:30
dependabot[bot]
a56e8a3b16 Bump buffer from 5.0.8 to 5.2.1 (#524)
Bumps [buffer](https://github.com/feross/buffer) from 5.0.8 to 5.2.1.
- [Release notes](https://github.com/feross/buffer/releases)
- [Commits](https://github.com/feross/buffer/compare/v5.0.8...v5.2.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-15 19:14:39 -05:00
dependabot[bot]
b666ad510b [Security] Bump bootstrap from 3.3.7 to 3.4.0 (#543)
Bumps [bootstrap](https://github.com/twbs/bootstrap) from 3.3.7 to 3.4.0. **This update includes security fixes.**
- [Release notes](https://github.com/twbs/bootstrap/releases)
- [Commits](https://github.com/twbs/bootstrap/compare/v3.3.7...v3.4.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-15 18:58:45 -05:00
dependabot[bot]
809fb0b37a [Security] Bump cached-path-relative from 1.0.1 to 1.0.2 (#519)
Bumps [cached-path-relative](https://github.com/ashaffer/cached-path-relative) from 1.0.1 to 1.0.2. **This update includes security fixes.**
- [Release notes](https://github.com/ashaffer/cached-path-relative/releases)
- [Changelog](https://github.com/ashaffer/cached-path-relative/blob/master/History.md)
- [Commits](https://github.com/ashaffer/cached-path-relative/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-15 18:58:08 -05:00
Slytherin
a4818d70d8 Merge branch 'main' into add-step-btn 2018-12-16 02:25:12 +05:30
divy123
537cc41b36 Added insert step button at every step 2018-12-16 02:16:45 +05:30
Jonathan Xu
95f8dad901 Add grid of thumbnails (#539)
* Added four preview images

* Added preview images to buttons

* Maked the crop preview resposive

* icon overlays

* made previews square

* finalized css for square images

* Added four preview images

* Added preview images to buttons

* Maked the crop preview resposive

* icon overlays

* made previews square

* finalized css for square images
2018-12-09 22:35:32 -05:00
Varun Gupta
ceca433806 Merge pull request #536 from tech4GT/update
Update dist and lock files
2018-12-07 23:37:09 +05:30
tech4GT
1e719936c4 update dist and lock files
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-12-07 23:31:01 +05:30
pomyo
1ae20b536a Update defaultHtmlStepUi.js (#517) 2018-12-07 12:52:48 -05:00
Osama Mostafa
753e73f355 Update README.md (#525)
Updated the command for installing dependencies for Unix based platform to:
`sudo npm run setup` instead of  `sudo npm setup` as requested in issues.
2018-12-07 12:41:59 -05:00
dependabot[bot]
a26a441b20 Bump browserify from 13.0.0 to 16.2.3 (#533)
Bumps [browserify](https://github.com/browserify/browserify) from 13.0.0 to 16.2.3.
- [Release notes](https://github.com/browserify/browserify/releases)
- [Changelog](https://github.com/browserify/browserify/blob/master/changelog.markdown)
- [Commits](https://github.com/browserify/browserify/compare/13.0.0...v16.2.3)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-06 21:12:01 -05:00
dependabot[bot]
7ae8a2ddf7 Bump bootstrap from 3.2.0 to 3.3.7 (#523)
Bumps [bootstrap](https://github.com/twbs/bootstrap) from 3.2.0 to 3.3.7.
- [Release notes](https://github.com/twbs/bootstrap/releases)
- [Commits](https://github.com/twbs/bootstrap/compare/v3.2.0...v3.3.7)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-06 21:11:48 -05:00
dependabot[bot]
c81f5c6caf Bump looks-same from 3.3.0 to 4.1.0 (#531)
Bumps [looks-same](https://github.com/gemini-testing/looks-same) from 3.3.0 to 4.1.0.
- [Release notes](https://github.com/gemini-testing/looks-same/releases)
- [Changelog](https://github.com/gemini-testing/looks-same/blob/master/CHANGELOG.md)
- [Commits](https://github.com/gemini-testing/looks-same/compare/v3.3.0...v4.1.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-06 16:20:32 -05:00
dependabot[bot]
6d381c0df8 Bump font-awesome from 4.5.0 to 4.7.0 (#527)
Bumps [font-awesome](https://github.com/FortAwesome/Font-Awesome) from 4.5.0 to 4.7.0.
- [Release notes](https://github.com/FortAwesome/Font-Awesome/releases)
- [Changelog](https://github.com/FortAwesome/Font-Awesome/blob/master/CHANGELOG.md)
- [Commits](https://github.com/FortAwesome/Font-Awesome/compare/v4.5.0...v4.7.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-06 16:20:09 -05:00
dependabot[bot]
6a2f106b4c Bump image-filter-core from 1.0.0 to 2.0.2 (#528)
Bumps [image-filter-core](https://github.com/canastro/image-filter-core) from 1.0.0 to 2.0.2.
- [Release notes](https://github.com/canastro/image-filter-core/releases)
- [Commits](https://github.com/canastro/image-filter-core/commits/2.0.2)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-06 16:14:57 -05:00
dependabot[bot]
65a6b77b78 Bump grunt-contrib-concat from 0.5.1 to 1.0.1 (#522)
Bumps [grunt-contrib-concat](https://github.com/gruntjs/grunt-contrib-concat) from 0.5.1 to 1.0.1.
- [Release notes](https://github.com/gruntjs/grunt-contrib-concat/releases)
- [Changelog](https://github.com/gruntjs/grunt-contrib-concat/blob/master/CHANGELOG)
- [Commits](https://github.com/gruntjs/grunt-contrib-concat/compare/v0.5.1...v1.0.1)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-05 18:42:04 -05:00
dependabot[bot]
c688817ffc Bump image-filter-threshold from 1.0.0 to 2.0.1 (#521)
Bumps [image-filter-threshold](https://github.com/canastro/image-filter-threshold) from 1.0.0 to 2.0.1.
- [Release notes](https://github.com/canastro/image-filter-threshold/releases)
- [Commits](https://github.com/canastro/image-filter-threshold/commits)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-05 18:41:54 -05:00
dependabot[bot]
ca67bf1ece Bump ora from 2.1.0 to 3.0.0 (#529)
Bumps [ora](https://github.com/sindresorhus/ora) from 2.1.0 to 3.0.0.
- [Release notes](https://github.com/sindresorhus/ora/releases)
- [Commits](https://github.com/sindresorhus/ora/compare/v2.1.0...v3.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-05 18:41:41 -05:00
dependabot[bot]
88a31e564e Bump tape-run from 3.0.4 to 4.0.0 (#520)
Bumps [tape-run](https://github.com/juliangruber/tape-run) from 3.0.4 to 4.0.0.
- [Release notes](https://github.com/juliangruber/tape-run/releases)
- [Changelog](https://github.com/juliangruber/tape-run/blob/master/History.md)
- [Commits](https://github.com/juliangruber/tape-run/compare/v3.0.4...v4.0.0)

Signed-off-by: dependabot[bot] <support@dependabot.com>
2018-12-05 11:36:37 -05:00
Bhavay Anand
2161d58e50 slider now goes all the way to right & left (#510) 2018-11-30 18:36:26 -05:00
Oorjit Chowdhary
108e87996a Corrected brightness default view (#509) 2018-11-30 12:50:20 -05:00
Bhavay Anand
f152a78e70 align add-step button with select-module input (#501) 2018-11-30 12:48:21 -05:00
Ville Pajala
5af30d9046 Change button text (#505) 2018-11-29 17:39:28 -05:00
Jan Okoński
ddf4bd0dae Added the sucessfull installation prompt (#485) 2018-11-26 14:06:43 -05:00
Mridul97
3712f0c1cf Skip writing defaults (#497)
* skip writing defaults

* solve build errors
2018-11-26 14:06:13 -05:00
Jonathan Xu
f672dc814a display add step menu with common modules as "quick" buttons (#479)
* added icons, rearranging

* basic framework for addstep modules

* linked buttons to automatic step addition

* Delete package-lock.json

* rounded buttons and text movement in image sequencer select

* made null option visible in select dropdown

* package-lock.json
2018-11-21 19:49:48 -05:00
Jeffrey Warren
98c71b18a8 Add manifest.json and cache static assets for offline use (#331) (#486)
* Add manifest.json

* cache static assets for offline use

* update cache

* add meta theme-color and change static files to be cache

* cache the files on network request

* caching on first run

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add a button to clear cache

* add styling to clear cache link
2018-11-20 22:53:38 -05:00
Bhavay Anand
3ca4081042 fixed few typos (#482)
* fixed few typos

* fixed typos in docs

* suggested changes
2018-11-20 18:04:34 -05:00
HarshKhandeparkar
cd6f61d71a Flash Message bug fix (#481) 2018-11-20 17:04:09 -05:00
HarshKhandeparkar
20cf3277ea Feature enter to save (#483)
* Flash Message bug fix

* enter-to-submit functionality added

* cleanup
2018-11-20 16:46:07 -05:00
HarshKhandeparkar
bf13d5807a GCI task pull request (#474)
* GCI task commit

* GCI task commit

* Cleaned up the code

* Added the css to demo.css file

* Final cleanup and shortened code

* Code compacting

* All beautify changes reverted

* Spacing corrected
2018-11-18 12:29:19 -05:00
Rishabh Rawat
ef10fb77f1 Capitalize the Gif text on View Gif button. (#476) 2018-11-17 23:17:22 -05:00
Jeffrey Warren
19110c4677 Colormap fixes! (#475)
* updated colormap.js

* remove redundancy

* compile

* added maps to interface
2018-11-17 11:19:58 -05:00
Jan Okoński
d209cd46b1 Added a success message after a successfull sequence saving (#469) 2018-11-13 14:35:57 -05:00
Mridul97
4bdc5b6583 Add contrast module (#463) 2018-11-13 12:22:48 -05:00
Slytherin
4576e497db Disabled save-sequence button when no steps are added (#462) 2018-11-11 14:41:55 -05:00
kevinzluo
1311119787 Alphabetizes the modules in src/Modules.js (#441) 2018-11-11 13:12:56 -05:00
aashna27
9e1a12c58d brightness module's info.json modified (#461) 2018-11-11 12:51:09 -05:00
aashna27
948f67fb60 rebuild (#454) 2018-11-08 15:44:36 -05:00
Jeffrey Warren
8685dcb66c bugfixes (#457) 2018-11-08 14:22:25 -05:00
Jeffrey Warren
2243a4b8f7 Update README.md 2018-11-08 10:46:12 -05:00
Jeffrey Warren
7fe16735b3 Update README.md 2018-11-05 12:19:37 -05:00
Jeffrey Warren
a17d1a6ccd ability to set image via url hash (#455) 2018-11-05 12:10:20 -05:00
KusioDev
5f57123503 Add resize module (#451)
* added resize module - without test

* Added resize test, deleted unused value in blend test (which I've added before)

* Fixed test

* Fixed test

* added modules file

* added imagejs to package

* removed test - not able to check width and height of the element

* Changed resize calculations
2018-11-03 00:39:41 -04:00
Varun Gupta
d2ff6f2d6c add demo files to npmignore (#425)
* add demo files to npmignore

Signed-off-by: Varun Gupta <varun.gupta1798@gmail.com>

* remove dist and test from npmignore
2018-10-30 20:14:10 -04:00
TheRealBilaal
361be0074c Added cli installation message (#448)
* Added cli installation message (#338)

* Added cli installation message (#338)
2018-10-30 19:16:47 -04:00
Sparks
f9376808fd Include a back-to-top Button on scrolling down (#446)
* Update index.html

* Create scrollToTop.js

* Update demo.css

* Update index.html
2018-10-27 18:34:21 -04:00
faithngetich
85c92626e4 Create config.yml (#404)
* Create config.yml

* Update the link where the code will be published 

Co-Authored-By: faithngetich <faithngetich188@gmail.com>
2018-10-27 18:30:28 -04:00
Timofey Barinov
b30b539dab Added gif download modal (#442)
* Enhance gif view

* Gif modal download button & Fix gif downloading

* Fix gif generation aspect ratio

* Fix fix gif downloading

* Clarified Download(PNG) button
2018-10-26 13:53:49 -04:00
KusioDev
e5e372d89d Add configurable parameter for blend module to chose image (#424)
* Add configurable parameter for blend module to chose image

* Made minor changes

* Edit test to work with new parameter

* blend offset test added

* blend offset test added

* fixed blend offset test
2018-10-23 15:03:41 -04:00
aashna27
11b65604cd Added slider for Brightness and Blur modules (#428) 2018-10-22 17:01:12 -04:00
Sasha Boginsky
c762f1ad5d Add issue and pull request templates into image sequencer repository (#420)
* Add issue and pull request templates into image sequencer repository

* Add issue and pull request templates into image sequencer repository
2018-10-22 15:09:25 -04:00
aashna27
965399a2b4 Added scripts in package.json to fix installation (#411)
* Added scripts in package.json to fix installation

* Update setup script

* Update README.md

Add installation instructions for windows

* Update README.md

added headers for windows and Unix
2018-10-22 11:55:18 -04:00
aashna27
3df5ca3802 Added link in description of edge-detect module (#419) 2018-10-22 11:54:39 -04:00
Jeffrey Warren
7e594c4168 updated package.json versions (#426) 2018-10-20 18:40:32 -04:00
Kshitij
5e28f901eb fix typos (#412)
* fix typos

This commit fixes the issue #408

* remove trailing space
2018-10-20 02:37:14 +08:00
sagarwala
48eafe806f removed typos as mentioned in issue #408 (#410) 2018-10-17 09:32:20 +08:00
Sasha Boginsky
6638e9bdb4 Update info.json #407 (#413)
* Update info.json

* Update PRs #413
2018-10-16 12:16:56 +08:00
Varun Gupta
bf80c2b2b6 add lock files (#414)
Signed-off-by: Varun Gupta <varun.gupta1798@gmail.com>
2018-10-16 12:12:11 +08:00
Varun Gupta
e512e98921 update start script (#406)
Signed-off-by: Varun Gupta <varun.gupta1798@gmail.com>
2018-10-14 06:22:19 +08:00
puneet bindal
9168c15cf9 added gif feature (#360)
* added gif feature

* increased frame duration n changed gif btn name

* removed inline css

* improved ui

* #363 Add placeholder option to input (#370)

* Add placeholder option to input , change type of brightness input to number

 Changes to be committed:
	modified:   examples/lib/defaultHtmlStepUi.js
	modified:   src/modules/Brightness/info.json

* change 0% to 0 in brightness placeholder

* Add gamma module (#374)

* Add gamma module

* update description

* Add matrix math module (#358)

* Add matrix math module

* add info.json file

* correct format of module

* Add a constant factor input field

* clone the pixels array

* change default values

* add extra information on convolution module (#381)

* adds default values to input fields for all module steps ( fixes #382 ) (#384)

* added default values to input fields for all module steps

* merged

Signed-off-by: Ankit Singla <asingla590@gmail.com>

* Accept type images in input field #364 (#366)

* gif button name changed

* fixes #383 (#396)

Signed-off-by: Varun Gupta <varun.gupta1798@gmail.com>

* fix (#387)

Signed-off-by: Varun Gupta <varun.gupta1798@gmail.com>

* updated

* Issue #392 Fixes alignment of message in Add step box (#393)

*  Fixes alignment of message in Add step box

* fixes css info id

* updates class selector in demo

* Spacing changes

* correctly regulates the behaviour of all links (#397)

Signed-off-by: Ankit Singla <asingla590@gmail.com>

* enables Save button for an action if any of its input fields gain focus (#394)

* Updated index.html (#379)

* add histogram module (#354)

* add histogram module

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add option to drop gradient

Signed-off-by: Varun Gupta <varun.gupta1798@gmail.com>

* fix bug

Signed-off-by: Varun Gupta <varun.gupta1798@gmail.com>
2018-10-10 03:46:04 -05:00
Varun Gupta
276a637ac3 add histogram module (#354)
* add histogram module

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add option to drop gradient

Signed-off-by: Varun Gupta <varun.gupta1798@gmail.com>

* fix bug

Signed-off-by: Varun Gupta <varun.gupta1798@gmail.com>
2018-10-08 14:56:35 -05:00
Daksh Gondaliya
1d085c7f20 Updated index.html (#379) 2018-10-08 14:14:02 -04:00
Ankit Singla
802b281096 enables Save button for an action if any of its input fields gain focus (#394) 2018-10-08 14:13:09 -04:00
Ankit Singla
67408ca338 correctly regulates the behaviour of all links (#397)
Signed-off-by: Ankit Singla <asingla590@gmail.com>
2018-10-08 14:12:34 -04:00
Daniel Larner
a67fe91d0d Issue #392 Fixes alignment of message in Add step box (#393)
*  Fixes alignment of message in Add step box

* fixes css info id

* updates class selector in demo

* Spacing changes
2018-10-08 12:22:56 -04:00
Varun Gupta
09669fe858 fix (#387)
Signed-off-by: Varun Gupta <varun.gupta1798@gmail.com>
2018-10-06 13:06:41 -04:00
Varun Gupta
768117a078 fixes #383 (#396)
Signed-off-by: Varun Gupta <varun.gupta1798@gmail.com>
2018-10-06 13:06:15 -04:00
aashna27
2e7e042baa Accept type images in input field #364 (#366) 2018-10-05 13:18:56 -04:00
Ankit Singla
b300dc2d1f adds default values to input fields for all module steps ( fixes #382 ) (#384)
* added default values to input fields for all module steps

* merged

Signed-off-by: Ankit Singla <asingla590@gmail.com>
2018-10-05 11:55:11 -04:00
Mridul97
fef021911b add extra information on convolution module (#381) 2018-10-05 08:00:05 -04:00
Mridul97
70654a5aac Add matrix math module (#358)
* Add matrix math module

* add info.json file

* correct format of module

* Add a constant factor input field

* clone the pixels array

* change default values
2018-10-04 12:46:21 -04:00
Mridul97
338e610fe7 Add gamma module (#374)
* Add gamma module

* update description
2018-10-03 15:00:42 -04:00
Adriano Costa
06d2aaf1e2 #363 Add placeholder option to input (#370)
* Add placeholder option to input , change type of brightness input to number

 Changes to be committed:
	modified:   examples/lib/defaultHtmlStepUi.js
	modified:   src/modules/Brightness/info.json

* change 0% to 0 in brightness placeholder
2018-10-02 18:18:31 -04:00
vikul1234
5a362f5c9a Update demo.css (#365) 2018-10-01 11:46:57 -06:00
puneet bindal
76826d431d refracted defaultHtmlStepUi.js (#362) 2018-09-30 19:43:51 -06:00
Mridul97
88364decf6 change display value of ndvi from 0-255 to -1 to 1 (#333)
* change display value of ndvi from 0-255 to -1 to 1

* change in dist files

* Truncate ndvi value for displaying
2018-09-12 11:10:32 -04:00
Mridul97
bb17e9452f Add download button (#328) 2018-09-11 15:57:55 -04:00
Varun Gupta
cce65141d2 fix UI functions (#330)
* fix UI functions

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* Update package.json
2018-09-08 11:13:25 -04:00
Mridul97
b707592588 Show 'Press save to see changes' next to each step's 'Save' button (#329) 2018-09-05 18:17:28 -04:00
Varun Gupta
0638a1c68c refactor and remove hysteresis (#327)
* refactor and remove hysteresis

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fixes #323

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* bump version #
2018-09-05 16:39:13 -04:00
Mridul97
6106e5ee0c Disable-save-button (#322) 2018-08-30 15:04:09 -04:00
Jeffrey Warren
d4eff45664 version bup (#321) 2018-08-06 14:42:19 -04:00
Varun Gupta
5a3b94d4ee fix (#319)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-08-06 14:33:37 -04:00
Varun Gupta
a238fc65e1 2.2.0 (#317) 2018-08-06 12:10:45 -04:00
Varun Gupta
e15e981d0b Colorbar added (#316)
* setup

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* overlay done

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add colorbar fixes #285

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add inputs to colorbar

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-08-06 11:53:08 -04:00
Varun Gupta
43e6253095 change url string fixes #306 (#313)
* change url string fixes #306

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix typo

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-08-04 17:44:09 -04:00
Varun Gupta
6be996692a pixel value on hover in ndvi fixes #307 (#314)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-08-04 11:09:36 -04:00
Varun Gupta
5b4e904636 add toCliString function fixes #140 (#312)
* add toCliString function fixes #140

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update docs

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add test

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-08-04 10:38:41 -04:00
Varun Gupta
5ab018fb84 Meta modules (#308)
* meta-modules in node

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* meta-modules in browser

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update docs

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* more doc

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix typo

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update docs and sample meta-module

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add dynamic modules CLI from npm

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* meta-modules and sequence saving completed

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add docs

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update docs

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fixed test

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-08-04 10:07:20 -04:00
Varun Gupta
10e47656a3 add steps api functions (#293)
* add steps api functions

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* optimize getHeight and getWidth

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add tests

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update tests

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-07-25 14:00:54 -04:00
kevinkmmak
56feb4c546 Add-button-dim (#310)
Dim the button onLoad, then enable it when selected.
2018-07-24 12:55:52 -04:00
Varun Gupta
73a9cd2961 named export for single image basic mode fixes #297 (#301)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-07-18 10:39:21 -04:00
Varun Gupta
42d49112ef implement importNewModule (#294)
* implement importNewModule

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* make apis available on input object

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update docs

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* minor updates and more docs

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* major refactor simplify module loading

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* final updates and invert installed from npm

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update contributing.md

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fixes

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update documentation

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-07-18 10:14:16 -04:00
Varun Gupta
0c0147354e fallback to jpg when no format detected (#296)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-07-01 08:09:10 -04:00
Varun Gupta
510cf3421a reduce redundance of add and insert fixes #261 (#295)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-06-21 15:15:09 -04:00
Varun Gupta
8d6b82d988 Minimize mod req (#289)
* remove trailing spaces from Run.js

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* minimize module requirements demonstrated with invert fixes #122

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* refactored modules

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update docs

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* remove all trailing spaces from all files

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fixing crop module

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update contributing.md

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-06-15 14:44:18 -05:00
Varun Gupta
5132612dc2 fixed the demo (#291)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-06-11 11:25:33 -04:00
Varun Gupta
f4315159a9 fix remove step UI (#288)
* fix remove step UI

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* 2.1.0
2018-06-08 15:46:32 -04:00
Varun Gupta
de20254637 2.0.0 (#287) 2018-06-08 14:31:50 -04:00
Varun Gupta
10c6ad5865 Run optimize (#275)
* fixes #269

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update demo

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* refactor and comments

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update readme

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* updated and refactored

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update readme

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* trying to fix tests

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update documentation

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update to config.mode = test

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* finaly everything works

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* 1.8.0

* update test

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add test for run

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-06-08 14:13:41 -04:00
Varun Gupta
a0f7e6c766 add importString and refactor (#283)
* add importString and refactor

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update tests and minor changes

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update importImage

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-06-06 21:21:53 -04:00
Varun Gupta
2b07ecdb36 Fix import image (#282)
* fix default image path

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix importImage to take proper input

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-06-06 20:03:50 -04:00
Jeffrey Warren
37122d4c28 test import string with no configs (#279)
* test import string with no configs

* now working without ()

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update test

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* refactor for readability

* refactor for pipes | between multiple step settings

* fixed bugs

* test fixed
2018-06-03 13:22:40 -07:00
Varun Gupta
871453b857 Url params 🎉 (#276)
* basic implementation

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix bug

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix everything

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add test and refactor

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update demo

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix comma issue

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update test

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* now doing with native encode

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-06-03 09:11:07 -07:00
Varun Gupta
ac183205f0 implement basic toString() (#272)
* implement basic toString()

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* refactor

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* remove load-image from string

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* more refactor

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* doing es5 way

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* final refactor

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* refactor

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* remove if else from map

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix function call

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add sequencer.steps

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add tests for toString and stepToString

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix toString final

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix build failing

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* refactored and fix tests

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* refactor tests

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-06-01 12:45:22 -04:00
Varun Gupta
be810fb9c4 add basic test and remove some bugs (#271)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-05-28 20:54:23 -04:00
Varun Gupta
8d3ca0887f fixes #267 dragZone listener getting confused (#270)
* fixes #267 dragZone listener getting confused

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* remove log

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-05-28 18:44:42 -04:00
Varun Gupta
1de72d7325 Prev step final API (#268)
* 1.7.0

* fix the api

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fixes #266

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* finally got this to work! Phew :D

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* remove extra log

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* getStepAPI in insertStep

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add getPreviousStep API

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* more api

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* changes and refactor

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* now using this.getStep and related functions

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add getNextStep

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* minor refactor

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update getIndex

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-05-28 01:33:17 -04:00
Varun Gupta
58a4798674 ImportImage (#264)
* not working yet...

* fixed basic functioning!

* working! now on to blending
2018-05-24 17:18:48 -04:00
Varun Gupta
f8006da07e Blend module updated (#263)
* blend initial steps

* access to prior steps via passed util api

* Update Blend And add missing start script

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* blend complete

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-05-24 16:01:09 -04:00
Varun Gupta
09c4f250a2 add API to get steps (#259)
* add API to get steps

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update dist and refactor

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* rename to getStepOutput

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* api complete

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add test

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* change indentation to 2 spaces

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* minor fixes

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* new API

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* remove commented code

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* modifiication to invert

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-05-23 17:38:20 -07:00
Varun Gupta
bd490d2515 add serve grunt task (#258)
* add serve grunt task

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add npm start

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* update readme

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix typo

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-05-22 10:56:46 -07:00
Varun Gupta
ca79924d11 fixes #254 (#257)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-05-22 03:04:14 -07:00
Jeffrey Warren
630eb773de start breaking out a ui feature to set an input step (#253)
* start

* refactoring

* working

* version bump
2018-05-09 13:49:11 -04:00
Jeffrey Warren
6ce78f87f4 ui output for average (#252) 2018-05-09 10:11:20 -04:00
Jeffrey Warren
991e9bb29c start to average module (#249)
* start to average module

* completed average module

* added average module, version bump
2018-05-09 09:39:33 -04:00
Jeffrey Warren
cbbfbff4bc bugfix version bump (#248) 2018-05-07 10:46:38 -04:00
Jeffrey Warren
768e2ce95d Ui refactor and drag to crop (#245)
* Drag to crop rebase step (#244)

* 1.1.0

* 1.2.0

* added plugin

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* drag to crop enabled

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* improvement

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* done dragToCrop

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* done with updated ui

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* solved bug for multiple consecutive crops

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fixed and updated

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* externalized image area select code

* major refactoring of crop drag and demo ui modules

* work on crop module and ui refactor

* completed Step drag ui refactor

* revert unbuilt to rebase

* built and version bump

* various fixes
2018-05-04 14:27:48 -04:00
Jeffrey Warren
51524f747a uses jquery if available in replace (#240) 2018-05-03 18:02:25 -04:00
Jeffrey Warren
b16b45afa8 removed jquery (#239)
* removed jquery

* version bump
2018-05-03 17:33:01 -04:00
Jeffrey Warren
39418da187 Format detection fix (#238)
* better format detection

* version
2018-05-03 16:35:02 -04:00
Jeffrey Warren
8547c60873 Update PixelManipulation.js (#236) 2018-05-02 17:09:09 -04:00
Jeffrey Warren
adc21ae843 Rename colormap (#235) 2018-05-02 16:08:50 -04:00
Jeffrey Warren
2abf0fae09 Code cleanup, re-organizing and tidying (#226)
* initial cleanup

* build

* additions and build
2018-04-29 12:16:11 -04:00
Jeffrey Warren
711ae62ee3 simplified demo ui (#224)
* simplified demo ui

* show description

* smaller, labelled example image
2018-04-28 18:40:34 -04:00
Jeffrey Warren
4d75fb9640 Infos updated for new title/description format (#221)
* initial work

* working with failing test

* info modules

* compiled

* rework of CONTRIBUTING
2018-04-24 17:15:27 -04:00
Marzanna
5ac3ef008d demo images can be downloaded by clicking (#220)
* demo images can be downloaded by clicking

* modified download to extract image type from url

* refactored image output into standalone function

* updated to call fileExtension function
2018-04-20 19:56:32 -04:00
Varun Gupta
98f913b32e Material icon (#217)
* add pwa icon

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* icon working

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-04-20 14:07:52 -04:00
Jeffrey Warren
c2756ffdbb Module info.json -based demo UI (WIP) (#219)
* initial work

* working with failing test

* now should pass test
2018-04-20 09:34:08 -04:00
Varun Gupta
d887f5eb61 Update version (#208)
* 1.1.0

* 1.2.0

* check in dist

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-04-09 16:53:40 -04:00
Varun Gupta
3b791ad58b add loading spinner fallback (#202)
* add loading spinner fallback fixes #189

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* handle testing with progress spinners

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* apply fixes and improvements

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add example

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* bug fixes

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* resolves #189

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-03-31 01:21:28 -04:00
Varun Gupta
fba80bb151 Dynamic fix as fun (#207)
getNeighborPixel(x, y) method for Dynamic module
2018-03-30 17:41:30 -04:00
Varun Gupta
0ceb36ffde 1.1.0 (#206) 2018-03-24 10:06:50 -04:00
Jeffrey Warren
edaa8895c7 Update info.json with NDVI description (#199)
* Update info.json

* compiled
2018-03-12 13:13:43 -04:00
Raounak Sharma
efd5bf7624 Changed the warning log (#195)
Since our execution is not exactly async, hence the corresponding change in
the log message is more suitable log.

close 194
2018-03-09 17:14:03 -05:00
Jeffrey Warren
96143564fa Update index.html 2018-03-01 13:39:29 -06:00
Gayathri
973ec6d6e4 Added how to run the debug script (#192) 2018-02-26 10:53:39 -05:00
Danielle Shwed
801ea35393 Add Saturation Module (#193)
* fixed blur module as well as issue with no output when running debug

* added saturation module

* fixing requested changes

* fixing exportBin

* requested fixes
2018-02-26 10:52:25 -05:00
Varun Gupta
e8ab480687 Added native gaussian Blurring module(no dependencies) (#186)
* Added Blur Module

* Issue 177 fixing Blur module

* blur module fixed info json

* fixing blur module

* Delete .DS_Store

* add a native blurring solution

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fixed package.json

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* delete .ds_store and update gitignore

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-02-22 16:43:14 -05:00
Varun Gupta
9d3e511bca resolves #184 (#185) 2018-02-21 22:10:25 -05:00
mayank1010
d3a4c336a0 Empty directory bug fixed (#179)
added the check to test if the directory is empty by comparing it's length with 0.
2018-02-21 14:55:24 -05:00
Varun Gupta
0fd797ed5a resolves #182 (#183)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-02-21 11:31:20 -05:00
Varun Gupta
27ee18b3d2 resolves #153 (#180)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-02-20 17:28:19 -05:00
Varun Gupta
5922b0de58 resolves #174 (#175)
Update readme -- resolves #174
2018-02-16 18:36:21 -05:00
Varun Gupta
fd45d3caf3 resolves #132 fix options object (#171)
* resolves #132 fix options object

* Add Documentation for --details parameter

* fix spacing issue

* update naming of options parameter

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-02-16 18:03:39 -05:00
Varun Gupta
bbef4bca57 Added Edge Detection module (#168)
* step 1 grayscale

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add basic edge detection resolves #166

* updated the description

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fixed typo

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* updated the description for edge detection module

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add NonMaxSuppression and DoubleThreshold

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* comlpeted edge detection

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* cleared remaining weak edges

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-02-16 17:07:00 -05:00
Varun Gupta
32c5a29906 resolves #131 create output directory immediately (#167)
* resolves #131 create output directory immediately

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* fix error if no steps are passed

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add exit message if steps not passed

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* add test for creating output directory
2018-02-06 16:42:22 -05:00
Varun Gupta
c5dee8aef3 Add bookmarklet (#164)
* resolves #162

* add bookmarklet link to readme resolves #148

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* Update README.md
2018-02-02 12:52:08 -05:00
Varun Gupta
071aa68de7 resolves #162 (#163)
remove module count test - resolves #162
2018-02-01 13:37:58 -05:00
Varun Gupta
87fa166595 Only brightness module (#161)
* fixed package.json

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* resolves #113 add brightness module

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-02-01 12:27:37 -05:00
Varun Gupta
a5d5dd9f52 fixed package.json (#160)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-02-01 11:55:01 -05:00
Rishabh Chaudhary
38accebcc3 Fixed - move module tests into separate test files #141 (#155)
* Fixed -  move module tests into separate test files #141

* Modification

* Restructure, fixed tests
2018-01-29 13:18:15 -05:00
Varun Gupta
c19a663fa2 resolves #133 add -b --basic mode to only output final image update readme (#154)
* resolves #133 add -b --basic mode to only output final image update readme

Signed-off-by: tech4GT <varun.gupta1798@gmail.com>

* format logs and help

* update dist files
2018-01-23 12:26:02 -05:00
Varun Gupta
38cf05bb9e resolves #129 message to user informing about the async execution (#152)
Signed-off-by: tech4GT <varun.gupta1798@gmail.com>
2018-01-21 10:26:37 -05:00
Chinmay Pandhare
3f99e2b44c fixed replaceImage (#151)
* 1.0.0

* Fixed Replace Image

* Added test to check if replaceImage works
2017-10-26 14:35:23 -04:00
Jeffrey Warren
73e5d14569 various tweaks and adjustments to demo; bugfix for select/input changes (#149) 2017-10-23 23:16:22 -04:00
Chinmay Pandhare
135c142ba8 Updates to Demo (#143)
* 1.0.0

* Added 'select' input

* Added loader

* Fix File Reader
2017-10-18 17:02:42 -04:00
Jeffrey Warren
14c59be19c Additions to README - diagrams (#144)
* Additions to README

* Update README.md

* Add files via upload
2017-10-18 16:32:33 -04:00
Jeffrey Warren
ec10ab0b0d Update imageSelection.js 2017-10-18 16:28:23 -04:00
376 changed files with 43888 additions and 41155 deletions

11
.codecov.yml Normal file
View File

@@ -0,0 +1,11 @@
comment:
layout: "reach, diff, flags, files"
behavior: default
require_changes: false # if true: only post the comment if coverage changes
require_base: no # [yes :: must have a base report to post]
require_head: yes # [yes :: must have a head report to post]
branches: null # branch names that can post comment
coverage:
status:
project: off
patch: off

1
.eslintignore Normal file
View File

@@ -0,0 +1 @@
dist/*

36
.eslintrc.js Normal file
View File

@@ -0,0 +1,36 @@
module.exports = {
'env': {
'browser': true,
'commonjs': true,
'es6': true,
'node': true
},
'extends': 'eslint:recommended',
'globals': {
'Atomics': 'readonly',
'SharedArrayBuffer': 'readonly'
},
'parserOptions': {
'ecmaVersion': 2018
},
'rules': {
'indent': ['error',2],
'linebreak-style': ['error','unix'],
'quotes': ['error','single'],
'semi': ['error','always'], //
'no-undef': 0,
'no-console': 'off',
'no-unused-vars': 'off',
'no-redeclare': 'off',
'no-inner-declarations':'off',
'no-empty':'off',
'no-mixed-spaces-and-tabs':'off',
'no-self-assign':'off',
'no-constant-condition':'off',
'no-dupe-keys':'off',
'space-infix-ops': ['error', {'int32Hint': false}], // Enforce spaces around operators
'comma-spacing': ['error', { "before": false, "after": true }], // require spacing after a comma
'comma-style': ['error', 'last'], // requires comma after and on the same line
'no-trailing-spaces': ['error', { 'skipBlankLines': true }], // Disallows trailing whitespace on end of lines and empty lines
}
};

74
.github/CODEOWNERS vendored Normal file
View File

@@ -0,0 +1,74 @@
# <-- DOCS FOR THIS FILE -->
# This is a comment.
# Each line is a file pattern followed by one or more owners.
# These owners will be the default owners for everything in
# the repo. Unless a later match takes precedence,
# @global-owner1 and @global-owner2 will be requested for
# review when someone opens a pull request.
# * @global-owner1 @global-owner2
# Order is important; the last matching pattern takes the most
# precedence. When someone opens a pull request that only
# modifies JS files, only @js-owner and not the global
# owner(s) will be requested for a review.
# *.js @js-owner
# You can also use email addresses if you prefer. They'll be
# used to look up users just like we do for commit author
# emails.
# *.go docs@example.com
# In this example, @doctocat owns any files in the build/logs
# directory at the root of the repository and any of its
# subdirectories.
# /build/logs/ @doctocat
# The `docs/*` pattern will match files like
# `docs/getting-started.md` but not further nested files like
# `docs/build-app/troubleshooting.md`.
# docs/* docs@example.com
# In this example, @octocat owns any file in an apps directory
# anywhere in your repository.
# apps/ @octocat
# In this example, @doctocat owns any file in the `/docs`
# directory in the root of your repository.
# /docs/ @doctocat
# <-- /DOCS FOR THIS FILE -->
# <-- COMMON TO ALL MAINTAINERS -->
/*.json @publiclab/is-maintainers
/*.md @publiclab/is-maintainers
/*.lock @ubliclab/is-maintainers
/Gruntfile.js @publiclab/is-maintainers
/.github/ @publiclab/is-maintainers
# <-- /COMMON TO ALL MAINTAINERS -->
# <-- SPECIFIC MAINTAINERS -->
/index.js @publiclab/is-cli-maintainers
/src/cli/ @publiclab/is-cli-maintainers
/src/CliUtils.js @publiclab/is-cli-maintainers
/src/*.js @publiclab/is-core-maintainers
/src/*.json @publiclab/is-core-maintainers
/src/util/ @publiclab/is-core-maintainers
/test/core/* @publiclab/is-core-maintainers
/src/modules/ @publiclab/is-module-maintainers
/docs/ @publiclab/is-module-maintainers
/test/ @publiclab/is-tests-maintainers
/jest* @publiclab/is-tests-maintainers
/eslint* @publiclab/is-tests-maintainers
/travis* @publiclab/is-tests-maintainers
.travis.yml @publiclab/is-tests-maintainers
.gitpod* @publiclab/is-tests-maintainers
/gitpod* @publiclab/is-tests-maintainers
/examples/ @publiclab/is-ui-maintainers
/icons/ @publiclab/is-ui-maintainers
/test/ui-2/test/* @publiclab/is-ui-maintainers
/test/ui/spec/* @publiclab/is-ui-maintainers
# <-- /SPECIFIC MAINTAINERS -->

35
.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,35 @@
### Please describe the problem (or idea)
> What happened just before the problem occurred? Or what problem could this idea solve?
> What did you expect to see that you didn't?
### Please show us where to look
https://beta.sequencer.publiclab.org
### What's your PublicLab.org username?
> This can help us diagnose the issue:
### Browser, version, and operating system
> Many bugs are related to these -- please help us track it down and reproduce what you're seeing!
****
## Thank you!
Your help makes Public Lab better! We *deeply* appreciate your helping refine and improve this site.
To learn how to write really great issues, which increases the chances they'll be resolved, see:
https://publiclab.org/wiki/developers#Contributing+for+non-coders

16
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,16 @@
Fixes #0000 (<=== Replace `0000` with the Issue Number)
Make sure these boxes are checked before your pull request (PR) is ready to be reviewed and merged. Thanks!
* [ ] tests pass -- look for a green checkbox ✔️ a few minutes after opening your PR -- or run tests locally with `npm run test-all`
* [ ] code is in uniquely-named feature branch and has no merge conflicts
* [ ] PR is descriptively titled
* [ ] ask `@publiclab/is-reviewers` for help, in a comment below
* [ ] Insert-step functionality is working correct as expected.
> We're happy to help you get this ready -- don't be afraid to ask for help, and **don't be discouraged** if your tests fail at first!
If tests do fail, click on the red `X` to learn why by reading the logs.
Please be sure you've reviewed our contribution guidelines at https://publiclab.org/contributing-to-public-lab-software
Please make sure to get at least two reviews before asking for merging the PR as that would make the PR more reliable on our part
Thanks!

30
.github/config.yml vendored Normal file
View File

@@ -0,0 +1,30 @@
# Configuration for welcome - https://github.com/behaviorbot/welcome
# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome
# Comment to be posted to on first time issues
newIssueWelcomeComment: |
Thanks for opening your first issue here! This space is [protected by our Code of Conduct](https://publiclab.org/conduct) - and we're here to help.
Please follow the issue template to help us help you 👍🎉😄
If you have screenshots to share demonstrating the issue, that's really helpful! 📸 You can [make a gif](https://www.cockos.com/licecap/) too!
Don't forget to join our [PublicLab Gitter channel](https://gitter.im/publiclab/publiclab) and our [ImageSequencer Gitter Channel](https://gitter.im/publiclab/image-sequencer) for some brainstorming discussions.
# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome
# Comment to be posted to on PRs from first time contributors in your repository
newPRWelcomeComment: |
Thanks for opening this pull request! This space is [protected by our Code of Conduct](https://publiclab.org/conduct).
There may be some errors, **but don't worry!** We're here to help! 👍🎉😄
Also please refer (https://github.com/publiclab/image-sequencer/blob/main/README.md) for installation help.
# Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge
# Comment to be posted to on pull requests merged by a first time user
firstPRMergeComment: |
Congrats on merging your first pull request! 🙌🎉⚡️
Your code will be published to https://beta.sequencer.publiclab.org in a day or two. Please test out your work on this testing server and report back with a comment that all has gone well!
In the meantime, can you tell us your Twitter handle so we can thank you properly also do join our weekly check-in to share your this week goal and the awesome work you did 😃.
Please find the link **pinned in the issue section**
Now that you've completed this, you can help someone else take their first step! Try looking at this list of `first-timers-only` issues, and see if someone else is waiting for feedback, or even stuck! 😕
People often get stuck at the same steps, so you might be able to help someone get unstuck, or help lead them to some documentation that'd help. Reach out and be encouraging and friendly! 😄 🎉
See: [Public Lab's coding community!](https://code.publiclab.org)
# It is recommended to include as many gifs and emojis as possible

12
.github/first-timers.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# You can change the labels to suit your needs if "first-timers-only" is not what you are looking for.
# These are some examples.
labels:
- first-timers-only
- help wanted
#If you would like to add your own template for the issue, add an .md file to your .github folder
template: .github/fto-template.md
# You can create the issue in a different repo than where the problem is. Just make sure you installed the bot on the configured repository.
# The issue will link back to the original repository where the contribution will be made.
#repository: repo-name

51
.github/fto-template.md vendored Normal file
View File

@@ -0,0 +1,51 @@
Hi, this is a [first-timers-only issue](https://code.publiclab.org/#r=all). This means we've worked to make it more legible to folks who either **haven't contributed to our codebase before, or even folks who haven't contributed to open source before**.
If that's you, we're interested in helping you take the first step and can answer questions and help you out as you do. Note that we're especially interested in contributions from people from groups underrepresented in free and open source software!
We know that the process of creating a pull request is the biggest barrier for new contributors. This issue is for you 💝
If you have contributed before, **consider leaving this one for someone new**, and looking through our general [help wanted](https://github.com/publiclab/image-sequencer/labels/help-wanted) issues. Thanks!
### 🤔 What you will need to know.
Nothing. This issue is meant to welcome you to Open Source :) We are happy to walk you through the process.
### 📋 Step by Step
- [ ] 🙋 **Claim this issue**: Comment below. If someone else has claimed it, ask if they've opened a pull request already and if they're stuck -- maybe you can help them solve a problem or move it along!
- [ ] 📝 **Update** the file [$FILENAME]($BRANCH_URL) in the `$REPO` repository (press the little pen Icon) and edit the line as shown below.
[See this page](https://code.publiclab.org/#r=all) for some help in taking your first steps!
Below is a "diff" showing in red (and a `-`) which lines to remove, and in green (and a `+`) which lines to add:
```diff
$DIFF
```
- [ ] 💾 **Commit** your changes
- [ ] 🔀 **Start a Pull Request**. There are two ways how you can start a pull request:
1. If you are familiar with the terminal or would like to learn it, [here is a great tutorial](https://egghead.io/series/how-to-contribute-to-an-open-source-project-on-github) on how to send a pull request using the terminal.
2. You can also [edit files directly in your browser](https://help.github.com/articles/editing-files-in-your-repository/) and open a pull request from there.
- [ ] 🏁 **Done** Ask in comments for a review :)
### Please keep us updated
💬⏰ - We encourage contributors to be respectful to the community and provide an update **within a week** of claiming a first-timers-only issue. We're happy to keep it assigned to you as long as you need if you update us with a request for more time or help, but if we don't see any activity a week after you claim it we may reassign it to give someone else a chance. Thank you in advance!
If this happens to you, don't sweat it! Grab another open issue.
### Is someone else already working on this?
🔗- We encourage contributors to link to the original issue in their pull request so all users can easily see if someone's already started on it.
👥- **If someone seems stuck, offer them some help!** Otherwise, [take a look at some other issues you can help with](https://code.publiclab.org/#r=all). Thanks!
### 🤔❓ Questions?
Leave a comment below!

10
.gitignore vendored
View File

@@ -27,16 +27,26 @@ build/Release
node_modules
node_modules/*
# Dist Files
dist/*
dist
# Optional npm cache directory
.npm
# Optional REPL history
.node_repl_history
.DS_Store
*.swp
todo.txt
test.js
output.txt
output/
test/core/modules/test_outputs
test/core/modules/test_outputs/*
node_modules/
node_modules/*
test_outputs
/test_outputs

7
.gitpod.dockerfile Normal file
View File

@@ -0,0 +1,7 @@
FROM gitpod/workspace-full
USER root
RUN sudo apt-get update && apt-get install -y apt-transport-https \
&& sudo apt-get install -y \
xserver-xorg-dev libxext-dev libxi-dev build-essential libxi-dev libglu1-mesa-dev libglew-dev pkg-config libglu1-mesa-dev freeglut3-dev mesa-common-dev \
&& apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/*

18
.gitpod.yml Normal file
View File

@@ -0,0 +1,18 @@
image:
file: .gitpod.dockerfile
tasks:
- init: npm run setup
command: npm start
ports:
- port: 3000
onOpen: open-preview
github:
prebuilds:
branches: true
pullRequests: true
pullRequestsFromForks: true
addCheck: true
addComment: true
addBadge: false
addLabel: false

47
.npmignore Normal file
View File

@@ -0,0 +1,47 @@
# Logs
logs
*.log
npm-debug.log*
# Runtime data
pids
*.pid
*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Optional npm cache directory
.npm
# Optional REPL history
.node_repl_history
.DS_Store
*.swp
todo.txt
test.js
output.txt
output/
examples/
icons/
.travis.yml
Gruntfile.js
yarn.lock

View File

@@ -1,16 +1,35 @@
sudo: required
language: node_js
node_js:
- '4'
- '5'
- '6'
- '7' # Node.js 7 is most stable version
- '10'
- '12'
env:
- CXX=g++-4.8
before_script:
- npm install grunt-cli -g # for "grunt build"
script:
- npm test
- grunt build
- curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
- chmod +x ./cc-test-reporter
- ./cc-test-reporter before-build
jobs:
include:
- name: "Base istanbul/tape node tests"
script: npm test
- name: "Benchmark tests"
script: npm run benchmark
- name: "Gif tests"
script: npm run gif-test
- name: "Browserify core tests and run"
script: grunt tests && npm run core-tests
- name: "Jasmine UI tests (mocked browser env)"
script: npm run test-ui
- name: "jest-puppeteer UI tests (full browser env)"
script: npm run test-ui-2
- name: "Grunt build test of dev environment"
script: grunt build
after_success:
- bash <(curl -s https://codecov.io/bash)
after_script:
- ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
addons:
apt:
sources:
@@ -18,6 +37,10 @@ addons:
packages:
- g++-4.8
- xvfb # for tape-run
before_install:
- sudo apt-get update
- sudo apt-get install xserver-xorg-dev libxext-dev libxi-dev
- sudo apt-get install -y build-essential libxi-dev libglu1-mesa-dev libglew-dev pkg-config libglu1-mesa-dev freeglut3-dev mesa-common-dev
install:
- export DISPLAY=':99.0' # for tape-run
- Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & # for tape-run

11
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,11 @@
# Public Lab Code of Conduct
_Public Lab, 55 Cromwell Street, 1C, Providence, RI 02907_
We are coming together with an intent to care for ourselves and one another as we produce knowledge in pursuit of environmental justice. For this to work for everybody, individual decisions will not be allowed to run counter to the welfare of other people. We—visitors, community members, community moderators, staff, organizers, sponsors, and all others—hold ourselves accountable to the same values regardless of position or experience. This community aspires to be a respectful place both during online and in-person interactions so that all people are able to fully participate with their dignity intact. This document is a piece of the culture we're creating.
This code of conduct applies to all spaces managed by the Public Lab community and non-profit, both online and in person. It provides a clear set of practical guidelines for events led by organizers and community members, multi-day events such as Barnraisings, and online venues such as the website, comment threads on software platforms, chatrooms, our mailing lists, the issue tracker, and any other forums created by Public Lab which the community uses for communication. For interactions with additional groups, see our Partnership Guidelines at https://publiclab.org/partners.
To read the full Code of Conduct and learn how to contact the Conduct Committee or the Moderators group, see:
https://publiclab.org/conduct

View File

@@ -3,6 +3,10 @@ Contributing to Image Sequencer
Happily accepting pull requests; to edit the core library, modify files in `./src/`. To build, run `npm install` followed by `grunt build`.
On ARM based devices, the `gl` module may require some libraries to be re-installed:
`sudo apt-get install -y build-essential xserver-xorg-dev libxext-dev libxi-dev libglu1-mesa-dev libglew-dev pkg-config` -- see https://github.com/stackgl/headless-gl#ubuntudebian for more.
Most contribution (we imagine) would be in the form of API-compatible modules, which need not be directly included.
## Jump To
@@ -10,12 +14,15 @@ Most contribution (we imagine) would be in the form of API-compatible modules, w
* [README.md](https://github.com/publiclab/image-sequencer)
* [Contributing Modules](#contributing-modules)
* [Info File](#info-file)
* [Ideas](#ideas)
* [Ideas](#Contribution-ideas)
* [Grunt Tasks](#grunt-tasks)
* [UI Helper Methods](#ui-helper-methods)
****
## Contribution ideas
## Contribution-ideas
See [this issue](https://github.com/publiclab/image-sequencer/issues/118) for a range of ideas for new contributions, and links to possibly helpful libraries. Also see the [new features issues list](https://github.com/publiclab/image-sequencer/labels/new-feature).
See [this issue](https://github.com/publiclab/image-sequencer/issues/118) for a range of ideas for new contributions and links to possibly helpful libraries, or you can solve an [existing issue](https://github.com/publiclab/image-sequencer/labels/module). Also see the [new features issues list](https://github.com/publiclab/image-sequencer/labels/new-feature).
### Bugs
@@ -25,26 +32,27 @@ If you find a bug please list it here, and help us develop Image Sequencer by [o
## Contributing modules
Most contributions can happen in modules, rather than to core library code. Modules and their [corresponding info files](#info-file) are included into the library in this file: https://github.com/publiclab/image-sequencer/blob/master/src/Modules.js#L5-L7
Most contributions can happen in modules, rather than to core library code. Modules and their [corresponding info files](#info-file) are included into the library in this file: https://github.com/publiclab/image-sequencer/blob/main/src/Modules.js#L5-L7
Module names, descriptions, and parameters are set in the `info.json` file -- [see below](#info-file).
Any module must follow this basic format:
```js
module.exports = function ModuleName(options,UI) {
options = options || {};
options.title = "Title of the Module";
UI.onSetup(options.step);
var output;
// Module requirements have been simplified in version 3, see https://github.com/publiclab/image-sequencer/blob/master/CONTRIBUTING.md#contributing-modules
function draw(input,callback) {
UI.onDraw(options.step);
var output = /*do something with the input*/ ;
var output = function(input){
/* do something with the input */
return input;
}
this.output = output;
options.step.output = output.src;
this.output = output(input); // run the output and assign it to this.output
callback();
UI.onComplete(options.step);
}
return {
@@ -56,6 +64,73 @@ module.exports = function ModuleName(options,UI) {
}
```
Image Sequencer modules are designed to be run either in the browser or in a Node.js environment. For dynamically loaded modules, that means that any uses of `require()` to include an external library must be compiled using a system like `browserify` or `webpack` to ensure browser compatibility. An example of this can be found here:
https://github.com/tech4gt/image-sequencer
### Browser/node compatibility
If you wish to offer a module without browser-compatibility, please indicate this in the returned `info` object as:
module.exports = [
ModuleName,
{ only: ['node'] }
];
If you believe that full cross-compatibility is possible, but need help, please open an issue on your module's issue tracker requesting assistance (and potentially link to it from an inline comment or the module description).
Any Independent Module Must follow this basic format
```js
function ModuleName(options,UI) {
var output;
function draw(input,callback) {
var output = function(input){
/* do something with the input */
return input;
}
this.output = output(input); // run the output and assign it to this.output
callback();
}
return {
options: options,
draw: draw,
output: output,
UI: UI
};
}
module.exports = [ModuleName,{
"name": "ModuleName",
"description": "",
"inputs": {
// inputs here
}
/* Info can be defined here or imported from a json file */
// require('./info.json') This only works in node
// In a module compiled with browserify or webpack, a require() can be used to
// load a standard info.json file.
];
```
### Running a browser-only module in node
If your module has browser specific code or you are consuming a dependency which does the `gl-context` api. We designed this api especially for webl based modules but since it runs the module in a headless browser, ti supports all browser specific APIs.
The api must be used in the following format
```js
var step = this;
if (!options.inBrowser) {
require('../_nomodule/gl-context')(input, callback, step, options);
}
else {
/* Browser specific code */
}
```
### options
The object `options` stores some important information. This is how you can accept
@@ -67,6 +142,28 @@ whether your module is being run on a browser.
### draw()
To add a module to Image Sequencer, it must have a `draw` method; you can wrap an existing module to add them:
* `module.draw(input, callback)`
The `draw` method should accept an `input` parameter, which will be an object of the form:
```js
input = {
src: "datauri of an image here",
format: "jpeg/png/etc",
// utility functions
getPixels: "function to get Image pixels. Wrapper around https://npmjs.com/get-pixels",
savePixels: "function to save Image pixels. Wrapper around https://npmjs.com/save-pixels",
lodash: "wrapper around lodash library, https://github.com/lodash",
dataUriToBuffer: "wrapper around https://www.npmjs.com/package/data-uri-to-buffer",
pixelManipulation: "general purpose pixel manipulation API, see https://github.com/publiclab/image-sequencer/blob/master/src/modules/_nomodule/PixelManipulation.js"
}
```
For example usage of pixelManipulation see https://github.com/publiclab/image-sequencer/blob/main/src/modules/Invert/Module.js
**The module is included in the browser inside a script tag and since the code runs directly in the browser if any other module is required apart from the apis available on the input object, it should be either bundled with the module code and imported in es6 format or the module code must be browserified before distribution for browser**
The draw method is run every time the step is `run` using `sequencer.run()`.
So any calculations must go **into** the `draw()` method's definition.
@@ -82,44 +179,33 @@ constant definitions must be done **outside** the `draw()` method's definition.
format: "<png|jpeg|gif>"
}
```
* `callback` is a function which is responsible to tell the sequencer that the
step has been "drawn".
* `callback` is a function which is responsible to tell the sequencer that the step has been "drawn".
When you have done your calculations and produced an image output, you are required
to set `this.output` to an object similar to what the input object was, call
`callback()`, and set `options.step.output` equal to the output DataURL
When you have done your calculations and produced an image output, you are required to set `this.output` to an object similar to what the input object was, call `callback()`, and set `options.step.output` equal to the output DataURL
* `progressObj` is an optional additional Object that can be passed in the format `draw(input, callback, progressObj)`, which handles the progress output; see [Progress reporting](#progress-reporting) below.
### UI Methods
The module is responsible for emitting various events for the UI to capture. There are
four events in all:
The module is responsible for emitting various events for the UI to capture.
There are four events in all:
* `UI.onSetup(options.step)` must be emitted when the module is added. So it must be emitted outside the draw method's definition as shown above.
* `UI.onDraw(options.step)` must be emitted whenever the `draw()` method is called. So it should ideally be the first line of the definition of the `draw` method.
* `UI.onComplete(options.step)` must be emitted whenever the output of a draw call
is ready. An argument, that is the DataURL of the output image must be passed in.
* `UI.onRemove(options.step)` is emitted automatically and the module should not emit it.
* `UI.notify(msg,id)` must be emmited when a notification has to be produced.
To add a module to Image Sequencer, it must have the following method; you can wrap an existing module to add them:
### Name and description
* `module.draw()`
The `draw(input,callback)` method should accept an `input` parameter, which will be an object of the form:
```js
input = {
src: "datauri here",
format: "jpeg/png/etc"
}
```
### options.title
For display in the web-based UI, each module may also have a title `options.title`.
For display in the web-based demo UI, set the `name` and `description` fields in the `info.json` file for the module.
## Info file
All module folders must have an `info.json` file which looks like the following:
```json
{
"name": "Name of Module to be displayed",
@@ -155,10 +241,220 @@ Similarly, "Select" type inputs should have a `values` array.
Also, A module may have output values. These must be defined as shown above.
### Progress reporting
The default "loading spinner" can be optionally overriden with a custom progress object to draw progress on the CLI, following is a basic module format for the same:
```js
module.exports = function ModuleName(options,UI) {
var output;
function draw(input,callback,progressObj) {
/* If you wish to supply your own progress bar you need to override progressObj */
progressObj.stop() // Stop the current progress spinner
progressObj.overrideFlag = true; // Tell image sequencer that you will supply your own progressBar
/* Override the object and give your own progress Bar */
progressObj = /* Your own progress Object */
var output = function(input){
/* do something with the input */
return input;
};
this.output = output();
callback();
}
return {
options: options,
draw: draw,
output: output,
UI: UI
}
}
```
The `progressObj` parameter of `draw()` is not consumed unless a custom progress bar needs to be drawn, for which this default spinner should be stopped with `progressObj.stop()` and image-sequencer is informed about the custom progress bar with `progressObj.overrideFlag = true;` following which this object can be overriden with custom progress object.
### Module example
See existing module `green-channel` for an example: https://github.com/publiclab/image-sequencer/tree/master/src/modules/GreenChannel/Module.js
See existing module `channel` for an example: https://github.com/publiclab/image-sequencer/blob/main/src/modules/Channel/Module.js
The `green-channel` module is included into the core modules here: https://github.com/publiclab/image-sequencer/blob/master/src/Modules.js#L5-L7
The `channel` module is included into the core modules here: https://github.com/publiclab/image-sequencer/blob/main/src/Modules.js#L5-L7
For help integrating, please open an issue.
## Meta Module
IMAGE SEQUENCER supports "meta modules" -- modules made of other modules. The syntax and structure of these meta modules is very similar to standard modules. Sequencer can also genarate meta modules dynamically with the function `createMetaModule` which can be called in the following ways
```js
/* Mapping function is a function which gets the inputs of the module as argument
* and returns an array with steps mapped to their options
* See https://github.com/publiclab/image-sequencer/blob/main/src/modules/Colorbar/Module.js for example
*/
/* Module options is an object with the following keys
* infoJson: the info.json object for the module
*/
sequencer.createMetaModule(mappingFunction,moduleOptions)
/* createMetaModule returns an array of module function and info just like normal
* modules. These can also be loaded into sequencer dynamically like other modules
*/
```
A Meta module can also be contributed like a normal module with an info and a Module.js. A basic Meta module shall follow the following format
```js
// Module.js
module.exports = require('../../util/createMetaModule.js')(
function mapFunction(options) {
return [
{ 'name': 'module-name', 'options': {} },
{ 'name': 'module-name', 'options': {} },
];
}, {
infoJson: require('./info.json')
}
)[0];
```
```json
// Info
{
"name": "meta-moduleName",
"description": "",
"inputs": {
}
}
```
```js
//index.js
module.exports = [
require('./Module.js'),
require('./info.json')
]
```
All of the above can also be combined together to form a single file module.
```js
// MetaModule.js
module.exports =
sequencer.createMetaModule(
function mapFunction(options) {
return [
{ 'name': 'module-name', 'options': {} },
{ 'name': 'module-name', 'options': {} },
];
}, {
infoJson: {
"name": "meta-moduleName",
"description": "",
"inputs": {
}
}
});
```
## Linting
We are now using `eslint` and `husky` to help lint and format our code each time we commit. Eslint defines coding standards and helps in cleaning up the code. To run eslint for checking errors globally or within a specific file run:
```
npx eslint .
npx eslint <file path>
```
And to fix those errors globally or in a file, run these in your terminal:
```
npx eslint . --fix
npx eslint <file path> --fix
```
Be sure to not include the angular brackets(<>).
Husky ensures automation of the above steps with git-hooks(eg. git add,git commit..). However we don't want to check and fix changes of the entire codebase with each commit and that the fixes made by eslint appear unstaged and require us to commit them again and that is where lint-staged helps.
If we want `husky` to not verify the commit and push it anyway, use `git commit -m "message" --no-verify.`
## Grunt Tasks
This repository has different grunt tasks for different uses. The source code is in the [Gruntfile](https://github.com/publiclab/image-sequencer/blob/main/Gruntfile.js).
The following command is used for running the tasks: `grunt [task-name]`. Here `[task-name]` should be replaced by the name of the task to be run. To run the default task run `grunt` without any options.
#### Tasks
1. **compile**: Compiles/Browserifies the dist files in `/dist/image-sequencer.js` and `/dist/image-sequencer-ui.js`.
2. **build**: Compiles the files as in the **compile** task and minifies/uglifies dist files in `/dist/image-sequencer.min.js` and `/dist/image-sequencer-ui.min.js`.
3. **watch**: Checks for any changes in the source code and runs the **compile** task if any changes are found.
4. **serve**: Compiles the dist files as in the **compile** task and starts a local server on `localhost:3000` to host the demo site in `/examples/` directory. Also runs the **watch** task.
5. **production**: Compiles and minifies dist files in `/dist/image-sequencer.js` and `/dist/image-sequencer-ui.js` without the `.min.js` extension to include minified files in the demo site. This script should only be used in production mode while deploying.
6. **default**: Runs the **watch** task as default.
## UI Helper Methods
### scopeQuery
###### Path: `/examples/lib/scopeQuery.js`
The method returns a scoped `jQuery` object which only searches for elements inside a given scope (a DOM element).
To use the method,
* import the `scopeSelector` and `scopeSelectorAll` methods from `lib/scopeQuery.js`
* call the methods with scope as a parameter
```js
var scopeQuery = require('./scopeQuery');
var $step = scopeQuery.scopeSelector(scope),
$stepAll = scopeQuery.scopeSelectorAll(scope);
```
This will return an object with a constructor which returns a `jQuery` object (from inside the scope) but with new `elem` and `elemAll` methods.
#### Methods of the Returned Object
* `elem()`: Selects an element inside the scope.
* `elemAll()`: Selects all the instances of a given element inside the scope.
* `getScope()`: Returns the scope as a DOM element.
* `getDomElem()`: Returns the scoped element as a DOM element instead of a jquery object.
#### Example
```js
//The scope is a div element with id=“container“ and there are three divs in it
//with ids „1“, „2“, and „3“, and all of them have a „child“ class attribute
var $step = require('./scopeQuery').scopeSelector(document.getElementById('container'));
$step('#1'); // returns the div element with id=“1“
$step('#1').hide().elemAll('.child').fadeOut(); // abruptly hides the div element with id=“1“ and fades out all other div elements
```
These two methods are chainable and will always return elements from inside the scope.
#### Usage
Instead of using
```js
$(step.ui.querySelector('query')).show().hide();
$(step.ui.querySelectorAll('q2')).show().hide();
```
The following code can be used
```js
$step('query').show().hide();
$stepAll('q2').show().hide();
```

View File

@@ -1,50 +1,106 @@
module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-browserify');
grunt.loadNpmTasks('grunt-contrib-uglify-es');
grunt.loadNpmTasks('grunt-browser-sync');
grunt.loadNpmTasks('grunt-text-replace');
grunt.loadNpmTasks('grunt-browserify');
grunt.loadNpmTasks('grunt-contrib-uglify');
require('matchdep')
.filterDev('grunt-*')
.forEach(grunt.loadNpmTasks);
require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
watch: {
options : {
livereload: true
},
source: {
files: [
'src/*.js',
'src/*/*.js',
'Gruntfile.js'
],
tasks: [ 'build:js' ]
}
watch: {
options: {
livereload: true
},
source: {
files: ['src/**/*', 'Gruntfile.js', 'examples/lib/*', 'examples/demo.js'],
tasks: ['compile']
}
},
browserify: {
dist: {
src: ['src/ImageSequencer.js'],
dest: 'dist/image-sequencer.js'
}
browserify: {
options: {
alias: {
'gpu.js': './node_modules/gpu.js/src/index.js'
}
},
core: {
src: ['src/ImageSequencer.js'],
dest: 'dist/image-sequencer.js'
},
ui: {
src: ['examples/demo.js'],
dest: 'dist/image-sequencer-ui.js'
},
prodcore: {
src: ['src/ImageSequencer.js'],
dest: 'dist/image-sequencer.brow.js'
},
produi: {
src: ['examples/demo.js'],
dest: 'dist/image-sequencer-ui.brow.js'
},
tests: {
src: ['test/core/sequencer/meta-modules.js',
'test/core/sequencer/image-sequencer.js',
'test/core/sequencer/chain.js',
'test/core/sequencer/replace.js',
'test/core/sequencer/import-export.js',
'test/core/sequencer/run.js',
'test/core/sequencer/dynamic-imports.js',
'test/core/util/*.js'],
dest: './output/core-tests.js'
}
},
uglify: {
dist: {
src: ['./dist/image-sequencer.js'],
dest: './dist/image-sequencer.min.js'
replace: {
version: {
src: ['examples/sw.js'],
overwrite: true,
replacements: [{
from: /image-sequencer-static-v.*/g,
to: "image-sequencer-static-v<%= pkg.version %>';"
}]
}
},
uglify: {
core: {
src: ['./dist/image-sequencer.js'],
dest: './dist/image-sequencer.min.js'
},
ui: {
src: ['dist/image-sequencer-ui.js'],
dest: 'dist/image-sequencer-ui.min.js'
},
prodcore: {
src: ['dist/image-sequencer.brow.js'],
dest: 'dist/image-sequencer.js'
},
produi: {
src: ['dist/image-sequencer-ui.brow.js'],
dest: 'dist/image-sequencer-ui.js'
}
},
browserSync: {
dev: {
options: {
watchTask: true,
server: './'
}
}
}
});
});
/* Default (development): Watch files and build on change. */
grunt.registerTask('default', ['watch']);
grunt.registerTask('build', [
'browserify:dist',
'uglify:dist'
]);
/* Default (development): Watch files and build on change. */
grunt.registerTask('default', ['watch']);
grunt.registerTask('build', ['browserify:core', 'browserify:ui', 'replace:version', 'uglify:core', 'uglify:ui']);
grunt.registerTask('serve', ['browserify:core', 'browserify:ui', 'replace:version', 'browserSync', 'watch']);
grunt.registerTask('compile', ['browserify:core', 'browserify:ui']);
grunt.registerTask('production', ['browserify:prodcore', 'browserify:produi', 'replace:version', 'uglify:prodcore', 'uglify:produi']);
grunt.registerTask('tests', ['browserify:tests']);
};

516
README.md
View File

@@ -1,27 +1,51 @@
Image Sequencer
====
[![Build Status](https://travis-ci.org/publiclab/image-sequencer.svg?branch=master)](https://travis-ci.org/publiclab/image-sequencer)
[![Code of Conduct](https://img.shields.io/badge/code-of%20conduct-green.svg)](https://publiclab.org/conduct)
[![npm version](https://badge.fury.io/js/image-sequencer.svg)](https://badge.fury.io/js/image-sequencer)
[![Build Status](https://travis-ci.org/publiclab/image-sequencer.svg?branch=master)](https://travis-ci.org/publiclab/image-sequencer) [![Maintainability](https://api.codeclimate.com/v1/badges/5906996dd2e90aca6398/maintainability)](https://codeclimate.com/github/publiclab/image-sequencer/maintainability) [![Codecov](https://img.shields.io/codecov/c/github/publiclab/image-sequencer.svg?logo=codecov)](https://codecov.io/gh/publiclab/image-sequencer)
[![Gitpod Ready-to-Code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/#https://github.com/publiclab/image-sequencer/)
- **Latest Stable Demo**: https://sequencer.publiclab.org
- **Latest Beta Demo**: https://beta.sequencer.publiclab.org
- **Stable Branch**: https://github.com/publiclab/image-sequencer/tree/stable/
Begin running (and contributing to) this codebase immediately with [GitPod](https://gitpod.io) (this also opens the latest `main` branch code):
[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/publiclab/image-sequencer)
## Why
Image Sequencer is different from other image processing systems in that it's non-destructive: instead of modifying the original image, it creates a new image at each step in a sequence. This is because it:
Image Sequencer is different from other image processing systems because it's _non-destructive_: instead of modifying the original image, it **creates a new image at each step in a sequence**. This is because it:
* produces a legible trail of operations, to "show your work" for evidential, educational, or reproducibility reasons
* makes the creation of new tools or "modules" simpler -- each must accept an input image, and produce an output image
* allows many images to be run through the same sequence of steps
* allows many images to run through the same sequence of steps
* works identically in the browser, on Node.js, and on the command line
It is also for prototyping some other related ideas:
The following diagrams attempt to explain how the applications various components interconnect:
* filter-like image processing -- applying a transform to any image from a given source, like a proxy. I.e. every image tile of a satellite imagery web map
* test-based image processing -- the ability to create a sequence of steps that do the same task as some other image processing tool, provable with example before/after images to compare with
* logging of each step to produce an evidentiary record of modifications to an original image
![general diagram](https://publiclab.org/i/30547.png?s=o)
![workflow diagram](https://raw.githubusercontent.com/publiclab/image-sequencer/main/examples/images/diagram-workflows.png)
It also for prototypes other related ideas:
* filter-like image processing -- apply a transform to an image from a given source, like a proxy. I.e. [every image tile of a satellite imagery web map](https://publiclab.org/notes/warren/05-10-2018/prototype-filter-map-tiles-in-real-time-in-a-browser-with-imagesequencer-ndvi-landsat)
* test-based image processing -- the ability to create a sequence of steps that do the same task as other image processing tools, provable with example before/after images to compare with
* logging each step -- to produce an evidentiary record of modifications to an original image
* cascading changes -- change an earlier step's settings, and see those changes affect later steps
* "small modules"-based extensibility: see [Contributing](https://github.com/publiclab/image-sequencer/blob/master/CONTRIBUTING.md)
* "small modules" -- based extensibility: see [Contributing](https://github.com/publiclab/image-sequencer/blob/main/CONTRIBUTING.md)
## Examples:
* [Single Image Demo](https://publiclab.github.io/image-sequencer/)
## Examples
* [Simple Demo](https://sequencer.publiclab.org)
* [Latest Beta Demo](https://beta.sequencer.publiclab.org)
A diagram of this running 5 steps on a single sample image may help explain how it works:
![example workflow](https://raw.githubusercontent.com/publiclab/image-sequencer/main/examples/images/diagram-6-steps.png)
## Jump to:
@@ -32,65 +56,113 @@ It is also for prototyping some other related ideas:
* [Method Chaining](#method-chaining)
* [Multiple Images](#multiple-images)
* [Creating a User Interface](#creating-a-user-interface)
* [Contributing](https://github.com/publiclab/image-sequencer/blob/master/CONTRIBUTING.md)
* [Submit a Module](https://github.com/publiclab/image-sequencer/blob/master/CONTRIBUTING.md#contributing-modules)
* [Contributing](https://github.com/publiclab/image-sequencer/blob/main/CONTRIBUTING.md)
* [Submit a Module](https://github.com/publiclab/image-sequencer/blob/main/CONTRIBUTING.md#contributing-modules)
* [Get Demo Bookmarklet](https://publiclab.org/w/imagesequencerbookmarklet)
## Installation
This library conveniently works in the browser, in Node, and on the command line (CLI).
### Unix based platforms
You can set up a local environment to test the UI with `sudo npm run setup` followed by `npm start`.
### Windows
Our npm scripts do not support windows shells, please run the following snippet in PowerShell.
```powershell
npm i ; npm i -g grunt grunt-cli ; grunt build; grunt serve
```
In case of a port conflict please run the following
```powershell
npm i -g http-server ; http-server -p 3000
```
### Online one-click setup for contributing
Contribute to ImageSequencer using a fully featured online development environment that will automatically: clone the repo, install the dependencies and start the webserver.
[![Open in Gitpod](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/from-referrer/)
### Browser
Just include [image-sequencer.js](https://publiclab.github.io/image-sequencer/dist/image-sequencer.js) in the Head section of your web page.
Just include [image-sequencer.min.js](https://github.com/publiclab/image-sequencer/blob/stable/dist/image-sequencer.min.js) in the Head section of your web page. See the [demo here](https://sequencer.publiclab.org)!
### Node (via NPM)
(You must have NPM for this)
Add `image-sequencer` to your list of dependancies and run `$ npm install`
Add `image-sequencer` to your list of dependencies and run `npm install`
### CLI
(You should have Node.JS and NPM for this.)
Globally install Image Sequencer:
```
$ npm install image-sequencer -g
```
(You should have Node.JS and NPM for this.)
### To run the debug script
```
$ npm run debug invert
```
## Quick Usage
### Initializing the Sequencer
The Image Sequencer Library exports a function ImageSequencer which initializes a sequencer.
```js
var sequencer = ImageSequencer();
```
Image Sequencer can be used to run modules on an HTML Image Element using the
`replaceImage` method. The method accepts two parameters - `selector` and `steps`.
`replaceImage` method, which accepts two parameters - `selector` and `steps`.
`selector` is a CSS selector. If it matches multiple images, all images will be
modified. `steps` may be the name of a module or array of names of modules.
Note: Browser CORS Restrictions apply. Some browsers may not allow local images
form other folders, and throw a Security Error instead.
from other folders, and throw a Security Error instead.
```js
sequencer.replaceImage(selector,steps,optional_options);
sequencer.replaceImage(selector,steps,optional_options);
```
`optional_options` allows to pass additional arguments to the module itself.
`optional_options` allows passing additional arguments to the module itself.
For example:
```js
sequencer.replaceImage('#photo','invert');
sequencer.replaceImage('#photo',['invert','ndvi-red']);
sequencer.replaceImage('#photo','invert');
sequencer.replaceImage('#photo',['invert','ndvi-red']);
```
### Data URL usage
Since Image Sequencer uses data-urls, you can initiate a new sequence by providing an image in the [data URL format](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs), which will import into the demo and run:
[Try this example link with a very small Data URL](http://sequencer.publiclab.org/examples/#src=data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAYEBQYFBAYGBQYHBwYIChAKCgkJChQODwwQFxQYGBcUFhYaHSUfGhsjHBYWICwgIyYnKSopGR8tMC0oMCUoKSj/2wBDAQcHBwoIChMKChMoGhYaKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCj/wAARCAAQABADASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAf/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFQEBAQAAAAAAAAAAAAAAAAAABgj/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCdABykX//Z&steps=invert{})
To produce a data URL from an HTML image, see [this nice blog post with example code](https://davidwalsh.name/convert-image-data-uri-javascript).
## CLI Usage
Image Sequencer also provides a CLI for applying operations to local files. The CLI takes the following arguments:
-i | --image [PATH/URL] | Input image URL. (required)
-s | --step [step-name] | Name of the step to be added. (required)
-b | --basic | Basic mode only outputs the final image
-o | --output [PATH] | Directory where output will be stored. (optional)
-op | --opions {object} | Options for the step. (optional)
-c | --config {object} | Options for the step. (optional)
--save-sequence [string] | Name space separated with Stringified sequence to save
--install-module [string] | Module name space seaprated npm package name
The basic format for using the CLI is as follows:
The basic format for using the CLI is as follows:
```
$ ./index.js -i [PATH] -s step-name
$ ./index.js -i [PATH] -s step-name
```
*NOTE:* On Windows you'll have to use `node index.js` instead of `./index.js`.
@@ -98,11 +170,36 @@ The basic format for using the CLI is as follows:
The CLI also can take multiple steps at once, like so:
```
$ ./index.js -i [PATH] -s "step-name-1 step-name-2 ..."
$ ./index.js -i [PATH] -s "step-name-1 step-name-2 ..."
```
But for this, double quotes must wrap the space-separated steps.
Options for the steps can be passed in one line as JSON in the details option like
```
$ ./index.js -i [PATH] -s "brightness" -c '{"brightness":50}'
```
Or the values can be given through the terminal prompt like
<img width="1436" alt="screen shot 2018-02-14 at 5 18 50 pm" src="https://user-images.githubusercontent.com/25617855/36202790-3c6e8204-11ab-11e8-9e17-7f3387ab0158.png">
`save-sequence` option can be used to save a sequence and the associated options for later usage. You should provide a string which contains a name of the sequence space separated from the sequence of steps which constitute it.
```shell
sequencer --save-sequence "invert-colormap invert(),colormap()"
```
`install-module` option can be used to install new modules from npm. You can register this module in your sequencer with a custom namespace separated with the npm package name. Below is an example of the `image-sequencer-invert` module.
```shell
sequencer --install-module "invert image-sequencer-invert"
```
The CLI is also chainable with other commands using `&&`
```
sequencer -i <Image Path> -s <steps> && mv <Output Image Path> <New path>
```
## Classic Usage
### Initializing the Sequencer
@@ -116,25 +213,27 @@ var sequencer = ImageSequencer();
### Loading an Image into the Sequencer
The `loadImage` method is used to load an image into the sequencer. It accepts
a name and an image. The method also accepts an optional callback.
an image `src`, either a URL or a data-url. The method also accepts an optional callback.
```js
sequencer.loadImage(image_src,optional_callback);
sequencer.loadImage(image_src, optional_callback);
```
On `Node.js` the `image_src` may be a DataURI or a local path or a URL.
On browsers, it may be a DatURI, a local image or a URL (Unless this violates
CORS Restrictions). To sum up, these are accepted:
* Images in the same domain (or directory - for a local implementation)
* CORS-Proof images in another domain.
* DataURLs
return value: **none** (A callback should be used to ensure the image gets loaded)
The callback is called within the scope of a the sequencer. For example:
The callback is called within the scope of a sequencer. For example:
(addSteps is defined later)
```js
sequencer.loadImage('SRC',function(){
sequencer.loadImage('SRC', function(){
this.addSteps('module-name');
});
```
@@ -144,7 +243,7 @@ In this case, only `'SRC'`.
### Adding steps to the image
The `addSteps` method is used to add steps on the image. One or more steps can
The `addSteps` method is used to add steps to the image. One or more steps can
be added at a time. Each step is called a module.
```js
@@ -152,11 +251,43 @@ sequencer.addSteps(modules, optional_options);
```
If only one module is to be added, `modules` is simply the name of the module.
If multiple images are to be added, `modules` is an array of the names of modules
which are to be added, in that particular order.
If multiple images are to be added, `modules` is an array, which holds the names of modules
to be added, in that particular order.
optional_otions is just additional parameters, in object form, which you might
want to provide to the modules. It's an optional parameter.
optional_options is just an optional parameter, in object form, which you might
want to provide to the modules.
A variety of syntaxes are supported by Image Sequencer to add multiple steps and configurations quickly for module chaining. The project supports the string syntax, designed to be compact and URL friendly, and JSON, for handling more complex sequences. This can be achieved by passing strings to `sequencer.addStep()`:
```js
sequencer.addSteps('invert,channel');
sequencer.addSteps(['invert','channel']);
```
For passing default configurations ({} is optional):
```js
sequencer.addSteps('brightness{}');
```
For passing custom configurations:
```js
sequencer.addSteps('brightness{brightness:80}');
```
For passing multiple custom configurations:
```js
sequencer.addSteps('crop{x:120|y:90}')
```
For passing multiple custom configurable modules:
```js
sequencer.addSteps('crop{x:130|y:80},brightness{brightness:80}')
```
return value: **`sequencer`** (To allow method chaining)
@@ -170,13 +301,35 @@ modules.
sequencer.run();
```
Additionally, an optional callback can be passed to this method.
Sequencer can be run with a custom config object
```js
sequencer.run(function(out){
// The config object enables custom progress bars in a node environment and
// ability to run the sequencer from a particular index(of the steps array)
sequencer.run(config);
```
The config object can have the following keys
```js
config: {
progressObj: , //A custom object to handle progress bar
index: //Index to run the sequencer from (defaults to 0)
}
```
Additionally, an optional callback function can be passed to this method.
```js
sequencer.run(function callback(out){
// this gets called back.
// "out" is the DataURL of the final image.
});
sequencer.run(config,function callback(out){
// the callback is supported by all types of invocations
});
```
return value: **`sequencer`** (To allow method chaining)
@@ -185,7 +338,7 @@ return value: **`sequencer`** (To allow method chaining)
### Removing a step from the sequencer
The `removeSteps` method is used to remove unwanted steps from the sequencer.
It accepts the index of the step as an input, or an array of the unwanted indices
It accepts the index of the step as an input or an array of the unwanted indices,
if there are more than one.
For example, if the modules ['ndvi-red','crop','invert'] were added in this order,
@@ -205,14 +358,14 @@ return value: **`sequencer`** (To allow method chaining)
### Inserting a step in between the sequencer
The `insertSteps` method can be used to insert one or more steps at a given index
in the sequencer. It accepts the index where the module is to be inserted, name of
in the sequencer. It accepts the index where the module is to be inserted, the name of
the module, and an optional options parameter. `index` is the index of the inserted
step. Only one step can be inserted at a time. `optional_options` plays the same
role it played in `addSteps`.
Indexes can be negative. Negative sign with an index means that counting will be
done in reverse order. If the index is out of bounds, the counting will wrap in
the original direction of counting. So, an `index` of -1 means that the module is
the original direction of counting. So, an `index` of -1 means the module is
inserted at the end.
```js
@@ -221,19 +374,28 @@ sequencer.insertSteps(index,module_name,optional_options);
return value: **`sequencer`** (To allow method chaining)
### Importing an independent module
The `loadNewModule` method can be used to import a new module inside the sequencer. Modules can be downloaded via npm, yarn or CDN and are imported with a custom name. If you wish to load a new module at runtime, it will need to avoid using `require()` -- unless it is compiled with a system like browserify or webpack.
```js
const module = require('sequencer-moduleName')
sequencer.loadNewModule('moduleName',module);
```
## Method Chaining
Methods can be chained on the Image Sequencer:
* loadImage()/loadImages() can only terminate a chain.
* run() can not be in the middle of the chain.
* If the chain starts with loadImage() or loadImages(), the following methods are
applied only to the newly loaded images.
* If no name is provided to the image, a name will be generated for it. The name will
be of the form "image<number>". For ex: "image1", "image2", "image3", etc.
Valid Chains:
```js
sequencer.loadImage('red',function(){
sequencer.loadImage(function(){
this.addSteps('invert').run(function(out){
//do something with ouptut.
});
@@ -248,152 +410,80 @@ sequencer.addSteps('invert').run().addSteps('ndvi-red');
```
## Multiple Images
Image Sequencer is capable of handling multiple images at once.
### Initializing a sequencer with multiple images.
This is just like before.
```js
var sequencer = ImageSequencer();
```
## Fetching current steps
### Loading Multiple Images into the Sequencer
Multiple images can be loaded by the method `loadImages`. Everything is the same,
except that now, a unique identification called `image_name` has to be provided
with each image. This is a string literal.
* 3/2 parameters :
```js
sequencer.loadImages(image_name,
image_src,optional_callback);
```
* 1/2 parameters (JSON) :
```js
sequencer.loadImages({
images: {
image1_name: image_src,
image2_name: image_src,
...
},
callback: optional_callback
});
```
return value: **none**
### Adding Steps on Multiple Images
The same method `addSteps` is used for this. There's just a slight obvious change
in the syntax that the image name has to be supplied too. `image_name` as well as
`module_name` in the following examples can be either strings or arrays of strings.
The `getSteps` method can be used to get the array of current steps in `this` instance of sequencer.For example
```js
sequencer.addSteps(image_name,module_name,optional_options);
sequencer.getSteps()
```
If no Image Name is specified, the module is added to **all** images.
returns an array of steps associated with the current sequencer.
## Saving Sequences
IMAGE SEQUENCER supports saving a sequence of modules and their associated settings in a simple string syntax. These sequences can be saved in the local storage of the browser and inside a JSON file in node.js. sequences can be saved in node context using the CLI option
```shell
--save-sequence "name stringified-sequence"
```
In Node and the browser the following function can be used
```js
sequencer.saveSequence(name,sequenceString)
```
The function `sequencer.loadModules()` reloads the modules and the saved sequences into `sequencer.modules` and `sequencer.sequences`
## String syntax
Image sequencer supports stringifying a sequence which is appended to the url and hence can then be shared. An example below shows the string syntax for `channel` and `invert` module
```
channel{channel:green},invert{}
```
The use of `()` in place of `{}` for backward compatibility with older links is now **deprecated**. (There is no longer support for the following syntax, and should be avoided)
```
channel(channel:green),invert()
```
Following are the core API functions that can be used to stringify and jsonify steps.
```js
sequencer.toString() //returns the stringified sequence of current steps
sequencer.toJSON(str) // returns the JSON for the current sequence
sequencer.stringToJSON(str) // returns the JSON for given stringified sequence
sequencer.importString(str) //Imports the sequence of steps into sequencer
sequencer.importJSON(obj) //Imports the given sequence of JSON steps into sequencer
```
Image Sequencer can also generate a string for usage in the CLI for the current sequence of steps:
```js
sequencer.toCliString()
```
## Importing steps using JSON array
Image sequencer provides the following core API function to import the given sequence of JSON steps into sequencer.
```js
sequencer.addSteps(module_name,optional_options);
sequencer.importJSON(obj)
```
All this can be passed in as JSON:
It can be implemented the following way for example:
```js
sequencer.addSteps({
image1_name: {name: module_name, o: optional_options},
image2_name: {name: module_name, o: optional_options},
...
});
```
sequencer.importJSON([
{ name: 'blur', options: {} }
]);
```
where name is the name of step to be added, options object can be the one used to provide various params to the sequencer which can customise the default ones.
return value: **`sequencer`** (To allow method chaining)
To see this in action, please refer to line # 51 of the following:
[test/core/modules/import-export.js](https://github.com/publiclab/image-sequencer/blob/main/test/core/modules/import-export.js)
### Running a Sequencer with multiple images
The same `run` method can be used with a slight change in syntax.
The `run` method accepts parameters `image` and `from`. `from` is the index from
where the function starts generating output. By default, it will run across all
the steps. (from = 1) If no image is specified, the sequencer will be run over **all
the images**. `image_name` may be an array of image names.
```js
sequencer.run(); //All images from first step
```
```js
sequencer.run(image_name,from); //Image 'image' from 'from'
```
The `run` method also accepts an optional callback just like before:
```js
sequencer.run(image_name,from,function(out){
// This gets called back.
// "out" is the DataURL of final image.
});
```
JSON Input is also acceptable.
```js
sequencer.run({
image1_name: from,
image2_name: from,
...
});
```
return value: **`sequencer`** (To allow method chaining)
### Removing Steps from an Image
Similarly, `removeSteps` can also accept an `image_name` parameter. Either, both,
or none of `image_name` and `steps` them may be an array. JSON input is also acceptable.
```js
sequencer.removeSteps("image_name",[steps]);
```
```js
sequencer.removeSteps("image_name",step);
```
```js
sequencer.removeSteps({
image1_name: [steps],
image2_name: [steps],
...
});
```
return value: **`sequencer`** (To allow method chaining)
### Inserting steps on an image
The `insertSteps` method can also accept an `image_name` parameter. `image_name`
may be an array. Everything else remains the same. JSON Inout is acceptable too.
```js
sequencer.insertSteps("image",index,"module_name",o);
```
```js
sequencer.insertSteps([image],index,"module_name",o);
```
```js
sequencer.insertSteps({
image1: [
{index:index1, name: module_name1, o:optional_options1},
{index:index2, name: module_name2, o:optional_options2},
...
]
});
```
return value: **`sequencer`** (To allow method chaining)
## Creating a User Interface
@@ -410,6 +500,10 @@ for a module. This can be used, for instance, to update the DIV with the new ima
and remove the loading GIF generated above.
* `onRemove` : This event is triggered when a module is removed. This can be used,
for instance, to remove the DIV generated above.
* `notify` : This event is triggered whenever we need to shoot a notification to the
user-interface.For example when the step is not available, we can shoot a notification,
by sending appropriate message.For HTML UI it adds a DOM node to the browser, for CLI
and node , it logs the notification output to the respective console.
How to define these functions:
@@ -418,7 +512,8 @@ sequencer.setUI({
onSetup: function(step) {},
onDraw: function(step) {},
onComplete: function(step) {},
onRemove: function(step) {}
onRemove: function(step) {},
notify: function(msg,id) {}
});
```
@@ -461,10 +556,71 @@ sequencer.setUI({
});
```
Note: `identity.imageName` is the "name" of that particular image. This name can
be specified while loading the image via `sequencer.loadImage("name","SRC")`. If
not specified, the name of a loaded image defaults to a name like "image1",
"image2", et cetra.
## Using multiple images on same sequencer:
Details of all modules can be sought using `sequencer.modulesInfo()`.
Image Sequencer object supports one imageURL at a time.
Adding a seccond image to same sequencer will result to adding same set of steps added to prior image and flushing out the previous one.
```js
s1 = new ImageSequencer(...);
s1.loadImage(url1);
s1.addSteps('blur');
s1.run();
s1.addImage(url2);
s1.run();
```
However if we want to use more than one image, we can either initialize a sequencer for each image like:
```js
sequencer1 = new ImageSequencer(...);
sequencer1.loadImage(...);
sequencer1.addSteps(steps);
sequencer1.run();
sequencer2 = new ImageSequencer(...);
sequencer2.loadImage(...);
sequencer2.addSteps(steps);
sequencer2.run();
```
**Note**: Details of all modules can be sought using `sequencer.modulesInfo()`.
This method returns an object which defines the name and inputs of the modules. If a module name (hyphenated) is passed in the method, then only the details of that module are returned.
The `notify` function takes two parameters `msg` and `id`, former being the message to be displayed on console (in case of CLI and node ) and a HTML component(in browser). The id is optional and is useful for HTML interface to give appropriate IDs.
## Using WebAssembly for heavy pixel processing
Any module which uses the `changePixel` function gets WebAssembly acceleration (`wasm`). Both node and browser code use WebAssembly and the only code which falls back to non-`wasm` code is the [browserified unit tests](https://github.com/publiclab/image-sequencer/blob/main/test/core/sequencer/benchmark.js).
The main advantage we get using `wasm` is blazing fast speed attained in processing pixels for many modules that is very clear from [checking module benchmarks](https://travis-ci.org/publiclab/image-sequencer/jobs/544415673#L1931).
The only limitation is that browser and node code for `wasm` had to be written separately, and switched between. This is because in browser we use `fetch` to retrieve the compiled `wasm` program while in node we use the `fs` module, each of which cannot be used in the other's environment.
`wasm` mode is enabled by default. If you need to force this mode to be on or off, you can use the `useWasm` option when initializing ImageSequencer:
```js
let sequencer = ImageSequencer({useWasm:true}) // for wasm mode or simply
let sequencer = ImageSequencer() // also for wasm mode i.e. default mode
let sequencer = ImageSequencer({useWasm:false}) //for non-wasm mode
```
## Experimental GIF processing support
ImageSequencer currently can process GIFs but only for most of the modules. Every frame of the GIF is manipulated sequentially (parallel processing would be preferable in the future).
The final frames are then converted back to a GIF but in the process, the time duration of each frame is lost and defaults to `0.1s`.
Modules that do not work:
1. ColorBar (Will get fixed upon fixing overlay as this is a meta module which uses overlay)
2. FisheyeGL
3. Overlay
4. Blend
5. Histogram
6. WebGL Distort

39013
dist/image-sequencer.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

BIN
dist/manipulation.wasm vendored Normal file

Binary file not shown.

View File

@@ -1,10 +1,259 @@
Documentation of various Modules
===
## Crop Module (crop)
List of Module Documentations
1. [Add QR](#Add-QR-module)
2. [Average](#average-module)
3. [Blend](#blend-module)
4. [Blur](#blur-module)
5. [Brightness](#brightness-module)
6. [Canvas-Resize](#canvas-resize-module)
7. [Channel](#channel-module)
8. [Colorbar](#colorbar-module)
9. [Colormap](#colormap-module)
10. [ColorTemperature](#color-temperature)
11. [Contrast](#contrast-module)
12. [Convolution](#convolution-module)
13. [Crop](#crop-module)
14. [DecodeQr](#decodeQr-module)
15. [Dither](#dither-module)
16. [DrawRectangle](#draw-rectangle-module)
17. [Dynamic](#dynamic-module)
18. [Edge-Detect](#edge-detect-module)
19. [Exposure](#exposure-module)
20. [FisheyeGl](#fisheyeGl-module)
21. [FlipImage](#flipimage-module)
22. [Gamma-Correction](#gamma-correction-module)
23. [Gradient](#gradient-module)
24. [Grid-Overlay](#grid-overlay)
25. [Histogram](#histogram-module)
26. [Import-image](#import-image-module)
27. [Invert](#invert-module)
28. [MinifyImage](#minify-image)
29. [Ndvi](#ndvi-module)
30. [Ndvi-Colormap](#ndvi-colormap-module)
31. [NoiseReduction](#noise-reduction)
32. [Overlay](#overlay-module)
33. [PaintBucket](#paint-bucket-module)
34. [ReplaceColor](#replacecolor-module)
35. [Resize](#resize-module)
36. [Rotate](#rotate-module)
37. [Saturation](#saturation-module)
38. [Segmented-Colormap](#segmented-colormap-module)
39. [Text-Overlay](#text-overlay)
40. [Threshold](#threshold)
41. [Tint](#tint)
42. [WebGL-Distort](#webgl-distort-module)
43. [White-Balance](#white-balance-module)
## add-qr-module
This module Adds QR corresponding to the given string.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('add-qr',options)
.run()
```
where `options` is an object with the following properties:
* size : size of QR code in pixels (default 200)
* qrCodeString : input string to generate QR code
## average-module
This module is used for averaging all the pixels of the image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('average',options)
.run()
```
## blend-module
This module is used for blending two images. For More info read: _[wiki](https://en.wikipedia.org/wiki/Blend_modes)_
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('blend',options)
.run()
```
where `options` is an object with the following properties:
* offset: step of image with which current image is to be blended(Two steps back is -2, three steps back is -3 etc; default -2)
* blendMode: Blending mode to use for blending two images by default it uses the given function
* func: function used to blend two images (default : function(r1, g1, b1, a1, r2, g2, b2, a2) { return [ r1, g2, b2, a2 ] })
[More info for different blend modes can be found here](http://docs.gimp.org/en/gimp-concepts-layer-modes.html)
## Blob Analysis
This module uses Opencv.js for detecting and marking blob/region in microscopic images. It requires an opencv.js file to
be loaded before using the functionalities which is currently being loaded to the webpage via script.It supports both environments, Node.js and browser for processing.
As the size of opencv.js file is quite large, the future versions will focus on loading it asynchronously, on demand of the the module to optimise performance.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('blob-analysis')
.run()
```
## blur-module
This module is used for applying a Gaussian blur effect.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('blur',options)
.run()
```
where `options` is an object with the following property:
* blur : Intensity of Gaussian blur (0 to 5; default 2)
## brightness-module
This module is used for changing the brightness of the image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('brightness',options)
.run()
```
where `options` is an object with the following property:
* brightness : brightness of the image in percentage (0 to 100; default 100)
## canvas-resize-module
This module is used for resizing the canvas of the image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('canvas-resize',options)
.run()
```
where `options` is an object with the following property:
* width: final width of the canvas (default 1000)
* height: final height of the canvas (default 1000)
* x: x-coordinate of the top left of the image on the canvas (default 500)
* y: y-coordinate of the top left of the image on the canvas (default 500)
## channel-module
This module is used for forming a grayscale image by applying one of the three primary colors.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('channel',options)
.run()
```
where `options` is an object with the following property:
* channel : color of the channel (red, green, blue; default green)
## colorbar-module
This module is used for displaying an image with a colorbar.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('colorbar',options)
.run()
```
where `options` is an object with the following properties:
* colormap : Name of the Colormap(default, greyscale, stretched, fastie, brntogrn, blutoredjet, colors16; default: default)
* x : X-position of the image on which the new image is overlayed (default 0)
* y : Y-position of the image on which the new image is overlayed (default 0)
* h : height of resulting cropped image (default : 50% of input image width )
## colormap-module
This module is used for mapping brightness values (average of red, green & blue) to a given color lookup table, made up of a set of one more color gradients.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('colormap',options)
.run()
```
where `options` is an object with the following property:
* colormap : Name of the Colormap ( greyscale, stretched, fastie, brntogrn, blutoredjet, colors16)
## Color Temperature
This changes the color temperature of the image.
## Usage
```js
sequencer.loadImage('PATH')
.addSteps('color-temperature',options)
.run()
```
where `options` is an object with the following property:
* temperature : temperature between 0 - 40,000 kelvin (default 6000)
## contrast-module
This module is used for changing the contrast of the image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('contrast',options)
.run()
```
where `options` is an object with the following property:
* contrast : contrast for the given image (-100 to 100; default : 70)
## convolution-module
This module is used for performing image-convolution.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('convolution',options)
.run()
```
where `options` is an object with the following properties:
* constantFactor : a constant factor, multiplies all the kernel values by that factor (default : 1/9)
* kernelValues : nine space separated numbers representing the kernel values in left to right and top to bottom format(default : 1 1 1 1 1 1 1 1 1)
## crop-module
This module is used to crop an image.
#### Usage
```js
@@ -24,10 +273,379 @@ Where `options` is an object having the properties `x`, `y`, `w`, `h`. This diag
* `options.h` : half of image height
## Segmented Colormap Module (segmented-colormap)
## decodeQr-module
This module is used for decoding a QR in image (if present).
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('decode-qr',options)
.run()
```
## dither-module
This module approximates a color from a mixture of other colors when the required color is not available, creating illusions of the color that is not present actually.
[more info on wikipedia](https://en.wikipedia.org/wiki/Dither)
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('dither',options)
.run()
```
where `options` is an object with the following property:
* dither : Can select the name of the Dithering Algorithm(default none)
## draw-rectangle-module
This module helps to draw a rectangle on the image with a starting and ending corner with the specified thickness and color of the border.
## Usage
```js
sequencer.loadImage('PATH')
.addSteps('draw-rectangle',options)
.run()
```
where `options` is an object with the following properties:
* startingX : starting x position of the rectangle (default 0)
* startingY : starting y position of the rectangle (default 0)
* endX : last x position of the rectangle (default "width")
* endY : last y position of the rectangle (default "height")
* thickness : thickness of the border (default 1)
* color : RGBA values separated by a space (default "0 0 0 255")
## dynamic-module
This module is used for producing each color channel based on the original image's color.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('dynamic',options)
.run()
```
where `options` is an object with the following properties:
* red : expression for red channel (R, G, B and A as inputs; default r)
* green : expression for green channel (R, G, B and A as inputs; default g)
* blue : expression for blue channel (R, G, B and A as inputs; default b)
* monochrome: fallback for other channels if none provided (default : r+g+b/3)
## edge-detect-module
This module is used for detecting images.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('edge-detect',options)
.run()
```
where `options` is an object with the following properties:
* blur : Intensity of Gaussian blur (0 to 5; default 2)
* highThresholdRatio : Upper Threshold Ratio ( default : 0.2)
* lowThresholdratio : Lower Threshold Ratio ( default : 0.2)
## exposure-module
This module is used for changing the exposure of the image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('exposure',options)
.run()
```
where `options` is an object with the following property:
* exposure: exposure value for the new image (-3 to 4; default 1)
## fisheyeGl-module
This module is used for correcting Fisheye or Lens Distortion
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('fisheye-gl',options)
.run()
```
where `options` is an object with the following properties:
* a : a correction (0 to 4; default 1)
* b : b correction (0 to 4; default 1)
* Fx : x correction (0 to 4; default 1)
* Fy : y correction (0 to 4; default 1)
* scale : The ratio to which the original image is to be scaled (0 to 20; default 1.5)
* x : Field of View x (0 to 2; default 1)
* y : Field of View y (0 to 2; default 1)
## flipimage-module
This module is used for flipping the image on the selected axis.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('flip-image',options)
.run()
```
where `options` is an object with the following properties:
* Axis : select the required axis (default : vertical)
## gamma-correction-module
This module is used for applying gamma correction.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('gamma-correction',options)
.run()
```
where `options` is an object with the following property:
* adjustment : Inverse of actual gamma factor (default 0.2)
## gradient-module
This module is used for finding gradient of the image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('gradient',options)
.run()
```
## Grid Overlay
This adds the grid over an image.
## Usage
```js
sequencer.loadImage('PATH')
.addSteps('grid-overlay',options)
.run()
```
where `options` is an object with the following property:
* options.x : The value at which the grid line should start in x-axis.
* options.y : The value at which the grid line should start in y-axis.
* color : Color for the grid on the image.
## histogram-module
This module is used for calculating histogram of the image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('histogram',options)
.run()
```
where `options` is an object with the following property:
* gradient : boolean value used to toggle gradient along x-axis (true or false; default true)
## import-image-module
This module is used for importing a new image and replacing the original with it.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('import-image',options)
.run()
```
where `options` is an object with the following property:
* url : url of the new image (local image url or data url;default : "./images/monarch.png")
## invert-module
This module is used for inverting the image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('invert',options)
.run()
```
## Minify Image
This module minifies the image using lossy compression that is the image-dimensions are not lost but the size is reduced.
The module supports jpg/jpeg/webp images in browser; but the node version supports all of the types.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('minify-image')
.run()
```
## ndvi-module
This module is used for applying ndvi technique to the image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('ndvi',options)
.run()
```
where `options` is an object with the following property:
* filter : filter for NDVI (blue or red; default red)
## ndvi-colormap-module
This module is used for demonstrating ndvi and colormap properties consecutively.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('ndvi-colormap',options)
.run()
```
## Noise-Reduction
Noise in an image are atypical pixels that are not representing the color or the exposure of the scene correctly. This Noise Reduction module reduces the noise in the image by using either median filtering or mean filtering techniques to change the RGB value of the pixels to create a smoother and fuller image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('noise-reduction',options)
.run()
```
where `options` is an object with the property `method`. `options.method` can be:
* Median Filtering: Set the RGB value of the pixel to the median RGB pixel value of all adjacent pixels (maximum 8 adjacent pixels and itself)
* Mean Filtering: Set the RGB value of the pixel to the mean RGB pixel value of all adjacent pixels (maximum 8 adjacent pixels and itself)
## overlay-module
This module is used for overlaying an Image over another .
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('overlay',options)
.run()
```
where `options` is an object with the following properties:
* x : X-position of the image on which the new image is overlayed (default 0)
* y : Y-position of the image on which the new image is overlayed (default 0)
* offset : offset to the step on which the output of the last step is overlayed (default -2)
## paint-bucket-module
This module fills any polygonal shape with the specified color in pixels.
## Usage
```js
sequencer.loadImage('PATH')
.addSteps('paint-bucket',options)
.run()
```
where `options` is an object with the following property:
* startingX : it is the value of the starting x-cordinate (default 10)
* startingY : it is the value of the starting y-cordinate (default 10)
* fillColor : they are four spaced seperated numbers representing the RGBA values of fill-color (default "100 100 100 255")
* tolerance : it is the % tolerance (default 10)
## replacecolor-module
This module is used in replacing the color with grey or any desired color.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('replace-color',options)
.run()
```
where `options` is an object with the following properties:
* replaceMethod : replaces with the desired color (default greyscale)
* replaceColor : three space separated numbers representing the RGB values of color to be filled (default "0 0 255")
* color : three space separated numbers representing the RGB values of color to be replaced (default "228 86 81")
* tolerance : it is the % tolerance (default 50)
## resize-module
This module is used for resizing an image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('resize',options)
.run()
```
where `options` is an object with the following property:
* resize : Percentage value of resize (default 125%)
## rotate-module
This module is used for rotating an image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('rotate',options)
.run()
```
where `options` is an object with the following property:
* rotate : angular value for rotation in degrees (between 0 and 360; default 0)
## saturation-module
This module is used for changing the saturation of the image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('saturation',options)
.run()
```
where `options` is an object with the following property:
* saturation : saturation for the new image (between 0 and 2; default 0)
## segmented-colormap-module
This module is used to map the pixels of the image to a segmented colormap.
#### Usage
```js
@@ -48,23 +666,81 @@ where `options` is an object with the property `colormap`. `options.colormap` ca
* A custom array.
## FisheyeGl (fisheye-gl)
This module is used for correcting Fisheye or Lens Distortion
## Text Overlay
The modules allows to add text to image in both browser and node environment. We have the options to modify the font-size and also support few font-styles. The text color can also be modified.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('fisheye-gl',options)
.addSteps('grid-overlay',options)
.run()
```
The options can take various attributes like,
var options = { text : 'Hello World', size : '12'};
## Threshold
Thresholding is used to create binary images.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('threshold',options)
.run()
```
where `options` is an object with the following property:
* threshold : it allows to select the types of thresholding (default "manual thresholding")
* input : it allows to select the range of thresholding value (default 120)
## Tint
It adds color tint to an image
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('tint',options)
.run()
```
where `options` is an object with the following property:
* color : RGB values seperated by a space (default "0 0 255")
* factor : amount of tint (default 0.5)
## webgl-distort-module
This module is used for transforming the perspective of images based on corner coordinates.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('webgl-distort',options)
.run()
```
where `options` is an object with the following properties:
* a : a correction (0 to 4; default 1)
* b : b correction (0 to 4; default 1)
* Fx : x correction (0 to 4; default 1)
* Fy : y correction (0 to 4; default 1)
* scale : The ratio to which the original image is to be scaled (0 to 20; default 1.5)
* x : Field of View x (0 to 2; default 1)
* y : Field of View y (0 to 2; default 1)
where `options` is an object with the following property:
* nw: top-left corner x and y coordinates separated by a comma (default "0,100")
* ne: top-right corner x and y coordinates separated by a comma (default "1023,-50")
* se: bottom-right corner x and y coordinates separated by a comma (default "1223,867")
* sw: bottom-left corner x and y coordinates separated by a comma (default "100,767")
## white-balance-module
This module is used for rendering neutral colors of an image correctly based on the whitest pixel in the image.
#### Usage
```js
sequencer.loadImage('PATH')
.addSteps('white-balance',options)
.run()
```
where `options` is an object with the following property:
* red: red component of the whitest pixel (default 255)
* green: green component of the whitest pixel (default 255)
* blue: blue component of the whitest pixel (default 255)

View File

@@ -1,14 +1,14 @@
/* https://github.com/theleagueof/league-spartan */
@font-face {
font-family: 'League Spartan';
src: url('https://raw.githubusercontent.com/theleagueof/league-spartan/master/_webfonts/leaguespartan-bold.eot');
src: url('https://raw.githubusercontent.com/theleagueof/league-spartan/master/_webfonts/leaguespartan-bold.eot?#iefix') format('embedded-opentype'),
url('https://raw.githubusercontent.com/theleagueof/league-spartan/master/_webfonts/leaguespartan-bold.woff2') format('woff2'),
url('https://raw.githubusercontent.com/theleagueof/league-spartan/master/_webfonts/leaguespartan-bold.woff') format('woff'),
url('https://raw.githubusercontent.com/theleagueof/league-spartan/master/_webfonts/leaguespartan-bold.ttf') format('truetype'),
url('https://raw.githubusercontent.com/theleagueof/league-spartan/master/_webfonts/leaguespartan-bold.svg#league_spartanbold') format('svg');
font-weight: bold;
font-style: normal;
font-family: 'League Spartan';
src: url('https://raw.githubusercontent.com/theleagueof/league-spartan/master/_webfonts/leaguespartan-bold.eot');
src: url('https://raw.githubusercontent.com/theleagueof/league-spartan/master/_webfonts/leaguespartan-bold.eot?#iefix') format('embedded-opentype'),
url('https://raw.githubusercontent.com/theleagueof/league-spartan/master/_webfonts/leaguespartan-bold.woff2') format('woff2'),
url('https://raw.githubusercontent.com/theleagueof/league-spartan/master/_webfonts/leaguespartan-bold.woff') format('woff'),
url('https://raw.githubusercontent.com/theleagueof/league-spartan/master/_webfonts/leaguespartan-bold.ttf') format('truetype'),
url('https://raw.githubusercontent.com/theleagueof/league-spartan/master/_webfonts/leaguespartan-bold.svg#league_spartanbold') format('svg');
font-weight: bold;
font-style: normal;
}
body {
@@ -18,20 +18,47 @@ body {
background: #f8f8fa;
}
footer {
margin-top: 40px;
}
h1 {
font-family: 'League Spartan';
color: #445;
}
body > .container,
body > .container-fluid {
}
.center-align {
display: flex;
justify-content: left;
text-align:center;
}
.header {
text-align: center;
}
.panel {
margin-left: 20px;
margin-right: 20px;
}
.mouse {
cursor: pointer !important;
}
.nomargin {
margin: 0 !important;
}
#dropzone {
.form-control[type="range"] {
padding: 0px 0px;
}
.dropzone {
padding: 30px;
margin: 0 20% 30px;
border: 4px dashed #ccc;
@@ -40,12 +67,22 @@ h1 {
color: #444;
}
.hover {
background: #eee;
.dropzone input {
max-width: 100%;
}
#dropzone input {
max-width: 100%;
.import-image-zone {
margin: 10px auto 30px auto;
max-width: 250px;
min-width: 230px;
}
.import-image-zone input {
max-width: 100%;
}
.hover {
background: #eee;
}
.step {
@@ -56,17 +93,6 @@ h1 {
margin-bottom: 20px;
}
.details {
border-top: 3px solid #444;
padding-left: 6px;
}
.details h3 {
font-family: monospace;
margin-top: 12px;
font-size: 1.3em;
}
.det {
padding: 10px 16px;
text-decoration: italic;
@@ -76,11 +102,27 @@ h1 {
margin: 10px 0;
}
.load {
padding: 30px;
background: #eee;
border-radius: 8px;
text-align: center;
font-size: 2em;
color: #444;
}
#addStep {
max-width: 500px;
margin: 20px auto;
}
#add-step-btn{
width: 100%
}
.selectize-input {
width: 100%;
}
#addStep .labels {
text-align: right;
padding: 6px;
@@ -98,3 +140,235 @@ h1 {
text-align: center;
margin: 10px;
}
#save-seq {
display: block;
margin: 0px 10px 0px 0px;
width: 250px;
}
.info {
padding: 8px;
text-align: center;
}
#gif {
display: block;
margin: 0px 0px 0px 10px;
width: 250px;
}
@media(max-width: 768px) {
#dropzone {
margin: 0 0% 30px;
}
}
#dwnld {
max-width: 500px;
margin: 20px auto;
}
#gif_element {
display: block;
margin: 0 auto;
width: 100%;
height: auto;
}
#move-up {
position: fixed;
bottom: 50px;
right: 40px;
z-index: 550;
display: none;
background:transparent;
border:none;
}
#move-up i {
font-size:60px;
opacity:0.7;
color:#BABABA;
}
.btn-circle{
min-width: 80px;
min-height: 80px;
text-align: center;
display: flex !important;
flex-direction: column;
padding: 6px 0;
font-size: 12px;
line-height: 1.42;
border-radius: 10px;
margin-left: 5px;
margin-right: 5px;
}
.radio{
cursor:pointer;
overflow: hidden;
height: 80px;
width: 80px;
margin-left: 5px;
margin-right: 5px;
}
.radio-group {
margin-bottom: 20px;
overflow: auto;
}
.no-border {
border: 0px;
}
.savesequencemsg{
display: none;
text-align: center;
}
.notification {
background-color: #808b96;
padding:4px;
color:white;
border-radius:3px;
font-size:2rem;
position:fixed;
bottom:2px;
left:50%;
min-width:14rem;
text-align:center;
display:none;
transform: translate(-50%, -50%);
}
#resetButton {
margin-top: 20px;
}
.i-over {
position: absolute;
left: 15px;
top: 15px;
z-index: 2;
color: white;
}
.i-small {
left: 25px;
}
@media all and (max-width: 767px) {
.center-align {
justify-content: space-between;
}
}
a.name-header{
text-decoration: none;
color: #445;
}
.step-column{
display:flex;
align-content: center;
justify-content: center;
}
.trash-container button.btn-xs {
position: relative;
bottom: 7px;
}
.toggleIcon {
transition: transform 0.2s;
}
.rotated {
transform: rotate(180deg);
}
#gif{
margin-left:0px;
margin-top:5px;
width:100%;
}
.save-button{
margin-top:20px;
margin-bottom:0px;
align:center;
width:100%;
}
.toggle {
cursor: default;
}
.general-tooltip:hover{
text-decoration: none;
}
.general-tooltip:focus{
outline: none;
}
.general-tooltip:focus-within{
outline: none;
}
.general-tooltip{
position: relative;
bottom: 7px;
font-size: 16px;
color: #444;
}
#version-number-text {
text-align: center;
padding-top: 100px;
color: gray;
}
#version-number-top-right {
position: fixed;
right: 2%;
top: 5%;
color: gray;
}
/* Non float rightward alignment*/
.right {
margin-left: auto;
display: block;
}
#update-prompt-modal {
visibility: hidden;
min-width: 250px;
margin-left: -125px;
background-color: #333;
color: #fff;
text-align: center;
border-radius: 2px;
padding: 16px;
position: fixed;
z-index: 1000;
left: 10%;
top: 30px;
}
#update-prompt-modal.show {
visibility: visible;
-webkit-animation: fadein 0.5s;
animation: fadein 0.5s;
}
@-webkit-keyframes fadein {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
@keyframes fadein {
from {
opacity: 0;
}
to {
opacity: 1;
}
}

View File

@@ -1,179 +1,354 @@
window.onload = function() {
var defaultHtmlSequencerUi = require('./lib/defaultHtmlSequencerUi.js'),
setupCache = require('./lib/cache.js'),
intermediateHtmlStepUi = require('./lib/intermediateHtmlStepUi.js'),
DefaultHtmlStepUi = require('./lib/defaultHtmlStepUi.js'),
urlHash = require('./lib/urlHash.js'),
insertPreview = require('./lib/insertPreview.js'),
versionManagement = require('./lib/versionManagement.js'),
isGIF = require('../src/util/isGif');
sequencer = ImageSequencer();
// Load information of all modules (Name, Inputs, Outputs)
var modulesInfo = sequencer.modulesInfo();
// Add modules to the addStep dropdown
for(var m in modulesInfo) {
$('#addStep select').append(
'<option value="'+m+'">'+modulesInfo[m].name+'</option>'
);
}
// Initial definitions
var steps = document.querySelector('#steps');
var parser = new DOMParser();
var reader = new FileReader();
// Set the UI in sequencer. This Will generate HTML based on
// Image Sequencer events :
// onSetup : Called every time a step is added
// onDraw : Called every time a step starts draw
// onComplete : Called every time a step finishes drawing
// onRemove : Called everytime a step is removed
// The variable 'step' stores useful data like input and
// output values, step information.
// See documetation for more details.
sequencer.setUI({
onSetup: function(step) {
if (step.options && step.options.description) step.description = step.options.description
step.ui = '\
<div class="row step">\
<div class="col-md-4 details">\
<h3>'+step.name+'</h3>\
<p><i>'+(step.description || '')+'</i></p>\
</div>\
<div class="col-md-8">\
<img alt="" class="img-thumbnail"/>\
</div>\
</div>\
';
var tools =
'<div class="tools btn-group">\
<button confirm="Are you sure?" class="remove btn btn-xs btn-default">\
<i class="fa fa-trash"></i>\
</button>\
</div>';
step.ui = parser.parseFromString(step.ui,'text/html');
step.ui = step.ui.querySelector('div.row');
step.imgElement = step.ui.querySelector('img');
if(sequencer.modulesInfo().hasOwnProperty(step.name)) {
var inputs = sequencer.modulesInfo(step.name).inputs;
var outputs = sequencer.modulesInfo(step.name).outputs;
var io = Object.assign(inputs, outputs);
for (var i in io) {
var div = document.createElement('div');
div.className = "row";
div.setAttribute('name', i);
div.innerHTML = "<div class='det'>\
<label for='" + i + "'>" + i + "</label>\
<input name=" + i + " class='form-control' style='width:50%' type='text' />\
</div>";
step.ui.querySelector('div.details').appendChild(div);
}
$(step.ui.querySelector('div.details')).append("<p><button class='btn btn-default btn-save'>Save</button></p>");
// on clicking Save in the details pane of the step
$(step.ui.querySelector('div.details .btn-save')).click(function saveOptions() {
$(step.ui.querySelector('div.details')).find('input').each(function(i, input) {
step.options[$(input).attr('name')] = input.value;
});
sequencer.run();
});
window.onload = function () {
sequencer = ImageSequencer(); // Set the global sequencer variable
options = {
sortField: 'text',
openOnFocus: false,
onInitialize: function () {
this.$control.on('click', () => {
this.ignoreFocusOpen = true;
setTimeout(() => {
// Trigger onFocus and open dropdown.
this.ignoreFocusOpen = false;
}, 50);
});
},
// Open dropdown after timeout of onClick.
onFocus: function () {
if (!this.ignoreFocusOpen) {
this.open();
}
}
};
if(step.name != "load-image")
step.ui.querySelector('div.details').appendChild(
parser.parseFromString(tools,'text/html')
.querySelector('div')
versionManagement.getLatestVersionNumber(function(versionNumber) {
console.log('The latest NPM version number for Image Sequencer (from GitHub) is v' + versionNumber);
});
console.log('The local version number for Image Sequencer is v' + versionManagement.getLocalVersionNumber());
function displayVersionNumber() {
$('#version-number-text').text('Image Sequencer v' + versionManagement.getLocalVersionNumber());
$('#version-number-top-right').text('v' + versionManagement.getLocalVersionNumber());
}
displayVersionNumber();
function refreshOptions(options) {
// Default options if parameter is empty.
if (options == undefined) options = { sortField: 'text' };
// Load information of all modules (Name, Inputs, Outputs)
var modulesInfo = sequencer.modulesInfo();
var addStepSelect = $('#addStep select');
addStepSelect.html('');
// Add modules to the addStep dropdown
for (var m in modulesInfo) {
if (modulesInfo[m] && modulesInfo[m].name)
addStepSelect.append(
'<option value="' + m + '">' + modulesInfo[m].name + '</option>'
);
}
// Null option
addStepSelect.append('<option value="" disabled selected>Select a Module</option>');
addStepSelect.selectize(options);
}
refreshOptions(options);
steps.appendChild(step.ui);
},
$(window).on('scroll', scrollFunction);
onComplete: function(step) {
step.imgElement.src = step.output;
if(sequencer.modulesInfo().hasOwnProperty(step.name)) {
var inputs = sequencer.modulesInfo(step.name).inputs;
var outputs = sequencer.modulesInfo(step.name).outputs;
for (var i in inputs) {
if (step.options[i] !== undefined) step.ui.querySelector('div[name="'+i+'"] input')
.value = step.options[i];
}
for (var i in outputs) {
if (step[i] !== undefined) step.ui.querySelector('div[name="'+i+'"] input')
.value = step[i];
/**
* @description Method to toggle the scroll-up arrow.
*/
function scrollFunction(A, B) {
var shouldDisplay = $('body').scrollTop() > 20 || $(':root').scrollTop() > 20;
$('#move-up').css({
display: shouldDisplay ? 'block' : 'none'
});
}
/**
* @description Method to scroll to the top of the page.
*/
function topFunction() {
$('body').animate({scrollTop: 0});
$(':root').animate({scrollTop: 0});
}
$('#move-up').on('click', topFunction);
// UI for each step:
sequencer.setUI(DefaultHtmlStepUi(sequencer));
// UI for the overall demo:
var ui = defaultHtmlSequencerUi(sequencer);
// Load image data from URL `src` parameter.
if (urlHash.getUrlHashParameter('src')) {
sequencer.loadImage(urlHash.getUrlHashParameter('src'), ui.onLoad);
} else {
sequencer.loadImage('images/tulips.png', ui.onLoad);
}
var resetSequence = function () {
var r = confirm('Do you want to reset the sequence?');
if (r)
{
window.location.hash = '';
location.reload();
}
};
$('#addStep select').on('change', ui.selectNewStepUi);
$('#addStep #add-step-btn').on('click', ui.addStepUi);
$('#resetButton').on('click', resetSequence);
// Module Selector quick buttons click handler.
$('.radio-group .radio').on('click', function () {
$(this).parent().find('.radio').removeClass('selected');
$(this).addClass('selected');
newStep = $(this).attr('data-value');
$('#addStep select').val(newStep);
ui.selectNewStepUi(newStep);
ui.addStepUi(newStep);
$(this).removeClass('selected');
});
/**
* @method displayMessageOnSaveSequence
* @description When a sequence is saved to a browser, notification is displayed.
* @returns {Null}
*/
function displayMessageOnSaveSequence() {
$('.savesequencemsg').fadeIn();
setTimeout(function () {
$('.savesequencemsg').fadeOut();
}, 3000);
}
$('body').on('click', 'button.remove', ui.removeStepUi);
function saveSequence() { // 1. save seq
var result = window.prompt('Please give a name to your sequence... (Saved sequence will only be available in this browser).');
if (result) {
result = result + ' (local)';
sequencer.saveSequence(result, sequencer.toString()); // 1.a study saveSequence
sequencer.loadModules();
displayMessageOnSaveSequence();
refreshOptions();
}
}
$('#saveButton').on('click', function () {
// Different handlers triggered for different dropdown options.
let dropDownValue = $('#selectSaveOption option:selected').val();
if (dropDownValue == 'save-image') {
$('.download-btn:last()').trigger('click');
}
else if (dropDownValue == 'save-gif') {
handleSavePNG();
}
else if (dropDownValue == 'save-seq') {
saveSequence();
} else if(dropDownValue == 'save-pdf') {
savePDF(getLastImage());
}
else if (dropDownValue == 'save-to-publiclab.org' ){
SaveToPubliclab();
}
});
let isWorkingOnGifGeneration = false;
$('.js-view-as-gif').on('click', function (event) { // GIF generation and display
if (isWorkingOnGifGeneration) return; // Prevent multiple button clicks
isWorkingOnGifGeneration = true;
var button = event.target;
button.disabled = true;
button.innerHTML = '<i class="fa fa-circle-o-notch fa-spin"></i>';
try {
// Get GIF resources from previous steps
let options = getGifResources();
gifshot.createGIF(options, function (obj) { // GIF generation
if (!obj.error) {
// Final GIF encoded with base64 format
var image = obj.image;
var animatedImage = document.createElement('img');
animatedImage.id = 'gif_element';
animatedImage.src = image;
let modal = $('#js-download-gif-modal');
$('#js-download-as-gif-button').one('click', function () {
downloadGif(image); // Trigger GIF download
modal.modal('hide');
});
var gifContainer = document.getElementById('js-download-modal-gif-container');
// Clear previous results
gifContainer.innerHTML = '';
// Insert image
gifContainer.appendChild(animatedImage);
// Open modal
modal.modal();
button.disabled = false;
button.innerHTML = 'View GIF';
isWorkingOnGifGeneration = false;
}
});
}
catch (e) {
console.error(e);
button.disabled = false;
button.innerHTML = 'View GIF';
isWorkingOnGifGeneration = false;
}
});
function getGifResources() {
// Returns an object with specific gif options
let imgs = document.getElementsByClassName('step-thumbnail');
var imgSrcs = [];
// Pushes image sources of all the modules in the DOM
for (var i = 0; i < imgs.length; i++) {
imgSrcs.push(imgs[i].src);
}
var options = { // GIF frame options
'gifWidth': imgs[0].width,
'gifHeight': imgs[0].height,
'images': imgSrcs,
'frameDuration': 7,
};
return options;
}
function handleSavePNG() {
let options = getGifResources();
gifshot.createGIF(options, function(obj){
downloadGif(obj.image);
});
}
/**
* Get the data URL for the last image in the sequence.
* @return {string} The data URL for the last image in the sequence.
*/
function getLastImage() {
// Get the image from the last step.
let imgs = document.getElementsByClassName('step-thumbnail');
let lastStepImage = imgs[imgs.length - 1];
return lastStepImage.getAttribute('src');
}
/**
* Download the given image URL as a PDF file.
* @param {string} imageDataURL - The data URL for the image.
*/
function savePDF(imageDataURL) {
sequencer.getImageDimensions(imageDataURL, function(dimensions) {
if (isGIF(imageDataURL)) {
// Get the dimensions of the image.
let pageWidth = dimensions.width;
let pageHeight = dimensions.height;
// Create a new pdf with the same dimensions as the image.
const pdf = new jsPDF({
orientation: pageHeight > pageWidth ? 'portrait' : 'landscape',
unit: 'px',
format: [pageHeight, pageWidth]
});
// Add the image to the pdf with dimensions equal to the internal dimensions of the page.
pdf.addImage(imageDataURL, 0, 0, pdf.internal.pageSize.getWidth(), pdf.internal.pageSize.getHeight());
// Save the pdf with the filename specified here:
pdf.save('index.pdf');
}
else console.log('GIFs cannot be converted to PDF');
});
}
function downloadGif(image) {
download(image, 'index.gif', 'image/gif'); // Downloadjs library function
}
function SaveToPubliclab() {
function postToPL(imgSrc) {
var uniq = Date.now();
$('body').append('<form method="post" id="postToPL' + uniq + '" action="https://publiclab.org/post" target="postToPLWindow"><input type="hidden" name="datauri_main_image" /></form>');
f = $('#postToPL' + uniq)[0];
f.datauri_main_image.value = imgSrc;
window.open('', 'postToPLWindow');
f.submit();
}
postToPL($('img')[sequencer.steps.length - 1].src);
}
// Image selection and drag/drop handling from examples/lib/imageSelection.js
sequencer.setInputStep({
dropZoneSelector: '#dropzone',
fileInputSelector: '#fileInput',
takePhotoSelector: '#take-photo',
onLoad: function onFileReaderLoad(progress) {
var reader = progress.target;
var step = sequencer.steps[0];
var util = intermediateHtmlStepUi(sequencer);
step.output.src = reader.result;
sequencer.run({ index: 0 });
if (typeof step.options !== 'undefined')
step.options.step.imgElement.src = reader.result;
else
step.imgElement.src = reader.result;
insertPreview.updatePreviews(reader.result, document.querySelector('#addStep'));
DefaultHtmlStepUi(sequencer).updateDimensions(step);
},
onRemove: function(step) {
step.ui.remove();
onTakePhoto: function (url) {
var step = sequencer.steps[0];
step.output.src = url;
sequencer.run({ index: 0 });
if (typeof step.options !== 'undefined')
step.options.step.imgElement.src = url;
else
step.imgElement.src = url;
insertPreview.updatePreviews(url, document.querySelector('#addStep'));
DefaultHtmlStepUi(sequencer).updateDimensions(step);
}
});
sequencer.loadImage('images/tulips.png', function loadImageUI(){
setupCache();
// look up needed steps from Url Hash:
var stepsFromHash = getUrlHashParameter('steps').split(',')
stepsFromHash.forEach(function eachStep(step) {
sequencer.addSteps(step)
});
sequencer.run();
});
// File handling
$('#addStep select').on('change', selectNewStepUI);
function selectNewStepUI() {
$('#options').html('');
var m = $('#addStep select').val();
for(var input in modulesInfo[m].inputs) {
$('#options').append(
'<div class="row">\
<div class="col-md-5 labels">\
'+input+':\
</div>\
<div class="col-md-5">\
<input class="form-control" type="text" name="'+input+'" value="" placeholder="'+
modulesInfo[m].inputs[input].default+'"/>\
</div>\
</div>'
);
}
if (urlHash.getUrlHashParameter('src')) { // Gets the sequence from the URL
insertPreview.updatePreviews(urlHash.getUrlHashParameter('src'), document.querySelector('#addStep'));
} else {
insertPreview.updatePreviews('images/tulips.png', document.querySelector('#addStep'));
}
function addStepUI() {
var options = {};
var inputs = $('#options input');
$.each(inputs, function() {
options[this.name] = $(this).val();
});
if($('#addStep select').val()=="none") return;
// add to URL hash too
setUrlHashParameter('steps', getUrlHashParameter('steps') + ',' + $('#addStep select').val())
sequencer.addSteps($('#addStep select').val(),options).run();
}
$('#addStep button').on('click', addStepUI);
function removeStepUI(){
var index = $('button.remove').index(this) + 1;
sequencer.removeSteps(index).run();
// remove from URL hash too
var urlHash = getUrlHashParameter('steps').split(',');
urlHash.splice(index - 1, 1);
setUrlHashParameter("steps", urlHash.join(','));
}
$('body').on('click','button.remove', removeStepUI);
// image selection and drag/drop handling from examples/lib/imageSelection.js
setupFileHandling(sequencer);
}
};

View File

@@ -29,6 +29,7 @@
}
</style>
<script src="../node_modules/jquery/dist/jquery.min.js"></script>
<script src="../dist/image-sequencer.js"></script>
</head>

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
examples/images/load.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 663 KiB

After

Width:  |  Height:  |  Size: 489 KiB

View File

@@ -2,69 +2,249 @@
<html>
<head>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="content-type" content="text/html; charset=UTF8">
<meta name="theme-color" content="#428bca">
<link rel="icon" sizes="192x192" href="../icons/ic_192.png">
<link rel="manifest" href="manifest.json">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="content-type" content="text/html; charset=UTF8">
<!--Adding meta Tag for search engine optimisation-->
<meta property="og:description"
content="A pure JavaScript sequential image processing system, inspired by storyboards. Instead of modifying the original image, it creates a new image at each step in a sequence.">
<meta property="og:site_name" content="sequencer.publiclab.org">
<meta property="og:url" content="https://sequencer.publiclab.org">
<meta property="og:title" content="Image Sequencer">
<meta name="Description"
content="Image Sequencer is an image editing tool that creates a new downloadble image at each step.It works in browser and supports both node and CLI.">
<meta name="Keywords" content="image editing downloadable browser node CLI">
<title>Image Sequencer</title>
<title>Image Sequencer</title>
<script src="../node_modules/jquery/dist/jquery.min.js"></script>
<script src="../node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
<script src="../dist/image-sequencer.js" charset="utf-8"></script>
<script src="lib/urlHash.js" charset="utf-8"></script>
<script src="lib/imageSelection.js" charset="utf-8"></script>
<script src="demo.js" charset="utf-8"></script>
<script src="../node_modules/jquery/dist/jquery.min.js"></script>
<script src="../node_modules/bootstrap/dist/js/bootstrap.min.js"></script>
<script src="../src/ui/prepareDynamic.js"></script>
<script src="../dist/image-sequencer.js" charset="utf-8"></script>
<script src="../dist/image-sequencer-ui.js" charset="utf-8"></script>
<script src="../node_modules/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js"></script>
<!-- for crop module: -->
<script src="../node_modules/imgareaselect/jquery.imgareaselect.dev.js"></script>
<script src="../node_modules/gifshot/dist/gifshot.min.js" type="text/javascript"></script>
</head>
<!-- Download.js for large files -->
<script src="../node_modules/downloadjs/download.min.js" type="text/javascript" ></script>
<!-- jspdf to enable save image as pdf -->
<script src="../node_modules/jspdf/dist/jspdf.min.js" type="text/javascript" ></script>
<body>
<!-- <script src="lib/scrollToTop.js"></script> -->
<script src="../node_modules/selectize/dist/js/standalone/selectize.min.js"></script>
</head>
<link href="../node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="../node_modules/font-awesome/css/font-awesome.min.css" rel="stylesheet">
<link rel="stylesheet" href="demo.css">
<body>
<div class="container-fluid">
<link href="../node_modules/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="../node_modules/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.css" rel="stylesheet">
<header class="text-center">
<h1>Image Sequencer</h1>
<p>
Open Source <a href="https://github.com/publiclab/image-sequencer"><i class="fa fa-github"></i></a> by <a href="https://publiclab.org">Public Lab</a>
</p>
</header>
<link rel="stylesheet" href="demo.css">
<link href="../node_modules/font-awesome/css/font-awesome.min.css" rel="stylesheet">
<link href="../node_modules/selectize/dist/css/selectize.default.css" rel="stylesheet">
<!-- for crop module: -->
<!-- for crop module: -->
<link href="../node_modules/imgareaselect/distfiles/css/imgareaselect-default.css" rel="stylesheet">
<link href="./selectize.default.css" rel="stylesheet">
<link rel="stylesheet" href="demo.css">
<div id="dropzone">
<p><i>Select or drag in an image to start!</i></p>
<center><input type="file" id="fileInput" value=""></center>
</div>
<div id="update-prompt-modal">A new version of image sequencer is available. Click <a href="#" id="reload">here</a> to update.</div>
<section id="steps" class="row"></section>
<div class="container-fluid">
<section id="addStep">
<div class="row">
<select class="form-control">
<option value="none" disabled selected>Select a new step...</option>
</select>
</div>
<hr />
<div class="row">
<div id="options"></div>
</div>
<div class="row add">
<button class="btn btn-success btn-lg" name="add">Add Step</button>
</div>
</section>
<header class="text-center">
<h1><a href="/" target='_blank' class="name-header">Image Sequencer</a></h1>
<p>
A pure JavaScript sequential image processing system, inspired by storyboards. Instead of modifying the original
image, it
creates a new image at each step in a sequence.
<a href="https://github.com/publiclab/image-sequencer/blob/main/README.md">Learn more</a>
</p>
<p>
Open Source
<a href="https://github.com/publiclab/image-sequencer">
<i class="fa fa-github"></i>
</a>
by <a href="https://publiclab.org" title="Publiclab Website"><i class="fa fa-globe"></i> Publiclab</a>
</p>
<span id="version-number-top-right"></span>
</header>
<div id="dropzone" class="dropzone">
<p id="dropzone-text">
<i>Select or drag in an image to start!</i>
</p>
<center>
<input type="file" id="fileInput" value="" accept="image/*"><br />
<button type="button" id="take-photo" class="btn btn-primary btn-block btn-lg ">Take a Photo</button>
<video id="video" width="100%" height="100%" style="display:none"></video>
<a href="#" id="capture" style="display:none" class="btn btn-primary btn-md">Click Picture</a>
<a href="#" id="close" style="display:none" class="btn btn-default btn-md">Close</a>
<canvas id="canvas" width="400" height="300" style="display:none"></canvas>
</center>
</div>
<section id="steps" class="row">
<div id="load-image"></div>
</section>
<hr />
<p class="alert alert-success savesequencemsg">Saved Sequence Success. Sequence can be found among other modules in browser's localStorage.
</p>
<div class="row">
<div class="col-sm-8">
<section id="addStep" class="panel panel-primary">
<div class="form-inline">
<div class="panel-body">
<div style="display:flex; justify-content:center;">
</div>
<p class="info">Select a new module to add to your sequence.</p>
<div class="row center-align radio-group">
<div>
<div class="radio" data-value="resize">
<i class="fa fa-arrows-alt fa-4x i-over"></i>
</div>
<p>Resize</p>
</div>
<div>
<div class="radio" data-value="brightness">
<i class="fa fa-sun-o fa-4x i-over"></i>
</div>
<p>Brightness</p>
</div>
<div>
<div class="radio" data-value="contrast">
<i class="fa fa-adjust fa-4x i-over"></i>
</div>
<p>Contrast</p>
</div>
<div>
<div class="radio" data-value="saturation">
<i class="fa fa-tint fa-4x i-over i-small"></i>
</div>
<p>Saturation</p>
</div>
<div>
<div class="radio" data-value="rotate">
<i class="fa fa-rotate-right fa-4x i-over"></i>
</div>
<p>Rotate</p>
</div>
<div>
<div class="radio" data-value="crop">
<i class="fa fa-crop fa-4x i-over"></i>
</div>
<p>Crop</p>
</div>
</div>
<div class="row justify-content-center">
<div class="col-lg-8">
<select id="selectStep" class="text-center">
<!-- The default null selection has been appended manually in demo.js
This is because the options in select are overritten when options are appended.-->
</select>
</div>
<div class="col-lg-4">
<button class="btn btn-primary btn-lg" name="add" id="add-step-btn">Add Step</button></div>
</div>
<div class="row center-align">
<button id="resetButton" class="btn btn-default btn-lg"
style=" margin: 20px 35px 0px 35px; width:100%;">Clear All Steps</button>
</div>
</div>
</div>
</section>
<div class="modal fade" id="js-download-gif-modal" tabindex="-1" role="dialog">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
aria-hidden="true">&times;</span></button>
<h4 class="modal-title">Your gif is ready</h4>
</div>
<div class="modal-body">
<div id="js-download-modal-gif-container">
<!-- Gif should appear here -->
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Done</button>
<button id="js-download-as-gif-button" class="btn btn-primary">Download</button>
</div>
</div>
</div>
</div>
</div>
<div class="col-sm-4">
<section id="dwnld" class="panel panel-primary">
<div class="form-inline">
<div class="panel-body">
<div style="text-align:center;">
<h2 style="margin-top:20px">Save</h2>
<select class="form-control input-md mouse" id="selectSaveOption" style="margin-top:20px">
<option value="save-image">Save as PNG</option>
<option value="save-gif">Save as GIF (all steps)</option>
<option value="save-pdf">Save as PDF</option>
<option value="save-seq">Save sequence</option>
<option value="save-seq-string">Save sequence string</option>
<option value="save-to-publiclab.org">Save to PublicLab.org</option>>
</select>
<p><button id="saveButton" class="btn btn-primary btn-lg save-button">Save</button></p>
<p><button class="btn btn-default btn-lg js-view-as-gif" id="gif">Preview GIF</button></p>
</div>
</div>
</div>
</section>
</div>
</div>
<footer>
<hr style="margin:20px;">
<center><button class="btn btn-default btn-sm" id="clear-cache">Clear offline cache</button></center>
<div class="row">
<div class="col-md-6">
<h2>Need Help?</h2>
<p>
<a class="btn btn-default" href="https://github.com/publiclab/image-sequencer/issues">Ask a question</a>
<a class="btn btn-default" href="https://gitter.im/publiclab/image-sequencer" target="_blank">Ask in our chatroom </a>
</p>
</div>
<div class="col-md-6">
<h2>Improve this tool</h2>
<p>
This is an open source toolkit which you can help improve on Github
</p>
<p>
<a class="btn btn-default" href="https://github.com/publiclab/image-sequencer">View the code &raquo;</a>
</p>
</div>
</div>
<div class="row">
<p id="version-number-text">Unable to load version number</p>
</div>
</footer>
<button id="move-up"><i class="fa fa-arrow-circle-o-up"></i></button>
<script type="text/javascript">
var sequencer;
$(function () {
var sequencer;
})
</script>
<script async src="../node_modules/opencv.js/opencv.js" type="text/javascript"></script>
</body>
</body>
</html>

89
examples/lib/cache.js Normal file
View File

@@ -0,0 +1,89 @@
var setupCache = function() {
let newWorker; // When sw.js is changed, this is the new service worker generated.
// Toggle a CSS class to display a popup prompting the user to fetch a new version.
function showUpdateModal() {
$('#update-prompt-modal').addClass('show');
}
/**
* When a new service worker has been loaded, the button in the update prompt
* modal should trigger the skipWaiting event to replace the current
* service worker with the new one.
*/
$('#reload').on('click', function() {
newWorker.postMessage({ action: 'skipWaiting' });
});
if ('serviceWorker' in navigator) {
// Register the service worker.
navigator.serviceWorker.register('sw.js', { scope: '/examples/' })
.then(function(registration) {
registration.addEventListener('updatefound', () => {
// When sw.js has been changed, get a reference to the new service worker.
newWorker = registration.installing;
newWorker.addEventListener('statechange', () => {
// Check if service worker state has changed.
switch(newWorker.state) {
case 'installed':
if(navigator.serviceWorker.controller) {
// New service worker available; prompt the user to update.
showUpdateModal();
}
// No updates available; do nothing.
break;
}
});
});
const installingWorker = registration.installing;
installingWorker.onstatechange = () => {
console.log(installingWorker);
if (installingWorker.state === 'installed') {
location.reload();
}
};
console.log('Registration successful, scope is:', registration.scope);
})
.catch(function(error) {
console.log('Service worker registration failed, error:', error);
});
/**
* This is the event listener for when the service worker updates.
* When the service worker updates, reload the page.
*/
let refreshing;
navigator.serviceWorker.addEventListener('controllerchange', function() {
if(refreshing) return;
window.location.reload();
refreshing = true;
});
}
if ('serviceWorker' in navigator) {
caches.keys().then(function(cacheNames) {
cacheNames.forEach(function(cacheName) {
$('#clear-cache').append(' ' + cacheName);
});
});
}
$('#clear-cache').click(function() {
if ('serviceWorker' in navigator) {
caches.keys().then(function(cacheNames) {
cacheNames.forEach(function(cacheName) {
caches.delete(cacheName);
});
});
}
location.reload();
});
};
module.exports = setupCache;

View File

@@ -0,0 +1,99 @@
var urlHash = require('./urlHash.js');
insertPreview = require('./insertPreview.js');
function DefaultHtmlSequencerUi(_sequencer, options) {
options = options || {};
var addStepSel = options.addStepSel = options.addStepSel || '#addStep';
var removeStepSel = options.removeStepSel = options.removeStepSel || 'button.remove';
var selectStepSel = options.selectStepSel = options.selectStepSel || '#selectStep';
function onLoad() {
importStepsFromUrlHash();
if ($('#selectStep').val() === 'none')
$(addStepSel + ' #add-step-btn').prop('disabled', true);
handleSaveSequence();
}
// look up needed steps from Url Hash:
function importStepsFromUrlHash() {
var hash = urlHash.getUrlHashParameter('steps');
if (hash) {
_sequencer.importString(hash);
_sequencer.run({ index: 0 });
}
urlHash.setUrlHashParameter('steps', sequencer.toString());
}
function selectNewStepUi() {
var m = $(addStepSel + ' select').val();
if(!m) m = arguments[0];
else $(addStepSel + ' .info').html(_sequencer.modulesInfo(m).description);
$(addStepSel + ' #add-step-btn').prop('disabled', false);
}
function removeStepUi() {
var index = $(removeStepSel).index(this) + 1;
// If last step is removed.
if(sequencer.steps.length==index+1){
console.log("inside")
insertPreview.updatePreviews(sequencer.steps[index-1].output.src, document.querySelector('#addStep'));
}
sequencer.removeSteps(index).run({ index: index - 1 });
// remove from URL hash too
urlHash.setUrlHashParameter('steps', sequencer.toString());
//disable save-sequence button if all steps are removed
handleSaveSequence();
}
function addStepUi() {
if ($(addStepSel + ' select').val() == 'none') return;
var newStepName;
if(typeof arguments[0] !== 'string')
newStepName = $(addStepSel + ' select option').html().toLowerCase().split(' ').join('-');
else newStepName = arguments[0];
/*
* after adding the step we run the sequencer from defined step
* and since loadImage is not a part of the drawarray the step lies at current
* length - 2 of the drawarray
*/
var sequenceLength = 1;
if (sequencer.sequences[newStepName]) {
sequenceLength = sequencer.sequences[newStepName].length;
} else if (sequencer.modules[newStepName][1]['length']) {
sequenceLength = sequencer.modules[newStepName][1]['length'];
}
_sequencer
.addSteps(newStepName, options)
.run({ index: _sequencer.steps.length - sequenceLength - 1 });
$(addStepSel + ' .info').html('Select a new module to add to your sequence.');
$(addStepSel + ' select').val('none');
//enable save-sequence button if disabled initially
handleSaveSequence();
// add to URL hash too
urlHash.setUrlHashParameter('steps', _sequencer.toString());
}
function handleSaveSequence(){
var stepCount = sequencer.steps.length;
if(stepCount < 2)
$(' #save-seq').prop('disabled', true);
else
$(' #save-seq').prop('disabled', false);
}
return {
onLoad: onLoad,
importStepsFromUrlHash: importStepsFromUrlHash,
selectNewStepUi: selectNewStepUi,
removeStepUi: removeStepUi,
addStepUi: addStepUi
};
}
module.exports = DefaultHtmlSequencerUi;

View File

@@ -0,0 +1,474 @@
// Set the UI in sequencer. This Will generate HTML based on
// Image Sequencer events :
// onSetup : Called every time a step is added
// onDraw : Called every time a step starts draw
// onComplete : Called every time a step finishes drawing
// onRemove : Called everytime a step is removed
// The variable 'step' stores useful data like input and
// output values, step information.
// See documetation for more details.
const intermediateHtmlStepUi = require('./intermediateHtmlStepUi.js'),
urlHash = require('./urlHash.js'),
_ = require('lodash'),
insertPreview = require('./insertPreview.js');
mapHtmlTypes = require('./mapHtmltypes'),
scopeQuery = require('./scopeQuery'),
isGIF = require('../../src/util/isGif');
function DefaultHtmlStepUi(_sequencer, options) {
options = options || {};
var stepsEl = options.stepsEl || document.querySelector('#steps');
var selectStepSel = options.selectStepSel = options.selectStepSel || '#selectStep';
function onSetup(step, stepOptions) {
if (step.options && step.options.description)
step.description = step.options.description;
step.ui = // Basic UI markup for the step
'\
<div class="container-fluid step-container">\
<div class="panel panel-default">\
<div class="panel-heading">\
<div class="trash-container pull-right">\
<a type="button" target="_blank" href="https://developer.mozilla.org/en-US/docs/WebAssembly" style="display: none;" class="btn btn-link general-tooltip wasm-tooltip" data-toggle="tooltip" data-html="true" data-original-title="<div style=\'text-align: center\'><p>This step is Web Assembly accelerated. Click to Read More</div>">\
<i class="fa fa-bolt"></i>\
</a>\
<button type="button" class="btn btn-link ' + step.name + ' general-tooltip dimension-tooltip" data-toggle="tooltip" data-html="true" data-original-title="">\
<i class="fa fa-info-circle"></i>\
</button>\
</div>\
<h3 class="panel-title">' +
'<span class="toggle mouse">' + step.name + ' <span class="caret toggleIcon rotated"></span>\
<span class="load-spin pull-right" style="display:none;padding:1px 8px;"><i class="fa fa-circle-o-notch fa-spin"></i></span>\
</h3>\
</div>\
<form class="input-form">\
<div class="panel-body cal collapse in">\
<div class="row step">\
<div class="col-md-4 details container-fluid">\
<div class="cal collapse in"><p>' +
'<a href="https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md#' + step.name + '-module">' + (step.description || '') + '</a>' +
'</p></div>\
</div>\
<div class="col-md-8 cal collapse in step-column">\
<div class="load load-spin" style="display:none;"><i class="fa fa-circle-o-notch fa-spin"></i></div>\
<div class="step-image">\
<a class="cal collapse in"><img class="img-thumbnail step-thumbnail"/></a>\
</div>\
</div>\
</div>\
</div>\
<div class="panel-footer cal collapse in"></div>\
</form>\
</div>\
</div>';
var tools =
'<div class="trash" style="display: inline-block">\
<button confirm="Are you sure?" class="remove btn btn-default btn-xs">\
<i class="fa fa-trash"></i>\
</button>\
</div>';
var util = intermediateHtmlStepUi(_sequencer, step);
var parser = new DOMParser();
step.ui = parser.parseFromString(step.ui, 'text/html'); // Convert the markup string to a DOM node.
step.ui = step.ui.querySelector('div.container-fluid');
step.$step = scopeQuery.scopeSelector(step.ui); // Shorthand methods for scoped DOM queries. Read the docs [CONTRIBUTING.md](https://github.com/publiclab/image-sequencer/blob/main/CONTRIBUTING.md) for more info.
step.$stepAll = scopeQuery.scopeSelectorAll(step.ui);
let {$step, $stepAll} = step;
step.linkElements = step.ui.querySelectorAll('a'); // All the anchor tags in the step UI
step.imgElement = $step('a img.img-thumbnail')[0]; // The output image
if (_sequencer.modulesInfo().hasOwnProperty(step.name)) {
var inputs = _sequencer.modulesInfo(step.name).inputs;
var outputs = _sequencer.modulesInfo(step.name).outputs;
var merged = Object.assign(inputs, outputs); // Combine outputs with inputs
for (var paramName in merged) {
var isInput = inputs.hasOwnProperty(paramName);
var html = '';
var inputDesc = isInput ? mapHtmlTypes(inputs[paramName]) : {};
if (!isInput) {
html += '<span class="output"></span>';
}
else if (inputDesc.type.toLowerCase() == 'select') {
html += '<select class="form-control target" name="' + paramName + '">';
for (var option in inputDesc.values) {
html += '<option>' + inputDesc.values[option] + '</option>';
}
html += '</select>';
}
else {
let paramVal = step.options[paramName] || inputDesc.default;
if (inputDesc.id == 'color-picker') { // Separate input field for color-picker
html +=
'<div id="color-picker" class="input-group colorpicker-component">' +
'<input class="form-control color-picker-target" type="' +
inputDesc.type +
'" name="' +
paramName +
'" value="' +
paramVal + '">' + '<span class="input-group-addon"><i></i></span>' +
'</div>';
}
else { // Non color-picker input types
html =
'<input class="form-control target" type="' +
inputDesc.type +
'" name="' +
paramName +
'" value="' +
paramVal +
'" placeholder ="' +
(inputDesc.placeholder || '');
if (inputDesc.type.toLowerCase() == 'range') {
html +=
'"min="' +
inputDesc.min +
'"max="' +
inputDesc.max +
'"step="' +
(inputDesc.step ? inputDesc.step : 1) + '">' + '<span>' + paramVal + '</span>';
}
else html += '">';
}
}
var div = document.createElement('div');
div.className = 'row';
div.setAttribute('name', paramName);
var description = inputs[paramName].desc || paramName;
div.innerHTML =
'<div class=\'det cal collapse in\'>\
<label for=\'' +
paramName +
'\'>' +
description +
'</label>\
' +
html +
'\
</div>';
$step('div.details').append(div);
}
$step('div.panel-footer').append( // Save button
'<div class="cal collapse in"><button type="submit" class="btn btn-sm btn-default btn-save" disabled = "true" >Apply</button> <small style="padding-top:2px;">Press apply to see changes</small></div>'
);
$step('div.panel-footer').prepend( // Markup for tools: download and insert step buttons
'<button class="pull-right btn btn-default btn-sm insert-step" >\
<span class="insert-text"><i class="fa fa-plus"></i> Insert Step</span><span class="no-insert-text" style="display:none">Close</span></button>\
<button class="pull-right btn btn-default btn-sm download-btn" style="margin-right:2px" >\
<i class="fa fa-download"></i>\
</button>'
);
}
if (step.name != 'load-image') {
$step('div.trash-container')
.prepend(
parser.parseFromString(tools, 'text/html').querySelector('div')
);
$stepAll('.remove').on('click', function() {notify('Step Removed', 'remove-notification');}); // Notification on removal of a step
$step('.insert-step').on('click', function() { util.insertStep(step.ID); }); // Insert a step in between the sequence
// Insert the step's UI in the right place
if (stepOptions.index == _sequencer.steps.length) {
stepsEl.appendChild(step.ui);
$('#steps .step-container:nth-last-child(1) .insert-step').prop('disabled', true);
if($('#steps .step-container:nth-last-child(2)'))
$('#steps .step-container:nth-last-child(2) .insert-step').prop('disabled', false);
}
else {
stepsEl.insertBefore(step.ui, $(stepsEl).children()[stepOptions.index]);
}
// Enable the load-image insert-step button when there are steps after load-image
// The logical operator is `> 0` because the number of steps is found before adding the step, actual logic is `steps.length + 1 > 1` which is later simplified.
if (_sequencer.steps.length > 0) $('#load-image .insert-step').prop('disabled', false);
else $('#load-image .insert-step').prop('disabled', true);
}
else {
$('#load-image').append(step.ui); // Default UI without extra tools for the first step(load image)
$step('div.panel-footer').prepend( `
<button class="right btn btn-default btn-sm insert-step" disabled="true">
<span class="insert-text"><i class="fa fa-plus"></i> Insert Step</span>
<span class="no-insert-text" style="display:none">Close</span>
</button>`
);
$step('.insert-step').on('click', function() { util.insertStep(step.ID); });
}
$step('.toggle').on('click', () => { // Step container dropdown
$step('.toggleIcon').toggleClass('rotated');
$stepAll('.cal').collapse('toggle');
});
$(step.imgElement).on('mousemove', _.debounce(() => imageHover(step), 150)); // Shows the pixel coordinates on hover
$(step.imgElement).on('click', (e) => {e.preventDefault(); });
$stepAll('#color-picker').colorpicker();
function saveOptions(e) { // 1. SAVE OPTIONS
e.preventDefault();
if (optionsChanged){
$step('div.details')
.find('input,select')
.each(function(i, input) {
$(input)
.data('initValue', $(input).val())
.data('hasChangedBefore', false);
step.options[$(input).attr('name')] = $(input).val();
});
_sequencer.run({ index: step.index - 1 });
// Modify the URL hash
urlHash.setUrlHashParameter('steps', _sequencer.toString());
// Disable the save button
$step('.btn-save').prop('disabled', true);
optionsChanged = false;
changedInputs = 0;
}
}
/**
* @method handleInputValueChange
* @description Enables the save button on input change
* @param {*} currentValue The current value of the input
* @param {*} initValue The initial/old value of the input
* @param {Boolean} hasChangedBefore Whether the input was changed before
* @returns {Boolean} True if the value has changed
*/
function handleInputValueChange(currentValue, initValue, hasChangedBefore) {
var inputChanged = !(isNaN(initValue) || isNaN(currentValue) ? currentValue === initValue : currentValue - initValue === 0);
changedInputs += hasChangedBefore ? inputChanged ? 0 : -1 : inputChanged ? 1 : 0;
optionsChanged = changedInputs > 0;
$step('.btn-save').prop('disabled', !optionsChanged);
return inputChanged;
}
var
changedInputs = 0,
optionsChanged = false;
$step('.input-form').on('submit', saveOptions);
$stepAll('.target').each(function(i, input) {
$(input)
.data('initValue', $(input).val())
.data('hasChangedBefore', false)
.on('input change', function() {
$(this)
.focus()
.data('hasChangedBefore',
handleInputValueChange(
$(this).val(),
$(this).data('initValue'),
$(this).data('hasChangedBefore')
)
);
});
});
$stepAll('.color-picker-target').each(function(i, input) {
$(input)
.data('initValue', $(input).val())
.data('hasChangedBefore', false)
.on('input change', function() {
$(this)
.data('hasChangedBefore',
handleInputValueChange(
$(this).val(),
$(this).data('initValue'),
$(this).data('hasChangedBefore')
)
);
});
});
$('input[type="range"]').on('input', function() {
$(this).next().html($(this).val());
});
}
function onDraw({$step, $stepAll}) {
$step('.load').show();
$step('img').hide();
$stepAll('.load-spin').show();
}
function onComplete(step) {
let {$step, $stepAll} = step;
$step('img').show();
$stepAll('.load-spin').hide();
$step('.load').hide();
$stepAll('.download-btn').off('click');
step.imgElement.src = (step.name == 'load-image') ? step.output.src : step.output;
var imgthumbnail = $step('.img-thumbnail').getDomElem();
for (let index = 0; index < step.linkElements.length; index++) {
if (step.linkElements[index].contains(imgthumbnail))
step.linkElements[index].href = step.imgElement.src;
}
// TODO: use a generalized version of this.
function fileExtension(output) {
return output.split('/')[1].split(';')[0];
}
$stepAll('.download-btn').on('click', () => {
var element = document.createElement('a');
element.setAttribute('href', step.output);
element.setAttribute('download', step.name + '.' + fileExtension(step.imgElement.src));
element.style.display = 'none';
document.body.appendChild(element);
element.click();
});
// Fill inputs with stored step options
if (_sequencer.modulesInfo().hasOwnProperty(step.name)) {
var inputs = _sequencer.modulesInfo(step.name).inputs;
var outputs = _sequencer.modulesInfo(step.name).outputs;
for (var i in inputs) {
if (step.options[i] !== undefined) {
if (inputs[i].type.toLowerCase() === 'input')
$step('div[name="' + i + '"] input')
.val(step.options[i])
.data('initValue', step.options[i]);
if (inputs[i].type.toLowerCase() === 'select')
$step('div[name="' + i + '"] select')
.val(String(step.options[i]))
.data('initValue', step.options[i]);
}
}
for (var i in outputs) {
if (step[i] !== undefined)
$step('div[name="' + i + '"] input')
.val(step[i]);
}
}
$(function () {
$('[data-toggle="tooltip"]').tooltip();
updateDimensions(step);
});
if (step.name === 'load-image') insertPreview.updatePreviews(step.output.src, document.querySelector('#addStep'));
else insertPreview.updatePreviews(step.output, document.querySelector('#addStep'));
// Handle the wasm bolt display
if (step.useWasm) {
if (step.wasmSuccess) $step('.wasm-tooltip').fadeIn();
else $step('.wasm-tooltip').fadeOut();
}
else $step('.wasm-tooltip').fadeOut();
}
/**
* @description Updates Dimension of the image
* @param {Object} step - Current Step
* @returns {void}
*
*/
function updateDimensions(step){
_sequencer.getImageDimensions(step.imgElement.src, function (dim) {
step.ui.querySelector('.' + step.name).attributes['data-original-title'].value = `<div style="text-align: center"><p>Image Width: ${dim.width}<br>Image Height: ${dim.height}</br>${isGIF(step.output) ? `Frames: ${dim.frames}` : ''}</div>`;
});
}
/**
* @method imageHover
* @description Handler to display image coordinates on hover.
* @param {Object} step Current step variable
* @returns {Null}
*/
function imageHover(step){
var img = $(step.imgElement);
img.mousemove(function(e) {
var canvas = document.createElement('canvas');
canvas.width = img.width();
canvas.height = img.height();
var context = canvas.getContext('2d');
context.drawImage(this, 0, 0);
var offset = $(this).offset();
var xPos = e.pageX - offset.left;
var yPos = e.pageY - offset.top;
var myData = context.getImageData(xPos, yPos, 1, 1);
img[0].title = 'rgb: ' + myData.data[0] + ',' + myData.data[1] + ',' + myData.data[2];//+ rgbdata;
});
}
function onRemove(step) {
step.ui.remove();
$('#steps .step-container:nth-last-child(1) .insert-step').prop('disabled', true);
// Enable the load-image insert-step button when there are steps after load-image
// The logical operator is `> 2` because the number of steps is found before removing the step, actual logic is `steps.length - 1 > 1` which is later simplified.
if (_sequencer.steps.length - 1 > 1) $('#load-image .insert-step').prop('disabled', false);
else $('#load-image .insert-step').prop('disabled', true);
$(step.imgElement).imgAreaSelect({
remove: true
});
}
function getPreview() {
return step.imgElement;
}
/**
* @method notify
* @description General purpose DOM toast notification
* @param {String} msg Message to be displayed
* @param {String} id A unique identifier for the notification
* @returns {Null}
*/
function notify(msg, id){
if ($('#' + id).length == 0) {
var notification = document.createElement('span');
notification.innerHTML = ' <i class="fa fa-info-circle" aria-hidden="true"></i> ' + msg ;
notification.id = id;
notification.classList.add('notification');
$('body').append(notification);
}
$('#' + id).fadeIn(500).delay(200).fadeOut(500);
}
return {
getPreview: getPreview,
onSetup: onSetup,
onComplete: onComplete,
onRemove: onRemove,
onDraw: onDraw,
notify: notify,
imageHover: imageHover,
updateDimensions: updateDimensions
};
}
if(typeof window === 'undefined'){
module.exports = {
DefaultHtmlStepUi: DefaultHtmlStepUi
};
}
module.exports = DefaultHtmlStepUi;

View File

@@ -1,46 +0,0 @@
function setupFileHandling(_sequencer, dropzoneId, fileInputId) {
dropzoneId = dropzoneId || "dropzone";
var dropzone = $('#' + dropzoneId);
fileInputId = fileInputId || "fileInput";
var fileInput = $('#' + fileInputId);
function handleFile(e) {
e.preventDefault();
e.stopPropagation(); // stops the browser from redirecting.
if (e.target && e.target.files) var file = e.target.files[0];
else var file = e.dataTransfer.files[0];
if(!file) return;
reader.onload = function onFileReaderLoad() {
var loadStep = _sequencer.images.image1.steps[0];
loadStep.output.src = reader.result;
_sequencer.run(0);
loadStep.options.step.imgElement.src = reader.result;
}
reader.readAsDataURL(file);
}
fileInput.on('change', handleFile);
dropzone[0].addEventListener('drop', handleFile, false);
dropzone.on('dragover', function onDragover(e) {
e.stopPropagation();
e.preventDefault();
e.dataTransfer.dropEffect = 'copy'; // Explicitly show this is a copy.
}, false);
dropzone.on('dragenter', function onDragEnter(e) {
dropzone.addClass('hover');
});
dropzone.on('dragleave', function onDragLeave(e) {
dropzone.removeClass('hover');
});
}

View File

@@ -0,0 +1,79 @@
// Generate downscaled preview images for quick buttons.
function generatePreview(previewStepName, customValues, path, DomNode) {
var previewSequencer = ImageSequencer();
function insertPreview(src) {
var img = document.createElement('img');
img.classList.add('img-thumbnail');
img.classList.add('no-border');
img.src = src;
$(img).css('max-width', '200%');
$(img).css('transform', 'translateX(-20%)');
$(DomNode.querySelector('.radio-group')).find('.radio').each(function() {
if ($(this).attr('data-value') === previewStepName) {
$(this).find('img').remove();
$(this).append(img);
}
});
}
function loadPreview() {
if (previewStepName === 'crop') {
previewSequencer.addSteps(previewStepName, customValues).run(insertPreview);
}
else {
previewSequencer.addSteps(previewStepName, { [previewStepName]: customValues }).run(insertPreview);
}
}
if(previewStepName === 'resize')
insertPreview(path);
else
previewSequencer.loadImage(path, loadPreview);
}
function updatePreviews(src, DomNode) {
$(DomNode).find('img').remove();
var previewSequencerSteps = {
'resize': '125%',
'brightness': '175',
'saturation': '0.5',
'rotate': 90,
'contrast': 90,
'crop': {
'x': 0,
'y': 0,
'w': '50%',
'h': '50%',
'noUI': true
}
};
var img = new Image();
img.onload = function(){
var height = img.height;
var width = img.width;
let percentage = (80 / height) * 100; // Take the min resize value that fits the preview area => (new-width/orig_ht) - '80 as the preview area has 80*80 dimension.
percentage = Math.max((80 / width) * 100, percentage); // Make sure that one dimension doesn't resize greater, leading distorting preview-area fitting.
percentage = Math.ceil(percentage);
var sequencer = ImageSequencer();
sequencer.loadImage(src, function(){
this.addSteps('resize', {['resize']: percentage + '%'});
this.run((src)=>{
Object.keys(previewSequencerSteps).forEach(function (step, index) {
generatePreview(step, Object.values(previewSequencerSteps)[index], src, DomNode);
});
});
});
};
img.src = src;
}
module.exports = {
generatePreview : generatePreview,
updatePreviews : updatePreviews
};

View File

@@ -0,0 +1,172 @@
var urlHash = require('./urlHash.js'),
insertPreview = require('./insertPreview.js');
/**
* @method IntermediateHtmlStepUi
* @description Inserts a module selector in between the current sequence
* @param {Object} _sequencer Sequencer instance
* @param {Object} step Current step variable
* @param {Object} options Optional options Object
* @returns {Object} Object containing the insertStep function
*/
function IntermediateHtmlStepUi(_sequencer, step, options) {
function stepUI() {
// Basic markup for the selector
return '<div class="row insertDiv collapse">\
<section class="panel panel-primary .insert-step">\
<button class="btn btn-default close-insert-box"><i class="fa fa-times" aria-hidden="true"></i> Close</button>\
<div class="form-inline">\
<div class="panel-body">\
<p class="info">Select a new module to add to your sequence.</p>\
<div class="row center-align radio-group">\
<div>\
<div class="radio" data-value="resize">\
<i class="fa fa-arrows-alt fa-4x i-over"></i>\
</div>\
<p>Resize</p>\
</div>\
<div>\
<div class="radio" data-value="brightness">\
<i class="fa fa-sun-o fa-4x i-over"></i>\
</div>\
<p>Brightness</p>\
</div>\
<div>\
<div class="radio" data-value="contrast">\
<i class="fa fa-adjust fa-4x i-over"></i>\
</div>\
<p>Contrast</p>\
</div>\
<div>\
<div class="radio" data-value="saturation">\
<i class="fa fa-tint fa-4x i-over i-small"></i>\
</div>\
<p>Saturation</p>\
</div>\
<div>\
<div class="radio" data-value="rotate">\
<i class="fa fa-rotate-right fa-4x i-over"></i>\
</div>\
<p>Rotate</p>\
</div>\
<div>\
<div class="radio" data-value="crop">\
<i class="fa fa-crop fa-4x i-over"></i>\
</div>\
<p>Crop</p>\
</div>\
</div>\
<div class="row center-align">\
<div class="col-md-8">\
<select class="insert-step-select">\
<!-- The default null selection has been appended manually in demo.js\
This is because the options in select are overritten when options are appended.-->\
</select>\
<div>\
<div class="col-md-4">\
<button class="btn btn-primary btn-lg insert-save-btn add-step-btn" name="add">Add Step</button>\
<div>\
</div>\
</div>\
</div>\
</section>\
</div>';
}
/**
* @method toggleDiv
* @description Toggles the module selector dropdown.
* @param {Object} $step $step util function
* @param {Fucntion} callback Optional callback function
* @returns {Null}
*/
var toggleDiv = function($step, callback = function(){}){
$step('.insertDiv').collapse('toggle');
if ($step('.insert-text').css('display') != 'none'){
$step('.insert-text').fadeToggle(200, function(){$step('.no-insert-text').fadeToggle(200, callback);});
}
else {
$step('.no-insert-text').fadeToggle(200, function(){$step('.insert-text').fadeToggle(200, callback);});
}
};
/**
* @method insertStep
* @description Handler to insert selected module in the sequence
* @returns {Null}
*/
insertStep = function (id) {
const $step = step.$step,
$stepAll = step.$stepAll;
var modulesInfo = _sequencer.modulesInfo();
var parser = new DOMParser();
var addStepUI = stepUI();
addStepUI = parser.parseFromString(addStepUI, 'text/html').querySelector('div');
if ($step('.insertDiv').length > 0){
toggleDiv($step);
}
else {
step.ui
.querySelector('div.step')
.insertAdjacentElement('afterend',
addStepUI
);
toggleDiv($step, function(){
if (step.name === 'load-image') insertPreview.updatePreviews(step.output.src, $step('.insertDiv').getDomElem());
else insertPreview.updatePreviews(step.output, $step('.insertDiv').getDomElem());
});
}
$step('.insertDiv .close-insert-box').off('click').on('click', function(){
toggleDiv($step);
$step('.insertDiv').removeClass('insertDiv');
});
var insertStepSelect = $step('.insert-step-select');
insertStepSelect.html('');
// Add modules to the insertStep dropdown
for (var m in modulesInfo) {
if (modulesInfo[m] && modulesInfo[m].name)
insertStepSelect.append(
'<option value="' + m + '">' + modulesInfo[m].name + '</option>'
);
}
insertStepSelect.selectize({
sortField: 'text'
});
$('.insertDiv .radio-group .radio').on('click', function () {
var newStepName = $(this).attr('data-value'); // Get the name of the module to be inserted
id = $($step('.insertDiv').parents()[3]).prevAll().length;
insert(id, $step, newStepName); // Insert the selected module
});
$step('.insertDiv .add-step-btn').on('click', function () {
var newStepName = insertStepSelect.val();
id = $($step('.insertDiv').parents()[3]).prevAll().length;
insert(id, $step, newStepName); });
};
/**
* @method insert
* @description Inserts the specified step at the specified index in the sequence
* @param {Number} id Index of the step
* @param {Function} $step $step util function
* @param {String} newStepName Name of the new step
*/
function insert(id, $step, newStepName) {
toggleDiv($step);
$step('.insertDiv').removeClass('insertDiv');
_sequencer.insertSteps(id + 1, newStepName).run({ index: id });
urlHash.setUrlHashParameter('steps', _sequencer.toString());
}
return {
insertStep
};
}
module.exports = IntermediateHtmlStepUi;

View File

@@ -0,0 +1,32 @@
/**
* @description Maps module input types to their respective html <input> tag types.
* @param {Object} inputInfo Object containing the type and optionally min/max for range type inputs.
*/
function mapHtmlTypes(inputInfo){
var htmlType;
switch(inputInfo.type.toLowerCase()){
case 'integer':
htmlType = inputInfo.min != undefined ? 'range' : 'number';
break;
case 'string':
htmlType = 'text';
break;
case 'select':
htmlType = 'select';
break;
case 'percentage':
htmlType = 'number';
break;
case 'float':
htmlType = inputInfo.min != undefined ? 'range' : 'text';
break;
default:
htmlType = 'text';
break;
}
var response = Object.assign({}, inputInfo);
response.type = htmlType;
return response;
}
module.exports = mapHtmlTypes;

View File

@@ -0,0 +1,72 @@
/**
* @method $scope
* @param {"DOMNode"} scope A DOM Node as the scope
* @returns {Function} Constructor for the scopeSelector Object.
*/
function $scope(scope) {
return function(queryString){
var element = $(scope.querySelector(queryString));
element.elem = function(queryString){
return new $scope(scope)(queryString);
};
element.elemAll = function(queryString){
return new $scopeAll(scope)(queryString);
};
element.getDomElem = function(i = 0){
return element[i];
};
element.getScope = () => scope;
return element;
};
}
/**
* @method $scopeAll
* @param {"DOMNode"} scope A DOM Node as the scope
* @returns {Function} Constructor for the scopeSelectorAll Object.
*/
function $scopeAll(scope){
return function(queryString){
var element = $(scope.querySelectorAll(queryString));
element.elem = function(queryString){
return new $scope(scope)(queryString);
};
element.elemAll = function(queryString){
return new $scopeAll(scope)(queryString);
};
element.getDomElem = function(i = 0){
return element[i];
};
element.getScope = () => scope;
return element;
};
}
/**
* @method scopeSelector
* @description A scoped jQuery selector
* @param {"DOMNode"} scope A DOM Node as the scope
* @returns {Function}
*/
function scopeSelector(scope){
return $scope(scope);
}
/**
* @method scopeSelectorAll
* @description A scoped jQuery multiple selector
* @param {"DOMNode} scope A DOM Node as the scope
* @returns {Function}
*/
function scopeSelectorAll(scope){
return $scopeAll(scope);
}
module.exports = {
scopeSelector,
scopeSelectorAll
};

View File

@@ -40,3 +40,10 @@ function setUrlHashParameter(param, value) {
setUrlHashParameters(params);
}
module.exports = {
getUrlHashParameter: getUrlHashParameter,
setUrlHashParameter: setUrlHashParameter,
getUrlHashParameters: getUrlHashParameters,
setUrlHashParameters: setUrlHashParameters
};

View File

@@ -0,0 +1,43 @@
/**
* Functions for getting version information.
* Note: these functions are not used by the service worker to check for updates;
* the service worker updates whenever sw.js has changed.
* sw.js is changed when grunt replace:version is run. This task is run during
* grunt build, serve, and productions tasks.
*/
const package = require('../../package.json');
/**
* Get the current version number from package.json on the homepage.
* @param {function} callback The function that uses the version number.
*/
function getLatestVersionNumber(callback) {
// Get the homepage reference from the local package.json.
var homepage = package.homepage;
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState == 4 && request.status == 200) {
var response = JSON.parse(this.responseText);
var latestVersionNumber = response.version;
// Do something with the version number using a callback function.
if (callback)
callback(latestVersionNumber);
}
}
// Get the package.json file from online using a GET request.
request.open("GET", homepage + "/package.json", true);
request.send();
}
// Get the version number from the local package.json file.
function getLocalVersionNumber() {
return package.version;
}
module.exports = {
getLatestVersionNumber,
getLocalVersionNumber
}

21
examples/manifest.json Normal file
View File

@@ -0,0 +1,21 @@
{
"short_name": "IS",
"name": "Image Sequencer",
"icons": [
{
"src": "../icons/ic_192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "../icons/ic_512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": "/examples/#steps=",
"background_color": "#428bca",
"display": "standalone",
"scope": "/examples/",
"theme_color": "#428bca"
}

View File

@@ -0,0 +1,403 @@
/**
* selectize.default.css (v0.12.6) - Default Theme
* Copyright (c) 20132015 Brian Reavis & contributors
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
* file except in compliance with the License. You may obtain a copy of the License at:
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
* ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*
* @author Brian Reavis <brian@thirdroute.com>
*/
.selectize-control.plugin-drag_drop.multi > .selectize-input > div.ui-sortable-placeholder {
visibility: visible !important;
background: #f2f2f2 !important;
background: rgba(0, 0, 0, 0.06) !important;
border: 0 none !important;
-webkit-box-shadow: inset 0 0 12px 4px #fff;
box-shadow: inset 0 0 12px 4px #fff;
}
.selectize-control.plugin-drag_drop .ui-sortable-placeholder::after {
content: '!';
visibility: hidden;
}
.selectize-control.plugin-drag_drop .ui-sortable-helper {
-webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
}
.selectize-dropdown-header {
position: relative;
padding: 5px 8px;
border-bottom: 1px solid #d0d0d0;
background: #f8f8f8;
-webkit-border-radius: 3px 3px 0 0;
-moz-border-radius: 3px 3px 0 0;
border-radius: 3px 3px 0 0;
}
.selectize-dropdown-header-close {
position: absolute;
right: 8px;
top: 50%;
color: #303030;
opacity: 0.4;
margin-top: -12px;
line-height: 20px;
font-size: 20px !important;
}
.selectize-dropdown-header-close:hover {
color: #000000;
}
.selectize-dropdown.plugin-optgroup_columns .optgroup {
border-right: 1px solid #f2f2f2;
border-top: 0 none;
float: left;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.selectize-dropdown.plugin-optgroup_columns .optgroup:last-child {
border-right: 0 none;
}
.selectize-dropdown.plugin-optgroup_columns .optgroup:before {
display: none;
}
.selectize-dropdown.plugin-optgroup_columns .optgroup-header {
border-top: 0 none;
}
.selectize-control.plugin-remove_button [data-value] {
position: relative;
padding-right: 24px !important;
}
.selectize-control.plugin-remove_button [data-value] .remove {
z-index: 1;
/* fixes ie bug (see #392) */
position: absolute;
top: 0;
right: 0;
bottom: 0;
width: 17px;
text-align: center;
font-weight: bold;
font-size: 12px;
color: inherit;
text-decoration: none;
vertical-align: middle;
display: inline-block;
padding: 2px 0 0 0;
border-left: 1px solid #0073bb;
-webkit-border-radius: 0 2px 2px 0;
-moz-border-radius: 0 2px 2px 0;
border-radius: 0 2px 2px 0;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.selectize-control.plugin-remove_button [data-value] .remove:hover {
background: rgba(0, 0, 0, 0.05);
}
.selectize-control.plugin-remove_button [data-value].active .remove {
border-left-color: #00578d;
}
.selectize-control.plugin-remove_button .disabled [data-value] .remove:hover {
background: none;
}
.selectize-control.plugin-remove_button .disabled [data-value] .remove {
border-left-color: #aaaaaa;
}
.selectize-control.plugin-remove_button .remove-single {
position: absolute;
right: 0;
top: 0;
font-size: 23px;
}
.selectize-control {
position: relative;
}
.selectize-dropdown,
.selectize-input,
.selectize-input input {
color: #303030;
font-family: inherit;
font-size: 18px;
line-height: 18px;
-webkit-font-smoothing: inherit;
}
.selectize-input,
.selectize-control.single .selectize-input.input-active {
background: #fff;
cursor: text;
display: inline-block;
}
.selectize-input {
border: 1px solid #d0d0d0;
padding: 10px 0px;
display: inline-block;
width: 24vw;
overflow: hidden;
position: relative;
z-index: 1;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.1);
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
.selectize-control.multi .selectize-input.has-items {
padding: 5px 8px 2px;
}
.selectize-input.full {
background-color: #fff;
}
.selectize-input.disabled,
.selectize-input.disabled * {
cursor: default !important;
}
.selectize-input.focus {
-webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.15);
}
.selectize-input.dropdown-active {
-webkit-border-radius: 3px 3px 0 0;
-moz-border-radius: 3px 3px 0 0;
border-radius: 3px 3px 0 0;
}
.selectize-input > * {
vertical-align: baseline;
display: -moz-inline-stack;
display: inline-block;
zoom: 1;
*display: inline;
}
.selectize-control.multi .selectize-input > div {
cursor: pointer;
margin: 0 3px 3px 0;
padding: 2px 6px;
background: #1da7ee;
color: #fff;
border: 1px solid #0073bb;
}
.selectize-control.multi .selectize-input > div.active {
background: #92c836;
color: #fff;
border: 1px solid #00578d;
}
.selectize-control.multi .selectize-input.disabled > div,
.selectize-control.multi .selectize-input.disabled > div.active {
color: #ffffff;
background: #d2d2d2;
border: 1px solid #aaaaaa;
}
.selectize-input > input {
display: inline-block !important;
padding: 0 !important;
min-height: 0 !important;
max-height: none !important;
max-width: 100% !important;
margin: 0 1px !important;
text-indent: 0 !important;
border: 0 none !important;
background: none !important;
line-height: inherit !important;
-webkit-user-select: auto !important;
-webkit-box-shadow: none !important;
box-shadow: none !important;
}
.selectize-input > input::-ms-clear {
display: none;
}
.selectize-input > input:focus {
outline: none !important;
}
.selectize-input::after {
content: ' ';
display: block;
clear: left;
}
.selectize-input.dropdown-active::before {
content: ' ';
display: block;
position: absolute;
background: #f0f0f0;
height: 1px;
bottom: 0;
left: 0;
right: 0;
}
.selectize-dropdown {
position: absolute;
z-index: 10;
border: 1px solid #d0d0d0;
background: #fff;
margin: -1px 0 0 0;
border-top: 0 none;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-webkit-border-radius: 0 0 3px 3px;
-moz-border-radius: 0 0 3px 3px;
border-radius: 0 0 3px 3px;
}
.selectize-dropdown [data-selectable] {
cursor: pointer;
overflow: hidden;
}
.selectize-dropdown [data-selectable] .highlight {
background: rgba(125, 168, 208, 0.2);
-webkit-border-radius: 1px;
-moz-border-radius: 1px;
border-radius: 1px;
}
.selectize-dropdown .option,
.selectize-dropdown .optgroup-header {
padding: 5px 8px;
}
.selectize-dropdown .option,
.selectize-dropdown [data-disabled],
.selectize-dropdown [data-disabled] [data-selectable].option {
cursor: inherit;
opacity: 0.5;
}
.selectize-dropdown [data-selectable].option {
opacity: 1;
}
.selectize-dropdown .optgroup:first-child .optgroup-header {
border-top: 0 none;
}
.selectize-dropdown .optgroup-header {
color: #303030;
background: #fff;
cursor: default;
}
.selectize-dropdown .active {
background-color: #f5fafd;
color: #495c68;
}
.selectize-dropdown .active.create {
color: #495c68;
}
.selectize-dropdown .create {
color: rgba(48, 48, 48, 0.5);
}
.selectize-dropdown-content {
overflow-y: auto;
overflow-x: hidden;
max-height: 200px;
-webkit-overflow-scrolling: touch;
}
.selectize-control.single .selectize-input,
.selectize-control.single .selectize-input input {
cursor: pointer;
}
.selectize-control.single .selectize-input.input-active,
.selectize-control.single .selectize-input.input-active input {
cursor: text;
}
.selectize-control.single .selectize-input:after {
content: ' ';
display: block;
position: absolute;
top: 50%;
right: 15px;
margin-top: -3px;
width: 0;
height: 0;
border-style: solid;
border-width: 5px 5px 0 5px;
border-color: #808080 transparent transparent transparent;
}
.selectize-control.single .selectize-input.dropdown-active:after {
margin-top: -4px;
border-width: 0 5px 5px 5px;
border-color: transparent transparent #808080 transparent;
}
.selectize-control.rtl.single .selectize-input:after {
left: 15px;
right: auto;
}
.selectize-control.rtl .selectize-input > input {
margin: 0 4px 0 -2px !important;
}
.selectize-control .selectize-input.disabled {
opacity: 0.5;
background-color: #fafafa;
}
.selectize-control.multi .selectize-input.has-items {
padding-left: 5px;
padding-right: 5px;
}
.selectize-control.multi .selectize-input.disabled [data-value] {
color: #999;
text-shadow: none;
background: none;
-webkit-box-shadow: none;
box-shadow: none;
}
.selectize-control.multi .selectize-input.disabled [data-value],
.selectize-control.multi .selectize-input.disabled [data-value] .remove {
border-color: #e6e6e6;
}
.selectize-control.multi .selectize-input.disabled [data-value] .remove {
background: none;
}
.selectize-control.multi .selectize-input [data-value] {
text-shadow: 0 1px 0 rgba(0, 51, 83, 0.3);
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
background-color: #1b9dec;
background-image: -moz-linear-gradient(top, #1da7ee, #178ee9);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#1da7ee), to(#178ee9));
background-image: -webkit-linear-gradient(top, #1da7ee, #178ee9);
background-image: -o-linear-gradient(top, #1da7ee, #178ee9);
background-image: linear-gradient(to bottom, #1da7ee, #178ee9);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff1da7ee', endColorstr='#ff178ee9', GradientType=0);
-webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.2),inset 0 1px rgba(255,255,255,0.03);
box-shadow: 0 1px 0 rgba(0,0,0,0.2),inset 0 1px rgba(255,255,255,0.03);
}
.selectize-control.multi .selectize-input [data-value].active {
background-color: #0085d4;
background-image: -moz-linear-gradient(top, #008fd8, #0075cf);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#008fd8), to(#0075cf));
background-image: -webkit-linear-gradient(top, #008fd8, #0075cf);
background-image: -o-linear-gradient(top, #008fd8, #0075cf);
background-image: linear-gradient(to bottom, #008fd8, #0075cf);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff008fd8', endColorstr='#ff0075cf', GradientType=0);
}
.selectize-control.single .selectize-input {
-webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.05), inset 0 1px 0 rgba(255,255,255,0.8);
box-shadow: 0 1px 0 rgba(0,0,0,0.05), inset 0 1px 0 rgba(255,255,255,0.8);
background-color: #f9f9f9;
background-image: -moz-linear-gradient(top, #fefefe, #f2f2f2);
background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fefefe), to(#f2f2f2));
background-image: -webkit-linear-gradient(top, #fefefe, #f2f2f2);
background-image: -o-linear-gradient(top, #fefefe, #f2f2f2);
background-image: linear-gradient(to bottom, #fefefe, #f2f2f2);
background-repeat: repeat-x;
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffefefe', endColorstr='#fff2f2f2', GradientType=0);
}
/* .selectize-control.single .selectize-input,
.selectize-dropdown.single {
border-color: #b8b8b8;
} */
.selectize-dropdown .optgroup-header {
padding-top: 7px;
font-weight: bold;
font-size: 0.85em;
}
.selectize-dropdown .optgroup {
border-top: 1px solid #f0f0f0;
}
.selectize-dropdown .optgroup:first-child {
border-top: 0 none;
}

41
examples/sw.js Normal file
View File

@@ -0,0 +1,41 @@
const staticCacheName = 'image-sequencer-static-v3.5.1';
self.addEventListener('install', event => {
console.log('Attempting to install service worker');
});
self.addEventListener('activate', function(e) {
console.log('[ServiceWorker] Activate');
e.waitUntil(
caches.keys().then(function(cacheNames) {
return Promise.all(
cacheNames.filter(function(cacheName){
return cacheName.startsWith('image-sequencer-') &&
cacheName != staticCacheName;
}).map(function(cacheName){
return caches.delete(cacheName);
})
);
})
);
});
self.addEventListener('fetch', function(event) {
event.respondWith(
caches.open(staticCacheName).then(function(cache) {
return cache.match(event.request).then(function (response) {
return response || fetch(event.request).then(function(response) {
if(event.request.method == 'GET')
cache.put(event.request, response.clone());
return response;
});
});
})
);
});
// When the update modal sends a 'skipWaiting' message, call the skipWaiting method.
self.addEventListener('message', function(event) {
if(event.data.action === 'skipWaiting') {
self.skipWaiting();
}
});

BIN
icons/ic_144.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

BIN
icons/ic_192.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
icons/ic_512.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
icons/ic_96.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

142
index.js
View File

@@ -1,10 +1,14 @@
#!/usr/bin/env node
require('./src/ImageSequencer');
sequencer = ImageSequencer({ui: false});
sequencer = ImageSequencer({ ui: true });
var fs = require('fs');
var program = require('commander');
var readlineSync = require('readline-sync');
var utils = require('./src/CliUtils');
var saveSequence = require('./src/cli/saveSequence.js');
var installModule = require('./src/cli/installModule.js');
var sequencerSteps = require('./src/cli/sequencerSteps.js');
function exit(message) {
console.error(message);
@@ -16,96 +20,70 @@ program
.option('-i, --image [PATH/URL]', 'Input image URL')
.option('-s, --step [step-name]', 'Name of the step to be added.')
.option('-o, --output [PATH]', 'Directory where output will be stored.')
.option('-op, --opions {object}', 'Options for the step')
.option('-b, --basic', 'Basic mode outputs only final image')
.option('-c, --config [Object]', 'Options for the step')
.option('--save-sequence [string]', 'Name space separated with Stringified sequence')
.option('--install-module [string]', 'Module name space seaprated npm package name')
.parse(process.argv);
// Parse step into an array to allow for multiple steps.
program.step = program.step.split(" ");
if (program.saveSequence) saveSequence(program, sequencer);
// User must input an image.
if(!program.image) exit("Can't read file.")
else if (program.installModule) installModule(program, sequencer);
// User must input an image.
require('fs').access(program.image, function(err){
if(err) exit("Can't read file.")
});
else {
// Parse step into an array to allow for multiple steps.
if (!program.step) exit('No steps passed');
program.step = program.step.split(' ');
// User must input a step. If steps exist, check that every step is a valid step.
if(!program.step || !validateSteps(program.step))
exit("Please ensure all steps are valid.");
// User must input an image.
if (!program.image) exit('Can\'t read file.');
// If there's no user defined output directory, select a default directory.
program.output = program.output || "./output/";
// Set sequencer to log module outputs, if any.
sequencer.setUI({
onComplete: function(step) {
// Get information of outputs.
step.info = sequencer.modulesInfo(step.name);
for (var output in step.info.outputs) {
console.log("["+program.step+"]: "+output+" = "+step[output]);
}
}
});
// Finally, if everything is alright, load the image, add the steps and run the sequencer.
sequencer.loadImages(program.image,function(){
// Iterate through the steps and retrieve their inputs.
program.step.forEach(function(step){
var options = Object.assign({}, sequencer.modulesInfo(step).inputs);
// If inputs exists, print to console.
if (Object.keys(options).length) {
console.log("[" + step + "]: Inputs");
}
// If inputs exists, print them out with descriptions.
Object.keys(options).forEach(function(input) {
// The array below creates a variable number of spaces. This is done with (length + 1).
// The extra 4 that makes it (length + 5) is to account for the []: characters
console.log(new Array(step.length + 5).join(' ') + input + ": " + options[input].desc);
});
// If inputs exist, iterate through them and prompt for values.
Object.keys(options).forEach(function(input) {
var value = readlineSync.question("[" + step + "]: Enter a value for " + input + " (" + options[input].type + ", default: " + options[input].default + "): ");
options[input] = value;
});
// Add the step and its inputs to the sequencer.
sequencer.addSteps(step, options);
// User must input an image.
fs.access(program.image, function(err) {
if (err) exit('Can\'t read file.');
});
// Run the sequencer.
sequencer.run(function(){
// User must input a step. If steps exist, check that every step is a valid step.
if (!program.step || !(utils.validateSteps(program.step, sequencer)))
exit('Please ensure all steps are valid.');
// Export all images as binary files.
sequencer.exportBin(program.output);
// If there's no user defined output directory, select a default directory.
program.output = program.output || './output/';
console.log("Files will be exported to \""+program.output+"\"");
// Set sequencer to log module outputs, if any.
sequencer.setUI({
onComplete: function(step) {
// Get information of outputs.
step.info = sequencer.modulesInfo(step.name);
});
});
// Takes an array of steps and checks if they are valid steps for the sequencer.
function validateSteps(steps) {
// Assume all are valid in the beginning.
var valid = true;
steps.forEach(function(step) {
// If any step in the array is not valid (not a property of modulesInfo), set valid to false.
if (!sequencer.modulesInfo().hasOwnProperty(step)) {
valid = false;
for (var output in step.info.outputs) {
console.log('[' + program.step + ']: ' + output + ' = ' + step[output]);
}
},
notify: function(msg) {
console.log('\x1b[36m%s\x1b[0m', '🌟 ' + msg);
}
});
// Return valid. (If all of the steps are valid properties, valid will have remained true).
return valid;
}
// Finally, if everything is alright, load the image, add the steps and run the sequencer.
sequencer.loadImages(program.image, function() {
console.warn(
'\x1b[33m%s\x1b[0m',
'Please wait \n output directory generated will be empty until the execution is complete'
);
//Generate the Output Directory
var outputFilename = program.output.split('/').slice(-1)[0];
if (outputFilename.includes('.')) {
// user did give an output filename we have to remove it from dir
program.output = program.output.split('/').slice(0, -1).join('/');
}
else {
outputFilename = null;
}
sequencerSteps(program, sequencer, outputFilename);
});
}

11
jest-puppeteer.config.js Normal file
View File

@@ -0,0 +1,11 @@
module.exports = {
launch: {
headless: process.env.HEADLESS !== 'false',
},
server: {
command: 'grunt serve',
port:3000,
launchTimeout: 5000000,
},
};

6
jest.config.js Normal file
View File

@@ -0,0 +1,6 @@
module.exports = {
preset: 'jest-puppeteer',
testRegex: './*\\.test\\.js$',
verbose: true,
};

18646
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,10 +1,25 @@
{
"name": "image-sequencer",
"version": "0.1.1",
"version": "3.5.1",
"description": "A modular JavaScript image manipulation library modeled on a storyboard.",
"main": "src/ImageSequencer.js",
"scripts": {
"test": "tape test/*.js | tap-spec; browserify test/image-sequencer.js test/chain.js | tape-run --render=\"tap-spec\""
"debug": "TEST=true node ./index.js -i ./examples/images/monarch.png -s invert",
"test": "TEST=true istanbul cover tape test/core/*.js test/core/ui/user-interface.js test/core/modules/*.js | tap-spec;",
"benchmark": "node test/core/sequencer/benchmark.js | tap-spec;",
"gif-test": "node test/core/gifs/gif-test.js | tap-spec;",
"core-tests": "cat ./output/core-tests.js | tape-run --render=\"tap-spec\"",
"test-all": "npm run test && npm run benchmark && npm run gif-test && grunt tests && npm run core-tests",
"test-ui": "node node_modules/jasmine/bin/jasmine test/ui/spec/*.js",
"test-ui-2": "node ./node_modules/.bin/jest",
"setup": "npm i && npm i -g grunt grunt-cli && npm rebuild --build-from-source && grunt build",
"start": "grunt serve"
},
"lint-staged": {
"*.js": [
"./node_modules/.bin/eslint --fix",
"git add"
]
},
"repository": {
"type": "git",
@@ -20,36 +35,87 @@
"url": "https://github.com/publiclab/image-sequencer/issues"
},
"dependencies": {
"bootstrap": "~3.2.0",
"buffer": "~5.0.2",
"commander": "^2.11.0",
"data-uri-to-buffer": "^2.0.0",
"atob": "^2.1.2",
"base64-img": "^1.0.4",
"bootstrap": "^3.4.1",
"bootstrap-colorpicker": "^2.5.3",
"buffer": "~5.6.0",
"commander": "^4.0.1",
"compressorjs": "^1.0.5",
"data-uri-to-buffer": "^3.0.0",
"downloadjs": "^1.4.7",
"eslint": "^6.1.0",
"fisheyegl": "^0.1.2",
"font-awesome": "~4.7.0",
"geotiff": "^1.0.0-beta.6",
"get-pixels": "~3.3.0",
"font-awesome": "~4.5.0",
"jquery": "~2",
"jsqr": "^0.2.2",
"gifshot": "^0.4.5",
"glfx": "0.0.4",
"gpu.js": "^2.3.1",
"image-sequencer-invert": "^1.0.0",
"imagejs": "0.0.9",
"imagemin": "^7.0.1",
"imagemin-jpegtran": "^7.0.0",
"imagemin-pngquant": "^9.0.1",
"imgareaselect": "git://github.com/jywarren/imgareaselect.git#v1.0.0-rc.2",
"istanbul": "^0.4.5",
"jasmine": "^3.4.0",
"jpegtran-bin": "^5.0.2",
"jquery": "^3.3.1",
"jsdom": "^16.3.0",
"jspdf": "^1.5.3",
"jsqr": "^1.1.1",
"lodash": "^4.17.11",
"ndarray": "^1.0.18",
"opencv.js": "^1.2.1",
"ora": "^4.0.3",
"pace": "0.0.4",
"pngquant-bin": "^5.0.2",
"puppeteer": "^1.14.0",
"qrcode": "^1.3.3",
"readline-sync": "^1.4.7",
"save-pixels": "~2.3.4",
"urify": "^2.1.0"
"selectize": "^0.12.6",
"spawn-sync": "^2.0.0",
"urify": "^2.1.1",
"webgl-distort": "0.0.2"
},
"devDependencies": {
"browserify": "13.0.0",
"data-uri-to-buffer": "^2.0.0",
"grunt": "^0.4.5",
"@babel/core": "^7.4.3",
"@babel/plugin-proposal-object-rest-spread": "^7.4.3",
"@babel/plugin-syntax-object-rest-spread": "^7.2.0",
"babelify": "^10.0.0",
"browserify": "16.5.0",
"eslint": "^6.1.0",
"grunt": "^1.0.3",
"grunt-browser-sync": "^2.2.0",
"grunt-browserify": "^5.0.0",
"grunt-contrib-concat": "^0.5.0",
"grunt-contrib-uglify": "git://github.com/gruntjs/grunt-contrib-uglify.git#harmony",
"grunt-contrib-watch": "^0.6.1",
"image-filter-core": "~1.0.0",
"image-filter-threshold": "~1.0.0",
"looks-same": "^3.2.1",
"matchdep": "^0.3.0",
"tap-spec": "^4.1.1",
"tape": ">=4.7.0",
"tape-run": "^3.0.0"
"grunt-contrib-concat": "^1.0.1",
"grunt-contrib-uglify-es": "^3.3.0",
"grunt-contrib-watch": "^1.1.0",
"grunt-text-replace": "^0.4.0",
"husky": "^3.0.5",
"image-filter-core": "~2.0.2",
"image-filter-threshold": "~2.0.1",
"jasmine-core": "^3.3.0",
"jasmine-jquery": "^2.1.1",
"jasmine-spec-reporter": "^4.2.1",
"jest": "^26.1.0",
"jest-puppeteer": "^4.3.0",
"lint-staged": "^10.0.3",
"looks-same": "^7.0.0",
"matchdep": "^2.0.0",
"tap-spec": "^5.0.0",
"tape": "^4.9.2",
"tape-run": "^8.0.0",
"uglify-es": "^3.3.7"
},
"homepage": "https://github.com/publiclab/image-sequencer",
"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
},
"homepage": "https://sequencer.publiclab.org",
"bin": {
"sequencer": "./index.js"
}

View File

@@ -1,29 +1,5 @@
function AddStep(ref, image, name, o) {
function addStep(image, name, o_) {
var o = ref.copy(o_);
o.number = ref.options.sequencerCounter++; //Gives a Unique ID to each step
o.name = o_.name || name;
o.selector = o_.selector || 'ismod-' + name;
o.container = o_.container || ref.options.selector;
o.image = image;
o.inBrowser = ref.options.inBrowser;
o.step = {
name: o.name,
ID: o.number,
imageName: o.image,
inBrowser: ref.options.inBrowser,
ui: ref.options.ui,
options: o
};
var UI = ref.events;
var module = ref.modules[name][0](o,UI);
ref.images[image].steps.push(module);
return true;
}
addStep(image, name, o);
// add steps to the sequencer
function AddStep(_sequencer, name, o) {
return require('./InsertStep')(_sequencer, -1, name, o);
}
module.exports = AddStep;

58
src/CliUtils.js Normal file
View File

@@ -0,0 +1,58 @@
var fs = require('fs');
/*
* This function checks if the directory exists, if not it creates one on the given path
* Callback is called with argument error if an error is encountered
*/
function makedir(path, callback){
fs.access(path, function(err){
if(err) fs.mkdir(path, function(err){
if(err) callback(err);
callback();
});
else callback();
});
}
// Takes an array of steps and checks if they are valid steps for the sequencer.
function validateSteps(steps, sequencer) {
// Assume all are valid in the beginning.
var valid = true;
steps.forEach(function(step) {
// If any step in the array is not valid (not a property of modulesInfo), set valid to false.
if (!sequencer.modulesInfo().hasOwnProperty(step)) {
valid = false;
}
});
// Return valid. (If all of the steps are valid properties, valid will have remained true).
return valid;
}
//Takes config and options object and checks if all the keys exist in config
function validateConfig(config_, options_) {
options_ = Object.keys(options_);
if (
(function() {
for (var input in options_) {
if (!config_[options_[input]]) {
console.error(
'\x1b[31m%s\x1b[0m',
`Options Object does not have the required details "${
options_[input]
}" not specified. Fallback case activated`
);
return false;
}
}
})() == false
)
return false;
else return true;
}
module.exports = exports = {
makedir: makedir,
validateSteps: validateSteps,
validateConfig: validateConfig
};

111
src/ExportBin.js Normal file → Executable file
View File

@@ -1,54 +1,69 @@
var fs = require('fs');
var getDirectories = function(rootDir, cb) {
fs.readdir(rootDir, function(err, files) {
var dirs = [];
if(typeof(files)=="undefined") {
cb(dirs);
return [];
}
for (var index = 0; index < files.length; ++index) {
var file = files[index];
if (file[0] !== '.') {
var filePath = rootDir + '/' + file;
fs.stat(filePath, function(err, stat) {
if (stat.isDirectory()) {
dirs.push(this.file);
}
if (files.length === (this.index + 1)) {
return cb(dirs);
}
}.bind({index: index, file: file}));
}
}
});
}
module.exports = function ExportBin(dir = "./output/",ref) {
dir = (dir[dir.length-1]=="/") ? dir : dir + "/";
if(ref.options.inBrowser) return false;
fs.access(dir, function(err){
if(err) fs.mkdir(dir, function() {});
});
getDirectories(dir,function(dirs){
var num = 1;
for(var d in dirs){
if(dirs[d].match(/^sequencer(.*)$/)==null) continue;
var n = parseInt(dirs[d].match(/^sequencer(.*)$/)[1]);
num = (n>=num)?(n+1):num;
var dirs = [];
if (typeof (files) == 'undefined' || files.length == 0) {
cb(dirs);
return [];
}
fs.mkdir(dir+'sequencer'+num,function(){
var root = dir+'sequencer'+num+'/';
for(var image in ref.images) {
var steps = ref.images[image].steps;
for(var i in steps) {
var datauri = steps[i].output.src;
var ext = steps[i].output.format;
var buffer = require('data-uri-to-buffer')(datauri);
fs.writeFile(root+image+"_"+i+"."+ext,buffer,function(){
});
}
for (var index = 0; index < files.length; ++index) {
var file = files[index];
if (file[0] !== '.') {
var filePath = rootDir + '/' + file;
fs.stat(filePath, function(err, stat) {
if (stat.isDirectory()) {
dirs.push(this.file);
}
if (files.length === (this.index + 1)) {
return cb(dirs);
}
}.bind({ index: index, file: file }));
}
})
}
});
}
};
module.exports = function ExportBin(dir = './output/', ref, basic, filename) {
// If user did not give an output filename so we can continue without doing anything
dir = (dir[dir.length - 1] == '/') ? dir : dir + '/';
if (ref.options.inBrowser) return false;
fs.access(dir, function(err) {
if (err) console.error(err);
});
if (filename && basic) {
var steps = ref.steps;
var datauri = steps.slice(-1)[0].output.src;
var ext = steps.slice(-1)[0].output.format;
var buffer = require('data-uri-to-buffer')(datauri);
fs.writeFile(dir + filename, buffer, function() { });
}
else {
getDirectories(dir, function(dirs) {
var num = 1;
for (var d in dirs) {
if (dirs[d].match(/^sequencer(.*)$/) == null) continue;
var n = parseInt(dirs[d].match(/^sequencer(.*)$/)[1]);
num = (n >= num) ? (n + 1) : num;
}
fs.mkdir(dir + 'sequencer' + num, function() {
var root = dir + 'sequencer' + num + '/';
var steps = ref.steps;
if (basic) {
var datauri = steps.slice(-1)[0].output.src;
var ext = steps.slice(-1)[0].output.format;
var buffer = require('data-uri-to-buffer')(datauri);
fs.writeFile(root + 'image' + '_' + (steps.length - 1) + '.' + ext, buffer, function() { });
}
else {
for (var i in steps) {
var datauri = steps[i].output.src;
var ext = steps[i].output.format;
var buffer = require('data-uri-to-buffer')(datauri);
fs.writeFile(root + 'image' + '_' + i + '.' + ext, buffer, function() { });
}
}
});
});
}
};

View File

@@ -1,19 +1,19 @@
function objTypeOf(object){
return Object.prototype.toString.call(object).split(" ")[1].slice(0,-1)
return Object.prototype.toString.call(object).split(' ')[1].slice(0, -1);
}
function getPrimitive(object){
return (objTypeOf(object)=='Array')?object[0]:object;
return (objTypeOf(object) == 'Array') ? object[0] : object;
}
function makeArray(input) {
return (objTypeOf(input)=="Array")?input:[input];
return (objTypeOf(input) == 'Array') ? input : [input];
}
function copy(a) {
if (!typeof(a) == "object") return a;
if (objTypeOf(a) == "Array") return a.slice();
if (objTypeOf(a) == "Object") {
if (!typeof(a) == 'object') return a;
if (objTypeOf(a) == 'Array') return a.slice();
if (objTypeOf(a) == 'Object') {
var b = {};
for (var v in a) {
b[v] = copy(a[v]);
@@ -23,141 +23,84 @@ function copy(a) {
return a;
}
function formatInput(args,format,images) {
images = [];
for (var image in this.images) {
images.push(image);
}
function formatInput(args, format, images) {
var json_q = {};
var format_i = format;
if (format == "+")
format = ['o_string_a', 'string_a', 'o_object'];
else if (format == "-")
format = ['o_string_a', 'number_a'];
else if (format == "^")
format = ['o_string_a', 'number', 'string', 'o_object'];
else if (format == "r")
format = ['o_string_a', 'o_number'];
else if (format == "l")
format = ['o_string','string','o_function'];
if (format == '+')
format = ['string_a', 'o_object'];
else if (format == '-')
format = ['number_a'];
else if (format == '^')
format = ['number', 'string', 'o_object'];
else if (format == 'r')
format = ['o_number'];
else if (format == 'l')
format = ['string', 'o_function'];
/*
formats:
addSteps :: o_image_a, name_a, o_o
o_string_a, string_a, o_object => { image: [{name,o}] }
removeSteps :: o_image_a, index_a
o_string_a, number_a => { image: [index] }
insertSteps :: o_image_a, index, name, o_o
o_string_a, number, string, o_object => { image: [{index,name,o}] }
run :: o_image_a, o_from
o_string_a, o_number => { image: index }
loadImages :: image, src, o_function
string, string, o_function => { images: [{image:src}], callback }
optionals:
image: o_string_a
options: o_object
from: o_number
callback: o_function
*/
if(format[format.length-1] == "o_object") {
if(objTypeOf(args[args.length-1]) != "Object")
if(format[format.length - 1] == 'o_object') {
if(objTypeOf(args[args.length - 1]) != 'Object')
args.push({});
}
else if (format[format.length-1] == "o_number") {
if(typeof(args[args.length-1]) != "number" && objTypeOf(args[0])!="Object")
else if (format[format.length - 1] == 'o_number') {
if(typeof(args[args.length - 1]) != 'number' && objTypeOf(args[0]) != 'Object')
args.push(1);
}
else if (format[format.length-1] == "o_function") {
if(objTypeOf(args[args.length-1]) != "Function" && objTypeOf(args[0])!="Object")
else if (format[format.length - 1] == 'o_function') {
if(objTypeOf(args[args.length - 1]) != 'Function' && objTypeOf(args[0]) != 'Object')
args.push(function(){});
}
if(format[0] == "o_string_a") {
if(args.length == format.length - 1) {
var insert = false;
for (var i in args) {
if (format[parseInt(i)+1].includes( typeof(getPrimitive(args[i])) )){
insert = true;
}
else {insert = false; break;}
}
if(insert)
args.splice(0,0,copy(images));
}
}
else if (format[0] == "o_string" && format_i == "l" && args.length == 2) {
if (typeof(args[0]) == "string") {
var identifier = "image";
var number = 1;
while (this.images.hasOwnProperty(identifier+number)) number++;
args.splice(0,0,identifier+number);
}
}
if(args.length == format.length) {
if(args.length == format.length) {//making of arrays
for (var i in format) {
if (format[i].substr(format[i].length-2,2)=="_a")
if (format[i].substr(format[i].length - 2, 2) == '_a')
args[i] = makeArray(args[i]);
}
}
if (args.length == 1) {
json_q = copy(args[0]);
if(!(format_i == "r" || format_i == "l")) {
for (var img in json_q)
json_q[img] = makeArray(json_q[img]);
if (args.length == 1 ) {
if(format_i == 'r') json_q = {0:copy(args[0])};
else if(format_i == '-') {
json_q = [];
json_q = copy(args[0]);
}
}
else if (format_i == "r") {
for (var img in args[0]) json_q[args[0][img]] = args[1];
else if (format_i == 'r' ) {
for (var img in args[0]) json_q = {0:args[0]};
}
else if (format_i == "l") {
else if (format_i == 'l') {
json_q = {
images: {},
callback: args[2]
}
json_q.images[args[0]] = args[1];
image: args[0],
callback: args[1]
};
}
else {
for (var img in args[0]) {
var image = args[0][img];
json_q[image] = [];
if(format_i == "+") {
for(var s in args[1]) {
json_q[image].push({
name: args[1][s],
o: args[2]
});
}
}
if(format_i == "-") {
json_q[image] = args[1];
}
if(format_i == "^") {
var size = this.images[image].steps.length;
var index = args[1];
index = (index==size)?index:index%size;
if (index<0) index += size+1;
json_q[image].push({
index: index,
name: args[2],
o: args[3]
json_q = [];
if(format_i == '+') {
for(var s in args[0]) {
json_q.push({
name: args[0][s],
o: args[1]
});
}
}
if(format_i == '^') {
var size = this.steps.length;
var index = args[0];
index = (index == size) ? index : index % size;
if (index < 0) index += size + 1;
json_q.push({
index: index,
name: args[1],
o: args[2]
});
}
}
if(format_i == "l") {
json_q.loadedimages = [];
for (var i in json_q.images) json_q.loadedimages.push(i);
}
return json_q;
}

View File

@@ -1,28 +1,47 @@
if (typeof window !== 'undefined') {window.$ = window.jQuery = require('jquery'); isBrowser = true}
else {var isBrowser = false}
if (typeof window !== 'undefined') { isBrowser = true; }
else { var isBrowser = false; }
require('./util/getStep.js');
/**
* @method ImageSequencer
* @param {Object|Float32Array} options Optional options
* @returns {Object}
*/
ImageSequencer = function ImageSequencer(options) {
options = options || {};
options.inBrowser = options.inBrowser || isBrowser;
// if (options.inBrowser) options.ui = options.ui || require('./UserInterface');
options.sequencerCounter = 0;
var str = require('./Strings.js')(this.steps, modulesInfo, addSteps, copy);
function objTypeOf(object){
return Object.prototype.toString.call(object).split(" ")[1].slice(0,-1)
var sequencer = (this.name == 'ImageSequencer') ? this : this.sequencer;
options = options || {};
options.inBrowser = options.inBrowser === undefined ? isBrowser : options.inBrowser;
options.sequencerCounter = 0;
function objTypeOf(object) {
return Object.prototype.toString.call(object).split(' ')[1].slice(0, -1);
}
function log(color,msg) {
if(options.ui!="none") {
if(arguments.length==1) console.log(arguments[0]);
else if(arguments.length==2) console.log(color,msg);
/**
* @method log
* @description Logs colored messages to the console using ASCII color codes
* @param {String} color ASCII color code
* @param {String} msg Message to be logged to the console
*/
function log(color, msg) {
if (options.ui != 'none') {
if (arguments.length == 1) console.log(arguments[0]);
else if (arguments.length == 2) console.log(color, msg);
}
}
/**
* @method copy
* @description Returns a clone of the input object.
* @param {Object|Float32Array} a The Object/Array to be cloned
* @returns {Object|Float32Array}
*/
function copy(a) {
if (!typeof(a) == "object") return a;
if (objTypeOf(a) == "Array") return a.slice();
if (objTypeOf(a) == "Object") {
if (!typeof (a) == 'object') return a;
if (objTypeOf(a) == 'Array') return a.slice();
if (objTypeOf(a) == 'Object') {
var b = {};
for (var v in a) {
b[v] = copy(a[v]);
@@ -33,174 +52,342 @@ ImageSequencer = function ImageSequencer(options) {
}
function makeArray(input) {
return (objTypeOf(input)=="Array")?input:[input];
return (objTypeOf(input) == 'Array') ? input : [input];
}
var image,
steps = [],
modules = require('./Modules'),
formatInput = require('./FormatInput'),
images = {},
inputlog = [],
events = require('./UserInterface')(),
fs = require('fs');
steps = [],
modules = require('./Modules'),
sequences = require('./SavedSequences.json'),
formatInput = require('./FormatInput'),
inputlog = [],
events = require('./ui/UserInterface')(),
fs = require('fs');
if (options.inBrowser) {
for (o in sequencer) {
modules[o] = sequencer[o];
}
sequences = JSON.parse(window.localStorage.getItem('sequences')); // Get saved sequences from localStorage
if (!sequences) {
sequences = {};
window.localStorage.setItem('sequences', JSON.stringify(sequences)); // Set the localStorage entry as an empty Object by default
}
}
// if in browser, prompt for an image
// if (options.imageSelect || options.inBrowser) addStep('image-select');
// else if (options.imageUrl) loadImage(imageUrl);
function addSteps(){
var this_ = (this.name == "ImageSequencer")?this:this.sequencer;
var args = (this.name == "ImageSequencer")?[]:[this.images];
/**
* @method addSteps
* @description Adds one of more steps to the sequence.
* @return {Object}
*/
function addSteps() {
var this_ = (this.name == 'ImageSequencer') ? this : this.sequencer;
var args = [];
var json_q = {};
for(var arg in arguments){args.push(copy(arguments[arg]));}
json_q = formatInput.call(this_,args,"+");
inputlog.push({method:"addSteps", json_q:copy(json_q)});
for (var i in json_q)
for (var j in json_q[i])
require("./AddStep")(this_,i,json_q[i][j].name,json_q[i][j].o);
for (var arg in arguments) { args.push(copy(arguments[arg])); } // Get all the module names from the arguments
json_q = formatInput.call(this_, args, '+');
inputlog.push({ method: 'addSteps', json_q: copy(json_q) });
for (var j in json_q)
require('./AddStep')(this_, json_q[j].name, json_q[j].o);
return this;
}
function removeStep(image,index) {
//remove the step from images[image].steps and redraw remaining images
if(index>0) {
thisStep = images[image].steps[index];
/**
* @method removeStep
* @description Removes the step at the specified index from the sequence.
* @param {Object} ref ImageSequencer instance
* @param {Number} index Index of the step to be removed
* @returns {Null}
*/
function removeStep(ref, index) {
// Remove the step from images[image].steps and redraw remaining images
if (index > 0) {
// var this_ = (this.name == "ImageSequencer") ? this : this.sequencer;
thisStep = ref.steps[index];
thisStep.UI.onRemove(thisStep.options.step);
images[image].steps.splice(index,1);
ref.steps.splice(index, 1);
}
//tell the UI a step has been removed
}
function removeSteps(image,index) {
var run = {}, indices;
var this_ = (this.name == "ImageSequencer")?this:this.sequencer;
var args = (this.name == "ImageSequencer")?[]:[this.images];
for(var arg in arguments) args.push(copy(arguments[arg]));
var json_q = formatInput.call(this_,args,"-");
inputlog.push({method:"removeSteps", json_q:copy(json_q)});
for (var img in json_q) {
indices = json_q[img].sort(function(a,b){return b-a});
run[img] = indices[indices.length-1];
for (var i in indices)
removeStep(img,indices[i]);
}
// this.run(run); // This is creating problems
return this;
}
function insertSteps(image, index, name, o) {
var run = {};
var this_ = (this.name == "ImageSequencer")?this:this.sequencer;
var args = (this.name == "ImageSequencer")?[]:[this.images];
for (var arg in arguments) args.push(arguments[arg]);
var json_q = formatInput.call(this_,args,"^");
inputlog.push({method:"insertSteps", json_q:copy(json_q)});
for (var img in json_q) {
var details = json_q[img];
details = details.sort(function(a,b){return b.index-a.index});
for (var i in details)
require("./InsertStep")(this_,img,details[i].index,details[i].name,details[i].o);
run[img] = details[details.length-1].index;
}
// this.run(run); // This is Creating issues
return this;
}
function run(t_image,t_from) {
var this_ = (this.name == "ImageSequencer")?this:this.sequencer;
var args = (this.name == "ImageSequencer")?[]:[this.images];
/**
* @method removeSteps
* @description Removes one or more steps from the sequence
* @returns {Object}
*/
function removeSteps() {
var indices;
var this_ = (this.name == 'ImageSequencer') ? this : this.sequencer;
var args = [];
for (var arg in arguments) args.push(copy(arguments[arg]));
var callback = function() {};
var json_q = formatInput.call(this_, args, '-');
inputlog.push({ method: 'removeSteps', json_q: copy(json_q) });
indices = json_q.sort(function(a, b) { return b - a; });
for (var i in indices)
removeStep(this_, indices[i]);
return this;
}
/**
* @method insertSteps
* @description Inserts steps at the specified index
* @returns {Object}
*/
function insertSteps() {
var this_ = (this.name == 'ImageSequencer') ? this : this.sequencer;
var args = [];
for (var arg in arguments) args.push(arguments[arg]);
var json_q = formatInput.call(this_, args, '^');
inputlog.push({ method: 'insertSteps', json_q: copy(json_q) });
var details = json_q;
details = details.sort(function(a, b) { return b.index - a.index; });
for (var i in details)
require('./InsertStep')(this_, details[i].index, details[i].name, details[i].o);
return this;
}
/**
* @method run
* @param {Object} config Object which contains the runtime configuration like progress bar information and index from which the sequencer should run.
* @returns {Boolean}
*/
function run(config) {
var progressObj, index = 0;
config = config || { mode: 'no-arg' };
if (config.index) index = config.index;
if (config.mode != 'no-arg' && typeof config != 'function') {
if (config.progressObj) progressObj = config.progressObj;
delete arguments['0'];
}
var this_ = (this.name == 'ImageSequencer') ? this : this.sequencer;
var args = [];
for (var arg in arguments) args.push(copy(arguments[arg]));
var callback = function() { };
for (var arg in args)
if(objTypeOf(args[arg]) == "Function")
callback = args.splice(arg,1)[0];
if (objTypeOf(args[arg]) == 'Function')
callback = args.splice(arg, 1)[0]; // Callback is formed
var json_q = formatInput.call(this_,args,"r");
var json_q = formatInput.call(this_, args, 'r');
require('./Run')(this_, json_q, callback);
require('./Run')(this_, json_q, callback, index, progressObj);
return true;
}
/**
* @method loadImages
* @description Loads an image via dataURL or normal URL. Read the docs(https://github.com/publiclab/image-sequencer/blob/main/README.md) for more info.
* @returns {Null}
*/
function loadImages() {
var args = [];
var prevSteps = this.getSteps().slice(1).map(step=>step.options.name);
var sequencer = this;
sequencer.image = arguments[0];
for (var arg in arguments) args.push(copy(arguments[arg]));
var json_q = formatInput.call(this,args,"l");
inputlog.push({method:"loadImages", json_q:copy(json_q)});
var loadedimages = this.copy(json_q.loadedimages);
// require('./LoadImage')(this,i,json_q.images[i]);
var json_q = formatInput.call(this, args, 'l');
if(this.getSteps().length != 0){
this.options.sequencerCounter = 0;
inputlog = [];
this.steps = [];
}
inputlog.push({ method: 'loadImages', json_q: copy(json_q) });
var ret = {
name: "ImageSequencer Wrapper",
name: 'ImageSequencer Wrapper',
sequencer: this,
addSteps: this.addSteps,
removeSteps: this.removeSteps,
insertSteps: this.insertSteps,
run: this.run,
UI: this.UI,
setUI: this.setUI,
images: loadedimages
setUI: this.setUI
};
function load(i) {
if(i==loadedimages.length) {
json_q.callback.call(ret);
return;
function loadPrevSteps(ref){
if(prevSteps.length != 0){
ref.addSteps(prevSteps);
prevSteps = [];
}
var img = loadedimages[i];
require('./LoadImage')(sequencer,img,json_q.images[img],function(){
load(++i);
});
}
require('./ui/LoadImage')(sequencer, 'image', json_q.image, function() {
loadPrevSteps(sequencer);
json_q.callback.call(ret);
});
load(0);
}
function replaceImage(selector,steps,options) {
/**
* @method replaceImage
* @description Replaces the current image in the sequencer
* @param {String} selector DOM selector string for the image input
* @param {*} steps Current steps Object
* @param {Object} options
* @returns {*}
*/
function replaceImage(selector, steps, options) {
options = options || {};
return require('./ReplaceImage')(this,selector,steps);
options.callback = options.callback || function() { };
return require('./ReplaceImage')(this, selector, steps, options);
}
/**
* @method getSteps
* @description Returns the current sequence of steps
* @returns {Object}
*/
function getSteps(){
return this.steps;
}
/**
* @method setUI
* @description To set up a UI for ImageSequencer via different callback methods. Read the docs(https://github.com/publiclab/image-sequencer/blob/main/README.md) for more info.
* @param {Object} UI Object containing UI callback methods. Read the docs(https://github.com/publiclab/image-sequencer/blob/main/README.md) for more info.
* @returns {Null}
*/
function setUI(UI) {
this.events = require('./UserInterface')(UI);
this.events = require('./ui/UserInterface')(UI);
}
var exportBin = function(dir) {
return require('./ExportBin')(dir,this);
}
var exportBin = function(dir, basic, filename) {
return require('./ExportBin')(dir, this, basic, filename);
};
/**
* @method modulesInfo
* @description Returns information about the given module or all the available modules
* @param {String} name Module name
* @returns {Object}
*/
function modulesInfo(name) {
var modulesdata = {}
if(name == "load-image") return {};
if(arguments.length==0)
for (var modulename in modules) {
var modulesdata = {};
if (name == 'load-image') return {};
if (arguments.length == 0) {
for (var modulename in this.modules) {
modulesdata[modulename] = modules[modulename][1];
}
else modulesdata = modules[name][1];
for (var sequencename in this.sequences) {
modulesdata[sequencename] = { name: sequencename, steps: this.sequences[sequencename] };
}
}
else {
if (modules[name]){
modulesdata = modules[name][1];
}
else
modulesdata = { 'inputs': sequences[name]['options'] };
}
return modulesdata;
}
/**
* @method loadNewModule
* @description Adds a new local module to sequencer. Read the docs(https://github.com/publiclab/image-sequencer/blob/main/README.md) for mode info.
* @param {String} name Name of the new module
* @param {Object} options An Object containing path and info about the new module.
* @returns {Object}
*/
function loadNewModule(name, options) {
if (!options) {
return this;
} else if (Array.isArray(options)) {
// Contains the array of module and info
this.modules[name] = options;
} else if (options.func && options.info) {
// Passed in options object
this.modules[name] = [
options.func, options.info
];
} else if (options.path && !this.inBrowser) {
// Load from path(only in node)
const module = [
require(`${options.path}/Module.js`),
require(`${options.path}/info.json`)
];
this.modules[name] = module;
}
return this;
}
/**
* @method saveNewModule
* @description Saves a new local module to ImageSequencer
* @param {String} name Name of the new module
* @param {String} path Path to the new module
* @returns {Null}
*/
function saveNewModule(name, path) {
if (options.inBrowser) {
// Not for browser context
return;
}
var mods = fs.readFileSync('./src/Modules.js').toString();
mods = mods.substr(0, mods.length - 1) + ' \'' + name + '\': require(\'' + path + '\'),\n}';
fs.writeFileSync('./src/Modules.js', mods);
}
/**
* @method saveSequence
* @description Saves a sequence on the browser localStorage.
* @param {String} name Name for the sequence
* @param {String} sequenceString Sequence data as a string
* @returns {Null}
*/
function saveSequence(name, sequenceString) { // 4. save sequence
const sequence = str.stringToJSON(sequenceString);
// Save the given sequence string as a module
if (options.inBrowser) {
// Inside the browser we save the meta-modules using the Web Storage API
var sequences = JSON.parse(window.localStorage.getItem('sequences'));
sequences[name] = sequence;
window.localStorage.setItem('sequences', JSON.stringify(sequences));
}
else {
// In node we save the sequences in the json file SavedSequences.json
var sequences = require('./SavedSequences.json');
sequences[name] = sequence;
fs.writeFileSync('./src/SavedSequences.json', JSON.stringify(sequences));
}
}
function loadModules() {
// loadModules function loads the modules and saved sequences.
this.modules = require('./Modules');
if (options.inBrowser)
this.sequences = JSON.parse(window.localStorage.getItem('sequences'));
else
this.sequences = require('./SavedSequences.json');
}
return {
//literals and objects
name: "ImageSequencer",
// Literals and objects
name: 'ImageSequencer',
options: options,
inputlog: inputlog,
modules: modules,
images: images,
sequences: sequences,
events: events,
steps: steps,
image: image,
//user functions
// User functions
loadImages: loadImages,
loadImage: loadImages,
addSteps: addSteps,
@@ -211,12 +398,32 @@ ImageSequencer = function ImageSequencer(options) {
setUI: setUI,
exportBin: exportBin,
modulesInfo: modulesInfo,
toCliString: str.toCliString,
detectStringSyntax: str.detectStringSyntax,
parseStringSyntax: str.parseStringSyntax,
stringToSteps: str.stringToSteps,
toString: str.toString,
stepToString: str.stepToString,
toJSON: str.toJSON,
stringToJSON: str.stringToJSON,
stringToJSONstep: str.stringToJSONstep,
importString: str.importString,
importJSON: str.importJSON,
loadNewModule: loadNewModule,
saveNewModule: saveNewModule,
createMetaModule: require('./util/createMetaModule'),
saveSequence: saveSequence,
loadModules: loadModules,
getSteps:getSteps,
//other functions
// Other functions
log: log,
objTypeOf: objTypeOf,
copy: copy
}
copy: copy,
getImageDimensions: require('./util/getImageDimensions'),
}
setInputStep: require('./ui/SetInputStep')(sequencer)
};
};
module.exports = ImageSequencer;

View File

@@ -1,32 +1,67 @@
function InsertStep(ref, image, index, name, o) {
const getStepUtils = require('./util/getStep.js');
// insert one or more steps at a given index in the sequencer
function InsertStep(ref, index, name, o) {
if (ref.sequences[name]) {
return ref.importJSON(ref.sequences[name]);
}
if (ref.detectStringSyntax(name)) {
return ref.stringToSteps(name);
}
function insertStep(index, name, o_) {
if (ref.modules[name]) var moduleInfo = ref.modules[name][1];
else {
console.log('Module ' + name + ' not found.');
}
function insertStep(image, index, name, o_) {
var o = ref.copy(o_);
o.number = ref.options.sequencerCounter++; //Gives a Unique ID to each step
o.name = o_.name || name;
o.name = o_.name || name || moduleInfo.name;
o.description = o_.description || moduleInfo.description;
o.moduleInfo = o_.moduleInfo || moduleInfo;
o.selector = o_.selector || 'ismod-' + name;
o.container = o_.container || ref.options.selector;
o.image = image;
if(index==-1) index = ref.images[image].steps.length;
o.inBrowser = ref.options.inBrowser;
o.useWasm = (ref.options.useWasm === false) ? false : true;
if (index == -1) index = ref.steps.length;
o.step = {
name: o.name,
description: o.description,
url: o.url,
moduleInfo: o.moduleInfo,
ID: o.number,
imageName: o.image,
inBrowser: ref.options.inBrowser,
ui: ref.options.ui,
options: o
};
var UI = ref.events;
var module = ref.modules[name][0](o,UI);
ref.images[image].steps.splice(index,0,module);
// define the expandSteps function for sequencer
ref.modules[name].expandSteps = function expandSteps(stepsArray) {
for (var i in stepsArray) {
let step = stepsArray[i];
ref.insertSteps(index + Number.parseInt(i), step['name'], step['options']);
}
};
// Tell UI that a step has been set up.
o = o || {};
if (!ref.modules[name][1].length) {
UI.onSetup(o.step, { index: index });
ref.steps.splice(index, 0, ref.modules[name][0](o, UI));
} else {
ref.modules[name][0](o, UI);
}
return true;
}
insertStep(image, index, name, o);
insertStep(index, name, o);
ref.steps = ref.steps;
}
module.exports = InsertStep;

View File

@@ -1,105 +0,0 @@
// special module to load an image into the start of the sequence; used in the HTML UI
function LoadImage(ref, name, src, main_callback) {
function makeImage(datauri) {
var image = {
src: datauri,
format: datauri.split(':')[1].split(';')[0].split('/')[1]
}
return image;
}
function CImage(src, callback) {
var datauri;
if (!!src.match(/^data:/i)) {
datauri = src;
callback(datauri);
}
else if (!ref.options.inBrowser && !!src.match(/^https?:\/\//i)) {
require( src.match(/^(https?):\/\//i)[1] ).get(src,function(res){
var data = '';
var contentType = res.headers['content-type'];
res.setEncoding('base64');
res.on('data',function(chunk) {data += chunk;});
res.on('end',function() {
callback("data:"+contentType+";base64,"+data);
});
});
}
else if (ref.options.inBrowser) {
var ext = src.split('.').pop();
var image = document.createElement('img');
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
image.onload = function() {
canvas.width = image.naturalWidth;
canvas.height = image.naturalHeight;
context.drawImage(image,0,0);
datauri = canvas.toDataURL(ext);
callback(datauri);
}
image.src = src;
}
else {
datauri = require('urify')(src);
callback(datauri);
}
}
function loadImage(name, src) {
var step = {
name: "load-image",
description: "This initial step loads and displays the original image without any modifications.",
ID: ref.options.sequencerCounter++,
imageName: name,
inBrowser: ref.options.inBrowser,
ui: ref.options.ui
};
var image = {
src: src,
steps: [{
options: {
id: step.ID,
name: "load-image",
description: "This initial step loads and displays the original image without any modifications.",
title: "Load Image",
step: step
},
UI: ref.events,
draw: function() {
UI.onDraw(options.step);
if(arguments.length==1){
this.output = CImage(arguments[0]);
options.step.output = this.output;
UI.onComplete(options.step);
return true;
}
else if(arguments.length==2) {
this.output = CImage(arguments[0]);
options.step.output = this.output;
arguments[1]();
UI.onComplete(options.step);
return true;
}
return false;
},
}]
};
CImage(src, function(datauri) {
var output = makeImage(datauri);
ref.images[name] = image;
var loadImageStep = ref.images[name].steps[0];
loadImageStep.output = output;
loadImageStep.options.step.output = loadImageStep.output.src;
loadImageStep.UI.onSetup(loadImageStep.options.step);
loadImageStep.UI.onDraw(loadImageStep.options.step);
loadImageStep.UI.onComplete(loadImageStep.options.step);
main_callback();
return true;
});
}
return loadImage(name,src);
}
module.exports = LoadImage;

View File

@@ -1,29 +1,51 @@
/*
* Core modules and their info files
*/
* Core modules and their info files
*/
module.exports = {
'green-channel': [
require('./modules/GreenChannel/Module'),require('./modules/GreenChannel/info')
],
'ndvi-red': [
require('./modules/NdviRed/Module'),require('./modules/NdviRed/info')
],
'invert': [
require('./modules/Invert/Module'),require('./modules/Invert/info')
],
'crop': [
require('./modules/Crop/Module'),require('./modules/Crop/info')
],
'segmented-colormap': [
require('./modules/SegmentedColormap/Module'),require('./modules/SegmentedColormap/info')
],
'decode-qr': [
require('./modules/DecodeQr/Module'),require('./modules/DecodeQr/info')
],
'fisheye-gl': [
require('./modules/FisheyeGl/Module'),require('./modules/FisheyeGl/info')
],
'dynamic': [
require('./modules/Dynamic/Module'),require('./modules/Dynamic/info')
]
}
'add-qr': require('./modules/AddQR'),
'average': require('./modules/Average'),
'blend': require('./modules/Blend'),
'blob-analysis': require('./modules/BlobAnalysis'),
'blur': require('./modules/Blur'),
'brightness': require('./modules/Brightness'),
'canvas-resize': require('./modules/CanvasResize'),
'channel': require('./modules/Channel'),
'colorbar': require('./modules/Colorbar'),
'color-halftone': require('./modules/ColorHalftone'),
'color-temperature': require('./modules/ColorTemperature'),
'colormap': require('./modules/Colormap'),
'constrained-crop': require('./modules/ConstrainedCrop'),
'contrast': require('./modules/Contrast'),
'convolution': require('./modules/Convolution'),
'crop': require('./modules/Crop'),
'decode-qr': require('./modules/DecodeQr'),
'dither': require('./modules/Dither'),
'draw-rectangle': require('./modules/DrawRectangle'),
'dynamic': require('./modules/Dynamic'),
'edge-detect': require('./modules/EdgeDetect'),
'exposure': require('./modules/Exposure'),
'flip-image': require('./modules/FlipImage'),
'fisheye-gl': require('./modules/FisheyeGl'),
'histogram': require('./modules/Histogram'),
'gamma-correction': require('./modules/GammaCorrection'),
'gradient': require('./modules/Gradient'),
'grid-overlay': require('./modules/GridOverlay'),
'import-image': require('./modules/ImportImage'),
'minify-image': require('./modules/MinifyImage'),
// 'invert': require('image-sequencer-invert'),
'invert': require('./modules/Invert'),
'ndvi': require('./modules/Ndvi'),
'ndvi-colormap': require('./modules/NdviColormap'),
'noise-reduction': require('./modules/NoiseReduction'),
'overlay': require('./modules/Overlay'),
'paint-bucket': require('./modules/PaintBucket'),
'replace-color': require('./modules/ReplaceColor'),
'resize': require('./modules/Resize'),
'rotate': require('./modules/Rotate'),
'saturation': require('./modules/Saturation'),
'text-overlay': require('./modules/TextOverlay'),
'threshold': require('./modules/Threshold'),
'tint': require('./modules/Tint'),
'webgl-distort': require('./modules/WebglDistort'),
'white-balance': require('./modules/WhiteBalance')
};

View File

@@ -1,35 +1,63 @@
function ReplaceImage(ref,selector,steps,options) {
// Uses a given image as input and replaces it with the output.
// Works only in the browser.
function ReplaceImage(ref, selector, steps, options) {
if(!ref.options.inBrowser) return false; // This isn't for Node.js
var tempSequencer = ImageSequencer({ui: false});
var this_ = ref;
var input = document.querySelectorAll(selector);
if (window.hasOwnProperty('$')) var input = $(selector);
else var input = document.querySelectorAll(selector);
var images = [];
for (var i = 0; i < input.length; i++)
for (var i = 0; i < input.length; i++) {
if (input[i] instanceof HTMLImageElement) images.push(input[i]);
for (var i in images) {
var the_image = images[i];
var url = images[i].src;
var ext = url.split('.').pop();
}
function replaceImage (img, steps) {
var url = img.src;
// refactor to filetypeFromUrl()
var ext = url.split('?')[0].split('.').pop();
var xmlHTTP = new XMLHttpRequest();
xmlHTTP.open('GET', url, true);
xmlHTTP.responseType = 'arraybuffer';
xmlHTTP.onload = function(e) {
var arr = new Uint8Array(this.response);
var raw = String.fromCharCode.apply(null,arr);
// in chunks to avoid "RangeError: Maximum call stack exceeded"
// https://github.com/publiclab/image-sequencer/issues/241
// https://stackoverflow.com/a/20048852/1116657
var raw = '';
var i, j, subArray, chunk = 5000;
for (i = 0, j = arr.length; i < j; i += chunk) {
subArray = arr.subarray(i, i + chunk);
raw += String.fromCharCode.apply(null, subArray);
}
var base64 = btoa(raw);
var dataURL="data:image/"+ext+";base64," + base64;
var dataURL = 'data:image/' + ext + ';base64,' + base64;
make(dataURL);
};
if(url.substr(0,11).toLowerCase()!="data:image/") xmlHTTP.send();
if(url.substr(0, 11).toLowerCase() != 'data:image/') xmlHTTP.send();
else make(url);
function make(url) {
this_.loadImage('default',url).addSteps('default',steps).run(function(out){
the_image.src = out;
tempSequencer.loadImage(url, function(){
// this.addSteps(steps).run({stop:function(){}},function(out){
var sequence = this.addSteps(steps);
if (ref.detectStringSyntax(steps))
sequence = this.stringToSteps(steps);
sequence.run({stop:function(){}}, function(out){
img.src = out;
});
});
}
}
for (var i = 0; i < images.length; i++) {
replaceImage(images[i], steps);
if (i == images.length - 1)
options.callback();
}
}
module.exports = ReplaceImage;

View File

@@ -1,55 +1,91 @@
function Run(ref, json_q, callback) {
const getStepUtils = require('./util/getStep.js');
function Run(ref, json_q, callback, ind, progressObj) {
if (!progressObj) progressObj = { stop: function() { } };
function drawStep(drawarray, pos) {
if (pos == drawarray.length && drawarray[pos - 1] !== undefined) {
var image = drawarray[pos-1].image;
if(ref.objTypeOf(callback) == 'Function') {
var steps = ref.images[image].steps;
var out = steps[steps.length-1].output.src;
if (ref.objTypeOf(callback) == 'Function' && ref.steps.slice(-1)[0].output) {
var steps = ref.steps;
var out = steps[steps.length - 1].output.src;
callback(out);
return true;
}
}
// so we don't run on the loadImage module:
if (drawarray[pos] !== undefined) {
var image = drawarray[pos].image;
var i = drawarray[pos].i;
var input = ref.images[image].steps[i - 1].output;
ref.images[image].steps[i].draw(ref.copy(input), function onEachStep() {
drawStep(drawarray, ++pos);
});
var input = ref.steps[i - 1].output;
var step = ref.steps[i];
step.getStep = function getStep(offset) {
if (i + offset >= ref.steps.length) return { options: { name: undefined } };
else return ref.steps.slice(i + offset)[0];
};
step.getIndex = function getIndex() {
return i;
};
for (var util in getStepUtils) {
if (getStepUtils.hasOwnProperty(util)) {
step[util] = getStepUtils[util];
}
}
// Tell UI that a step is being drawn.
step.UI.onDraw(step.options.step);
// provides a set of standard tools for each step
var inputForNextStep = require('./RunToolkit')(ref.copy(input));
step.draw(
inputForNextStep,
function onEachStep() {
// This output is accessible by UI
ref.steps[i].options.step.output = ref.steps[i].output.src;
ref.steps[i].options.step.wasmSuccess = ref.steps[i].output.wasmSuccess || false;
ref.steps[i].options.step.useWasm = ref.steps[i].output.useWasm || false;
// Tell UI that step has been drawn.
ref.steps[i].UI.onComplete(ref.steps[i].options.step);
drawStep(drawarray, ++pos);
},
progressObj
);
}
}
function drawSteps(json_q) {
var drawarray = [];
for (var image in json_q) {
var no_steps = ref.images[image].steps.length;
var init = json_q[image];
for(var i = 0; i < no_steps - init; i++) {
drawarray.push({ image: image, i: init + i });
}
var drawarray = [],
no_steps = ref.steps.length,
init = json_q[0];
for (var i = 0; i < no_steps - init; i++) {
drawarray.push({i: init + i });
}
drawStep(drawarray,0);
drawStep(drawarray, ind);
}
function filter(json_q){
for (var image in json_q) {
if (json_q[image] == 0 && ref.images[image].steps.length == 1)
delete json_q[image];
else if (json_q[image] == 0) json_q[image]++;
}
for (var image in json_q) {
var prevstep = ref.images[image].steps[json_q[image] - 1];
while (typeof(prevstep) == "undefined" || typeof(prevstep.output) == "undefined") {
prevstep = ref.images[image].steps[(--json_q[image]) - 1];
}
function filter(json_q) {
if (json_q[0] == 0 && ref.steps.length == 1)
delete json_q[0];
else if (json_q[0] == 0) json_q[0]++;
var prevstep = ref.steps[json_q[0] - 1];
while (
typeof prevstep == 'undefined' ||
typeof prevstep.output == 'undefined'
) {
prevstep = ref.steps[--json_q[0] - 1];
}
return json_q;
}
var json_q = filter(json_q);
return drawSteps(json_q);
}
module.exports = Run;

14
src/RunToolkit.js Normal file
View File

@@ -0,0 +1,14 @@
const getPixels = require('get-pixels');
const pixelManipulation = require('./modules/_nomodule/PixelManipulation');
const lodash = require('lodash');
const dataUriToBuffer = require('data-uri-to-buffer');
const savePixels = require('save-pixels');
module.exports = function(input) {
input.getPixels = getPixels;
input.pixelManipulation = pixelManipulation;
input.lodash = lodash;
input.dataUriToBuffer = dataUriToBuffer;
input.savePixels = savePixels;
return input;
};

1
src/SavedSequences.json Normal file
View File

@@ -0,0 +1 @@
{"sample":[{"name":"invert","options":{}},{"name":"channel","options":{"channel":"red"}},{"name":"blur","options":{"blur":"5"}}]}

159
src/Strings.js Normal file
View File

@@ -0,0 +1,159 @@
module.exports = function(steps, modulesInfo, addSteps, copy) {
// Genates a CLI string for the current sequence
function toCliString() {
var cliStringSteps = '"', cliOptions = {};
for (var step in this.steps) {
var name = (typeof this.steps[step].options !== 'undefined') ? this.steps[step].options.name : this.steps[step].name;
if (name !== 'load-image'){
cliStringSteps += `${name} `;
}
for (var inp in modulesInfo(name).inputs) {
cliOptions[inp] = this.steps[step].options[inp];
}
}
cliStringSteps = cliStringSteps.substr(0, cliStringSteps.length - 1) + '"';
return `sequencer -i [PATH] -s ${cliStringSteps} -d '${JSON.stringify(cliOptions)}'`;
}
// Checks if input is a string of comma separated module names
function detectStringSyntax(str) {
let result = (str.includes(',') || str.includes('{')) ? true : false;
return result;
}
// Parses input string and returns array of module names
function parseStringSyntax(str) {
let stringifiedNames = str.replace(/\s/g, '');
let moduleNames = stringifiedNames.split(',');
return moduleNames;
}
// imports string of comma separated module names to sequencer steps
function stringToSteps(str) {
let sequencer = this;
let names = [];
if (this.name != 'ImageSequencer')
sequencer = this.sequencer;
if (detectStringSyntax(str))
names = stringToJSON(str);
names.forEach(function eachStep(stepObj) {
sequencer.addSteps(stepObj.name, stepObj.options);
});
}
// Strigifies the current sequence
function toString(step) {
if (step) {
return stepToString(step);
} else {
return copy(this.steps.map(stepToString).slice(1).join(','));
}
}
// Stringifies one step of the sequence
function stepToString(step) {
var arg = (step.name) ? step.name : step.options.name;
let inputs = modulesInfo(arg).inputs || {}, op = {};
for (let input in inputs) {
if (!!step.options[input] && step.options[input] != inputs[input].default) {
op[input] = step.options[input];
op[input] = encodeURIComponent(op[input]);
}
}
var configurations = Object.keys(op).map(key => key + ':' + op[key]).join('|');
return `${arg}{${configurations}}`;
}
// exports the current sequence as an array of JSON steps
function toJSON() {
return this.stringToJSON(this.toString());
}
// Coverts stringified sequence into an array of JSON steps
function stringToJSON(str) {
let steps;
if (detectStringSyntax(str))
steps = parseStringSyntax(str);
else
steps = [str];
return steps.map(stringToJSONstep);
}
// Converts one stringified step into JSON
function stringToJSONstep(str) {
var bracesStrings;
if (str.includes('{'))
if (str.includes('(') && str.indexOf('(') < str.indexOf('{'))
bracesStrings = ['(', ')'];
else
bracesStrings = ['{', '}'];
else
bracesStrings = ['(', ')'];
if (str.indexOf(bracesStrings[0]) === -1) { // if there are no settings specified
var moduleName = str.substr(0);
stepSettings = '';
} else {
var moduleName = str.substr(0, str.indexOf(bracesStrings[0]));
stepSettings = str.slice(str.indexOf(bracesStrings[0]) + 1, -1);
}
stepSettings = stepSettings.split('|').reduce(function formatSettings(accumulator, current, i) {
var settingName = current.substr(0, current.indexOf(':')),
settingValue = current.substr(current.indexOf(':') + 1);
settingValue = settingValue.replace(/^\(/, ''); // strip () at start/end
settingValue = settingValue.replace(/^\{/, '').replace(/\}$/, ''); // strip {} at start/end
settingValue = decodeURIComponent(settingValue);
current = [
settingName,
settingValue
];
if (settingName) accumulator[settingName] = settingValue;
return accumulator;
}, {});
return {
name: moduleName,
options: stepSettings
};
}
// imports a string into the sequencer steps
function importString(str) {
let sequencer = this;
if (this.name != 'ImageSequencer')
sequencer = this.sequencer;
var stepsFromString = stringToJSON(str);
stepsFromString.forEach(function eachStep(stepObj) {
sequencer.addSteps(stepObj.name, stepObj.options);
});
}
// imports a array of JSON steps into the sequencer steps
function importJSON(obj) {
let sequencer = this;
if (this.name != 'ImageSequencer')
sequencer = this.sequencer;
obj.forEach(function eachStep(stepObj) {
sequencer.addSteps(stepObj.name, stepObj.options);
});
}
return {
toCliString: toCliString,
detectStringSyntax: detectStringSyntax,
parseStringSyntax: parseStringSyntax,
stringToSteps: stringToSteps,
toString: toString,
stepToString: stepToString,
toJSON: toJSON,
stringToJSON: stringToJSON,
stringToJSONstep: stringToJSONstep,
importString: importString,
importJSON: importJSON
};
};

View File

@@ -1,66 +0,0 @@
/*
* User Interface Handling Module
*/
module.exports = function UserInterface(events = {}) {
events.onSetup = events.onSetup || function(step) {
if(step.ui == false) {
// No UI
}
else if(step.inBrowser) {
// Create and append an HTML Element
console.log("Added Step \""+step.name+"\" to \""+step.imageName+"\".");
}
else {
// Create a NodeJS Object
console.log('\x1b[36m%s\x1b[0m',"Added Step \""+step.name+"\" to \""+step.imageName+"\".");
}
}
events.onDraw = events.onDraw || function(step) {
if (step.ui == false) {
// No UI
}
else if(step.inBrowser) {
// Overlay a loading spinner
console.log("Drawing Step \""+step.name+"\" on \""+step.imageName+"\".");
}
else {
// Don't do anything
console.log('\x1b[33m%s\x1b[0m',"Drawing Step \""+step.name+"\" on \""+step.imageName+"\".");
}
}
events.onComplete = events.onComplete || function(step) {
if (step.ui == false) {
// No UI
}
else if(step.inBrowser) {
// Update the DIV Element
// Hide the laoding spinner
console.log("Drawn Step \""+step.name+"\" on \""+step.imageName+"\".");
}
else {
// Update the NodeJS Object
console.log('\x1b[32m%s\x1b[0m',"Drawn Step \""+step.name+"\" on \""+step.imageName+"\".");
}
}
events.onRemove = events.onRemove || function(step) {
if(step.ui == false){
// No UI
}
else if(step.inBrowser) {
// Remove the DIV Element
console.log("Removing Step \""+step.name+"\" of \""+step.imageName+"\".");
}
else {
// Delete the NodeJS Object
console.log('\x1b[31m%s\x1b[0m',"Removing Step \""+step.name+"\" of \""+step.imageName+"\".");
}
}
return events;
}

17
src/cli/installModule.js Normal file
View File

@@ -0,0 +1,17 @@
var childProcess = require('child_process');
var Spinner = require('ora');
module.exports = function (program, sequencer) {
console.log(
'\x1b[33m%s\x1b[0m',
'Please wait while your Module is being Installed...\nThis may take a while!'
);
var params = program.installModule.split(' ');
var spinner = Spinner('Now Installing...').start();
childProcess.execSync(`npm i ${params[1]}`);
sequencer.saveNewModule(params[0], params[1]);
sequencer.loadNewModule(params[0], require(params[1]));
spinner.stop();
console.log('\x1b[32m%s\x1b[0m', 'Your module was installed successfully!!');
};

7
src/cli/saveSequence.js Normal file
View File

@@ -0,0 +1,7 @@
module.exports = function (program, sequencer) {
var params = program.saveSequence.split(' ');
sequencer.saveSequence(params[0], params[1]);
console.log('\x1b[32m', 'Your sequence was saved successfully!!');
};

88
src/cli/sequencerSteps.js Normal file
View File

@@ -0,0 +1,88 @@
var Spinner = require('ora');
var readlineSync = require('readline-sync');
var utils = require('../CliUtils');
module.exports = function (program, sequencer, outputFilename) {
utils.makedir(program.output, () => {
console.log('Files will be exported to "' + program.output + '"');
if (program.basic)
console.log('Basic mode is enabled, outputting only final image');
// Iterate through the steps and retrieve their inputs.
program.step.forEach(function(step) {
var options = Object.assign({}, sequencer.modulesInfo(step).inputs);
// If inputs exists, print to console.
if (Object.keys(options).length) {
console.log('[' + step + ']: Inputs');
}
// If inputs exists, print them out with descriptions.
Object.keys(options).forEach(function(input) {
// The array below creates a variable number of spaces. This is done with (length + 1).
// The extra 4 that makes it (length + 5) is to account for the []: characters
console.log(
new Array(step.length + 5).join(' ') +
input +
': ' +
options[input].desc
);
});
if (program.config) {
try {
var config = JSON.parse(program.config);
console.log('The parsed options object: ', config);
} catch (e) {
console.error(
'\x1b[31m%s\x1b[0m',
'Options(Config) is not a not valid JSON Fallback activate'
);
program.config = false;
console.log(e);
}
}
if (program.config && utils.validateConfig(config, options)) {
console.log('Now using Options object');
Object.keys(options).forEach(function(input) {
options[input] = config[input];
});
} else {
// If inputs exist, iterate through them and prompt for values.
Object.keys(options).forEach(function(input) {
var value = readlineSync.question(
'[' +
step +
']: Enter a value for ' +
input +
' (' +
options[input].type +
', default: ' +
options[input].default +
'): '
);
options[input] = value;
});
}
// Add the step and its inputs to the sequencer.
sequencer.addSteps(step, options);
});
var spinnerObj = { succeed: () => { }, stop: () => { } };
if (!process.env.TEST)
spinnerObj = Spinner('Your Image is being processed..').start();
// Run the sequencer.
sequencer.run({ progressObj: spinnerObj }, function() {
// Export all images or final image as binary files.
sequencer.exportBin(program.output, program.basic, outputFilename);
//check if spinner was not overriden stop it
if (!spinnerObj.overrideFlag) {
spinnerObj.succeed();
console.log('\nDone!!');
}
});
});
};

View File

@@ -0,0 +1,64 @@
const _ = require('lodash'),
parseCornerCoordinateInputs = require('../../util/ParseInputCoordinates');
module.exports = function AddQR(options, UI) {
var defaults = require('./../../util/getDefaults.js')(require('./info.json'));
var output;
getPixels = require('get-pixels');
function draw(input, callback, progressObj) {
options.size = Number(options.size || defaults.size);
options.qrCodeString = options.qrCodeString || defaults.qrCodeString;
options.startingX = options.startingX || defaults.startingX;
options.startingY = options.startingY || defaults.startingY;
progressObj.stop(true);
progressObj.overrideFlag = true;
var step = this;
function extraManipulation(pixels, setRenderState, generateOutput) {
let iw = pixels.shape[0], // Width of Original Image
ih = pixels.shape[1]; // Height of Original Image
const oldPixels = _.cloneDeep(pixels);
setRenderState(false); // Prevent rendering of final output image until extraManipulation completes.
// Parse the inputs.
parseCornerCoordinateInputs({iw, ih},
{
startingX: { valInp: options.startingX, type: 'horizontal'},
startingY: { valInp: options.startingY, type: 'vertical' },
}, function(opt, cord){
options.startingX = Math.floor(cord.startingX.valInp);
options.startingY = Math.floor(cord.startingY.valInp);
});
require('./QR')(options, pixels, oldPixels, () => {
setRenderState(true); // Allow rendering in the callback.
generateOutput();
});
}
function output(image, datauri, mimetype, wasmSuccess) {
step.output = { src: datauri, format: mimetype, wasmSuccess, useWasm: options.useWasm };
}
return require('../_nomodule/PixelManipulation.js')(input, {
output: output,
ui: options.step.ui,
extraManipulation: extraManipulation,
format: input.format,
image: options.image,
inBrowser: options.inBrowser,
callback: callback,
useWasm:options.useWasm
});
}
return {
options: options,
draw: draw,
output: output,
UI: UI
};
};

37
src/modules/AddQR/QR.js Normal file
View File

@@ -0,0 +1,37 @@
const pixelSetter = require('../../util/pixelSetter.js'),
getPixels = require('get-pixels'),
QRCode = require('qrcode');
module.exports = exports = function (options, pixels, oldPixels, cb) {
QRCode.toDataURL(options.qrCodeString, {width: options.size, scale: 1}, function (error, url) {
getPixels(url, function (err, qrPixels) {
if (err) {
console.log('get-pixels error: ', err);
}
const width = oldPixels.shape[0],
height = oldPixels.shape[1];
const xe = Math.min(options.startingX, width - options.size), // Starting pixel coordinates
ye = Math.min(options.startingY, height - options.size);
for (let x = xe; x < Math.min(xe + options.size, width); x++) {
for (let y = ye; y < Math.min(ye + options.size, height); y++) {
pixelSetter(
x,
y,
[
qrPixels.get(x - xe, y - ye, 0),
qrPixels.get(x - xe, y - ye, 1),
qrPixels.get(x - xe, y - ye, 2),
qrPixels.get(x - xe, y - ye, 3)
],
pixels
);
}
}
if(cb) cb();
});
});
};

View File

@@ -0,0 +1,4 @@
module.exports = [
require('./Module'),
require('./info.json')
];

View File

@@ -0,0 +1,29 @@
{
"name": "add-qr",
"description": "Adds QR corresponding to the given string",
"url": "https://github.com/publiclab/image-sequencer/tree/master/MODULES.md",
"inputs": {
"size": {
"type": "integer",
"desc": "size of QR code in pixels",
"default": 200
},
"qrCodeString":{
"type": "string",
"desc": "input string to generate QR code",
"default": "https://github.com/publiclab/image-sequencer"
},
"startingX": {
"type": "string",
"desc": "X-position (measured from left) from where QR starts",
"default": "0"
},
"startingY": {
"type": "string",
"desc": "Y-position (measured from top) from where QR starts",
"default": "0"
}
},
"docs-link":"https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md#add-qr-module"
}

72
src/modules/Average/Module.js Executable file
View File

@@ -0,0 +1,72 @@
/*
* Average all pixel colors
*/
module.exports = function Average(options, UI) {
var output;
options.step.metadata = options.step.metadata || {};
function draw(input, callback, progressObj) {
progressObj.stop(true);
progressObj.overrideFlag = true;
var step = this;
// do the averaging
function extraManipulation(pixels) {
var i = 0, sum = [0, 0, 0, 0];
while (i < pixels.data.length) {
sum[0] += pixels.data[i++];
sum[1] += pixels.data[i++];
sum[2] += pixels.data[i++];
sum[3] += pixels.data[i++];
}
let divisor = pixels.data.length / 4;
sum[0] = Math.floor(sum[0] / divisor);
sum[1] = Math.floor(sum[1] / divisor);
sum[2] = Math.floor(sum[2] / divisor);
sum[3] = Math.floor(sum[3] / divisor);
i = 0;
while (i < pixels.data.length) {
pixels.data[i++] = sum[0];
pixels.data[i++] = sum[1];
pixels.data[i++] = sum[2];
pixels.data[i++] = sum[3];
}
// report back and store average in metadata:
options.step.metadata.averages = sum;
if (options.step.average === undefined) options.step.average = '';
options.step.average += 'rgba(' + sum.join(', ') + ')';
return pixels;
}
function output(image, datauri, mimetype, wasmSuccess) {
step.output = { src: datauri, format: mimetype, wasmSuccess, useWasm: options.useWasm };
}
return require('../_nomodule/PixelManipulation.js')(input, {
output: output,
ui: options.step.ui,
inBrowser: options.inBrowser,
extraManipulation: extraManipulation,
format: input.format,
image: options.image,
callback: callback,
useWasm:options.useWasm
});
}
return {
options: options,
draw: draw,
output: output,
UI: UI
};
};

View File

@@ -0,0 +1,4 @@
module.exports = [
require('./Module'),
require('./info.json')
];

13
src/modules/Average/info.json Executable file
View File

@@ -0,0 +1,13 @@
{
"name": "average",
"description": "Average all pixel color",
"inputs": {
},
"outputs": {
"average": {
"type": "string",
"desc": "The average value of all the pixels."
}
},
"docs-link":"https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md#average-module"
}

132
src/modules/Blend/Module.js Normal file
View File

@@ -0,0 +1,132 @@
module.exports = function Blend(options, UI, util) {
var defaults = require('./../../util/getDefaults.js')(require('./info.json'));
options.func = options.blend || defaults.blend;
options.offset = options.offset || defaults.offset;
options.blendMode = options.blendMode || defaults.blendMode;
var output;
// This function is called on every draw.
function draw(input, callback, progressObj) {
progressObj.stop(true);
progressObj.overrideFlag = true;
var step = this;
var getPixels = require('get-pixels');
// convert offset as string to int
if (typeof options.offset === 'string') options.offset = parseInt(options.offset);
// save first image's pixels
var priorStep = this.getStep(options.offset);
if (priorStep.output === undefined) {
this.output = input;
UI.notify('Offset Unavailable', 'offset-notification');
callback();
}
// see http://docs.gimp.org/en/gimp-concepts-layer-modes.html for other blend modes
const multiply_mode = function (i, m) {
return ~~( (i * m) / 255 );
};
const divide_mode = function (i, m) {
return ~~( (256 * i) / (m + 1) );
};
const overlay_mode = function (i, m) {
return ~~( (i / 255) * (i + ((2 * m) / 255) * (255 - i)) );
};
const screen_mode = function (i, m) {
return ~~( 255 - ((255 - m) * (255 - i)) / 255 );
};
const sof_light_mode = function (i, m) {
var Rs = screen_mode(i, m);
return ~~( ((((255 - i) * m) + Rs) * i) / 255 );
};
const color_dodge = function (i, m) {
return ~~( (256 * i) / (255 - m + 1) );
};
const burn_mode = function (i, m) {
return ~~( 255 - (256 * (255 - i)) / (m + 1));
};
const grain_extract_mode = function (i, m) {
return ~~( i - m + 128 );
};
const grain_merge_mode = function (i, m) {
return ~~( i + m - 128 );
};
getPixels(priorStep.output.src, function(err, pixels) {
options.firstImagePixels = pixels;
// Convert to runnable code.
if (typeof options.func === 'string') eval('options.func = ' + options.func);
function changePixel(r2, g2, b2, a2, x, y) {
// blend!
let p = options.firstImagePixels;
let r1 = p.get(x, y, 0),
g1 = p.get(x, y, 1),
b1 = p.get(x, y, 2),
a1 = p.get(x, y, 3);
const blends = {
'Color Dodge': () => [color_dodge(r2, r1), color_dodge(g2, g1), color_dodge(b2, b1), 255],
'Multiply': () => [multiply_mode(r2, r1), multiply_mode(g2, g1), multiply_mode(b2, b1), multiply_mode(a2, a1)],
'Divide': () => [divide_mode(r2, r1), divide_mode(g2, g1), divide_mode(b2, b1), 255],
'Overlay': () => [overlay_mode(r2, r1), overlay_mode(g2, g1), overlay_mode(b2, b1), 255],
'Screen': () => [screen_mode(r2, r1), screen_mode(g2, g1), screen_mode(b2, b1), 255],
'Soft Light': () => [sof_light_mode(r2, r1), sof_light_mode(g2, g1), sof_light_mode(b2, b1), 255],
'Color Burn': () => [burn_mode(r2, r1), burn_mode(g2, g1), burn_mode(b2, b1), 255],
'Grain Extract': () => [grain_extract_mode(r2, r1), grain_extract_mode(g2, g1), grain_extract_mode(b2, b1), 255],
'Grain Merge': () => [grain_merge_mode(r2, r1), grain_merge_mode(g2, g1), grain_merge_mode(b2, b1), 255]
};
if(options.blendMode == 'custom')
return options.func(
r2, g2, b2, a2, r1, g1, b1, a1
);
else {
return blends[options.blendMode]();
}
}
function output(image, datauri, mimetype, wasmSuccess) {
step.output = { src: datauri, format: mimetype, wasmSuccess, useWasm: options.useWasm };
}
// run PixelManipulatin on second image's pixels
return require('../_nomodule/PixelManipulation.js')(input, {
output: output,
ui: options.step.ui,
changePixel: changePixel,
format: input.format,
image: options.image,
inBrowser: options.inBrowser,
callback: callback,
useWasm:options.useWasm
});
});
}
return {
options: options,
draw: draw,
output: output,
UI: UI
};
};

View File

@@ -0,0 +1,4 @@
module.exports = [
require('./Module'),
require('./info.json')
];

34
src/modules/Blend/info.json Executable file
View File

@@ -0,0 +1,34 @@
{
"name": "blend",
"description": "Blend two chosen image steps with the given function. Defaults to using the red channel from image 1 and the green and blue and alpha channels of image 2.",
"inputs": {
"offset": {
"type": "integer",
"desc": "Choose which image to blend the current image with. Two steps back is -2, three steps back is -3 etc.",
"default": -2
},
"blendMode": {
"type": "select",
"desc": "Name of the Blend Mode to use",
"default": "custom",
"values": [
"custom",
"Multiply",
"Divide",
"Overlay",
"Screen",
"Soft Light",
"Color Burn",
"Color Dodge",
"Grain Extract",
"Grain Merge"
]
},
"blend": {
"type": "string",
"desc": "Function to use to blend the two images.",
"default": "function(r1, g1, b1, a1, r2, g2, b2, a2, x, y) { return [ r2, g2, b2, a2 ] }"
}
},
"docs-link": "https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md#blend-module"
}

View File

@@ -0,0 +1,74 @@
module.exports = function(pixels){
var canvas = document.createElement('canvas');
canvas.width = pixels.shape[0];
canvas.height = pixels.shape[1];
var ctx = canvas.getContext('2d');
ctx.putImageData(new ImageData(new Uint8ClampedArray(pixels.data), pixels.shape[0], pixels.shape[1]), 0, 0);
let imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
let src = cv.matFromImageData(imgData);
let dst = new cv.Mat();
let gray = new cv.Mat();
let opening = new cv.Mat();
let imageBg = new cv.Mat();
let imageFg = new cv.Mat();
let distTrans = new cv.Mat();
let unknown = new cv.Mat();
let markers = new cv.Mat();
// Gray and Threshold the image
cv.cvtColor(src, gray, cv.COLOR_RGBA2GRAY, 0);
cv.threshold(gray, gray, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU);
// Get background
let M = cv.Mat.ones(3, 3, cv.CV_8U);
cv.erode(gray, gray, M);
cv.dilate(gray, opening, M);
cv.dilate(opening, imageBg, M, new cv.Point(-1, -1), 3);
// Distance transform
cv.distanceTransform(opening, distTrans, cv.DIST_L2, 5);
cv.normalize(distTrans, distTrans, 1, 0, cv.NORM_INF);
// Get foreground
cv.threshold(distTrans, imageFg, 0.7 * 1, 255, cv.THRESH_BINARY);
imageFg.convertTo(imageFg, cv.CV_8U, 1, 0);
cv.subtract(imageBg, imageFg, unknown);
// Get connected components markers
cv.connectedComponents(imageFg, markers);
for (let i = 0; i < markers.rows; i++) {
for (let j = 0; j < markers.cols; j++) {
markers.intPtr(i, j)[0] = markers.ucharPtr(i, j)[0] + 1;
if (unknown.ucharPtr(i, j)[0] == 255) {
markers.intPtr(i, j)[0] = 0;
}
}
}
cv.cvtColor(src, src, cv.COLOR_RGBA2RGB, 0);
cv.watershed(src, markers);
// Grow barriers
for (let i = 0; i < markers.rows; i++) {
for (let j = 0; j < markers.cols; j++) {
if (markers.intPtr(i, j)[0] == -1) {
src.ucharPtr(i, j)[0] = 255; // Red
src.ucharPtr(i, j)[1] = 0; // Green
src.ucharPtr(i, j)[2] = 0; // Blue
}
}
}
cv.imshow(canvas, src);
src.delete(); dst.delete(); gray.delete(); opening.delete(); imageBg.delete();
imageFg.delete(); distTrans.delete(); unknown.delete(); markers.delete(); M.delete();
var myImageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
pixels.data = myImageData.data;
return pixels;
};

View File

@@ -0,0 +1,40 @@
module.exports = function BlobAnalysis(options, UI){
var output;
function draw(input, callback, progressObj) {
progressObj.stop(true);
progressObj.overrideFlag = true;
var step = this;
function extraManipulation(pixels){
pixels = require('./BlobAnalysis')(pixels);
return pixels;
}
function output(image, datauri, mimetype, wasmSuccess) {
step.output = { src: datauri, format: mimetype, wasmSuccess, useWasm: options.useWasm };
}
return require('../_nomodule/PixelManipulation.js')(input, {
output: output,
extraManipulation: extraManipulation,
format: input.format,
image: options.image,
inBrowser: options.inBrowser,
callback: callback
});
}
return {
options: options,
draw: draw,
output: output,
UI: UI
};
};

View File

@@ -0,0 +1,4 @@
module.exports = [
require('./Module'),
require('./info.json')
];

View File

@@ -0,0 +1,7 @@
{
"name": "Blob Analysis",
"description": "Blob/Region identification for microscopic images.",
"inputs": {},
"requires": ["webgl", "browser"],
"docs-link":"https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md#blob-analysis"
}

65
src/modules/Blur/Blur.js Executable file
View File

@@ -0,0 +1,65 @@
// Generates a 5x5 Gaussian kernel
function kernelGenerator(sigma = 1) {
let kernel = [],
sum = 0;
if (sigma == 0) sigma += 0.05;
const s = 2 * Math.pow(sigma, 2);
for (let y = -2; y <= 2; y++) {
kernel.push([]);
for (let x = -2; x <= 2; x++) {
let r = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2));
kernel[y + 2].push(Math.exp(-(r / s)));
sum += kernel[y + 2][x + 2];
}
}
for (let x = 0; x < 5; x++){
for (let y = 0; y < 5; y++){
kernel[y][x] = (kernel[y][x] / sum);
}
}
return kernel;
}
module.exports = exports = function(pixels, blur) {
const pixelSetter = require('../../util/pixelSetter.js');
let kernel = kernelGenerator(blur), // Generate the Gaussian kernel based on the sigma input.
pixs = { // Separates the rgb channel pixels to convolve on the GPU.
r: [],
g: [],
b: [],
};
for (let y = 0; y < pixels.shape[1]; y++){
pixs.r.push([]);
pixs.g.push([]);
pixs.b.push([]);
for (let x = 0; x < pixels.shape[0]; x++){
pixs.r[y].push(pixels.get(x, y, 0));
pixs.g[y].push(pixels.get(x, y, 1));
pixs.b[y].push(pixels.get(x, y, 2));
}
}
const convolve = require('../_nomodule/gpuUtils').convolve; // GPU convolution function.
const conPix = convolve([pixs.r, pixs.g, pixs.b], kernel); // Convolves the pixels (all channels separately) on the GPU.
for (let y = 0; y < pixels.shape[1]; y++){
for (let x = 0; x < pixels.shape[0]; x++){
var pixelvalue = [Math.max(0, Math.min(conPix[0][y][x], 255)),
Math.max(0, Math.min(conPix[1][y][x], 255)),
Math.max(0, Math.min(conPix[2][y][x], 255))];
pixelSetter(x, y, pixelvalue, pixels); // Sets the image pixels according to the blurred values.
}
}
return pixels;
};

45
src/modules/Blur/Module.js Executable file
View File

@@ -0,0 +1,45 @@
/*
* Blur an Image
*/
module.exports = function Blur(options, UI) {
var defaults = require('./../../util/getDefaults.js')(require('./info.json'));
options.blur = options.blur || defaults.blur;
options.blur = parseFloat(options.blur);
var output;
function draw(input, callback, progressObj) {
progressObj.stop(true);
progressObj.overrideFlag = true;
var step = this;
function extraManipulation(pixels) {
pixels = require('./Blur')(pixels, options.blur);
return pixels;
}
function output(image, datauri, mimetype, wasmSuccess) {
step.output = { src: datauri, format: mimetype, wasmSuccess, useWasm: options.useWasm };
}
return require('../_nomodule/PixelManipulation.js')(input, {
output: output,
ui: options.step.ui,
inBrowser: options.inBrowser,
extraManipulation: extraManipulation,
format: input.format,
image: options.image,
callback: callback,
useWasm:options.useWasm
});
}
return {
options: options,
draw: draw,
output: output,
UI: UI
};
};

View File

@@ -0,0 +1,4 @@
module.exports = [
require('./Module'),
require('./info.json')
];

15
src/modules/Blur/info.json Executable file
View File

@@ -0,0 +1,15 @@
{
"name": "blur",
"description": "Applies a Gaussian blur given by the intensity value",
"inputs": {
"blur": {
"type": "float",
"desc": "Amount of gaussian blur(Less blur gives more detail, typically 0-5)",
"default": 2,
"min": 0,
"max": 5,
"step": 0.05
}
},
"docs-link":"https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md#blur-module"
}

View File

@@ -0,0 +1,56 @@
/*
* Changes the Image Brightness
*/
module.exports = function Brightness(options, UI) {
var defaults = require('./../../util/getDefaults.js')(require('./info.json'));
var output;
function draw(input, callback, progressObj) {
options.brightness = options.brightness || defaults.brightness;
progressObj.stop(true);
progressObj.overrideFlag = true;
/*
In this case progress is handled by changepixel internally otherwise progressObj
needs to be overriden and used
For eg. progressObj = new SomeProgressModule()
*/
var step = this, val = (options.brightness) / 100.0;
function changePixel(r, g, b, a) {
r = Math.min(val * r, 255);
g = Math.min(val * g, 255);
b = Math.min(val * b, 255);
return [r, g, b, a];
}
function output(image, datauri, mimetype, wasmSuccess) {
step.output = { src: datauri, format: mimetype, wasmSuccess, useWasm: options.useWasm };
}
return require('../_nomodule/PixelManipulation.js')(input, {
output: output,
ui: options.step.ui, //don't pass this in if you don't want your module to support progress bars
changePixel: changePixel,
format: input.format,
image: options.image,
inBrowser: options.inBrowser,
callback: callback,
useWasm:options.useWasm
});
}
return {
options: options,
draw: draw,
output: output,
UI: UI
};
};

View File

@@ -0,0 +1,4 @@
module.exports = [
require('./Module'),
require('./info.json')
];

View File

@@ -0,0 +1,14 @@
{
"name": "brightness",
"description": "Change the brightness of the image by given percent value",
"inputs": {
"brightness": {
"type": "integer",
"desc": "% brightness for the new image",
"default": "175",
"min": "0",
"max": "200"
}
},
"docs-link":"https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md#brightness-module"
}

View File

@@ -0,0 +1,60 @@
/*
* Changes the Canvas Size
*/
module.exports = function canvasResize(options, UI) {
var defaults = require('./../../util/getDefaults.js')(require('./info.json'));
const pixelSetter = require('../../util/pixelSetter.js');
var output;
function draw(input, callback, progressObj) {
options.width = parseInt(options.width || defaults.width);
options.height = parseInt(options.height || defaults.height);
options.x = parseInt(options.x || defaults.x);
options.y = parseInt(options.y || defaults.y);
progressObj.stop(true);
progressObj.overrideFlag = true;
var step = this;
function extraManipulation(pixels) {
let newPixels = require('ndarray')(new Uint8Array(4 * options.width * options.height).fill(0), [options.width, options.height, 4]);
let iMax = options.width - options.x,
jMax = options.height - options.y;
for (let i = 0; i < iMax && i < pixels.shape[0]; i++) {
for (let j = 0; j < jMax && j < pixels.shape[1]; j++) {
let x = i + options.x, y = j + options.y;
pixelSetter(x, y, [pixels.get(i, j, 0), pixels.get(i, j, 1), pixels.get(i, j, 2), pixels.get(i, j, 3)], newPixels);
}
}
return newPixels;
}
function output(image, datauri, mimetype, wasmSuccess) {
step.output = { src: datauri, format: mimetype, wasmSuccess, useWasm: options.useWasm };
}
return require('../_nomodule/PixelManipulation.js')(input, {
output: output,
ui: options.step.ui,
extraManipulation: extraManipulation,
format: input.format,
image: options.image,
inBrowser: options.inBrowser,
callback: callback,
useWasm:options.useWasm
});
}
return {
options: options,
draw: draw,
output: output,
UI: UI
};
};

View File

@@ -0,0 +1,4 @@
module.exports = [
require('./Module'),
require('./info.json')
];

View File

@@ -0,0 +1,27 @@
{
"name": "canvas-resize",
"description": "This module resizes the canvas and overlays the ouput of the previous step at given location",
"inputs": {
"width": {
"type": "integer",
"desc": "Final width of the canvas",
"default": 1000
},
"height": {
"type": "integer",
"desc": "Final height of the canvas",
"default": 1000
},
"x": {
"type": "integer",
"desc": "X-cord of the top left corner of the image on the canvas",
"default": 500
},
"y": {
"type": "float",
"desc": "Y-cord of the top left corner of the image on the canvas",
"default": 500
}
},
"docs-link":"https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md#canvas-resize-module"
}

View File

@@ -0,0 +1,49 @@
/*
* Display only one color channel
*/
module.exports = function Channel(options, UI) {
var defaults = require('./../../util/getDefaults.js')(require('./info.json'));
options.channel = options.channel || defaults.channel;
var output;
function draw(input, callback, progressObj) {
progressObj.stop(true);
progressObj.overrideFlag = true;
var step = this;
function changePixel(r, g, b, a) {
if (options.channel === 'red') return [r, 0, 0, a];
if (options.channel === 'green') return [0, g, 0, a];
if (options.channel === 'blue') return [0, 0, b, a];
}
function output(image, datauri, mimetype, wasmSuccess) {
step.output = { src: datauri, format: mimetype, wasmSuccess, useWasm: options.useWasm };
}
return require('../_nomodule/PixelManipulation.js')(input, {
output: output,
ui: options.step.ui,
changePixel: changePixel,
format: input.format,
image: options.image,
inBrowser: options.inBrowser,
callback: callback,
useWasm:options.useWasm
});
}
return {
options: options,
//setup: setup, // optional
draw: draw,
output: output,
UI: UI
};
};

View File

@@ -0,0 +1,4 @@
module.exports = [
require('./Module'),
require('./info.json')
];

View File

@@ -0,0 +1,13 @@
{
"name": "channel",
"description": "Displays only one color channel of an image -- default is green",
"inputs": {
"channel": {
"type": "select",
"desc": "Color channel",
"default": "green",
"values": ["red", "green", "blue"]
}
},
"docs-link":"https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md#channel-module"
}

View File

@@ -0,0 +1,135 @@
/*
* Generate halftone versions of CMYK channels and blend them with varying rotations as in analog print color separation processes.
* Simulates a CMYK halftone rendering of the image by multiplying pixel values with a four rotated 2D sine wave patterns, one each for cyan, magenta, yellow, and black.
* http://evanw.github.io/glfx.js/docs/#colorHalftone
*/
module.exports = function ColorHalftone(options, UI) {
var defaults = require('./../../util/getDefaults.js')(require('./info.json'));
var output;
var fx = require('glfx');
var dataURItoBlob = function dataURItoBlob(dataURI) {
// convert base64/URLEncoded data component to raw binary data held in a string
var byteString;
if (dataURI.split(',')[0].indexOf('base64') >= 0)
byteString = atob(dataURI.split(',')[1]);
else
byteString = unescape(dataURI.split(',')[1]);
// separate out the mime component
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
// write the bytes of the string to a typed array
var ia = new Uint8Array(byteString.length);
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
return new Blob([ia], { type: mimeString });
};
var canvasToBlobUrl = function canvasToBlobUrl(canvas) {
var blob = dataURItoBlob(canvas.toDataURL('image/png'));
return window.URL.createObjectURL(blob);
};
var colorHalftone = function colorHalftone(id, options, download) {
// try to create a WebGL canvas (will fail if WebGL isn't supported)
try {
var canvas = fx.canvas(1500, 1500);
} catch (e) {
alert(e);
return;
}
// convert the image to a texture
var imageEl = document.getElementById(id);
var image = new Image();
image.onload = function() {
var texture = canvas.texture(image);
canvas.draw(texture,
image.width, // * ratio,
image.height// * ratio
);
canvas.colorHalftone(
image.width / 2,
image.height / 2,
parseFloat(options.angle),
parseFloat(options.size)
).update();
var burl = canvasToBlobUrl(canvas);
if (download) {
window.open(burl);
} else { // replace the image
// keep non-blob version in case we have to fall back:
// image.src = canvas.toDataURL('image/png');
// window.location = canvas.toDataURL('image/png');
imageEl.src = burl;
}
};
$(image).hide();
image.src = imageEl.src;
};
function draw(input, callback) {
var step = this;
options.angle = options.angle || defaults.angle;
options.size = options.size || defaults.size;
if (!options.inBrowser) {
// this.output = input;
// callback();
require('../_nomodule/gl-context')(input, callback, step, options);
}
else {
var image = document.createElement('img');
image.onload = () => {
colorHalftone(
'img',
options
);
image.onload = () => {
var canvas = document.createElement('canvas');
canvas.width = image.naturalWidth; // or 'width' if you want a special/scaled size
canvas.height = image.naturalHeight; // or 'height' if you want a special/scaled size
canvas.getContext('2d').drawImage(image, 0, 0);
step.output = { src: canvas.toDataURL('image/png'), format: 'png' };
image.remove();
callback();
};
};
image.src = input.src;
image.id = 'img';
document.body.appendChild(image);
}
}
return {
options: options,
draw: draw,
output: output,
UI: UI
};
};

Some files were not shown because too many files have changed in this diff Show More