-
-
Notifications
You must be signed in to change notification settings - Fork 4.7k
/
BaseImageResource.js
124 lines (108 loc) · 3.7 KB
/
BaseImageResource.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import { Resource } from './Resource';
import { determineCrossOrigin } from '@pixi/utils';
import { ALPHA_MODES } from '@pixi/constants';
/**
* Base for all the image/canvas resources
* @class
* @extends PIXI.resources.Resource
* @memberof PIXI.resources
*/
export class BaseImageResource extends Resource
{
/**
* @param {HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|SVGElement} source
*/
constructor(source)
{
const width = source.naturalWidth || source.videoWidth || source.width;
const height = source.naturalHeight || source.videoHeight || source.height;
super(width, height);
/**
* The source element
* @member {HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|SVGElement}
* @readonly
*/
this.source = source;
/**
* If set to `true`, will force `texImage2D` over `texSubImage2D` for uploading.
* Certain types of media (e.g. video) using `texImage2D` is more performant.
* @member {boolean}
* @default false
* @private
*/
this.noSubImage = false;
}
/**
* Set cross origin based detecting the url and the crossorigin
* @protected
* @param {HTMLElement} element - Element to apply crossOrigin
* @param {string} url - URL to check
* @param {boolean|string} [crossorigin=true] - Cross origin value to use
*/
static crossOrigin(element, url, crossorigin)
{
if (crossorigin === undefined && url.indexOf('data:') !== 0)
{
element.crossOrigin = determineCrossOrigin(url);
}
else if (crossorigin !== false)
{
element.crossOrigin = typeof crossorigin === 'string' ? crossorigin : 'anonymous';
}
}
/**
* Upload the texture to the GPU.
* @param {PIXI.Renderer} renderer Upload to the renderer
* @param {PIXI.BaseTexture} baseTexture Reference to parent texture
* @param {PIXI.GLTexture} glTexture
* @param {HTMLImageElement|HTMLCanvasElement|HTMLVideoElement|SVGElement} [source] (optional)
* @returns {boolean} true is success
*/
upload(renderer, baseTexture, glTexture, source)
{
const gl = renderer.gl;
const width = baseTexture.realWidth;
const height = baseTexture.realHeight;
source = source || this.source;
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, baseTexture.alphaMode === ALPHA_MODES.UNPACK);
if (!this.noSubImage
&& baseTexture.target === gl.TEXTURE_2D
&& glTexture.width === width
&& glTexture.height === height)
{
gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, baseTexture.format, baseTexture.type, source);
}
else
{
glTexture.width = width;
glTexture.height = height;
gl.texImage2D(baseTexture.target, 0, baseTexture.format, baseTexture.format, baseTexture.type, source);
}
return true;
}
/**
* Checks if source width/height was changed, resize can cause extra baseTexture update.
* Triggers one update in any case.
*/
update()
{
if (this.destroyed)
{
return;
}
const width = this.source.naturalWidth || this.source.videoWidth || this.source.width;
const height = this.source.naturalHeight || this.source.videoHeight || this.source.height;
this.resize(width, height);
super.update();
}
/**
* Destroy this BaseImageResource
* @override
* @param {PIXI.BaseTexture} [fromTexture] Optional base texture
* @return {boolean} Destroy was successful
*/
dispose()
{
this.source = null;
}
}