mirror of
https://github.com/owncloudarchive/contacts.git
synced 2025-01-20 09:52:17 +01:00
8c3d7ccdba
Remove old combobox user bower for onfontresize Add jcrop + md5 Add files to scrutinizer ignore list Remove misplaced text Selected the right MultiSelect library via bower Move bower dependencies to correct location
182 lines
5.8 KiB
JavaScript
182 lines
5.8 KiB
JavaScript
/*
|
|
* JavaScript Load Image iOS scaling fixes 1.0.3
|
|
* https://github.com/blueimp/JavaScript-Load-Image
|
|
*
|
|
* Copyright 2013, Sebastian Tschan
|
|
* https://blueimp.net
|
|
*
|
|
* iOS image scaling fixes based on
|
|
* https://github.com/stomita/ios-imagefile-megapixel
|
|
*
|
|
* Licensed under the MIT license:
|
|
* http://www.opensource.org/licenses/MIT
|
|
*/
|
|
|
|
/*jslint nomen: true, bitwise: true */
|
|
/*global define, window, document */
|
|
|
|
(function (factory) {
|
|
'use strict';
|
|
if (typeof define === 'function' && define.amd) {
|
|
// Register as an anonymous AMD module:
|
|
define(['load-image'], factory);
|
|
} else {
|
|
// Browser globals:
|
|
factory(window.loadImage);
|
|
}
|
|
}(function (loadImage) {
|
|
'use strict';
|
|
|
|
// Only apply fixes on the iOS platform:
|
|
if (!window.navigator || !window.navigator.platform ||
|
|
!(/iP(hone|od|ad)/).test(window.navigator.platform)) {
|
|
return;
|
|
}
|
|
|
|
var originalRenderMethod = loadImage.renderImageToCanvas;
|
|
|
|
// Detects subsampling in JPEG images:
|
|
loadImage.detectSubsampling = function (img) {
|
|
var canvas,
|
|
context;
|
|
if (img.width * img.height > 1024 * 1024) { // only consider mexapixel images
|
|
canvas = document.createElement('canvas');
|
|
canvas.width = canvas.height = 1;
|
|
context = canvas.getContext('2d');
|
|
context.drawImage(img, -img.width + 1, 0);
|
|
// subsampled image becomes half smaller in rendering size.
|
|
// check alpha channel value to confirm image is covering edge pixel or not.
|
|
// if alpha value is 0 image is not covering, hence subsampled.
|
|
return context.getImageData(0, 0, 1, 1).data[3] === 0;
|
|
}
|
|
return false;
|
|
};
|
|
|
|
// Detects vertical squash in JPEG images:
|
|
loadImage.detectVerticalSquash = function (img, subsampled) {
|
|
var naturalHeight = img.naturalHeight || img.height,
|
|
canvas = document.createElement('canvas'),
|
|
context = canvas.getContext('2d'),
|
|
data,
|
|
sy,
|
|
ey,
|
|
py,
|
|
alpha;
|
|
if (subsampled) {
|
|
naturalHeight /= 2;
|
|
}
|
|
canvas.width = 1;
|
|
canvas.height = naturalHeight;
|
|
context.drawImage(img, 0, 0);
|
|
data = context.getImageData(0, 0, 1, naturalHeight).data;
|
|
// search image edge pixel position in case it is squashed vertically:
|
|
sy = 0;
|
|
ey = naturalHeight;
|
|
py = naturalHeight;
|
|
while (py > sy) {
|
|
alpha = data[(py - 1) * 4 + 3];
|
|
if (alpha === 0) {
|
|
ey = py;
|
|
} else {
|
|
sy = py;
|
|
}
|
|
py = (ey + sy) >> 1;
|
|
}
|
|
return (py / naturalHeight) || 1;
|
|
};
|
|
|
|
// Renders image to canvas while working around iOS image scaling bugs:
|
|
// https://github.com/blueimp/JavaScript-Load-Image/issues/13
|
|
loadImage.renderImageToCanvas = function (
|
|
canvas,
|
|
img,
|
|
sourceX,
|
|
sourceY,
|
|
sourceWidth,
|
|
sourceHeight,
|
|
destX,
|
|
destY,
|
|
destWidth,
|
|
destHeight
|
|
) {
|
|
if (img._type === 'image/jpeg') {
|
|
var context = canvas.getContext('2d'),
|
|
tmpCanvas = document.createElement('canvas'),
|
|
tileSize = 1024,
|
|
tmpContext = tmpCanvas.getContext('2d'),
|
|
subsampled,
|
|
vertSquashRatio,
|
|
tileX,
|
|
tileY;
|
|
tmpCanvas.width = tileSize;
|
|
tmpCanvas.height = tileSize;
|
|
context.save();
|
|
subsampled = loadImage.detectSubsampling(img);
|
|
if (subsampled) {
|
|
sourceX /= 2;
|
|
sourceY /= 2;
|
|
sourceWidth /= 2;
|
|
sourceHeight /= 2;
|
|
}
|
|
vertSquashRatio = loadImage.detectVerticalSquash(img, subsampled);
|
|
if (subsampled || vertSquashRatio !== 1) {
|
|
sourceY *= vertSquashRatio;
|
|
destWidth = Math.ceil(tileSize * destWidth / sourceWidth);
|
|
destHeight = Math.ceil(
|
|
tileSize * destHeight / sourceHeight / vertSquashRatio
|
|
);
|
|
destY = 0;
|
|
tileY = 0;
|
|
while (tileY < sourceHeight) {
|
|
destX = 0;
|
|
tileX = 0;
|
|
while (tileX < sourceWidth) {
|
|
tmpContext.clearRect(0, 0, tileSize, tileSize);
|
|
tmpContext.drawImage(
|
|
img,
|
|
sourceX,
|
|
sourceY,
|
|
sourceWidth,
|
|
sourceHeight,
|
|
-tileX,
|
|
-tileY,
|
|
sourceWidth,
|
|
sourceHeight
|
|
);
|
|
context.drawImage(
|
|
tmpCanvas,
|
|
0,
|
|
0,
|
|
tileSize,
|
|
tileSize,
|
|
destX,
|
|
destY,
|
|
destWidth,
|
|
destHeight
|
|
);
|
|
tileX += tileSize;
|
|
destX += destWidth;
|
|
}
|
|
tileY += tileSize;
|
|
destY += destHeight;
|
|
}
|
|
context.restore();
|
|
return canvas;
|
|
}
|
|
}
|
|
return originalRenderMethod(
|
|
canvas,
|
|
img,
|
|
sourceX,
|
|
sourceY,
|
|
sourceWidth,
|
|
sourceHeight,
|
|
destX,
|
|
destY,
|
|
destWidth,
|
|
destHeight
|
|
);
|
|
};
|
|
|
|
}));
|