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..1cc4d9a5399c8479acbb58d83fc0afd0129977e8 100644 |
--- a/ui/file_manager/gallery/js/image_editor/viewport.js |
+++ b/ui/file_manager/gallery/js/image_editor/viewport.js |
@@ -9,9 +9,24 @@ |
* @constructor |
*/ |
function Viewport() { |
mtomasz
2014/07/10 07:26:52
IIUC, you want to add "zooming by user" and "offse
hirono
2014/07/10 08:16:06
Yes, that is my plan.
|
+ /** |
+ * 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. |
+ */ |
this.scale_ = 1; |
mtomasz
2014/07/10 07:26:52
nit: Is scale_, setScale and getFittingScale used?
hirono
2014/07/10 08:16:06
setScale uses it. getFittingScale actually does no
|
this.offsetX_ = 0; |
mtomasz
2014/07/10 07:26:52
nit: Seems that offsetX and offsetY are not used?
hirono
2014/07/10 08:16:06
This is not used so far. But will start to use soo
|
this.offsetY_ = 0; |
@@ -22,10 +37,6 @@ function Viewport() { |
this.update(); |
} |
-/* |
- * Viewport modification. |
- */ |
- |
/** |
* @param {number} width Image width. |
* @param {number} height Image height. |
@@ -86,12 +97,17 @@ 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; |
+ return this.getFittingScaleForImageSize_( |
+ this.imageBounds_.width, this.imageBounds_.height); |
+}; |
+ |
+Viewport.prototype.getFittingScaleForImageSize_ = function(width, height) { |
+ var scaleX = this.screenBounds_.width / width; |
+ var scaleY = this.screenBounds_.height / height; |
// Scales > (1 / this.getDevicePixelRatio()) 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 / devicePixelRatio, scaleX, scaleY); |
+} |
/** |
* Set the scale to fit the image into the screen. |
@@ -282,11 +298,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 +307,7 @@ Viewport.getDevicePixelRatio = function() { return window.devicePixelRatio; }; |
* @return {Rect} Rectangle in device coordinates. |
*/ |
Viewport.prototype.screenToDeviceRect = function(rect) { |
- var ratio = Viewport.getDevicePixelRatio(); |
+ var ratio = devicePixelRatio; |
var screenCenterX = Math.round( |
this.screenBounds_.left + this.screenBounds_.width / 2); |
var screenCenterY = Math.round( |
@@ -417,3 +428,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 / 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(' '); |
+}; |