123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- import {Text} from "./Text.js";
- import {Object2D} from "../Object2D";
- /**
- * Multiple line text drawing directly into the canvas.
- *
- * Has support for basic text indent and alignment.
- *
- * @class
- * @extends {Text}
- */
- function MultiLineText()
- {
- Text.call(this);
- /**
- * Maximum width of the text content. After text reaches the max width a line break is placed.
- *
- * Can be set to null to be ignored.
- *
- * @type {number}
- */
- this.maxWidth = null;
- /**
- * Height of each line of text, can be smaller or larger than the actual font size.
- *
- * Can be set to null to be ignored.
- *
- * @type {number}
- */
- this.lineHeight = null;
- }
- MultiLineText.prototype = Object.create(Text.prototype);
- MultiLineText.prototype.constructor = MultiLineText;
- MultiLineText.prototype.type = "MultiLineText";
- Object2D.register(MultiLineText, "MultiLineText");
- MultiLineText.prototype.draw = function(context, viewport, canvas)
- {
- context.font = this.font;
- context.textAlign = this.textAlign;
- context.textBaseline = this.textBaseline;
- var lineHeight = this.lineHeight || Number.parseFloat(this.font);
- var lines = this.text.split("\n");
- var offsetY = 0;
- // Iterate trough all lines (breakpoints)
- for(var i = 0; i < lines.length; i++)
- {
- var line = lines[i];
- var size = context.measureText(line);
- var sublines = [];
- // Split into multiple sub-lines
- if(this.maxWidth !== null && size.width > this.maxWidth)
- {
- while(line.length > 0)
- {
- var subline = "";
- var subsize = context.measureText(subline + line[0]);
- while(subsize.width < this.maxWidth && line.length > 0)
- {
- subline += line[0];
- line = line.substr(1);
- subsize = context.measureText(subline + line[0]);
- }
- sublines.push(subline);
- }
- }
- // Fits into a single line
- else
- {
- sublines = [line];
- }
- for(var j = 0; j < sublines.length; j++)
- {
- if(this.fillStyle !== null)
- {
- context.fillStyle = this.fillStyle.get(context);
- context.fillText(sublines[j], this.position.x, this.position.y + offsetY);
- }
- if(this.strokeStyle !== null)
- {
- context.lineWidth = this.lineWidth;
- context.strokeStyle = this.strokeStyle.get(context);
- context.strokeText(sublines[j], this.position.x, this.position.y + offsetY);
- }
- offsetY += lineHeight;
- }
- }
- };
- MultiLineText.prototype.serialize = function(recursive)
- {
- var data = Text.prototype.serialize.call(this, recursive);
- data.maxWidth = this.maxWidth;
- data.lineHeight = this.lineHeight;
- return data;
- };
- MultiLineText.prototype.parse = function(data, root)
- {
- Text.prototype.parse.call(this, data, root);
- this.maxWidth = data.maxWidth;
- this.lineHeight = data.lineHeight;
- };
- export {MultiLineText};
|