mirror of
https://github.com/logsol/chuck.js.git
synced 2026-05-11 10:37:34 +00:00
345 lines
11 KiB
JavaScript
345 lines
11 KiB
JavaScript
/**
|
|
* @author Mat Groves http://matgroves.com/ @Doormat23
|
|
*/
|
|
|
|
/**
|
|
* The CanvasRenderer draws the Stage and all its content onto a 2d canvas. This renderer should be used for browsers that do not support webGL.
|
|
* Don't forget to add the CanvasRenderer.view to your DOM or you will not see anything :)
|
|
*
|
|
* @class CanvasRenderer
|
|
* @constructor
|
|
* @param [width=800] {Number} the width of the canvas view
|
|
* @param [height=600] {Number} the height of the canvas view
|
|
* @param [options] {Object} The optional renderer parameters
|
|
* @param [options.view] {HTMLCanvasElement} the canvas to use as a view, optional
|
|
* @param [options.transparent=false] {Boolean} If the render view is transparent, default false
|
|
* @param [options.autoResize=false] {Boolean} If the render view is automatically resized, default false
|
|
* @param [options.resolution=1] {Number} the resolution of the renderer retina would be 2
|
|
* @param [options.clearBeforeRender=true] {Boolean} This sets if the CanvasRenderer will clear the canvas or not before the new render pass.
|
|
*/
|
|
PIXI.CanvasRenderer = function(width, height, options)
|
|
{
|
|
if(options)
|
|
{
|
|
for (var i in PIXI.defaultRenderOptions)
|
|
{
|
|
if (typeof options[i] === "undefined") options[i] = PIXI.defaultRenderOptions[i];
|
|
}
|
|
}
|
|
else
|
|
{
|
|
options = PIXI.defaultRenderOptions;
|
|
}
|
|
|
|
if(!PIXI.defaultRenderer)
|
|
{
|
|
PIXI.sayHello("Canvas");
|
|
PIXI.defaultRenderer = this;
|
|
}
|
|
|
|
/**
|
|
* The renderer type.
|
|
*
|
|
* @property type
|
|
* @type Number
|
|
*/
|
|
this.type = PIXI.CANVAS_RENDERER;
|
|
|
|
/**
|
|
* The resolution of the canvas.
|
|
*
|
|
* @property resolution
|
|
* @type Number
|
|
*/
|
|
this.resolution = options.resolution;
|
|
|
|
/**
|
|
* This sets if the CanvasRenderer will clear the canvas or not before the new render pass.
|
|
* If the Stage is NOT transparent Pixi will use a canvas sized fillRect operation every frame to set the canvas background color.
|
|
* If the Stage is transparent Pixi will use clearRect to clear the canvas every frame.
|
|
* Disable this by setting this to false. For example if your game has a canvas filling background image you often don't need this set.
|
|
*
|
|
* @property clearBeforeRender
|
|
* @type Boolean
|
|
* @default
|
|
*/
|
|
this.clearBeforeRender = options.clearBeforeRender;
|
|
|
|
/**
|
|
* Whether the render view is transparent
|
|
*
|
|
* @property transparent
|
|
* @type Boolean
|
|
*/
|
|
this.transparent = options.transparent;
|
|
|
|
/**
|
|
* Whether the render view should be resized automatically
|
|
*
|
|
* @property autoResize
|
|
* @type Boolean
|
|
*/
|
|
this.autoResize = options.autoResize || false;
|
|
|
|
|
|
/**
|
|
* The width of the canvas view
|
|
*
|
|
* @property width
|
|
* @type Number
|
|
* @default 800
|
|
*/
|
|
this.width = width || 800;
|
|
|
|
/**
|
|
* The height of the canvas view
|
|
*
|
|
* @property height
|
|
* @type Number
|
|
* @default 600
|
|
*/
|
|
this.height = height || 600;
|
|
|
|
this.width *= this.resolution;
|
|
this.height *= this.resolution;
|
|
|
|
/**
|
|
* The canvas element that everything is drawn to.
|
|
*
|
|
* @property view
|
|
* @type HTMLCanvasElement
|
|
*/
|
|
this.view = options.view || document.createElement( "canvas" );
|
|
|
|
/**
|
|
* The canvas 2d context that everything is drawn with
|
|
* @property context
|
|
* @type CanvasRenderingContext2D
|
|
*/
|
|
this.context = this.view.getContext( "2d", { alpha: this.transparent } );
|
|
|
|
/**
|
|
* Boolean flag controlling canvas refresh.
|
|
*
|
|
* @property refresh
|
|
* @type Boolean
|
|
*/
|
|
this.refresh = true;
|
|
|
|
this.view.width = this.width * this.resolution;
|
|
this.view.height = this.height * this.resolution;
|
|
|
|
/**
|
|
* Internal var.
|
|
*
|
|
* @property count
|
|
* @type Number
|
|
*/
|
|
this.count = 0;
|
|
|
|
/**
|
|
* Instance of a PIXI.CanvasMaskManager, handles masking when using the canvas renderer
|
|
* @property CanvasMaskManager
|
|
* @type CanvasMaskManager
|
|
*/
|
|
this.maskManager = new PIXI.CanvasMaskManager();
|
|
|
|
/**
|
|
* The render session is just a bunch of parameter used for rendering
|
|
* @property renderSession
|
|
* @type Object
|
|
*/
|
|
this.renderSession = {
|
|
context: this.context,
|
|
maskManager: this.maskManager,
|
|
scaleMode: null,
|
|
smoothProperty: null,
|
|
/**
|
|
* If true Pixi will Math.floor() x/y values when rendering, stopping pixel interpolation.
|
|
* Handy for crisp pixel art and speed on legacy devices.
|
|
*
|
|
*/
|
|
roundPixels: false
|
|
};
|
|
|
|
this.mapBlendModes();
|
|
|
|
this.resize(width, height);
|
|
|
|
if("imageSmoothingEnabled" in this.context)
|
|
this.renderSession.smoothProperty = "imageSmoothingEnabled";
|
|
else if("webkitImageSmoothingEnabled" in this.context)
|
|
this.renderSession.smoothProperty = "webkitImageSmoothingEnabled";
|
|
else if("mozImageSmoothingEnabled" in this.context)
|
|
this.renderSession.smoothProperty = "mozImageSmoothingEnabled";
|
|
else if("oImageSmoothingEnabled" in this.context)
|
|
this.renderSession.smoothProperty = "oImageSmoothingEnabled";
|
|
else if ("msImageSmoothingEnabled" in this.context)
|
|
this.renderSession.smoothProperty = "msImageSmoothingEnabled";
|
|
};
|
|
|
|
// constructor
|
|
PIXI.CanvasRenderer.prototype.constructor = PIXI.CanvasRenderer;
|
|
|
|
/**
|
|
* Renders the Stage to this canvas view
|
|
*
|
|
* @method render
|
|
* @param stage {Stage} the Stage element to be rendered
|
|
*/
|
|
PIXI.CanvasRenderer.prototype.render = function(stage)
|
|
{
|
|
stage.updateTransform();
|
|
|
|
this.context.setTransform(1,0,0,1,0,0);
|
|
|
|
this.context.globalAlpha = 1;
|
|
|
|
this.renderSession.currentBlendMode = PIXI.blendModes.NORMAL;
|
|
this.context.globalCompositeOperation = PIXI.blendModesCanvas[PIXI.blendModes.NORMAL];
|
|
|
|
if (navigator.isCocoonJS && this.view.screencanvas) {
|
|
this.context.fillStyle = "black";
|
|
this.context.clear();
|
|
}
|
|
|
|
if (this.clearBeforeRender)
|
|
{
|
|
if (this.transparent)
|
|
{
|
|
this.context.clearRect(0, 0, this.width, this.height);
|
|
}
|
|
else
|
|
{
|
|
this.context.fillStyle = stage.backgroundColorString;
|
|
this.context.fillRect(0, 0, this.width , this.height);
|
|
}
|
|
}
|
|
|
|
this.renderDisplayObject(stage);
|
|
|
|
// run interaction!
|
|
if(stage.interactive)
|
|
{
|
|
//need to add some events!
|
|
if(!stage._interactiveEventsAdded)
|
|
{
|
|
stage._interactiveEventsAdded = true;
|
|
stage.interactionManager.setTarget(this);
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Removes everything from the renderer and optionally removes the Canvas DOM element.
|
|
*
|
|
* @method destroy
|
|
* @param [removeView=true] {boolean} Removes the Canvas element from the DOM.
|
|
*/
|
|
PIXI.CanvasRenderer.prototype.destroy = function(removeView)
|
|
{
|
|
if (typeof removeView === "undefined") { removeView = true; }
|
|
|
|
if (removeView && this.view.parent)
|
|
{
|
|
this.view.parent.removeChild(this.view);
|
|
}
|
|
|
|
this.view = null;
|
|
this.context = null;
|
|
this.maskManager = null;
|
|
this.renderSession = null;
|
|
|
|
};
|
|
|
|
/**
|
|
* Resizes the canvas view to the specified width and height
|
|
*
|
|
* @method resize
|
|
* @param width {Number} the new width of the canvas view
|
|
* @param height {Number} the new height of the canvas view
|
|
*/
|
|
PIXI.CanvasRenderer.prototype.resize = function(width, height)
|
|
{
|
|
this.width = width * this.resolution;
|
|
this.height = height * this.resolution;
|
|
|
|
this.view.width = this.width;
|
|
this.view.height = this.height;
|
|
|
|
if (this.autoResize) {
|
|
this.view.style.width = this.width / this.resolution + "px";
|
|
this.view.style.height = this.height / this.resolution + "px";
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Renders a display object
|
|
*
|
|
* @method renderDisplayObject
|
|
* @param displayObject {DisplayObject} The displayObject to render
|
|
* @param context {CanvasRenderingContext2D} the context 2d method of the canvas
|
|
* @private
|
|
*/
|
|
PIXI.CanvasRenderer.prototype.renderDisplayObject = function(displayObject, context)
|
|
{
|
|
this.renderSession.context = context || this.context;
|
|
this.renderSession.resolution = this.resolution;
|
|
displayObject._renderCanvas(this.renderSession);
|
|
};
|
|
|
|
/**
|
|
* Maps Pixi blend modes to canvas blend modes.
|
|
*
|
|
* @method mapBlendModes
|
|
* @private
|
|
*/
|
|
PIXI.CanvasRenderer.prototype.mapBlendModes = function()
|
|
{
|
|
if(!PIXI.blendModesCanvas)
|
|
{
|
|
PIXI.blendModesCanvas = [];
|
|
|
|
if(PIXI.canUseNewCanvasBlendModes())
|
|
{
|
|
PIXI.blendModesCanvas[PIXI.blendModes.NORMAL] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.ADD] = "lighter"; //IS THIS OK???
|
|
PIXI.blendModesCanvas[PIXI.blendModes.MULTIPLY] = "multiply";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.SCREEN] = "screen";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.OVERLAY] = "overlay";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.DARKEN] = "darken";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.LIGHTEN] = "lighten";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.COLOR_DODGE] = "color-dodge";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.COLOR_BURN] = "color-burn";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.HARD_LIGHT] = "hard-light";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.SOFT_LIGHT] = "soft-light";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.DIFFERENCE] = "difference";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.EXCLUSION] = "exclusion";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.HUE] = "hue";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.SATURATION] = "saturation";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.COLOR] = "color";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.LUMINOSITY] = "luminosity";
|
|
}
|
|
else
|
|
{
|
|
// this means that the browser does not support the cool new blend modes in canvas "cough" ie "cough"
|
|
PIXI.blendModesCanvas[PIXI.blendModes.NORMAL] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.ADD] = "lighter"; //IS THIS OK???
|
|
PIXI.blendModesCanvas[PIXI.blendModes.MULTIPLY] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.SCREEN] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.OVERLAY] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.DARKEN] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.LIGHTEN] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.COLOR_DODGE] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.COLOR_BURN] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.HARD_LIGHT] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.SOFT_LIGHT] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.DIFFERENCE] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.EXCLUSION] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.HUE] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.SATURATION] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.COLOR] = "source-over";
|
|
PIXI.blendModesCanvas[PIXI.blendModes.LUMINOSITY] = "source-over";
|
|
}
|
|
}
|
|
};
|