Esempio n. 1
0
        /// <summary>
        /// Calculates the size of the specified parser token when rendered according to the current layout state.
        /// </summary>
        /// <param name="font">The current font face.</param>
        /// <param name="tokenType">The type of the current token.</param>
        /// <param name="tokenText">The text of the current token.</param>
        /// <param name="tokenNext">The next token after the current token, excluding command tokens.</param>
        /// <returns>The size of the specified token in pixels.</returns>
        private Size2 MeasureToken(SpriteFontFace font, TextParserTokenType tokenType, StringSegment tokenText, TextParserToken?tokenNext = null)
        {
            switch (tokenType)
            {
            case TextParserTokenType.Icon:
                {
                    TextIconInfo icon;
                    if (!registeredIcons.TryGetValue(tokenText, out icon))
                    {
                        throw new InvalidOperationException(UltravioletStrings.UnrecognizedIcon.Format(tokenText));
                    }

                    return(new Size2(icon.Width ?? icon.Icon.Controller.Width, icon.Height ?? icon.Icon.Controller.Height));
                }

            case TextParserTokenType.Text:
            {
                var size = font.MeasureString(tokenText);
                if (tokenNext.HasValue)
                {
                    var tokenNextValue = tokenNext.GetValueOrDefault();
                    if (tokenNextValue.TokenType == TextParserTokenType.Text && !tokenNextValue.Text.IsEmpty && !tokenNextValue.IsNewLine)
                    {
                        var charLast = tokenText[tokenText.Length - 1];
                        var charNext = tokenNextValue.Text[0];
                        var kerning  = font.Kerning.Get(charLast, charNext);
                        return(new Size2(size.Width + kerning, size.Height));
                    }
                }
                return(size);
            }
            }
            return(Size2.Zero);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="TextParserToken"/> structure.
 /// </summary>
 /// <param name="tokenType">The token's type.</param>
 /// <param name="text">The token's text.</param>
 /// <param name="sourceOffset">The offset of the first character in the source text that produced this token.</param>
 /// <param name="sourceLength">The number of characters in the source text that produced this token.</param>
 /// <param name="isNonBreakingSpace">A value indicating whether this token represents a non-breaking space.</param>
 internal TextParserToken(TextParserTokenType tokenType, StringSegment text, Int32 sourceOffset, Int32 sourceLength, Boolean isNonBreakingSpace = false)
 {
     this.tokenType          = tokenType;
     this.text               = text;
     this.sourceOffset       = sourceOffset;
     this.sourceLength       = sourceLength;
     this.isNonBreakingSpace = isNonBreakingSpace;
 }
Esempio n. 3
0
 /// <summary>
 /// Initializes a new instance of the <see cref="TextParserToken"/> structure.
 /// </summary>
 /// <param name="tokenType">The token's type.</param>
 /// <param name="text">The token's text.</param>
 /// <param name="sourceOffset">The offset of the first character in the source text that produced this token.</param>
 /// <param name="sourceLength">The number of characters in the source text that produced this token.</param>
 /// <param name="isNonBreakingSpace">A value indicating whether this token represents a non-breaking space.</param>
 internal TextParserToken(TextParserTokenType tokenType, StringSegment text, Int32 sourceOffset, Int32 sourceLength, Boolean isNonBreakingSpace = false)
 {
     this.tokenType = tokenType;
     this.text = text;
     this.sourceOffset = sourceOffset;
     this.sourceLength = sourceLength;
     this.isNonBreakingSpace = isNonBreakingSpace;
 }
        /// <summary>
        /// Calculates the size of the specified parser token when rendered according to the current layout state.
        /// </summary>
        /// <param name="font">The current font face.</param>
        /// <param name="tokenType">The type of the current token.</param>
        /// <param name="tokenText">The text of the current token.</param>
        /// <param name="tokenNext">The next token after the current token, excluding command tokens.</param>
        /// <returns>The size of the specified token in pixels.</returns>
        private Size2 MeasureToken(SpriteFontFace font, TextParserTokenType tokenType, StringSegment tokenText, TextParserToken? tokenNext = null)
        {
            switch (tokenType)
            {
                case TextParserTokenType.Icon:
                    {
                        TextIconInfo icon;
                        if (!registeredIcons.TryGetValue(tokenText, out icon))
                            throw new InvalidOperationException(UltravioletStrings.UnrecognizedIcon.Format(tokenText));

                        return new Size2(icon.Width ?? icon.Icon.Controller.Width, icon.Height ?? icon.Icon.Controller.Height);
                    }

                case TextParserTokenType.Text:
                    {
                        var size = font.MeasureString(tokenText);
                        if (tokenNext.HasValue)
                        {
                            var tokenNextValue = tokenNext.GetValueOrDefault();
                            if (tokenNextValue.TokenType == TextParserTokenType.Text && !tokenNextValue.Text.IsEmpty && !tokenNextValue.IsNewLine)
                            {
                                var charLast = tokenText[tokenText.Length - 1];
                                var charNext = tokenNextValue.Text[0];
                                var kerning = font.Kerning.Get(charLast, charNext);
                                return new Size2(size.Width + kerning, size.Height);
                            }
                        }
                        return size;
                    }
            }
            return Size2.Zero;
        }