Skip to content

Commit e620f3e

Browse files
committed
Updated to use matrix and support crop
1 parent 6483cda commit e620f3e

1 file changed

Lines changed: 122 additions & 10 deletions

File tree

src/renderer/canvas/utils/DrawImage.js

Lines changed: 122 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
55
*/
66

7+
var TransformMatrix = require('../../../gameobjects/components/TransformMatrix');
8+
9+
var _tempCameraMatrix = new TransformMatrix();
10+
var _tempSpriteMatrix = new TransformMatrix();
11+
712
/**
813
* [description]
914
*
@@ -12,13 +17,11 @@
1217
*
1318
* @param {Phaser.GameObjects.GameObject} src - [description]
1419
* @param {Phaser.Cameras.Scene2D.Camera} camera - [description]
15-
* @param {Phaser.GameObjects.Components.TransformMatrix} parentMatrix - [description]
20+
* @param {Phaser.GameObjects.Components.TransformMatrix} parentTransformMatrix - [description]
1621
*/
17-
var DrawImage = function (src, camera, parentMatrix)
22+
var DrawImage = function (src, camera, parentTransformMatrix)
1823
{
1924
var ctx = this.currentContext;
20-
var frame = src.frame;
21-
var cd = frame.canvasData;
2225

2326
// Alpha
2427

@@ -42,13 +45,123 @@ var DrawImage = function (src, camera, parentMatrix)
4245

4346
// Smoothing
4447

45-
if (this.currentScaleMode !== src.scaleMode)
48+
// if (this.currentScaleMode !== src.scaleMode)
49+
// {
50+
// this.currentScaleMode = src.scaleMode;
51+
// ctx[this.smoothProperty] = (source.scaleMode === ScaleModes.LINEAR);
52+
// }
53+
54+
var camMatrix = _tempCameraMatrix;
55+
var spriteMatrix = _tempSpriteMatrix;
56+
57+
spriteMatrix.applyITRS(src.x - camera.scrollX * src.scrollFactorX, src.y - camera.scrollY * src.scrollFactorY, src.rotation, src.scaleX, src.scaleY);
58+
59+
var frame = src.frame;
60+
var frameX = frame.x;
61+
var frameY = frame.y;
62+
var frameWidth = frame.width;
63+
var frameHeight = frame.height;
64+
65+
var x = -src.displayOriginX + frameX;
66+
var y = -src.displayOriginY + frameY;
67+
68+
var fx = 1;
69+
var fy = 1;
70+
71+
if (src.isCropped)
4672
{
47-
this.currentScaleMode = src.scaleMode;
73+
var crop = src._crop;
4874

49-
// ctx[this.smoothProperty] = (source.scaleMode === ScaleModes.LINEAR);
75+
if (crop.flipX !== src.flipX || crop.flipY !== src.flipY)
76+
{
77+
frame.updateCropUVs(crop, src.flipX, src.flipY);
78+
}
79+
80+
frameWidth = crop.width;
81+
frameHeight = crop.height;
82+
83+
frameX = crop.x;
84+
frameY = crop.y;
85+
86+
x = -src.displayOriginX + frameX;
87+
y = -src.displayOriginY + frameY;
88+
}
89+
90+
if (src.flipX)
91+
{
92+
fx = -1;
93+
}
94+
95+
if (src.flipY)
96+
{
97+
fy = -1;
5098
}
5199

100+
camMatrix.copyFrom(camera.matrix);
101+
102+
var calcMatrix;
103+
104+
if (parentTransformMatrix)
105+
{
106+
// Multiply the camera by the parent matrix
107+
camMatrix.multiplyWithOffset(parentTransformMatrix, -camera.scrollX * src.scrollFactorX, -camera.scrollY * src.scrollFactorY);
108+
109+
// Undo the camera scroll
110+
spriteMatrix.e = src.x;
111+
spriteMatrix.f = src.y;
112+
113+
// Multiply by the Sprite matrix
114+
calcMatrix = camMatrix.multiply(spriteMatrix);
115+
}
116+
else
117+
{
118+
calcMatrix = spriteMatrix.multiply(camMatrix);
119+
}
120+
121+
ctx.save();
122+
123+
ctx.transform(calcMatrix.a, calcMatrix.b, calcMatrix.c, calcMatrix.d, calcMatrix.e, calcMatrix.f);
124+
125+
ctx.scale(fx, fy);
126+
127+
if (src.isCropped)
128+
{
129+
if (src.flipX)
130+
{
131+
if (x >= 0)
132+
{
133+
x = -(x + crop.cw);
134+
}
135+
else if (x < 0)
136+
{
137+
x = (Math.abs(x) - crop.cw);
138+
}
139+
}
140+
141+
if (src.flipY)
142+
{
143+
if (y >= 0)
144+
{
145+
y = -(y + crop.ch);
146+
}
147+
else if (y < 0)
148+
{
149+
y = (Math.abs(y) - crop.ch);
150+
}
151+
}
152+
153+
ctx.drawImage(frame.source.image, crop.cx, crop.cy, crop.cw, crop.ch, x, y, crop.cw, crop.ch);
154+
}
155+
else
156+
{
157+
var cd = frame.canvasData;
158+
159+
ctx.drawImage(frame.source.image, cd.x, cd.y, frameWidth, frameHeight, x, y, frameWidth, frameHeight);
160+
}
161+
162+
ctx.restore();
163+
164+
/*
52165
var dx = frame.x;
53166
var dy = frame.y;
54167
@@ -104,10 +217,8 @@ var DrawImage = function (src, camera, parentMatrix)
104217
ctx.scale(src.scaleX, src.scaleY);
105218
ctx.scale(fx, fy);
106219
107-
if (src.isCropped)
220+
if (crop)
108221
{
109-
var crop = src._crop;
110-
111222
ctx.drawImage(frame.source.image, crop.cx, crop.cy, crop.width, crop.height, crop.x + dx, crop.y + dy, crop.width, crop.height);
112223
}
113224
else
@@ -116,6 +227,7 @@ var DrawImage = function (src, camera, parentMatrix)
116227
}
117228
118229
ctx.restore();
230+
*/
119231
};
120232

121233
module.exports = DrawImage;

0 commit comments

Comments
 (0)