mirror of
https://github.com/piskelapp/piskel.git
synced 2023-08-10 21:12:52 +03:00
91 lines
2.6 KiB
JavaScript
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 = '';
|
|
};
|
|
})();
|