CmFontDesc.h 4.0 KB

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