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); }
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'); }