ImageBitmapLoader.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. /**
  2. * @author thespite / http://clicktorelease.com/
  3. */
  4. function detectCreateImageBitmap() {
  5. var url = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==';
  6. return new Promise(function (resolve, reject) {
  7. if (!('createImageBitmap' in window)) {
  8. reject();
  9. return;
  10. }
  11. fetch(url).then(function (res) {
  12. return res.blob();
  13. }).then(function (blob) {
  14. Promise.all([
  15. createImageBitmap(blob, { imageOrientation: "none", premultiplyAlpha: "none" }),
  16. createImageBitmap(blob, { imageOrientation: "flipY", premultiplyAlpha: "none" }),
  17. createImageBitmap(blob, { imageOrientation: "none", premultiplyAlpha: "premultiply" }),
  18. createImageBitmap(blob, { imageOrientation: "flipY", premultiplyAlpha: "premultiply" })
  19. ]).then(function (res) {
  20. resolve();
  21. }).catch(function (e) {
  22. reject();
  23. });
  24. });
  25. });
  26. }
  27. var canUseImageBitmap = detectCreateImageBitmap();
  28. canUseImageBitmap
  29. .then( function( res ) {
  30. console.log( 'createImageBitmap supported' );
  31. })
  32. .catch( function( res ) {
  33. console.log( 'createImageBitmap not supported' );
  34. });
  35. THREE.ImageBitmapLoader = function (manager) {
  36. this.manager = manager !== undefined ? manager : THREE.DefaultLoadingManager;
  37. this.options = {};
  38. };
  39. THREE.ImageBitmapLoader.prototype = {
  40. constructor: THREE.ImageBitmapLoader,
  41. setOptions: function setOptions(options) {
  42. this.options = options;
  43. return this;
  44. },
  45. load: function load(url, onLoad, onProgress, onError) {
  46. if (url === undefined) url = '';
  47. if (this.path !== undefined) url = this.path + url;
  48. var scope = this;
  49. var cached = THREE.Cache.get(url);
  50. if (cached !== undefined) {
  51. scope.manager.itemStart(url);
  52. setTimeout(function () {
  53. if (onLoad) onLoad(cached);
  54. scope.manager.itemEnd(url);
  55. }, 0);
  56. return cached;
  57. }
  58. fetch(url).then(function (res) {
  59. return res.blob();
  60. }).then(function (res) {
  61. return createImageBitmap(res, scope.options);
  62. }).then(function (res) {
  63. THREE.Cache.add(url, res);
  64. if (onLoad) onLoad(res);
  65. scope.manager.itemEnd(url);
  66. }).catch(function (e) {
  67. if (onError) onError(e);
  68. scope.manager.itemEnd(url);
  69. scope.manager.itemError(url);
  70. });
  71. }
  72. };