| /**
 * Conversions.js
 *
 * Released under LGPL License.
 * Copyright (c) 1999-2015 Ephox Corp. All rights reserved
 *
 * License: http://www.tinymce.com/license
 * Contributing: http://www.tinymce.com/contributing
 */
/**
 * Converts blob/uris/images back and forth.
 */
define("tinymce/imagetoolsplugin/Conversions", [
	"tinymce/util/Promise",
	"tinymce/imagetoolsplugin/Canvas",
	"tinymce/imagetoolsplugin/Mime",
	"tinymce/imagetoolsplugin/ImageSize"
], function(Promise, Canvas, Mime, ImageSize) {
	function loadImage(image) {
		return new Promise(function(resolve) {
			function loaded() {
				image.removeEventListener('load', loaded);
				resolve(image);
			}
			if (image.complete) {
				resolve(image);
			} else {
				image.addEventListener('load', loaded);
			}
		});
	}
	function imageToCanvas(image) {
		return loadImage(image).then(function(image) {
			var context, canvas;
			canvas = Canvas.create(ImageSize.getWidth(image), ImageSize.getHeight(image));
			context = Canvas.get2dContext(canvas);
			context.drawImage(image, 0, 0);
			return canvas;
		});
	}
	function imageToBlob(image) {
		return loadImage(image).then(function(image) {
			var src = image.src;
			if (src.indexOf('blob:') === 0) {
				return blobUriToBlob(src);
			}
			if (src.indexOf('data:') === 0) {
				return dataUriToBlob(src);
			}
			return imageToCanvas(image).then(function(canvas) {
				return dataUriToBlob(canvas.toDataURL(Mime.guessMimeType(src)));
			});
		});
	}
	function blobToImage(blob) {
		return new Promise(function(resolve) {
			var image = new Image();
			function loaded() {
				image.removeEventListener('load', loaded);
				resolve(image);
			}
			image.addEventListener('load', loaded);
			image.src = URL.createObjectURL(blob);
			if (image.complete) {
				loaded();
			}
		});
	}
	function blobUriToBlob(url) {
		return new Promise(function(resolve) {
			var xhr = new XMLHttpRequest();
			xhr.open('GET', url, true);
			xhr.responseType = 'blob';
			xhr.onload = function() {
				if (this.status == 200) {
					resolve(this.response);
				}
			};
			xhr.send();
		});
	}
	function dataUriToBlob(uri) {
		return new Promise(function(resolve) {
			var str, arr, i, matches, type, blobBuilder;
			uri = uri.split(',');
			matches = /data:([^;]+)/.exec(uri[0]);
			if (matches) {
				type = matches[1];
			}
			str = atob(uri[1]);
			if (window.WebKitBlobBuilder) {
				/*globals WebKitBlobBuilder:false */
				blobBuilder = new WebKitBlobBuilder();
				arr = new ArrayBuffer(str.length);
				for (i = 0; i < arr.length; i++) {
					arr[i] = str.charCodeAt(i);
				}
				blobBuilder.append(arr);
				resolve(blobBuilder.getBlob(type));
				return;
			}
			arr = new Uint8Array(str.length);
			for (i = 0; i < arr.length; i++) {
				arr[i] = str.charCodeAt(i);
			}
			resolve(new Blob([arr], {type: type}));
		});
	}
	function uriToBlob(url) {
		if (url.indexOf('blob:') === 0) {
			return blobUriToBlob(url);
		}
		if (url.indexOf('data:') === 0) {
			return dataUriToBlob(url);
		}
		return null;
	}
	function canvasToBlob(canvas, type) {
		return dataUriToBlob(canvas.toDataURL(type));
	}
	function blobToDataUri(blob) {
		return new Promise(function(resolve) {
			var reader = new FileReader();
			reader.onloadend = function() {
				resolve(reader.result);
			};
			reader.readAsDataURL(blob);
		});
	}
	function blobToBase64(blob) {
		return blobToDataUri(blob).then(function(dataUri) {
			return dataUri.split(',')[1];
		});
	}
	function revokeImageUrl(image) {
		URL.revokeObjectURL(image.src);
	}
	return {
		blobToImage: blobToImage,
		imageToBlob: imageToBlob,
		uriToBlob: uriToBlob,
		blobToDataUri: blobToDataUri,
		blobToBase64: blobToBase64,
		imageToCanvas: imageToCanvas,
		canvasToBlob: canvasToBlob,
		revokeImageUrl: revokeImageUrl
	};
});
 |