Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(189)

Unified Diff: ui/file_manager/gallery/js/image_editor/viewport.js

Issue 398283002: Gallery: Add the offset feature in the slide mode. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 5f63d1b8c5bfa999300c67fc4b93fd883331622f..cbe5ed585dc46e490bf9eed9e4cb81ac6c203a9f 100644
--- a/ui/file_manager/gallery/js/image_editor/viewport.js
+++ b/ui/file_manager/gallery/js/image_editor/viewport.js
@@ -86,7 +86,7 @@ function Viewport() {
*/
this.generation_ = 0;
- this.update();
+ this.update_();
Object.seal(this);
}
@@ -112,8 +112,7 @@ Viewport.ZOOM_RATIOS = Object.freeze({
*/
Viewport.prototype.setImageSize = function(width, height) {
this.imageBounds_ = new Rect(width, height);
- this.update();
- this.invalidateCaches();
+ this.update_();
};
/**
@@ -122,8 +121,7 @@ Viewport.prototype.setImageSize = function(width, height) {
*/
Viewport.prototype.setScreenSize = function(width, height) {
this.screenBounds_ = new Rect(width, height);
- this.update();
- this.invalidateCaches();
+ this.update_();
};
/**
@@ -136,7 +134,7 @@ Viewport.prototype.setZoomIndex = function(zoomIndex) {
return;
this.zoomIndex_ = zoomIndex;
this.zoom_ = Viewport.ZOOM_RATIOS[zoomIndex];
- this.update();
+ this.update_();
};
/**
@@ -148,30 +146,6 @@ Viewport.prototype.getZoomIndex = function() {
};
/**
- * @return {number} Scale.
- */
-Viewport.prototype.getScale = function() { return this.scale_; };
-
-/**
- * @param {number} scale The new scale.
- */
-Viewport.prototype.setScale = function(scale) {
- if (this.scale_ == scale)
- return;
- this.scale_ = scale;
- this.update();
- this.invalidateCaches();
-};
-
-/**
- * @return {number} Best scale to fit the current image into the current screen.
- */
-Viewport.prototype.getFittingScale = function() {
- 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.
@@ -188,13 +162,6 @@ Viewport.prototype.getFittingScaleForImageSize_ = function(width, height) {
};
/**
- * Set the scale to fit the image into the screen.
- */
-Viewport.prototype.fitImage = function() {
- this.setScale(this.getFittingScale());
-};
-
-/**
* @return {number} X-offset of the viewport.
*/
Viewport.prototype.getOffsetX = function() { return this.offsetX_; };
@@ -208,17 +175,13 @@ Viewport.prototype.getOffsetY = function() { return this.offsetY_; };
* Set the image offset in the viewport.
* @param {number} x X-offset.
* @param {number} y Y-offset.
- * @param {boolean} ignoreClipping True if no clipping should be applied.
*/
-Viewport.prototype.setOffset = function(x, y, ignoreClipping) {
- if (!ignoreClipping) {
- x = this.clampOffsetX_(x);
- y = this.clampOffsetY_(y);
- }
- if (this.offsetX_ == x && this.offsetY_ == y) return;
+Viewport.prototype.setOffset = function(x, y) {
+ if (this.offsetX_ == x && this.offsetY_ == y)
+ return;
this.offsetX_ = x;
this.offsetY_ = y;
- this.invalidateCaches();
+ this.update_();
};
/**
@@ -250,11 +213,6 @@ Viewport.prototype.getDeviceBounds = function() {
Viewport.prototype.getCacheGeneration = function() { return this.generation_; };
/**
- * Called on event view port state change.
- */
-Viewport.prototype.invalidateCaches = function() { this.generation_++; };
-
-/**
* @return {Rect} The image bounds in screen coordinates.
*/
Viewport.prototype.getImageBoundsOnScreen = function() {
@@ -283,7 +241,7 @@ Viewport.prototype.getImageBoundsOnScreenClipped = function() {
* @return {number} Size in image coordinates.
*/
Viewport.prototype.screenToImageSize = function(size) {
- return size / this.getScale();
+ return size / this.scale_;
};
/**
@@ -291,7 +249,7 @@ Viewport.prototype.screenToImageSize = function(size) {
* @return {number} X in image coordinates.
*/
Viewport.prototype.screenToImageX = function(x) {
- return Math.round((x - this.imageBoundsOnScreen_.left) / this.getScale());
+ return Math.round((x - this.imageBoundsOnScreen_.left) / this.scale_);
};
/**
@@ -299,7 +257,7 @@ Viewport.prototype.screenToImageX = function(x) {
* @return {number} Y in image coordinates.
*/
Viewport.prototype.screenToImageY = function(y) {
- return Math.round((y - this.imageBoundsOnScreen_.top) / this.getScale());
+ return Math.round((y - this.imageBoundsOnScreen_.top) / this.scale_);
};
/**
@@ -319,7 +277,7 @@ Viewport.prototype.screenToImageRect = function(rect) {
* @return {number} Size in screen coordinates.
*/
Viewport.prototype.imageToScreenSize = function(size) {
- return size * this.getScale();
+ return size * this.scale_;
};
/**
@@ -327,7 +285,7 @@ Viewport.prototype.imageToScreenSize = function(size) {
* @return {number} X in screen coordinates.
*/
Viewport.prototype.imageToScreenX = function(x) {
- return Math.round(this.imageBoundsOnScreen_.left + x * this.getScale());
+ return Math.round(this.imageBoundsOnScreen_.left + x * this.scale_);
};
/**
@@ -335,7 +293,7 @@ Viewport.prototype.imageToScreenX = function(x) {
* @return {number} Y in screen coordinates.
*/
Viewport.prototype.imageToScreenY = function(y) {
- return Math.round(this.imageBoundsOnScreen_.top + y * this.getScale());
+ return Math.round(this.imageBoundsOnScreen_.top + y * this.scale_);
};
/**
@@ -383,7 +341,7 @@ Viewport.prototype.getMarginY_ = function() {
* @private
*/
Viewport.prototype.clampOffsetX_ = function(x) {
- var limit = Math.round(Math.max(0, -this.getMarginX_() / this.getScale()));
+ var limit = Math.round(Math.max(0, -this.getMarginX_() / this.scale_));
return ImageUtil.clamp(-limit, x, limit);
};
@@ -393,7 +351,7 @@ Viewport.prototype.clampOffsetX_ = function(x) {
* @private
*/
Viewport.prototype.clampOffsetY_ = function(y) {
- var limit = Math.round(Math.max(0, -this.getMarginY_() / this.getScale()));
+ var limit = Math.round(Math.max(0, -this.getMarginY_() / this.scale_));
return ImageUtil.clamp(-limit, y, limit);
};
@@ -410,24 +368,49 @@ Viewport.prototype.getCenteredRect_ = function(
};
/**
+ * Resets zoom and offset.
+ */
+Viewport.prototype.resetView = function() {
+ this.zoomIndex_ = 0;
+ this.zoom_ = 1;
+ this.offsetX_ = 0;
+ this.offsetY_ = 0;
+ this.update_();
+};
+
+/**
* Recalculate the viewport parameters.
+ * @private
*/
-Viewport.prototype.update = function() {
- var scale = this.getScale();
+Viewport.prototype.update_ = function() {
+ // Update scale.
+ this.scale_ = this.getFittingScaleForImageSize_(
+ this.imageBounds_.width, this.imageBounds_.height);
+
+ // Limit offset values.
+ var zoomedWidht = ~~(this.imageBounds_.width * this.scale_ * this.zoom_);
+ var zoomedHeight = ~~(this.imageBounds_.height * this.scale_ * this.zoom_);
+ var dx = Math.max(zoomedWidht - this.screenBounds_.width, 0) / 2;
+ var dy = Math.max(zoomedHeight - this.screenBounds_.height, 0) /2;
+ this.offsetX_ = ImageUtil.clamp(-dx, this.offsetX_, dx);
+ this.offsetY_ = ImageUtil.clamp(-dy, this.offsetY_, dy);
// Image bounds on screen.
this.imageBoundsOnScreen_ = this.getCenteredRect_(
- ~~(this.imageBounds_.width * scale * this.zoom_),
- ~~(this.imageBounds_.height * scale * this.zoom_),
- this.offsetX_,
- this.offsetY_);
+ zoomedWidht, zoomedHeight, this.offsetX_, this.offsetY_);
// Image bounds of element (that is not applied zoom and offset) on screen.
+ var oldBounds = this.imageElementBoundsOnScreen_;
this.imageElementBoundsOnScreen_ = this.getCenteredRect_(
- ~~(this.imageBounds_.width * scale),
- ~~(this.imageBounds_.height * scale),
+ ~~(this.imageBounds_.width * this.scale_),
+ ~~(this.imageBounds_.height * this.scale_),
0,
0);
+ if (!oldBounds ||
+ this.imageElementBoundsOnScreen_.width != oldBounds.width ||
+ this.imageElementBoundsOnScreen_.height != oldBounds.height) {
+ this.generation_++;
+ }
// Image bounds on screen cliped with the screen bounds.
var left = Math.max(this.imageBoundsOnScreen_.left, 0);
@@ -445,7 +428,8 @@ Viewport.prototype.update = function() {
* @return {string} Transformation description.
*/
Viewport.prototype.getTransformation = function() {
- return 'scale(' + (1 / window.devicePixelRatio * this.zoom_) + ')';
+ return 'translate(' + this.offsetX_ + 'px, ' + this.offsetY_ + 'px) ' +
+ 'scale(' + (1 / window.devicePixelRatio * this.zoom_) + ')';
};
/**
@@ -472,7 +456,7 @@ Viewport.prototype.getInverseTransformForRotatedImage = function(orientation) {
var previousImageHeight = this.imageBounds_.width;
var oldScale = this.getFittingScaleForImageSize_(
previousImageWidth, previousImageHeight);
- var scaleRatio = oldScale / this.getScale();
+ var scaleRatio = oldScale / this.scale_;
var degree = orientation ? '-90deg' : '90deg';
return [
'scale(' + scaleRatio + ')',

Powered by Google App Engine
This is Rietveld 408576698