CmFontDesc.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #pragma once
  2. #include "CmPrerequisites.h"
  3. namespace CamelotFramework
  4. {
  5. struct KerningPair
  6. {
  7. UINT32 otherCharId;
  8. INT32 amount;
  9. };
  10. struct CHAR_DESC
  11. {
  12. UINT32 charId;
  13. UINT32 page;
  14. float uvX, uvY;
  15. float uvWidth, uvHeight;
  16. UINT32 width, height;
  17. INT32 xOffset, yOffset;
  18. INT32 xAdvance, yAdvance;
  19. Vector<KerningPair>::type kerningPairs;
  20. };
  21. struct FONT_DESC
  22. {
  23. Map<UINT32, CHAR_DESC>::type characters;
  24. INT32 baselineOffset;
  25. UINT32 lineHeight;
  26. CHAR_DESC missingGlyph;
  27. UINT32 spaceWidth;
  28. };
  29. // Make CHAR_DESC serializable
  30. template<> struct RTTIPlainType<CHAR_DESC>
  31. {
  32. enum { id = TID_CHAR_DESC }; enum { hasDynamicSize = 1 };
  33. static void toMemory(const CHAR_DESC& data, char* memory)
  34. {
  35. UINT32 size = getDynamicSize(data);
  36. memcpy(memory, &size, sizeof(UINT32));
  37. memory += sizeof(UINT32);
  38. memory = rttiWriteElem(data.charId, memory);
  39. memory = rttiWriteElem(data.page, memory);
  40. memory = rttiWriteElem(data.uvX, memory);
  41. memory = rttiWriteElem(data.uvY, memory);
  42. memory = rttiWriteElem(data.uvWidth, memory);
  43. memory = rttiWriteElem(data.uvHeight, memory);
  44. memory = rttiWriteElem(data.width, memory);
  45. memory = rttiWriteElem(data.height, memory);
  46. memory = rttiWriteElem(data.xOffset, memory);
  47. memory = rttiWriteElem(data.yOffset, memory);
  48. memory = rttiWriteElem(data.xAdvance, memory);
  49. memory = rttiWriteElem(data.yAdvance, memory);
  50. memory = rttiWriteElem(data.kerningPairs, memory);
  51. }
  52. static UINT32 fromMemory(CHAR_DESC& data, char* memory)
  53. {
  54. UINT32 size;
  55. memcpy(&size, memory, sizeof(UINT32));
  56. memory += sizeof(UINT32);
  57. memory = rttiReadElem(data.charId, memory);
  58. memory = rttiReadElem(data.page, memory);
  59. memory = rttiReadElem(data.uvX, memory);
  60. memory = rttiReadElem(data.uvY, memory);
  61. memory = rttiReadElem(data.uvWidth, memory);
  62. memory = rttiReadElem(data.uvHeight, memory);
  63. memory = rttiReadElem(data.width, memory);
  64. memory = rttiReadElem(data.height, memory);
  65. memory = rttiReadElem(data.xOffset, memory);
  66. memory = rttiReadElem(data.yOffset, memory);
  67. memory = rttiReadElem(data.xAdvance, memory);
  68. memory = rttiReadElem(data.yAdvance, memory);
  69. memory = rttiReadElem(data.kerningPairs, memory);
  70. return size;
  71. }
  72. static UINT32 getDynamicSize(const CHAR_DESC& data)
  73. {
  74. UINT64 dataSize = sizeof(data.charId)
  75. + sizeof(data.page)
  76. + sizeof(data.uvX)
  77. + sizeof(data.uvY)
  78. + sizeof(data.uvWidth)
  79. + sizeof(data.uvHeight)
  80. + sizeof(data.width)
  81. + sizeof(data.height)
  82. + sizeof(data.xOffset)
  83. + sizeof(data.yOffset)
  84. + sizeof(data.xAdvance)
  85. + sizeof(data.yAdvance)
  86. + RTTIPlainType<Vector<KerningPair>::type>::getDynamicSize(data.kerningPairs);
  87. dataSize += sizeof(UINT32);
  88. return (UINT32)dataSize;
  89. }
  90. };
  91. // Make FONT_DESC serializable
  92. template<> struct RTTIPlainType<FONT_DESC>
  93. {
  94. enum { id = TID_FONT_DESC }; enum { hasDynamicSize = 1 };
  95. static void toMemory(const FONT_DESC& data, char* memory)
  96. {
  97. UINT32 size = getDynamicSize(data);
  98. memcpy(memory, &size, sizeof(UINT32));
  99. memory += sizeof(UINT32);
  100. RTTIPlainType<Map<UINT32, CHAR_DESC>::type>::toMemory(data.characters, memory);
  101. rttiWriteElem(data.baselineOffset, memory);
  102. rttiWriteElem(data.lineHeight, memory);
  103. rttiWriteElem(data.missingGlyph, memory);
  104. rttiWriteElem(data.spaceWidth, memory);
  105. }
  106. static UINT32 fromMemory(FONT_DESC& data, char* memory)
  107. {
  108. UINT32 size;
  109. memcpy(&size, memory, sizeof(UINT32));
  110. memory += sizeof(UINT32);
  111. RTTIPlainType<Map<UINT32, CHAR_DESC>::type>::fromMemory(data.characters, memory);
  112. rttiReadElem(data.baselineOffset, memory);
  113. rttiReadElem(data.lineHeight, memory);
  114. rttiReadElem(data.missingGlyph, memory);
  115. rttiReadElem(data.spaceWidth, memory);
  116. return size;
  117. }
  118. static UINT32 getDynamicSize(const FONT_DESC& data)
  119. {
  120. UINT64 dataSize = sizeof(UINT32);
  121. dataSize += RTTIPlainType<Map<UINT32, CHAR_DESC>::type>::getDynamicSize(data.characters);
  122. dataSize += rttiGetElemSize(data.baselineOffset);
  123. dataSize += rttiGetElemSize(data.lineHeight);
  124. dataSize += rttiGetElemSize(data.missingGlyph);
  125. dataSize += rttiGetElemSize(data.spaceWidth);
  126. return (UINT32)dataSize;
  127. }
  128. };
  129. }