{"version":3,"file":"ngx-img-cropper.mjs","sources":["../../../projects/ngx-img-cropper/src/lib/image-cropper/cropper-draw-settings.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/cropper-settings.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/exif.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/model/point.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/model/pointPool.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/model/bounds.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/model/handle.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/model/cornerMarker.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/model/cropTouch.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/model/dragMarker.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/model/imageCropperModel.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/imageCropperDataShare.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/imageCropper.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/model/cropPosition.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/image-cropper.component.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/image-cropper.component.html","../../../projects/ngx-img-cropper/src/lib/image-cropper/image-cropper.module.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/image-cropper.service.ts","../../../projects/ngx-img-cropper/src/lib/image-cropper/model/cropService.ts","../../../projects/ngx-img-cropper/src/public_api.ts","../../../projects/ngx-img-cropper/src/ngx-img-cropper.ts"],"sourcesContent":["export class CropperDrawSettings {\n  public lineDash = false;\n  public strokeWidth = 1;\n  public strokeColor = 'rgba(255,255,255,1)';\n  public fillColor = 'rgba(255,255,255,1)';\n  public dragIconStrokeWidth = 1;\n  public dragIconStrokeColor = 'rgba(0,0,0,1)';\n  public dragIconFillColor = 'rgba(255,255,255,1)';\n  public backgroundFillColor = 'rgba(0,0,0,0.6)';\n\n  constructor(settings?: any) {\n    if (typeof settings === 'object') {\n      this.lineDash = settings.lineDash || this.lineDash;\n      this.strokeWidth = settings.strokeWidth || this.strokeWidth;\n      this.fillColor = settings.fillColor || this.fillColor;\n      this.strokeColor = settings.strokeColor || this.strokeColor;\n      this.dragIconStrokeWidth =\n        settings.dragIconStrokeWidth || this.dragIconStrokeWidth;\n      this.dragIconStrokeColor =\n        settings.dragIconStrokeColor || this.dragIconStrokeColor;\n      this.dragIconFillColor =\n        settings.dragIconFillColor || this.dragIconFillColor;\n      this.backgroundFillColor =\n        settings.backgroundFillColor || this.backgroundFillColor;\n    }\n  }\n}\n","import { CropperDrawSettings } from './cropper-draw-settings';\n\nexport interface ICropperSettings {\n  canvasWidth?: number;\n  canvasHeight?: number;\n  dynamicSizing?: boolean;\n  cropperClass?: string;\n  croppingClass?: string;\n  width?: number;\n  height?: number;\n  minWidth?: number;\n  minHeight?: number;\n  minWithRelativeToResolution?: boolean;\n  croppedWidth?: number;\n  croppedHeight?: number;\n  cropperDrawSettings?: any;\n  touchRadius?: number;\n  noFileInput?: boolean;\n  fileType?: string;\n  resampleFn?: (c: HTMLCanvasElement) => void;\n  markerSizeMultiplier?: number;\n  centerTouchRadius?: number;\n  showCenterMarker?: boolean;\n  allowedFilesRegex?: RegExp;\n  cropOnResize?: boolean;\n  preserveSize?: boolean;\n  compressRatio?: number;\n  rounded?: boolean;\n  keepAspect?: boolean;\n}\n\nexport class CropperSettings implements ICropperSettings {\n  public canvasWidth = 300;\n  public canvasHeight = 300;\n\n  public dynamicSizing = false;\n  public cropperClass: string;\n  public croppingClass: string;\n\n  public width = 200;\n  public height = 200;\n\n  public minWidth = 50;\n  public minHeight = 50;\n  public minWithRelativeToResolution = true;\n\n  public croppedWidth = 100;\n  public croppedHeight = 100;\n\n  public cropperDrawSettings: CropperDrawSettings = new CropperDrawSettings();\n  public touchRadius = 20;\n  public noFileInput = false;\n\n  public fileType: string;\n\n  public resampleFn: (c: HTMLCanvasElement) => void;\n\n  public markerSizeMultiplier = 1;\n  public centerTouchRadius = 20;\n  public showCenterMarker = true;\n\n  public allowedFilesRegex: RegExp = /\\.(jpe?g|png|gif|bmp)$/i;\n  public cropOnResize = true;\n  public preserveSize = false;\n\n  public compressRatio = 1.0;\n\n  // tslint:disable-next-line:variable-name\n  private _rounded = false;\n  // tslint:disable-next-line:variable-name\n  private _keepAspect = true;\n\n  constructor(settings?: ICropperSettings) {\n    if (typeof settings === 'object') {\n      Object.assign(this, settings);\n    }\n  }\n\n  set rounded(val: boolean) {\n    this._rounded = val;\n    if (val) {\n      this._keepAspect = true;\n    }\n  }\n\n  get rounded(): boolean {\n    return this._rounded;\n  }\n\n  set keepAspect(val: boolean) {\n    this._keepAspect = val;\n    if (this._rounded === true && this._keepAspect === false) {\n      console.error(\n        'Cannot set keep aspect to false on rounded cropper. Ellipsis not supported'\n      );\n      this._keepAspect = true;\n    }\n  }\n\n  get keepAspect(): boolean {\n    return this._keepAspect;\n  }\n}\n","export class Fraction extends Number {\n  numerator: number;\n  denominator: number;\n}\n\nexport interface IImageExtended extends HTMLImageElement {\n  exifdata: any;\n  iptcdata: any;\n}\n\nexport class Exif {\n  public debug = false;\n\n  public IptcFieldMap: any = {\n    0x78: 'caption',\n    0x6e: 'credit',\n    0x19: 'keywords',\n    0x37: 'dateCreated',\n    0x50: 'byline',\n    0x55: 'bylineTitle',\n    0x7a: 'captionWriter',\n    0x69: 'headline',\n    0x74: 'copyright',\n    0x0f: 'category'\n  };\n\n  public Tags: any = {\n    // version tags\n    0x9000: 'ExifVersion', // EXIF version\n    0xa000: 'FlashpixVersion', // Flashpix format version\n\n    // colorspace tags\n    0xa001: 'ColorSpace', // Color space information tag\n\n    // image configuration\n    0xa002: 'PixelXDimension', // Valid width of meaningful image\n    0xa003: 'PixelYDimension', // Valid height of meaningful image\n    0x9101: 'ComponentsConfiguration', // Information about channels\n    0x9102: 'CompressedBitsPerPixel', // Compressed bits per pixel\n\n    // user information\n    0x927c: 'MakerNote', // Any desired information written by the manufacturer\n    0x9286: 'UserComment', // Comments by user\n\n    // related file\n    0xa004: 'RelatedSoundFile', // Name of related sound file\n\n    // date and time\n    0x9003: 'DateTimeOriginal', // Date and time when the original image was generated\n    0x9004: 'DateTimeDigitized', // Date and time when the image was stored digitally\n    0x9290: 'SubsecTime', // Fractions of seconds for DateTime\n    0x9291: 'SubsecTimeOriginal', // Fractions of seconds for DateTimeOriginal\n    0x9292: 'SubsecTimeDigitized', // Fractions of seconds for DateTimeDigitized\n\n    // picture-taking conditions\n    0x829a: 'ExposureTime', // Exposure time (in seconds)\n    0x829d: 'FNumber', // F number\n    0x8822: 'ExposureProgram', // Exposure program\n    0x8824: 'SpectralSensitivity', // Spectral sensitivity\n    0x8827: 'ISOSpeedRatings', // ISO speed rating\n    0x8828: 'OECF', // Optoelectric conversion factor\n    0x9201: 'ShutterSpeedValue', // Shutter speed\n    0x9202: 'ApertureValue', // Lens aperture\n    0x9203: 'BrightnessValue', // Value of brightness\n    0x9204: 'ExposureBias', // Exposure bias\n    0x9205: 'MaxApertureValue', // Smallest F number of lens\n    0x9206: 'SubjectDistance', // Distance to subject in meters\n    0x9207: 'MeteringMode', // Metering mode\n    0x9208: 'LightSource', // Kind of light source\n    0x9209: 'Flash', // Flash status\n    0x9214: 'SubjectArea', // Location and area of main subject\n    0x920a: 'FocalLength', // Focal length of the lens in mm\n    0xa20b: 'FlashEnergy', // Strobe energy in BCPS\n    0xa20c: 'SpatialFrequencyResponse', //\n    0xa20e: 'FocalPlaneXResolution', // Number of pixels in width direction per FocalPlaneResolutionUnit\n    0xa20f: 'FocalPlaneYResolution', // Number of pixels in height direction per FocalPlaneResolutionUnit\n    0xa210: 'FocalPlaneResolutionUnit', // Unit for measuring FocalPlaneXResolution and FocalPlaneYResolution\n    0xa214: 'SubjectLocation', // Location of subject in image\n    0xa215: 'ExposureIndex', // Exposure index selected on camera\n    0xa217: 'SensingMethod', // Image sensor type\n    0xa300: 'FileSource', // Image source (3 == DSC)\n    0xa301: 'SceneType', // Scene type (1 == directly photographed)\n    0xa302: 'CFAPattern', // Color filter array geometric pattern\n    0xa401: 'CustomRendered', // Special processing\n    0xa402: 'ExposureMode', // Exposure mode\n    0xa403: 'WhiteBalance', // 1 = auto white balance, 2 = manual\n    0xa404: 'DigitalZoomRation', // Digital zoom ratio\n    0xa405: 'FocalLengthIn35mmFilm', // Equivalent foacl length assuming 35mm film camera (in mm)\n    0xa406: 'SceneCaptureType', // Type of scene\n    0xa407: 'GainControl', // Degree of overall image gain adjustment\n    0xa408: 'Contrast', // Direction of contrast processing applied by camera\n    0xa409: 'Saturation', // Direction of saturation processing applied by camera\n    0xa40a: 'Sharpness', // Direction of sharpness processing applied by camera\n    0xa40b: 'DeviceSettingDescription', //\n    0xa40c: 'SubjectDistanceRange', // Distance to subject\n\n    // other tags\n    0xa005: 'InteroperabilityIFDPointer',\n    0xa420: 'ImageUniqueID' // Identifier assigned uniquely to each image\n  };\n\n  public TiffTags: any = {\n    0x0100: 'ImageWidth',\n    0x0101: 'ImageHeight',\n    0x8769: 'ExifIFDPointer',\n    0x8825: 'GPSInfoIFDPointer',\n    0xa005: 'InteroperabilityIFDPointer',\n    0x0102: 'BitsPerSample',\n    0x0103: 'Compression',\n    0x0106: 'PhotometricInterpretation',\n    0x0112: 'Orientation',\n    0x0115: 'SamplesPerPixel',\n    0x011c: 'PlanarConfiguration',\n    0x0212: 'YCbCrSubSampling',\n    0x0213: 'YCbCrPositioning',\n    0x011a: 'XResolution',\n    0x011b: 'YResolution',\n    0x0128: 'ResolutionUnit',\n    0x0111: 'StripOffsets',\n    0x0116: 'RowsPerStrip',\n    0x0117: 'StripByteCounts',\n    0x0201: 'JPEGInterchangeFormat',\n    0x0202: 'JPEGInterchangeFormatLength',\n    0x012d: 'TransferFunction',\n    0x013e: 'WhitePoint',\n    0x013f: 'PrimaryChromaticities',\n    0x0211: 'YCbCrCoefficients',\n    0x0214: 'ReferenceBlackWhite',\n    0x0132: 'DateTime',\n    0x010e: 'ImageDescription',\n    0x010f: 'Make',\n    0x0110: 'Model',\n    0x0131: 'Software',\n    0x013b: 'Artist',\n    0x8298: 'Copyright'\n  };\n\n  public GPSTags: any = {\n    0x0000: 'GPSVersionID',\n    0x0001: 'GPSLatitudeRef',\n    0x0002: 'GPSLatitude',\n    0x0003: 'GPSLongitudeRef',\n    0x0004: 'GPSLongitude',\n    0x0005: 'GPSAltitudeRef',\n    0x0006: 'GPSAltitude',\n    0x0007: 'GPSTimeStamp',\n    0x0008: 'GPSSatellites',\n    0x0009: 'GPSStatus',\n    0x000a: 'GPSMeasureMode',\n    0x000b: 'GPSDOP',\n    0x000c: 'GPSSpeedRef',\n    0x000d: 'GPSSpeed',\n    0x000e: 'GPSTrackRef',\n    0x000f: 'GPSTrack',\n    0x0010: 'GPSImgDirectionRef',\n    0x0011: 'GPSImgDirection',\n    0x0012: 'GPSMapDatum',\n    0x0013: 'GPSDestLatitudeRef',\n    0x0014: 'GPSDestLatitude',\n    0x0015: 'GPSDestLongitudeRef',\n    0x0016: 'GPSDestLongitude',\n    0x0017: 'GPSDestBearingRef',\n    0x0018: 'GPSDestBearing',\n    0x0019: 'GPSDestDistanceRef',\n    0x001a: 'GPSDestDistance',\n    0x001b: 'GPSProcessingMethod',\n    0x001c: 'GPSAreaInformation',\n    0x001d: 'GPSDateStamp',\n    0x001e: 'GPSDifferential'\n  };\n\n  public StringValues: any = {\n    ExposureProgram: {\n      0: 'Not defined',\n      1: 'Manual',\n      2: 'Normal program',\n      3: 'Aperture priority',\n      4: 'Shutter priority',\n      5: 'Creative program',\n      6: 'Action program',\n      7: 'Portrait mode',\n      8: 'Landscape mode'\n    },\n    MeteringMode: {\n      0: 'Unknown',\n      1: 'Average',\n      2: 'CenterWeightedAverage',\n      3: 'Spot',\n      4: 'MultiSpot',\n      5: 'Pattern',\n      6: 'Partial',\n      255: 'Other'\n    },\n    LightSource: {\n      0: 'Unknown',\n      1: 'Daylight',\n      2: 'Fluorescent',\n      3: 'Tungsten (incandescent light)',\n      4: 'Flash',\n      9: 'Fine weather',\n      10: 'Cloudy weather',\n      11: 'Shade',\n      12: 'Daylight fluorescent (D 5700 - 7100K)',\n      13: 'Day white fluorescent (N 4600 - 5400K)',\n      14: 'Cool white fluorescent (W 3900 - 4500K)',\n      15: 'White fluorescent (WW 3200 - 3700K)',\n      17: 'Standard light A',\n      18: 'Standard light B',\n      19: 'Standard light C',\n      20: 'D55',\n      21: 'D65',\n      22: 'D75',\n      23: 'D50',\n      24: 'ISO studio tungsten',\n      255: 'Other'\n    },\n    Flash: {\n      0x0000: 'Flash did not fire',\n      0x0001: 'Flash fired',\n      0x0005: 'Strobe return light not detected',\n      0x0007: 'Strobe return light detected',\n      0x0009: 'Flash fired, compulsory flash mode',\n      0x000d: 'Flash fired, compulsory flash mode, return light not detected',\n      0x000f: 'Flash fired, compulsory flash mode, return light detected',\n      0x0010: 'Flash did not fire, compulsory flash mode',\n      0x0018: 'Flash did not fire, auto mode',\n      0x0019: 'Flash fired, auto mode',\n      0x001d: 'Flash fired, auto mode, return light not detected',\n      0x001f: 'Flash fired, auto mode, return light detected',\n      0x0020: 'No flash function',\n      0x0041: 'Flash fired, red-eye reduction mode',\n      0x0045: 'Flash fired, red-eye reduction mode, return light not detected',\n      0x0047: 'Flash fired, red-eye reduction mode, return light detected',\n      0x0049: 'Flash fired, compulsory flash mode, red-eye reduction mode',\n      0x004d: 'Flash fired, compulsory flash mode, red-eye reduction mode, return light not detected',\n      0x004f: 'Flash fired, compulsory flash mode, red-eye reduction mode, return light detected',\n      0x0059: 'Flash fired, auto mode, red-eye reduction mode',\n      0x005d: 'Flash fired, auto mode, return light not detected, red-eye reduction mode',\n      0x005f: 'Flash fired, auto mode, return light detected, red-eye reduction mode'\n    },\n    SensingMethod: {\n      1: 'Not defined',\n      2: 'One-chip color area sensor',\n      3: 'Two-chip color area sensor',\n      4: 'Three-chip color area sensor',\n      5: 'Color sequential area sensor',\n      7: 'Trilinear sensor',\n      8: 'Color sequential linear sensor'\n    },\n    SceneCaptureType: {\n      0: 'Standard',\n      1: 'Landscape',\n      2: 'Portrait',\n      3: 'Night scene'\n    },\n    SceneType: {\n      1: 'Directly photographed'\n    },\n    CustomRendered: {\n      0: 'Normal process',\n      1: 'Custom process'\n    },\n    WhiteBalance: {\n      0: 'Auto white balance',\n      1: 'Manual white balance'\n    },\n    GainControl: {\n      0: 'None',\n      1: 'Low gain up',\n      2: 'High gain up',\n      3: 'Low gain down',\n      4: 'High gain down'\n    },\n    Contrast: {\n      0: 'Normal',\n      1: 'Soft',\n      2: 'Hard'\n    },\n    Saturation: {\n      0: 'Normal',\n      1: 'Low saturation',\n      2: 'High saturation'\n    },\n    Sharpness: {\n      0: 'Normal',\n      1: 'Soft',\n      2: 'Hard'\n    },\n    SubjectDistanceRange: {\n      0: 'Unknown',\n      1: 'Macro',\n      2: 'Close view',\n      3: 'Distant view'\n    },\n    FileSource: {\n      3: 'DSC'\n    },\n\n    Components: {\n      0: '',\n      1: 'Y',\n      2: 'Cb',\n      3: 'Cr',\n      4: 'R',\n      5: 'G',\n      6: 'B'\n    }\n  };\n\n  public addEvent(\n    element: EventTarget | any,\n    event: string,\n    handler: EventListener\n  ) {\n    if (element.addEventListener) {\n      element.addEventListener(event, handler, false);\n    } else {\n      // Hello, IE!\n      if (element.attachEvent) {\n        element.attachEvent('on' + event, handler);\n      }\n    }\n  }\n\n  public imageHasData(img: IImageExtended) {\n    return !!img.exifdata;\n  }\n\n  public base64ToArrayBuffer(base64: string): ArrayBuffer {\n    base64 = base64.replace(/^data:([^;]+);base64,/gim, '');\n    const binary: string = atob(base64);\n    const len: number = binary.length;\n    const buffer: ArrayBuffer = new ArrayBuffer(len);\n    const view: Uint8Array = new Uint8Array(buffer);\n    for (let i = 0; i < len; i++) {\n      view[i] = binary.charCodeAt(i);\n    }\n    return buffer;\n  }\n\n  public objectURLToBlob(url: string, callback: (blob: Blob) => void) {\n    const http: XMLHttpRequest = new XMLHttpRequest();\n    http.open('GET', url, true);\n    http.responseType = 'blob';\n    http.onload = () => {\n      if (http.status === 200 || http.status === 0) {\n        callback(http.response);\n      }\n    };\n    http.send();\n  }\n\n  public getImageData(\n    img: IImageExtended | Blob | File,\n    callback: (img: IImageExtended) => void\n  ) {\n    const handleBinaryFile = (binFile: ArrayBuffer) => {\n      const data = this.findEXIFinJPEG(binFile);\n      const iptcdata = this.findIPTCinJPEG(binFile);\n      (img as IImageExtended).exifdata = data || {};\n      (img as IImageExtended).iptcdata = iptcdata || {};\n      if (callback) {\n        callback.call(img);\n      }\n    };\n\n    if ('src' in img && (img as IImageExtended).src) {\n      if (/^data:/i.test((img as IImageExtended).src)) {\n        // Data URI\n        const arrayBuffer = this.base64ToArrayBuffer(\n          (img as IImageExtended).src\n        );\n        handleBinaryFile(arrayBuffer);\n      } else {\n        if (/^blob:/i.test((img as IImageExtended).src)) {\n          // Object URL\n          const fileReader = new FileReader();\n          fileReader.onload = (e: any) => {\n            handleBinaryFile(e.target.result);\n          };\n          this.objectURLToBlob((img as IImageExtended).src, (blob: Blob) => {\n            fileReader.readAsArrayBuffer(blob);\n          });\n        } else {\n          const http = new XMLHttpRequest();\n          http.onload = () => {\n            if (http.status === 200 || http.status === 0) {\n              handleBinaryFile(http.response);\n            } else {\n              throw new Error('Could not load image');\n            }\n          };\n          http.open('GET', (img as IImageExtended).src, true);\n          http.responseType = 'arraybuffer';\n          http.send(null);\n        }\n      }\n    } else {\n      if (FileReader && (img instanceof Blob || img instanceof File)) {\n        const fileReader = new FileReader();\n        fileReader.onload = (e: any) => {\n          this.log('Got file of length ' + e.target.result.byteLength);\n          handleBinaryFile(e.target.result);\n        };\n\n        fileReader.readAsArrayBuffer(img);\n      }\n    }\n  }\n\n  public findEXIFinJPEG(file: ArrayBuffer) {\n    const dataView = new DataView(file);\n\n    this.log('Got file of length ' + file.byteLength);\n    if (dataView.getUint8(0) !== 0xff || dataView.getUint8(1) !== 0xd8) {\n      this.log('Not a valid JPEG');\n      return false; // not a valid jpeg\n    }\n\n    let offset = 2;\n    const length: number = file.byteLength;\n    let marker: number;\n\n    while (offset < length) {\n      if (dataView.getUint8(offset) !== 0xff) {\n        this.log(\n          'Not a valid marker at offset ' +\n            offset +\n            ', found: ' +\n            dataView.getUint8(offset)\n        );\n        return false; // not a valid marker, something is wrong\n      }\n\n      marker = dataView.getUint8(offset + 1);\n      this.log(marker);\n\n      // we could implement handling for other markers here,\n      // but we're only looking for 0xFFE1 for EXIF data\n      if (marker === 225) {\n        this.log('Found 0xFFE1 marker');\n        return this.readEXIFData(dataView, offset + 4); // , dataView.getUint16(offset + 2) - 2);\n        // offset += 2 + file.getShortAt(offset+2, true);\n      } else {\n        offset += 2 + dataView.getUint16(offset + 2);\n      }\n    }\n  }\n\n  public findIPTCinJPEG(file: ArrayBuffer) {\n    const dataView = new DataView(file);\n\n    this.log('Got file of length ' + file.byteLength);\n    if (dataView.getUint8(0) !== 0xff || dataView.getUint8(1) !== 0xd8) {\n      this.log('Not a valid JPEG');\n      return false; // not a valid jpeg\n    }\n\n    let offset = 2;\n    const length = file.byteLength;\n\n    // tslint:disable-next-line:variable-name\n    const isFieldSegmentStart = (_dataView: DataView, _offset: number) => {\n      return (\n        _dataView.getUint8(_offset) === 0x38 &&\n        _dataView.getUint8(_offset + 1) === 0x42 &&\n        _dataView.getUint8(_offset + 2) === 0x49 &&\n        _dataView.getUint8(_offset + 3) === 0x4d &&\n        _dataView.getUint8(_offset + 4) === 0x04 &&\n        _dataView.getUint8(_offset + 5) === 0x04\n      );\n    };\n\n    while (offset < length) {\n      if (isFieldSegmentStart(dataView, offset)) {\n        // Get the length of the name header (which is padded to an even number of bytes)\n        let nameHeaderLength = dataView.getUint8(offset + 7);\n        if (nameHeaderLength % 2 !== 0) {\n          nameHeaderLength += 1;\n        }\n        // Check for pre photoshop 6 format\n        if (nameHeaderLength === 0) {\n          // Always 4\n          nameHeaderLength = 4;\n        }\n\n        const startOffset = offset + 8 + nameHeaderLength;\n        const sectionLength = dataView.getUint16(offset + 6 + nameHeaderLength);\n\n        return this.readIPTCData(file, startOffset, sectionLength);\n      }\n\n      // Not the marker, continue searching\n      offset++;\n    }\n  }\n\n  public readIPTCData(\n    file: ArrayBuffer,\n    startOffset: number,\n    sectionLength: number\n  ) {\n    const dataView = new DataView(file);\n    const data: any = {};\n    let fieldValue: any;\n    let fieldName: string;\n    let dataSize: number;\n    let segmentType: any;\n    let segmentSize: number;\n    let segmentStartPos = startOffset;\n    while (segmentStartPos < startOffset + sectionLength) {\n      if (\n        dataView.getUint8(segmentStartPos) === 0x1c &&\n        dataView.getUint8(segmentStartPos + 1) === 0x02\n      ) {\n        segmentType = dataView.getUint8(segmentStartPos + 2);\n        if (segmentType in this.IptcFieldMap) {\n          dataSize = dataView.getInt16(segmentStartPos + 3);\n          segmentSize = dataSize + 5;\n          fieldName = this.IptcFieldMap[segmentType];\n          fieldValue = this.getStringFromDB(\n            dataView,\n            segmentStartPos + 5,\n            dataSize\n          );\n          // Check if we already stored a value with this name\n          if (data.hasOwnProperty(fieldName)) {\n            // Value already stored with this name, create multivalue field\n            if (data[fieldName] instanceof Array) {\n              data[fieldName].push(fieldValue);\n            } else {\n              data[fieldName] = [data[fieldName], fieldValue];\n            }\n          } else {\n            data[fieldName] = fieldValue;\n          }\n        }\n      }\n      segmentStartPos++;\n    }\n    return data;\n  }\n\n  public readTags(\n    file: DataView,\n    tiffStart: number,\n    dirStart: number,\n    strings: string[],\n    bigEnd: boolean\n  ): any {\n    const entries: number = file.getUint16(dirStart, !bigEnd);\n    const tags: any = {};\n    let entryOffset: number;\n    let tag: string;\n\n    for (let i = 0; i < entries; i++) {\n      entryOffset = dirStart + i * 12 + 2;\n      tag = strings[file.getUint16(entryOffset, !bigEnd)];\n      if (!tag) {\n        this.log('Unknown tag: ' + file.getUint16(entryOffset, !bigEnd));\n      }\n      tags[tag] = this.readTagValue(\n        file,\n        entryOffset,\n        tiffStart,\n        dirStart,\n        bigEnd\n      );\n    }\n    return tags;\n  }\n\n  public readTagValue(\n    file: any,\n    entryOffset: number,\n    tiffStart: number,\n    dirStart: number,\n    bigEnd: boolean\n  ): any {\n    const type: number = file.getUint16(entryOffset + 2, !bigEnd);\n    const numValues = file.getUint32(entryOffset + 4, !bigEnd);\n    const valueOffset = file.getUint32(entryOffset + 8, !bigEnd) + tiffStart;\n    let offset: number;\n    let vals: any[];\n    let val: any;\n    let n: number;\n    let numerator: any;\n    let denominator: any;\n\n    switch (type) {\n      case 1: // byte, 8-bit unsigned int\n      case 7: // undefined, 8-bit byte, value depending on field\n        if (numValues === 1) {\n          return file.getUint8(entryOffset + 8, !bigEnd);\n        } else {\n          offset = numValues > 4 ? valueOffset : entryOffset + 8;\n          vals = [];\n          for (n = 0; n < numValues; n++) {\n            vals[n] = file.getUint8(offset + n);\n          }\n          return vals;\n        }\n\n      case 2: // ascii, 8-bit byte\n        offset = numValues > 4 ? valueOffset : entryOffset + 8;\n        return this.getStringFromDB(file, offset, numValues - 1);\n\n      case 3: // short, 16 bit int\n        if (numValues === 1) {\n          return file.getUint16(entryOffset + 8, !bigEnd);\n        } else {\n          offset = numValues > 2 ? valueOffset : entryOffset + 8;\n          vals = [];\n          for (n = 0; n < numValues; n++) {\n            vals[n] = file.getUint16(offset + 2 * n, !bigEnd);\n          }\n          return vals;\n        }\n\n      case 4: // long, 32 bit int\n        if (numValues === 1) {\n          return file.getUint32(entryOffset + 8, !bigEnd);\n        } else {\n          vals = [];\n          for (n = 0; n < numValues; n++) {\n            vals[n] = file.getUint32(valueOffset + 4 * n, !bigEnd);\n          }\n          return vals;\n        }\n\n      case 5: // rational = two long values, first is numerator, second is denominator\n        if (numValues === 1) {\n          numerator = file.getUint32(valueOffset, !bigEnd);\n          denominator = file.getUint32(valueOffset + 4, !bigEnd);\n          val = new Fraction(numerator / denominator);\n          val.numerator = numerator;\n          val.denominator = denominator;\n          return val;\n        } else {\n          vals = [];\n          for (n = 0; n < numValues; n++) {\n            numerator = file.getUint32(valueOffset + 8 * n, !bigEnd);\n            denominator = file.getUint32(valueOffset + 4 + 8 * n, !bigEnd);\n            vals[n] = new Fraction(numerator / denominator);\n            vals[n].numerator = numerator;\n            vals[n].denominator = denominator;\n          }\n          return vals;\n        }\n\n      case 9: // slong, 32 bit signed int\n        if (numValues === 1) {\n          return file.getInt32(entryOffset + 8, !bigEnd);\n        } else {\n          vals = [];\n          for (n = 0; n < numValues; n++) {\n            vals[n] = file.getInt32(valueOffset + 4 * n, !bigEnd);\n          }\n          return vals;\n        }\n\n      case 10: // signed rational, two slongs, first is numerator, second is denominator\n        if (numValues === 1) {\n          return (\n            file.getInt32(valueOffset, !bigEnd) /\n            file.getInt32(valueOffset + 4, !bigEnd)\n          );\n        } else {\n          vals = [];\n          for (n = 0; n < numValues; n++) {\n            vals[n] =\n              file.getInt32(valueOffset + 8 * n, !bigEnd) /\n              file.getInt32(valueOffset + 4 + 8 * n, !bigEnd);\n          }\n          return vals;\n        }\n      default:\n        break;\n    }\n  }\n\n  public getStringFromDB(\n    buffer: DataView,\n    start: number,\n    length: number\n  ): string {\n    let outstr = '';\n    for (let n = start; n < start + length; n++) {\n      outstr += String.fromCharCode(buffer.getUint8(n));\n    }\n    return outstr;\n  }\n\n  public readEXIFData(file: DataView, start: number): any {\n    if (this.getStringFromDB(file, start, 4) !== 'Exif') {\n      this.log('Not valid EXIF data! ' + this.getStringFromDB(file, start, 4));\n\n      return false;\n    }\n\n    let bigEnd: boolean;\n    let tags: any;\n    let tag: string;\n    let exifData: any;\n    let gpsData: any;\n    const tiffOffset: number = start + 6;\n\n    // test for TIFF validity and endianness\n    if (file.getUint16(tiffOffset) === 0x4949) {\n      bigEnd = false;\n    } else {\n      if (file.getUint16(tiffOffset) === 0x4d4d) {\n        bigEnd = true;\n      } else {\n        this.log('Not valid TIFF data! (no 0x4949 or 0x4D4D)');\n        return false;\n      }\n    }\n\n    if (file.getUint16(tiffOffset + 2, !bigEnd) !== 0x002a) {\n      this.log('Not valid TIFF data! (no 0x002A)');\n      return false;\n    }\n\n    const firstIFDOffset = file.getUint32(tiffOffset + 4, !bigEnd);\n\n    if (firstIFDOffset < 0x00000008) {\n      this.log(\n        'Not valid TIFF data! (First offset less than 8)',\n        file.getUint32(tiffOffset + 4, !bigEnd)\n      );\n      return false;\n    }\n\n    tags = this.readTags(\n      file,\n      tiffOffset,\n      tiffOffset + firstIFDOffset,\n      this.TiffTags,\n      bigEnd\n    );\n\n    if (tags.ExifIFDPointer) {\n      exifData = this.readTags(\n        file,\n        tiffOffset,\n        tiffOffset + tags.ExifIFDPointer,\n        this.Tags,\n        bigEnd\n      );\n      for (tag in exifData) {\n        if ({}.hasOwnProperty.call(exifData, tag)) {\n          switch (tag) {\n            case 'LightSource':\n            case 'Flash':\n            case 'MeteringMode':\n            case 'ExposureProgram':\n            case 'SensingMethod':\n            case 'SceneCaptureType':\n            case 'SceneType':\n            case 'CustomRendered':\n            case 'WhiteBalance':\n            case 'GainControl':\n            case 'Contrast':\n            case 'Saturation':\n            case 'Sharpness':\n            case 'SubjectDistanceRange':\n            case 'FileSource':\n              exifData[tag] = this.StringValues[tag][exifData[tag]];\n              break;\n            case 'ExifVersion':\n            case 'FlashpixVersion':\n              exifData[tag] = String.fromCharCode(\n                exifData[tag][0],\n                exifData[tag][1],\n                exifData[tag][2],\n                exifData[tag][3]\n              );\n              break;\n            case 'ComponentsConfiguration':\n              const compopents = 'Components';\n              exifData[tag] =\n                this.StringValues[compopents][exifData[tag][0]] +\n                this.StringValues[compopents][exifData[tag][1]] +\n                this.StringValues[compopents][exifData[tag][2]] +\n                this.StringValues[compopents][exifData[tag][3]];\n              break;\n            default:\n              break;\n          }\n          tags[tag] = exifData[tag];\n        }\n      }\n    }\n\n    if (tags.GPSInfoIFDPointer) {\n      gpsData = this.readTags(\n        file,\n        tiffOffset,\n        tiffOffset + tags.GPSInfoIFDPointer,\n        this.GPSTags,\n        bigEnd\n      );\n      for (tag in gpsData) {\n        if ({}.hasOwnProperty.call(gpsData, tag)) {\n          switch (tag) {\n            case 'GPSVersionID':\n              gpsData[tag] =\n                gpsData[tag][0] +\n                '.' +\n                gpsData[tag][1] +\n                '.' +\n                gpsData[tag][2] +\n                '.' +\n                gpsData[tag][3];\n              break;\n            default:\n              break;\n          }\n          tags[tag] = gpsData[tag];\n        }\n      }\n    }\n\n    return tags;\n  }\n\n  //   get rid of this silly issue\n  private checkImageType(img: any) {\n    return img instanceof Image || img instanceof HTMLImageElement;\n  }\n\n  public getData(img: IImageExtended | HTMLImageElement, callback: () => void) {\n    if (this.checkImageType(img) && !img.complete) {\n      return false;\n    }\n\n    if (!this.imageHasData(img as IImageExtended)) {\n      this.getImageData(img as IImageExtended, callback);\n    } else {\n      if (callback) {\n        callback.call(img);\n      }\n    }\n    return true;\n  }\n\n  public getTag(img: any, tag: string) {\n    if (!this.imageHasData(img)) {\n      return;\n    }\n    return img.exifdata[tag];\n  }\n\n  public getAllTags(img: any) {\n    if (!this.imageHasData(img)) {\n      return {};\n    }\n    let a: string;\n    const data: any = img.exifdata;\n    const tags: any = {};\n    for (a in data) {\n      if (data.hasOwnProperty(a)) {\n        tags[a] = data[a];\n      }\n    }\n    return tags;\n  }\n\n  public pretty(img: IImageExtended) {\n    if (!this.imageHasData(img)) {\n      return '';\n    }\n    let a: any;\n    const data: any = img.exifdata;\n    let strPretty = '';\n    for (a in data) {\n      if (data.hasOwnProperty(a)) {\n        if (typeof data[a] === 'object') {\n          if (data[a] instanceof Number) {\n            strPretty += `${a} : ${data[a]} [${data[a].numerator}/${\n              data[a].denominator\n            }]\\r\\n`;\n          } else {\n            strPretty += `${a} : [${data[a].length} values]\\r\\n`;\n          }\n        } else {\n          strPretty += `${a} : ${data[a]}\\r\\n`;\n        }\n      }\n    }\n    return strPretty;\n  }\n\n  public readFromBinaryFile(file: ArrayBuffer) {\n    return this.findEXIFinJPEG(file);\n  }\n\n  public log(...args: any[]) {\n    if (this.debug) {\n      console.log(args);\n    }\n  }\n}\n","export interface IPoint {\n  x: number;\n  y: number;\n  next: Point;\n  prev: Point;\n}\n\nexport class Point implements IPoint {\n  public x: number;\n  public y: number;\n\n  private myNext: Point;\n  private myPrev: Point;\n\n  constructor(x: number = 0, y: number = 0) {\n    this.x = x;\n    this.y = y;\n  }\n\n  public get next(): Point {\n    return this.myNext;\n  }\n\n  public set next(p: Point) {\n    this.myNext = p;\n  }\n\n  public get prev(): Point {\n    return this.myPrev;\n  }\n\n  public set prev(p: Point) {\n    this.myPrev = p;\n  }\n}\n","import { Point } from './point';\n\nexport class PointPool {\n  private borrowed: number;\n  private firstAvailable: Point;\n\n  constructor(initialSize: number = 1) {\n    let prev: Point = (this.firstAvailable = new Point());\n\n    for (let i = 1; i < initialSize; i++) {\n      const p = new Point();\n      prev.next = p;\n      prev = p;\n    }\n  }\n\n  get instance(): PointPool {\n    return this;\n  }\n\n  public borrow(x: number, y: number): Point {\n    if (this.firstAvailable == null) {\n      throw new Error('Pool exhausted');\n    }\n    this.borrowed++;\n    const p: Point = this.firstAvailable;\n    this.firstAvailable = p.next;\n    p.x = x;\n    p.y = y;\n    return p;\n  }\n\n  public returnPoint(p: Point) {\n    this.borrowed--;\n    p.x = 0;\n    p.y = 0;\n    p.next = this.firstAvailable;\n    this.firstAvailable = p;\n  }\n}\n","import { Point } from './point';\nimport { PointPool } from './pointPool';\n\nexport class Bounds {\n  public left: number;\n  public right: number;\n  public top: number;\n  public bottom: number;\n\n  constructor(x?: number, y?: number, width?: number, height?: number) {\n    if (x === void 0) {\n      x = 0;\n    }\n    if (y === void 0) {\n      y = 0;\n    }\n    if (width === void 0) {\n      width = 0;\n    }\n    if (height === void 0) {\n      height = 0;\n    }\n    this.left = x;\n    this.right = x + width;\n    this.top = y;\n    this.bottom = y + height;\n  }\n\n  public get width(): number {\n    return this.right - this.left;\n  }\n\n  public get height(): number {\n    return this.bottom - this.top;\n  }\n\n  public getCentre(): Point {\n    const w = this.width;\n    const h = this.height;\n    return new PointPool().instance.borrow(this.left + w / 2, this.top + h / 2);\n  }\n}\n","import { Point } from './point';\nimport { CropperSettings } from '../cropper-settings';\n\nexport interface IHandle {\n  over: boolean;\n  drag: boolean;\n  position: Point;\n  offset: Point;\n  radius: number;\n  cropperSettings: CropperSettings;\n  setPosition(x: number, y: number): void;\n  setDrag(value: boolean): void;\n  draw(ctx: CanvasRenderingContext2D): void;\n  setOver(over: boolean): void;\n  touchInBounds(x: number, y: number): boolean;\n}\n\nexport class Handle implements IHandle {\n  public over: boolean;\n  public drag: boolean;\n  // tslint:disable-next-line:variable-name\n  private _position: Point;\n  public offset: Point;\n  public radius: number;\n\n  public cropperSettings: CropperSettings = new CropperSettings();\n\n  constructor(x: number, y: number, radius: number, settings: CropperSettings) {\n    this.over = false;\n    this.drag = false;\n    this._position = new Point(x, y);\n    this.offset = new Point(0, 0);\n    this.radius = radius;\n    this.cropperSettings = settings;\n  }\n\n  public setDrag(value: boolean): void {\n    this.drag = value;\n    this.setOver(value);\n  }\n\n  public draw(ctx: CanvasRenderingContext2D) {\n    // this should't be empty\n  }\n\n  public setOver(over: boolean): void {\n    this.over = over;\n  }\n\n  public touchInBounds(x: number, y: number): boolean {\n    return (\n      x > this.position.x - this.radius + this.offset.x &&\n      x < this.position.x + this.radius + this.offset.x &&\n      y > this.position.y - this.radius + this.offset.y &&\n      y < this.position.y + this.radius + this.offset.y\n    );\n  }\n\n  public get position(): Point {\n    return this._position;\n  }\n\n  public setPosition(x: number, y: number) {\n    this._position.x = x;\n    this._position.y = y;\n  }\n}\n","import { Handle, IHandle } from './handle';\nimport { CropperSettings } from '../cropper-settings';\n\nexport interface ICornerMarker extends IHandle {\n  horizontalNeighbour: CornerMarker;\n  verticalNeighbour: CornerMarker;\n}\n\nexport class CornerMarker extends Handle implements ICornerMarker {\n  public horizontalNeighbour: CornerMarker;\n  public verticalNeighbour: CornerMarker;\n\n  constructor(\n    x: number,\n    y: number,\n    radius: number,\n    cropperSettings: CropperSettings\n  ) {\n    super(x, y, radius, cropperSettings);\n  }\n\n  public drawCornerBorder(ctx: CanvasRenderingContext2D): void {\n    let sideLength = 10;\n    if (this.over || this.drag) {\n      sideLength = 12;\n    }\n\n    let hDirection: number = this.cropperSettings.markerSizeMultiplier;\n    let vDirection: number = this.cropperSettings.markerSizeMultiplier;\n    if (this.horizontalNeighbour.position.x < this.position.x) {\n      hDirection = -this.cropperSettings.markerSizeMultiplier;\n    }\n    if (this.verticalNeighbour.position.y < this.position.y) {\n      vDirection = -this.cropperSettings.markerSizeMultiplier;\n    }\n\n    ctx.beginPath();\n    if (this.cropperSettings.cropperDrawSettings.lineDash) {\n      ctx.setLineDash([1, 3]);\n    }\n    ctx.lineJoin = 'miter';\n    ctx.moveTo(\n      this.position.x + this.offset.x,\n      this.position.y + this.offset.y\n    );\n    ctx.lineTo(\n      this.position.x + this.offset.x + sideLength * hDirection,\n      this.position.y + this.offset.y\n    );\n    ctx.lineTo(\n      this.position.x + this.offset.x + sideLength * hDirection,\n      this.position.y + this.offset.y + sideLength * vDirection\n    );\n    ctx.lineTo(\n      this.position.x + this.offset.x,\n      this.position.y + this.offset.y + sideLength * vDirection\n    );\n    ctx.lineTo(\n      this.position.x + this.offset.x,\n      this.position.y + this.offset.y\n    );\n    ctx.closePath();\n    ctx.lineWidth = this.cropperSettings.cropperDrawSettings.strokeWidth;\n    ctx.strokeStyle =\n      this.cropperSettings.cropperDrawSettings.strokeColor ||\n      'rgba(255,255,255,.7)';\n    ctx.stroke();\n  }\n\n  public drawCornerFill(ctx: CanvasRenderingContext2D): void {\n    let sideLength = 10;\n    if (this.over || this.drag) {\n      sideLength = 12;\n    }\n    let hDirection: number = this.cropperSettings.markerSizeMultiplier;\n    let vDirection: number = this.cropperSettings.markerSizeMultiplier;\n    if (this.horizontalNeighbour.position.x < this.position.x) {\n      hDirection = -this.cropperSettings.markerSizeMultiplier;\n    }\n    if (this.verticalNeighbour.position.y < this.position.y) {\n      vDirection = -this.cropperSettings.markerSizeMultiplier;\n    }\n\n    if (this.cropperSettings.rounded) {\n      const width: number =\n        this.position.x - this.horizontalNeighbour.position.x;\n      const height: number =\n        this.position.y - this.verticalNeighbour.position.y;\n\n      const offX: number =\n        Math.round(Math.sin(Math.PI / 2) * Math.abs(width / 2)) / 4;\n      const offY: number =\n        Math.round(Math.sin(Math.PI / 2) * Math.abs(height / 2)) / 4;\n\n      this.offset.x = hDirection > 0 ? offX : -offX;\n      this.offset.y = vDirection > 0 ? offY : -offY;\n    } else {\n      this.offset.x = 0;\n      this.offset.y = 0;\n    }\n\n    ctx.beginPath();\n    if (this.cropperSettings.cropperDrawSettings.lineDash) {\n      ctx.setLineDash([1, 3]);\n    }\n    ctx.moveTo(\n      this.position.x + this.offset.x,\n      this.position.y + this.offset.y\n    );\n    ctx.lineTo(\n      this.position.x + this.offset.x + sideLength * hDirection,\n      this.position.y + this.offset.y\n    );\n    ctx.lineTo(\n      this.position.x + this.offset.x + sideLength * hDirection,\n      this.position.y + this.offset.y + sideLength * vDirection\n    );\n    ctx.lineTo(\n      this.position.x + this.offset.x,\n      this.position.y + this.offset.y + sideLength * vDirection\n    );\n    ctx.lineTo(\n      this.position.x + this.offset.x,\n      this.position.y + this.offset.y\n    );\n    ctx.closePath();\n    ctx.fillStyle =\n      this.cropperSettings.cropperDrawSettings.fillColor ||\n      'rgba(255,255,255,.7)';\n    ctx.fill();\n  }\n\n  public moveX(x: number): void {\n    this.setPosition(x, this.position.y);\n  }\n\n  public moveY(y: number): void {\n    this.setPosition(this.position.x, y);\n  }\n\n  public move(x: number, y: number): void {\n    this.setPosition(x, y);\n    this.verticalNeighbour.moveX(x);\n    this.horizontalNeighbour.moveY(y);\n  }\n\n  public addHorizontalNeighbour(neighbour: CornerMarker): void {\n    this.horizontalNeighbour = neighbour;\n  }\n\n  public addVerticalNeighbour(neighbour: CornerMarker): void {\n    this.verticalNeighbour = neighbour;\n  }\n\n  public getHorizontalNeighbour(): CornerMarker {\n    return this.horizontalNeighbour;\n  }\n\n  public getVerticalNeighbour(): CornerMarker {\n    return this.verticalNeighbour;\n  }\n\n  public draw(ctx: CanvasRenderingContext2D): void {\n    this.drawCornerFill(ctx);\n    this.drawCornerBorder(ctx);\n  }\n}\n","import { IHandle } from './handle';\n\nexport class CropTouch {\n  public x: number;\n  public y: number;\n  public id: number;\n\n  public dragHandle: IHandle;\n\n  constructor(x: number = 0, y: number = 0, id: number = 0) {\n    this.id = id;\n    this.x = x;\n    this.y = y;\n  }\n}\n","import { Handle } from './handle';\nimport { PointPool } from './pointPool';\nimport { Point } from './point';\nimport { CropperSettings } from '../cropper-settings';\nimport { Bounds } from './bounds';\n\nexport class DragMarker extends Handle {\n  private iconPoints: Array<Point>;\n  private scaledIconPoints: Array<Point>;\n\n  constructor(\n    x: number,\n    y: number,\n    radius: number,\n    cropperSettings: CropperSettings\n  ) {\n    super(x, y, radius, cropperSettings);\n    this.iconPoints = [];\n    this.scaledIconPoints = [];\n    this.getDragIconPoints(this.iconPoints, 1);\n    this.getDragIconPoints(this.scaledIconPoints, 1.2);\n  }\n\n  public draw(ctx: CanvasRenderingContext2D) {\n    if (this.over || this.drag) {\n      this.drawIcon(ctx, this.scaledIconPoints);\n    } else {\n      this.drawIcon(ctx, this.iconPoints);\n    }\n  }\n\n  public getDragIconPoints(arr: Array<any>, scale: number) {\n    const maxLength = 17 * scale;\n    const arrowWidth = 14 * scale;\n    const arrowLength = 8 * scale;\n    const connectorThroat = 4 * scale;\n\n    arr.push(\n      new PointPool().instance.borrow(\n        -connectorThroat / 2,\n        maxLength - arrowLength\n      )\n    );\n    arr.push(\n      new PointPool().instance.borrow(-arrowWidth / 2, maxLength - arrowLength)\n    );\n    arr.push(new PointPool().instance.borrow(0, maxLength));\n    arr.push(\n      new PointPool().instance.borrow(arrowWidth / 2, maxLength - arrowLength)\n    );\n    arr.push(\n      new PointPool().instance.borrow(\n        connectorThroat / 2,\n        maxLength - arrowLength\n      )\n    );\n    arr.push(\n      new PointPool().instance.borrow(connectorThroat / 2, connectorThroat / 2)\n    );\n    arr.push(\n      new PointPool().instance.borrow(\n        maxLength - arrowLength,\n        connectorThroat / 2\n      )\n    );\n    arr.push(\n      new PointPool().instance.borrow(maxLength - arrowLength, arrowWidth / 2)\n    );\n    arr.push(new PointPool().instance.borrow(maxLength, 0));\n    arr.push(\n      new PointPool().instance.borrow(maxLength - arrowLength, -arrowWidth / 2)\n    );\n    arr.push(\n      new PointPool().instance.borrow(\n        maxLength - arrowLength,\n        -connectorThroat / 2\n      )\n    );\n    arr.push(\n      new PointPool().instance.borrow(connectorThroat / 2, -connectorThroat / 2)\n    );\n    arr.push(\n      new PointPool().instance.borrow(\n        connectorThroat / 2,\n        -maxLength + arrowLength\n      )\n    );\n    arr.push(\n      new PointPool().instance.borrow(arrowWidth / 2, -maxLength + arrowLength)\n    );\n    arr.push(new PointPool().instance.borrow(0, -maxLength));\n    arr.push(\n      new PointPool().instance.borrow(-arrowWidth / 2, -maxLength + arrowLength)\n    );\n    arr.push(\n      new PointPool().instance.borrow(\n        -connectorThroat / 2,\n        -maxLength + arrowLength\n      )\n    );\n    arr.push(\n      new PointPool().instance.borrow(\n        -connectorThroat / 2,\n        -connectorThroat / 2\n      )\n    );\n    arr.push(\n      new PointPool().instance.borrow(\n        -maxLength + arrowLength,\n        -connectorThroat / 2\n      )\n    );\n    arr.push(\n      new PointPool().instance.borrow(-maxLength + arrowLength, -arrowWidth / 2)\n    );\n    arr.push(new PointPool().instance.borrow(-maxLength, 0));\n    arr.push(\n      new PointPool().instance.borrow(-maxLength + arrowLength, arrowWidth / 2)\n    );\n    arr.push(\n      new PointPool().instance.borrow(\n        -maxLength + arrowLength,\n        connectorThroat / 2\n      )\n    );\n    arr.push(\n      new PointPool().instance.borrow(-connectorThroat / 2, connectorThroat / 2)\n    );\n  }\n\n  public drawIcon(ctx: CanvasRenderingContext2D, points: Array<Point>) {\n    if (this.cropperSettings.showCenterMarker) {\n      ctx.beginPath();\n      ctx.moveTo(points[0].x + this.position.x, points[0].y + this.position.y);\n      for (const p of points) {\n        ctx.lineTo(p.x + this.position.x, p.y + this.position.y);\n      }\n      ctx.closePath();\n      ctx.fillStyle = this.cropperSettings.cropperDrawSettings.dragIconFillColor;\n      ctx.fill();\n      ctx.lineWidth = this.cropperSettings.cropperDrawSettings.dragIconStrokeWidth;\n      ctx.strokeStyle = this.cropperSettings.cropperDrawSettings.dragIconStrokeColor;\n      ctx.stroke();\n    }\n  }\n\n  public recalculatePosition(bounds: Bounds) {\n    const c = bounds.getCentre();\n    this.setPosition(c.x, c.y);\n    new PointPool().instance.returnPoint(c);\n  }\n}\n","import { PointPool } from './pointPool';\nimport { CornerMarker } from './cornerMarker';\nimport { DragMarker } from './dragMarker';\nimport { CropTouch } from './cropTouch';\n\nexport class ImageCropperModel {\n  public isMouseDown: boolean;\n  protected canvas: HTMLCanvasElement;\n  protected x: number;\n  protected y: number;\n  protected width: number;\n  protected height: number;\n  protected canvasWidth: number;\n  protected canvasHeight: number;\n  protected keepAspect: boolean;\n  protected touchRadius: number;\n  protected currentDragTouches: Array<CropTouch>;\n  protected ratioW: number;\n  protected ratioH: number;\n  protected fileType: string;\n  protected imageSet: boolean;\n  protected pointPool: PointPool;\n  protected buffer: HTMLCanvasElement;\n  protected cropCanvas: HTMLCanvasElement;\n  protected tl: CornerMarker;\n  protected tr: CornerMarker;\n  protected bl: CornerMarker;\n  protected br: CornerMarker;\n  protected markers: Array<CornerMarker>;\n  protected center: DragMarker;\n  protected ctx: CanvasRenderingContext2D;\n  protected aspectRatio: number;\n  protected currentlyInteracting: boolean;\n  protected srcImage: HTMLImageElement;\n  protected vertSquashRatio: number;\n  protected minXClamp: number;\n  protected minYClamp: number;\n  protected maxXClamp: number;\n  protected maxYClamp: number;\n  protected minHeight: number;\n  protected minWidth: number;\n  protected cropWidth: number;\n  protected cropHeight: number;\n  protected croppedImage: HTMLImageElement;\n}\n","export class ImageCropperDataShare {\n  public share: any = {};\n  public pressed: HTMLCanvasElement;\n  public over: HTMLCanvasElement;\n\n  public setPressed(canvas: HTMLCanvasElement): void {\n    this.pressed = canvas;\n  }\n\n  public setReleased(canvas: HTMLCanvasElement): void {\n    if (canvas === this.pressed) {\n      //  this.pressed = undefined;\n    }\n  }\n\n  public setOver(canvas: HTMLCanvasElement): void {\n    this.over = canvas;\n  }\n\n  public setStyle(canvas: HTMLCanvasElement, style: any): void {\n    if (this.pressed !== undefined) {\n      if (this.pressed === canvas) {\n        // TODO: check this\n        // angular.element(document.documentElement).css('cursor', style);\n      }\n    } else {\n      if (canvas === this.over) {\n        // TODO: check this\n        // angular.element(document.documentElement).css('cursor', style);\n      }\n    }\n  }\n}\n","import { Bounds } from './model/bounds';\nimport { CornerMarker } from './model/cornerMarker';\nimport { CropTouch } from './model/cropTouch';\nimport { CropperSettings } from './cropper-settings';\nimport { DragMarker } from './model/dragMarker';\nimport { ImageCropperModel } from './model/imageCropperModel';\nimport { ImageCropperDataShare } from './imageCropperDataShare';\nimport { PointPool } from './model/pointPool';\nimport { Point } from './model/point';\nimport { ICornerMarker } from './model/cornerMarker';\n\nexport class ImageCropper extends ImageCropperModel {\n  private crop: ImageCropper;\n  private cropperSettings: CropperSettings;\n  private previousDistance: number;\n  private imageCropperDataShare: ImageCropperDataShare;\n\n  constructor(cropperSettings: CropperSettings) {\n    super();\n    this.imageCropperDataShare = new ImageCropperDataShare();\n    const x = 0;\n    const y = 0;\n    const width: number = cropperSettings.width;\n    const height: number = cropperSettings.height;\n    const keepAspect: boolean = cropperSettings.keepAspect;\n    const touchRadius: number = cropperSettings.touchRadius;\n    const centerTouchRadius: number = cropperSettings.centerTouchRadius;\n    const minWidth: number = cropperSettings.minWidth;\n    const minHeight: number = cropperSettings.minHeight;\n    const croppedWidth: number = cropperSettings.croppedWidth;\n    const croppedHeight: number = cropperSettings.croppedHeight;\n\n    this.cropperSettings = cropperSettings;\n\n    this.crop = this;\n    this.x = x;\n    this.y = y;\n\n    this.canvasHeight = cropperSettings.canvasHeight;\n    this.canvasWidth = cropperSettings.canvasWidth;\n\n    this.width = width;\n    if (width === void 0) {\n      this.width = 100;\n    }\n    this.height = height;\n    if (height === void 0) {\n      this.height = 50;\n    }\n    this.keepAspect = keepAspect;\n    if (keepAspect === void 0) {\n      this.keepAspect = true;\n    }\n    this.touchRadius = touchRadius;\n    if (touchRadius === void 0) {\n      this.touchRadius = 20;\n    }\n    this.minWidth = minWidth;\n    this.minHeight = minHeight;\n    this.aspectRatio = 0;\n    this.currentDragTouches = [];\n    this.isMouseDown = false;\n    this.ratioW = 1;\n    this.ratioH = 1;\n    this.fileType = cropperSettings.fileType;\n    this.imageSet = false;\n    this.pointPool = new PointPool(200);\n\n    this.tl = new CornerMarker(x, y, touchRadius, this.cropperSettings);\n    this.tr = new CornerMarker(x + width, y, touchRadius, this.cropperSettings);\n    this.bl = new CornerMarker(\n      x,\n      y + height,\n      touchRadius,\n      this.cropperSettings\n    );\n    this.br = new CornerMarker(\n      x + width,\n      y + height,\n      touchRadius,\n      this.cropperSettings\n    );\n\n    this.tl.addHorizontalNeighbour(this.tr);\n    this.tl.addVerticalNeighbour(this.bl);\n    this.tr.addHorizontalNeighbour(this.tl);\n    this.tr.addVerticalNeighbour(this.br);\n    this.bl.addHorizontalNeighbour(this.br);\n    this.bl.addVerticalNeighbour(this.tl);\n    this.br.addHorizontalNeighbour(this.bl);\n    this.br.addVerticalNeighbour(this.tr);\n    this.markers = [this.tl, this.tr, this.bl, this.br];\n\n    this.center = new DragMarker(\n      x + width / 2,\n      y + height / 2,\n      centerTouchRadius,\n      this.cropperSettings\n    );\n    this.aspectRatio = height / width;\n    this.croppedImage = new Image();\n    this.currentlyInteracting = false;\n    this.cropWidth = croppedWidth;\n    this.cropHeight = croppedHeight;\n  }\n\n  private sign(x: number): number {\n    if (+x === x) {\n      return x === 0 ? x : x > 0 ? 1 : -1;\n    }\n    return NaN;\n  }\n\n  private getMousePos(canvas: HTMLCanvasElement, evt: MouseEvent): Point {\n    const rect = canvas.getBoundingClientRect();\n    return new PointPool().instance.borrow(\n      evt.clientX - rect.left,\n      evt.clientY - rect.top\n    );\n  }\n\n  private getTouchPos(canvas: HTMLCanvasElement, touch: Touch): Point {\n    const rect = canvas.getBoundingClientRect();\n    return new PointPool().instance.borrow(\n      touch.clientX - rect.left,\n      touch.clientY - rect.top\n    );\n  }\n\n  private detectVerticalSquash(\n    img: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement\n  ) {\n    const ih = img.height;\n    const canvas = document.createElement('canvas');\n    canvas.width = 1;\n    canvas.height = ih;\n    const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\n    ctx.drawImage(img, 0, 0);\n    const imageData: any = ctx.getImageData(0, 0, 1, ih);\n    if (imageData) {\n      const data = imageData.data;\n      // search image edge pixel position in case it is squashed vertically.\n      let sy = 0;\n      let ey = ih;\n      let py = ih;\n      while (py > sy) {\n        const alpha = data[(py - 1) * 4 + 3];\n        if (alpha === 0) {\n          ey = py;\n        } else {\n          sy = py;\n        }\n        // tslint:disable-next-line:no-bitwise\n        py = (ey + sy) >> 1;\n      }\n      const ratio = py / ih;\n      return ratio === 0 ? 1 : ratio;\n    } else {\n      return 1;\n    }\n  }\n\n  private getDataUriMimeType(dataUri: string) {\n    // Get a substring because the regex does not perform well on very large strings.\n    // Cater for optional charset. Length 50 shoould be enough.\n    const dataUriSubstring = dataUri.substring(0, 50);\n    let mimeType = 'image/png';\n    // data-uri scheme\n    // data:[<media type>][;charset=<character set>][;base64],<data>\n    const regEx = RegExp(\n      /^(data:)([\\w\\/\\+]+);(charset=[\\w-]+|base64).*,(.*)/gi\n    );\n    const matches = regEx.exec(dataUriSubstring);\n    if (matches && matches[2]) {\n      mimeType = matches[2];\n      if (mimeType === 'image/jpg') {\n        mimeType = 'image/jpeg';\n      }\n    }\n    return mimeType;\n  }\n\n  public prepare(canvas: HTMLCanvasElement) {\n    this.buffer = document.createElement('canvas');\n    this.cropCanvas = document.createElement('canvas');\n\n    // todo get more reliable parent width value.\n    const responsiveWidth: number = canvas.parentElement\n      ? canvas.parentElement.clientWidth\n      : 0;\n    if (responsiveWidth > 0 && this.cropperSettings.dynamicSizing) {\n      this.cropCanvas.width = responsiveWidth;\n      this.buffer.width = responsiveWidth;\n      canvas.width = responsiveWidth;\n    } else {\n      this.cropCanvas.width = this.cropWidth;\n      this.buffer.width = canvas.width;\n    }\n\n    this.cropCanvas.height = this.cropHeight;\n    this.buffer.height = canvas.height;\n    this.canvas = canvas;\n    this.ctx = this.canvas.getContext('2d') as CanvasRenderingContext2D;\n\n    this.draw(this.ctx);\n  }\n\n  public updateSettings(cropperSettings: CropperSettings) {\n    this.cropperSettings = cropperSettings;\n  }\n\n  public resizeCanvas(\n    width: number,\n    height: number,\n    setImage: boolean = false\n  ): void {\n    this.canvas.width = this.cropCanvas.width = this.width = this.canvasWidth = this.buffer.width = width;\n    this.canvas.height = this.cropCanvas.height = this.height = this.canvasHeight = this.buffer.height = height;\n    if (setImage) {\n      this.setImage(this.srcImage);\n    }\n  }\n\n  public reset(): void {\n    this.setImage(undefined);\n  }\n\n  public draw(ctx: CanvasRenderingContext2D): void {\n    const bounds: Bounds = this.getBounds();\n    if (this.srcImage) {\n      ctx.clearRect(0, 0, this.canvasWidth, this.canvasHeight);\n      const sourceAspect: number = this.srcImage.height / this.srcImage.width;\n      const canvasAspect: number = this.canvasHeight / this.canvasWidth;\n      let w: number = this.canvasWidth;\n      let h: number = this.canvasHeight;\n      if (canvasAspect > sourceAspect) {\n        w = this.canvasWidth;\n        h = this.canvasWidth * sourceAspect;\n      } else {\n        h = this.canvasHeight;\n        w = this.canvasHeight / sourceAspect;\n      }\n      this.ratioW = w / this.srcImage.width;\n      this.ratioH = h / this.srcImage.height;\n      if (canvasAspect < sourceAspect) {\n        this.drawImageIOSFix(\n          ctx,\n          this.srcImage,\n          0,\n          0,\n          this.srcImage.width,\n          this.srcImage.height,\n          this.buffer.width / 2 - w / 2,\n          0,\n          w,\n          h\n        );\n      } else {\n        this.drawImageIOSFix(\n          ctx,\n          this.srcImage,\n          0,\n          0,\n          this.srcImage.width,\n          this.srcImage.height,\n          0,\n          this.buffer.height / 2 - h / 2,\n          w,\n          h\n        );\n      }\n      (this.buffer.getContext('2d') as CanvasRenderingContext2D).drawImage(\n        this.canvas,\n        0,\n        0,\n        this.canvasWidth,\n        this.canvasHeight\n      );\n\n      ctx.lineWidth = this.cropperSettings.cropperDrawSettings.strokeWidth;\n      ctx.strokeStyle = this.cropperSettings.cropperDrawSettings.strokeColor;\n\n      ctx.fillStyle = this.cropperSettings.cropperDrawSettings.backgroundFillColor;\n      if (!this.cropperSettings.rounded) {\n        ctx.fillRect(0, 0, this.canvasWidth, this.canvasHeight);\n        ctx.drawImage(\n          this.buffer,\n          bounds.left,\n          bounds.top,\n          Math.max(bounds.width, 1),\n          Math.max(bounds.height, 1),\n          bounds.left,\n          bounds.top,\n          bounds.width,\n          bounds.height\n        );\n        ctx.strokeRect(bounds.left, bounds.top, bounds.width, bounds.height);\n      } else {\n        ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n        ctx.save();\n        ctx.beginPath();\n        ctx.arc(\n          bounds.left + bounds.width / 2,\n          bounds.top + bounds.height / 2,\n          bounds.width / 2,\n          0,\n          2 * Math.PI\n        );\n        ctx.stroke();\n        ctx.clip();\n        if (canvasAspect < sourceAspect) {\n          this.drawImageIOSFix(\n            ctx,\n            this.srcImage,\n            0,\n            0,\n            this.srcImage.width,\n            this.srcImage.height,\n            this.buffer.width / 2 - w / 2,\n            0,\n            w,\n            h\n          );\n        } else {\n          this.drawImageIOSFix(\n            ctx,\n            this.srcImage,\n            0,\n            0,\n            this.srcImage.width,\n            this.srcImage.height,\n            0,\n            this.buffer.height / 2 - h / 2,\n            w,\n            h\n          );\n        }\n        ctx.restore();\n      }\n\n      let marker: CornerMarker;\n\n      // tslint:disable-next-line:prefer-for-of\n      for (let i = 0; i < this.markers.length; i++) {\n        marker = this.markers[i];\n        marker.draw(ctx);\n      }\n      this.center.draw(ctx);\n    } else {\n      ctx.fillStyle = 'rgba(192,192,192,1)';\n      ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n    }\n  }\n\n  public dragCenter(x: number, y: number, marker: DragMarker) {\n    const bounds = this.getBounds();\n    const left = x - bounds.width / 2;\n    const right = x + bounds.width / 2;\n    const top = y - bounds.height / 2;\n    const bottom = y + bounds.height / 2;\n    if (right >= this.maxXClamp) {\n      x = this.maxXClamp - bounds.width / 2;\n    }\n    if (left <= this.minXClamp) {\n      x = bounds.width / 2 + this.minXClamp;\n    }\n    if (top < this.minYClamp) {\n      y = bounds.height / 2 + this.minYClamp;\n    }\n    if (bottom >= this.maxYClamp) {\n      y = this.maxYClamp - bounds.height / 2;\n    }\n    this.tl.moveX(x - bounds.width / 2);\n    this.tl.moveY(y - bounds.height / 2);\n    this.tr.moveX(x + bounds.width / 2);\n    this.tr.moveY(y - bounds.height / 2);\n    this.bl.moveX(x - bounds.width / 2);\n    this.bl.moveY(y + bounds.height / 2);\n    this.br.moveX(x + bounds.width / 2);\n    this.br.moveY(y + bounds.height / 2);\n    marker.setPosition(x, y);\n  }\n\n  public enforceMinSize(x: number, y: number, marker: CornerMarker) {\n    const xLength = x - marker.getHorizontalNeighbour().position.x;\n    const yLength = y - marker.getVerticalNeighbour().position.y;\n    const xOver = this.minWidth - Math.abs(xLength);\n    const yOver = this.minHeight - Math.abs(yLength);\n\n    if (xLength === 0 || yLength === 0) {\n      x = marker.position.x;\n      y = marker.position.y;\n\n      return new PointPool().instance.borrow(x, y);\n    }\n\n    if (this.keepAspect) {\n      if (xOver > 0 && yOver / this.aspectRatio > 0) {\n        if (xOver > yOver / this.aspectRatio) {\n          if (xLength < 0) {\n            x -= xOver;\n\n            if (yLength < 0) {\n              y -= xOver * this.aspectRatio;\n            } else {\n              y += xOver * this.aspectRatio;\n            }\n          } else {\n            x += xOver;\n            if (yLength < 0) {\n              y -= xOver * this.aspectRatio;\n            } else {\n              y += xOver * this.aspectRatio;\n            }\n          }\n        } else {\n          if (yLength < 0) {\n            y -= yOver;\n\n            if (xLength < 0) {\n              x -= yOver / this.aspectRatio;\n            } else {\n              x += yOver / this.aspectRatio;\n            }\n          } else {\n            y += yOver;\n            if (xLength < 0) {\n              x -= yOver / this.aspectRatio;\n            } else {\n              x += yOver / this.aspectRatio;\n            }\n          }\n        }\n      } else {\n        if (xOver > 0) {\n          if (xLength < 0) {\n            x -= xOver;\n            if (yLength < 0) {\n              y -= xOver * this.aspectRatio;\n            } else {\n              y += xOver * this.aspectRatio;\n            }\n          } else {\n            x += xOver;\n            if (yLength < 0) {\n              y -= xOver * this.aspectRatio;\n            } else {\n              y += xOver * this.aspectRatio;\n            }\n          }\n        } else {\n          if (yOver > 0) {\n            if (yLength < 0) {\n              y -= yOver;\n\n              if (xLength < 0) {\n                x -= yOver / this.aspectRatio;\n              } else {\n                x += yOver / this.aspectRatio;\n              }\n            } else {\n              y += yOver;\n              if (xLength < 0) {\n                x -= yOver / this.aspectRatio;\n              } else {\n                x += yOver / this.aspectRatio;\n              }\n            }\n          }\n        }\n      }\n    } else {\n      if (xOver > 0) {\n        if (xLength < 0) {\n          x -= xOver;\n        } else {\n          x += xOver;\n        }\n      }\n      if (yOver > 0) {\n        if (yLength < 0) {\n          y -= yOver;\n        } else {\n          y += yOver;\n        }\n      }\n    }\n\n    if (\n      x < this.minXClamp ||\n      x > this.maxXClamp ||\n      y < this.minYClamp ||\n      y > this.maxYClamp\n    ) {\n      x = marker.position.x;\n      y = marker.position.y;\n    }\n\n    return new PointPool().instance.borrow(x, y);\n  }\n\n  public dragCorner(x: number, y: number, marker: CornerMarker) {\n    let iX = 0;\n    let iY = 0;\n    let ax = 0;\n    let ay = 0;\n    let newHeight = 0;\n    let newWidth = 0;\n    let newY = 0;\n    let newX = 0;\n    let anchorMarker: CornerMarker;\n    let fold = 0;\n\n    if (this.keepAspect) {\n      anchorMarker = marker.getHorizontalNeighbour().getVerticalNeighbour();\n      ax = anchorMarker.position.x;\n      ay = anchorMarker.position.y;\n      if (x <= anchorMarker.position.x) {\n        if (y <= anchorMarker.position.y) {\n          iX = ax - 100 / this.aspectRatio;\n          iY = ay - (100 / this.aspectRatio) * this.aspectRatio;\n          fold = this.getSide(\n            new PointPool().instance.borrow(iX, iY),\n            anchorMarker.position,\n            new PointPool().instance.borrow(x, y)\n          );\n          if (fold > 0) {\n            newHeight = Math.abs(anchorMarker.position.y - y);\n            newWidth = newHeight / this.aspectRatio;\n            newY = anchorMarker.position.y - newHeight;\n            newX = anchorMarker.position.x - newWidth;\n            const min = this.enforceMinSize(newX, newY, marker);\n            marker.move(min.x, min.y);\n            new PointPool().instance.returnPoint(min);\n          } else {\n            if (fold < 0) {\n              newWidth = Math.abs(anchorMarker.position.x - x);\n              newHeight = newWidth * this.aspectRatio;\n              newY = anchorMarker.position.y - newHeight;\n              newX = anchorMarker.position.x - newWidth;\n              const min = this.enforceMinSize(newX, newY, marker);\n              marker.move(min.x, min.y);\n              new PointPool().instance.returnPoint(min);\n            }\n          }\n        } else {\n          iX = ax - 100 / this.aspectRatio;\n          iY = ay + (100 / this.aspectRatio) * this.aspectRatio;\n          fold = this.getSide(\n            new PointPool().instance.borrow(iX, iY),\n            anchorMarker.position,\n            new PointPool().instance.borrow(x, y)\n          );\n          if (fold > 0) {\n            newWidth = Math.abs(anchorMarker.position.x - x);\n            newHeight = newWidth * this.aspectRatio;\n            newY = anchorMarker.position.y + newHeight;\n            newX = anchorMarker.position.x - newWidth;\n            const min = this.enforceMinSize(newX, newY, marker);\n            marker.move(min.x, min.y);\n            new PointPool().instance.returnPoint(min);\n          } else {\n            if (fold < 0) {\n              newHeight = Math.abs(anchorMarker.position.y - y);\n              newWidth = newHeight / this.aspectRatio;\n              newY = anchorMarker.position.y + newHeight;\n              newX = anchorMarker.position.x - newWidth;\n              const min = this.enforceMinSize(newX, newY, marker);\n              marker.move(min.x, min.y);\n              new PointPool().instance.returnPoint(min);\n            }\n          }\n        }\n      } else {\n        if (y <= anchorMarker.position.y) {\n          iX = ax + 100 / this.aspectRatio;\n          iY = ay - (100 / this.aspectRatio) * this.aspectRatio;\n          fold = this.getSide(\n            new PointPool().instance.borrow(iX, iY),\n            anchorMarker.position,\n            new PointPool().instance.borrow(x, y)\n          );\n          if (fold < 0) {\n            newHeight = Math.abs(anchorMarker.position.y - y);\n            newWidth = newHeight / this.aspectRatio;\n            newY = anchorMarker.position.y - newHeight;\n            newX = anchorMarker.position.x + newWidth;\n            const min = this.enforceMinSize(newX, newY, marker);\n            marker.move(min.x, min.y);\n            new PointPool().instance.returnPoint(min);\n          } else {\n            if (fold > 0) {\n              newWidth = Math.abs(anchorMarker.position.x - x);\n              newHeight = newWidth * this.aspectRatio;\n              newY = anchorMarker.position.y - newHeight;\n              newX = anchorMarker.position.x + newWidth;\n              const min = this.enforceMinSize(newX, newY, marker);\n              marker.move(min.x, min.y);\n              new PointPool().instance.returnPoint(min);\n            }\n          }\n        } else {\n          iX = ax + 100 / this.aspectRatio;\n          iY = ay + (100 / this.aspectRatio) * this.aspectRatio;\n          fold = this.getSide(\n            new PointPool().instance.borrow(iX, iY),\n            anchorMarker.position,\n            new PointPool().instance.borrow(x, y)\n          );\n          if (fold < 0) {\n            newWidth = Math.abs(anchorMarker.position.x - x);\n            newHeight = newWidth * this.aspectRatio;\n            newY = anchorMarker.position.y + newHeight;\n            newX = anchorMarker.position.x + newWidth;\n            const min = this.enforceMinSize(newX, newY, marker);\n            marker.move(min.x, min.y);\n            new PointPool().instance.returnPoint(min);\n          } else {\n            if (fold > 0) {\n              newHeight = Math.abs(anchorMarker.position.y - y);\n              newWidth = newHeight / this.aspectRatio;\n              newY = anchorMarker.position.y + newHeight;\n              newX = anchorMarker.position.x + newWidth;\n              const min = this.enforceMinSize(newX, newY, marker);\n              marker.move(min.x, min.y);\n              new PointPool().instance.returnPoint(min);\n            }\n          }\n        }\n      }\n    } else {\n      const min = this.enforceMinSize(x, y, marker);\n      marker.move(min.x, min.y);\n      new PointPool().instance.returnPoint(min);\n    }\n    this.center.recalculatePosition(this.getBounds());\n  }\n\n  public getSide(a: Point, b: Point, c: Point): number {\n    const n: number = this.sign(\n      (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x)\n    );\n\n    // TODO move the return of the pools to outside of this function\n    new PointPool().instance.returnPoint(a);\n    new PointPool().instance.returnPoint(c);\n    return n;\n  }\n\n  public handleRelease(newCropTouch: CropTouch) {\n    if (newCropTouch == null) {\n      return;\n    }\n    let index = 0;\n    for (let k = 0; k < this.currentDragTouches.length; k++) {\n      if (newCropTouch.id === this.currentDragTouches[k].id) {\n        this.currentDragTouches[k].dragHandle.setDrag(false);\n        index = k;\n      }\n    }\n    this.currentDragTouches.splice(index, 1);\n    this.draw(this.ctx);\n  }\n\n  public handleMove(newCropTouch: CropTouch) {\n    let matched = false;\n    // tslint:disable-next-line:prefer-for-of\n    for (let k = 0; k < this.currentDragTouches.length; k++) {\n      if (\n        newCropTouch.id === this.currentDragTouches[k].id &&\n        this.currentDragTouches[k].dragHandle != null\n      ) {\n        const dragTouch: CropTouch = this.currentDragTouches[k];\n        const clampedPositions = this.clampPosition(\n          newCropTouch.x - dragTouch.dragHandle.offset.x,\n          newCropTouch.y - dragTouch.dragHandle.offset.y\n        );\n        newCropTouch.x = clampedPositions.x;\n        newCropTouch.y = clampedPositions.y;\n        new PointPool().instance.returnPoint(clampedPositions);\n        if (dragTouch.dragHandle instanceof CornerMarker) {\n          this.dragCorner(\n            newCropTouch.x,\n            newCropTouch.y,\n            dragTouch.dragHandle as CornerMarker\n          );\n        } else {\n          this.dragCenter(\n            newCropTouch.x,\n            newCropTouch.y,\n            dragTouch.dragHandle as DragMarker\n          );\n        }\n        this.currentlyInteracting = true;\n        matched = true;\n        this.imageCropperDataShare.setPressed(this.canvas);\n        break;\n      }\n    }\n    if (!matched) {\n      for (const marker of this.markers) {\n        if (marker.touchInBounds(newCropTouch.x, newCropTouch.y)) {\n          newCropTouch.dragHandle = marker;\n          this.currentDragTouches.push(newCropTouch);\n          marker.setDrag(true);\n          newCropTouch.dragHandle.offset.x =\n            newCropTouch.x - newCropTouch.dragHandle.position.x;\n          newCropTouch.dragHandle.offset.y =\n            newCropTouch.y - newCropTouch.dragHandle.position.y;\n          this.dragCorner(\n            newCropTouch.x - newCropTouch.dragHandle.offset.x,\n            newCropTouch.y - newCropTouch.dragHandle.offset.y,\n            newCropTouch.dragHandle as CornerMarker\n          );\n          break;\n        }\n      }\n      if (\n        newCropTouch.dragHandle === null ||\n        typeof newCropTouch.dragHandle === 'undefined'\n      ) {\n        if (this.center.touchInBounds(newCropTouch.x, newCropTouch.y)) {\n          newCropTouch.dragHandle = this.center;\n          this.currentDragTouches.push(newCropTouch);\n          newCropTouch.dragHandle.setDrag(true);\n          newCropTouch.dragHandle.offset.x =\n            newCropTouch.x - newCropTouch.dragHandle.position.x;\n          newCropTouch.dragHandle.offset.y =\n            newCropTouch.y - newCropTouch.dragHandle.position.y;\n          this.dragCenter(\n            newCropTouch.x - newCropTouch.dragHandle.offset.x,\n            newCropTouch.y - newCropTouch.dragHandle.offset.y,\n            newCropTouch.dragHandle as DragMarker\n          );\n        }\n      }\n    }\n  }\n\n  public updateClampBounds() {\n    const sourceAspect = this.srcImage.height / this.srcImage.width;\n    const canvasAspect = this.canvas.height / this.canvas.width;\n    let w = this.canvas.width;\n    let h = this.canvas.height;\n    if (canvasAspect > sourceAspect) {\n      w = this.canvas.width;\n      h = this.canvas.width * sourceAspect;\n    } else {\n      h = this.canvas.height;\n      w = this.canvas.height / sourceAspect;\n    }\n    this.minXClamp = this.canvas.width / 2 - w / 2;\n    this.minYClamp = this.canvas.height / 2 - h / 2;\n    this.maxXClamp = this.canvas.width / 2 + w / 2;\n    this.maxYClamp = this.canvas.height / 2 + h / 2;\n  }\n\n  public getCropBounds() {\n    const bounds = this.getBounds();\n    bounds.top = Math.round((bounds.top - this.minYClamp) / this.ratioH);\n    bounds.bottom = Math.round((bounds.bottom - this.minYClamp) / this.ratioH);\n    bounds.left = Math.round((bounds.left - this.minXClamp) / this.ratioW);\n    bounds.right = Math.round((bounds.right - this.minXClamp) / this.ratioW);\n    return bounds;\n  }\n\n  public clampPosition(x: number, y: number) {\n    if (x < this.minXClamp) {\n      x = this.minXClamp;\n    }\n    if (x > this.maxXClamp) {\n      x = this.maxXClamp;\n    }\n    if (y < this.minYClamp) {\n      y = this.minYClamp;\n    }\n    if (y > this.maxYClamp) {\n      y = this.maxYClamp;\n    }\n    return new PointPool().instance.borrow(x, y);\n  }\n\n  public isImageSet() {\n    return this.imageSet;\n  }\n\n  public setImage(img: any) {\n    this.srcImage = img;\n    if (!img) {\n      this.imageSet = false;\n      this.draw(this.ctx);\n    } else {\n      this.imageSet = true;\n      this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n      const bufferContext = this.buffer.getContext(\n        '2d'\n      ) as CanvasRenderingContext2D;\n      bufferContext.clearRect(0, 0, this.buffer.width, this.buffer.height);\n\n      if (!this.cropperSettings.fileType) {\n        this.fileType = this.getDataUriMimeType(img.src);\n      }\n\n      if (this.cropperSettings.minWithRelativeToResolution) {\n        this.minWidth =\n          (this.canvas.width * this.cropperSettings.minWidth) /\n          this.srcImage.width;\n        this.minHeight =\n          (this.canvas.height * this.cropperSettings.minHeight) /\n          this.srcImage.height;\n      }\n\n      this.updateClampBounds();\n      this.canvasWidth = this.canvas.width;\n      this.canvasHeight = this.canvas.height;\n\n      const cropPosition: Point[] = this.getCropPositionFromMarkers();\n      this.setCropPosition(cropPosition);\n    }\n  }\n\n  public updateCropPosition(cropBounds: Bounds): void {\n    const cropPosition: Point[] = this.getCropPositionFromBounds(cropBounds);\n    this.setCropPosition(cropPosition);\n  }\n\n  private setCropPosition(cropPosition: Point[]): void {\n    this.tl.setPosition(cropPosition[0].x, cropPosition[0].y);\n    this.tr.setPosition(cropPosition[1].x, cropPosition[1].y);\n    this.bl.setPosition(cropPosition[2].x, cropPosition[2].y);\n    this.br.setPosition(cropPosition[3].x, cropPosition[3].y);\n    this.center.setPosition(cropPosition[4].x, cropPosition[4].y);\n\n    for (const position of cropPosition) {\n      new PointPool().instance.returnPoint(position);\n    }\n\n    this.vertSquashRatio = this.detectVerticalSquash(this.srcImage);\n    this.draw(this.ctx);\n    this.croppedImage = this.getCroppedImageHelper(\n      false,\n      this.cropWidth,\n      this.cropHeight\n    );\n  }\n\n  private getCropPositionFromMarkers(): Point[] {\n    const w: number = this.canvas.width;\n    const h: number = this.canvas.height;\n    let tlPos: Point;\n    let trPos: Point;\n    let blPos: Point;\n    let brPos: Point;\n    let center: Point;\n    const sourceAspect: number = this.srcImage.height / this.srcImage.width;\n    const cropBounds: Bounds = this.getBounds();\n    const cropAspect: number = cropBounds.height / cropBounds.width;\n    const cX: number = this.canvas.width / 2;\n    const cY: number = this.canvas.height / 2;\n\n    if (cropAspect > sourceAspect) {\n      const imageH = Math.min(w * sourceAspect, h);\n      const cropW = imageH / cropAspect;\n      tlPos = new PointPool().instance.borrow(cX - cropW / 2, cY + imageH / 2);\n      trPos = new PointPool().instance.borrow(cX + cropW / 2, cY + imageH / 2);\n      blPos = new PointPool().instance.borrow(cX - cropW / 2, cY - imageH / 2);\n      brPos = new PointPool().instance.borrow(cX + cropW / 2, cY - imageH / 2);\n    } else {\n      const imageW = Math.min(h / sourceAspect, w);\n      const cropH = imageW * cropAspect;\n      tlPos = new PointPool().instance.borrow(cX - imageW / 2, cY + cropH / 2);\n      trPos = new PointPool().instance.borrow(cX + imageW / 2, cY + cropH / 2);\n      blPos = new PointPool().instance.borrow(cX - imageW / 2, cY - cropH / 2);\n      brPos = new PointPool().instance.borrow(cX + imageW / 2, cY - cropH / 2);\n    }\n\n    center = new PointPool().instance.borrow(cX, cY);\n    const positions: Point[] = [tlPos, trPos, blPos, brPos, center];\n    return positions;\n  }\n\n  private getCropPositionFromBounds(cropPosition: Bounds): Point[] {\n    let marginTop = 0;\n    let marginLeft = 0;\n    const canvasAspect: number = this.canvasHeight / this.canvasWidth;\n    const sourceAspect: number = this.srcImage.height / this.srcImage.width;\n\n    if (canvasAspect > sourceAspect) {\n      marginTop =\n        this.buffer.height / 2 - (this.canvasWidth * sourceAspect) / 2;\n    } else {\n      marginLeft = this.buffer.width / 2 - this.canvasHeight / sourceAspect / 2;\n    }\n\n    const ratioW: number =\n      (this.canvasWidth - marginLeft * 2) / this.srcImage.width;\n    const ratioH: number =\n      (this.canvasHeight - marginTop * 2) / this.srcImage.height;\n\n    let actualH: number = cropPosition.height * ratioH;\n    let actualW: number = cropPosition.width * ratioW;\n    const actualX: number = cropPosition.left * ratioW + marginLeft;\n    const actualY: number = cropPosition.top * ratioH + marginTop;\n\n    if (this.keepAspect) {\n      const scaledW: number = actualH / this.aspectRatio;\n      const scaledH: number = actualW * this.aspectRatio;\n\n      if (this.getCropBounds().height === cropPosition.height) {\n        // only width changed\n        actualH = scaledH;\n      } else if (this.getCropBounds().width === cropPosition.width) {\n        // only height changed\n        actualW = scaledW;\n      } else {\n        // height and width changed\n        if (Math.abs(scaledH - actualH) < Math.abs(scaledW - actualW)) {\n          actualW = scaledW;\n        } else {\n          actualH = scaledH;\n        }\n      }\n    }\n\n    const tlPos: Point = new PointPool().instance.borrow(\n      actualX,\n      actualY + actualH\n    );\n    const trPos: Point = new PointPool().instance.borrow(\n      actualX + actualW,\n      actualY + actualH\n    );\n    const blPos: Point = new PointPool().instance.borrow(actualX, actualY);\n    const brPos: Point = new PointPool().instance.borrow(\n      actualX + actualW,\n      actualY\n    );\n    const center: Point = new PointPool().instance.borrow(\n      actualX + actualW / 2,\n      actualY + actualH / 2\n    );\n\n    const positions: Point[] = [tlPos, trPos, blPos, brPos, center];\n    return positions;\n  }\n\n  public getCroppedImageHelper(\n    preserveSize?: boolean,\n    fillWidth?: number,\n    fillHeight?: number\n  ): HTMLImageElement {\n    if (this.cropperSettings.cropOnResize) {\n      return this.getCroppedImage(preserveSize, fillWidth, fillHeight);\n    }\n    return this.croppedImage\n      ? this.croppedImage\n      : document.createElement('img');\n  }\n\n  // todo: Unused parameters?\n  public getCroppedImage(\n    preserveSize?: boolean,\n    fillWidth?: number,\n    fillHeight?: number\n  ): HTMLImageElement {\n    const bounds: Bounds = this.getBounds();\n    if (!this.srcImage) {\n      return document.createElement('img');\n    } else {\n      const sourceAspect: number = this.srcImage.height / this.srcImage.width;\n      const canvasAspect: number = this.canvas.height / this.canvas.width;\n      let w: number = this.canvas.width;\n      let h: number = this.canvas.height;\n      if (canvasAspect > sourceAspect) {\n        w = this.canvas.width;\n        h = this.canvas.width * sourceAspect;\n      } else {\n        if (canvasAspect < sourceAspect) {\n          h = this.canvas.height;\n          w = this.canvas.height / sourceAspect;\n        } else {\n          h = this.canvas.height;\n          w = this.canvas.width;\n        }\n      }\n      this.ratioW = w / this.srcImage.width;\n      this.ratioH = h / this.srcImage.height;\n      const offsetH: number = (this.buffer.height - h) / 2 / this.ratioH;\n      const offsetW: number = (this.buffer.width - w) / 2 / this.ratioW;\n\n      const ctx = this.cropCanvas.getContext('2d') as CanvasRenderingContext2D;\n\n      if (this.cropperSettings.preserveSize || preserveSize) {\n        const width = Math.round(\n          bounds.right / this.ratioW - bounds.left / this.ratioW\n        );\n        const height = Math.round(\n          bounds.bottom / this.ratioH - bounds.top / this.ratioH\n        );\n\n        this.cropCanvas.width = width;\n        this.cropCanvas.height = height;\n\n        this.cropperSettings.croppedWidth = this.cropCanvas.width;\n        this.cropperSettings.croppedHeight = this.cropCanvas.height;\n      } else {\n        this.cropCanvas.width = this.cropWidth;\n        this.cropCanvas.height = this.cropHeight;\n      }\n\n      ctx.clearRect(0, 0, this.cropCanvas.width, this.cropCanvas.height);\n      this.drawImageIOSFix(\n        ctx,\n        this.srcImage,\n        Math.max(Math.round(bounds.left / this.ratioW - offsetW), 0),\n        Math.max(Math.round(bounds.top / this.ratioH - offsetH), 0),\n        Math.max(Math.round(bounds.width / this.ratioW), 1),\n        Math.max(Math.round(bounds.height / this.ratioH), 1),\n        0,\n        0,\n        this.cropCanvas.width,\n        this.cropCanvas.height\n      );\n\n      if (this.cropperSettings.resampleFn) {\n        this.cropperSettings.resampleFn(this.cropCanvas);\n      }\n\n      this.croppedImage.width = this.cropCanvas.width;\n      this.croppedImage.height = this.cropCanvas.height;\n      this.croppedImage.src = this.cropCanvas.toDataURL(\n        this.fileType,\n        this.cropperSettings.compressRatio\n      );\n      return this.croppedImage;\n    }\n  }\n\n  public getBounds(): Bounds {\n    let minX = Number.MAX_VALUE;\n    let minY = Number.MAX_VALUE;\n    let maxX = -Number.MAX_VALUE;\n    let maxY = -Number.MAX_VALUE;\n    for (const marker of this.markers) {\n      if (marker.position.x < minX) {\n        minX = marker.position.x;\n      }\n      if (marker.position.x > maxX) {\n        maxX = marker.position.x;\n      }\n      if (marker.position.y < minY) {\n        minY = marker.position.y;\n      }\n      if (marker.position.y > maxY) {\n        maxY = marker.position.y;\n      }\n    }\n    const bounds: Bounds = new Bounds();\n    bounds.left = minX;\n    bounds.right = maxX;\n    bounds.top = minY;\n    bounds.bottom = maxY;\n    return bounds;\n  }\n\n  public setBounds(bounds: any) {\n    // const topLeft: CornerMarker;\n    // const topRight: CornerMarker;\n    // const bottomLeft: CornerMarker;\n    // const bottomRight: CornerMarker;\n\n    const currentBounds = this.getBounds();\n    for (const marker of this.markers) {\n      if (marker.position.x === currentBounds.left) {\n        if (marker.position.y === currentBounds.top) {\n          marker.setPosition(bounds.left, bounds.top);\n        } else {\n          marker.setPosition(bounds.left, bounds.bottom);\n        }\n      } else {\n        if (marker.position.y === currentBounds.top) {\n          marker.setPosition(bounds.right, bounds.top);\n        } else {\n          marker.setPosition(bounds.right, bounds.bottom);\n        }\n      }\n    }\n\n    this.center.recalculatePosition(bounds);\n    this.center.draw(this.ctx);\n    this.draw(this.ctx); // we need to redraw all canvas if we have changed bounds\n  }\n\n  public onTouchMove(event: TouchEvent) {\n    if (this.crop.isImageSet()) {\n      if (event.touches.length === 1) {\n        if (this.isMouseDown) {\n          event.preventDefault();\n          // tslint:disable-next-line:prefer-for-of\n          for (let i = 0; i < event.touches.length; i++) {\n            const touch = event.touches[i];\n            const touchPosition = this.getTouchPos(this.canvas, touch);\n            const cropTouch = new CropTouch(\n              touchPosition.x,\n              touchPosition.y,\n              touch.identifier\n            );\n            new PointPool().instance.returnPoint(touchPosition);\n            this.move(cropTouch);\n          }\n        }\n      } else {\n        if (event.touches.length === 2) {\n          event.preventDefault();\n\n          const distance =\n            (event.touches[0].clientX - event.touches[1].clientX) *\n              (event.touches[0].clientX - event.touches[1].clientX) +\n            (event.touches[0].clientY - event.touches[1].clientY) *\n              (event.touches[0].clientY - event.touches[1].clientY);\n          if (this.previousDistance && this.previousDistance !== distance) {\n            const bounds = this.getBounds();\n\n            if (distance < this.previousDistance) {\n              bounds.top += 1;\n              bounds.left += 1;\n              bounds.right -= 1;\n              bounds.bottom -= 1;\n            }\n\n            if (distance > this.previousDistance) {\n              if (\n                bounds.top !== this.minYClamp &&\n                bounds.bottom !== this.maxYClamp &&\n                bounds.left !== this.minXClamp &&\n                bounds.right !== this.maxXClamp\n              ) {\n                // none\n                bounds.top -= 1;\n                bounds.left -= 1;\n                bounds.right += 1;\n                bounds.bottom += 1;\n              } else if (\n                bounds.top !== this.minYClamp &&\n                bounds.bottom !== this.maxYClamp &&\n                bounds.left === this.minXClamp &&\n                bounds.right !== this.maxXClamp\n              ) {\n                // left\n                bounds.top -= 1;\n                bounds.right += 2;\n                bounds.bottom += 1;\n              } else if (\n                bounds.top !== this.minYClamp &&\n                bounds.bottom !== this.maxYClamp &&\n                bounds.left !== this.minXClamp &&\n                bounds.right === this.maxXClamp\n              ) {\n                // right\n                bounds.top -= 1;\n                bounds.left -= 2;\n                bounds.bottom += 1;\n              } else if (\n                bounds.top === this.minYClamp &&\n                bounds.bottom !== this.maxYClamp &&\n                bounds.left !== this.minXClamp &&\n                bounds.right !== this.maxXClamp\n              ) {\n                // top\n                bounds.left -= 1;\n                bounds.right += 1;\n                bounds.bottom += 2;\n              } else if (\n                bounds.top !== this.minYClamp &&\n                bounds.bottom === this.maxYClamp &&\n                bounds.left !== this.minXClamp &&\n                bounds.right !== this.maxXClamp\n              ) {\n                // bottom\n                bounds.top -= 2;\n                bounds.left -= 1;\n                bounds.right += 1;\n              } else if (\n                bounds.top === this.minYClamp &&\n                bounds.bottom !== this.maxYClamp &&\n                bounds.left === this.minXClamp &&\n                bounds.right !== this.maxXClamp\n              ) {\n                // top left\n                bounds.right += 2;\n                bounds.bottom += 2;\n              } else if (\n                bounds.top === this.minYClamp &&\n                bounds.bottom !== this.maxYClamp &&\n                bounds.left !== this.minXClamp &&\n                bounds.right === this.maxXClamp\n              ) {\n                // top right\n                bounds.left -= 2;\n                bounds.bottom += 2;\n              } else if (\n                bounds.top !== this.minYClamp &&\n                bounds.bottom === this.maxYClamp &&\n                bounds.left === this.minXClamp &&\n                bounds.right !== this.maxXClamp\n              ) {\n                // bottom left\n                bounds.top -= 2;\n                bounds.right += 2;\n              } else if (\n                bounds.top !== this.minYClamp &&\n                bounds.bottom === this.maxYClamp &&\n                bounds.left !== this.minXClamp &&\n                bounds.right === this.maxXClamp\n              ) {\n                // bottom right\n                bounds.top -= 2;\n                bounds.left -= 2;\n              }\n            }\n\n            if (bounds.top < this.minYClamp) {\n              bounds.top = this.minYClamp;\n            }\n            if (bounds.bottom > this.maxYClamp) {\n              bounds.bottom = this.maxYClamp;\n            }\n            if (bounds.left < this.minXClamp) {\n              bounds.left = this.minXClamp;\n            }\n            if (bounds.right > this.maxXClamp) {\n              bounds.right = this.maxXClamp;\n            }\n\n            this.setBounds(bounds);\n          }\n          this.previousDistance = distance;\n        }\n      }\n      this.draw(this.ctx);\n    }\n  }\n\n  public onMouseMove(e: MouseEvent) {\n    if (this.crop.isImageSet() && this.isMouseDown) {\n      const mousePosition = this.getMousePos(this.canvas, e);\n      this.move(new CropTouch(mousePosition.x, mousePosition.y, 0));\n      let dragTouch = this.getDragTouchForID(0);\n      if (dragTouch) {\n        dragTouch.x = mousePosition.x;\n        dragTouch.y = mousePosition.y;\n      } else {\n        dragTouch = new CropTouch(mousePosition.x, mousePosition.y, 0);\n      }\n      new PointPool().instance.returnPoint(mousePosition);\n      this.drawCursors(dragTouch);\n      this.draw(this.ctx);\n    }\n  }\n\n  public move(cropTouch: CropTouch) {\n    if (this.isMouseDown) {\n      this.handleMove(cropTouch);\n    }\n  }\n\n  public getDragTouchForID(id: any): CropTouch | undefined {\n    // tslint:disable-next-line:prefer-for-of\n    for (let i = 0; i < this.currentDragTouches.length; i++) {\n      if (id === this.currentDragTouches[i].id) {\n        return this.currentDragTouches[i];\n      }\n    }\n    return undefined;\n  }\n\n  public drawCursors(cropTouch: CropTouch) {\n    let cursorDrawn = false;\n    if (cropTouch != null) {\n      if (cropTouch.dragHandle === this.center) {\n        this.imageCropperDataShare.setStyle(this.canvas, 'move');\n        cursorDrawn = true;\n      }\n      if (\n        cropTouch.dragHandle !== null &&\n        cropTouch.dragHandle instanceof CornerMarker\n      ) {\n        this.drawCornerCursor(\n          cropTouch.dragHandle,\n          cropTouch.dragHandle.position.x,\n          cropTouch.dragHandle.position.y\n        );\n        cursorDrawn = true;\n      }\n    }\n    let didDraw = false;\n    if (!cursorDrawn) {\n      // tslint:disable-next-line:prefer-for-of\n      for (let i = 0; i < this.markers.length; i++) {\n        didDraw =\n          didDraw ||\n          this.drawCornerCursor(this.markers[i], cropTouch.x, cropTouch.y);\n      }\n      if (!didDraw) {\n        this.imageCropperDataShare.setStyle(this.canvas, 'initial');\n      }\n    }\n    if (\n      !didDraw &&\n      !cursorDrawn &&\n      this.center.touchInBounds(cropTouch.x, cropTouch.y)\n    ) {\n      this.center.setOver(true);\n      this.imageCropperDataShare.setOver(this.canvas);\n      this.imageCropperDataShare.setStyle(this.canvas, 'move');\n    } else {\n      this.center.setOver(false);\n    }\n  }\n\n  public drawCornerCursor(marker: any, x: number, y: number) {\n    if (marker.touchInBounds(x, y)) {\n      marker.setOver(true);\n      if (marker.getHorizontalNeighbour().position.x > marker.position.x) {\n        if (marker.getVerticalNeighbour().position.y > marker.position.y) {\n          this.imageCropperDataShare.setOver(this.canvas);\n          this.imageCropperDataShare.setStyle(this.canvas, 'nwse-resize');\n        } else {\n          this.imageCropperDataShare.setOver(this.canvas);\n          this.imageCropperDataShare.setStyle(this.canvas, 'nesw-resize');\n        }\n      } else {\n        if (marker.getVerticalNeighbour().position.y > marker.position.y) {\n          this.imageCropperDataShare.setOver(this.canvas);\n          this.imageCropperDataShare.setStyle(this.canvas, 'nesw-resize');\n        } else {\n          this.imageCropperDataShare.setOver(this.canvas);\n          this.imageCropperDataShare.setStyle(this.canvas, 'nwse-resize');\n        }\n      }\n      return true;\n    }\n    marker.setOver(false);\n    return false;\n  }\n\n  public onTouchStart(event: TouchEvent) {\n    if (this.crop.isImageSet()) {\n      const touch = event.touches[0];\n      const touchPosition = this.getTouchPos(this.canvas, touch);\n      const cropTouch = new CropTouch(\n        touchPosition.x,\n        touchPosition.y,\n        touch.identifier\n      );\n      new PointPool().instance.returnPoint(touchPosition);\n\n      this.isMouseDown = false;\n      for (const marker of this.markers) {\n        if (marker.touchInBounds(cropTouch.x, cropTouch.y)) {\n          this.isMouseDown = true;\n        }\n      }\n      if (this.center.touchInBounds(cropTouch.x, cropTouch.y)) {\n        this.isMouseDown = true;\n      }\n    }\n  }\n\n  public onTouchEnd(event: TouchEvent) {\n    if (this.crop.isImageSet()) {\n      // tslint:disable-next-line:prefer-for-of\n      for (let i = 0; i < event.changedTouches.length; i++) {\n        const touch = event.changedTouches[i];\n        const dragTouch = this.getDragTouchForID(touch.identifier);\n        if (dragTouch && dragTouch !== undefined) {\n          if (\n            dragTouch.dragHandle instanceof CornerMarker ||\n            dragTouch.dragHandle instanceof DragMarker\n          ) {\n            dragTouch.dragHandle.setOver(false);\n          }\n          this.handleRelease(dragTouch);\n        }\n      }\n\n      if (this.currentDragTouches.length === 0) {\n        this.isMouseDown = false;\n        this.currentlyInteracting = false;\n      }\n    }\n  }\n\n  // http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios\n  public drawImageIOSFix(\n    ctx: CanvasRenderingContext2D,\n    img: HTMLImageElement | HTMLCanvasElement | HTMLVideoElement,\n    sx: number,\n    sy: number,\n    sw: number,\n    sh: number,\n    dx: number,\n    dy: number,\n    dw: number,\n    dh: number\n  ) {\n    // Works only if whole image is displayed:\n    // ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);\n    // The following works correct also when only a part of the image is displayed:\n    // ctx.drawImage(img, sx * this.vertSquashRatio, sy * this.vertSquashRatio, sw * this.vertSquashRatio, sh *\n    // this.vertSquashRatio, dx, dy, dw, dh);\n    ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh);\n  }\n\n  public onMouseDown(event: MouseEvent) {\n    if (this.crop.isImageSet()) {\n      this.isMouseDown = true;\n    }\n  }\n\n  public onMouseUp(event: MouseEvent) {\n    if (this.crop.isImageSet()) {\n      this.imageCropperDataShare.setReleased(this.canvas);\n      this.isMouseDown = false;\n      this.handleRelease(new CropTouch(0, 0, 0));\n    }\n  }\n}\n","import { Bounds } from './bounds';\n\nexport class CropPosition {\n  public x: number;\n  public y: number;\n  public w: number;\n  public h: number;\n\n  constructor(x: number = 0, y: number = 0, w: number = 0, h: number = 0) {\n    this.x = +x;\n    this.y = +y;\n    this.w = +w;\n    this.h = +h;\n  }\n\n  public toBounds(): Bounds {\n    return new Bounds(this.x, this.y, this.w, this.h);\n  }\n\n  public isInitialized(): boolean {\n    return this.x !== 0 && this.y !== 0 && this.w !== 0 && this.h !== 0;\n  }\n}\n","import {\n  Component,\n  AfterViewInit,\n  OnChanges,\n  OnDestroy,\n  ViewChild,\n  ElementRef,\n  Input,\n  Output,\n  EventEmitter,\n  Renderer2,\n  SimpleChanges, Inject\n} from '@angular/core';\nimport { CropperSettings } from './cropper-settings';\nimport { ImageCropper } from './imageCropper';\nimport { CropPosition } from './model/cropPosition';\nimport { Bounds } from './model/bounds';\nimport { Exif } from './exif';\nimport { DOCUMENT } from '@angular/common';\n\n@Component({\n  // tslint:disable-next-line:component-selector\n  selector: 'img-cropper',\n  templateUrl: './image-cropper.component.html'\n})\nexport class ImageCropperComponent\n  implements AfterViewInit, OnChanges, OnDestroy {\n  @ViewChild('cropcanvas', { static: true })\n  cropcanvas: ElementRef;\n  @ViewChild('fileInput') fileInput: ElementRef;\n\n  @Input() public settings: CropperSettings;\n  @Input() public image: any;\n  @Input() public inputImage: any;\n  @Input() public cropper: ImageCropper;\n  @Input() public cropPosition: CropPosition;\n  @Output()\n  public cropPositionChange: EventEmitter<CropPosition> = new EventEmitter<\n    CropPosition\n  >();\n\n  private exif = new Exif();\n\n  // tslint:disable-next-line:no-output-on-prefix\n  @Output() public onCrop: EventEmitter<any> = new EventEmitter();\n  @Output() imageSet: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n  public croppedWidth: number;\n  public croppedHeight: number;\n  public intervalRef: number;\n  public raf: number;\n  public renderer: Renderer2;\n  public windowListener: EventListenerObject;\n\n  private isCropPositionUpdateNeeded: boolean;\n  private dragUnsubscribers: (() => void)[] = [];\n\n  constructor(renderer: Renderer2,\n              @Inject(DOCUMENT) private document) {\n    this.renderer = renderer;\n  }\n\n  public ngAfterViewInit(): void {\n    const canvas: HTMLCanvasElement = this.cropcanvas.nativeElement;\n\n    if (!this.settings) {\n      this.settings = new CropperSettings();\n    }\n\n    if (this.settings.cropperClass) {\n      this.renderer.setAttribute(canvas, 'class', this.settings.cropperClass);\n    }\n\n    if (!this.settings.dynamicSizing) {\n      this.renderer.setAttribute(\n        canvas,\n        'width',\n        this.settings.canvasWidth.toString()\n      );\n      this.renderer.setAttribute(\n        canvas,\n        'height',\n        this.settings.canvasHeight.toString()\n      );\n    } else {\n      this.windowListener = this.resize.bind(this);\n      window.addEventListener('resize', this.windowListener);\n    }\n\n    if (!this.cropper) {\n      this.cropper = new ImageCropper(this.settings);\n    }\n\n    this.cropper.prepare(canvas);\n  }\n\n  public ngOnChanges(changes: SimpleChanges): void {\n    if (this.isCropPositionChanged(changes)) {\n      this.cropper.updateCropPosition(this.cropPosition.toBounds());\n      if (this.cropper.isImageSet()) {\n        const bounds = this.cropper.getCropBounds();\n        this.image.image = this.cropper.getCroppedImageHelper().src;\n        this.onCrop.emit(bounds);\n      }\n      this.updateCropBounds();\n    }\n\n    if (changes.inputImage) {\n      this.setImage(changes.inputImage.currentValue);\n    }\n\n    if (changes.settings && this.cropper) {\n      this.cropper.updateSettings(this.settings);\n      if (this.cropper.isImageSet()) {\n        this.image.image = this.cropper.getCroppedImageHelper().src;\n        this.onCrop.emit(this.cropper.getCropBounds());\n      }\n    }\n  }\n\n  public ngOnDestroy() {\n    this.removeDragListeners();\n    if (this.settings.dynamicSizing && this.windowListener) {\n      window.removeEventListener('resize', this.windowListener);\n    }\n  }\n\n  public onTouchMove(event: TouchEvent): void {\n    this.cropper.onTouchMove(event);\n  }\n\n  public onTouchStart(event: TouchEvent): void {\n    this.cropper.onTouchStart(event);\n  }\n\n  public onTouchEnd(event: TouchEvent): void {\n    this.cropper.onTouchEnd(event);\n    if (this.cropper.isImageSet()) {\n      this.image.image = this.cropper.getCroppedImageHelper().src;\n      this.onCrop.emit(this.cropper.getCropBounds());\n      this.updateCropBounds();\n    }\n  }\n\n  public onMouseDown(event: MouseEvent): void {\n    this.dragUnsubscribers.push(this.renderer.listen(this.document, 'mousemove', this.onMouseMove.bind(this)));\n    this.dragUnsubscribers.push(this.renderer.listen(this.document, 'mouseup', this.onMouseUp.bind(this)));\n\n    this.cropper.onMouseDown(event);\n    // if (!this.cropper.isImageSet() && !this.settings.noFileInput) {\n    //   // load img\n    //   this.fileInput.nativeElement.click();\n    // }\n  }\n\n  private removeDragListeners() {\n    this.dragUnsubscribers.forEach(unsubscribe => unsubscribe());\n  }\n\n  public onMouseUp(event: MouseEvent): void {\n    this.removeDragListeners();\n    if (this.cropper.isImageSet()) {\n      this.cropper.onMouseUp(event);\n      this.image.image = this.cropper.getCroppedImageHelper().src;\n      this.onCrop.emit(this.cropper.getCropBounds());\n      this.updateCropBounds();\n    }\n  }\n\n  public onMouseMove(event: MouseEvent): void {\n    this.cropper.onMouseMove(event);\n  }\n\n  public fileChangeListener($event: any) {\n    if ($event.target.files.length === 0) {\n      return;\n    }\n\n    const file: File = $event.target.files[0];\n    if (this.settings.allowedFilesRegex.test(file.name)) {\n      const image: any = new Image();\n      const fileReader: FileReader = new FileReader();\n\n      fileReader.addEventListener('loadend', (loadEvent: any) => {\n        image.addEventListener('load', () => {\n          this.setImage(image);\n        });\n        image.src = loadEvent.target.result;\n      });\n\n      fileReader.readAsDataURL(file);\n    }\n  }\n\n  private resize() {\n    const canvas: HTMLCanvasElement = this.cropcanvas.nativeElement;\n    this.settings.canvasWidth = canvas.offsetWidth;\n    this.settings.canvasHeight = canvas.offsetHeight;\n    this.cropper.resizeCanvas(canvas.offsetWidth, canvas.offsetHeight, true);\n  }\n\n  public reset(): void {\n    this.cropper.reset();\n    this.renderer.setAttribute(\n      this.cropcanvas.nativeElement,\n      'class',\n      this.settings.cropperClass\n    );\n    this.image.image = this.cropper.getCroppedImageHelper().src;\n  }\n\n  public setImage(image: HTMLImageElement, newBounds: any = null) {\n    this.imageSet.emit(true);\n    this.renderer.setAttribute(\n      this.cropcanvas.nativeElement,\n      'class',\n      `${this.settings.cropperClass} ${this.settings.croppingClass}`\n    );\n    this.raf = window.requestAnimationFrame(() => {\n      if (this.raf) {\n        window.cancelAnimationFrame(this.raf);\n      }\n      if (image.naturalHeight > 0 && image.naturalWidth > 0) {\n        image.height = image.naturalHeight;\n        image.width = image.naturalWidth;\n\n        window.cancelAnimationFrame(this.raf);\n        this.getOrientedImage(image, (img: HTMLImageElement) => {\n          if (this.settings.dynamicSizing) {\n            const canvas: HTMLCanvasElement = this.cropcanvas.nativeElement;\n            this.settings.canvasWidth = canvas.offsetWidth;\n            this.settings.canvasHeight = canvas.offsetHeight;\n            this.cropper.resizeCanvas(\n              canvas.offsetWidth,\n              canvas.offsetHeight,\n              false\n            );\n          }\n\n          this.cropper.setImage(img);\n          if (this.cropPosition && this.cropPosition.isInitialized()) {\n            this.cropper.updateCropPosition(this.cropPosition.toBounds());\n          }\n\n          this.image.original = img;\n          let bounds = this.cropper.getCropBounds();\n          this.image.image = this.cropper.getCroppedImageHelper().src;\n\n          if (!this.image) {\n            this.image = image;\n          }\n\n          if (newBounds != null) {\n            bounds = newBounds;\n            this.cropper.setBounds(bounds);\n            this.cropper.updateCropPosition(bounds);\n          }\n          this.onCrop.emit(bounds);\n        });\n      }\n    });\n  }\n\n  private isCropPositionChanged(changes: SimpleChanges): boolean {\n    if (\n      this.cropper &&\n      changes.cropPosition &&\n      this.isCropPositionUpdateNeeded\n    ) {\n      return true;\n    } else {\n      this.isCropPositionUpdateNeeded = true;\n      return false;\n    }\n  }\n\n  private updateCropBounds(): void {\n    const cropBound: Bounds = this.cropper.getCropBounds();\n    this.cropPositionChange.emit(\n      new CropPosition(\n        cropBound.left,\n        cropBound.top,\n        cropBound.width,\n        cropBound.height\n      )\n    );\n    this.isCropPositionUpdateNeeded = false;\n  }\n\n  private getOrientedImage(\n    image: HTMLImageElement,\n    callback: (img: HTMLImageElement) => void\n  ) {\n    let img: any;\n\n    this.exif.getData(image, () => {\n      const orientation = this.exif.getTag(image, 'Orientation');\n\n      if ([3, 6, 8].indexOf(orientation) > -1) {\n        const canvas: HTMLCanvasElement = document.createElement('canvas');\n        const ctx: CanvasRenderingContext2D = canvas.getContext(\n          '2d'\n        ) as CanvasRenderingContext2D;\n        let cw: number = image.width;\n        let ch: number = image.height;\n        let cx = 0;\n        let cy = 0;\n        let deg = 0;\n\n        switch (orientation) {\n          case 3:\n            cx = -image.width;\n            cy = -image.height;\n            deg = 180;\n            break;\n          case 6:\n            cw = image.height;\n            ch = image.width;\n            cy = -image.height;\n            deg = 90;\n            break;\n          case 8:\n            cw = image.height;\n            ch = image.width;\n            cx = -image.width;\n            deg = 270;\n            break;\n          default:\n            break;\n        }\n\n        canvas.width = cw;\n        canvas.height = ch;\n        ctx.rotate((deg * Math.PI) / 180);\n        ctx.drawImage(image, cx, cy);\n        img = document.createElement('img');\n        img.width = cw;\n        img.height = ch;\n        img.addEventListener('load', () => {\n          callback(img);\n        });\n        img.src = canvas.toDataURL('image/png');\n      } else {\n        img = image;\n        callback(img);\n      }\n    });\n  }\n}\n","<span class=\"ng2-imgcrop\">\n  <input\n    *ngIf=\"!settings.noFileInput\"\n    #fileInput\n    type=\"file\"\n    accept=\"image/*\"\n    (change)=\"fileChangeListener($event)\"\n  />\n  <canvas\n    #cropcanvas\n    (mousedown)=\"onMouseDown($event)\"\n    (touchmove)=\"onTouchMove($event)\"\n    (touchend)=\"onTouchEnd($event)\"\n    (touchstart)=\"onTouchStart($event)\"\n  >\n  </canvas>\n</span>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ImageCropperComponent } from './image-cropper.component';\n\n@NgModule({\n  declarations: [ImageCropperComponent],\n  exports: [ImageCropperComponent],\n  imports: [CommonModule]\n})\nexport class ImageCropperModule {}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ImageCropperService {\n  constructor() {}\n}\n","// looks like this CropService is never used\nexport class CropService {\n  public canvas: HTMLCanvasElement;\n  public ctx: CanvasRenderingContext2D;\n\n  public init(canvas: HTMLCanvasElement) {\n    this.canvas = canvas;\n    this.ctx = this.canvas.getContext('2d') as CanvasRenderingContext2D;\n  }\n}\n","/*\n * Public API Surface of ngx-img-cropper\n */\n\nexport * from './lib/image-cropper/cropper-draw-settings';\nexport * from './lib/image-cropper/cropper-settings';\nexport * from './lib/image-cropper/exif';\nexport * from './lib/image-cropper/image-cropper.component';\nexport * from './lib/image-cropper/image-cropper.module';\nexport * from './lib/image-cropper/image-cropper.service';\nexport * from './lib/image-cropper/imageCropper';\nexport * from './lib/image-cropper/imageCropperDataShare';\nexport * from './lib/image-cropper/model';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}