123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159 |
- /**
- * bigtext.js - bigtext element for blessed
- * Copyright (c) 2013-2015, Christopher Jeffrey and contributors (MIT License).
- * https://github.com/chjj/blessed
- */
- /**
- * Modules
- */
- var fs = require('fs');
- var Node = require('./node');
- var Box = require('./box');
- /**
- * BigText
- */
- function BigText(options) {
- if (!(this instanceof Node)) {
- return new BigText(options);
- }
- options = options || {};
- options.font = options.font
- || __dirname + '/../../usr/fonts/ter-u14n.json';
- options.fontBold = options.font
- || __dirname + '/../../usr/fonts/ter-u14b.json';
- this.fch = options.fch;
- this.ratio = {};
- this.font = this.loadFont(options.font);
- this.fontBold = this.loadFont(options.font);
- Box.call(this, options);
- if (this.style.bold) {
- this.font = this.fontBold;
- }
- }
- BigText.prototype.__proto__ = Box.prototype;
- BigText.prototype.type = 'bigtext';
- BigText.prototype.loadFont = function(filename) {
- var self = this
- , data
- , font;
- data = JSON.parse(fs.readFileSync(filename, 'utf8'));
- this.ratio.width = data.width;
- this.ratio.height = data.height;
- function convertLetter(ch, lines) {
- var line, i;
- while (lines.length > self.ratio.height) {
- lines.shift();
- lines.pop();
- }
- lines = lines.map(function(line) {
- var chs = line.split('');
- chs = chs.map(function(ch) {
- return ch === ' ' ? 0 : 1;
- });
- while (chs.length < self.ratio.width) {
- chs.push(0);
- }
- return chs;
- });
- while (lines.length < self.ratio.height) {
- line = [];
- for (i = 0; i < self.ratio.width; i++) {
- line.push(0);
- }
- lines.push(line);
- }
- return lines;
- }
- font = Object.keys(data.glyphs).reduce(function(out, ch) {
- var lines = data.glyphs[ch].map;
- out[ch] = convertLetter(ch, lines);
- return out;
- }, {});
- delete font[' '];
- return font;
- };
- BigText.prototype.setContent = function(content) {
- this.content = '';
- this.text = content || '';
- };
- BigText.prototype.render = function() {
- if (this.position.width == null || this._shrinkWidth) {
- // if (this.width - this.iwidth < this.ratio.width * this.text.length + 1) {
- this.position.width = this.ratio.width * this.text.length + 1;
- this._shrinkWidth = true;
- // }
- }
- if (this.position.height == null || this._shrinkHeight) {
- // if (this.height - this.iheight < this.ratio.height + 0) {
- this.position.height = this.ratio.height + 0;
- this._shrinkHeight = true;
- // }
- }
- var coords = this._render();
- if (!coords) return;
- var lines = this.screen.lines
- , left = coords.xi + this.ileft
- , top = coords.yi + this.itop
- , right = coords.xl - this.iright
- , bottom = coords.yl - this.ibottom;
- var dattr = this.sattr(this.style)
- , bg = dattr & 0x1ff
- , fg = (dattr >> 9) & 0x1ff
- , flags = (dattr >> 18) & 0x1ff
- , attr = (flags << 18) | (bg << 9) | fg;
- for (var x = left, i = 0; x < right; x += this.ratio.width, i++) {
- var ch = this.text[i];
- if (!ch) break;
- var map = this.font[ch];
- if (!map) continue;
- for (var y = top; y < Math.min(bottom, top + this.ratio.height); y++) {
- if (!lines[y]) continue;
- var mline = map[y - top];
- if (!mline) continue;
- for (var mx = 0; mx < this.ratio.width; mx++) {
- var mcell = mline[mx];
- if (mcell == null) break;
- if (this.fch && this.fch !== ' ') {
- lines[y][x + mx][0] = dattr;
- lines[y][x + mx][1] = mcell === 1 ? this.fch : this.ch;
- } else {
- lines[y][x + mx][0] = mcell === 1 ? attr : dattr;
- lines[y][x + mx][1] = mcell === 1 ? ' ' : this.ch;
- }
- }
- lines[y].dirty = true;
- }
- }
- return coords;
- };
- /**
- * Expose
- */
- module.exports = BigText;
|