Added guards around context.getImageData calls in BitmapData, Text and Canvas Tinting classes to avoid crashing restricted browsers like Epic Browser. Please understand that several Phaser features won't work correctly with this browser (thanks @Erik3000 #1714)

This commit is contained in:
photonstorm 2015-04-02 14:47:27 +01:00 committed by Clark Stevenson
parent dc5dd8276f
commit 482806b4b1
5 changed files with 60 additions and 20 deletions

View file

@ -97,6 +97,10 @@ or the minified version:
`<script src="//cdn.jsdelivr.net/phaser/2.3.0/phaser.min.js"></script>`
[cdnjs.com](https://cdnjs.com/libraries/phaser) also offers a free CDN service. They have all versions of Phaser and even the custom builds:
`<script src="https://cdnjs.cloudflare.com/ajax/libs/phaser/2.3.0/phaser.js"></script>`
### Phaser Sandbox
If you'd like to try coding in Phaser right now, with nothing more than your web browser then you can head over to the [Phaser Sandbox](http://phaser.io/sandbox). You'll find Quick Start templates and a user-friendly editor filled with handy code-completion features.
@ -244,6 +248,7 @@ Version 2.3.1 - "Katar" - in dev
### Updates
* TypeScript definitions fixes and updates (thanks @clark-stevenson @isuda)
* Added missing `resumed` method to Phaser.State class template.
### Bug Fixes
@ -251,6 +256,8 @@ Version 2.3.1 - "Katar" - in dev
* The LoadTexture component has had a redundant `dirty` call removed from it.
* TileSprites were missing a `physicsType` property, causing them to not collide with anything (thanks @numbofathma #1702)
* Sprite was missing the Health and InCamera components.
* A Tween could be incorrectly set to never end if it was given a duration of zero (thanks @hardalias #1710)
* Added guards around `context.getImageData` calls in BitmapData, Text and Canvas Tinting classes to avoid crashing restricted browsers like Epic Browser. Please understand that several Phaser features won't work correctly with this browser (thanks @Erik3000 #1714)
For changes in previous releases please see the extensive [Version History](https://github.com/photonstorm/phaser/blob/master/CHANGELOG.md).

View file

@ -64,9 +64,16 @@ Phaser.BitmapData = function (game, key, width, height) {
this.imageData = this.context.getImageData(0, 0, width, height);
/**
* @property {Uint8ClampedArray} data - A Uint8ClampedArray view into BitmapData.buffer.
* A Uint8ClampedArray view into BitmapData.buffer.
* Note that this is unavailable in some browsers (such as Epic Browser due to its security restrictions)
* @property {Uint8ClampedArray} data
*/
this.data = this.imageData.data;
this.data = null;
if (this.imageData)
{
this.data = this.imageData.data;
}
/**
* @property {Uint32Array} pixels - An Uint32Array view into BitmapData.buffer.
@ -76,21 +83,24 @@ Phaser.BitmapData = function (game, key, width, height) {
/**
* @property {ArrayBuffer} buffer - An ArrayBuffer the same size as the context ImageData.
*/
if (this.imageData.data.buffer)
if (this.data)
{
this.buffer = this.imageData.data.buffer;
this.pixels = new Uint32Array(this.buffer);
}
else
{
if (window['ArrayBuffer'])
if (this.imageData.data.buffer)
{
this.buffer = new ArrayBuffer(this.imageData.data.length);
this.buffer = this.imageData.data.buffer;
this.pixels = new Uint32Array(this.buffer);
}
else
{
this.pixels = this.imageData.data;
if (window['ArrayBuffer'])
{
this.buffer = new ArrayBuffer(this.imageData.data.length);
this.pixels = new Uint32Array(this.buffer);
}
else
{
this.pixels = this.imageData.data;
}
}
}

View file

@ -237,6 +237,11 @@ PIXI.CanvasTinter.checkInverseAlpha = function()
// Get the color values
var s1 = canvas.context.getImageData(0, 0, 1, 1);
if (s1 === null)
{
return false;
}
// Plot them to x2
canvas.context.putImageData(s1, 1, 0);

View file

@ -353,7 +353,7 @@ PIXI.Text.prototype.determineFontProperties = function(fontStyle)
{
var properties = PIXI.Text.fontPropertiesCache[fontStyle];
if(!properties)
if (!properties)
{
properties = {};
@ -380,6 +380,17 @@ PIXI.Text.prototype.determineFontProperties = function(fontStyle)
context.fillStyle = '#000';
context.fillText('|MÉq', 0, baseline);
if (!context.getImageData(0, 0, width, height))
{
properties.ascent = baseline;
properties.descent = baseline + 6;
properties.fontSize = properties.ascent + properties.descent;
PIXI.Text.fontPropertiesCache[fontStyle] = properties;
return properties;
}
var imagedata = context.getImageData(0, 0, width, height).data;
var pixels = imagedata.length;
var line = width * 4;
@ -390,17 +401,18 @@ PIXI.Text.prototype.determineFontProperties = function(fontStyle)
var stop = false;
// ascent. scan from top to bottom until we find a non red pixel
for(i = 0; i < baseline; i++)
for (i = 0; i < baseline; i++)
{
for(j = 0; j < line; j += 4)
for (j = 0; j < line; j += 4)
{
if(imagedata[idx + j] !== 255)
if (imagedata[idx + j] !== 255)
{
stop = true;
break;
}
}
if(!stop)
if (!stop)
{
idx += line;
}
@ -416,17 +428,18 @@ PIXI.Text.prototype.determineFontProperties = function(fontStyle)
stop = false;
// descent. scan from bottom to top until we find a non red pixel
for(i = height; i > baseline; i--)
for (i = height; i > baseline; i--)
{
for(j = 0; j < line; j += 4)
for (j = 0; j < line; j += 4)
{
if(imagedata[idx + j] !== 255)
if (imagedata[idx + j] !== 255)
{
stop = true;
break;
}
}
if(!stop)
if (!stop)
{
idx -= line;
}

View file

@ -49,6 +49,11 @@ PIXI.canUseNewCanvasBlendModes = function()
context.drawImage(magenta, 0, 0);
context.drawImage(yellow, 2, 0);
if (!context.getImageData(2,0,1,1))
{
return false;
}
var data = context.getImageData(2,0,1,1).data;
return (data[0] === 255 && data[1] === 0 && data[2] === 0);