ScriptLang.cs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //MIT, 2016-present, WinterDev
  2. using System;
  3. namespace Typography.OpenFont
  4. {
  5. /// <summary>
  6. /// script tag and lang_feature tag request for GSUB, GPOS
  7. /// </summary>
  8. public readonly struct ScriptLang
  9. {
  10. /// <summary>
  11. /// script tag
  12. /// </summary>
  13. public readonly uint scriptTag;
  14. /// <summary>
  15. /// syslang tag
  16. /// </summary>
  17. public readonly uint sysLangTag;
  18. public ScriptLang(uint scriptTag, uint sysLangTag = 0)
  19. {
  20. this.scriptTag = scriptTag;
  21. this.sysLangTag = sysLangTag;
  22. }
  23. public ScriptLang(string scriptTag, string sysLangTag = null)
  24. {
  25. this.sysLangTag = (sysLangTag == null) ? 0 : StringToTag(sysLangTag);
  26. this.scriptTag = StringToTag(scriptTag);
  27. }
  28. #if DEBUG
  29. public override string ToString()
  30. {
  31. return TagToString(this.scriptTag) + ":" + TagToString(sysLangTag);
  32. }
  33. #endif
  34. public bool IsEmpty() => scriptTag == 0 && sysLangTag == 0;
  35. static byte GetByte(char c)
  36. {
  37. if (c >= 0 && c < 256)
  38. {
  39. return (byte)c;
  40. }
  41. return 0;
  42. }
  43. static uint StringToTag(string str)
  44. {
  45. if (string.IsNullOrEmpty(str) || str.Length != 4)
  46. {
  47. return 0;
  48. }
  49. char[] buff = str.ToCharArray();
  50. byte b0 = GetByte(buff[0]);
  51. byte b1 = GetByte(buff[1]);
  52. byte b2 = GetByte(buff[2]);
  53. byte b3 = GetByte(buff[3]);
  54. return (uint)((b0 << 24) | (b1 << 16) | (b2 << 8) | b3);
  55. }
  56. static string TagToString(uint tag)
  57. {
  58. byte[] bytes = BitConverter.GetBytes(tag);
  59. Array.Reverse(bytes);
  60. return System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length);
  61. }
  62. public string GetScriptTagString() => TagToString(this.scriptTag);
  63. public string GetLangTagString() => TagToString(this.sysLangTag);
  64. }
  65. }