Newer
Older
lostmynuts / shared / js / Engine / Libs / pixi-multistyle-text.js
/// <reference types="pixi.js" />
"use strict";
var __extends = (this && this.__extends) || (function () {
    var extendStatics = function (d, b) {
        extendStatics = Object.setPrototypeOf ||
            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
        return extendStatics(d, b);
    };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
//exports.__esModule = true;
var INTERACTION_EVENTS = [
    "pointerover",
    "pointerenter",
    "pointerdown",
    "pointermove",
    "pointerup",
    "pointercancel",
    "pointerout",
    "pointerleave",
    "gotpointercapture",
    "lostpointercapture",
    "mouseover",
    "mouseenter",
    "mousedown",
    "mousemove",
    "mouseup",
    "mousecancel",
    "mouseout",
    "mouseleave",
    "touchover",
    "touchenter",
    "touchdown",
    "touchmove",
    "touchup",
    "touchcancel",
    "touchout",
    "touchleave"
];
var MultiStyleText = /** @class */ (function (_super) {
    __extends(MultiStyleText, _super);
    function MultiStyleText(text, styles) {
        var _this = _super.call(this, text) || this;
        _this.styles = styles;
        INTERACTION_EVENTS.forEach(function (event) {
            _this.on(event, function (e) { return _this.handleInteraction(e); });
        });
        return _this;
    }
    MultiStyleText.prototype.handleInteraction = function (e) {
        var ev = e;
        var localPoint = e.data.getLocalPosition(this);
        var targetTag = this.hitboxes.reduce(function (prev, hitbox) { return prev !== undefined ? prev : (hitbox.hitbox.contains(localPoint.x, localPoint.y) ? hitbox : undefined); }, undefined);
        ev.targetTag = targetTag === undefined ? undefined : targetTag.tag;
    };
    Object.defineProperty(MultiStyleText.prototype, "styles", {
        set: function (styles) {
            this.textStyles = {};
            this.textStyles["default"] = this.assign({}, MultiStyleText.DEFAULT_TAG_STYLE);
            for (var style in styles) {
                if (style === "default") {
                    this.assign(this.textStyles["default"], styles[style]);
                }
                else {
                    this.textStyles[style] = this.assign({}, styles[style]);
                }
            }
            this._style = new PIXI.TextStyle(this.textStyles["default"]);
            this.dirty = true;
        },
        enumerable: true,
        configurable: true
    });
    MultiStyleText.prototype.setTagStyle = function (tag, style) {
        if (tag in this.textStyles) {
            this.assign(this.textStyles[tag], style);
        }
        else {
            this.textStyles[tag] = this.assign({}, style);
        }
        this._style = new PIXI.TextStyle(this.textStyles["default"]);
        this.dirty = true;
    };
    MultiStyleText.prototype.deleteTagStyle = function (tag) {
        if (tag === "default") {
            this.textStyles["default"] = this.assign({}, MultiStyleText.DEFAULT_TAG_STYLE);
        }
        else {
            delete this.textStyles[tag];
        }
        this._style = new PIXI.TextStyle(this.textStyles["default"]);
        this.dirty = true;
    };
    // MultiStyleText.prototype.getTagRegex = function (captureName, captureMatch) {
    //     var tagAlternation = Object.keys(this.textStyles).join("|");
    //     if (captureName) {
    //         tagAlternation = "(" + tagAlternation + ")";
    //     }
    //     else {
    //         tagAlternation = "(?:" + tagAlternation + ")";
    //     }
    //     var reStr = "<" + tagAlternation + "(?:\\s+[A-Za-z0-9_\\-]+=(?:\"(?:[^\"]+|\\\\\")*\"|'(?:[^']+|\\\\')*'))*\\s*>|</" + tagAlternation + "\\s*>";
    //     if (captureMatch) {
    //         reStr = "(" + reStr + ")";
    //     }
    //     return new RegExp(reStr, "g");
    // };
    MultiStyleText.prototype.getPropertyRegex = function () {
        return new RegExp("([A-Za-z0-9_\\-]+)=(?:\"((?:[^\"]+|\\\\\")*)\"|'((?:[^']+|\\\\')*)')", "g");
    };
    MultiStyleText.prototype._getTextDataPerLine = function (lines) {
        var outputTextData = [];
        // var re = this.getTagRegex(true, false);
        var tags = Object.keys(this.textStyles).join("|");
        var re = new RegExp("</?(" + tags + ")>", "g");
        var styleStack = [this.assign({}, this.textStyles["default"])];
        var tagStack = [{ name: "default", properties: {} }];
        // determine the group of word for each line
        for (var i = 0; i < lines.length; i++) {
            var lineTextData = [];
            // find tags inside the string
            var matches = [];
            var matchArray = void 0;
            while (matchArray = re.exec(lines[i])) {
                matches.push(matchArray);
            }
            // if there is no match, we still need to add the line with the default style
            if (matches.length === 0) {
                lineTextData.push(this.createTextData(lines[i], styleStack[styleStack.length - 1], tagStack[tagStack.length - 1]));
            }
            else {
                // We got a match! add the text with the needed style
                var currentSearchIdx = 0;
                for (var j = 0; j < matches.length; j++) {
                    // if index > 0, it means we have characters before the match,
                    // so we need to add it with the default style
                    if (matches[j].index > currentSearchIdx) {
                        lineTextData.push(this.createTextData(lines[i].substring(currentSearchIdx, matches[j].index), styleStack[styleStack.length - 1], tagStack[tagStack.length - 1]));
                    }
                    if (matches[j][0][1] === "/") { // reset the style if end of tag
                        if (styleStack.length > 1) {
                            styleStack.pop();
                            tagStack.pop();
                        }
                    }
                    else { // set the current style
                        styleStack.push(this.assign({}, styleStack[styleStack.length - 1], this.textStyles[matches[j][1]]));
                        var properties = {};
                        var propertyRegex = this.getPropertyRegex();
                        var propertyMatch = void 0;
                        while (propertyMatch = propertyRegex.exec(matches[j][0])) {
                            properties[propertyMatch[1]] = propertyMatch[2] || propertyMatch[3];
                        }
                        tagStack.push({ name: matches[j][1], properties: properties });
                    }
                    // update the current search index
                    currentSearchIdx = matches[j].index + matches[j][0].length;
                }
                // is there any character left?
                if (currentSearchIdx < lines[i].length) {
                    lineTextData.push(this.createTextData(lines[i].substring(currentSearchIdx), styleStack[styleStack.length - 1], tagStack[tagStack.length - 1]));
                }
            }
            outputTextData.push(lineTextData);
        }
        return outputTextData;
    };
    MultiStyleText.prototype.getFontString = function (style) {
        return new PIXI.TextStyle(style).toFontString();
    };
    MultiStyleText.prototype.createTextData = function (text, style, tag) {
        return {
            text: text,
            style: style,
            width: 0,
            height: 0,
            fontProperties: undefined,
            tag: tag
        };
    };
    MultiStyleText.prototype.getDropShadowPadding = function () {
        var _this = this;
        var maxDistance = 0;
        var maxBlur = 0;
        Object.keys(this.textStyles).forEach(function (styleKey) {
            var _a = _this.textStyles[styleKey], dropShadowDistance = _a.dropShadowDistance, dropShadowBlur = _a.dropShadowBlur;
            maxDistance = Math.max(maxDistance, dropShadowDistance || 0);
            maxBlur = Math.max(maxBlur, dropShadowBlur || 0);
        });
        return maxDistance + maxBlur;
    };
    MultiStyleText.prototype.updateText = function () {
        var _this = this;
        if (!this.dirty) {
            return;
        }
        this.hitboxes = [];
        this.texture.baseTexture.setResolution(this.resolution);
        var textStyles = this.textStyles;
        var outputText = this.text;
        if (this._style.wordWrap) {
            outputText = this.wordWrap(this.text);
        }
        // split text into lines
        var lines = outputText.split(/(?:\r\n|\r|\n)/);
        // get the text data with specific styles
        var outputTextData = this._getTextDataPerLine(lines);
        // calculate text width and height
        var lineWidths = [];
        var lineYMins = [];
        var lineYMaxs = [];
        var baselines = [];
        var maxLineWidth = 0;
        for (var i = 0; i < lines.length; i++) {
            var lineWidth = 0;
            var lineYMin = 0;
            var lineYMax = 0;
            var baseline = 0;
            for (var j = 0; j < outputTextData[i].length; j++) {
                var sty = outputTextData[i][j].style;
                this.context.font = this.getFontString(sty);
                // save the width
                outputTextData[i][j].width = this.context.measureText(outputTextData[i][j].text).width;
                if (outputTextData[i][j].text.length === 0) {
                    outputTextData[i][j].width += (outputTextData[i][j].text.length - 1) * sty.letterSpacing;
                    if (j > 0) {
                        lineWidth += sty.letterSpacing / 2; // spacing before first character
                    }
                    if (j < outputTextData[i].length - 1) {
                        lineWidth += sty.letterSpacing / 2; // spacing after last character
                    }
                }
                lineWidth += outputTextData[i][j].width;
                // save the font properties
                outputTextData[i][j].fontProperties = PIXI.TextMetrics.measureFont(this.context.font);
                // save the height
                outputTextData[i][j].height =
                    outputTextData[i][j].fontProperties.fontSize + outputTextData[i][j].style.strokeThickness;
                if (typeof sty.valign === "number") {
                    lineYMin = Math.min(lineYMin, sty.valign - outputTextData[i][j].fontProperties.descent);
                    lineYMax = Math.max(lineYMax, sty.valign + outputTextData[i][j].fontProperties.ascent);
                }
                else {
                    lineYMin = Math.min(lineYMin, -outputTextData[i][j].fontProperties.descent);
                    lineYMax = Math.max(lineYMax, outputTextData[i][j].fontProperties.ascent);
                }
            }
            lineWidths[i] = lineWidth;
            lineYMins[i] = lineYMin;
            lineYMaxs[i] = lineYMax;
            maxLineWidth = Math.max(maxLineWidth, lineWidth);
        }
        // transform styles in array
        var stylesArray = Object.keys(textStyles).map(function (key) { return textStyles[key]; });
        var maxStrokeThickness = stylesArray.reduce(function (prev, cur) { return Math.max(prev, cur.strokeThickness || 0); }, 0);
        var dropShadowPadding = this.getDropShadowPadding();
        var totalHeight = lineYMaxs.reduce(function (prev, cur) { return prev + cur; }, 0) - lineYMins.reduce(function (prev, cur) { return prev + cur; }, 0);
        // define the right width and height
        var width = maxLineWidth + maxStrokeThickness + 2 * dropShadowPadding;
        var height = totalHeight + 2 * dropShadowPadding;
        this.canvas.width = (width + this.context.lineWidth) * this.resolution;
        this.canvas.height = height * this.resolution;
        this.context.scale(this.resolution, this.resolution);
        this.context.textBaseline = "alphabetic";
        this.context.lineJoin = "round";
        var basePositionY = dropShadowPadding;
        var drawingData = [];
        // Compute the drawing data
        for (var i = 0; i < outputTextData.length; i++) {
            var line = outputTextData[i];
            var linePositionX = void 0;
            switch (this._style.align) {
                case "left":
                    linePositionX = dropShadowPadding;
                    break;
                case "center":
                    linePositionX = dropShadowPadding + (maxLineWidth - lineWidths[i]) / 2;
                    break;
                case "right":
                    linePositionX = dropShadowPadding + maxLineWidth - lineWidths[i];
                    break;
            }
            for (var j = 0; j < line.length; j++) {
                var _a = line[j], style = _a.style, text = _a.text, fontProperties = _a.fontProperties, width_1 = _a.width, height_1 = _a.height, tag = _a.tag;
                linePositionX += maxStrokeThickness / 2;
                var linePositionY = maxStrokeThickness / 2 + basePositionY + fontProperties.ascent;
                switch (style.valign) {
                    case "top":
                        // no need to do anything
                        break;
                    case "baseline":
                        linePositionY += lineYMaxs[i] - fontProperties.ascent;
                        break;
                    case "middle":
                        linePositionY += (lineYMaxs[i] - lineYMins[i] - fontProperties.ascent - fontProperties.descent) / 2;
                        break;
                    case "bottom":
                        linePositionY += lineYMaxs[i] - lineYMins[i] - fontProperties.ascent - fontProperties.descent;
                        break;
                    default:
                        // A number - offset from baseline, positive is higher
                        linePositionY += lineYMaxs[i] - fontProperties.ascent - style.valign;
                        break;
                }
                if (style.letterSpacing === 0) {
                    drawingData.push({
                        text: text,
                        style: style,
                        x: linePositionX,
                        y: linePositionY,
                        width: width_1,
                        ascent: fontProperties.ascent,
                        descent: fontProperties.descent,
                        tag: tag
                    });
                    linePositionX += line[j].width;
                }
                else {
                    this.context.font = this.getFontString(line[j].style);
                    for (var k = 0; k < text.length; k++) {
                        if (k > 0 || j > 0) {
                            linePositionX += style.letterSpacing / 2;
                        }
                        drawingData.push({
                            text: text.charAt(k),
                            style: style,
                            x: linePositionX,
                            y: linePositionY,
                            width: width_1,
                            ascent: fontProperties.ascent,
                            descent: fontProperties.descent,
                            tag: tag
                        });
                        linePositionX += this.context.measureText(text.charAt(k)).width;
                        if (k < text.length - 1 || j < line.length - 1) {
                            linePositionX += style.letterSpacing / 2;
                        }
                    }
                }
                linePositionX -= maxStrokeThickness / 2;
            }
            basePositionY += lineYMaxs[i] - lineYMins[i];
        }
        this.context.save();
        // First pass: draw the shadows only
        drawingData.forEach(function (_a) {
            var style = _a.style, text = _a.text, x = _a.x, y = _a.y;
            if (!style.dropShadow) {
                return; // This text doesn't have a shadow
            }
            _this.context.font = _this.getFontString(style);
            var dropFillStyle = style.dropShadowColor;
            if (typeof dropFillStyle === "number") {
                dropFillStyle = PIXI.utils.hex2string(dropFillStyle);
            }
            _this.context.shadowColor = dropFillStyle;
            _this.context.shadowBlur = style.dropShadowBlur;
            _this.context.shadowOffsetX = Math.cos(style.dropShadowAngle) * style.dropShadowDistance * _this.resolution;
            _this.context.shadowOffsetY = Math.sin(style.dropShadowAngle) * style.dropShadowDistance * _this.resolution;
            _this.context.fillText(text, x, y);
        });
        this.context.restore();
        // Second pass: draw strokes and fills
        drawingData.forEach(function (_a) {
            var style = _a.style, text = _a.text, x = _a.x, y = _a.y, width = _a.width, ascent = _a.ascent, descent = _a.descent, tag = _a.tag;
            _this.context.font = _this.getFontString(style);
            var strokeStyle = style.stroke;
            if (typeof strokeStyle === "number") {
                strokeStyle = PIXI.utils.hex2string(strokeStyle);
            }
            _this.context.strokeStyle = strokeStyle;
            _this.context.lineWidth = style.strokeThickness;
            // set canvas text styles
            var fillStyle = style.fill;
            if (typeof fillStyle === "number") {
                fillStyle = PIXI.utils.hex2string(fillStyle);
            }
            else if (Array.isArray(fillStyle)) {
                for (var i = 0; i < fillStyle.length; i++) {
                    var fill = fillStyle[i];
                    if (typeof fill === "number") {
                        fillStyle[i] = PIXI.utils.hex2string(fill);
                    }
                }
            }
            _this.context.fillStyle = _this._generateFillStyle(new PIXI.TextStyle(style), [text]);
            // Typecast required for proper typechecking
            if (style.stroke && style.strokeThickness) {
                _this.context.strokeText(text, x, y);
            }
            if (style.fill) {
                _this.context.fillText(text, x, y);
            }
            var offset = -_this._style.padding - _this.getDropShadowPadding();
            _this.hitboxes.push({
                tag: tag,
                hitbox: new PIXI.Rectangle(x + offset, y - ascent + offset, width, ascent + descent)
            });
            var debugSpan = style.debug === undefined
                ? MultiStyleText.debugOptions.spans.enabled
                : style.debug;
            if (debugSpan) {
                _this.context.lineWidth = 1;
                if (MultiStyleText.debugOptions.spans.bounding) {
                    _this.context.fillStyle = MultiStyleText.debugOptions.spans.bounding;
                    _this.context.strokeStyle = MultiStyleText.debugOptions.spans.bounding;
                    _this.context.beginPath();
                    _this.context.rect(x, y - ascent, width, ascent + descent);
                    _this.context.fill();
                    _this.context.stroke();
                    _this.context.stroke(); // yes, twice
                }
                if (MultiStyleText.debugOptions.spans.baseline) {
                    _this.context.strokeStyle = MultiStyleText.debugOptions.spans.baseline;
                    _this.context.beginPath();
                    _this.context.moveTo(x, y);
                    _this.context.lineTo(x + width, y);
                    _this.context.closePath();
                    _this.context.stroke();
                }
                if (MultiStyleText.debugOptions.spans.top) {
                    _this.context.strokeStyle = MultiStyleText.debugOptions.spans.top;
                    _this.context.beginPath();
                    _this.context.moveTo(x, y - ascent);
                    _this.context.lineTo(x + width, y - ascent);
                    _this.context.closePath();
                    _this.context.stroke();
                }
                if (MultiStyleText.debugOptions.spans.bottom) {
                    _this.context.strokeStyle = MultiStyleText.debugOptions.spans.bottom;
                    _this.context.beginPath();
                    _this.context.moveTo(x, y + descent);
                    _this.context.lineTo(x + width, y + descent);
                    _this.context.closePath();
                    _this.context.stroke();
                }
                if (MultiStyleText.debugOptions.spans.text) {
                    _this.context.fillStyle = "#ffffff";
                    _this.context.strokeStyle = "#000000";
                    _this.context.lineWidth = 2;
                    _this.context.font = "8px monospace";
                    _this.context.strokeText(tag.name, x, y - ascent + 8);
                    _this.context.fillText(tag.name, x, y - ascent + 8);
                    _this.context.strokeText(width.toFixed(2) + "x" + (ascent + descent).toFixed(2), x, y - ascent + 16);
                    _this.context.fillText(width.toFixed(2) + "x" + (ascent + descent).toFixed(2), x, y - ascent + 16);
                }
            }
        });
        if (MultiStyleText.debugOptions.objects.enabled) {
            if (MultiStyleText.debugOptions.objects.bounding) {
                this.context.fillStyle = MultiStyleText.debugOptions.objects.bounding;
                this.context.beginPath();
                this.context.rect(0, 0, width, height);
                this.context.fill();
            }
            if (MultiStyleText.debugOptions.objects.text) {
                this.context.fillStyle = "#ffffff";
                this.context.strokeStyle = "#000000";
                this.context.lineWidth = 2;
                this.context.font = "8px monospace";
                this.context.strokeText(width.toFixed(2) + "x" + height.toFixed(2), 0, 8, width);
                this.context.fillText(width.toFixed(2) + "x" + height.toFixed(2), 0, 8, width);
            }
        }
        this.updateTexture();
    };
    MultiStyleText.prototype.wordWrap = function (text) {
        // Greedy wrapping algorithm that will wrap words as the line grows longer than its horizontal bounds.
        var result = "";
        //var re = this.getTagRegex(true, true);
        var tags = Object.keys(this.textStyles).join("|");
        var re = new RegExp("(</?(" + tags + ")>)", "g");
        var lines = text.split("\n");
        var wordWrapWidth = this._style.wordWrapWidth;
        var styleStack = [this.assign({}, this.textStyles["default"])];
        this.context.font = this.getFontString(this.textStyles["default"]);
        for (var i = 0; i < lines.length; i++) {
            var spaceLeft = wordWrapWidth;
            var words = lines[i].split(" ");
            for (var j = 0; j < words.length; j++) {
                var parts = words[j].split(re);
                for (var k = 0; k < parts.length; k++) {
                    if (re.test(parts[k])) {
                        result += parts[k];
                        if (parts[k][1] === "/") {
                            k++;
                            styleStack.pop();
                        }
                        else {
                            k++;
                            styleStack.push(this.assign({}, styleStack[styleStack.length - 1], this.textStyles[parts[k]]));
                        }
                        this.context.font = this.getFontString(styleStack[styleStack.length - 1]);
                        continue;
                    }
                    var partWidth = this.context.measureText(parts[k]).width;
                    var paddedPartWidth = partWidth + (k === 0 ? this.context.measureText(" ").width : 0);
                    if (paddedPartWidth > spaceLeft) {
                        result += "\n";
                        spaceLeft = wordWrapWidth;
                    }
                    if (this._style.breakWords && partWidth > spaceLeft) {
                        var characters = parts[k].split('');
                        /*if (j > 0 && k === 0) {
                            result += " ";
                            spaceLeft -= this.context.measureText(" ").width;
                        }*/
                        for (var c = 0; c < characters.length; c++) {
                            var characterWidth = this.context.measureText(characters[c]).width;
                            if (characterWidth > spaceLeft) {
                                result += "\n" + characters[c];
                                spaceLeft = wordWrapWidth - characterWidth;
                            }
                            else {
                                /*if (j > 0 && k === 0 && c === 0) {
                                    result += " ";
                                }*/
                                result += characters[c];
                                spaceLeft -= characterWidth;
                            }
                        }
                    }
                    else if (this._style.breakWords) {
                        if (j > 0 && k === 0 && spaceLeft < wordWrapWidth)
                        {
                            result += " ";
                            spaceLeft -= this.context.measureText(" ").width;
                        }
                        result += parts[k];
                        spaceLeft -= partWidth;
                    }
                    else {
                        var paddedPartWidth = partWidth + (k === 0 ? this.context.measureText(" ").width : 0);
                        spaceLeft -= paddedPartWidth;
                        if (k === 0) {
                            result += " ";
                        }
                        result += parts[k];
                    }
                }
            }
            if (i < lines.length - 1) {
                result += '\n';
            }
        }
        // for (var i = 0; i < lines.length; i++) {
        //     var spaceLeft = wordWrapWidth;
        //     var tagSplit = lines[i].split(re);
        //     var firstWordOfLine = true;
        //     for (var j = 0; j < tagSplit.length; j++) {
        //         if (re.test(tagSplit[j])) {
        //             result += tagSplit[j];
        //             if (tagSplit[j][1] === "/") {
        //                 j += 2;
        //                 styleStack.pop();
        //             }
        //             else {
        //                 j++;
        //                 styleStack.push(this.assign({}, styleStack[styleStack.length - 1], this.textStyles[tagSplit[j]]));
        //                 j++;
        //             }
        //             this.context.font = this.getFontString(styleStack[styleStack.length - 1]);
        //         }
        //         else {
        //             var words = tagSplit[j].split(" ");
        //             for (var k = 0; k < words.length; k++) {
        //                 var wordWidth = this.context.measureText(words[k]).width;
        //                 if (this._style.breakWords && wordWidth > spaceLeft) {
        //                     // Part should be split in the middle
        //                     var characters = words[k].split('');
        //                     if (k > 0) {
        //                         result += " ";
        //                         spaceLeft -= this.context.measureText(" ").width;
        //                     }
        //                     for (var c = 0; c < characters.length; c++) {
        //                         var characterWidth = this.context.measureText(characters[c]).width;
        //                         if (characterWidth > spaceLeft) {
        //                             result += "\n" + characters[c];
        //                             spaceLeft = wordWrapWidth - characterWidth;
        //                         }
        //                         else {
        //                             result += characters[c];
        //                             spaceLeft -= characterWidth;
        //                         }
        //                     }
        //                 }
        //                 else if (this._style.breakWords) {
        //                     result += words[k];
        //                     spaceLeft -= wordWidth;
        //                     if(k < words.length - 1) {
        //                         result += ' ';
        //                         spaceLeft -= this.context.measureText(" ").width;
        //                     }
        //                 }
        //                 else {
        //                     var paddedWordWidth = wordWidth + (k > 0 ? this.context.measureText(" ").width : 0);
        //                     if (paddedWordWidth > spaceLeft) {
        //                         // Skip printing the newline if it's the first word of the line that is
        //                         // greater than the word wrap width.
        //                         if (!firstWordOfLine) {
        //                             result += "\n";
        //                         }
        //                         result += words[k];
        //                         spaceLeft = wordWrapWidth - wordWidth;
        //                     }
        //                     else {
        //                         spaceLeft -= paddedWordWidth;
        //                         if (k > 0) {
        //                             result += " ";
        //                         }
        //                         result += words[k];
        //                     }
        //                 }
        //                 firstWordOfLine = false;
        //             }
        //         }
        //     }
        //     if (i < lines.length - 1) {
        //         result += '\n';
        //     }
        // }
        return result;
    };
    MultiStyleText.prototype.updateTexture = function () {
        var texture = this._texture;
        var dropShadowPadding = this.getDropShadowPadding();
        //texture.baseTexture.hasLoaded = true;
        texture.baseTexture.setRealSize(this.canvas.width, this.canvas.height, this.resolution);
        texture.baseTexture.width = this.canvas.width / this.resolution;
        texture.baseTexture.height = this.canvas.height / this.resolution;
        texture.trim.width = texture.frame.width = this.canvas.width / this.resolution;
        texture.trim.height = texture.frame.height = this.canvas.height / this.resolution;
        texture.trim.x = -this._style.padding - dropShadowPadding;
        texture.trim.y = -this._style.padding - dropShadowPadding;
        texture.orig.width = texture.frame.width - (this._style.padding + dropShadowPadding) * 2;
        texture.orig.height = texture.frame.height - (this._style.padding + dropShadowPadding) * 2;
        // call sprite onTextureUpdate to update scale if _width or _height were set
        this._onTextureUpdate();
        texture.baseTexture.emit('update', texture.baseTexture);
        this.dirty = false;
    };
    // Lazy fill for Object.assign
    MultiStyleText.prototype.assign = function (destination) {
        var sources = [];
        for (var _i = 1; _i < arguments.length; _i++) {
            sources[_i - 1] = arguments[_i];
        }
        for (var _a = 0, sources_1 = sources; _a < sources_1.length; _a++) {
            var source = sources_1[_a];
            for (var key in source) {
                destination[key] = source[key];
            }
        }
        return destination;
    };
    MultiStyleText.DEFAULT_TAG_STYLE = {
        align: "left",
        breakWords: false,
        // debug intentionally not included
        dropShadow: false,
        dropShadowAngle: Math.PI / 6,
        dropShadowBlur: 0,
        dropShadowColor: "#000000",
        dropShadowDistance: 5,
        fill: "black",
        fillGradientType: PIXI.TEXT_GRADIENT.LINEAR_VERTICAL,
        fontFamily: "Arial",
        fontSize: 26,
        fontStyle: "normal",
        fontVariant: "normal",
        fontWeight: "normal",
        letterSpacing: 0,
        lineHeight: 0,
        lineJoin: "miter",
        miterLimit: 10,
        padding: 0,
        stroke: "black",
        strokeThickness: 0,
        textBaseline: "alphabetic",
        valign: "baseline",
        wordWrap: false,
        wordWrapWidth: 100
    };
    MultiStyleText.debugOptions = {
        spans: {
            enabled: false,
            baseline: "#44BB44",
            top: "#BB4444",
            bottom: "#4444BB",
            bounding: "rgba(255, 255, 255, 0.1)",
            text: true
        },
        objects: {
            enabled: false,
            bounding: "rgba(255, 255, 255, 0.05)",
            text: true
        }
    };
    return MultiStyleText;
}(PIXI.Text));
//exports["default"] = MultiStyleText;