phaser/src/create/GenerateTexture.js

117 lines
3.3 KiB
JavaScript
Raw Normal View History

2018-02-12 16:01:20 +00:00
/**
* @author Richard Davey <rich@photonstorm.com>
2020-01-15 12:07:09 +00:00
* @copyright 2020 Photon Storm Ltd.
2019-05-10 15:15:04 +00:00
* @license {@link https://opensource.org/licenses/MIT|MIT License}
2018-02-12 16:01:20 +00:00
*/
var Arne16 = require('./palettes/Arne16');
2017-10-11 16:05:59 +00:00
var CanvasPool = require('../display/canvas/CanvasPool');
2018-01-25 05:11:52 +00:00
var GetValue = require('../utils/object/GetValue');
2018-01-25 05:11:52 +00:00
/**
2020-02-04 17:16:19 +00:00
* Generates a texture based on the given Create configuration object.
*
* The texture is drawn using a fixed-size indexed palette of 16 colors, where the hex value in the
* data cells map to a single color. For example, if the texture config looked like this:
*
* ```javascript
* var star = [
* '.....828.....',
* '....72227....',
* '....82228....',
* '...7222227...',
* '2222222222222',
* '8222222222228',
* '.72222222227.',
* '..787777787..',
* '..877777778..',
* '.78778887787.',
* '.27887.78872.',
* '.787.....787.'
* ];
*
* this.textures.generate('star', { data: star, pixelWidth: 4 });
* ```
*
* Then it would generate a texture that is 52 x 48 pixels in size, because each cell of the data array
* represents 1 pixel multiplied by the `pixelWidth` value. The cell values, such as `8`, maps to color
* number 8 in the palette. If a cell contains a period character `.` then it is transparent.
*
* The default palette is Arne16, but you can specify your own using the `palette` property.
2018-01-25 05:11:52 +00:00
*
* @function Phaser.Create.GenerateTexture
* @since 3.0.0
*
2020-02-04 17:16:19 +00:00
* @param {Phaser.Types.Create.GenerateTextureConfig} config - The Generate Texture Configuration object.
2018-01-25 05:11:52 +00:00
*
2020-02-04 17:16:19 +00:00
* @return {HTMLCanvasElement} An HTMLCanvasElement which contains the generated texture drawn to it.
2018-01-25 05:11:52 +00:00
*/
var GenerateTexture = function (config)
{
var data = GetValue(config, 'data', []);
var canvas = GetValue(config, 'canvas', null);
var palette = GetValue(config, 'palette', Arne16);
var pixelWidth = GetValue(config, 'pixelWidth', 1);
var pixelHeight = GetValue(config, 'pixelHeight', pixelWidth);
var resizeCanvas = GetValue(config, 'resizeCanvas', true);
var clearCanvas = GetValue(config, 'clearCanvas', true);
var preRender = GetValue(config, 'preRender', null);
var postRender = GetValue(config, 'postRender', null);
var width = Math.floor(Math.abs(data[0].length * pixelWidth));
var height = Math.floor(Math.abs(data.length * pixelHeight));
if (!canvas)
{
canvas = CanvasPool.create2D(this, width, height);
resizeCanvas = false;
clearCanvas = false;
}
if (resizeCanvas)
{
canvas.width = width;
canvas.height = height;
}
var ctx = canvas.getContext('2d');
if (clearCanvas)
{
ctx.clearRect(0, 0, width, height);
}
// preRender Callback?
if (preRender)
{
preRender(canvas, ctx);
}
// Draw it
for (var y = 0; y < data.length; y++)
{
var row = data[y];
for (var x = 0; x < row.length; x++)
{
var d = row[x];
if (d !== '.' && d !== ' ')
{
ctx.fillStyle = palette[d];
ctx.fillRect(x * pixelWidth, y * pixelHeight, pixelWidth, pixelHeight);
}
}
}
// postRender Callback?
if (postRender)
{
postRender(canvas, ctx);
}
return canvas;
};
module.exports = GenerateTexture;