2019-03-18 20:06:47 -05:00
|
|
|
const PIXI = 'undefined' !== typeof window ? require('pixi.js') : undefined;
|
|
|
|
|
|
|
|
import {Resource} from '@avocado/resource';
|
|
|
|
|
|
|
|
const baseTextureCache = {};
|
|
|
|
|
|
|
|
export class Image extends Resource {
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
super();
|
|
|
|
this.texture = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
static load(uri) {
|
|
|
|
return this.loadBaseTexture(uri).then((baseTexture) => {
|
|
|
|
const image = new Image();
|
|
|
|
image.uri = uri;
|
|
|
|
image.texture = new PIXI.Texture(baseTexture);
|
|
|
|
return image;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
static loadBaseTexture(uri) {
|
|
|
|
if (baseTextureCache[uri]) {
|
|
|
|
return Promise.resolve(baseTextureCache[uri]);
|
|
|
|
}
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
const baseTexture = PIXI.BaseTexture.fromImage(uri);
|
|
|
|
baseTexture.on('error', () => {
|
|
|
|
reject(new Error(`Couldn't load image "${uri}"`));
|
|
|
|
});
|
|
|
|
baseTexture.on('loaded', () => {
|
|
|
|
resolve(baseTextureCache[uri] = baseTexture);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
get height() {
|
|
|
|
if (!this.texture) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return this.texture.height;
|
|
|
|
}
|
|
|
|
|
|
|
|
get size() {
|
|
|
|
return [this.width, this.height];
|
|
|
|
}
|
|
|
|
|
|
|
|
get width() {
|
|
|
|
if (!this.texture) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
return this.texture.width;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|