/// <summary> /// Sort character ranges and merge overlapping ranges. /// </summary> private void NormalizeCharacterRanges() { if (CharacterRanges.Count == 0) { return; } CharacterRanges.Sort((rl, rr) => rl.Start - rr.Start); var prevRange = CharacterRanges[CharacterRanges.Count - 1]; for (var i = CharacterRanges.Count - 2; i >= 0; i--) { var range = CharacterRanges[i]; if (prevRange.Start <= range.End - 1) { prevRange = new Range <int>(prevRange.Start, range.End > prevRange.End ? range.End : prevRange.End); CharacterRanges.RemoveAt(i + 1); } else { CharacterRanges[i] = prevRange; prevRange = range; } } CharacterRanges[0] = prevRange; }
public int GetCharRange(IReadOnlyList <CharacterRange> ranges) { for (var i = 0; i <= CharacterRanges.Count - ranges.Count; i++) { if (RangeMatchesRange(i, ranges)) { return(i); } } var result = CharacterRanges.Count; CharacterRanges.AddRange(ranges.Select(range => new CharRange(range.Min, range.Max))); return(result); }
public int GetCharRange(CharacterRange range) { for (var i = 0; i < CharacterRanges.Count; i++) { var exisingRange = CharacterRanges[i]; if (exisingRange.Min == range.Min && exisingRange.Max == range.Max) { return(i); } } var result = CharacterRanges.Count; CharacterRanges.Add(new CharRange(range.Min, range.Max)); return(result); }
/// <summary> /// Total number of characters. /// </summary> public int GetCharacterCount() => CharacterRanges.Sum(r => r.End - r.Start + 1);
/// <summary> /// Add the given character ranges to this <see cref="FontAtlasEntry"/>. /// Ranges are merged when they overlap. /// </summary> /// <param name="ranges">The character ranges to add.</param> public void AddCharacterRanges(IEnumerable <Range <int> > ranges) { CharacterRanges.AddRange(ranges); NormalizeCharacterRanges(); }