Пример #1
0
        public int KerningOffset(CharInfo nextChar, HSmushRule smushRule, out bool smushable)
        {
            var val = int.MaxValue;

            smushable = smushRule != HSmushRule.NoSmush && Width > 1 && nextChar.Width > 1;

            for (var iRow = 0; iRow < SubChars.Count; iRow++)
            {
                var r = RightPads[iRow];
                var l = nextChar.LeftPads[iRow];
                if (r == -1 || l == -1)
                {
                    continue;
                }
                val = Math.Min(val, r + l);

                smushable = smushable &&
                            CheckSmushability(smushRule, _rChars[iRow], nextChar._lChars[iRow], _hardBlank) != '\0';
            }
            if (val == int.MaxValue)
            {
                // If there is nothing intersecting between the two characters then use 0
                // padding - we can't slide the character back infinitely just because there's
                // nothing in the other character to clash with it.
                val = 0;
            }
            return(val);
        }
Пример #2
0
        internal static char CheckSmushability(HSmushRule rule, char lChar, char rChar, char hardBlank)
        {
            if (rChar == ' ')
            {
                return(lChar);
            }
            if (lChar == ' ')
            {
                return(rChar);
            }

            if (rChar == lChar && rChar != hardBlank)
            {
                return(rChar);
            }

            if (rule == HSmushRule.Universal)
            {
                if (rChar == ' ' || rChar == hardBlank)
                {
                    return(lChar);
                }
                return(rChar);
            }

            if (rule.HasFlag(HSmushRule.HardBlank))
            {
                if (rChar == hardBlank && lChar == hardBlank)
                {
                    return(hardBlank);
                }
            }

            if (lChar == hardBlank || rChar == hardBlank)
            {
                return('\0');
            }

            if (rule.HasFlag(HSmushRule.EqualCharacter))
            {
                if (lChar == rChar)
                {
                    return(lChar);
                }
            }

            if (rule.HasFlag(HSmushRule.Underscore))
            {
                if (lChar == '_' && @"|/\[]{}()<>".Contains(rChar))
                {
                    return(rChar);
                }
                if (rChar == '_' && @"|/\[]{}()<>".Contains(lChar))
                {
                    return(lChar);
                }
            }

            if (rule.HasFlag(HSmushRule.Heirarchy))
            {
                const string heirarchyChars = @"|/\[]{}()<>";
                var          breaks         = new[] { 1, 3, 5, 7, 9 };

                foreach (var iBreak in breaks)
                {
                    int ch1, ch2;
                    if (iBreak == 1)
                    {
                        ch1 = ch2 = heirarchyChars[0];
                    }
                    else
                    {
                        ch1 = heirarchyChars[iBreak - 2];
                        ch2 = heirarchyChars[iBreak - 1];
                    }
                    if ((lChar == ch1 || lChar == ch2) && heirarchyChars.Substring(iBreak).Contains(rChar))
                    {
                        return(rChar);
                    }
                    if ((rChar == ch1 || rChar == ch2) && heirarchyChars.Substring(iBreak).Contains(lChar))
                    {
                        return(lChar);
                    }
                }
            }

            if (rule.HasFlag(HSmushRule.OppositePair))
            {
                const string pairs = "[]{}()";
                for (int i = 0; i < 6; i += 2)
                {
                    if (lChar == pairs[i] && rChar == pairs[i + 1] ||
                        rChar == pairs[i] && lChar == pairs[i + 1])
                    {
                        return('|');
                    }
                }
            }

            if (rule.HasFlag(HSmushRule.BigX))
            {
                if (lChar == '/' && rChar == '\\')
                {
                    return('|');
                }
                if (lChar == '\\' && rChar == '/')
                {
                    return('Y');
                }
                if (lChar == '>' && rChar == '<')
                {
                    return('X');
                }
            }

            return('\0');
        }