piskel/dev/js/rendering/OnionSkinRenderer.js
2017-05-22 09:56:42 +02:00

91 lines
2.6 KiB
JavaScript

(function () {
var ns = $.namespace('pskl.rendering');
ns.OnionSkinRenderer = function (renderer, piskelController) {
pskl.rendering.CompositeRenderer.call(this);
this.piskelController = piskelController;
this.renderer = renderer;
this.add(this.renderer);
this.hash = '';
};
ns.OnionSkinRenderer.createInContainer = function (container, renderingOptions, piskelController) {
// Do not use CachedFrameRenderers here, caching is performed in the render method
var renderer = new pskl.rendering.frame.FrameRenderer(container, renderingOptions, ['onion-skin-canvas']);
return new ns.OnionSkinRenderer(renderer, piskelController);
};
pskl.utils.inherit(pskl.rendering.OnionSkinRenderer, pskl.rendering.CompositeRenderer);
ns.OnionSkinRenderer.prototype.render = function () {
var frames = this.getOnionFrames_();
var hash = this.computeHash_(frames);
if (this.hash != hash) {
this.hash = hash;
this.clear();
if (frames.length > 0) {
var mergedFrame = pskl.utils.FrameUtils.merge(frames);
this.renderer.render(mergedFrame);
}
}
};
ns.OnionSkinRenderer.prototype.getOnionFrames_ = function () {
var frames = [];
var currentFrameIndex = this.piskelController.getCurrentFrameIndex();
var layer = this.piskelController.getCurrentLayer();
var previousIndex = currentFrameIndex - 1;
var previousFrame = layer.getFrameAt(previousIndex);
if (previousFrame) {
frames.push(previousFrame);
}
var nextIndex = currentFrameIndex + 1;
var nextFrame = layer.getFrameAt(nextIndex);
if (nextFrame) {
frames.push(nextFrame);
}
return frames;
};
ns.OnionSkinRenderer.prototype.computeHash_ = function (frames) {
var offset = this.getOffset();
var size = this.getDisplaySize();
var layers = this.piskelController.getLayers();
return [
this.getZoom(),
this.getGridWidth(),
offset.x,
offset.y,
size.width,
size.height,
frames.map(function (f) {
return f.getHash();
}).join('-'),
layers.length
].join('-');
};
/**
* See @pskl.rendering.frame.CachedFrameRenderer
* Same issue : FrameRenderer setDisplaySize destroys the canvas
* @param {Number} width
* @param {Number} height
*/
ns.OnionSkinRenderer.prototype.setDisplaySize = function (width, height) {
var size = this.getDisplaySize();
if (size.width !== width || size.height !== height) {
this.superclass.setDisplaySize.call(this, width, height);
}
};
ns.OnionSkinRenderer.prototype.flush = function () {
this.hash = '';
};
})();