diff --git a/.gitignore b/.gitignore
index 5ca5bba7..991d855d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,12 @@
/typings
+/dist
+src/**/*.js.map
+src/**/*.d.ts
+src/**/*.js
+runtime/*.js
+index.js.map
+index.d.ts
+index.js
#################
## Misc
#################
diff --git a/index.d.ts b/index.d.ts
deleted file mode 100644
index 7589c9ed..00000000
--- a/index.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export * from './src/imageCropperComponent';
-export * from './src/imageCropper';
-export * from './src/cropperSettings';
-export * from './src/cropperDrawSettings';
-export * from './src/model/bounds';
diff --git a/index.html b/index.html
index e7be216f..670e3071 100644
--- a/index.html
+++ b/index.html
@@ -1,5 +1,4 @@
-
@@ -10,14 +9,10 @@
-
Loading...
-
-
-
\ No newline at end of file
diff --git a/index.js b/index.js
deleted file mode 100644
index 2ba1351f..00000000
--- a/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-"use strict";
-function __export(m) {
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-__export(require('./src/imageCropperComponent'));
-__export(require('./src/imageCropper'));
-__export(require('./src/cropperSettings'));
-__export(require('./src/cropperDrawSettings'));
-__export(require('./src/model/bounds'));
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/index.js.map b/index.js.map
deleted file mode 100644
index e0a7efe6..00000000
--- a/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;AAAA,iBAAc,6BAA6B,CAAC,EAAA;AAC5C,iBAAc,oBAAoB,CAAC,EAAA;AACnC,iBAAc,uBAAuB,CAAC,EAAA;AACtC,iBAAc,2BAA2B,CAAC,EAAA;AAC1C,iBAAc,oBAAoB,CAAC,EAAA"}
\ No newline at end of file
diff --git a/index.ts b/index.ts
index eeda989d..6fc3b4b7 100644
--- a/index.ts
+++ b/index.ts
@@ -1,5 +1,5 @@
-export * from './src/imageCropperComponent';
-export * from './src/imageCropper';
-export * from './src/cropperSettings';
-export * from './src/cropperDrawSettings';
-export * from './src/model/bounds';
\ No newline at end of file
+export * from "./src/imageCropperComponent";
+export * from "./src/imageCropper";
+export * from "./src/cropperSettings";
+export * from "./src/cropperDrawSettings";
+export * from "./src/model/bounds";
\ No newline at end of file
diff --git a/package.json b/package.json
index 191c2c68..cef74997 100644
--- a/package.json
+++ b/package.json
@@ -1,14 +1,26 @@
{
"name": "ng2-img-cropper",
- "version": "0.6.1",
+ "version": "0.6.4",
"description": "Angular2 Image Cropper Component",
"repository": {
"type": "git",
"url": "git+https://github.com/cstefanache/angular2-img-cropper.git"
},
"scripts": {
- "prepublish": "tsc",
+ "tsc": "tsc",
+ "postinstall": "typings install",
+ "build": "tsc -p ./",
+ "preversion": "npm test && npm run build",
+ "version": "git commit -am \"Prerelease updates\" && git checkout -b release && git add -f ./",
+ "postversion": "git push --tags && git checkout master && git branch -D release && git push && npm publish",
+ "release:patch": "npm version patch && npm publish",
+ "release:minor": "npm version minor && npm publish",
+ "release:major": "npm version major && npm publish",
+ "compile": "npm run compile:ts",
+ "compile:ts": "tsc",
+ "typings": "typings",
"all": "concurrently \"tsc -w \" \"tsc -p runtime -w \" \"npm run lite\" ",
+ "start": "concurrently \"tsc -w \" \"tsc -p runtime -w \" \"npm run lite\" ",
"watch": "tsc -w ",
"lite": "lite-server"
},
@@ -28,11 +40,10 @@
"bootstrap": "^3.3.6",
"concurrently": "^2.0.0",
"es6-shim": "^0.35.0",
- "jquery": "^2.2.3",
"lite-server": "^2.2.0",
"ng2-styler": "^0.1.2",
"reflect-metadata": "^0.1.3",
- "rxjs": "5.0.0-beta.6",
+ "rxjs": "^5.0.0-beta.6",
"systemjs": "0.19.27",
"typescript": "^1.8.10",
"typings": "^1.3.0",
diff --git a/runtime/main.ts b/runtime/main.ts
index 70f06cc0..34e6962d 100644
--- a/runtime/main.ts
+++ b/runtime/main.ts
@@ -1,5 +1,5 @@
-import { bootstrap } from '@angular/platform-browser-dynamic';
-import {AppComponent} from './app';
-
+import {bootstrap} from "@angular/platform-browser-dynamic";
+import {AppComponent} from "./app";
+// todo: update to angular2 rc.5 with ngModule.
bootstrap(AppComponent, []);
diff --git a/runtime/tsconfig.json b/runtime/tsconfig.json
index 76994741..394e5b80 100644
--- a/runtime/tsconfig.json
+++ b/runtime/tsconfig.json
@@ -1,7 +1,7 @@
{
"compilerOptions": {
"out": "dist/img-cropper-test-app.js",
- "noImplicitAny": false,
+ "noImplicitAny": true,
"module": "system",
"target": "es5",
"emitDecoratorMetadata": true,
diff --git a/src/cropperDrawSettings.d.ts b/src/cropperDrawSettings.d.ts
deleted file mode 100644
index b22a145c..00000000
--- a/src/cropperDrawSettings.d.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export declare class CropperDrawSettings {
- strokeWidth: number;
- strokeColor: string;
- constructor(strokeWidth?: number, strokeColor?: string);
-}
diff --git a/src/cropperDrawSettings.js b/src/cropperDrawSettings.js
deleted file mode 100644
index 71bc163b..00000000
--- a/src/cropperDrawSettings.js
+++ /dev/null
@@ -1,12 +0,0 @@
-"use strict";
-var CropperDrawSettings = (function () {
- function CropperDrawSettings(strokeWidth, strokeColor) {
- if (strokeWidth === void 0) { strokeWidth = 1; }
- if (strokeColor === void 0) { strokeColor = 'rgba(255,255,255,0.9)'; }
- this.strokeWidth = strokeWidth;
- this.strokeColor = strokeColor;
- }
- return CropperDrawSettings;
-}());
-exports.CropperDrawSettings = CropperDrawSettings;
-//# sourceMappingURL=cropperDrawSettings.js.map
\ No newline at end of file
diff --git a/src/cropperDrawSettings.js.map b/src/cropperDrawSettings.js.map
deleted file mode 100644
index e74430f1..00000000
--- a/src/cropperDrawSettings.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"cropperDrawSettings.js","sourceRoot":"","sources":["cropperDrawSettings.ts"],"names":[],"mappings":";AAAA;IACI,6BAAmB,WAAsB,EAAS,WAA4C;QAAlF,2BAA6B,GAA7B,eAA6B;QAAE,2BAAmD,GAAnD,qCAAmD;QAA3E,gBAAW,GAAX,WAAW,CAAW;QAAS,gBAAW,GAAX,WAAW,CAAiC;IAC9F,CAAC;IACL,0BAAC;AAAD,CAAC,AAHD,IAGC;AAHY,2BAAmB,sBAG/B,CAAA"}
\ No newline at end of file
diff --git a/src/cropperDrawSettings.ts b/src/cropperDrawSettings.ts
index 4d2f3a7c..e1ffd63f 100644
--- a/src/cropperDrawSettings.ts
+++ b/src/cropperDrawSettings.ts
@@ -1,4 +1,4 @@
export class CropperDrawSettings {
- constructor(public strokeWidth:number = 1, public strokeColor:string = 'rgba(255,255,255,0.9)') {
- }
-}
\ No newline at end of file
+ public strokeWidth: number = 1;
+ public strokeColor: string = "rgba(255,255,255,1)";
+}
diff --git a/src/cropperSettings.d.ts b/src/cropperSettings.d.ts
deleted file mode 100644
index a661a902..00000000
--- a/src/cropperSettings.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-import { CropperDrawSettings } from "./cropperDrawSettings";
-export declare class CropperSettings {
- canvasWidth: number;
- canvasHeight: number;
- width: number;
- height: number;
- minWidth: number;
- minHeight: number;
- minWithRelativeToResolution: boolean;
- croppedWidth: number;
- croppedHeight: number;
- cropperDrawSettings: CropperDrawSettings;
- touchRadius: number;
- noFileInput: boolean;
- allowedFilesRegex: RegExp;
- private _rounded;
- private _keepAspect;
- rounded: boolean;
- keepAspect: boolean;
-}
diff --git a/src/cropperSettings.js b/src/cropperSettings.js
deleted file mode 100644
index eee812c3..00000000
--- a/src/cropperSettings.js
+++ /dev/null
@@ -1,50 +0,0 @@
-"use strict";
-var cropperDrawSettings_1 = require("./cropperDrawSettings");
-var CropperSettings = (function () {
- function CropperSettings() {
- this.canvasWidth = 300;
- this.canvasHeight = 300;
- this.width = 200;
- this.height = 200;
- this.minWidth = 50;
- this.minHeight = 50;
- this.minWithRelativeToResolution = true;
- this.croppedWidth = 100;
- this.croppedHeight = 100;
- this.cropperDrawSettings = new cropperDrawSettings_1.CropperDrawSettings();
- this.touchRadius = 20;
- this.noFileInput = false;
- this.allowedFilesRegex = /\.(jpe?g|png|gif)$/i;
- this._rounded = false;
- this._keepAspect = true;
- }
- Object.defineProperty(CropperSettings.prototype, "rounded", {
- get: function () {
- return this._rounded;
- },
- set: function (val) {
- this._rounded = val;
- if (val) {
- this._keepAspect = true;
- }
- },
- enumerable: true,
- configurable: true
- });
- Object.defineProperty(CropperSettings.prototype, "keepAspect", {
- get: function () {
- return this._keepAspect;
- },
- set: function (val) {
- if (val === false && this._rounded) {
- throw new Error("Cannot set keep aspect to false on rounded cropper. Ellipsis not supported");
- }
- this._keepAspect = val;
- },
- enumerable: true,
- configurable: true
- });
- return CropperSettings;
-}());
-exports.CropperSettings = CropperSettings;
-//# sourceMappingURL=cropperSettings.js.map
\ No newline at end of file
diff --git a/src/cropperSettings.js.map b/src/cropperSettings.js.map
deleted file mode 100644
index 9d6cf358..00000000
--- a/src/cropperSettings.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"cropperSettings.js","sourceRoot":"","sources":["cropperSettings.ts"],"names":[],"mappings":";AAAA,oCAAkC,uBAAuB,CAAC,CAAA;AAC1D;IAAA;QACI,gBAAW,GAAU,GAAG,CAAC;QACzB,iBAAY,GAAU,GAAG,CAAC;QAE1B,UAAK,GAAU,GAAG,CAAC;QACnB,WAAM,GAAU,GAAG,CAAC;QAEpB,aAAQ,GAAU,EAAE,CAAC;QACrB,cAAS,GAAU,EAAE,CAAC;QACtB,gCAA2B,GAAW,IAAI,CAAC;QAE3C,iBAAY,GAAU,GAAG,CAAC;QAC1B,kBAAa,GAAU,GAAG,CAAC;QAG3B,wBAAmB,GAAuB,IAAI,yCAAmB,EAAE,CAAC;QACpE,gBAAW,GAAU,EAAE,CAAC;QACxB,gBAAW,GAAW,KAAK,CAAC;QAE5B,sBAAiB,GAAU,qBAAqB,CAAC;QAEzC,aAAQ,GAAW,KAAK,CAAC;QACzB,gBAAW,GAAW,IAAI,CAAC;IAyBvC,CAAC;IAvBG,sBAAI,oCAAO;aAOX;YACI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC;QACzB,CAAC;aATD,UAAY,GAAW;YACnB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACpB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACN,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;YAC5B,CAAC;QACL,CAAC;;;OAAA;IAMD,sBAAI,uCAAU;aAQd;YACI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;QAC5B,CAAC;aAVD,UAAe,GAAW;YACtB,EAAE,CAAC,CAAC,GAAG,KAAK,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;YAClG,CAAC;YAED,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC;QAC3B,CAAC;;;OAAA;IAML,sBAAC;AAAD,CAAC,AA/CD,IA+CC;AA/CY,uBAAe,kBA+C3B,CAAA"}
\ No newline at end of file
diff --git a/src/cropperSettings.ts b/src/cropperSettings.ts
index 86d1fc4f..f282caea 100644
--- a/src/cropperSettings.ts
+++ b/src/cropperSettings.ts
@@ -1,40 +1,65 @@
import {CropperDrawSettings} from "./cropperDrawSettings";
-export class CropperSettings {
- canvasWidth:number = 300;
- canvasHeight:number = 300;
- width:number = 200;
- height:number = 200;
+export interface ICropperSettings {
+ canvasWidth?: number;
+ canvasHeight?: number;
+ width?: number;
+ height?: number;
+ minWidth?: number;
+ minHeight?: number;
+ minWithRelativeToResolution?: boolean;
+ croppedWidth?: number;
+ croppedHeight?: number;
+ touchRadius?: number;
+ cropperDrawSettings?: any;
+ noFileInput?: boolean;
+ allowedFilesRegex?: RegExp;
+ rounded: boolean;
+ keepAspect: boolean;
+}
- minWidth:number = 50;
- minHeight:number = 50;
- minWithRelativeToResolution:boolean = true;
+export class CropperSettings implements ICropperSettings {
- croppedWidth:number = 100;
- croppedHeight:number = 100;
+ public canvasWidth: number = 300;
+ public canvasHeight: number = 300;
+ public width: number = 200;
+ public height: number = 200;
- cropperDrawSettings:CropperDrawSettings = new CropperDrawSettings();
- touchRadius:number = 20;
- noFileInput:boolean = false;
+ public minWidth: number = 50;
+ public minHeight: number = 50;
+ public minWithRelativeToResolution: boolean = true;
- allowedFilesRegex:RegExp = /\.(jpe?g|png|gif)$/i;
+ public responsive: boolean = false;
- private _rounded:boolean = false;
- private _keepAspect:boolean = true;
+ public croppedWidth: number = 100;
+ public croppedHeight: number = 100;
- set rounded(val:boolean) {
+ public cropperDrawSettings: CropperDrawSettings = new CropperDrawSettings();
+ public touchRadius: number = 20;
+ public noFileInput: boolean = false;
+
+ public allowedFilesRegex: RegExp = /\.(jpe?g|png|gif)$/i;
+
+ private _rounded: boolean = false;
+ private _keepAspect: boolean = true;
+
+ constructor() {
+ // init
+ }
+
+ set rounded(val: boolean) {
this._rounded = val;
if (val) {
this._keepAspect = true;
}
}
- get rounded() {
+ get rounded(): boolean {
return this._rounded;
}
- set keepAspect(val:boolean) {
+ set keepAspect(val: boolean) {
if (val === false && this._rounded) {
throw new Error("Cannot set keep aspect to false on rounded cropper. Ellipsis not supported");
}
@@ -42,8 +67,7 @@ export class CropperSettings {
this._keepAspect = val;
}
- get keepAspect() {
+ get keepAspect(): boolean {
return this._keepAspect;
}
-
-}
\ No newline at end of file
+}
diff --git a/src/exif.d.ts b/src/exif.d.ts
deleted file mode 100644
index 5edfa1dd..00000000
--- a/src/exif.d.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-export declare class Exif {
- static debug: boolean;
- static IptcFieldMap: Object;
- static Tags: Object;
- static TiffTags: Object;
- static GPSTags: Object;
- static StringValues: Object;
- static addEvent(element: any, event: any, handler: any): void;
- static imageHasData(img: any): boolean;
- static base64ToArrayBuffer(base64: any, contentType?: any): ArrayBuffer;
- static objectURLToBlob(url: any, callback: any): void;
- static getImageData(img: any, callback: any): void;
- static findEXIFinJPEG(file: any): any;
- static findIPTCinJPEG(file: any): {};
- static readIPTCData(file: any, startOffset: any, sectionLength: any): {};
- static readTags(file: any, tiffStart: any, dirStart: any, strings: any, bigEnd: any): {};
- static readTagValue(file: any, entryOffset: any, tiffStart: any, dirStart: any, bigEnd: any): any;
- static getStringFromDB(buffer: any, start: any, length: any): string;
- static readEXIFData(file: any, start: any): any;
- static getData(img: any, callback: Function): boolean;
- static getTag(img: any, tag: any): any;
- static getAllTags(img: any): {};
- static pretty(img: any): string;
- readFromBinaryFile(file: any): any;
-}
diff --git a/src/exif.js b/src/exif.js
deleted file mode 100644
index 2bcb42b8..00000000
--- a/src/exif.js
+++ /dev/null
@@ -1,699 +0,0 @@
-"use strict";
-var Exif = (function () {
- function Exif() {
- }
- Exif.addEvent = function (element, event, handler) {
- if (element.addEventListener) {
- element.addEventListener(event, handler, false);
- }
- else if (element.attachEvent) {
- element.attachEvent("on" + event, handler);
- }
- };
- Exif.imageHasData = function (img) {
- return !!(img.exifdata);
- };
- Exif.base64ToArrayBuffer = function (base64, contentType) {
- contentType = contentType || base64.match(/^data\:([^\;]+)\;base64,/mi)[1] || '';
- base64 = base64.replace(/^data\:([^\;]+)\;base64,/gmi, '');
- var binary = atob(base64);
- var len = binary.length;
- var buffer = new ArrayBuffer(len);
- var view = new Uint8Array(buffer);
- for (var i = 0; i < len; i++) {
- view[i] = binary.charCodeAt(i);
- }
- return buffer;
- };
- Exif.objectURLToBlob = function (url, callback) {
- var http = new XMLHttpRequest();
- http.open("GET", url, true);
- http.responseType = "blob";
- http.onload = function (e) {
- if (this.status == 200 || this.status === 0) {
- callback(this.response);
- }
- };
- http.send();
- };
- Exif.getImageData = function (img, callback) {
- function handleBinaryFile(binFile) {
- var data = Exif.findEXIFinJPEG(binFile);
- var iptcdata = Exif.findIPTCinJPEG(binFile);
- img.exifdata = data || {};
- img.iptcdata = iptcdata || {};
- if (callback) {
- callback.call(img);
- }
- }
- if (img.src) {
- if (/^data\:/i.test(img.src)) {
- var arrayBuffer = Exif.base64ToArrayBuffer(img.src);
- handleBinaryFile(arrayBuffer);
- }
- else if (/^blob\:/i.test(img.src)) {
- var fileReader = new FileReader();
- fileReader.onload = function (e) {
- handleBinaryFile(e.target.result);
- };
- Exif.objectURLToBlob(img.src, function (blob) {
- fileReader.readAsArrayBuffer(blob);
- });
- }
- else {
- var http = new XMLHttpRequest();
- http.onload = function () {
- if (this.status == 200 || this.status === 0) {
- handleBinaryFile(http.response);
- }
- else {
- throw "Could not load image";
- }
- http = null;
- };
- http.open("GET", img.src, true);
- http.responseType = "arraybuffer";
- http.send(null);
- }
- }
- else if (FileReader && (img instanceof Blob || img instanceof File)) {
- var fileReader = new FileReader();
- fileReader.onload = function (e) {
- if (Exif.debug)
- console.log("Got file of length " + e.target.result.byteLength);
- handleBinaryFile(e.target.result);
- };
- fileReader.readAsArrayBuffer(img);
- }
- };
- Exif.findEXIFinJPEG = function (file) {
- var dataView = new DataView(file);
- if (Exif.debug)
- console.log("Got file of length " + file.byteLength);
- if ((dataView.getUint8(0) != 0xFF) || (dataView.getUint8(1) != 0xD8)) {
- if (Exif.debug)
- console.log("Not a valid JPEG");
- return false;
- }
- var offset = 2, length = file.byteLength, marker;
- while (offset < length) {
- if (dataView.getUint8(offset) != 0xFF) {
- if (Exif.debug)
- console.log("Not a valid marker at offset " + offset + ", found: " + dataView.getUint8(offset));
- return false;
- }
- marker = dataView.getUint8(offset + 1);
- if (Exif.debug)
- console.log(marker);
- if (marker == 225) {
- if (Exif.debug)
- console.log("Found 0xFFE1 marker");
- return Exif.readEXIFData(dataView, offset + 4);
- }
- else {
- offset += 2 + dataView.getUint16(offset + 2);
- }
- }
- };
- Exif.findIPTCinJPEG = function (file) {
- var dataView = new DataView(file);
- if (Exif.debug)
- console.log("Got file of length " + file.byteLength);
- if ((dataView.getUint8(0) != 0xFF) || (dataView.getUint8(1) != 0xD8)) {
- if (Exif.debug)
- console.log("Not a valid JPEG");
- return false;
- }
- var offset = 2, length = file.byteLength;
- var isFieldSegmentStart = function (dataView, offset) {
- return (dataView.getUint8(offset) === 0x38 &&
- dataView.getUint8(offset + 1) === 0x42 &&
- dataView.getUint8(offset + 2) === 0x49 &&
- dataView.getUint8(offset + 3) === 0x4D &&
- dataView.getUint8(offset + 4) === 0x04 &&
- dataView.getUint8(offset + 5) === 0x04);
- };
- while (offset < length) {
- if (isFieldSegmentStart(dataView, offset)) {
- var nameHeaderLength = dataView.getUint8(offset + 7);
- if (nameHeaderLength % 2 !== 0)
- nameHeaderLength += 1;
- if (nameHeaderLength === 0) {
- nameHeaderLength = 4;
- }
- var startOffset = offset + 8 + nameHeaderLength;
- var sectionLength = dataView.getUint16(offset + 6 + nameHeaderLength);
- return Exif.readIPTCData(file, startOffset, sectionLength);
- }
- offset++;
- }
- };
- Exif.readIPTCData = function (file, startOffset, sectionLength) {
- var dataView = new DataView(file);
- var data = {};
- var fieldValue, fieldName, dataSize, segmentType, segmentSize;
- var segmentStartPos = startOffset;
- while (segmentStartPos < startOffset + sectionLength) {
- if (dataView.getUint8(segmentStartPos) === 0x1C && dataView.getUint8(segmentStartPos + 1) === 0x02) {
- segmentType = dataView.getUint8(segmentStartPos + 2);
- if (segmentType in Exif.IptcFieldMap) {
- dataSize = dataView.getInt16(segmentStartPos + 3);
- segmentSize = dataSize + 5;
- fieldName = Exif.IptcFieldMap[segmentType];
- fieldValue = Exif.getStringFromDB(dataView, segmentStartPos + 5, dataSize);
- if (data.hasOwnProperty(fieldName)) {
- if (data[fieldName] instanceof Array) {
- data[fieldName].push(fieldValue);
- }
- else {
- data[fieldName] = [data[fieldName], fieldValue];
- }
- }
- else {
- data[fieldName] = fieldValue;
- }
- }
- }
- segmentStartPos++;
- }
- return data;
- };
- Exif.readTags = function (file, tiffStart, dirStart, strings, bigEnd) {
- var entries = file.getUint16(dirStart, !bigEnd), tags = {}, entryOffset, tag, i;
- for (i = 0; i < entries; i++) {
- entryOffset = dirStart + i * 12 + 2;
- tag = strings[file.getUint16(entryOffset, !bigEnd)];
- if (!tag && Exif.debug)
- console.log("Unknown tag: " + file.getUint16(entryOffset, !bigEnd));
- tags[tag] = Exif.readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd);
- }
- return tags;
- };
- Exif.readTagValue = function (file, entryOffset, tiffStart, dirStart, bigEnd) {
- var type = file.getUint16(entryOffset + 2, !bigEnd), numValues = file.getUint32(entryOffset + 4, !bigEnd), valueOffset = file.getUint32(entryOffset + 8, !bigEnd) + tiffStart, offset, vals, val, n, numerator, denominator;
- switch (type) {
- case 1:
- case 7:
- if (numValues == 1) {
- return file.getUint8(entryOffset + 8, !bigEnd);
- }
- else {
- offset = numValues > 4 ? valueOffset : (entryOffset + 8);
- vals = [];
- for (n = 0; n < numValues; n++) {
- vals[n] = file.getUint8(offset + n);
- }
- return vals;
- }
- case 2:
- offset = numValues > 4 ? valueOffset : (entryOffset + 8);
- return Exif.getStringFromDB(file, offset, numValues - 1);
- case 3:
- if (numValues == 1) {
- return file.getUint16(entryOffset + 8, !bigEnd);
- }
- else {
- offset = numValues > 2 ? valueOffset : (entryOffset + 8);
- vals = [];
- for (n = 0; n < numValues; n++) {
- vals[n] = file.getUint16(offset + 2 * n, !bigEnd);
- }
- return vals;
- }
- case 4:
- if (numValues == 1) {
- return file.getUint32(entryOffset + 8, !bigEnd);
- }
- else {
- vals = [];
- for (n = 0; n < numValues; n++) {
- vals[n] = file.getUint32(valueOffset + 4 * n, !bigEnd);
- }
- return vals;
- }
- case 5:
- if (numValues == 1) {
- numerator = file.getUint32(valueOffset, !bigEnd);
- denominator = file.getUint32(valueOffset + 4, !bigEnd);
- val = new Number(numerator / denominator);
- val.numerator = numerator;
- val.denominator = denominator;
- return val;
- }
- else {
- vals = [];
- for (n = 0; n < numValues; n++) {
- numerator = file.getUint32(valueOffset + 8 * n, !bigEnd);
- denominator = file.getUint32(valueOffset + 4 + 8 * n, !bigEnd);
- vals[n] = new Number(numerator / denominator);
- vals[n].numerator = numerator;
- vals[n].denominator = denominator;
- }
- return vals;
- }
- case 9:
- if (numValues == 1) {
- return file.getInt32(entryOffset + 8, !bigEnd);
- }
- else {
- vals = [];
- for (n = 0; n < numValues; n++) {
- vals[n] = file.getInt32(valueOffset + 4 * n, !bigEnd);
- }
- return vals;
- }
- case 10:
- if (numValues == 1) {
- return file.getInt32(valueOffset, !bigEnd) / file.getInt32(valueOffset + 4, !bigEnd);
- }
- else {
- vals = [];
- for (n = 0; n < numValues; n++) {
- vals[n] = file.getInt32(valueOffset + 8 * n, !bigEnd) / file.getInt32(valueOffset + 4 + 8 * n, !bigEnd);
- }
- return vals;
- }
- }
- };
- Exif.getStringFromDB = function (buffer, start, length) {
- var outstr = "";
- for (var n = start; n < start + length; n++) {
- outstr += String.fromCharCode(buffer.getUint8(n));
- }
- return outstr;
- };
- Exif.readEXIFData = function (file, start) {
- if (Exif.getStringFromDB(file, start, 4) != "Exif") {
- if (Exif.debug)
- console.log("Not valid EXIF data! " + Exif.getStringFromDB(file, start, 4));
- return false;
- }
- var bigEnd, tags, tag, exifData, gpsData, tiffOffset = start + 6;
- if (file.getUint16(tiffOffset) == 0x4949) {
- bigEnd = false;
- }
- else if (file.getUint16(tiffOffset) == 0x4D4D) {
- bigEnd = true;
- }
- else {
- if (Exif.debug)
- console.log("Not valid TIFF data! (no 0x4949 or 0x4D4D)");
- return false;
- }
- if (file.getUint16(tiffOffset + 2, !bigEnd) != 0x002A) {
- if (Exif.debug)
- console.log("Not valid TIFF data! (no 0x002A)");
- return false;
- }
- var firstIFDOffset = file.getUint32(tiffOffset + 4, !bigEnd);
- if (firstIFDOffset < 0x00000008) {
- if (Exif.debug)
- console.log("Not valid TIFF data! (First offset less than 8)", file.getUint32(tiffOffset + 4, !bigEnd));
- return false;
- }
- tags = Exif.readTags(file, tiffOffset, tiffOffset + firstIFDOffset, Exif.TiffTags, bigEnd);
- if (tags.ExifIFDPointer) {
- exifData = Exif.readTags(file, tiffOffset, tiffOffset + tags.ExifIFDPointer, Exif.Tags, bigEnd);
- for (tag in exifData) {
- switch (tag) {
- case "LightSource":
- case "Flash":
- case "MeteringMode":
- case "ExposureProgram":
- case "SensingMethod":
- case "SceneCaptureType":
- case "SceneType":
- case "CustomRendered":
- case "WhiteBalance":
- case "GainControl":
- case "Contrast":
- case "Saturation":
- case "Sharpness":
- case "SubjectDistanceRange":
- case "FileSource":
- exifData[tag] = Exif.StringValues[tag][exifData[tag]];
- break;
- case "ExifVersion":
- case "FlashpixVersion":
- exifData[tag] = String.fromCharCode(exifData[tag][0], exifData[tag][1], exifData[tag][2], exifData[tag][3]);
- break;
- case "ComponentsConfiguration":
- exifData[tag] =
- Exif.StringValues['Components'][exifData[tag][0]] +
- Exif.StringValues['Components'][exifData[tag][1]] +
- Exif.StringValues['Components'][exifData[tag][2]] +
- Exif.StringValues['Components'][exifData[tag][3]];
- break;
- }
- tags[tag] = exifData[tag];
- }
- }
- if (tags.GPSInfoIFDPointer) {
- gpsData = Exif.readTags(file, tiffOffset, tiffOffset + tags.GPSInfoIFDPointer, Exif.GPSTags, bigEnd);
- for (tag in gpsData) {
- switch (tag) {
- case "GPSVersionID":
- gpsData[tag] = gpsData[tag][0] +
- "." + gpsData[tag][1] +
- "." + gpsData[tag][2] +
- "." + gpsData[tag][3];
- break;
- }
- tags[tag] = gpsData[tag];
- }
- }
- return tags;
- };
- Exif.getData = function (img, callback) {
- if ((img instanceof Image || img instanceof HTMLImageElement) && !img.complete)
- return false;
- if (!Exif.imageHasData(img)) {
- Exif.getImageData(img, callback);
- }
- else {
- if (callback) {
- callback.call(img);
- }
- }
- return true;
- };
- Exif.getTag = function (img, tag) {
- if (!Exif.imageHasData(img))
- return;
- return img.exifdata[tag];
- };
- Exif.getAllTags = function (img) {
- if (!Exif.imageHasData(img))
- return {};
- var a, data = img.exifdata, tags = {};
- for (a in data) {
- if (data.hasOwnProperty(a)) {
- tags[a] = data[a];
- }
- }
- return tags;
- };
- Exif.pretty = function (img) {
- if (!Exif.imageHasData(img))
- return "";
- var a, data = img.exifdata, strPretty = "";
- for (a in data) {
- if (data.hasOwnProperty(a)) {
- if (typeof data[a] == "object") {
- if (data[a] instanceof Number) {
- strPretty += a + " : " + data[a] + " [" + data[a].numerator + "/" + data[a].denominator + "]\r\n";
- }
- else {
- strPretty += a + " : [" + data[a].length + " values]\r\n";
- }
- }
- else {
- strPretty += a + " : " + data[a] + "\r\n";
- }
- }
- }
- return strPretty;
- };
- Exif.prototype.readFromBinaryFile = function (file) {
- return Exif.findEXIFinJPEG(file);
- };
- Exif.debug = false;
- Exif.IptcFieldMap = {
- 0x78: 'caption',
- 0x6E: 'credit',
- 0x19: 'keywords',
- 0x37: 'dateCreated',
- 0x50: 'byline',
- 0x55: 'bylineTitle',
- 0x7A: 'captionWriter',
- 0x69: 'headline',
- 0x74: 'copyright',
- 0x0F: 'category'
- };
- Exif.Tags = {
- 0x9000: "ExifVersion",
- 0xA000: "FlashpixVersion",
- 0xA001: "ColorSpace",
- 0xA002: "PixelXDimension",
- 0xA003: "PixelYDimension",
- 0x9101: "ComponentsConfiguration",
- 0x9102: "CompressedBitsPerPixel",
- 0x927C: "MakerNote",
- 0x9286: "UserComment",
- 0xA004: "RelatedSoundFile",
- 0x9003: "DateTimeOriginal",
- 0x9004: "DateTimeDigitized",
- 0x9290: "SubsecTime",
- 0x9291: "SubsecTimeOriginal",
- 0x9292: "SubsecTimeDigitized",
- 0x829A: "ExposureTime",
- 0x829D: "FNumber",
- 0x8822: "ExposureProgram",
- 0x8824: "SpectralSensitivity",
- 0x8827: "ISOSpeedRatings",
- 0x8828: "OECF",
- 0x9201: "ShutterSpeedValue",
- 0x9202: "ApertureValue",
- 0x9203: "BrightnessValue",
- 0x9204: "ExposureBias",
- 0x9205: "MaxApertureValue",
- 0x9206: "SubjectDistance",
- 0x9207: "MeteringMode",
- 0x9208: "LightSource",
- 0x9209: "Flash",
- 0x9214: "SubjectArea",
- 0x920A: "FocalLength",
- 0xA20B: "FlashEnergy",
- 0xA20C: "SpatialFrequencyResponse",
- 0xA20E: "FocalPlaneXResolution",
- 0xA20F: "FocalPlaneYResolution",
- 0xA210: "FocalPlaneResolutionUnit",
- 0xA214: "SubjectLocation",
- 0xA215: "ExposureIndex",
- 0xA217: "SensingMethod",
- 0xA300: "FileSource",
- 0xA301: "SceneType",
- 0xA302: "CFAPattern",
- 0xA401: "CustomRendered",
- 0xA402: "ExposureMode",
- 0xA403: "WhiteBalance",
- 0xA404: "DigitalZoomRation",
- 0xA405: "FocalLengthIn35mmFilm",
- 0xA406: "SceneCaptureType",
- 0xA407: "GainControl",
- 0xA408: "Contrast",
- 0xA409: "Saturation",
- 0xA40A: "Sharpness",
- 0xA40B: "DeviceSettingDescription",
- 0xA40C: "SubjectDistanceRange",
- 0xA005: "InteroperabilityIFDPointer",
- 0xA420: "ImageUniqueID"
- };
- Exif.TiffTags = {
- 0x0100: "ImageWidth",
- 0x0101: "ImageHeight",
- 0x8769: "ExifIFDPointer",
- 0x8825: "GPSInfoIFDPointer",
- 0xA005: "InteroperabilityIFDPointer",
- 0x0102: "BitsPerSample",
- 0x0103: "Compression",
- 0x0106: "PhotometricInterpretation",
- 0x0112: "Orientation",
- 0x0115: "SamplesPerPixel",
- 0x011C: "PlanarConfiguration",
- 0x0212: "YCbCrSubSampling",
- 0x0213: "YCbCrPositioning",
- 0x011A: "XResolution",
- 0x011B: "YResolution",
- 0x0128: "ResolutionUnit",
- 0x0111: "StripOffsets",
- 0x0116: "RowsPerStrip",
- 0x0117: "StripByteCounts",
- 0x0201: "JPEGInterchangeFormat",
- 0x0202: "JPEGInterchangeFormatLength",
- 0x012D: "TransferFunction",
- 0x013E: "WhitePoint",
- 0x013F: "PrimaryChromaticities",
- 0x0211: "YCbCrCoefficients",
- 0x0214: "ReferenceBlackWhite",
- 0x0132: "DateTime",
- 0x010E: "ImageDescription",
- 0x010F: "Make",
- 0x0110: "Model",
- 0x0131: "Software",
- 0x013B: "Artist",
- 0x8298: "Copyright"
- };
- Exif.GPSTags = {
- 0x0000: "GPSVersionID",
- 0x0001: "GPSLatitudeRef",
- 0x0002: "GPSLatitude",
- 0x0003: "GPSLongitudeRef",
- 0x0004: "GPSLongitude",
- 0x0005: "GPSAltitudeRef",
- 0x0006: "GPSAltitude",
- 0x0007: "GPSTimeStamp",
- 0x0008: "GPSSatellites",
- 0x0009: "GPSStatus",
- 0x000A: "GPSMeasureMode",
- 0x000B: "GPSDOP",
- 0x000C: "GPSSpeedRef",
- 0x000D: "GPSSpeed",
- 0x000E: "GPSTrackRef",
- 0x000F: "GPSTrack",
- 0x0010: "GPSImgDirectionRef",
- 0x0011: "GPSImgDirection",
- 0x0012: "GPSMapDatum",
- 0x0013: "GPSDestLatitudeRef",
- 0x0014: "GPSDestLatitude",
- 0x0015: "GPSDestLongitudeRef",
- 0x0016: "GPSDestLongitude",
- 0x0017: "GPSDestBearingRef",
- 0x0018: "GPSDestBearing",
- 0x0019: "GPSDestDistanceRef",
- 0x001A: "GPSDestDistance",
- 0x001B: "GPSProcessingMethod",
- 0x001C: "GPSAreaInformation",
- 0x001D: "GPSDateStamp",
- 0x001E: "GPSDifferential"
- };
- Exif.StringValues = {
- ExposureProgram: {
- 0: "Not defined",
- 1: "Manual",
- 2: "Normal program",
- 3: "Aperture priority",
- 4: "Shutter priority",
- 5: "Creative program",
- 6: "Action program",
- 7: "Portrait mode",
- 8: "Landscape mode"
- },
- MeteringMode: {
- 0: "Unknown",
- 1: "Average",
- 2: "CenterWeightedAverage",
- 3: "Spot",
- 4: "MultiSpot",
- 5: "Pattern",
- 6: "Partial",
- 255: "Other"
- },
- LightSource: {
- 0: "Unknown",
- 1: "Daylight",
- 2: "Fluorescent",
- 3: "Tungsten (incandescent light)",
- 4: "Flash",
- 9: "Fine weather",
- 10: "Cloudy weather",
- 11: "Shade",
- 12: "Daylight fluorescent (D 5700 - 7100K)",
- 13: "Day white fluorescent (N 4600 - 5400K)",
- 14: "Cool white fluorescent (W 3900 - 4500K)",
- 15: "White fluorescent (WW 3200 - 3700K)",
- 17: "Standard light A",
- 18: "Standard light B",
- 19: "Standard light C",
- 20: "D55",
- 21: "D65",
- 22: "D75",
- 23: "D50",
- 24: "ISO studio tungsten",
- 255: "Other"
- },
- Flash: {
- 0x0000: "Flash did not fire",
- 0x0001: "Flash fired",
- 0x0005: "Strobe return light not detected",
- 0x0007: "Strobe return light detected",
- 0x0009: "Flash fired, compulsory flash mode",
- 0x000D: "Flash fired, compulsory flash mode, return light not detected",
- 0x000F: "Flash fired, compulsory flash mode, return light detected",
- 0x0010: "Flash did not fire, compulsory flash mode",
- 0x0018: "Flash did not fire, auto mode",
- 0x0019: "Flash fired, auto mode",
- 0x001D: "Flash fired, auto mode, return light not detected",
- 0x001F: "Flash fired, auto mode, return light detected",
- 0x0020: "No flash function",
- 0x0041: "Flash fired, red-eye reduction mode",
- 0x0045: "Flash fired, red-eye reduction mode, return light not detected",
- 0x0047: "Flash fired, red-eye reduction mode, return light detected",
- 0x0049: "Flash fired, compulsory flash mode, red-eye reduction mode",
- 0x004D: "Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected",
- 0x004F: "Flash fired, compulsory flash mode, red-eye reduction mode, return light detected",
- 0x0059: "Flash fired, auto mode, red-eye reduction mode",
- 0x005D: "Flash fired, auto mode, return light not detected, red-eye reduction mode",
- 0x005F: "Flash fired, auto mode, return light detected, red-eye reduction mode"
- },
- SensingMethod: {
- 1: "Not defined",
- 2: "One-chip color area sensor",
- 3: "Two-chip color area sensor",
- 4: "Three-chip color area sensor",
- 5: "Color sequential area sensor",
- 7: "Trilinear sensor",
- 8: "Color sequential linear sensor"
- },
- SceneCaptureType: {
- 0: "Standard",
- 1: "Landscape",
- 2: "Portrait",
- 3: "Night scene"
- },
- SceneType: {
- 1: "Directly photographed"
- },
- CustomRendered: {
- 0: "Normal process",
- 1: "Custom process"
- },
- WhiteBalance: {
- 0: "Auto white balance",
- 1: "Manual white balance"
- },
- GainControl: {
- 0: "None",
- 1: "Low gain up",
- 2: "High gain up",
- 3: "Low gain down",
- 4: "High gain down"
- },
- Contrast: {
- 0: "Normal",
- 1: "Soft",
- 2: "Hard"
- },
- Saturation: {
- 0: "Normal",
- 1: "Low saturation",
- 2: "High saturation"
- },
- Sharpness: {
- 0: "Normal",
- 1: "Soft",
- 2: "Hard"
- },
- SubjectDistanceRange: {
- 0: "Unknown",
- 1: "Macro",
- 2: "Close view",
- 3: "Distant view"
- },
- FileSource: {
- 3: "DSC"
- },
- Components: {
- 0: "",
- 1: "Y",
- 2: "Cb",
- 3: "Cr",
- 4: "R",
- 5: "G",
- 6: "B"
- }
- };
- return Exif;
-}());
-exports.Exif = Exif;
-//# sourceMappingURL=exif.js.map
\ No newline at end of file
diff --git a/src/exif.js.map b/src/exif.js.map
deleted file mode 100644
index 7282d936..00000000
--- a/src/exif.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"exif.js","sourceRoot":"","sources":["exif.ts"],"names":[],"mappings":";AAAA;IAAA;IAwxBA,CAAC;IAxeU,aAAQ,GAAf,UAAgB,OAAO,EAAE,KAAK,EAAE,OAAO;QACnC,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC3B,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;YAC7B,OAAO,CAAC,WAAW,CAAC,IAAI,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IAGM,iBAAY,GAAnB,UAAoB,GAAG;QACnB,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAGM,wBAAmB,GAA1B,UAA2B,MAAM,EAAE,WAAgB;QAC/C,WAAW,GAAG,WAAW,IAAI,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjF,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1B,IAAI,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;QACxB,IAAI,MAAM,GAAG,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;QAClC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,CAAC,MAAM,CAAC;IAClB,CAAC;IAGM,oBAAe,GAAtB,UAAuB,GAAG,EAAE,QAAQ;QAChC,IAAI,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC;YACrB,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC1C,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;QACL,CAAC,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,CAAC;IAChB,CAAC;IAGM,iBAAY,GAAnB,UAAoB,GAAG,EAAE,QAAQ;QAC7B,0BAA0B,OAAO;YAC7B,IAAI,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAC5C,GAAG,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;YAC1B,GAAG,CAAC,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;YAC9B,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;QACL,CAAC;QAED,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACV,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAC3B,IAAI,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACpD,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAElC,CAAC;YAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;gBAClC,UAAU,CAAC,MAAM,GAAG,UAAU,CAAK;oBAC/B,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBACtC,CAAC,CAAC;gBACF,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,IAAI;oBACxC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACvC,CAAC,CAAC,CAAC;YACP,CAAC;YAAC,IAAI,CAAC,CAAC;gBACJ,IAAI,IAAI,GAAG,IAAI,cAAc,EAAE,CAAC;gBAChC,IAAI,CAAC,MAAM,GAAG;oBACV,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;wBAC1C,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACpC,CAAC;oBAAC,IAAI,CAAC,CAAC;wBACJ,MAAM,sBAAsB,CAAC;oBACjC,CAAC;oBACD,IAAI,GAAG,IAAI,CAAC;gBAChB,CAAC,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAChC,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACL,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,IAAI,CAAC,GAAG,YAAY,IAAI,IAAI,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC;YACpE,IAAI,UAAU,GAAG,IAAI,UAAU,EAAE,CAAC;YAClC,UAAU,CAAC,MAAM,GAAG,UAAU,CAAK;gBAC/B,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBAChF,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC,CAAC;YAEF,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACtC,CAAC;IACL,CAAC;IAGM,mBAAc,GAArB,UAAsB,IAAI;QACtB,IAAI,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAElC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACrE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACnE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,EACV,MAAM,GAAG,IAAI,CAAC,UAAU,EACxB,MAAM,CAAC;QAEX,OAAO,MAAM,GAAG,MAAM,EAAE,CAAC;YACrB,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;gBACpC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,GAAG,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBAChH,MAAM,CAAC,KAAK,CAAC;YACjB,CAAC;YAED,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACvC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAKpC,EAAE,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC;gBAChB,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;gBAEnD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;YAInD,CAAC;YAAC,IAAI,CAAC,CAAC;gBACJ,MAAM,IAAI,CAAC,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjD,CAAC;QAEL,CAAC;IAEL,CAAC;IAGM,mBAAc,GAArB,UAAsB,IAAI;QACtB,IAAI,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAElC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACrE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YACnE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,MAAM,GAAG,CAAC,EACV,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC;QAG7B,IAAI,mBAAmB,GAAG,UAAU,QAAQ,EAAE,MAAM;YAChD,MAAM,CAAC,CACH,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI;gBAClC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;gBACtC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;gBACtC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;gBACtC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;gBACtC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI,CACzC,CAAC;QACN,CAAC,CAAC;QAEF,OAAO,MAAM,GAAG,MAAM,EAAE,CAAC;YAErB,EAAE,CAAC,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;gBAGxC,IAAI,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;gBACrD,EAAE,CAAC,CAAC,gBAAgB,GAAG,CAAC,KAAK,CAAC,CAAC;oBAAC,gBAAgB,IAAI,CAAC,CAAC;gBAEtD,EAAE,CAAC,CAAC,gBAAgB,KAAK,CAAC,CAAC,CAAC,CAAC;oBAEzB,gBAAgB,GAAG,CAAC,CAAC;gBACzB,CAAC;gBAED,IAAI,WAAW,GAAG,MAAM,GAAG,CAAC,GAAG,gBAAgB,CAAC;gBAChD,IAAI,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;gBAEtE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;YAE/D,CAAC;YAID,MAAM,EAAE,CAAC;QAEb,CAAC;IAEL,CAAC;IAGM,iBAAY,GAAnB,UAAoB,IAAI,EAAE,WAAW,EAAE,aAAa;QAChD,IAAI,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,CAAC;QAC9D,IAAI,eAAe,GAAG,WAAW,CAAC;QAClC,OAAO,eAAe,GAAG,WAAW,GAAG,aAAa,EAAE,CAAC;YACnD,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,CAAC,KAAK,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,eAAe,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;gBACjG,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;gBACrD,EAAE,CAAC,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;oBACnC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC;oBAClD,WAAW,GAAG,QAAQ,GAAG,CAAC,CAAC;oBAC3B,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;oBAC3C,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,eAAe,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;oBAE3E,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;wBAEjC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC;4BACnC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;wBACrC,CAAC;wBACD,IAAI,CAAC,CAAC;4BACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC;wBACpD,CAAC;oBACL,CAAC;oBACD,IAAI,CAAC,CAAC;wBACF,IAAI,CAAC,SAAS,CAAC,GAAG,UAAU,CAAC;oBACjC,CAAC;gBACL,CAAC;YAEL,CAAC;YACD,eAAe,EAAE,CAAC;QACtB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;IAChB,CAAC;IAGM,aAAQ,GAAf,UAAgB,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM;QACtD,IAAI,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,EAC3C,IAAI,GAAG,EAAE,EACT,WAAW,EAAE,GAAG,EAChB,CAAC,CAAC;QAEN,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,WAAW,GAAG,QAAQ,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACpC,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YACpD,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5F,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;IAChB,CAAC;IAGM,iBAAY,GAAnB,UAAoB,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM;QAC9D,IAAI,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EAC/C,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,EACpD,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,SAAS,EAClE,MAAM,EACN,IAAI,EAAE,GAAG,EAAE,CAAC,EACZ,SAAS,EAAE,WAAW,CAAC;QAE3B,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACX,KAAK,CAAC,CAAC;YACP,KAAK,CAAC;gBACF,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;gBACnD,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,MAAM,GAAG,SAAS,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;oBACzD,IAAI,GAAG,EAAE,CAAC;oBACV,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC7B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBACxC,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;gBAChB,CAAC;YAEL,KAAK,CAAC;gBACF,MAAM,GAAG,SAAS,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;gBACzD,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;YAE7D,KAAK,CAAC;gBACF,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;gBACpD,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,MAAM,GAAG,SAAS,GAAG,CAAC,GAAG,WAAW,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;oBACzD,IAAI,GAAG,EAAE,CAAC;oBACV,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC7B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;oBACtD,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;gBAChB,CAAC;YAEL,KAAK,CAAC;gBACF,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;gBACpD,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,IAAI,GAAG,EAAE,CAAC;oBACV,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC7B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;oBAC3D,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;gBAChB,CAAC;YAEL,KAAK,CAAC;gBACF,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjB,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC;oBACjD,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;oBACvD,GAAG,GAAG,IAAI,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC;oBAC1C,GAAG,CAAC,SAAS,GAAG,SAAS,CAAC;oBAC1B,GAAG,CAAC,WAAW,GAAG,WAAW,CAAC;oBAC9B,MAAM,CAAC,GAAG,CAAC;gBACf,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,IAAI,GAAG,EAAE,CAAC;oBACV,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC7B,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;wBACzD,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;wBAC/D,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC;wBAC9C,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC;wBAC9B,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,WAAW,CAAC;oBACtC,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;gBAChB,CAAC;YAEL,KAAK,CAAC;gBACF,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;gBACnD,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,IAAI,GAAG,EAAE,CAAC;oBACV,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC7B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;oBAC1D,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;gBAChB,CAAC;YAEL,KAAK,EAAE;gBACH,EAAE,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC;oBACjB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;gBACzF,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,IAAI,GAAG,EAAE,CAAC;oBACV,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC7B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;oBAC5G,CAAC;oBACD,MAAM,CAAC,IAAI,CAAC;gBAChB,CAAC;QACT,CAAC;IACL,CAAC;IAGM,oBAAe,GAAtB,UAAuB,MAAM,EAAE,KAAK,EAAE,MAAM;QACxC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC1C,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;QACD,MAAM,CAAC,MAAM,CAAC;IAClB,CAAC;IAGM,iBAAY,GAAnB,UAAoB,IAAI,EAAE,KAAK;QAC3B,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;YACjD,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5F,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,MAAM,EACN,IAAI,EAAE,GAAG,EACT,QAAQ,EAAE,OAAO,EACjB,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC;QAG3B,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;YACvC,MAAM,GAAG,KAAK,CAAC;QACnB,CAAC;QAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;YAC9C,MAAM,GAAG,IAAI,CAAC;QAClB,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC1E,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAED,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;YACpD,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;YAChE,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAE7D,EAAE,CAAC,CAAC,cAAc,GAAG,UAAU,CAAC,CAAC,CAAC;YAC9B,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,iDAAiD,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;YACxH,MAAM,CAAC,KAAK,CAAC;QACjB,CAAC;QAED,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,GAAG,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAE3F,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YACtB,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAChG,GAAG,CAAC,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC;gBACnB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACV,KAAK,aAAa,CAAE;oBACpB,KAAK,OAAO,CAAE;oBACd,KAAK,cAAc,CAAE;oBACrB,KAAK,iBAAiB,CAAE;oBACxB,KAAK,eAAe,CAAE;oBACtB,KAAK,kBAAkB,CAAE;oBACzB,KAAK,WAAW,CAAE;oBAClB,KAAK,gBAAgB,CAAE;oBACvB,KAAK,cAAc,CAAE;oBACrB,KAAK,aAAa,CAAE;oBACpB,KAAK,UAAU,CAAE;oBACjB,KAAK,YAAY,CAAE;oBACnB,KAAK,WAAW,CAAE;oBAClB,KAAK,sBAAsB,CAAE;oBAC7B,KAAK,YAAY;wBACb,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;wBACtD,KAAK,CAAC;oBAEV,KAAK,aAAa,CAAE;oBACpB,KAAK,iBAAiB;wBAClB,QAAQ,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC5G,KAAK,CAAC;oBAEV,KAAK,yBAAyB;wBAC1B,QAAQ,CAAC,GAAG,CAAC;4BACT,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gCACjD,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gCACjD,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gCACjD,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;wBACtD,KAAK,CAAC;gBACd,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;QACL,CAAC;QAED,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACzB,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACrG,GAAG,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC;gBAClB,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACV,KAAK,cAAc;wBACf,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;4BAC1B,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;4BACrB,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;4BACrB,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC1B,KAAK,CAAC;gBACd,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;IAChB,CAAC;IAEM,YAAO,GAAd,UAAe,GAAO,EAAE,QAAiB;QAErC,EAAE,CAAC,CAAC,CAAC,GAAG,YAAY,KAAK,IAAI,GAAG,YAAY,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;YAAC,MAAM,CAAC,KAAK,CAAC;QAE7F,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACrC,CAAC;QAAC,IAAI,CAAC,CAAC;YACJ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;gBACX,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvB,CAAC;QACL,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;IAChB,CAAC;IAEM,WAAM,GAAb,UAAc,GAAG,EAAE,GAAG;QAClB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAAC,MAAM,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;;IAEM,eAAU,GAAjB,UAAkB,GAAG;QACjB,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAAC,MAAM,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,EACD,IAAI,GAAG,GAAG,CAAC,QAAQ,EACnB,IAAI,GAAG,EAAE,CAAC;QACd,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACb,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC;QACL,CAAC;QACD,MAAM,CAAC,IAAI,CAAC;IAChB,CAAC;;IAEM,WAAM,GAAb,UAAc,GAAG;QACb,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAAC,MAAM,CAAC,EAAE,CAAC;QACvC,IAAI,CAAC,EACD,IAAI,GAAG,GAAG,CAAC,QAAQ,EACnB,SAAS,GAAG,EAAE,CAAC;QACnB,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACb,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC;oBAC7B,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,CAAC,CAAC;wBAC5B,SAAS,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC;oBACtG,CAAC;oBAAC,IAAI,CAAC,CAAC;wBACJ,SAAS,IAAI,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,cAAc,CAAC;oBAC9D,CAAC;gBACL,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,SAAS,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;gBAC9C,CAAC;YACL,CAAC;QACL,CAAC;QACD,MAAM,CAAC,SAAS,CAAC;IACrB,CAAC;IAED,iCAAkB,GAAlB,UAAmB,IAAI;QACnB,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IApxBM,UAAK,GAAW,KAAK,CAAC;IAEtB,iBAAY,GAAU;QACzB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,eAAe;QACrB,IAAI,EAAE,UAAU;QAChB,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,UAAU;KACnB,CAAC;IAEK,SAAI,GAAU;QAGjB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,iBAAiB;QAGzB,MAAM,EAAE,YAAY;QAGpB,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,yBAAyB;QACjC,MAAM,EAAE,wBAAwB;QAGhC,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,aAAa;QAGrB,MAAM,EAAE,kBAAkB;QAG1B,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,qBAAqB;QAG7B,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,qBAAqB;QAC7B,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,0BAA0B;QAClC,MAAM,EAAE,uBAAuB;QAC/B,MAAM,EAAE,uBAAuB;QAC/B,MAAM,EAAE,0BAA0B;QAClC,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,uBAAuB;QAC/B,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,0BAA0B;QAClC,MAAM,EAAE,sBAAsB;QAG9B,MAAM,EAAE,4BAA4B;QACpC,MAAM,EAAE,eAAe;KAC1B,CAAC;IAGK,aAAQ,GAAU;QACrB,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,4BAA4B;QACpC,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,2BAA2B;QACnC,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,qBAAqB;QAC7B,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,uBAAuB;QAC/B,MAAM,EAAE,6BAA6B;QACrC,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,YAAY;QACpB,MAAM,EAAE,uBAAuB;QAC/B,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,qBAAqB;QAC7B,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,MAAM;QACd,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,WAAW;KACtB,CAAC;IAEM,YAAO,GAAU;QACrB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,UAAU;QAClB,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,qBAAqB;QAC7B,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,qBAAqB;QAC7B,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,iBAAiB;KAC5B,CAAC;IAGM,iBAAY,GAAU;QAC1B,eAAe,EAAE;YACb,CAAC,EAAE,aAAa;YAChB,CAAC,EAAE,QAAQ;YACX,CAAC,EAAE,gBAAgB;YACnB,CAAC,EAAE,mBAAmB;YACtB,CAAC,EAAE,kBAAkB;YACrB,CAAC,EAAE,kBAAkB;YACrB,CAAC,EAAE,gBAAgB;YACnB,CAAC,EAAE,eAAe;YAClB,CAAC,EAAE,gBAAgB;SACtB;QACD,YAAY,EAAE;YACV,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,uBAAuB;YAC1B,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,WAAW;YACd,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,SAAS;YACZ,GAAG,EAAE,OAAO;SACf;QACD,WAAW,EAAE;YACT,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,UAAU;YACb,CAAC,EAAE,aAAa;YAChB,CAAC,EAAE,+BAA+B;YAClC,CAAC,EAAE,OAAO;YACV,CAAC,EAAE,cAAc;YACjB,EAAE,EAAE,gBAAgB;YACpB,EAAE,EAAE,OAAO;YACX,EAAE,EAAE,uCAAuC;YAC3C,EAAE,EAAE,wCAAwC;YAC5C,EAAE,EAAE,yCAAyC;YAC7C,EAAE,EAAE,qCAAqC;YACzC,EAAE,EAAE,kBAAkB;YACtB,EAAE,EAAE,kBAAkB;YACtB,EAAE,EAAE,kBAAkB;YACtB,EAAE,EAAE,KAAK;YACT,EAAE,EAAE,KAAK;YACT,EAAE,EAAE,KAAK;YACT,EAAE,EAAE,KAAK;YACT,EAAE,EAAE,qBAAqB;YACzB,GAAG,EAAE,OAAO;SACf;QACD,KAAK,EAAE;YACH,MAAM,EAAE,oBAAoB;YAC5B,MAAM,EAAE,aAAa;YACrB,MAAM,EAAE,kCAAkC;YAC1C,MAAM,EAAE,8BAA8B;YACtC,MAAM,EAAE,oCAAoC;YAC5C,MAAM,EAAE,+DAA+D;YACvE,MAAM,EAAE,2DAA2D;YACnE,MAAM,EAAE,2CAA2C;YACnD,MAAM,EAAE,+BAA+B;YACvC,MAAM,EAAE,wBAAwB;YAChC,MAAM,EAAE,mDAAmD;YAC3D,MAAM,EAAE,+CAA+C;YACvD,MAAM,EAAE,mBAAmB;YAC3B,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,gEAAgE;YACxE,MAAM,EAAE,4DAA4D;YACpE,MAAM,EAAE,4DAA4D;YACpE,MAAM,EAAE,uFAAuF;YAC/F,MAAM,EAAE,mFAAmF;YAC3F,MAAM,EAAE,gDAAgD;YACxD,MAAM,EAAE,2EAA2E;YACnF,MAAM,EAAE,uEAAuE;SAClF;QACD,aAAa,EAAE;YACX,CAAC,EAAE,aAAa;YAChB,CAAC,EAAE,4BAA4B;YAC/B,CAAC,EAAE,4BAA4B;YAC/B,CAAC,EAAE,8BAA8B;YACjC,CAAC,EAAE,8BAA8B;YACjC,CAAC,EAAE,kBAAkB;YACrB,CAAC,EAAE,gCAAgC;SACtC;QACD,gBAAgB,EAAE;YACd,CAAC,EAAE,UAAU;YACb,CAAC,EAAE,WAAW;YACd,CAAC,EAAE,UAAU;YACb,CAAC,EAAE,aAAa;SACnB;QACD,SAAS,EAAE;YACP,CAAC,EAAE,uBAAuB;SAC7B;QACD,cAAc,EAAE;YACZ,CAAC,EAAE,gBAAgB;YACnB,CAAC,EAAE,gBAAgB;SACtB;QACD,YAAY,EAAE;YACV,CAAC,EAAE,oBAAoB;YACvB,CAAC,EAAE,sBAAsB;SAC5B;QACD,WAAW,EAAE;YACT,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,aAAa;YAChB,CAAC,EAAE,cAAc;YACjB,CAAC,EAAE,eAAe;YAClB,CAAC,EAAE,gBAAgB;SACtB;QACD,QAAQ,EAAE;YACN,CAAC,EAAE,QAAQ;YACX,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,MAAM;SACZ;QACD,UAAU,EAAE;YACR,CAAC,EAAE,QAAQ;YACX,CAAC,EAAE,gBAAgB;YACnB,CAAC,EAAE,iBAAiB;SACvB;QACD,SAAS,EAAE;YACP,CAAC,EAAE,QAAQ;YACX,CAAC,EAAE,MAAM;YACT,CAAC,EAAE,MAAM;SACZ;QACD,oBAAoB,EAAE;YAClB,CAAC,EAAE,SAAS;YACZ,CAAC,EAAE,OAAO;YACV,CAAC,EAAE,YAAY;YACf,CAAC,EAAE,cAAc;SACpB;QACD,UAAU,EAAE;YACR,CAAC,EAAE,KAAK;SACX;QAED,UAAU,EAAE;YACR,CAAC,EAAE,EAAE;YACL,CAAC,EAAE,GAAG;YACN,CAAC,EAAE,IAAI;YACP,CAAC,EAAE,IAAI;YACP,CAAC,EAAE,GAAG;YACN,CAAC,EAAE,GAAG;YACN,CAAC,EAAE,GAAG;SACT;KACJ,CAAC;IA2eN,WAAC;AAAD,CAAC,AAxxBD,IAwxBC;AAxxBY,YAAI,OAwxBhB,CAAA"}
\ No newline at end of file
diff --git a/src/exif.ts b/src/exif.ts
index 456ef52c..8489116d 100644
--- a/src/exif.ts
+++ b/src/exif.ts
@@ -1,21 +1,41 @@
+export class Fraction extends Number {
+ numerator: number;
+ denominator: number;
+}
+
+
+export interface IImageExtended extends HTMLImageElement {
+ exifdata: any;
+ iptcdata: any;
+}
+
+// Console debug wrapper that makes code looks a little bit cleaner
+export class Debug {
+ public static log(...args: any[]) {
+ if (Exif.debug) {
+ console.log(args);
+ }
+ }
+}
+
export class Exif {
- static debug:boolean = false;
-
- static IptcFieldMap:Object = {
- 0x78: 'caption',
- 0x6E: 'credit',
- 0x19: 'keywords',
- 0x37: 'dateCreated',
- 0x50: 'byline',
- 0x55: 'bylineTitle',
- 0x7A: 'captionWriter',
- 0x69: 'headline',
- 0x74: 'copyright',
- 0x0F: 'category'
+ public static debug: boolean = false;
+
+ public static IptcFieldMap: any = {
+ 0x78: "caption",
+ 0x6E: "credit",
+ 0x19: "keywords",
+ 0x37: "dateCreated",
+ 0x50: "byline",
+ 0x55: "bylineTitle",
+ 0x7A: "captionWriter",
+ 0x69: "headline",
+ 0x74: "copyright",
+ 0x0F: "category"
};
- static Tags:Object = {
+ public static Tags: any = {
// version tags
0x9000: "ExifVersion", // EXIF version
@@ -87,12 +107,10 @@ export class Exif {
0xA40C: "SubjectDistanceRange", // Distance to subject
// other tags
- 0xA005: "InteroperabilityIFDPointer",
- 0xA420: "ImageUniqueID" // Identifier assigned uniquely to each image
+ 0xA005: "InteroperabilityIFDPointer", 0xA420: "ImageUniqueID" // Identifier assigned uniquely to each image
};
-
- static TiffTags:Object = {
+ public static TiffTags: any = {
0x0100: "ImageWidth",
0x0101: "ImageHeight",
0x8769: "ExifIFDPointer",
@@ -128,7 +146,7 @@ export class Exif {
0x8298: "Copyright"
};
- static GPSTags:Object = {
+ public static GPSTags: any = {
0x0000: "GPSVersionID",
0x0001: "GPSLatitudeRef",
0x0002: "GPSLatitude",
@@ -162,8 +180,7 @@ export class Exif {
0x001E: "GPSDifferential"
};
-
- static StringValues:Object = {
+ public static StringValues: any = {
ExposureProgram: {
0: "Not defined",
1: "Manual",
@@ -174,8 +191,7 @@ export class Exif {
6: "Action program",
7: "Portrait mode",
8: "Landscape mode"
- },
- MeteringMode: {
+ }, MeteringMode: {
0: "Unknown",
1: "Average",
2: "CenterWeightedAverage",
@@ -184,8 +200,7 @@ export class Exif {
5: "Pattern",
6: "Partial",
255: "Other"
- },
- LightSource: {
+ }, LightSource: {
0: "Unknown",
1: "Daylight",
2: "Fluorescent",
@@ -207,8 +222,7 @@ export class Exif {
23: "D50",
24: "ISO studio tungsten",
255: "Other"
- },
- Flash: {
+ }, Flash: {
0x0000: "Flash did not fire",
0x0001: "Flash fired",
0x0005: "Strobe return light not detected",
@@ -231,8 +245,7 @@ export class Exif {
0x0059: "Flash fired, auto mode, red-eye reduction mode",
0x005D: "Flash fired, auto mode, return light not detected, red-eye reduction mode",
0x005F: "Flash fired, auto mode, return light detected, red-eye reduction mode"
- },
- SensingMethod: {
+ }, SensingMethod: {
1: "Not defined",
2: "One-chip color area sensor",
3: "Two-chip color area sensor",
@@ -240,221 +253,178 @@ export class Exif {
5: "Color sequential area sensor",
7: "Trilinear sensor",
8: "Color sequential linear sensor"
- },
- SceneCaptureType: {
- 0: "Standard",
- 1: "Landscape",
- 2: "Portrait",
- 3: "Night scene"
- },
- SceneType: {
+ }, SceneCaptureType: {
+ 0: "Standard", 1: "Landscape", 2: "Portrait", 3: "Night scene"
+ }, SceneType: {
1: "Directly photographed"
- },
- CustomRendered: {
- 0: "Normal process",
- 1: "Custom process"
- },
- WhiteBalance: {
- 0: "Auto white balance",
- 1: "Manual white balance"
- },
- GainControl: {
- 0: "None",
- 1: "Low gain up",
- 2: "High gain up",
- 3: "Low gain down",
- 4: "High gain down"
- },
- Contrast: {
- 0: "Normal",
- 1: "Soft",
- 2: "Hard"
- },
- Saturation: {
- 0: "Normal",
- 1: "Low saturation",
- 2: "High saturation"
- },
- Sharpness: {
- 0: "Normal",
- 1: "Soft",
- 2: "Hard"
- },
- SubjectDistanceRange: {
- 0: "Unknown",
- 1: "Macro",
- 2: "Close view",
- 3: "Distant view"
- },
- FileSource: {
+ }, CustomRendered: {
+ 0: "Normal process", 1: "Custom process"
+ }, WhiteBalance: {
+ 0: "Auto white balance", 1: "Manual white balance"
+ }, GainControl: {
+ 0: "None", 1: "Low gain up", 2: "High gain up", 3: "Low gain down", 4: "High gain down"
+ }, Contrast: {
+ 0: "Normal", 1: "Soft", 2: "Hard"
+ }, Saturation: {
+ 0: "Normal", 1: "Low saturation", 2: "High saturation"
+ }, Sharpness: {
+ 0: "Normal", 1: "Soft", 2: "Hard"
+ }, SubjectDistanceRange: {
+ 0: "Unknown", 1: "Macro", 2: "Close view", 3: "Distant view"
+ }, FileSource: {
3: "DSC"
},
Components: {
- 0: "",
- 1: "Y",
- 2: "Cb",
- 3: "Cr",
- 4: "R",
- 5: "G",
- 6: "B"
+ 0: "", 1: "Y", 2: "Cb", 3: "Cr", 4: "R", 5: "G", 6: "B"
}
};
-
- static addEvent(element, event, handler) {
+ public static addEvent(element: EventTarget | any, event: string, handler: EventListener) {
if (element.addEventListener) {
element.addEventListener(event, handler, false);
- } else if (element.attachEvent) {
- element.attachEvent("on" + event, handler);
+ } else {
+ // Hello, IE!
+ if (element.attachEvent) {
+ element.attachEvent("on" + event, handler);
+ }
}
}
-
- static imageHasData(img) {
+ public static imageHasData(img: IImageExtended) {
return !!(img.exifdata);
}
-
- static base64ToArrayBuffer(base64, contentType?:any) {
- contentType = contentType || base64.match(/^data\:([^\;]+)\;base64,/mi)[1] || ''; // e.g. 'data:image/jpeg;base64,...' => 'image/jpeg'
- base64 = base64.replace(/^data\:([^\;]+)\;base64,/gmi, '');
- var binary = atob(base64);
- var len = binary.length;
- var buffer = new ArrayBuffer(len);
- var view = new Uint8Array(buffer);
- for (var i = 0; i < len; i++) {
+ public static base64ToArrayBuffer(base64: string, contentType?: string): ArrayBuffer {
+ // e.g. 'data:image/jpeg;base64,...' => 'image/jpeg'
+ contentType = contentType || base64.match(/^data:([^;]+);base64,/mi)[1] || "";
+ base64 = base64.replace(/^data:([^;]+);base64,/gmi, "");
+ let binary: string = atob(base64);
+ let len: number = binary.length;
+ let buffer: ArrayBuffer = new ArrayBuffer(len);
+ let view: Uint8Array = new Uint8Array(buffer);
+ for (let i = 0; i < len; i++) {
view[i] = binary.charCodeAt(i);
}
return buffer;
}
-
- static objectURLToBlob(url, callback) {
- var http = new XMLHttpRequest();
+ public static objectURLToBlob(url: string, callback: Function) {
+ let http: XMLHttpRequest = new XMLHttpRequest();
http.open("GET", url, true);
http.responseType = "blob";
- http.onload = function (e) {
- if (this.status == 200 || this.status === 0) {
- callback(this.response);
+ http.onload = function () {
+ if (this.status === 200 || this.status === 0) {
+ callback(http.response);
}
};
http.send();
}
-
- static getImageData(img, callback) {
- function handleBinaryFile(binFile) {
- var data = Exif.findEXIFinJPEG(binFile);
- var iptcdata = Exif.findIPTCinJPEG(binFile);
- img.exifdata = data || {};
- img.iptcdata = iptcdata || {};
+ public static getImageData(img: IImageExtended | Blob | File, callback: Function) {
+ function handleBinaryFile(binFile: ArrayBuffer) {
+ let data = Exif.findEXIFinJPEG(binFile);
+ let iptcdata = Exif.findIPTCinJPEG(binFile);
+ (img as IImageExtended).exifdata = data || {};
+ (img as IImageExtended).iptcdata = iptcdata || {};
if (callback) {
callback.call(img);
}
}
- if (img.src) {
- if (/^data\:/i.test(img.src)) { // Data URI
- var arrayBuffer = Exif.base64ToArrayBuffer(img.src);
+ if ("src" in img && (img as IImageExtended).src) {
+ if (/^data:/i.test((img as IImageExtended).src)) { // Data URI
+ let arrayBuffer = Exif.base64ToArrayBuffer((img as IImageExtended).src);
handleBinaryFile(arrayBuffer);
-
- } else if (/^blob\:/i.test(img.src)) { // Object URL
- var fileReader = new FileReader();
- fileReader.onload = function (e:any) {
- handleBinaryFile(e.target.result);
- };
- Exif.objectURLToBlob(img.src, function (blob) {
- fileReader.readAsArrayBuffer(blob);
- });
} else {
- var http = new XMLHttpRequest();
- http.onload = function () {
- if (this.status == 200 || this.status === 0) {
- handleBinaryFile(http.response);
- } else {
- throw "Could not load image";
- }
- http = null;
+ if (/^blob:/i.test((img as IImageExtended).src)) { // Object URL
+ let fileReader = new FileReader();
+ fileReader.onload = (e: any) => {
+ handleBinaryFile(e.target.result);
+ };
+ Exif.objectURLToBlob((img as IImageExtended).src, (blob: Blob) => {
+ fileReader.readAsArrayBuffer(blob);
+ });
+ } else {
+ let http = new XMLHttpRequest();
+ http.onload = function () {
+ if (this.status === 200 || this.status === 0) {
+ handleBinaryFile(http.response);
+ } else {
+ throw "Could not load image";
+ }
+ http = null;
+ };
+ http.open("GET", (img as IImageExtended).src, true);
+ http.responseType = "arraybuffer";
+ http.send(null);
+ }
+ }
+ } else {
+ if (FileReader && (img instanceof Blob || img instanceof File)) {
+ let fileReader = new FileReader();
+ fileReader.onload = function (e: any) {
+ Debug.log("Got file of length " + e.target.result.byteLength);
+ handleBinaryFile(e.target.result);
};
- http.open("GET", img.src, true);
- http.responseType = "arraybuffer";
- http.send(null);
+
+ fileReader.readAsArrayBuffer(img);
}
- } else if (FileReader && (img instanceof Blob || img instanceof File)) {
- var fileReader = new FileReader();
- fileReader.onload = function (e:any) {
- if (Exif.debug) console.log("Got file of length " + e.target.result.byteLength);
- handleBinaryFile(e.target.result);
- };
-
- fileReader.readAsArrayBuffer(img);
}
}
+ public static findEXIFinJPEG(file: ArrayBuffer) {
+ let dataView = new DataView(file);
- static findEXIFinJPEG(file) {
- var dataView = new DataView(file);
-
- if (Exif.debug) console.log("Got file of length " + file.byteLength);
- if ((dataView.getUint8(0) != 0xFF) || (dataView.getUint8(1) != 0xD8)) {
- if (Exif.debug) console.log("Not a valid JPEG");
+ Debug.log("Got file of length " + file.byteLength);
+ if ((dataView.getUint8(0) !== 0xFF) || (dataView.getUint8(1) !== 0xD8)) {
+ Debug.log("Not a valid JPEG");
return false; // not a valid jpeg
}
- var offset = 2,
- length = file.byteLength,
- marker;
+ let offset = 2;
+ let length: number = file.byteLength;
+ let marker: number;
while (offset < length) {
- if (dataView.getUint8(offset) != 0xFF) {
- if (Exif.debug) console.log("Not a valid marker at offset " + offset + ", found: " + dataView.getUint8(offset));
+ if (dataView.getUint8(offset) !== 0xFF) {
+ Debug.log("Not a valid marker at offset " + offset + ", found: " + dataView.getUint8(offset));
return false; // not a valid marker, something is wrong
}
marker = dataView.getUint8(offset + 1);
- if (Exif.debug) console.log(marker);
+ Debug.log(marker);
// we could implement handling for other markers here,
// but we're only looking for 0xFFE1 for EXIF data
-
- if (marker == 225) {
- if (Exif.debug) console.log("Found 0xFFE1 marker");
-
- return Exif.readEXIFData(dataView, offset + 4); //, dataView.getUint16(offset + 2) - 2);
-
+ if (marker === 225) {
+ Debug.log("Found 0xFFE1 marker");
+ return Exif.readEXIFData(dataView, offset + 4); // , dataView.getUint16(offset + 2) - 2);
// offset += 2 + file.getShortAt(offset+2, true);
} else {
offset += 2 + dataView.getUint16(offset + 2);
}
-
}
-
}
+ public static findIPTCinJPEG(file: ArrayBuffer) {
+ let dataView = new DataView(file);
- static findIPTCinJPEG(file) {
- var dataView = new DataView(file);
-
- if (Exif.debug) console.log("Got file of length " + file.byteLength);
- if ((dataView.getUint8(0) != 0xFF) || (dataView.getUint8(1) != 0xD8)) {
- if (Exif.debug) console.log("Not a valid JPEG");
+ Debug.log("Got file of length " + file.byteLength);
+ if ((dataView.getUint8(0) !== 0xFF) || (dataView.getUint8(1) !== 0xD8)) {
+ Debug.log("Not a valid JPEG");
return false; // not a valid jpeg
}
- var offset = 2,
- length = file.byteLength;
-
+ let offset = 2;
+ let length = file.byteLength;
- var isFieldSegmentStart = function (dataView, offset) {
+ let isFieldSegmentStart = function (_dataView: DataView, _offset: number) {
return (
- dataView.getUint8(offset) === 0x38 &&
- dataView.getUint8(offset + 1) === 0x42 &&
- dataView.getUint8(offset + 2) === 0x49 &&
- dataView.getUint8(offset + 3) === 0x4D &&
- dataView.getUint8(offset + 4) === 0x04 &&
- dataView.getUint8(offset + 5) === 0x04
+ _dataView.getUint8(_offset) === 0x38 && _dataView.getUint8(_offset + 1) === 0x42 && _dataView.getUint8(
+ _offset + 2) === 0x49 && _dataView.getUint8(_offset + 3) === 0x4D && _dataView.getUint8(
+ _offset + 4) === 0x04 && _dataView.getUint8(_offset + 5) === 0x04
);
};
@@ -463,22 +433,22 @@ export class Exif {
if (isFieldSegmentStart(dataView, offset)) {
// Get the length of the name header (which is padded to an even number of bytes)
- var nameHeaderLength = dataView.getUint8(offset + 7);
- if (nameHeaderLength % 2 !== 0) nameHeaderLength += 1;
+ let nameHeaderLength = dataView.getUint8(offset + 7);
+ if (nameHeaderLength % 2 !== 0) {
+ nameHeaderLength += 1;
+ }
// Check for pre photoshop 6 format
if (nameHeaderLength === 0) {
// Always 4
nameHeaderLength = 4;
}
- var startOffset = offset + 8 + nameHeaderLength;
- var sectionLength = dataView.getUint16(offset + 6 + nameHeaderLength);
+ let startOffset = offset + 8 + nameHeaderLength;
+ let sectionLength = dataView.getUint16(offset + 6 + nameHeaderLength);
return Exif.readIPTCData(file, startOffset, sectionLength);
-
}
-
// Not the marker, continue searching
offset++;
@@ -486,12 +456,11 @@ export class Exif {
}
-
- static readIPTCData(file, startOffset, sectionLength) {
- var dataView = new DataView(file);
- var data = {};
- var fieldValue, fieldName, dataSize, segmentType, segmentSize;
- var segmentStartPos = startOffset;
+ public static readIPTCData(file: ArrayBuffer, startOffset: number, sectionLength: number) {
+ let dataView = new DataView(file);
+ let data: any = {};
+ let fieldValue: any, fieldName: string, dataSize: number, segmentType: any, segmentSize: number;
+ let segmentStartPos = startOffset;
while (segmentStartPos < startOffset + sectionLength) {
if (dataView.getUint8(segmentStartPos) === 0x1C && dataView.getUint8(segmentStartPos + 1) === 0x02) {
segmentType = dataView.getUint8(segmentStartPos + 2);
@@ -505,51 +474,51 @@ export class Exif {
// Value already stored with this name, create multivalue field
if (data[fieldName] instanceof Array) {
data[fieldName].push(fieldValue);
- }
- else {
+ } else {
data[fieldName] = [data[fieldName], fieldValue];
}
- }
- else {
+ } else {
data[fieldName] = fieldValue;
}
}
-
}
segmentStartPos++;
}
return data;
}
+ public static readTags(file: DataView, tiffStart: number, dirStart: number, strings: string[],
+ bigEnd: boolean): Object {
+ let entries: number = file.getUint16(dirStart, !bigEnd);
+ let tags: any = {};
+ let entryOffset: number;
+ let tag: string;
- static readTags(file, tiffStart, dirStart, strings, bigEnd) {
- var entries = file.getUint16(dirStart, !bigEnd),
- tags = {},
- entryOffset, tag,
- i;
-
- for (i = 0; i < entries; i++) {
+ for (let i = 0; i < entries; i++) {
entryOffset = dirStart + i * 12 + 2;
tag = strings[file.getUint16(entryOffset, !bigEnd)];
- if (!tag && Exif.debug) console.log("Unknown tag: " + file.getUint16(entryOffset, !bigEnd));
+ if (!tag) {
+ Debug.log("Unknown tag: " + file.getUint16(entryOffset, !bigEnd));
+ }
tags[tag] = Exif.readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd);
}
return tags;
}
-
- static readTagValue(file, entryOffset, tiffStart, dirStart, bigEnd) {
- var type = file.getUint16(entryOffset + 2, !bigEnd),
- numValues = file.getUint32(entryOffset + 4, !bigEnd),
- valueOffset = file.getUint32(entryOffset + 8, !bigEnd) + tiffStart,
- offset,
- vals, val, n,
- numerator, denominator;
+ public static readTagValue(file: any, entryOffset: number, tiffStart: number, dirStart: number,
+ bigEnd: boolean): any {
+ let type: number = file.getUint16(entryOffset + 2, !bigEnd);
+ let numValues = file.getUint32(entryOffset + 4, !bigEnd);
+ let valueOffset = file.getUint32(entryOffset + 8, !bigEnd) + tiffStart;
+ let offset: number;
+ let vals: any[], val: any, n: number;
+ let numerator: any;
+ let denominator: any;
switch (type) {
case 1: // byte, 8-bit unsigned int
case 7: // undefined, 8-bit byte, value depending on field
- if (numValues == 1) {
+ if (numValues === 1) {
return file.getUint8(entryOffset + 8, !bigEnd);
} else {
offset = numValues > 4 ? valueOffset : (entryOffset + 8);
@@ -565,7 +534,7 @@ export class Exif {
return Exif.getStringFromDB(file, offset, numValues - 1);
case 3: // short, 16 bit int
- if (numValues == 1) {
+ if (numValues === 1) {
return file.getUint16(entryOffset + 8, !bigEnd);
} else {
offset = numValues > 2 ? valueOffset : (entryOffset + 8);
@@ -577,7 +546,7 @@ export class Exif {
}
case 4: // long, 32 bit int
- if (numValues == 1) {
+ if (numValues === 1) {
return file.getUint32(entryOffset + 8, !bigEnd);
} else {
vals = [];
@@ -588,10 +557,10 @@ export class Exif {
}
case 5: // rational = two long values, first is numerator, second is denominator
- if (numValues == 1) {
+ if (numValues === 1) {
numerator = file.getUint32(valueOffset, !bigEnd);
denominator = file.getUint32(valueOffset + 4, !bigEnd);
- val = new Number(numerator / denominator);
+ val = new Fraction(numerator / denominator);
val.numerator = numerator;
val.denominator = denominator;
return val;
@@ -600,7 +569,7 @@ export class Exif {
for (n = 0; n < numValues; n++) {
numerator = file.getUint32(valueOffset + 8 * n, !bigEnd);
denominator = file.getUint32(valueOffset + 4 + 8 * n, !bigEnd);
- vals[n] = new Number(numerator / denominator);
+ vals[n] = new Fraction(numerator / denominator);
vals[n].numerator = numerator;
vals[n].denominator = denominator;
}
@@ -608,7 +577,7 @@ export class Exif {
}
case 9: // slong, 32 bit signed int
- if (numValues == 1) {
+ if (numValues === 1) {
return file.getInt32(entryOffset + 8, !bigEnd);
} else {
vals = [];
@@ -619,58 +588,59 @@ export class Exif {
}
case 10: // signed rational, two slongs, first is numerator, second is denominator
- if (numValues == 1) {
+ if (numValues === 1) {
return file.getInt32(valueOffset, !bigEnd) / file.getInt32(valueOffset + 4, !bigEnd);
} else {
vals = [];
for (n = 0; n < numValues; n++) {
- vals[n] = file.getInt32(valueOffset + 8 * n, !bigEnd) / file.getInt32(valueOffset + 4 + 8 * n, !bigEnd);
+ vals[n] = file.getInt32(valueOffset + 8 * n, !bigEnd) / file.getInt32(valueOffset + 4 + 8 * n,
+ !bigEnd);
}
return vals;
}
+ default:
+ break;
}
}
-
- static getStringFromDB(buffer, start, length) {
- var outstr = "";
- for (var n = start; n < start + length; n++) {
+ public static getStringFromDB(buffer: DataView, start: number, length: number): string {
+ let outstr = "";
+ for (let n = start; n < start + length; n++) {
outstr += String.fromCharCode(buffer.getUint8(n));
}
return outstr;
}
+ public static readEXIFData(file: DataView, start: number): any {
+ if (Exif.getStringFromDB(file, start, 4) !== "Exif") {
+ Debug.log("Not valid EXIF data! " + Exif.getStringFromDB(file, start, 4));
- static readEXIFData(file, start) {
- if (Exif.getStringFromDB(file, start, 4) != "Exif") {
- if (Exif.debug) console.log("Not valid EXIF data! " + Exif.getStringFromDB(file, start, 4));
return false;
}
- var bigEnd,
- tags, tag,
- exifData, gpsData,
- tiffOffset = start + 6;
+ let bigEnd: boolean, tags: any, tag: string, exifData: any, gpsData: any, tiffOffset: number = start + 6;
// test for TIFF validity and endianness
- if (file.getUint16(tiffOffset) == 0x4949) {
+ if (file.getUint16(tiffOffset) === 0x4949) {
bigEnd = false;
- } else if (file.getUint16(tiffOffset) == 0x4D4D) {
- bigEnd = true;
} else {
- if (Exif.debug) console.log("Not valid TIFF data! (no 0x4949 or 0x4D4D)");
- return false;
+ if (file.getUint16(tiffOffset) === 0x4D4D) {
+ bigEnd = true;
+ } else {
+ Debug.log("Not valid TIFF data! (no 0x4949 or 0x4D4D)");
+ return false;
+ }
}
- if (file.getUint16(tiffOffset + 2, !bigEnd) != 0x002A) {
- if (Exif.debug) console.log("Not valid TIFF data! (no 0x002A)");
+ if (file.getUint16(tiffOffset + 2, !bigEnd) !== 0x002A) {
+ Debug.log("Not valid TIFF data! (no 0x002A)");
return false;
}
- var firstIFDOffset = file.getUint32(tiffOffset + 4, !bigEnd);
+ let firstIFDOffset = file.getUint32(tiffOffset + 4, !bigEnd);
if (firstIFDOffset < 0x00000008) {
- if (Exif.debug) console.log("Not valid TIFF data! (First offset less than 8)", file.getUint32(tiffOffset + 4, !bigEnd));
+ Debug.log("Not valid TIFF data! (First offset less than 8)", file.getUint32(tiffOffset + 4, !bigEnd));
return false;
}
@@ -679,66 +649,69 @@ export class Exif {
if (tags.ExifIFDPointer) {
exifData = Exif.readTags(file, tiffOffset, tiffOffset + tags.ExifIFDPointer, Exif.Tags, bigEnd);
for (tag in exifData) {
- switch (tag) {
- case "LightSource" :
- case "Flash" :
- case "MeteringMode" :
- case "ExposureProgram" :
- case "SensingMethod" :
- case "SceneCaptureType" :
- case "SceneType" :
- case "CustomRendered" :
- case "WhiteBalance" :
- case "GainControl" :
- case "Contrast" :
- case "Saturation" :
- case "Sharpness" :
- case "SubjectDistanceRange" :
- case "FileSource" :
- exifData[tag] = Exif.StringValues[tag][exifData[tag]];
- break;
-
- case "ExifVersion" :
- case "FlashpixVersion" :
- exifData[tag] = String.fromCharCode(exifData[tag][0], exifData[tag][1], exifData[tag][2], exifData[tag][3]);
- break;
-
- case "ComponentsConfiguration" :
- exifData[tag] =
- Exif.StringValues['Components'][exifData[tag][0]] +
- Exif.StringValues['Components'][exifData[tag][1]] +
- Exif.StringValues['Components'][exifData[tag][2]] +
- Exif.StringValues['Components'][exifData[tag][3]];
- break;
+ if ({}.hasOwnProperty.call(exifData, tag)) {
+ switch (tag) {
+ case "LightSource" :
+ case "Flash" :
+ case "MeteringMode" :
+ case "ExposureProgram" :
+ case "SensingMethod" :
+ case "SceneCaptureType" :
+ case "SceneType" :
+ case "CustomRendered" :
+ case "WhiteBalance" :
+ case "GainControl" :
+ case "Contrast" :
+ case "Saturation" :
+ case "Sharpness" :
+ case "SubjectDistanceRange" :
+ case "FileSource" :
+ exifData[tag] = Exif.StringValues[tag][exifData[tag]];
+ break;
+ case "ExifVersion" :
+ case "FlashpixVersion" :
+ exifData[tag] = String.fromCharCode(exifData[tag][0], exifData[tag][1], exifData[tag][2],
+ exifData[tag][3]);
+ break;
+ case "ComponentsConfiguration" :
+ let compopents = "Components";
+ exifData[tag] = Exif.StringValues[compopents][exifData[tag][0]] + Exif.StringValues[compopents][exifData[tag][1]] + Exif.StringValues[compopents][exifData[tag][2]] + Exif.StringValues[compopents][exifData[tag][3]];
+ break;
+ default:
+ break;
+ }
+ tags[tag] = exifData[tag];
}
- tags[tag] = exifData[tag];
}
}
if (tags.GPSInfoIFDPointer) {
gpsData = Exif.readTags(file, tiffOffset, tiffOffset + tags.GPSInfoIFDPointer, Exif.GPSTags, bigEnd);
for (tag in gpsData) {
- switch (tag) {
- case "GPSVersionID" :
- gpsData[tag] = gpsData[tag][0] +
- "." + gpsData[tag][1] +
- "." + gpsData[tag][2] +
- "." + gpsData[tag][3];
- break;
+ if ({}.hasOwnProperty.call(gpsData, tag)) {
+ switch (tag) {
+ case "GPSVersionID" :
+ gpsData[tag] = gpsData[tag][0] + "." + gpsData[tag][1] + "." + gpsData[tag][2] + "." + gpsData[tag][3];
+ break;
+ default:
+ break;
+ }
+ tags[tag] = gpsData[tag];
}
- tags[tag] = gpsData[tag];
}
}
return tags;
}
- static getData(img:any, callback:Function) {
+ public static getData(img: IImageExtended | HTMLImageElement, callback: Function) {
- if ((img instanceof Image || img instanceof HTMLImageElement) && !img.complete) return false;
+ if ((img instanceof Image || img instanceof HTMLImageElement) && !img.complete) {
+ return false;
+ }
- if (!Exif.imageHasData(img)) {
- Exif.getImageData(img, callback);
+ if (!Exif.imageHasData((img as IImageExtended))) {
+ Exif.getImageData((img as IImageExtended), callback);
} else {
if (callback) {
callback.call(img);
@@ -747,16 +720,18 @@ export class Exif {
return true;
}
- static getTag(img, tag) {
- if (!Exif.imageHasData(img)) return;
+ public static getTag(img: any, tag: string) {
+ if (!Exif.imageHasData(img)) {
+ return;
+ }
return img.exifdata[tag];
};
- static getAllTags(img) {
- if (!Exif.imageHasData(img)) return {};
- var a,
- data = img.exifdata,
- tags = {};
+ public static getAllTags(img: any) {
+ if (!Exif.imageHasData(img)) {
+ return {};
+ }
+ let a: string, data: any = img.exifdata, tags: any = {};
for (a in data) {
if (data.hasOwnProperty(a)) {
tags[a] = data[a];
@@ -765,29 +740,28 @@ export class Exif {
return tags;
};
- static pretty(img) {
- if (!Exif.imageHasData(img)) return "";
- var a,
- data = img.exifdata,
- strPretty = "";
+ public static pretty(img: IImageExtended) {
+ if (!Exif.imageHasData(img)) {
+ return "";
+ }
+ let a: any, data: any = img.exifdata, strPretty = "";
for (a in data) {
if (data.hasOwnProperty(a)) {
- if (typeof data[a] == "object") {
+ if (typeof data[a] === "object") {
if (data[a] instanceof Number) {
- strPretty += a + " : " + data[a] + " [" + data[a].numerator + "/" + data[a].denominator + "]\r\n";
+ strPretty += `${a} : ${data[a]} [${data[a].numerator}/${data[a].denominator}]\r\n`;
} else {
- strPretty += a + " : [" + data[a].length + " values]\r\n";
+ strPretty += `${a} : [${data[a].length} values]\r\n`;
}
} else {
- strPretty += a + " : " + data[a] + "\r\n";
+ strPretty += `${a} : ${data[a]}\r\n`;
}
}
}
return strPretty;
}
- readFromBinaryFile(file) {
+ public static readFromBinaryFile(file: ArrayBuffer) {
return Exif.findEXIFinJPEG(file);
}
-
-}
\ No newline at end of file
+}
diff --git a/src/imageCropper.d.ts b/src/imageCropper.d.ts
deleted file mode 100644
index f1046eb9..00000000
--- a/src/imageCropper.d.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-import { Point } from './model/point';
-import { Bounds } from './model/bounds';
-import { ImageCropperModel } from "./model/imageCropperModel";
-import { CropperSettings } from "./cropperSettings";
-export declare class ImageCropper extends ImageCropperModel {
- private crop;
- private cropperSettings;
- private previousDistance;
- constructor(cropperSettings: CropperSettings);
- static sign(x: any): any;
- static getMousePos(canvas: any, evt: any): Point;
- static getTouchPos(canvas: any, touch: any): Point;
- static detectVerticalSquash(img: any): number;
- prepare(canvas: HTMLCanvasElement): void;
- resizeCanvas(width: any, height: any): void;
- draw(ctx: any): void;
- dragCrop(x: any, y: any, marker: any): void;
- enforceMinSize(x: any, y: any, marker: any): Point;
- dragCorner(x: any, y: any, marker: any): void;
- getSide(a: any, b: any, c: any): any;
- handleRelease(newCropTouch: any): void;
- handleMove(newCropTouch: any): void;
- updateClampBounds(): void;
- getCropBounds(): Bounds;
- clampPosition(x: any, y: any): Point;
- isImageSet(): boolean;
- setImage(img: any): void;
- getCroppedImage(fillWidth?: number, fillHeight?: number): HTMLImageElement;
- getBounds(): Bounds;
- setBounds(bounds: any): void;
- onTouchMove(event: TouchEvent): void;
- onMouseMove(e: any): void;
- move(cropTouch: any): void;
- getDragTouchForID(id: any): any;
- drawCursors(cropTouch: any): void;
- drawCornerCursor(marker: any, x: any, y: any): boolean;
- onTouchStart(event: TouchEvent): void;
- onTouchEnd(event: TouchEvent): void;
- drawImageIOSFix(ctx: any, img: any, sx: any, sy: any, sw: any, sh: any, dx: any, dy: any, dw: any, dh: any): void;
- onMouseDown(): void;
- onMouseUp(): void;
-}
diff --git a/src/imageCropper.js b/src/imageCropper.js
deleted file mode 100644
index eab90ebc..00000000
--- a/src/imageCropper.js
+++ /dev/null
@@ -1,877 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var pointPool_1 = require('./model/pointPool');
-var bounds_1 = require('./model/bounds');
-var cornerMarker_1 = require('./model/cornerMarker');
-var dragMarker_1 = require('./model/dragMarker');
-var cropTouch_1 = require('./model/cropTouch');
-var imageCropperModel_1 = require("./model/imageCropperModel");
-var imageCropperDataShare_1 = require("./imageCropperDataShare");
-var ImageCropper = (function (_super) {
- __extends(ImageCropper, _super);
- function ImageCropper(cropperSettings) {
- _super.call(this);
- var x = 0;
- var y = 0;
- var width = cropperSettings.width;
- var height = cropperSettings.height;
- var keepAspect = cropperSettings.keepAspect;
- var touchRadius = cropperSettings.touchRadius;
- var minWidth = cropperSettings.minWidth;
- var minHeight = cropperSettings.minHeight;
- var croppedWidth = cropperSettings.croppedWidth;
- var croppedHeight = cropperSettings.croppedHeight;
- this.cropperSettings = cropperSettings;
- this.crop = this;
- this.x = x;
- this.y = y;
- if (width === void 0) {
- this.width = 100;
- }
- if (height === void 0) {
- this.height = 50;
- }
- if (keepAspect === void 0) {
- this.keepAspect = true;
- }
- if (touchRadius === void 0) {
- this.touchRadius = 20;
- }
- this.minWidth = minWidth;
- this.minHeight = minHeight;
- this.keepAspect = false;
- this.aspectRatio = 0;
- this.currentDragTouches = [];
- this.isMouseDown = false;
- this.ratioW = 1;
- this.ratioH = 1;
- this.fileType = 'png';
- this.imageSet = false;
- this.pointPool = new pointPool_1.PointPool(200);
- this.tl = new cornerMarker_1.CornerMarker(x, y, touchRadius, this.cropperSettings);
- this.tr = new cornerMarker_1.CornerMarker(x + width, y, touchRadius, this.cropperSettings);
- this.bl = new cornerMarker_1.CornerMarker(x, y + height, touchRadius, this.cropperSettings);
- this.br = new cornerMarker_1.CornerMarker(x + width, y + height, touchRadius, this.cropperSettings);
- this.tl.addHorizontalNeighbour(this.tr);
- this.tl.addVerticalNeighbour(this.bl);
- this.tr.addHorizontalNeighbour(this.tl);
- this.tr.addVerticalNeighbour(this.br);
- this.bl.addHorizontalNeighbour(this.br);
- this.bl.addVerticalNeighbour(this.tl);
- this.br.addHorizontalNeighbour(this.bl);
- this.br.addVerticalNeighbour(this.tr);
- this.markers = [this.tl, this.tr, this.bl, this.br];
- this.center = new dragMarker_1.DragMarker(x + (width / 2), y + (height / 2), touchRadius, this.cropperSettings);
- this.keepAspect = keepAspect;
- this.aspectRatio = height / width;
- this.croppedImage = new Image();
- this.currentlyInteracting = false;
- this.cropWidth = croppedWidth;
- this.cropHeight = croppedHeight;
- }
- ImageCropper.sign = function (x) {
- if (+x === x) {
- return (x === 0) ? x : (x > 0) ? 1 : -1;
- }
- return NaN;
- };
- ImageCropper.getMousePos = function (canvas, evt) {
- var rect = canvas.getBoundingClientRect();
- return pointPool_1.PointPool.instance.borrow(evt.clientX - rect.left, evt.clientY - rect.top);
- };
- ImageCropper.getTouchPos = function (canvas, touch) {
- var rect = canvas.getBoundingClientRect();
- return pointPool_1.PointPool.instance.borrow(touch.clientX - rect.left, touch.clientY - rect.top);
- };
- ImageCropper.detectVerticalSquash = function (img) {
- var ih = img.height;
- var canvas = document.createElement('canvas');
- canvas.width = 1;
- canvas.height = ih;
- var ctx = canvas.getContext('2d');
- ctx.drawImage(img, 0, 0);
- var data = ctx.getImageData(0, 0, 1, ih).data;
- var sy = 0;
- var ey = ih;
- var py = ih;
- while (py > sy) {
- var alpha = data[(py - 1) * 4 + 3];
- if (alpha === 0) {
- ey = py;
- }
- else {
- sy = py;
- }
- py = (ey + sy) >> 1;
- }
- var ratio = (py / ih);
- return (ratio === 0) ? 1 : ratio;
- };
- ImageCropper.prototype.prepare = function (canvas) {
- this.buffer = document.createElement('canvas');
- this.cropCanvas = document.createElement('canvas');
- this.cropCanvas.width = this.cropWidth;
- this.cropCanvas.height = this.cropHeight;
- this.buffer.width = canvas.width;
- this.buffer.height = canvas.height;
- this.canvas = canvas;
- this.ctx = this.canvas.getContext("2d");
- this.draw(this.ctx);
- };
- ImageCropper.prototype.resizeCanvas = function (width, height) {
- this.canvas.width = width;
- this.canvas.height = height;
- this.buffer.width = width;
- this.buffer.height = height;
- this.draw(this.ctx);
- };
- ImageCropper.prototype.draw = function (ctx) {
- var bounds = this.getBounds();
- if (this.srcImage) {
- ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
- var sourceAspect = this.srcImage.height / this.srcImage.width;
- var canvasAspect = this.canvasHeight / this.canvasWidth;
- var w = this.canvasWidth;
- var h = this.canvasHeight;
- if (canvasAspect > sourceAspect) {
- w = this.canvasWidth;
- h = this.canvasWidth * sourceAspect;
- }
- else {
- h = this.canvasHeight;
- w = this.canvasHeight / sourceAspect;
- }
- this.ratioW = w / this.srcImage.width;
- this.ratioH = h / this.srcImage.height;
- if (canvasAspect < sourceAspect) {
- this.drawImageIOSFix(ctx, this.srcImage, 0, 0, this.srcImage.width, this.srcImage.height, this.buffer.width / 2 - w / 2, 0, w, h);
- }
- else {
- this.drawImageIOSFix(ctx, this.srcImage, 0, 0, this.srcImage.width, this.srcImage.height, 0, this.buffer.height / 2 - h / 2, w, h);
- }
- this.buffer.getContext('2d').drawImage(this.canvas, 0, 0, this.canvasWidth, this.canvasHeight);
- ctx.lineWidth = this.cropperSettings.cropperDrawSettings.strokeWidth;
- ctx.strokeStyle = this.cropperSettings.cropperDrawSettings.strokeColor;
- if (!this.cropperSettings.rounded) {
- ctx.fillStyle = "rgba(0, 0, 0, 0.6)";
- ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
- ctx.drawImage(this.buffer, bounds.left, bounds.top, Math.max(bounds.getWidth(), 1), Math.max(bounds.getHeight(), 1), bounds.left, bounds.top, bounds.getWidth(), bounds.getHeight());
- ctx.strokeRect(bounds.left, bounds.top, bounds.getWidth(), bounds.getHeight());
- }
- else {
- ctx.beginPath();
- ctx.arc(bounds.left + bounds.getWidth() / 2, bounds.top + bounds.getHeight() / 2, bounds.getWidth() / 2, 0, Math.PI * 2, true);
- ctx.closePath();
- ctx.stroke();
- }
- var marker;
- for (var i = 0; i < this.markers.length; i++) {
- marker = this.markers[i];
- marker.draw(ctx);
- }
- this.center.draw(ctx);
- }
- else {
- ctx.fillStyle = 'rgba(192,192,192,1)';
- ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
- }
- };
- ImageCropper.prototype.dragCrop = function (x, y, marker) {
- var bounds = this.getBounds();
- var left = x - (bounds.getWidth() / 2);
- var right = x + (bounds.getWidth() / 2);
- var top = y - (bounds.getHeight() / 2);
- var bottom = y + (bounds.getHeight() / 2);
- if (right >= this.maxXClamp) {
- x = this.maxXClamp - bounds.getWidth() / 2;
- }
- if (left <= this.minXClamp) {
- x = bounds.getWidth() / 2 + this.minXClamp;
- }
- if (top < this.minYClamp) {
- y = bounds.getHeight() / 2 + this.minYClamp;
- }
- if (bottom >= this.maxYClamp) {
- y = this.maxYClamp - bounds.getHeight() / 2;
- }
- this.tl.moveX(x - (bounds.getWidth() / 2));
- this.tl.moveY(y - (bounds.getHeight() / 2));
- this.tr.moveX(x + (bounds.getWidth() / 2));
- this.tr.moveY(y - (bounds.getHeight() / 2));
- this.bl.moveX(x - (bounds.getWidth() / 2));
- this.bl.moveY(y + (bounds.getHeight() / 2));
- this.br.moveX(x + (bounds.getWidth() / 2));
- this.br.moveY(y + (bounds.getHeight() / 2));
- marker.setPosition(x, y);
- };
- ImageCropper.prototype.enforceMinSize = function (x, y, marker) {
- var xLength = x - marker.getHorizontalNeighbour().getPosition().x;
- var yLength = y - marker.getVerticalNeighbour().getPosition().y;
- var xOver = this.minWidth - Math.abs(xLength);
- var yOver = this.minHeight - Math.abs(yLength);
- if (xLength == 0 || yLength == 0) {
- x = marker.getPosition().x;
- y = marker.getPosition().y;
- return pointPool_1.PointPool.instance.borrow(x, y);
- }
- if (this.keepAspect) {
- if (xOver > 0 && (yOver / this.aspectRatio) > 0) {
- if (xOver > (yOver / this.aspectRatio)) {
- if (xLength < 0) {
- x -= xOver;
- if (yLength < 0) {
- y -= xOver * this.aspectRatio;
- }
- else {
- y += xOver * this.aspectRatio;
- }
- }
- else {
- x += xOver;
- if (yLength < 0) {
- y -= xOver * this.aspectRatio;
- }
- else {
- y += xOver * this.aspectRatio;
- }
- }
- }
- else {
- if (yLength < 0) {
- y -= yOver;
- if (xLength < 0) {
- x -= yOver / this.aspectRatio;
- }
- else {
- x += yOver / this.aspectRatio;
- }
- }
- else {
- y += yOver;
- if (xLength < 0) {
- x -= yOver / this.aspectRatio;
- }
- else {
- x += yOver / this.aspectRatio;
- }
- }
- }
- }
- else {
- if (xOver > 0) {
- if (xLength < 0) {
- x -= xOver;
- if (yLength < 0) {
- y -= xOver * this.aspectRatio;
- }
- else {
- y += xOver * this.aspectRatio;
- }
- }
- else {
- x += xOver;
- if (yLength < 0) {
- y -= xOver * this.aspectRatio;
- }
- else {
- y += xOver * this.aspectRatio;
- }
- }
- }
- else if (yOver > 0) {
- if (yLength < 0) {
- y -= yOver;
- if (xLength < 0) {
- x -= yOver / this.aspectRatio;
- }
- else {
- x += yOver / this.aspectRatio;
- }
- }
- else {
- y += yOver;
- if (xLength < 0) {
- x -= yOver / this.aspectRatio;
- }
- else {
- x += yOver / this.aspectRatio;
- }
- }
- }
- }
- }
- else {
- if (xOver > 0) {
- if (xLength < 0) {
- x -= xOver;
- }
- else {
- x += xOver;
- }
- }
- if (yOver > 0) {
- if (yLength < 0) {
- y -= yOver;
- }
- else {
- y += yOver;
- }
- }
- }
- if (x < this.minXClamp || x > this.maxXClamp || y < this.minYClamp || y > this.maxYClamp) {
- x = marker.getPosition().x;
- y = marker.getPosition().y;
- }
- return pointPool_1.PointPool.instance.borrow(x, y);
- };
- ImageCropper.prototype.dragCorner = function (x, y, marker) {
- var iX = 0;
- var iY = 0;
- var ax = 0;
- var ay = 0;
- var newHeight = 0;
- var newWidth = 0;
- var newY = 0;
- var newX = 0;
- var anchorMarker;
- var fold = 0;
- if (this.keepAspect) {
- anchorMarker = marker.getHorizontalNeighbour().getVerticalNeighbour();
- ax = anchorMarker.getPosition().x;
- ay = anchorMarker.getPosition().y;
- if (x <= anchorMarker.getPosition().x) {
- if (y <= anchorMarker.getPosition().y) {
- iX = ax - (100 / this.aspectRatio);
- iY = ay - (100 / this.aspectRatio * this.aspectRatio);
- fold = this.getSide(pointPool_1.PointPool.instance.borrow(iX, iY), anchorMarker.getPosition(), pointPool_1.PointPool.instance.borrow(x, y));
- if (fold > 0) {
- newHeight = Math.abs(anchorMarker.getPosition().y - y);
- newWidth = newHeight / this.aspectRatio;
- newY = anchorMarker.getPosition().y - newHeight;
- newX = anchorMarker.getPosition().x - newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
- marker.move(min.x, min.y);
- pointPool_1.PointPool.instance.returnPoint(min);
- }
- else if (fold < 0) {
- newWidth = Math.abs(anchorMarker.getPosition().x - x);
- newHeight = newWidth * this.aspectRatio;
- newY = anchorMarker.getPosition().y - newHeight;
- newX = anchorMarker.getPosition().x - newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
- marker.move(min.x, min.y);
- pointPool_1.PointPool.instance.returnPoint(min);
- }
- }
- else {
- iX = ax - (100 / this.aspectRatio);
- iY = ay + (100 / this.aspectRatio * this.aspectRatio);
- fold = this.getSide(pointPool_1.PointPool.instance.borrow(iX, iY), anchorMarker.getPosition(), pointPool_1.PointPool.instance.borrow(x, y));
- if (fold > 0) {
- newWidth = Math.abs(anchorMarker.getPosition().x - x);
- newHeight = newWidth * this.aspectRatio;
- newY = anchorMarker.getPosition().y + newHeight;
- newX = anchorMarker.getPosition().x - newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
- marker.move(min.x, min.y);
- pointPool_1.PointPool.instance.returnPoint(min);
- }
- else if (fold < 0) {
- newHeight = Math.abs(anchorMarker.getPosition().y - y);
- newWidth = newHeight / this.aspectRatio;
- newY = anchorMarker.getPosition().y + newHeight;
- newX = anchorMarker.getPosition().x - newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
- marker.move(min.x, min.y);
- pointPool_1.PointPool.instance.returnPoint(min);
- }
- }
- }
- else {
- if (y <= anchorMarker.getPosition().y) {
- iX = ax + (100 / this.aspectRatio);
- iY = ay - (100 / this.aspectRatio * this.aspectRatio);
- fold = this.getSide(pointPool_1.PointPool.instance.borrow(iX, iY), anchorMarker.getPosition(), pointPool_1.PointPool.instance.borrow(x, y));
- if (fold < 0) {
- newHeight = Math.abs(anchorMarker.getPosition().y - y);
- newWidth = newHeight / this.aspectRatio;
- newY = anchorMarker.getPosition().y - newHeight;
- newX = anchorMarker.getPosition().x + newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
- marker.move(min.x, min.y);
- pointPool_1.PointPool.instance.returnPoint(min);
- }
- else if (fold > 0) {
- newWidth = Math.abs(anchorMarker.getPosition().x - x);
- newHeight = newWidth * this.aspectRatio;
- newY = anchorMarker.getPosition().y - newHeight;
- newX = anchorMarker.getPosition().x + newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
- marker.move(min.x, min.y);
- pointPool_1.PointPool.instance.returnPoint(min);
- }
- }
- else {
- iX = ax + (100 / this.aspectRatio);
- iY = ay + (100 / this.aspectRatio * this.aspectRatio);
- fold = this.getSide(pointPool_1.PointPool.instance.borrow(iX, iY), anchorMarker.getPosition(), pointPool_1.PointPool.instance.borrow(x, y));
- if (fold < 0) {
- newWidth = Math.abs(anchorMarker.getPosition().x - x);
- newHeight = newWidth * this.aspectRatio;
- newY = anchorMarker.getPosition().y + newHeight;
- newX = anchorMarker.getPosition().x + newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
- marker.move(min.x, min.y);
- pointPool_1.PointPool.instance.returnPoint(min);
- }
- else if (fold > 0) {
- newHeight = Math.abs(anchorMarker.getPosition().y - y);
- newWidth = newHeight / this.aspectRatio;
- newY = anchorMarker.getPosition().y + newHeight;
- newX = anchorMarker.getPosition().x + newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
- marker.move(min.x, min.y);
- pointPool_1.PointPool.instance.returnPoint(min);
- }
- }
- }
- }
- else {
- var min = this.enforceMinSize(x, y, marker);
- marker.move(min.x, min.y);
- pointPool_1.PointPool.instance.returnPoint(min);
- }
- this.center.recalculatePosition(this.getBounds());
- };
- ImageCropper.prototype.getSide = function (a, b, c) {
- var n = ImageCropper.sign((b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x));
- pointPool_1.PointPool.instance.returnPoint(a);
- pointPool_1.PointPool.instance.returnPoint(c);
- return n;
- };
- ImageCropper.prototype.handleRelease = function (newCropTouch) {
- if (newCropTouch == null) {
- return;
- }
- var index = 0;
- for (var k = 0; k < this.currentDragTouches.length; k++) {
- if (newCropTouch.id == this.currentDragTouches[k].id) {
- this.currentDragTouches[k].dragHandle.setDrag(false);
- newCropTouch.dragHandle = null;
- index = k;
- }
- }
- this.currentDragTouches.splice(index, 1);
- this.draw(this.ctx);
- };
- ImageCropper.prototype.handleMove = function (newCropTouch) {
- var matched = false;
- for (var k = 0; k < this.currentDragTouches.length; k++) {
- if (newCropTouch.id == this.currentDragTouches[k].id && this.currentDragTouches[k].dragHandle != null) {
- var dragTouch = this.currentDragTouches[k];
- var clampedPositions = this.clampPosition(newCropTouch.x - dragTouch.dragHandle.offset.x, newCropTouch.y - dragTouch.dragHandle.offset.y);
- newCropTouch.x = clampedPositions.x;
- newCropTouch.y = clampedPositions.y;
- pointPool_1.PointPool.instance.returnPoint(clampedPositions);
- if (dragTouch.dragHandle instanceof cornerMarker_1.CornerMarker) {
- this.dragCorner(newCropTouch.x, newCropTouch.y, dragTouch.dragHandle);
- }
- else {
- this.dragCrop(newCropTouch.x, newCropTouch.y, dragTouch.dragHandle);
- }
- this.currentlyInteracting = true;
- matched = true;
- imageCropperDataShare_1.ImageCropperDataShare.setPressed(this.canvas);
- break;
- }
- }
- if (!matched) {
- for (var i = 0; i < this.markers.length; i++) {
- var marker = this.markers[i];
- if (marker.touchInBounds(newCropTouch.x, newCropTouch.y)) {
- newCropTouch.dragHandle = marker;
- this.currentDragTouches.push(newCropTouch);
- marker.setDrag(true);
- newCropTouch.dragHandle.offset.x = newCropTouch.x - newCropTouch.dragHandle.getPosition().x;
- newCropTouch.dragHandle.offset.y = newCropTouch.y - newCropTouch.dragHandle.getPosition().y;
- this.dragCorner(newCropTouch.x - newCropTouch.dragHandle.offset.x, newCropTouch.y - newCropTouch.dragHandle.offset.y, newCropTouch.dragHandle);
- break;
- }
- }
- if (newCropTouch.dragHandle == null) {
- if (this.center.touchInBounds(newCropTouch.x, newCropTouch.y)) {
- newCropTouch.dragHandle = this.center;
- this.currentDragTouches.push(newCropTouch);
- newCropTouch.dragHandle.setDrag(true);
- newCropTouch.dragHandle.offset.x = newCropTouch.x - newCropTouch.dragHandle.getPosition().x;
- newCropTouch.dragHandle.offset.y = newCropTouch.y - newCropTouch.dragHandle.getPosition().y;
- this.dragCrop(newCropTouch.x - newCropTouch.dragHandle.offset.x, newCropTouch.y - newCropTouch.dragHandle.offset.y, newCropTouch.dragHandle);
- }
- }
- }
- };
- ImageCropper.prototype.updateClampBounds = function () {
- var sourceAspect = this.srcImage.height / this.srcImage.width;
- var canvasAspect = this.canvas.height / this.canvas.width;
- var w = this.canvas.width;
- var h = this.canvas.height;
- if (canvasAspect > sourceAspect) {
- w = this.canvas.width;
- h = this.canvas.width * sourceAspect;
- }
- else {
- h = this.canvas.height;
- w = this.canvas.height / sourceAspect;
- }
- this.minXClamp = this.canvas.width / 2 - w / 2;
- this.minYClamp = this.canvas.height / 2 - h / 2;
- this.maxXClamp = this.canvas.width / 2 + w / 2;
- this.maxYClamp = this.canvas.height / 2 + h / 2;
- };
- ImageCropper.prototype.getCropBounds = function () {
- var bounds = this.getBounds();
- bounds.top = Math.round((bounds.top + this.minYClamp) / this.ratioH);
- bounds.bottom = Math.round((bounds.bottom + this.minYClamp) / this.ratioH);
- bounds.left = Math.round((bounds.left - this.minXClamp) / this.ratioW);
- bounds.right = Math.round((bounds.right - this.minXClamp) / this.ratioW);
- return bounds;
- };
- ImageCropper.prototype.clampPosition = function (x, y) {
- if (x < this.minXClamp) {
- x = this.minXClamp;
- }
- if (x > this.maxXClamp) {
- x = this.maxXClamp;
- }
- if (y < this.minYClamp) {
- y = this.minYClamp;
- }
- if (y > this.maxYClamp) {
- y = this.maxYClamp;
- }
- return pointPool_1.PointPool.instance.borrow(x, y);
- };
- ImageCropper.prototype.isImageSet = function () {
- return this.imageSet;
- };
- ImageCropper.prototype.setImage = function (img) {
- if (!img) {
- throw "Image is null";
- }
- this.srcImage = img;
- this.imageSet = true;
- this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
- var bufferContext = this.buffer.getContext('2d');
- bufferContext.clearRect(0, 0, this.buffer.width, this.buffer.height);
- var splitName = img.src.split('.');
- var fileType = splitName[1];
- if (fileType == 'png' || fileType == 'jpg') {
- this.fileType = fileType;
- }
- if (this.cropperSettings.minWithRelativeToResolution) {
- this.minWidth = (this.canvas.width * this.minWidth / this.srcImage.width);
- this.minHeight = (this.canvas.height * this.minHeight / this.srcImage.height);
- }
- this.updateClampBounds();
- var sourceAspect = this.srcImage.height / this.srcImage.width;
- var cropBounds = this.getBounds();
- var cropAspect = cropBounds.getHeight() / cropBounds.getWidth();
- var w = this.canvas.width;
- var h = this.canvas.height;
- this.canvasWidth = w;
- this.canvasHeight = h;
- var cX = this.canvas.width / 2;
- var cY = this.canvas.height / 2;
- var tlPos = pointPool_1.PointPool.instance.borrow(cX - cropBounds.getWidth() / 2, cY + cropBounds.getHeight() / 2);
- var trPos = pointPool_1.PointPool.instance.borrow(cX + cropBounds.getWidth() / 2, cY + cropBounds.getHeight() / 2);
- var blPos = pointPool_1.PointPool.instance.borrow(cX - cropBounds.getWidth() / 2, cY - cropBounds.getHeight() / 2);
- var brPos = pointPool_1.PointPool.instance.borrow(cX + cropBounds.getWidth() / 2, cY - cropBounds.getHeight() / 2);
- this.tl.setPosition(tlPos.x, tlPos.y);
- this.tr.setPosition(trPos.x, trPos.y);
- this.bl.setPosition(blPos.x, blPos.y);
- this.br.setPosition(brPos.x, brPos.y);
- pointPool_1.PointPool.instance.returnPoint(tlPos);
- pointPool_1.PointPool.instance.returnPoint(trPos);
- pointPool_1.PointPool.instance.returnPoint(blPos);
- pointPool_1.PointPool.instance.returnPoint(brPos);
- this.center.setPosition(cX, cY);
- if (cropAspect > sourceAspect) {
- var imageH = Math.min(w * sourceAspect, h);
- var cropW = imageH / cropAspect;
- tlPos = pointPool_1.PointPool.instance.borrow(cX - cropW / 2, cY + imageH / 2);
- trPos = pointPool_1.PointPool.instance.borrow(cX + cropW / 2, cY + imageH / 2);
- blPos = pointPool_1.PointPool.instance.borrow(cX - cropW / 2, cY - imageH / 2);
- brPos = pointPool_1.PointPool.instance.borrow(cX + cropW / 2, cY - imageH / 2);
- }
- else {
- var imageW = Math.min(h / sourceAspect, w);
- var cropH = imageW * cropAspect;
- tlPos = pointPool_1.PointPool.instance.borrow(cX - imageW / 2, cY + cropH / 2);
- trPos = pointPool_1.PointPool.instance.borrow(cX + imageW / 2, cY + cropH / 2);
- blPos = pointPool_1.PointPool.instance.borrow(cX - imageW / 2, cY - cropH / 2);
- brPos = pointPool_1.PointPool.instance.borrow(cX + imageW / 2, cY - cropH / 2);
- }
- this.tl.setPosition(tlPos.x, tlPos.y);
- this.tr.setPosition(trPos.x, trPos.y);
- this.bl.setPosition(blPos.x, blPos.y);
- this.br.setPosition(brPos.x, brPos.y);
- pointPool_1.PointPool.instance.returnPoint(tlPos);
- pointPool_1.PointPool.instance.returnPoint(trPos);
- pointPool_1.PointPool.instance.returnPoint(blPos);
- pointPool_1.PointPool.instance.returnPoint(brPos);
- this.vertSquashRatio = ImageCropper.detectVerticalSquash(this.srcImage);
- this.draw(this.ctx);
- this.croppedImage = this.getCroppedImage(this.cropWidth, this.cropHeight);
- };
- ImageCropper.prototype.getCroppedImage = function (fillWidth, fillHeight) {
- var bounds = this.getBounds();
- if (!this.srcImage) {
- throw "Source image not set.";
- }
- var sourceAspect = this.srcImage.height / this.srcImage.width;
- var canvasAspect = this.canvas.height / this.canvas.width;
- var w = this.canvas.width;
- var h = this.canvas.height;
- if (canvasAspect > sourceAspect) {
- w = this.canvas.width;
- h = this.canvas.width * sourceAspect;
- }
- else if (canvasAspect < sourceAspect) {
- h = this.canvas.height;
- w = this.canvas.height / sourceAspect;
- }
- else {
- h = this.canvas.height;
- w = this.canvas.width;
- }
- this.ratioW = w / this.srcImage.width;
- this.ratioH = h / this.srcImage.height;
- var offsetH = (this.buffer.height - h) / 2 / this.ratioH;
- var offsetW = (this.buffer.width - w) / 2 / this.ratioW;
- this.drawImageIOSFix(this.cropCanvas.getContext('2d'), this.srcImage, Math.max(Math.round((bounds.left) / this.ratioW - offsetW), 0), Math.max(Math.round(bounds.top / this.ratioH - offsetH), 0), Math.max(Math.round(bounds.getWidth() / this.ratioW), 1), Math.max(Math.round(bounds.getHeight() / this.ratioH), 1), 0, 0, this.cropCanvas.width, this.cropCanvas.height);
- this.croppedImage.width = this.cropCanvas.width;
- this.croppedImage.height = this.cropCanvas.height;
- this.croppedImage.src = this.cropCanvas.toDataURL("image/" + this.fileType);
- return this.croppedImage;
- };
- ImageCropper.prototype.getBounds = function () {
- var minX = Number.MAX_VALUE;
- var minY = Number.MAX_VALUE;
- var maxX = -Number.MAX_VALUE;
- var maxY = -Number.MAX_VALUE;
- for (var i = 0; i < this.markers.length; i++) {
- var marker = this.markers[i];
- if (marker.getPosition().x < minX) {
- minX = marker.getPosition().x;
- }
- if (marker.getPosition().x > maxX) {
- maxX = marker.getPosition().x;
- }
- if (marker.getPosition().y < minY) {
- minY = marker.getPosition().y;
- }
- if (marker.getPosition().y > maxY) {
- maxY = marker.getPosition().y;
- }
- }
- var bounds = new bounds_1.Bounds();
- bounds.left = minX;
- bounds.right = maxX;
- bounds.top = minY;
- bounds.bottom = maxY;
- return bounds;
- };
- ImageCropper.prototype.setBounds = function (bounds) {
- var topLeft;
- var topRight;
- var bottomLeft;
- var bottomRight;
- var currentBounds = this.getBounds();
- for (var i = 0; i < this.markers.length; i++) {
- var marker = this.markers[i];
- if (marker.getPosition().x == currentBounds.left) {
- if (marker.getPosition().y == currentBounds.top) {
- topLeft = marker;
- }
- else {
- bottomLeft = marker;
- }
- }
- else {
- if (marker.getPosition().y == currentBounds.top) {
- topRight = marker;
- }
- else {
- bottomRight = marker;
- }
- }
- }
- topLeft.setPosition(bounds.left, bounds.top);
- topRight.setPosition(bounds.right, bounds.top);
- bottomLeft.setPosition(bounds.left, bounds.bottom);
- bottomRight.setPosition(bounds.right, bounds.bottom);
- this.center.recalculatePosition(bounds);
- this.center.draw(this.ctx);
- };
- ImageCropper.prototype.onTouchMove = function (event) {
- if (this.crop.isImageSet()) {
- event.preventDefault();
- if (event.touches.length === 1) {
- for (var i = 0; i < event.touches.length; i++) {
- var touch = event.touches[i];
- var touchPosition = ImageCropper.getTouchPos(this.canvas, touch);
- var cropTouch = new cropTouch_1.CropTouch(touchPosition.x, touchPosition.y, touch.identifier);
- pointPool_1.PointPool.instance.returnPoint(touchPosition);
- this.move(cropTouch);
- }
- }
- else if (event.touches.length === 2) {
- var distance = ((event.touches[0].clientX - event.touches[1].clientX) * (event.touches[0].clientX - event.touches[1].clientX)) +
- ((event.touches[0].clientY - event.touches[1].clientY) * (event.touches[0].clientY - event.touches[1].clientY));
- if (this.previousDistance && this.previousDistance !== distance) {
- var increment = distance < this.previousDistance ? 1 : -1;
- var bounds = this.getBounds();
- bounds.top += increment;
- bounds.left += increment;
- bounds.right -= increment;
- bounds.bottom -= increment;
- this.setBounds(bounds);
- }
- this.previousDistance = distance;
- }
- this.draw(this.ctx);
- }
- };
- ImageCropper.prototype.onMouseMove = function (e) {
- if (this.crop.isImageSet()) {
- var mousePosition = ImageCropper.getMousePos(this.canvas, e);
- this.move(new cropTouch_1.CropTouch(mousePosition.x, mousePosition.y, 0));
- var dragTouch = this.getDragTouchForID(0);
- if (dragTouch) {
- dragTouch.x = mousePosition.x;
- dragTouch.y = mousePosition.y;
- }
- else {
- dragTouch = new cropTouch_1.CropTouch(mousePosition.x, mousePosition.y, 0);
- }
- pointPool_1.PointPool.instance.returnPoint(mousePosition);
- this.drawCursors(dragTouch);
- this.draw(this.ctx);
- }
- };
- ImageCropper.prototype.move = function (cropTouch) {
- if (this.isMouseDown) {
- this.handleMove(cropTouch);
- }
- };
- ImageCropper.prototype.getDragTouchForID = function (id) {
- for (var i = 0; i < this.currentDragTouches.length; i++) {
- if (id == this.currentDragTouches[i].id) {
- return this.currentDragTouches[i];
- }
- }
- };
- ImageCropper.prototype.drawCursors = function (cropTouch) {
- var cursorDrawn = false;
- if (cropTouch != null) {
- if (cropTouch.dragHandle == this.center) {
- imageCropperDataShare_1.ImageCropperDataShare.setStyle(this.canvas, 'move');
- cursorDrawn = true;
- }
- if (cropTouch.dragHandle != null && cropTouch.dragHandle instanceof cornerMarker_1.CornerMarker) {
- this.drawCornerCursor(cropTouch.dragHandle, cropTouch.dragHandle.getPosition().x, cropTouch.dragHandle.getPosition().y);
- cursorDrawn = true;
- }
- }
- var didDraw = false;
- if (!cursorDrawn) {
- for (var i = 0; i < this.markers.length; i++) {
- didDraw = didDraw || this.drawCornerCursor(this.markers[i], cropTouch.x, cropTouch.y);
- }
- if (!didDraw) {
- imageCropperDataShare_1.ImageCropperDataShare.setStyle(this.canvas, 'initial');
- }
- }
- if (!didDraw && !cursorDrawn && this.center.touchInBounds(cropTouch.x, cropTouch.y)) {
- this.center.setOver(true);
- imageCropperDataShare_1.ImageCropperDataShare.setOver(this.canvas);
- imageCropperDataShare_1.ImageCropperDataShare.setStyle(this.canvas, 'move');
- }
- else {
- this.center.setOver(false);
- }
- };
- ImageCropper.prototype.drawCornerCursor = function (marker, x, y) {
- if (marker.touchInBounds(x, y)) {
- marker.setOver(true);
- if (marker.getHorizontalNeighbour().getPosition().x > marker.getPosition().x) {
- if (marker.getVerticalNeighbour().getPosition().y > marker.getPosition().y) {
- imageCropperDataShare_1.ImageCropperDataShare.setOver(this.canvas);
- imageCropperDataShare_1.ImageCropperDataShare.setStyle(this.canvas, 'nwse-resize');
- }
- else {
- imageCropperDataShare_1.ImageCropperDataShare.setOver(this.canvas);
- imageCropperDataShare_1.ImageCropperDataShare.setStyle(this.canvas, 'nesw-resize');
- }
- }
- else {
- if (marker.getVerticalNeighbour().getPosition().y > marker.getPosition().y) {
- imageCropperDataShare_1.ImageCropperDataShare.setOver(this.canvas);
- imageCropperDataShare_1.ImageCropperDataShare.setStyle(this.canvas, 'nesw-resize');
- }
- else {
- imageCropperDataShare_1.ImageCropperDataShare.setOver(this.canvas);
- imageCropperDataShare_1.ImageCropperDataShare.setStyle(this.canvas, 'nwse-resize');
- }
- }
- return true;
- }
- marker.setOver(false);
- return false;
- };
- ImageCropper.prototype.onTouchStart = function (event) {
- if (this.crop.isImageSet()) {
- this.isMouseDown = true;
- }
- };
- ImageCropper.prototype.onTouchEnd = function (event) {
- if (this.crop.isImageSet()) {
- for (var i = 0; i < event.changedTouches.length; i++) {
- var touch = event.changedTouches[i];
- var dragTouch = this.getDragTouchForID(touch.identifier);
- if (dragTouch != null) {
- if (dragTouch.dragHandle instanceof cornerMarker_1.CornerMarker || dragTouch.dragHandle instanceof dragMarker_1.DragMarker) {
- dragTouch.dragHandle.setOver(false);
- }
- this.handleRelease(dragTouch);
- }
- }
- if (this.currentDragTouches.length == 0) {
- this.isMouseDown = false;
- this.currentlyInteracting = false;
- }
- }
- };
- ImageCropper.prototype.drawImageIOSFix = function (ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {
- ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh);
- };
- ImageCropper.prototype.onMouseDown = function () {
- if (this.crop.isImageSet()) {
- this.isMouseDown = true;
- }
- };
- ImageCropper.prototype.onMouseUp = function () {
- if (this.crop.isImageSet()) {
- imageCropperDataShare_1.ImageCropperDataShare.setReleased(this.canvas);
- this.isMouseDown = false;
- this.handleRelease(new cropTouch_1.CropTouch(0, 0, 0));
- }
- };
- return ImageCropper;
-}(imageCropperModel_1.ImageCropperModel));
-exports.ImageCropper = ImageCropper;
-//# sourceMappingURL=imageCropper.js.map
\ No newline at end of file
diff --git a/src/imageCropper.js.map b/src/imageCropper.js.map
deleted file mode 100644
index 4f35281d..00000000
--- a/src/imageCropper.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"imageCropper.js","sourceRoot":"","sources":["imageCropper.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/src/ImageCropper.ts b/src/imageCropper.ts
similarity index 50%
rename from src/ImageCropper.ts
rename to src/imageCropper.ts
index b6dc0678..b26c3b98 100644
--- a/src/ImageCropper.ts
+++ b/src/imageCropper.ts
@@ -1,34 +1,33 @@
-import {PointPool} from './model/pointPool';
-import {Point} from './model/point';
-import {Bounds} from './model/bounds';
-import {CornerMarker} from './model/cornerMarker';
-import {DragMarker} from './model/dragMarker';
-import {CropTouch} from './model/cropTouch';
+import {Bounds} from "./model/bounds";
+import {CornerMarker} from "./model/cornerMarker";
+import {CropTouch} from "./model/cropTouch";
+import {CropperSettings} from "./cropperSettings";
+import {DragMarker} from "./model/dragMarker";
import {ImageCropperModel} from "./model/imageCropperModel";
-import {CropperDrawSettings} from "./cropperDrawSettings";
import {ImageCropperDataShare} from "./imageCropperDataShare";
-import {CropperSettings} from "./cropperSettings";
+import {PointPool} from "./model/pointPool";
+import {Point} from "./model/point";
export class ImageCropper extends ImageCropperModel {
- private crop:ImageCropper;
- private cropperSettings:CropperSettings;
- private previousDistance:number;
-
- constructor(cropperSettings:CropperSettings) {
+ private crop: ImageCropper;
+ private cropperSettings: CropperSettings;
+ private previousDistance: number;
+ constructor(cropperSettings: CropperSettings) {
super();
- var x = 0;
- var y = 0;
- var width = cropperSettings.width;
- var height = cropperSettings.height;
- var keepAspect = cropperSettings.keepAspect;
- var touchRadius = cropperSettings.touchRadius;
- var minWidth = cropperSettings.minWidth;
- var minHeight = cropperSettings.minHeight;
- var croppedWidth = cropperSettings.croppedWidth;
- var croppedHeight = cropperSettings.croppedHeight;
+ let x: number = 0;
+ let y: number = 0;
+ let width: number = cropperSettings.width;
+ let height: number = cropperSettings.height;
+ let keepAspect: boolean = cropperSettings.keepAspect;
+ let touchRadius: number = cropperSettings.touchRadius;
+ let minWidth: number = cropperSettings.minWidth;
+ let minHeight: number = cropperSettings.minHeight;
+ let croppedWidth: number = cropperSettings.croppedWidth;
+ let croppedHeight: number = cropperSettings.croppedHeight;
+
this.cropperSettings = cropperSettings;
this.crop = this;
@@ -55,11 +54,10 @@ export class ImageCropper extends ImageCropperModel {
this.isMouseDown = false;
this.ratioW = 1;
this.ratioH = 1;
- this.fileType = 'png';
+ this.fileType = "png";
this.imageSet = false;
this.pointPool = new PointPool(200);
-
this.tl = new CornerMarker(x, y, touchRadius, this.cropperSettings);
this.tr = new CornerMarker(x + width, y, touchRadius, this.cropperSettings);
this.bl = new CornerMarker(x, y + height, touchRadius, this.cropperSettings);
@@ -74,6 +72,8 @@ export class ImageCropper extends ImageCropperModel {
this.br.addHorizontalNeighbour(this.bl);
this.br.addVerticalNeighbour(this.tr);
this.markers = [this.tl, this.tr, this.bl, this.br];
+
+
this.center = new DragMarker(x + (width / 2), y + (height / 2), touchRadius, this.cropperSettings);
this.keepAspect = keepAspect;
this.aspectRatio = height / width;
@@ -83,64 +83,72 @@ export class ImageCropper extends ImageCropperModel {
this.cropHeight = croppedHeight;
}
- static sign(x) {
+ private static sign(x: number): number {
if (+x === x) {
return (x === 0) ? x : (x > 0) ? 1 : -1;
}
return NaN;
}
- static getMousePos(canvas, evt) {
- var rect = canvas.getBoundingClientRect();
+ private static getMousePos(canvas: HTMLCanvasElement, evt: MouseEvent): Point {
+ let rect = canvas.getBoundingClientRect();
return PointPool.instance.borrow(evt.clientX - rect.left, evt.clientY - rect.top);
}
- static getTouchPos(canvas, touch) {
- var rect = canvas.getBoundingClientRect();
+ private static getTouchPos(canvas: HTMLCanvasElement, touch: Touch): Point {
+ let rect = canvas.getBoundingClientRect();
return PointPool.instance.borrow(touch.clientX - rect.left, touch.clientY - rect.top);
}
- static detectVerticalSquash(img) {
- var ih = img.height;
- var canvas = document.createElement('canvas');
+ private static detectVerticalSquash(img: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement) {
+ let ih = img.height;
+ let canvas = document.createElement("canvas");
canvas.width = 1;
canvas.height = ih;
- var ctx = canvas.getContext('2d');
+ let ctx = canvas.getContext("2d");
ctx.drawImage(img, 0, 0);
- var data = ctx.getImageData(0, 0, 1, ih).data;
+ let data = ctx.getImageData(0, 0, 1, ih).data;
// search image edge pixel position in case it is squashed vertically.
- var sy = 0;
- var ey = ih;
- var py = ih;
+ let sy = 0;
+ let ey = ih;
+ let py = ih;
while (py > sy) {
- var alpha = data[(py - 1) * 4 + 3];
+ let alpha = data[(py - 1) * 4 + 3];
if (alpha === 0) {
ey = py;
- }
- else {
+ } else {
sy = py;
}
py = (ey + sy) >> 1;
}
- var ratio = (py / ih);
+ let ratio = (py / ih);
return (ratio === 0) ? 1 : ratio;
}
+ public prepare(canvas: HTMLCanvasElement) {
+ this.buffer = document.createElement("canvas");
+ this.cropCanvas = document.createElement("canvas");
+
+ // todo get more reliable parent width value.
+ let responsiveWidth: number = canvas.parentElement.clientWidth;
+ if (responsiveWidth > 0 && this.cropperSettings.responsive) {
+ this.cropCanvas.width = responsiveWidth;
+ this.buffer.width = responsiveWidth;
+ canvas.width = responsiveWidth;
+ } else {
+ this.cropCanvas.width = this.cropWidth;
+ this.buffer.width = canvas.width;
+ }
- prepare(canvas:HTMLCanvasElement) {
- this.buffer = document.createElement('canvas');
- this.cropCanvas = document.createElement('canvas');
- this.cropCanvas.width = this.cropWidth;
this.cropCanvas.height = this.cropHeight;
- this.buffer.width = canvas.width;
this.buffer.height = canvas.height;
this.canvas = canvas;
this.ctx = this.canvas.getContext("2d");
+
this.draw(this.ctx);
}
-
- resizeCanvas(width, height):void {
+ public resizeCanvas(width: number, height: number): void {
this.canvas.width = width;
this.canvas.height = height;
this.buffer.width = width;
@@ -148,103 +156,101 @@ export class ImageCropper extends ImageCropperModel {
this.draw(this.ctx);
}
-
- draw(ctx):void {
- var bounds = this.getBounds();
+ public draw(ctx: CanvasRenderingContext2D): void {
+ let bounds: Bounds = this.getBounds();
if (this.srcImage) {
ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
- var sourceAspect = this.srcImage.height / this.srcImage.width;
- var canvasAspect = this.canvasHeight / this.canvasWidth;
- var w = this.canvasWidth;
- var h = this.canvasHeight;
+ let sourceAspect: number = this.srcImage.height / this.srcImage.width;
+ let canvasAspect: number = this.canvasHeight / this.canvasWidth;
+ let w: number = this.canvasWidth;
+ let h: number = this.canvasHeight;
if (canvasAspect > sourceAspect) {
w = this.canvasWidth;
h = this.canvasWidth * sourceAspect;
- }
- else {
+ } else {
h = this.canvasHeight;
w = this.canvasHeight / sourceAspect;
}
this.ratioW = w / this.srcImage.width;
this.ratioH = h / this.srcImage.height;
if (canvasAspect < sourceAspect) {
- this.drawImageIOSFix(ctx, this.srcImage, 0, 0, this.srcImage.width, this.srcImage.height, this.buffer.width / 2 - w / 2, 0, w, h);
- }
- else {
- this.drawImageIOSFix(ctx, this.srcImage, 0, 0, this.srcImage.width, this.srcImage.height, 0, this.buffer.height / 2 - h / 2, w, h);
+ this.drawImageIOSFix(ctx, this.srcImage, 0, 0, this.srcImage.width, this.srcImage.height,
+ this.buffer.width / 2 - w / 2, 0, w, h);
+ } else {
+ this.drawImageIOSFix(ctx, this.srcImage, 0, 0, this.srcImage.width, this.srcImage.height, 0,
+ this.buffer.height / 2 - h / 2, w, h);
}
- this.buffer.getContext('2d').drawImage(this.canvas, 0, 0, this.canvasWidth, this.canvasHeight);
+ this.buffer.getContext("2d").drawImage(this.canvas, 0, 0, this.canvasWidth, this.canvasHeight);
ctx.lineWidth = this.cropperSettings.cropperDrawSettings.strokeWidth;
- ctx.strokeStyle = this.cropperSettings.cropperDrawSettings.strokeColor; //'rgba(255,228,0,1)';
+ ctx.strokeStyle = this.cropperSettings.cropperDrawSettings.strokeColor; // "rgba(255,228,0,1)";
if (!this.cropperSettings.rounded) {
ctx.fillStyle = "rgba(0, 0, 0, 0.6)";
ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);
- ctx.drawImage(this.buffer, bounds.left, bounds.top, Math.max(bounds.getWidth(), 1), Math.max(bounds.getHeight(), 1), bounds.left, bounds.top, bounds.getWidth(), bounds.getHeight());
- ctx.strokeRect(bounds.left, bounds.top, bounds.getWidth(), bounds.getHeight());
+ ctx.drawImage(this.buffer, bounds.left, bounds.top, Math.max(bounds.width, 1),
+ Math.max(bounds.height, 1), bounds.left, bounds.top, bounds.width, bounds.height);
+ ctx.strokeRect(bounds.left, bounds.top, bounds.width, bounds.height);
} else {
ctx.beginPath();
- ctx.arc(bounds.left + bounds.getWidth() / 2, bounds.top + bounds.getHeight() / 2, bounds.getWidth() / 2, 0, Math.PI * 2, true);
+ ctx.arc(bounds.left + bounds.width / 2, bounds.top + bounds.height / 2, bounds.width / 2, 0,
+ Math.PI * 2, true);
ctx.closePath();
ctx.stroke();
}
- var marker;
- for (var i = 0; i < this.markers.length; i++) {
+ let marker: CornerMarker;
+
+ for (let i = 0; i < this.markers.length; i++) {
marker = this.markers[i];
marker.draw(ctx);
}
this.center.draw(ctx);
- }
- else {
- ctx.fillStyle = 'rgba(192,192,192,1)';
+ } else {
+ ctx.fillStyle = "rgba(192,192,192,1)";
ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);
}
}
-
- dragCrop(x, y, marker) {
- var bounds = this.getBounds();
- var left = x - (bounds.getWidth() / 2);
- var right = x + (bounds.getWidth() / 2);
- var top = y - (bounds.getHeight() / 2);
- var bottom = y + (bounds.getHeight() / 2);
+ public dragCenter(x: number, y: number, marker: DragMarker) {
+ let bounds = this.getBounds();
+ let left = x - (bounds.width / 2);
+ let right = x + (bounds.width / 2);
+ let top = y - (bounds.height / 2);
+ let bottom = y + (bounds.height / 2);
if (right >= this.maxXClamp) {
- x = this.maxXClamp - bounds.getWidth() / 2;
+ x = this.maxXClamp - bounds.width / 2;
}
if (left <= this.minXClamp) {
- x = bounds.getWidth() / 2 + this.minXClamp;
+ x = bounds.width / 2 + this.minXClamp;
}
if (top < this.minYClamp) {
- y = bounds.getHeight() / 2 + this.minYClamp;
+ y = bounds.height / 2 + this.minYClamp;
}
if (bottom >= this.maxYClamp) {
- y = this.maxYClamp - bounds.getHeight() / 2;
- }
- this.tl.moveX(x - (bounds.getWidth() / 2));
- this.tl.moveY(y - (bounds.getHeight() / 2));
- this.tr.moveX(x + (bounds.getWidth() / 2));
- this.tr.moveY(y - (bounds.getHeight() / 2));
- this.bl.moveX(x - (bounds.getWidth() / 2));
- this.bl.moveY(y + (bounds.getHeight() / 2));
- this.br.moveX(x + (bounds.getWidth() / 2));
- this.br.moveY(y + (bounds.getHeight() / 2));
+ y = this.maxYClamp - bounds.height / 2;
+ }
+ this.tl.moveX(x - (bounds.width / 2));
+ this.tl.moveY(y - (bounds.height / 2));
+ this.tr.moveX(x + (bounds.width / 2));
+ this.tr.moveY(y - (bounds.height / 2));
+ this.bl.moveX(x - (bounds.width / 2));
+ this.bl.moveY(y + (bounds.height / 2));
+ this.br.moveX(x + (bounds.width / 2));
+ this.br.moveY(y + (bounds.height / 2));
marker.setPosition(x, y);
-
-
}
- enforceMinSize(x, y, marker) {
+ public enforceMinSize(x: number, y: number, marker: CornerMarker) {
- var xLength = x - marker.getHorizontalNeighbour().getPosition().x;
- var yLength = y - marker.getVerticalNeighbour().getPosition().y;
- var xOver = this.minWidth - Math.abs(xLength);
- var yOver = this.minHeight - Math.abs(yLength);
+ let xLength = x - marker.getHorizontalNeighbour().position.x;
+ let yLength = y - marker.getVerticalNeighbour().position.y;
+ let xOver = this.minWidth - Math.abs(xLength);
+ let yOver = this.minHeight - Math.abs(yLength);
- if (xLength == 0 || yLength == 0) {
- x = marker.getPosition().x;
- y = marker.getPosition().y;
+ if (xLength === 0 || yLength === 0) {
+ x = marker.position.x;
+ y = marker.position.y;
return PointPool.instance.borrow(x, y);
}
@@ -257,254 +263,241 @@ export class ImageCropper extends ImageCropperModel {
if (yLength < 0) {
y -= xOver * this.aspectRatio;
- }
- else {
+ } else {
y += xOver * this.aspectRatio;
}
- }
- else {
+ } else {
x += xOver;
if (yLength < 0) {
y -= xOver * this.aspectRatio;
- }
- else {
+ } else {
y += xOver * this.aspectRatio;
}
}
- }
- else {
+ } else {
if (yLength < 0) {
y -= yOver;
if (xLength < 0) {
x -= yOver / this.aspectRatio;
- }
- else {
+ } else {
x += yOver / this.aspectRatio;
}
- }
- else {
+ } else {
y += yOver;
if (xLength < 0) {
x -= yOver / this.aspectRatio;
- }
- else {
+ } else {
x += yOver / this.aspectRatio;
}
}
}
- }
- else {
+ } else {
if (xOver > 0) {
if (xLength < 0) {
x -= xOver;
-
if (yLength < 0) {
y -= xOver * this.aspectRatio;
- }
- else {
+ } else {
y += xOver * this.aspectRatio;
}
- }
- else {
+ } else {
x += xOver;
if (yLength < 0) {
y -= xOver * this.aspectRatio;
- }
- else {
+ } else {
y += xOver * this.aspectRatio;
}
}
- }
- else if (yOver > 0) {
- if (yLength < 0) {
- y -= yOver;
-
- if (xLength < 0) {
- x -= yOver / this.aspectRatio;
- }
- else {
- x += yOver / this.aspectRatio;
- }
- }
- else {
- y += yOver;
- if (xLength < 0) {
- x -= yOver / this.aspectRatio;
- }
- else {
- x += yOver / this.aspectRatio;
+ } else {
+ if (yOver > 0) {
+ if (yLength < 0) {
+ y -= yOver;
+
+ if (xLength < 0) {
+ x -= yOver / this.aspectRatio;
+ } else {
+ x += yOver / this.aspectRatio;
+ }
+ } else {
+ y += yOver;
+ if (xLength < 0) {
+ x -= yOver / this.aspectRatio;
+ } else {
+ x += yOver / this.aspectRatio;
+ }
}
}
}
}
- }
- else {
+ } else {
if (xOver > 0) {
if (xLength < 0) {
x -= xOver;
- }
- else {
+ } else {
x += xOver;
}
}
if (yOver > 0) {
if (yLength < 0) {
y -= yOver;
- }
- else {
+ } else {
y += yOver;
}
}
}
if (x < this.minXClamp || x > this.maxXClamp || y < this.minYClamp || y > this.maxYClamp) {
- x = marker.getPosition().x;
- y = marker.getPosition().y;
+ x = marker.position.x;
+ y = marker.position.y;
}
return PointPool.instance.borrow(x, y);
}
- dragCorner(x, y, marker) {
- var iX = 0;
- var iY = 0;
- var ax = 0;
- var ay = 0;
- var newHeight = 0;
- var newWidth = 0;
- var newY = 0;
- var newX = 0;
- var anchorMarker;
- var fold = 0;
-
+ public dragCorner(x: number, y: number, marker: CornerMarker) {
+ let iX: number = 0;
+ let iY: number = 0;
+ let ax: number = 0;
+ let ay: number = 0;
+ let newHeight: number = 0;
+ let newWidth: number = 0;
+ let newY: number = 0;
+ let newX: number = 0;
+ let anchorMarker: CornerMarker;
+ let fold: number = 0;
if (this.keepAspect) {
anchorMarker = marker.getHorizontalNeighbour().getVerticalNeighbour();
- ax = anchorMarker.getPosition().x;
- ay = anchorMarker.getPosition().y;
- if (x <= anchorMarker.getPosition().x) {
- if (y <= anchorMarker.getPosition().y) {
+ ax = anchorMarker.position.x;
+ ay = anchorMarker.position.y;
+ if (x <= anchorMarker.position.x) {
+ if (y <= anchorMarker.position.y) {
iX = ax - (100 / this.aspectRatio);
iY = ay - (100 / this.aspectRatio * this.aspectRatio);
- fold = this.getSide(PointPool.instance.borrow(iX, iY), anchorMarker.getPosition(), PointPool.instance.borrow(x, y));
+ fold = this.getSide(PointPool.instance.borrow(iX, iY), anchorMarker.position,
+ PointPool.instance.borrow(x, y));
if (fold > 0) {
- newHeight = Math.abs(anchorMarker.getPosition().y - y);
+ newHeight = Math.abs(anchorMarker.position.y - y);
newWidth = newHeight / this.aspectRatio;
- newY = anchorMarker.getPosition().y - newHeight;
- newX = anchorMarker.getPosition().x - newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
- marker.move(min.x, min.y);
- PointPool.instance.returnPoint(min);
- }
- else if (fold < 0) {
- newWidth = Math.abs(anchorMarker.getPosition().x - x);
- newHeight = newWidth * this.aspectRatio;
- newY = anchorMarker.getPosition().y - newHeight;
- newX = anchorMarker.getPosition().x - newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
+ newY = anchorMarker.position.y - newHeight;
+ newX = anchorMarker.position.x - newWidth;
+ let min = this.enforceMinSize(newX, newY, marker);
marker.move(min.x, min.y);
PointPool.instance.returnPoint(min);
+ } else {
+ if (fold < 0) {
+ newWidth = Math.abs(anchorMarker.position.x - x);
+ newHeight = newWidth * this.aspectRatio;
+ newY = anchorMarker.position.y - newHeight;
+ newX = anchorMarker.position.x - newWidth;
+ let min = this.enforceMinSize(newX, newY, marker);
+ marker.move(min.x, min.y);
+ PointPool.instance.returnPoint(min);
+ }
}
- }
- else {
+ } else {
iX = ax - (100 / this.aspectRatio);
iY = ay + (100 / this.aspectRatio * this.aspectRatio);
- fold = this.getSide(PointPool.instance.borrow(iX, iY), anchorMarker.getPosition(), PointPool.instance.borrow(x, y));
+ fold = this.getSide(PointPool.instance.borrow(iX, iY), anchorMarker.position,
+ PointPool.instance.borrow(x, y));
if (fold > 0) {
- newWidth = Math.abs(anchorMarker.getPosition().x - x);
+ newWidth = Math.abs(anchorMarker.position.x - x);
newHeight = newWidth * this.aspectRatio;
- newY = anchorMarker.getPosition().y + newHeight;
- newX = anchorMarker.getPosition().x - newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
- marker.move(min.x, min.y);
- PointPool.instance.returnPoint(min);
- }
- else if (fold < 0) {
- newHeight = Math.abs(anchorMarker.getPosition().y - y);
- newWidth = newHeight / this.aspectRatio;
- newY = anchorMarker.getPosition().y + newHeight;
- newX = anchorMarker.getPosition().x - newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
+ newY = anchorMarker.position.y + newHeight;
+ newX = anchorMarker.position.x - newWidth;
+ let min = this.enforceMinSize(newX, newY, marker);
marker.move(min.x, min.y);
PointPool.instance.returnPoint(min);
+ } else {
+ if (fold < 0) {
+ newHeight = Math.abs(anchorMarker.position.y - y);
+ newWidth = newHeight / this.aspectRatio;
+ newY = anchorMarker.position.y + newHeight;
+ newX = anchorMarker.position.x - newWidth;
+ let min = this.enforceMinSize(newX, newY, marker);
+ marker.move(min.x, min.y);
+ PointPool.instance.returnPoint(min);
+ }
}
}
- }
- else {
- if (y <= anchorMarker.getPosition().y) {
+ } else {
+ if (y <= anchorMarker.position.y) {
iX = ax + (100 / this.aspectRatio);
iY = ay - (100 / this.aspectRatio * this.aspectRatio);
- fold = this.getSide(PointPool.instance.borrow(iX, iY), anchorMarker.getPosition(), PointPool.instance.borrow(x, y));
+ fold = this.getSide(PointPool.instance.borrow(iX, iY), anchorMarker.position,
+ PointPool.instance.borrow(x, y));
if (fold < 0) {
- newHeight = Math.abs(anchorMarker.getPosition().y - y);
+ newHeight = Math.abs(anchorMarker.position.y - y);
newWidth = newHeight / this.aspectRatio;
- newY = anchorMarker.getPosition().y - newHeight;
- newX = anchorMarker.getPosition().x + newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
- marker.move(min.x, min.y);
- PointPool.instance.returnPoint(min);
- }
- else if (fold > 0) {
- newWidth = Math.abs(anchorMarker.getPosition().x - x);
- newHeight = newWidth * this.aspectRatio;
- newY = anchorMarker.getPosition().y - newHeight;
- newX = anchorMarker.getPosition().x + newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
+ newY = anchorMarker.position.y - newHeight;
+ newX = anchorMarker.position.x + newWidth;
+ let min = this.enforceMinSize(newX, newY, marker);
marker.move(min.x, min.y);
PointPool.instance.returnPoint(min);
+ } else {
+ if (fold > 0) {
+ newWidth = Math.abs(anchorMarker.position.x - x);
+ newHeight = newWidth * this.aspectRatio;
+ newY = anchorMarker.position.y - newHeight;
+ newX = anchorMarker.position.x + newWidth;
+ let min = this.enforceMinSize(newX, newY, marker);
+ marker.move(min.x, min.y);
+ PointPool.instance.returnPoint(min);
+ }
}
- }
- else {
+ } else {
iX = ax + (100 / this.aspectRatio);
iY = ay + (100 / this.aspectRatio * this.aspectRatio);
- fold = this.getSide(PointPool.instance.borrow(iX, iY), anchorMarker.getPosition(), PointPool.instance.borrow(x, y));
+ fold = this.getSide(PointPool.instance.borrow(iX, iY), anchorMarker.position,
+ PointPool.instance.borrow(x, y));
if (fold < 0) {
- newWidth = Math.abs(anchorMarker.getPosition().x - x);
+ newWidth = Math.abs(anchorMarker.position.x - x);
newHeight = newWidth * this.aspectRatio;
- newY = anchorMarker.getPosition().y + newHeight;
- newX = anchorMarker.getPosition().x + newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
- marker.move(min.x, min.y);
- PointPool.instance.returnPoint(min);
- }
- else if (fold > 0) {
- newHeight = Math.abs(anchorMarker.getPosition().y - y);
- newWidth = newHeight / this.aspectRatio;
- newY = anchorMarker.getPosition().y + newHeight;
- newX = anchorMarker.getPosition().x + newWidth;
- var min = this.enforceMinSize(newX, newY, marker);
+ newY = anchorMarker.position.y + newHeight;
+ newX = anchorMarker.position.x + newWidth;
+ let min = this.enforceMinSize(newX, newY, marker);
marker.move(min.x, min.y);
PointPool.instance.returnPoint(min);
+ } else {
+ if (fold > 0) {
+ newHeight = Math.abs(anchorMarker.position.y - y);
+ newWidth = newHeight / this.aspectRatio;
+ newY = anchorMarker.position.y + newHeight;
+ newX = anchorMarker.position.x + newWidth;
+ let min = this.enforceMinSize(newX, newY, marker);
+ marker.move(min.x, min.y);
+ PointPool.instance.returnPoint(min);
+ }
}
}
}
- }
- else {
- var min = this.enforceMinSize(x, y, marker);
+ } else {
+ let min = this.enforceMinSize(x, y, marker);
marker.move(min.x, min.y);
PointPool.instance.returnPoint(min);
}
this.center.recalculatePosition(this.getBounds());
}
- getSide(a, b, c) {
- var n = ImageCropper.sign((b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x));
- //TODO move the return of the pools to outside of this function
+ public getSide(a: Point, b: Point, c: Point): number {
+ let n: number = ImageCropper.sign((b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x));
+
+ // TODO move the return of the pools to outside of this function
PointPool.instance.returnPoint(a);
PointPool.instance.returnPoint(c);
return n;
}
- handleRelease(newCropTouch) {
+ public handleRelease(newCropTouch: CropTouch) {
if (newCropTouch == null) {
return;
}
- var index = 0;
- for (var k = 0; k < this.currentDragTouches.length; k++) {
- if (newCropTouch.id == this.currentDragTouches[k].id) {
+ let index = 0;
+ for (let k = 0; k < this.currentDragTouches.length; k++) {
+ if (newCropTouch.id === this.currentDragTouches[k].id) {
this.currentDragTouches[k].dragHandle.setDrag(false);
newCropTouch.dragHandle = null;
index = k;
@@ -514,20 +507,20 @@ export class ImageCropper extends ImageCropperModel {
this.draw(this.ctx);
}
- handleMove(newCropTouch) {
- var matched = false;
- for (var k = 0; k < this.currentDragTouches.length; k++) {
- if (newCropTouch.id == this.currentDragTouches[k].id && this.currentDragTouches[k].dragHandle != null) {
- var dragTouch = this.currentDragTouches[k];
- var clampedPositions = this.clampPosition(newCropTouch.x - dragTouch.dragHandle.offset.x, newCropTouch.y - dragTouch.dragHandle.offset.y);
+ public handleMove(newCropTouch: CropTouch) {
+ let matched = false;
+ for (let k = 0; k < this.currentDragTouches.length; k++) {
+ if (newCropTouch.id === this.currentDragTouches[k].id && this.currentDragTouches[k].dragHandle != null) {
+ let dragTouch: CropTouch = this.currentDragTouches[k];
+ let clampedPositions = this.clampPosition(newCropTouch.x - dragTouch.dragHandle.offset.x,
+ newCropTouch.y - dragTouch.dragHandle.offset.y);
newCropTouch.x = clampedPositions.x;
newCropTouch.y = clampedPositions.y;
PointPool.instance.returnPoint(clampedPositions);
if (dragTouch.dragHandle instanceof CornerMarker) {
- this.dragCorner(newCropTouch.x, newCropTouch.y, dragTouch.dragHandle);
- }
- else {
- this.dragCrop(newCropTouch.x, newCropTouch.y, dragTouch.dragHandle);
+ this.dragCorner(newCropTouch.x, newCropTouch.y, (dragTouch.dragHandle as CornerMarker));
+ } else {
+ this.dragCenter(newCropTouch.x, newCropTouch.y, (dragTouch.dragHandle as DragMarker));
}
this.currentlyInteracting = true;
matched = true;
@@ -536,41 +529,42 @@ export class ImageCropper extends ImageCropperModel {
}
}
if (!matched) {
- for (var i = 0; i < this.markers.length; i++) {
- var marker = this.markers[i];
+ for (let i = 0; i < this.markers.length; i++) {
+ let marker: CornerMarker | DragMarker = this.markers[i];
if (marker.touchInBounds(newCropTouch.x, newCropTouch.y)) {
newCropTouch.dragHandle = marker;
this.currentDragTouches.push(newCropTouch);
marker.setDrag(true);
- newCropTouch.dragHandle.offset.x = newCropTouch.x - newCropTouch.dragHandle.getPosition().x;
- newCropTouch.dragHandle.offset.y = newCropTouch.y - newCropTouch.dragHandle.getPosition().y;
- this.dragCorner(newCropTouch.x - newCropTouch.dragHandle.offset.x, newCropTouch.y - newCropTouch.dragHandle.offset.y, newCropTouch.dragHandle);
+ newCropTouch.dragHandle.offset.x = newCropTouch.x - newCropTouch.dragHandle.position.x;
+ newCropTouch.dragHandle.offset.y = newCropTouch.y - newCropTouch.dragHandle.position.y;
+ this.dragCorner(newCropTouch.x - newCropTouch.dragHandle.offset.x,
+ newCropTouch.y - newCropTouch.dragHandle.offset.y, (newCropTouch.dragHandle as CornerMarker));
break;
}
}
- if (newCropTouch.dragHandle == null) {
+ if (newCropTouch.dragHandle === null || typeof newCropTouch.dragHandle === "undefined") {
if (this.center.touchInBounds(newCropTouch.x, newCropTouch.y)) {
newCropTouch.dragHandle = this.center;
this.currentDragTouches.push(newCropTouch);
newCropTouch.dragHandle.setDrag(true);
- newCropTouch.dragHandle.offset.x = newCropTouch.x - newCropTouch.dragHandle.getPosition().x;
- newCropTouch.dragHandle.offset.y = newCropTouch.y - newCropTouch.dragHandle.getPosition().y;
- this.dragCrop(newCropTouch.x - newCropTouch.dragHandle.offset.x, newCropTouch.y - newCropTouch.dragHandle.offset.y, newCropTouch.dragHandle);
+ newCropTouch.dragHandle.offset.x = newCropTouch.x - newCropTouch.dragHandle.position.x;
+ newCropTouch.dragHandle.offset.y = newCropTouch.y - newCropTouch.dragHandle.position.y;
+ this.dragCenter(newCropTouch.x - newCropTouch.dragHandle.offset.x,
+ newCropTouch.y - newCropTouch.dragHandle.offset.y, (newCropTouch.dragHandle as DragMarker));
}
}
}
}
- updateClampBounds() {
- var sourceAspect = this.srcImage.height / this.srcImage.width;
- var canvasAspect = this.canvas.height / this.canvas.width;
- var w = this.canvas.width;
- var h = this.canvas.height;
+ public updateClampBounds() {
+ let sourceAspect = this.srcImage.height / this.srcImage.width;
+ let canvasAspect = this.canvas.height / this.canvas.width;
+ let w = this.canvas.width;
+ let h = this.canvas.height;
if (canvasAspect > sourceAspect) {
w = this.canvas.width;
h = this.canvas.width * sourceAspect;
- }
- else {
+ } else {
h = this.canvas.height;
w = this.canvas.height / sourceAspect;
}
@@ -580,8 +574,8 @@ export class ImageCropper extends ImageCropperModel {
this.maxYClamp = this.canvas.height / 2 + h / 2;
}
- getCropBounds() {
- var bounds = this.getBounds();
+ public getCropBounds() {
+ let bounds = this.getBounds();
bounds.top = Math.round(( bounds.top + this.minYClamp) / this.ratioH);
bounds.bottom = Math.round(( bounds.bottom + this.minYClamp) / this.ratioH);
bounds.left = Math.round((bounds.left - this.minXClamp) / this.ratioW);
@@ -589,7 +583,7 @@ export class ImageCropper extends ImageCropperModel {
return bounds;
}
- clampPosition(x, y) {
+ public clampPosition(x: number, y: number) {
if (x < this.minXClamp) {
x = this.minXClamp;
}
@@ -605,11 +599,11 @@ export class ImageCropper extends ImageCropperModel {
return PointPool.instance.borrow(x, y);
}
- isImageSet() {
+ public isImageSet() {
return this.imageSet;
}
- setImage(img:any) {
+ public setImage(img: any) {
if (!img) {
throw "Image is null";
}
@@ -617,38 +611,36 @@ export class ImageCropper extends ImageCropperModel {
this.srcImage = img;
this.imageSet = true;
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
- var bufferContext = this.buffer.getContext('2d');
+ let bufferContext = this.buffer.getContext("2d");
bufferContext.clearRect(0, 0, this.buffer.width, this.buffer.height);
- var splitName = img.src.split('.');
- var fileType = splitName[1];
- if (fileType == 'png' || fileType == 'jpg') {
+ let splitName = img.src.split(".");
+ let fileType = splitName[1];
+ if (fileType === "png" || fileType === "jpg") {
this.fileType = fileType;
}
- //TODO: investigate better solution
- //this.fileType = img.src.match(/^data:.+\/(.+);base64,(.*)$/)[1];
-
-
+ // TODO: investigate better solution
+ // this.fileType = img.src.match(/^data:.+\/(.+);base64,(.*)$/)[1];
if (this.cropperSettings.minWithRelativeToResolution) {
this.minWidth = (this.canvas.width * this.minWidth / this.srcImage.width);
this.minHeight = (this.canvas.height * this.minHeight / this.srcImage.height);
}
this.updateClampBounds();
- var sourceAspect = this.srcImage.height / this.srcImage.width;
- var cropBounds = this.getBounds();
- var cropAspect = cropBounds.getHeight() / cropBounds.getWidth();
- var w = this.canvas.width;
- var h = this.canvas.height;
+ let sourceAspect: number = this.srcImage.height / this.srcImage.width;
+ let cropBounds: Bounds = this.getBounds();
+ let cropAspect: number = cropBounds.height / cropBounds.width;
+ let w: number = this.canvas.width;
+ let h: number = this.canvas.height;
this.canvasWidth = w;
this.canvasHeight = h;
- var cX = this.canvas.width / 2;
- var cY = this.canvas.height / 2;
- var tlPos = PointPool.instance.borrow(cX - cropBounds.getWidth() / 2, cY + cropBounds.getHeight() / 2);
- var trPos = PointPool.instance.borrow(cX + cropBounds.getWidth() / 2, cY + cropBounds.getHeight() / 2);
- var blPos = PointPool.instance.borrow(cX - cropBounds.getWidth() / 2, cY - cropBounds.getHeight() / 2);
- var brPos = PointPool.instance.borrow(cX + cropBounds.getWidth() / 2, cY - cropBounds.getHeight() / 2);
+ let cX: number = this.canvas.width / 2;
+ let cY: number = this.canvas.height / 2;
+ let tlPos: Point = PointPool.instance.borrow(cX - cropBounds.width / 2, cY + cropBounds.height / 2);
+ let trPos: Point = PointPool.instance.borrow(cX + cropBounds.width / 2, cY + cropBounds.height / 2);
+ let blPos: Point = PointPool.instance.borrow(cX - cropBounds.width / 2, cY - cropBounds.height / 2);
+ let brPos: Point = PointPool.instance.borrow(cX + cropBounds.width / 2, cY - cropBounds.height / 2);
this.tl.setPosition(tlPos.x, tlPos.y);
this.tr.setPosition(trPos.x, trPos.y);
this.bl.setPosition(blPos.x, blPos.y);
@@ -659,15 +651,15 @@ export class ImageCropper extends ImageCropperModel {
PointPool.instance.returnPoint(brPos);
this.center.setPosition(cX, cY);
if (cropAspect > sourceAspect) {
- var imageH = Math.min(w * sourceAspect, h);
- var cropW = imageH / cropAspect;
+ let imageH = Math.min(w * sourceAspect, h);
+ let cropW = imageH / cropAspect;
tlPos = PointPool.instance.borrow(cX - cropW / 2, cY + imageH / 2);
trPos = PointPool.instance.borrow(cX + cropW / 2, cY + imageH / 2);
blPos = PointPool.instance.borrow(cX - cropW / 2, cY - imageH / 2);
brPos = PointPool.instance.borrow(cX + cropW / 2, cY - imageH / 2);
} else {
- var imageW = Math.min(h / sourceAspect, w);
- var cropH = imageW * cropAspect;
+ let imageW = Math.min(h / sourceAspect, w);
+ let cropH = imageW * cropAspect;
tlPos = PointPool.instance.borrow(cX - imageW / 2, cY + cropH / 2);
trPos = PointPool.instance.borrow(cX + imageW / 2, cY + cropH / 2);
blPos = PointPool.instance.borrow(cX - imageW / 2, cY - cropH / 2);
@@ -682,46 +674,42 @@ export class ImageCropper extends ImageCropperModel {
PointPool.instance.returnPoint(trPos);
PointPool.instance.returnPoint(blPos);
PointPool.instance.returnPoint(brPos);
-
-
this.vertSquashRatio = ImageCropper.detectVerticalSquash(this.srcImage);
this.draw(this.ctx);
this.croppedImage = this.getCroppedImage(this.cropWidth, this.cropHeight);
}
- getCroppedImage(fillWidth?:number, fillHeight?:number) {
- var bounds = this.getBounds();
+ // todo: Unused parameters?
+ public getCroppedImage(fillWidth?: number, fillHeight?: number): HTMLImageElement {
+ let bounds: Bounds = this.getBounds();
if (!this.srcImage) {
throw "Source image not set.";
}
- var sourceAspect = this.srcImage.height / this.srcImage.width;
- var canvasAspect = this.canvas.height / this.canvas.width;
- var w = this.canvas.width;
- var h = this.canvas.height;
+ let sourceAspect: number = this.srcImage.height / this.srcImage.width;
+ let canvasAspect: number = this.canvas.height / this.canvas.width;
+ let w: number = this.canvas.width;
+ let h: number = this.canvas.height;
if (canvasAspect > sourceAspect) {
w = this.canvas.width;
h = this.canvas.width * sourceAspect;
- }
- else if (canvasAspect < sourceAspect) {
- h = this.canvas.height;
- w = this.canvas.height / sourceAspect;
- }
- else {
- h = this.canvas.height;
- w = this.canvas.width;
+ } else {
+ if (canvasAspect < sourceAspect) {
+ h = this.canvas.height;
+ w = this.canvas.height / sourceAspect;
+ } else {
+ h = this.canvas.height;
+ w = this.canvas.width;
+ }
}
this.ratioW = w / this.srcImage.width;
this.ratioH = h / this.srcImage.height;
- var offsetH = (this.buffer.height - h) / 2 / this.ratioH;
- var offsetW = (this.buffer.width - w) / 2 / this.ratioW;
+ let offsetH: number = (this.buffer.height - h) / 2 / this.ratioH;
+ let offsetW: number = (this.buffer.width - w) / 2 / this.ratioW;
- this.drawImageIOSFix(
- this.cropCanvas.getContext('2d'),
- this.srcImage,
+ this.drawImageIOSFix(this.cropCanvas.getContext("2d"), this.srcImage,
Math.max(Math.round((bounds.left) / this.ratioW - offsetW), 0),
Math.max(Math.round(bounds.top / this.ratioH - offsetH), 0),
- Math.max(Math.round(bounds.getWidth() / this.ratioW), 1),
- Math.max(Math.round(bounds.getHeight() / this.ratioH), 1),
+ Math.max(Math.round(bounds.width / this.ratioW), 1), Math.max(Math.round(bounds.height / this.ratioH), 1),
0, 0, this.cropCanvas.width, this.cropCanvas.height);
this.croppedImage.width = this.cropCanvas.width;
@@ -730,27 +718,27 @@ export class ImageCropper extends ImageCropperModel {
return this.croppedImage;
}
- getBounds() {
- var minX = Number.MAX_VALUE;
- var minY = Number.MAX_VALUE;
- var maxX = -Number.MAX_VALUE;
- var maxY = -Number.MAX_VALUE;
- for (var i = 0; i < this.markers.length; i++) {
- var marker = this.markers[i];
- if (marker.getPosition().x < minX) {
- minX = marker.getPosition().x;
+ public getBounds(): Bounds {
+ let minX = Number.MAX_VALUE;
+ let minY = Number.MAX_VALUE;
+ let maxX = -Number.MAX_VALUE;
+ let maxY = -Number.MAX_VALUE;
+ for (let i = 0; i < this.markers.length; i++) {
+ let marker = this.markers[i];
+ if (marker.position.x < minX) {
+ minX = marker.position.x;
}
- if (marker.getPosition().x > maxX) {
- maxX = marker.getPosition().x;
+ if (marker.position.x > maxX) {
+ maxX = marker.position.x;
}
- if (marker.getPosition().y < minY) {
- minY = marker.getPosition().y;
+ if (marker.position.y < minY) {
+ minY = marker.position.y;
}
- if (marker.getPosition().y > maxY) {
- maxY = marker.getPosition().y;
+ if (marker.position.y > maxY) {
+ maxY = marker.position.y;
}
}
- var bounds = new Bounds();
+ let bounds: Bounds = new Bounds();
bounds.left = minX;
bounds.right = maxX;
bounds.top = minY;
@@ -758,30 +746,27 @@ export class ImageCropper extends ImageCropperModel {
return bounds;
}
- setBounds(bounds) {
+ public setBounds(bounds: any) {
- var topLeft;
- var topRight;
- var bottomLeft;
- var bottomRight;
+ let topLeft: CornerMarker;
+ let topRight: CornerMarker;
+ let bottomLeft: CornerMarker;
+ let bottomRight: CornerMarker;
- var currentBounds = this.getBounds();
- for (var i = 0; i < this.markers.length; i++) {
- var marker = this.markers[i];
+ let currentBounds = this.getBounds();
+ for (let i = 0; i < this.markers.length; i++) {
+ let marker = this.markers[i];
- if (marker.getPosition().x == currentBounds.left) {
- if (marker.getPosition().y == currentBounds.top) {
+ if (marker.position.x === currentBounds.left) {
+ if (marker.position.y === currentBounds.top) {
topLeft = marker;
- }
- else {
+ } else {
bottomLeft = marker;
}
- }
- else {
- if (marker.getPosition().y == currentBounds.top) {
+ } else {
+ if (marker.position.y === currentBounds.top) {
topRight = marker;
- }
- else {
+ } else {
bottomRight = marker;
}
}
@@ -797,50 +782,48 @@ export class ImageCropper extends ImageCropperModel {
}
- onTouchMove(event:TouchEvent) {
+ public onTouchMove(event: TouchEvent) {
if (this.crop.isImageSet()) {
event.preventDefault();
if (event.touches.length === 1) {
- for (var i = 0; i < event.touches.length; i++) {
- var touch = event.touches[i];
- var touchPosition = ImageCropper.getTouchPos(this.canvas, touch);
- var cropTouch = new CropTouch(touchPosition.x, touchPosition.y, touch.identifier);
+ for (let i = 0; i < event.touches.length; i++) {
+ let touch = event.touches[i];
+ let touchPosition = ImageCropper.getTouchPos(this.canvas, touch);
+ let cropTouch = new CropTouch(touchPosition.x, touchPosition.y, touch.identifier);
PointPool.instance.returnPoint(touchPosition);
this.move(cropTouch);
}
- } else if (event.touches.length === 2) {
- var distance =
- ((event.touches[0].clientX - event.touches[1].clientX) * (event.touches[0].clientX - event.touches[1].clientX)) +
- ((event.touches[0].clientY - event.touches[1].clientY) * (event.touches[0].clientY - event.touches[1].clientY));
- if (this.previousDistance && this.previousDistance !== distance) {
- var increment:number = distance < this.previousDistance ? 1 : -1;
- var bounds:Bounds = this.getBounds();
-
- bounds.top += increment;
- bounds.left += increment;
- bounds.right -= increment;
- bounds.bottom -= increment;
-
- this.setBounds(bounds);
+ } else {
+ if (event.touches.length === 2) {
+ let distance = ((event.touches[0].clientX - event.touches[1].clientX) * (event.touches[0].clientX - event.touches[1].clientX)) + ((event.touches[0].clientY - event.touches[1].clientY) * (event.touches[0].clientY - event.touches[1].clientY));
+ if (this.previousDistance && this.previousDistance !== distance) {
+ let increment: number = distance < this.previousDistance ? 1 : -1;
+ let bounds: Bounds = this.getBounds();
+
+ bounds.top += increment;
+ bounds.left += increment;
+ bounds.right -= increment;
+ bounds.bottom -= increment;
+
+ this.setBounds(bounds);
+ }
+ this.previousDistance = distance;
}
-
- this.previousDistance = distance;
}
this.draw(this.ctx);
}
}
- onMouseMove(e) {
+ public onMouseMove(e: MouseEvent) {
if (this.crop.isImageSet()) {
- var mousePosition = ImageCropper.getMousePos(this.canvas, e);
+ let mousePosition = ImageCropper.getMousePos(this.canvas, e);
this.move(new CropTouch(mousePosition.x, mousePosition.y, 0));
- var dragTouch = this.getDragTouchForID(0);
+ let dragTouch = this.getDragTouchForID(0);
if (dragTouch) {
dragTouch.x = mousePosition.x;
dragTouch.y = mousePosition.y;
- }
- else {
+ } else {
dragTouch = new CropTouch(mousePosition.x, mousePosition.y, 0);
}
PointPool.instance.returnPoint(mousePosition);
@@ -849,73 +832,70 @@ export class ImageCropper extends ImageCropperModel {
}
}
- move(cropTouch) {
+ public move(cropTouch: CropTouch) {
if (this.isMouseDown) {
this.handleMove(cropTouch);
}
}
- getDragTouchForID(id) {
- for (var i = 0; i < this.currentDragTouches.length; i++) {
- if (id == this.currentDragTouches[i].id) {
+ public getDragTouchForID(id: any) {
+ for (let i = 0; i < this.currentDragTouches.length; i++) {
+ if (id === this.currentDragTouches[i].id) {
return this.currentDragTouches[i];
}
}
}
- drawCursors(cropTouch) {
- var cursorDrawn = false;
+ public drawCursors(cropTouch: CropTouch) {
+ let cursorDrawn = false;
if (cropTouch != null) {
- if (cropTouch.dragHandle == this.center) {
- ImageCropperDataShare.setStyle(this.canvas, 'move');
+ if (cropTouch.dragHandle === this.center) {
+ ImageCropperDataShare.setStyle(this.canvas, "move");
cursorDrawn = true;
}
- if (cropTouch.dragHandle != null && cropTouch.dragHandle instanceof CornerMarker) {
+ if (cropTouch.dragHandle !== null && cropTouch.dragHandle instanceof CornerMarker) {
- this.drawCornerCursor(cropTouch.dragHandle, cropTouch.dragHandle.getPosition().x, cropTouch.dragHandle.getPosition().y);
+ this.drawCornerCursor(cropTouch.dragHandle, cropTouch.dragHandle.position.x,
+ cropTouch.dragHandle.position.y);
cursorDrawn = true;
}
}
- var didDraw = false;
+ let didDraw = false;
if (!cursorDrawn) {
- for (var i = 0; i < this.markers.length; i++) {
+ for (let i = 0; i < this.markers.length; i++) {
didDraw = didDraw || this.drawCornerCursor(this.markers[i], cropTouch.x, cropTouch.y);
}
if (!didDraw) {
- ImageCropperDataShare.setStyle(this.canvas, 'initial');
+ ImageCropperDataShare.setStyle(this.canvas, "initial");
}
}
if (!didDraw && !cursorDrawn && this.center.touchInBounds(cropTouch.x, cropTouch.y)) {
this.center.setOver(true);
ImageCropperDataShare.setOver(this.canvas);
- ImageCropperDataShare.setStyle(this.canvas, 'move');
- }
- else {
+ ImageCropperDataShare.setStyle(this.canvas, "move");
+ } else {
this.center.setOver(false);
}
}
- drawCornerCursor(marker, x, y) {
+ public drawCornerCursor(marker: any, x: number, y: number) {
if (marker.touchInBounds(x, y)) {
marker.setOver(true);
- if (marker.getHorizontalNeighbour().getPosition().x > marker.getPosition().x) {
- if (marker.getVerticalNeighbour().getPosition().y > marker.getPosition().y) {
+ if (marker.getHorizontalNeighbour().position.x > marker.position.x) {
+ if (marker.getVerticalNeighbour().position.y > marker.position.y) {
ImageCropperDataShare.setOver(this.canvas);
- ImageCropperDataShare.setStyle(this.canvas, 'nwse-resize');
- }
- else {
+ ImageCropperDataShare.setStyle(this.canvas, "nwse-resize");
+ } else {
ImageCropperDataShare.setOver(this.canvas);
- ImageCropperDataShare.setStyle(this.canvas, 'nesw-resize');
+ ImageCropperDataShare.setStyle(this.canvas, "nesw-resize");
}
- }
- else {
- if (marker.getVerticalNeighbour().getPosition().y > marker.getPosition().y) {
+ } else {
+ if (marker.getVerticalNeighbour().position.y > marker.position.y) {
ImageCropperDataShare.setOver(this.canvas);
- ImageCropperDataShare.setStyle(this.canvas, 'nesw-resize');
- }
- else {
+ ImageCropperDataShare.setStyle(this.canvas, "nesw-resize");
+ } else {
ImageCropperDataShare.setOver(this.canvas);
- ImageCropperDataShare.setStyle(this.canvas, 'nwse-resize');
+ ImageCropperDataShare.setStyle(this.canvas, "nwse-resize");
}
}
return true;
@@ -924,18 +904,19 @@ export class ImageCropper extends ImageCropperModel {
return false;
}
- onTouchStart(event:TouchEvent) {
+ // todo: Unused param
+ public onTouchStart(event: TouchEvent) {
if (this.crop.isImageSet()) {
this.isMouseDown = true;
}
}
- onTouchEnd(event:TouchEvent) {
+ public onTouchEnd(event: TouchEvent) {
if (this.crop.isImageSet()) {
- for (var i = 0; i < event.changedTouches.length; i++) {
- var touch = event.changedTouches[i];
- var dragTouch = this.getDragTouchForID(touch.identifier);
- if (dragTouch != null) {
+ for (let i = 0; i < event.changedTouches.length; i++) {
+ let touch = event.changedTouches[i];
+ let dragTouch = this.getDragTouchForID(touch.identifier);
+ if (dragTouch !== null) {
if (dragTouch.dragHandle instanceof CornerMarker || dragTouch.dragHandle instanceof DragMarker) {
dragTouch.dragHandle.setOver(false);
}
@@ -943,37 +924,37 @@ export class ImageCropper extends ImageCropperModel {
}
}
- if (this.currentDragTouches.length == 0) {
+ if (this.currentDragTouches.length === 0) {
this.isMouseDown = false;
this.currentlyInteracting = false;
}
}
}
- //http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios
- drawImageIOSFix(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {
+ // http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios
+ public drawImageIOSFix(ctx: CanvasRenderingContext2D, img: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement,
+ sx: number, sy: number, sw: number, sh: number, dx: number, dy: number, dw: number,
+ dh: number) {
+
// Works only if whole image is displayed:
// ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);
// The following works correct also when only a part of the image is displayed:
- //ctx.drawImage(img, sx * this.vertSquashRatio, sy * this.vertSquashRatio, sw * this.vertSquashRatio, sh * this.vertSquashRatio, dx, dy, dw, dh);
+ // ctx.drawImage(img, sx * this.vertSquashRatio, sy * this.vertSquashRatio, sw * this.vertSquashRatio, sh *
+ // this.vertSquashRatio, dx, dy, dw, dh);
ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh);
}
-
- onMouseDown() {
+ public onMouseDown() {
if (this.crop.isImageSet()) {
this.isMouseDown = true;
}
}
-
- onMouseUp() {
+ public onMouseUp() {
if (this.crop.isImageSet()) {
ImageCropperDataShare.setReleased(this.canvas);
this.isMouseDown = false;
this.handleRelease(new CropTouch(0, 0, 0));
}
}
-
-
}
diff --git a/src/imageCropperComponent.d.ts b/src/imageCropperComponent.d.ts
deleted file mode 100644
index 0ce7aba3..00000000
--- a/src/imageCropperComponent.d.ts
+++ /dev/null
@@ -1,25 +0,0 @@
-import { Renderer, ElementRef, EventEmitter, Type } from '@angular/core';
-import { ImageCropper } from "./imageCropper";
-import { CropperSettings } from "./cropperSettings";
-export declare class ImageCropperComponent extends Type {
- cropcanvas: ElementRef;
- onCrop: EventEmitter;
- settings: CropperSettings;
- image: any;
- cropper: ImageCropper;
- croppedWidth: number;
- croppedHeight: number;
- intervalRef: number;
- private renderer;
- constructor(renderer: Renderer);
- ngAfterViewInit(): void;
- onTouchMove(event: any): void;
- onTouchStart(event: TouchEvent): void;
- onTouchEnd(event: any): void;
- onMouseDown(): void;
- onMouseUp(): void;
- onMouseMove(event: any): void;
- fileChangeListener($event: any): void;
- setImage(image: any): void;
- private getOrientedImage(image, callback);
-}
diff --git a/src/imageCropperComponent.js b/src/imageCropperComponent.js
deleted file mode 100644
index 1126da7e..00000000
--- a/src/imageCropperComponent.js
+++ /dev/null
@@ -1,167 +0,0 @@
-"use strict";
-var __extends = (this && this.__extends) || function (d, b) {
- for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-};
-var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
-};
-var core_1 = require('@angular/core');
-var imageCropper_1 = require("./imageCropper");
-var cropperSettings_1 = require("./cropperSettings");
-var exif_1 = require("./exif");
-var ImageCropperComponent = (function (_super) {
- __extends(ImageCropperComponent, _super);
- function ImageCropperComponent(renderer) {
- _super.call(this);
- this.onCrop = new core_1.EventEmitter();
- this.renderer = renderer;
- }
- ImageCropperComponent.prototype.ngAfterViewInit = function () {
- var canvas = this.cropcanvas.nativeElement;
- if (!this.settings) {
- this.settings = new cropperSettings_1.CropperSettings();
- }
- this.renderer.setElementAttribute(canvas, 'width', this.settings.canvasWidth.toString());
- this.renderer.setElementAttribute(canvas, 'height', this.settings.canvasHeight.toString());
- if (!this.cropper) {
- this.cropper = new imageCropper_1.ImageCropper(this.settings);
- }
- this.cropper.prepare(canvas);
- };
- ImageCropperComponent.prototype.onTouchMove = function (event) {
- this.cropper.onTouchMove(event);
- };
- ImageCropperComponent.prototype.onTouchStart = function (event) {
- this.cropper.onTouchStart(event);
- };
- ImageCropperComponent.prototype.onTouchEnd = function (event) {
- this.cropper.onTouchEnd(event);
- if (this.cropper.isImageSet()) {
- this.image.image = this.cropper.getCroppedImage().src;
- this.onCrop.emit(this.cropper.getCropBounds());
- }
- };
- ImageCropperComponent.prototype.onMouseDown = function () {
- this.cropper.onMouseDown();
- };
- ImageCropperComponent.prototype.onMouseUp = function () {
- if (this.cropper.isImageSet()) {
- this.cropper.onMouseUp();
- this.image.image = this.cropper.getCroppedImage().src;
- this.onCrop.emit(this.cropper.getCropBounds());
- }
- };
- ImageCropperComponent.prototype.onMouseMove = function (event) {
- this.cropper.onMouseMove(event);
- };
- ImageCropperComponent.prototype.fileChangeListener = function ($event) {
- var file = $event.target.files[0];
- if (this.settings.allowedFilesRegex.test(file.name)) {
- var image = new Image();
- var fileReader = new FileReader();
- var that = this;
- fileReader.addEventListener('loadend', function (loadEvent) {
- image.src = loadEvent.target.result;
- that.setImage(image);
- });
- fileReader.readAsDataURL(file);
- }
- };
- ImageCropperComponent.prototype.setImage = function (image) {
- var self = this;
- this.intervalRef = setInterval(function () {
- if (this.intervalRef) {
- clearInterval(this.intervalRef);
- }
- if (image.naturalHeight > 0) {
- image.height = image.naturalHeight;
- image.width = image.naturalWidth;
- clearInterval(self.intervalRef);
- self.getOrientedImage(image, function (img) {
- self.cropper.setImage(img);
- self.image.original = img;
- self.image.image = self.cropper.getCroppedImage().src;
- self.onCrop.emit(self.cropper.getCropBounds());
- });
- }
- }, 10);
- };
- ImageCropperComponent.prototype.getOrientedImage = function (image, callback) {
- var img;
- exif_1.Exif.getData(image, function () {
- var orientation = exif_1.Exif.getTag(image, 'Orientation');
- if ([3, 6, 8].indexOf(orientation) > -1) {
- var canvas = document.createElement("canvas"), ctx = canvas.getContext("2d"), cw = image.width, ch = image.height, cx = 0, cy = 0, deg = 0;
- switch (orientation) {
- case 3:
- cx = -image.width;
- cy = -image.height;
- deg = 180;
- break;
- case 6:
- cw = image.height;
- ch = image.width;
- cy = -image.height;
- deg = 90;
- break;
- case 8:
- cw = image.height;
- ch = image.width;
- cx = -image.width;
- deg = 270;
- break;
- }
- canvas.width = cw;
- canvas.height = ch;
- ctx.rotate(deg * Math.PI / 180);
- ctx.drawImage(image, cx, cy);
- img = document.createElement("img");
- img.width = cw;
- img.height = ch;
- img.src = canvas.toDataURL("image/png");
- }
- else {
- img = image;
- }
- callback(img);
- });
- };
- __decorate([
- core_1.ViewChild('cropcanvas', undefined),
- __metadata('design:type', core_1.ElementRef)
- ], ImageCropperComponent.prototype, "cropcanvas", void 0);
- __decorate([
- core_1.Output(),
- __metadata('design:type', core_1.EventEmitter)
- ], ImageCropperComponent.prototype, "onCrop", void 0);
- __decorate([
- core_1.Input(),
- __metadata('design:type', cropperSettings_1.CropperSettings)
- ], ImageCropperComponent.prototype, "settings", void 0);
- __decorate([
- core_1.Input(),
- __metadata('design:type', Object)
- ], ImageCropperComponent.prototype, "image", void 0);
- __decorate([
- core_1.Input(),
- __metadata('design:type', imageCropper_1.ImageCropper)
- ], ImageCropperComponent.prototype, "cropper", void 0);
- ImageCropperComponent = __decorate([
- core_1.Component({
- selector: 'img-cropper',
- template: "\n \n \n \n \n "
- }),
- __metadata('design:paramtypes', [core_1.Renderer])
- ], ImageCropperComponent);
- return ImageCropperComponent;
-}(core_1.Type));
-exports.ImageCropperComponent = ImageCropperComponent;
-//# sourceMappingURL=imageCropperComponent.js.map
\ No newline at end of file
diff --git a/src/imageCropperComponent.js.map b/src/imageCropperComponent.js.map
deleted file mode 100644
index 07d5fef4..00000000
--- a/src/imageCropperComponent.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"imageCropperComponent.js","sourceRoot":"","sources":["imageCropperComponent.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/src/imageCropperComponent.ts b/src/imageCropperComponent.ts
index 1908227f..8d0fc280 100644
--- a/src/imageCropperComponent.ts
+++ b/src/imageCropperComponent.ts
@@ -1,11 +1,10 @@
-import {Component, Input, Renderer, ViewChild, ElementRef, Output, EventEmitter, Type} from '@angular/core';
+import {Component, Input, Renderer, ViewChild, ElementRef, Output, EventEmitter, Type} from "@angular/core";
import {ImageCropper} from "./imageCropper";
import {CropperSettings} from "./cropperSettings";
import {Exif} from "./exif";
@Component({
- selector: 'img-cropper',
- template: `
+ selector: "img-cropper", template: `