Code coverage report for imgly-sdk-html5/src/js/lib/image-dimensions.js

Statements: 100% (61 / 61)      Branches: 100% (44 / 44)      Functions: 100% (9 / 9)      Lines: 100% (43 / 43)      Ignored: 2 statements, 5 branches     

All files » imgly-sdk-html5/src/js/lib/ » image-dimensions.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147                                      1         3       55   1 1 55             55               55           55   54               1     55 46     9 9 1     8                           54   8 8   8 1     7 1                         52     52     6   2 4   2 2 2   1 1 1 1   1 1 1     6       1     1 1  
/*
 * Photo Editor SDK - photoeditorsdk.com
 * Copyright (c) 2013-2015 9elements GmbH
 *
 * Released under Attribution-NonCommercial 3.0 Unported
 * http://creativecommons.org/licenses/by-nc/3.0/
 *
 * For commercial use, please contact us at contact@9elements.com
 */
 
/**
 * Parses the dimensions string and provides calculation functions
 * @class
 * @alias ImglyKit.ImageDimensions
 * @param {string} dimensions
 * @private
 */
'use strict';
 
Object.defineProperty(exports, '__esModule', {
  value: true
});
// istanbul ignore next
 
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; Eif ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { Eif (protoProps) defineProperties(Constructor.prototype, protoProps); Iif (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
 
// istanbul ignore next
 
function _classCallCheck(instance, Constructor) { Iif (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
var ImageDimensions = (function () {
  function ImageDimensions(dimensions) {
    _classCallCheck(this, ImageDimensions);
 
    /**
     * The available dimension modifiers
     * @type {Object}
     * @private
     */
    this._modifiers = {
      FIXED: '!'
    };
 
    /**
     * @type {string}
     * @private
     */
    this._dimensionsString = dimensions;
 
    /**
     * An object that represents the parsed dimensions string
     * @type {Object}
     */
    this._rules = this._parse();
 
    this._validateRules();
  }
 
  /**
   * Parses the dimensions string
   * @private
   */
 
  _createClass(ImageDimensions, [{
    key: '_parse',
    value: function _parse() {
      if (typeof this._dimensionsString === 'undefined' || this._dimensionsString === null) {
        return null;
      }
 
      var match = this._dimensionsString.match(/^([0-9]+)?x([0-9]+)?([\!])?$/i);
      if (!match) {
        throw new Error('Invalid size option: ' + this._dimensionsString);
      }
 
      return {
        x: isNaN(match[1]) ? null : parseInt(match[1], 10),
        y: isNaN(match[2]) ? null : parseInt(match[2], 10),
        modifier: match[3]
      };
    }
 
    /**
     * Validates the rules
     * @private
     */
  }, {
    key: '_validateRules',
    value: function _validateRules() {
      if (this._rules === null) return;
 
      var xAvailable = this._rules.x !== null;
      var yAvailable = this._rules.y !== null;
 
      if (this._rules.modifier === this._modifiers.FIXED && !(xAvailable && yAvailable)) {
        throw new Error('Both `x` and `y` have to be set when using the fixed (!) modifier.');
      }
 
      if (!xAvailable && !yAvailable) {
        throw new Error('Neither `x` nor `y` are given.');
      }
    }
 
    /**
     * Calculates the final dimensions using the dimensions string and the
     * given initial dimensions
     * @param  {Vector2} initialDimensions
     * @return {Vector2}
     */
  }, {
    key: 'calculateFinalDimensions',
    value: function calculateFinalDimensions(initialDimensions) {
      var dimensions = initialDimensions.clone(),
          ratio;
 
      if (this._rules === null) return dimensions;
 
      /* istanbul ignore else */
      if (this._rules.modifier === this._modifiers.FIXED) {
        // Fixed dimensions
        dimensions.set(this._rules.x, this._rules.y);
      } else if (this._rules.x !== null && this._rules.y !== null) {
        // Both x and y given, resize to fit
        ratio = Math.min(this._rules.x / dimensions.x, this._rules.y / dimensions.y);
        dimensions.multiply(ratio);
      } else if (this._rules.x !== null) {
        // Fixed x, y by ratio
        ratio = initialDimensions.y / initialDimensions.x;
        dimensions.x = this._rules.x;
        dimensions.y = dimensions.x * ratio;
      } else Eif (this._rules.y !== null) {
        // Fixed y, x by ratio
        ratio = initialDimensions.x / initialDimensions.y;
        dimensions.y = this._rules.y;
        dimensions.x = dimensions.y * ratio;
      }
 
      return dimensions;
    }
  }]);
 
  return ImageDimensions;
})();
 
exports['default'] = ImageDimensions;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9yb290L1NFUlZFUi9pbWdseS1zZGstaHRtbDUvc3JjL2pzL2xpYi9pbWFnZS1kaW1lbnNpb25zLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQWlCTSxlQUFlO0FBQ1AsV0FEUixlQUFlLENBQ04sVUFBVSxFQUFFOzBCQURyQixlQUFlOzs7Ozs7O0FBT2pCLFFBQUksQ0FBQyxVQUFVLEdBQUc7QUFDaEIsV0FBSyxFQUFFLEdBQUc7S0FDWCxDQUFBOzs7Ozs7QUFNRCxRQUFJLENBQUMsaUJBQWlCLEdBQUcsVUFBVSxDQUFBOzs7Ozs7QUFNbkMsUUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7O0FBRTNCLFFBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQTtHQUN0Qjs7Ozs7OztlQXhCRyxlQUFlOztXQThCWixrQkFBRztBQUNSLFVBQUksT0FBTyxJQUFJLENBQUMsaUJBQWlCLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxJQUFJLEVBQUU7QUFDcEYsZUFBTyxJQUFJLENBQUE7T0FDWjs7QUFFRCxVQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUE7QUFDekUsVUFBSSxDQUFDLEtBQUssRUFBRTtBQUNWLGNBQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7T0FDbEU7O0FBRUQsYUFBTztBQUNMLFNBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQ2xELFNBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0FBQ2xELGdCQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztPQUNuQixDQUFBO0tBQ0Y7Ozs7Ozs7O1dBTWMsMEJBQUc7QUFDaEIsVUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLElBQUksRUFBRSxPQUFNOztBQUVoQyxVQUFJLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUE7QUFDdkMsVUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFBOztBQUV2QyxVQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsVUFBVSxJQUFJLFVBQVUsQ0FBQSxBQUFDLEVBQUU7QUFDakYsY0FBTSxJQUFJLEtBQUssQ0FBQyxvRUFBb0UsQ0FBQyxDQUFBO09BQ3RGOztBQUVELFVBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxVQUFVLEVBQUU7QUFDOUIsY0FBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFBO09BQ2xEO0tBQ0Y7Ozs7Ozs7Ozs7V0FRd0Isa0NBQUMsaUJBQWlCLEVBQUU7QUFDM0MsVUFBSSxVQUFVLEdBQUcsaUJBQWlCLENBQUMsS0FBSyxFQUFFO1VBQUUsS0FBSyxDQUFBOztBQUVqRCxVQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFLE9BQU8sVUFBVSxDQUFBOzs7QUFHM0MsVUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRTs7QUFFbEQsa0JBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQTtPQUM3QyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTs7QUFFM0QsYUFBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDNUUsa0JBQVUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7T0FDM0IsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTs7QUFFakMsYUFBSyxHQUFHLGlCQUFpQixDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7QUFDakQsa0JBQVUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7QUFDNUIsa0JBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUE7T0FDcEMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLElBQUksRUFBRTs7QUFFakMsYUFBSyxHQUFHLGlCQUFpQixDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLENBQUE7QUFDakQsa0JBQVUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7QUFDNUIsa0JBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUE7T0FDcEM7O0FBRUQsYUFBTyxVQUFVLENBQUE7S0FDbEI7OztTQWxHRyxlQUFlOzs7cUJBcUdOLGVBQWUiLCJmaWxlIjoiL3Jvb3QvU0VSVkVSL2ltZ2x5LXNkay1odG1sNS9zcmMvanMvbGliL2ltYWdlLWRpbWVuc2lvbnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogUGhvdG8gRWRpdG9yIFNESyAtIHBob3RvZWRpdG9yc2RrLmNvbVxuICogQ29weXJpZ2h0IChjKSAyMDEzLTIwMTUgOWVsZW1lbnRzIEdtYkhcbiAqXG4gKiBSZWxlYXNlZCB1bmRlciBBdHRyaWJ1dGlvbi1Ob25Db21tZXJjaWFsIDMuMCBVbnBvcnRlZFxuICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMvMy4wL1xuICpcbiAqIEZvciBjb21tZXJjaWFsIHVzZSwgcGxlYXNlIGNvbnRhY3QgdXMgYXQgY29udGFjdEA5ZWxlbWVudHMuY29tXG4gKi9cblxuLyoqXG4gKiBQYXJzZXMgdGhlIGRpbWVuc2lvbnMgc3RyaW5nIGFuZCBwcm92aWRlcyBjYWxjdWxhdGlvbiBmdW5jdGlvbnNcbiAqIEBjbGFzc1xuICogQGFsaWFzIEltZ2x5S2l0LkltYWdlRGltZW5zaW9uc1xuICogQHBhcmFtIHtzdHJpbmd9IGRpbWVuc2lvbnNcbiAqIEBwcml2YXRlXG4gKi9cbmNsYXNzIEltYWdlRGltZW5zaW9ucyB7XG4gIGNvbnN0cnVjdG9yIChkaW1lbnNpb25zKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGF2YWlsYWJsZSBkaW1lbnNpb24gbW9kaWZpZXJzXG4gICAgICogQHR5cGUge09iamVjdH1cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuICAgIHRoaXMuX21vZGlmaWVycyA9IHtcbiAgICAgIEZJWEVEOiAnISdcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBwcml2YXRlXG4gICAgICovXG4gICAgdGhpcy5fZGltZW5zaW9uc1N0cmluZyA9IGRpbWVuc2lvbnNcblxuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgdGhlIHBhcnNlZCBkaW1lbnNpb25zIHN0cmluZ1xuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICovXG4gICAgdGhpcy5fcnVsZXMgPSB0aGlzLl9wYXJzZSgpXG5cbiAgICB0aGlzLl92YWxpZGF0ZVJ1bGVzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgdGhlIGRpbWVuc2lvbnMgc3RyaW5nXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcGFyc2UgKCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy5fZGltZW5zaW9uc1N0cmluZyA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcy5fZGltZW5zaW9uc1N0cmluZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2ggPSB0aGlzLl9kaW1lbnNpb25zU3RyaW5nLm1hdGNoKC9eKFswLTldKyk/eChbMC05XSspPyhbXFwhXSk/JC9pKVxuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzaXplIG9wdGlvbjogJyArIHRoaXMuX2RpbWVuc2lvbnNTdHJpbmcpXG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGlzTmFOKG1hdGNoWzFdKSA/IG51bGwgOiBwYXJzZUludChtYXRjaFsxXSwgMTApLFxuICAgICAgeTogaXNOYU4obWF0Y2hbMl0pID8gbnVsbCA6IHBhcnNlSW50KG1hdGNoWzJdLCAxMCksXG4gICAgICBtb2RpZmllcjogbWF0Y2hbM11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIHRoZSBydWxlc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3ZhbGlkYXRlUnVsZXMgKCkge1xuICAgIGlmICh0aGlzLl9ydWxlcyA9PT0gbnVsbCkgcmV0dXJuXG5cbiAgICB2YXIgeEF2YWlsYWJsZSA9IHRoaXMuX3J1bGVzLnggIT09IG51bGxcbiAgICB2YXIgeUF2YWlsYWJsZSA9IHRoaXMuX3J1bGVzLnkgIT09IG51bGxcblxuICAgIGlmICh0aGlzLl9ydWxlcy5tb2RpZmllciA9PT0gdGhpcy5fbW9kaWZpZXJzLkZJWEVEICYmICEoeEF2YWlsYWJsZSAmJiB5QXZhaWxhYmxlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIGB4YCBhbmQgYHlgIGhhdmUgdG8gYmUgc2V0IHdoZW4gdXNpbmcgdGhlIGZpeGVkICghKSBtb2RpZmllci4nKVxuICAgIH1cblxuICAgIGlmICgheEF2YWlsYWJsZSAmJiAheUF2YWlsYWJsZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdOZWl0aGVyIGB4YCBub3IgYHlgIGFyZSBnaXZlbi4nKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBmaW5hbCBkaW1lbnNpb25zIHVzaW5nIHRoZSBkaW1lbnNpb25zIHN0cmluZyBhbmQgdGhlXG4gICAqIGdpdmVuIGluaXRpYWwgZGltZW5zaW9uc1xuICAgKiBAcGFyYW0gIHtWZWN0b3IyfSBpbml0aWFsRGltZW5zaW9uc1xuICAgKiBAcmV0dXJuIHtWZWN0b3IyfVxuICAgKi9cbiAgY2FsY3VsYXRlRmluYWxEaW1lbnNpb25zIChpbml0aWFsRGltZW5zaW9ucykge1xuICAgIHZhciBkaW1lbnNpb25zID0gaW5pdGlhbERpbWVuc2lvbnMuY2xvbmUoKSwgcmF0aW9cblxuICAgIGlmICh0aGlzLl9ydWxlcyA9PT0gbnVsbCkgcmV0dXJuIGRpbWVuc2lvbnNcblxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHRoaXMuX3J1bGVzLm1vZGlmaWVyID09PSB0aGlzLl9tb2RpZmllcnMuRklYRUQpIHtcbiAgICAgIC8vIEZpeGVkIGRpbWVuc2lvbnNcbiAgICAgIGRpbWVuc2lvbnMuc2V0KHRoaXMuX3J1bGVzLngsIHRoaXMuX3J1bGVzLnkpXG4gICAgfSBlbHNlIGlmICh0aGlzLl9ydWxlcy54ICE9PSBudWxsICYmIHRoaXMuX3J1bGVzLnkgIT09IG51bGwpIHtcbiAgICAgIC8vIEJvdGggeCBhbmQgeSBnaXZlbiwgcmVzaXplIHRvIGZpdFxuICAgICAgcmF0aW8gPSBNYXRoLm1pbih0aGlzLl9ydWxlcy54IC8gZGltZW5zaW9ucy54LCB0aGlzLl9ydWxlcy55IC8gZGltZW5zaW9ucy55KVxuICAgICAgZGltZW5zaW9ucy5tdWx0aXBseShyYXRpbylcbiAgICB9IGVsc2UgaWYgKHRoaXMuX3J1bGVzLnggIT09IG51bGwpIHtcbiAgICAgIC8vIEZpeGVkIHgsIHkgYnkgcmF0aW9cbiAgICAgIHJhdGlvID0gaW5pdGlhbERpbWVuc2lvbnMueSAvIGluaXRpYWxEaW1lbnNpb25zLnhcbiAgICAgIGRpbWVuc2lvbnMueCA9IHRoaXMuX3J1bGVzLnhcbiAgICAgIGRpbWVuc2lvbnMueSA9IGRpbWVuc2lvbnMueCAqIHJhdGlvXG4gICAgfSBlbHNlIGlmICh0aGlzLl9ydWxlcy55ICE9PSBudWxsKSB7XG4gICAgICAvLyBGaXhlZCB5LCB4IGJ5IHJhdGlvXG4gICAgICByYXRpbyA9IGluaXRpYWxEaW1lbnNpb25zLnggLyBpbml0aWFsRGltZW5zaW9ucy55XG4gICAgICBkaW1lbnNpb25zLnkgPSB0aGlzLl9ydWxlcy55XG4gICAgICBkaW1lbnNpb25zLnggPSBkaW1lbnNpb25zLnkgKiByYXRpb1xuICAgIH1cblxuICAgIHJldHVybiBkaW1lbnNpb25zXG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSW1hZ2VEaW1lbnNpb25zXG4iXX0=