TextSource.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System.Text;
  2. namespace FontStashSharp
  3. {
  4. internal ref struct TextSource
  5. {
  6. public StringSegment StringText;
  7. public StringBuilder StringBuilderText;
  8. private int Position;
  9. public TextSource(string text)
  10. {
  11. StringText = new StringSegment(text);
  12. StringBuilderText = null;
  13. Position = 0;
  14. }
  15. public TextSource(StringSegment text)
  16. {
  17. StringText = text;
  18. StringBuilderText = null;
  19. Position = 0;
  20. }
  21. public TextSource(StringBuilder text)
  22. {
  23. StringText = new StringSegment();
  24. StringBuilderText = text;
  25. Position = 0;
  26. }
  27. public bool IsNull => StringText.IsNullOrEmpty && StringBuilderText == null;
  28. public bool GetNextCodepoint(out int result)
  29. {
  30. result = 0;
  31. if (!StringText.IsNullOrEmpty)
  32. {
  33. if (Position >= StringText.Length)
  34. {
  35. return false;
  36. }
  37. result = char.ConvertToUtf32(StringText.String, StringText.Offset + Position);
  38. Position += char.IsSurrogatePair(StringText.String, StringText.Offset + Position) ? 2 : 1;
  39. return true;
  40. }
  41. if (StringBuilderText != null)
  42. {
  43. if (Position >= StringBuilderText.Length)
  44. {
  45. return false;
  46. }
  47. result = StringBuilderConvertToUtf32(StringBuilderText, Position);
  48. Position += StringBuilderIsSurrogatePair(StringBuilderText, Position) ? 2 : 1;
  49. return true;
  50. }
  51. return false;
  52. }
  53. public void Reset()
  54. {
  55. Position = 0;
  56. }
  57. private static bool StringBuilderIsSurrogatePair(StringBuilder sb, int index)
  58. {
  59. if (index + 1 < sb.Length)
  60. return char.IsSurrogatePair(sb[index], sb[index + 1]);
  61. return false;
  62. }
  63. private static int StringBuilderConvertToUtf32(StringBuilder sb, int index)
  64. {
  65. if (!char.IsHighSurrogate(sb[index]))
  66. return sb[index];
  67. return char.ConvertToUtf32(sb[index], sb[index + 1]);
  68. }
  69. }
  70. }