Index: ui/file_manager/gallery/js/image_editor/viewport.js |
diff --git a/ui/file_manager/gallery/js/image_editor/viewport.js b/ui/file_manager/gallery/js/image_editor/viewport.js |
index 7b52f5e0243f5065de704b952cf3b228cbde3009..1c41bdc082ee4e94399ff0906bd01efa56571f5f 100644 |
--- a/ui/file_manager/gallery/js/image_editor/viewport.js |
+++ b/ui/file_manager/gallery/js/image_editor/viewport.js |
@@ -9,9 +9,26 @@ |
* @constructor |
*/ |
function Viewport() { |
+ /** |
+ * Size of the full resolution image. |
+ * @type {Rect} |
+ * @private |
+ */ |
this.imageBounds_ = new Rect(); |
+ |
+ /** |
+ * Size of the application window. |
+ * @type {Rect} |
+ * @private |
+ */ |
this.screenBounds_ = new Rect(); |
+ /** |
+ * Scale from the full resolution image to the screen displayed image. This is |
+ * not zoom operated by users. |
+ * @type {number} |
+ * @private |
+ */ |
this.scale_ = 1; |
this.offsetX_ = 0; |
this.offsetY_ = 0; |
@@ -22,10 +39,6 @@ function Viewport() { |
this.update(); |
} |
-/* |
- * Viewport modification. |
- */ |
- |
/** |
* @param {number} width Image width. |
* @param {number} height Image height. |
@@ -86,11 +99,24 @@ Viewport.prototype.setScale = function(scale, notify) { |
* @return {number} Best scale to fit the current image into the current screen. |
*/ |
Viewport.prototype.getFittingScale = function() { |
- var scaleX = this.screenBounds_.width / this.imageBounds_.width; |
- var scaleY = this.screenBounds_.height / this.imageBounds_.height; |
- // Scales > (1 / this.getDevicePixelRatio()) do not look good. Also they are |
+ return this.getFittingScaleForImageSize_( |
+ this.imageBounds_.width, this.imageBounds_.height); |
+}; |
+ |
+/** |
+ * Obtains the scale for the specified image size. |
+ * |
+ * @param {number} width Width of the full resolution image. |
+ * @param {number} height Height of the full resolution image. |
+ * @return {number} The ratio of the fullresotion image size and the calculated |
+ * displayed image size. |
+ */ |
+Viewport.prototype.getFittingScaleForImageSize_ = function(width, height) { |
+ var scaleX = this.screenBounds_.width / width; |
+ var scaleY = this.screenBounds_.height / height; |
+ // Scales > (1 / devicePixelRatio) do not look good. Also they are |
// not really useful as we do not have any pixel-level operations. |
- return Math.min(1 / Viewport.getDevicePixelRatio(), scaleX, scaleY); |
+ return Math.min(1 / window.devicePixelRatio, scaleX, scaleY); |
}; |
/** |
@@ -282,11 +308,6 @@ Viewport.prototype.imageToScreenRect = function(rect) { |
}; |
/** |
- * @return {number} The number of physical pixels in one CSS pixel. |
- */ |
-Viewport.getDevicePixelRatio = function() { return window.devicePixelRatio; }; |
- |
-/** |
* Convert a rectangle from screen coordinates to 'device' coordinates. |
* |
* This conversion enlarges the original rectangle devicePixelRatio times |
@@ -296,7 +317,7 @@ Viewport.getDevicePixelRatio = function() { return window.devicePixelRatio; }; |
* @return {Rect} Rectangle in device coordinates. |
*/ |
Viewport.prototype.screenToDeviceRect = function(rect) { |
- var ratio = Viewport.getDevicePixelRatio(); |
+ var ratio = window.devicePixelRatio; |
var screenCenterX = Math.round( |
this.screenBounds_.left + this.screenBounds_.width / 2); |
var screenCenterY = Math.round( |
@@ -417,3 +438,95 @@ Viewport.prototype.repaint = function() { |
for (var i = 0; i != this.repaintCallbacks_.length; i++) |
this.repaintCallbacks_[i](); |
}; |
+ |
+/** |
+ * Obtains CSS transformation for the screen image. |
+ * @return {string} Transformation description. |
+ */ |
+Viewport.prototype.getTransformation = function() { |
+ return 'scale(' + (1 / window.devicePixelRatio) + ')'; |
+}; |
+ |
+/** |
+ * Obtains shift CSS transformation for the screen image. |
+ * @param {number} dx Amount of shift. |
+ * @return {string} Transformation description. |
+ */ |
+Viewport.prototype.getShiftTransformation = function(dx) { |
+ return 'translateX(' + dx + 'px) ' + this.getTransformation(); |
+}; |
+ |
+/** |
+ * Obtains CSS transformation that makes the rotated image fit the original |
+ * image. The new rotated image that the transformation is applied to looks the |
+ * same with original image. |
+ * |
+ * @param {boolean} orientation Orientation of the rotation from the original |
+ * image to the rotated image. True is for clockwise and false is for |
+ * counterclockwise. |
+ * @return {string} Transformation description. |
+ */ |
+Viewport.prototype.getInverseTransformForRotatedImage = function(orientation) { |
+ var previousImageWidth = this.imageBounds_.height; |
+ var previousImageHeight = this.imageBounds_.width; |
+ var oldScale = this.getFittingScaleForImageSize_( |
+ previousImageWidth, previousImageHeight); |
+ var scaleRatio = oldScale / this.getScale(); |
+ var degree = orientation ? '-90deg' : '90deg'; |
+ return [ |
+ 'scale(' + scaleRatio + ')', |
+ 'rotate(' + degree + ')', |
+ this.getTransformation() |
+ ].join(' '); |
+}; |
+ |
+/** |
+ * Obtains CSS transformation that makes the cropped image fit the original |
+ * image. The new cropped image that the transformaton is applied to fits to the |
+ * the cropped rectangle in the original image. |
+ * |
+ * @param {number} imageWidth Width of the original image. |
+ * @param {number} imageHeight Height of the origianl image. |
+ * @param {Rect} imageCropRect Crop rectangle in the image's coordinate system. |
+ * @return {string} Transformation description. |
+ */ |
+Viewport.prototype.getInverseTransformForCroppedImage = |
+ function(imageWidth, imageHeight, imageCropRect) { |
+ var wholeScale = this.getFittingScaleForImageSize_( |
+ imageWidth, imageHeight); |
+ var croppedScale = this.getFittingScaleForImageSize_( |
+ imageCropRect.width, imageCropRect.height); |
+ var dx = |
+ (imageCropRect.left + imageCropRect.width / 2 - imageWidth / 2) * |
+ wholeScale; |
+ var dy = |
+ (imageCropRect.top + imageCropRect.height / 2 - imageHeight / 2) * |
+ wholeScale; |
+ return [ |
+ 'translate(' + dx + 'px,' + dy + 'px)', |
+ 'scale(' + wholeScale / croppedScale + ')', |
+ this.getTransformation() |
+ ].join(' '); |
+}; |
+ |
+/** |
+ * Obtains CSS transformaton that makes the image fit to the screen rectangle. |
+ * |
+ * @param {Rect} screenRect Screen rectangle. |
+ * @return {string} Transformation description. |
+ */ |
+Viewport.prototype.getScreenRectTransformForImage = function(screenRect) { |
+ var screenImageWidth = this.imageBounds_.width * this.getScale(); |
+ var screenImageHeight = this.imageBounds_.height * this.getScale(); |
+ var scaleX = screenRect.width / screenImageWidth; |
+ var scaleY = screenRect.height / screenImageHeight; |
+ var screenWidth = this.screenBounds_.width; |
+ var screenHeight = this.screenBounds_.height; |
+ var dx = screenRect.left + screenRect.width / 2 - screenWidth / 2; |
+ var dy = screenRect.top + screenRect.height / 2 - screenHeight / 2; |
+ return [ |
+ 'translate(' + dx + 'px,' + dy + 'px)', |
+ 'scale(' + scaleX + ',' + scaleY + ')', |
+ this.getTransformation() |
+ ].join(' '); |
+}; |