lychees's picture
Upload 569 files
87b3b3a
/**
* @class Rectangular backend
* @private
*/
ROT.Display.Rect = function(context) {
ROT.Display.Backend.call(this, context);
this._spacingX = 0;
this._spacingY = 0;
this._canvasCache = {};
this._options = {};
}
ROT.Display.Rect.extend(ROT.Display.Backend);
ROT.Display.Rect.cache = false;
ROT.Display.Rect.prototype.compute = function(options) {
this._canvasCache = {};
this._options = options;
var charWidth = Math.ceil(this._context.measureText("W").width);
this._spacingX = Math.ceil(options.spacing * charWidth);
this._spacingY = Math.ceil(options.spacing * options.fontSize);
this._context.canvas.width = options.width * this._spacingX;
this._context.canvas.height = options.height * this._spacingY;
}
ROT.Display.Rect.prototype.draw = function(data, clearBefore) {
if (this.constructor.cache) {
this._drawWithCache(data, clearBefore);
} else {
this._drawNoCache(data, clearBefore);
}
}
ROT.Display.Rect.prototype._drawWithCache = function(data, clearBefore) {
var x = data[0];
var y = data[1];
var ch = data[2];
var fg = data[3];
var bg = data[4];
var hash = ""+ch+fg+bg;
if (hash in this._canvasCache) {
var canvas = this._canvasCache[hash];
} else {
var b = this._options.border;
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
canvas.width = this._spacingX;
canvas.height = this._spacingY;
ctx.fillStyle = bg;
ctx.fillRect(b, b, canvas.width-b, canvas.height-b);
if (ch) {
ctx.fillStyle = fg;
ctx.font = this._context.font;
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.fillText(ch, this._spacingX/2, this._spacingY/2);
}
this._canvasCache[hash] = canvas;
}
this._context.drawImage(canvas, x*this._spacingX, y*this._spacingY);
}
ROT.Display.Rect.prototype._drawNoCache = function(data, clearBefore) {
var x = data[0];
var y = data[1];
var ch = data[2];
var fg = data[3];
var bg = data[4];
if (clearBefore) {
var b = this._options.border;
this._context.fillStyle = bg;
this._context.fillRect(x*this._spacingX + b, y*this._spacingY + b, this._spacingX - b, this._spacingY - b);
}
if (!ch) { return; }
this._context.fillStyle = fg;
this._context.fillText(ch, (x+0.5) * this._spacingX, (y+0.5) * this._spacingY);
}
ROT.Display.Rect.prototype.computeSize = function(availWidth, availHeight) {
var width = Math.floor(availWidth / this._spacingX);
var height = Math.floor(availHeight / this._spacingY);
return [width, height];
}
ROT.Display.Rect.prototype.computeFontSize = function(availWidth, availHeight) {
var boxWidth = Math.floor(availWidth / this._options.width);
var boxHeight = Math.floor(availHeight / this._options.height);
/* compute char ratio */
var oldFont = this._context.font;
this._context.font = "100px " + this._options.fontFamily;
var width = Math.ceil(this._context.measureText("W").width);
this._context.font = oldFont;
var ratio = width / 100;
var widthFraction = ratio * boxHeight / boxWidth;
if (widthFraction > 1) { /* too wide with current aspect ratio */
boxHeight = Math.floor(boxHeight / widthFraction);
}
return Math.floor(boxHeight / this._options.spacing);
}