Dynamic DPIs !

This commit is contained in:
Vince 2012-09-08 16:32:28 +02:00
parent bca16a3964
commit ba5500b4b0
4 changed files with 60 additions and 31 deletions

View File

@ -73,10 +73,7 @@
} }
.drawing-canvas { .drawing-canvas {
position: absolute; float: left;
top: 0;
left: 0;
z-index: 1;
} }
.canvas-overlay { .canvas-overlay {

View File

@ -16,15 +16,17 @@
this.container = container; this.container = container;
this.renderer = new pskl.rendering.FrameRenderer(this.container, renderingOptions, "drawing-canvas"); this.renderer = new pskl.rendering.FrameRenderer(this.container, renderingOptions, "drawing-canvas");
this.overlayRenderer = new pskl.rendering.FrameRenderer(this.container, renderingOptions, "canvas-overlay"); this.overlayRenderer = new pskl.rendering.FrameRenderer(this.container, renderingOptions, "canvas-overlay");
//this.mainCanvas = this.createMainCanvas();
//this.overlayCanvas = this.createOverlayCanvas();
this.renderer.init(this.frame); this.renderer.init(this.frame);
this.overlayRenderer.init(this.frame); this.overlayRenderer.init(this.frame);
}; };
ns.DrawingController.prototype.updateDPI = function (newDPI) { ns.DrawingController.prototype.updateDPI = function (newDPI) {
//this.renderer.updateDPI(newDPI); this.renderer.updateDPI(newDPI);
//this.overlayRenderer.updateDPI(newDPI); this.overlayRenderer.updateDPI(newDPI);
this.renderer.render(this.frame);
this.overlayRenderer.render(this.frame);
}; };
ns.DrawingController.prototype.renderFrame = function () { ns.DrawingController.prototype.renderFrame = function () {

View File

@ -11,23 +11,18 @@ $.namespace("pskl");
*/ */
var frameSheet, var frameSheet,
// Temporary zoom implementation to easily get bigger canvases to
// see how good perform critical algorithms on big canvas.
zoom = 1,
// Configuration: // Configuration:
// Canvas size in pixel size (not dpi related) // Canvas size in pixel size (not dpi related)
framePixelWidth = 32 * zoom, framePixelWidth = 32,
framePixelHeight = 32 * zoom, framePixelHeight = 32,
// Scaling factors for a given frameSheet rendering: // Scaling factors for a given frameSheet rendering:
// Main drawing area: // Main drawing area:
drawingCanvasDpi = Math.ceil(20/ zoom), drawingCanvasDpi = 20,
// Canvas previous in the slideshow: // Canvas preview film canvases:
previewTileCanvasDpi = Math.ceil(4 / zoom), previewTileCanvasDpi = 4,
// Ainmated canvas preview: // Animated canvas preview:
previewAnimationCanvasDpi = Math.ceil(8 / zoom), previewAnimationCanvasDpi = 8,
// DOM references: // DOM references:
drawingAreaContainer, drawingAreaContainer,
@ -53,6 +48,9 @@ $.namespace("pskl");
var piskel = { var piskel = {
init : function () { init : function () {
piskel.initDPIs_();
frameSheet = new pskl.model.FrameSheet(framePixelWidth, framePixelHeight); frameSheet = new pskl.model.FrameSheet(framePixelWidth, framePixelHeight);
frameSheet.addEmptyFrame(); frameSheet.addEmptyFrame();
@ -95,6 +93,29 @@ $.namespace("pskl");
} }
}, },
/**
* Override default DPIs.
* @private
*/
initDPIs_ : function() {
drawingCanvasDpi = piskel.calculateDPIsForDrawingCanvas_();
// TODO(vincz): Add throttling on window.resize event.
$(window).resize($.proxy(function() {
drawingCanvasDpi = piskel.calculateDPIsForDrawingCanvas_();
this.drawingController.updateDPI(drawingCanvasDpi);
}, this));
// TODO(vincz): Check for user settings eventually from localstorage.
},
/**
* @private
*/
calculateDPIsForDrawingCanvas_ : function() {
var availableViewportHeight = $('.main-panel').height();
return Math.floor(availableViewportHeight / framePixelHeight);
},
finishInit : function () { finishInit : function () {
$.subscribe(Events.TOOL_SELECTED, function(evt, toolBehavior) { $.subscribe(Events.TOOL_SELECTED, function(evt, toolBehavior) {
@ -186,8 +207,6 @@ $.namespace("pskl");
document.body.addEventListener('mouseup', this.onMouseup.bind(this)); document.body.addEventListener('mouseup', this.onMouseup.bind(this));
drawingAreaContainer.addEventListener('mousedown', this.onMousedown.bind(this)); drawingAreaContainer.addEventListener('mousedown', this.onMousedown.bind(this));
drawingAreaContainer.addEventListener('mousemove', this.onMousemove.bind(this)); drawingAreaContainer.addEventListener('mousemove', this.onMousemove.bind(this));
drawingAreaContainer.style.width = framePixelWidth * drawingCanvasDpi + "px";
drawingAreaContainer.style.height = framePixelHeight * drawingCanvasDpi + "px";
document.body.addEventListener('contextmenu', this.onCanvasContextMenu); document.body.addEventListener('contextmenu', this.onCanvasContextMenu);
}, },

View File

@ -17,24 +17,30 @@
this.displayGrid = !!renderingOptions.displayGrid; this.displayGrid = !!renderingOptions.displayGrid;
this.dpi = renderingOptions.dpi; this.dpi = renderingOptions.dpi;
this.className = className; this.className = className;
// Flag to know if the config was altered
this.canvasConfigDirty = true;
}; };
ns.FrameRenderer.prototype.init = function (frame) { ns.FrameRenderer.prototype.init = function (frame) {
this.createCanvas_(frame);
this.render(frame); this.render(frame);
}; };
ns.FrameRenderer.prototype.updateDPI = function (newDPI) {
this.dpi = newDPI;
this.canvasConfigDirty = true;
};
ns.FrameRenderer.prototype.render = function (frame) { ns.FrameRenderer.prototype.render = function (frame) {
for(var col = 0, width = frame.getWidth(); col < width; col++) { for(var col = 0, width = frame.getWidth(); col < width; col++) {
for(var row = 0, height = frame.getHeight(); row < height; row++) { for(var row = 0, height = frame.getHeight(); row < height; row++) {
this.drawPixel(col, row, frame, this.canvas, this.dpi); this.drawPixel(col, row, frame, this.getCanvas_(frame), this.dpi);
} }
} }
}; };
ns.FrameRenderer.prototype.drawPixel = function (col, row, frame) { ns.FrameRenderer.prototype.drawPixel = function (col, row, frame) {
var context = this.canvas.getContext('2d'); var context = this.getCanvas_(frame).getContext('2d');
var color = frame.getPixel(col, row); var color = frame.getPixel(col, row);
if(color == Constants.TRANSPARENT_COLOR) { if(color == Constants.TRANSPARENT_COLOR) {
context.clearRect(col * this.dpi, row * this.dpi, this.dpi, this.dpi); context.clearRect(col * this.dpi, row * this.dpi, this.dpi, this.dpi);
@ -50,14 +56,16 @@
}; };
ns.FrameRenderer.prototype.clear = function (col, row, frame) { ns.FrameRenderer.prototype.clear = function (col, row, frame) {
this.canvas.getContext("2d").clearRect(0, 0, this.canvas.width, this.canvas.height); var canvas = this.getCanvas_(frame)
canvas.getContext("2d").clearRect(0, 0, canvas.width, canvas.height);
}; };
/** /**
* @private * @private
*/ */
ns.FrameRenderer.prototype.createCanvas_ = function (frame) { ns.FrameRenderer.prototype.getCanvas_ = function (frame) {
if(this.canvas == undefined) { if(this.canvasConfigDirty) {
$(this.canvas).remove();
var width = frame.getWidth(), var width = frame.getWidth(),
height = frame.getHeight(); height = frame.getHeight();
@ -72,7 +80,10 @@
canvas.setAttribute("class", canvasClassname); canvas.setAttribute("class", canvasClassname);
this.canvas = canvas; this.canvas = canvas;
}
this.container.appendChild(this.canvas); this.container.appendChild(this.canvas);
this.canvasConfigDirty = false;
}
return this.canvas;
}; };
})(); })();