FontInfo.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347
  1. import {MusicSymbol} from "./MusicSymbol";
  2. import {SizeF_2D} from "../../Common/DataObjects/SizeF_2D";
  3. import {PointF_2D} from "../../Common/DataObjects/PointF_2D";
  4. import {BoundingBox} from "./BoundingBox";
  5. export class FontInfo {
  6. protected static info: FontInfo = new FontInfo();
  7. protected symbolMapping: Dictionary<MusicSymbol, SymbolInfo> = new Dictionary<MusicSymbol, SymbolInfo>();
  8. constructor() {
  9. this.createSymbols();
  10. }
  11. public static get Info(): FontInfo {
  12. return FontInfo.info;
  13. }
  14. public updateSymbol(symbol: MusicSymbol, newSymbolInfo: SymbolInfo): void {
  15. this.symbolMapping[symbol] = newSymbolInfo;
  16. }
  17. public getSymbolInfo(symbol: MusicSymbol): SymbolInfo {
  18. try {
  19. return this.symbolMapping[symbol];
  20. }
  21. catch (ex) {
  22. Logging.debug("FontInfo.getSymbolInfo", ex);
  23. return new SymbolInfo();
  24. }
  25. }
  26. public getBoundingBox(symbol: MusicSymbol): SizeF_2D {
  27. try {
  28. return this.symbolMapping[symbol].boundingBox;
  29. }
  30. catch (ex) {
  31. Logging.debug("FontInfo.getBoundingBox", ex);
  32. return new SizeF_2D();
  33. }
  34. }
  35. public addBoundingBox(symbol: MusicSymbol, boundingBox: SizeF_2D): void {
  36. let si: SymbolInfo = this.symbolMapping[symbol];
  37. si.boundingBox = boundingBox;
  38. this.symbolMapping.Remove(symbol);
  39. this.symbolMapping.push(symbol, si);
  40. }
  41. public getCenterDistance(symbol: SymbolInfo): SizeF_2D {
  42. let symbolBox: SizeF_2D = symbol.boundingBox;
  43. let symbolCenter: PointF_2D = symbol.center;
  44. let centerDistance: SizeF_2D = new SizeF_2D(symbolBox.Width * symbolCenter.X, symbolBox.Height * symbolCenter.Y);
  45. return centerDistance;
  46. }
  47. public fillPSI(psi: BoundingBox, symbol: MusicSymbol): void {
  48. this.fillPSI(psi, symbol, 1.0);
  49. }
  50. public fillPSI(psi: BoundingBox, symbol: MusicSymbol, scaleFactor: number): void {
  51. let symbolInfo: SymbolInfo = this.symbolMapping[symbol];
  52. let symbolBox: SizeF_2D = symbolInfo.boundingBox;
  53. let symbolCenter: PointF_2D = symbolInfo.center;
  54. let centerDistance: SizeF_2D = new SizeF_2D(symbolBox.Width * symbolCenter.X, symbolBox.Height * symbolCenter.Y);
  55. let symbolMargins: SymbolMargins = symbolInfo.margins;
  56. psi.BorderLeft = -centerDistance.Width * scaleFactor;
  57. psi.BorderRight = (symbolBox.Width - centerDistance.Width) * scaleFactor;
  58. psi.BorderTop = -centerDistance.Height * scaleFactor;
  59. psi.BorderBottom = (symbolBox.Height - centerDistance.Height) * scaleFactor;
  60. psi.BorderMarginLeft = (-centerDistance.Width - symbolBox.Width * symbolMargins.left) * scaleFactor;
  61. psi.BorderMarginRight = (symbolBox.Width - centerDistance.Width + symbolBox.Width * symbolMargins.right) * scaleFactor;
  62. psi.BorderMarginTop = (-centerDistance.Height - symbolBox.Height * symbolMargins.top) * scaleFactor;
  63. psi.BorderMarginBottom = (symbolBox.Height - centerDistance.Height + symbolBox.Height * symbolMargins.bottom) * scaleFactor;
  64. }
  65. protected getString(symbol: MusicSymbol): string {
  66. try {
  67. return this.symbolMapping[symbol].symbol;
  68. }
  69. catch (ex) {
  70. Logging.debug("FontInfo.getString", ex);
  71. return undefined;
  72. }
  73. }
  74. protected getScaleFactor(symbol: MusicSymbol): number {
  75. try {
  76. return this.symbolMapping[symbol].scaleFactor;
  77. }
  78. catch (ex) {
  79. Logging.debug("FontInfo.getScaleFactor", ex);
  80. return -1F;
  81. }
  82. }
  83. private createSymbols(): void {
  84. let scaleVector: number[] = 1,1, 3, 3, 3,
  85. 3, 3, 3, 3,
  86. 3, 1, 1, 7,
  87. 3.5, 4, 1, 1,
  88. 2.0, 3.4,
  89. 0.6, 0.6, 3, 2,
  90. 3, 4, 5,
  91. 2.2, 2.55, 2.5, 2.2, 1,
  92. 2, 2, 2, 2,
  93. 2, 2, 2, 2,
  94. 2, 2, 0.4,
  95. 1, 1,
  96. 1, 0.2, 1, 1.5, 1.5,
  97. 0.75 * 2,
  98. 0.75 * 3,
  99. 0.75 * (1 + 1865.0 / 2680.0),
  100. 0.75 * (1 + 1865.0 / 2680.0),
  101. 0.75 * (1 + 1865.0 / 2680.0),
  102. 0.75 * (1 + 1865.0 / 2680.0),
  103. 2.7, 3.0,
  104. 2, 7.987, 7.987, 7.987, 7.987,
  105. 4.228, 4.228, 4.228, 4.228,
  106. 1.25, 0.75, 1.05, 0.85, 1.05,
  107. 1.1, 2, 1.9,
  108. 1.2, 1.2, 1.35, 1.2, 1.2,
  109. 1, 1.7, 1.8,
  110. 1.09, 0.77,
  111. 3.0;
  112. let centerVector: PointF_2D[] = new PointF_2D(0.5, 0.5),
  113. new PointF_2D(0.5, 0.5),
  114. new PointF_2D(0.0, 1.0),
  115. new PointF_2D(0.0, 0.0),
  116. new PointF_2D(0.0, 1.0),
  117. new PointF_2D(0.0, 0.0),
  118. new PointF_2D(0.0, 1.0),
  119. new PointF_2D(0.0, 0.0),
  120. new PointF_2D(0.0, 1.0),
  121. new PointF_2D(0.0, 0.0),
  122. new PointF_2D(0.5, 0.5),
  123. new PointF_2D(0.5, 0.5),
  124. new PointF_2D(500.0 / 940.0, 1660.0 / 2675.0),
  125. new PointF_2D(500.0 / 1830.0, 760.0 / 2680.0),
  126. new PointF_2D(0.5, 0.5),
  127. new PointF_2D(0.5, 0.5),
  128. new PointF_2D(0.5, 0.5),
  129. new PointF_2D(0.5, 0.5),
  130. new PointF_2D(0.5, 0.5),
  131. new PointF_2D(0.5, 0.5),
  132. new PointF_2D(0.5, 0.5),
  133. new PointF_2D(400.0 / 925.0, 1210.0 / 2680.0),
  134. new PointF_2D(400.0 / 1500.0, 360.0 / 2680.0),
  135. new PointF_2D(480.0 / 1190.0, 260.0 / 2680.0),
  136. new PointF_2D(510.0 / 1040.0, 190.0 / 2680.0),
  137. new PointF_2D(535.0 / 960.0, 160.0 / 2680.0),
  138. new PointF_2D(400.0 / 990.0, 1960.0 / 2680.0),
  139. new PointF_2D(0.5, 0.5),
  140. new PointF_2D(0.5, 0.5),
  141. new PointF_2D(785.0 / 1570.0, 1960.0 / 2680.0),
  142. new PointF_2D(0.5, 0.5),
  143. new PointF_2D(0.0, 0.0),
  144. new PointF_2D(0.0, 0.0),
  145. new PointF_2D(0.0, 0.0),
  146. new PointF_2D(0.0, 0.0),
  147. new PointF_2D(0.0, 0.0),
  148. new PointF_2D(0.0, 0.0),
  149. new PointF_2D(0.0, 0.0),
  150. new PointF_2D(0.0, 0.0),
  151. new PointF_2D(0.0, 0.0),
  152. new PointF_2D(0.0, 0.0),
  153. new PointF_2D(0.5, 0.5),
  154. new PointF_2D(2880.0 / 5760.0, 2250.0 / 2680.0),
  155. new PointF_2D(2850.0 / 5700.0, 1810.0 / 2680.0),
  156. new PointF_2D(450.0 / 900.0, 1560.0 / 2680.0),
  157. new PointF_2D(5250.0 / 10500.0, 1340.0 / 2680.0),
  158. new PointF_2D(1787.0 / 3574.0, 1340.0 / 2680.0),
  159. new PointF_2D(872.0 / 1744.0, 1340.0 / 2680.0),
  160. new PointF_2D(872.0 / 1744.0, 1340.0 / 2680.0),
  161. new PointF_2D(1500.0 / 3000.0, 1865.0 / 2680.0),
  162. new PointF_2D(1100.0 / 2200.0, 1865.0 / 2680.0),
  163. new PointF_2D(1000.0 / 2000.0, 2680.0 / 2680.0),
  164. new PointF_2D(1250.0 / 2500.0, 2680.0 / 2680.0),
  165. new PointF_2D(2330.0 / 4660.0, 2680.0 / 2680.0),
  166. new PointF_2D(1430.0 / 2860.0, 2680.0 / 2680.0),
  167. new PointF_2D(0.5, 0.5),
  168. new PointF_2D(0.5, 0.5),
  169. new PointF_2D(0.5, 0.5),
  170. new PointF_2D(0.63, 0.5448),
  171. new PointF_2D(0.63, 0.667),
  172. new PointF_2D(0.63, 0.5448),
  173. new PointF_2D(0.63, 0.667),
  174. new PointF_2D(0.2, 0.224),
  175. new PointF_2D(0.2, 0.4067),
  176. new PointF_2D(0.2, 0.224),
  177. new PointF_2D(0.2, 0.4067),
  178. new PointF_2D(0.5, 0.653),
  179. new PointF_2D(0.5, 0.5),
  180. new PointF_2D(0.5, 0.5),
  181. new PointF_2D(0.5, 0.5),
  182. new PointF_2D(0.5, 0.5),
  183. new PointF_2D(0.5, 0.5),
  184. new PointF_2D(0.52, 0.925),
  185. new PointF_2D(0.5, 1),
  186. new PointF_2D(0.5, 0.5),
  187. new PointF_2D(0.5, 0.5),
  188. new PointF_2D(0.5, 0.5),
  189. new PointF_2D(0.5, 0.5),
  190. new PointF_2D(0.5, 0.5),
  191. new PointF_2D(0.5, 0.5),
  192. new PointF_2D(0.5, 0.5),
  193. new PointF_2D(0.5, 0.5),
  194. new PointF_2D(0.5, 0.634),
  195. new PointF_2D(0.5, 0.5),
  196. new PointF_2D(0.5, 0.5);
  197. let marginVector: SymbolMargins[] = new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  198. new SymbolMargins(0.1, 0.1),
  199. new SymbolMargins(0.1, 0.1),
  200. new SymbolMargins(0.1, 0.1),
  201. new SymbolMargins(0.1, 0.1),
  202. new SymbolMargins(0.1, 0.1),
  203. new SymbolMargins(0.1, 0.1),
  204. new SymbolMargins(0.1, 0.1),
  205. new SymbolMargins(0.1, 0.1),
  206. new SymbolMargins(0.1, 0.1),
  207. new SymbolMargins(0.1, 0.1),
  208. new SymbolMargins(0.1, 0.1),
  209. new SymbolMargins(0.05, 0.05, 0.05, 0.05),
  210. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  211. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  212. new SymbolMargins(0.1, 0.1),
  213. new SymbolMargins(0.1, 0.1),
  214. new SymbolMargins(0.1, 0.1),
  215. new SymbolMargins(0.1, 0.1),
  216. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  217. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  218. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  219. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  220. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  221. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  222. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  223. new SymbolMargins(0.1, 0.1, 0.05, 0.05),
  224. new SymbolMargins(0.1, 0.1, 0.05, 0.05),
  225. new SymbolMargins(0.1, 0.1, 0.05, 0.05),
  226. new SymbolMargins(0.05, 0.05, 0.05, 0.05),
  227. new SymbolMargins(0.1, 0.1),
  228. new SymbolMargins(0.2, 0.2),
  229. new SymbolMargins(0.2, 0.2),
  230. new SymbolMargins(0.2, 0.2),
  231. new SymbolMargins(0.2, 0.2),
  232. new SymbolMargins(0.2, 0.2),
  233. new SymbolMargins(0.2, 0.2),
  234. new SymbolMargins(0.2, 0.2),
  235. new SymbolMargins(0.2, 0.2),
  236. new SymbolMargins(0.2, 0.2),
  237. new SymbolMargins(0.2, 0.2),
  238. new SymbolMargins(0.7, 0.7, 0.7, 0.7),
  239. new SymbolMargins(0.2, 0.2, 0.3, 0.3),
  240. new SymbolMargins(0.2, 0.2, 0.3, 0.3),
  241. new SymbolMargins(0.1, 0.1, 0.2, 0.2),
  242. new SymbolMargins(0.1, 0.1, 1.0, 1.0),
  243. new SymbolMargins(0.1, 0.1, 0.2, 0.2),
  244. new SymbolMargins(0.3, 0.3, 0.2, 0.2),
  245. new SymbolMargins(0.3, 0.3, 0.2, 0.2),
  246. new SymbolMargins(0.0, 0.0, 0.2, 0.2),
  247. new SymbolMargins(0.0, 0.0, 0.2, 0.2),
  248. new SymbolMargins(0.0, 0.0, 0.2, 0.2),
  249. new SymbolMargins(0.0, 0.0, 0.2, 0.2),
  250. new SymbolMargins(0.0, 0.0, 0.2, 0.2),
  251. new SymbolMargins(0.0, 0.0, 0.2, 0.2),
  252. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  253. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  254. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  255. new SymbolMargins(0.05, 0.05, 0.05, 0.05),
  256. new SymbolMargins(0.05, 0.05, 0.05, 0.05),
  257. new SymbolMargins(0.05, 0.05, 0.05, 0.05),
  258. new SymbolMargins(0.05, 0.05, 0.05, 0.05),
  259. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  260. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  261. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  262. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  263. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  264. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  265. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  266. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  267. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  268. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  269. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  270. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  271. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  272. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  273. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  274. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  275. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  276. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  277. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  278. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  279. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  280. new SymbolMargins(0.1, 0.1, 0.1, 0.1),
  281. new SymbolMargins(0.1, 0.1, 0.1, 0.1);
  282. let values: Array = Enum.GetValues(/*typeof*/MusicSymbol);
  283. let i: number = 0;
  284. for (let c: string = <string>0x21; c <<string>0x21 + values.Length; c++) {
  285. let si: SymbolInfo = new SymbolInfo(c.ToString(), i, scaleVector[i], centerVector[i], marginVector[i]);
  286. this.symbolMapping.push(<MusicSymbol>values.GetValue(i), si);
  287. i++;
  288. }
  289. }
  290. }
  291. export class SymbolInfo {
  292. public symbol: string;
  293. public id: number;
  294. public scaleFactor: number;
  295. public boundingBox: SizeF_2D;
  296. public center: PointF_2D;
  297. public margins: SymbolMargins;
  298. constructor(symbol: string, id: number, scaleFactor: number, center: PointF_2D, margins: SymbolMargins) {
  299. this();
  300. this.symbol = symbol;
  301. this.id = id;
  302. this.scaleFactor = scaleFactor;
  303. this.center = center;
  304. this.margins = margins;
  305. }
  306. public get ScaleFactor(): number {
  307. return this.scaleFactor;
  308. }
  309. public set ScaleFactor(value: number) {
  310. this.scaleFactor = value;
  311. }
  312. public get BoundingBox(): SizeF_2D {
  313. return this.boundingBox;
  314. }
  315. public set BoundingBox(value: SizeF_2D) {
  316. this.boundingBox = value;
  317. }
  318. public get Center(): PointF_2D {
  319. return this.center;
  320. }
  321. public set Center(value: PointF_2D) {
  322. this.center = value;
  323. }
  324. public get Margins(): SymbolMargins {
  325. return this.margins;
  326. }
  327. public set Margins(value: SymbolMargins) {
  328. this.margins = value;
  329. }
  330. }
  331. export class SymbolMargins {
  332. public left: number;
  333. public right: number;
  334. public top: number;
  335. public bottom: number;
  336. constructor(left: number, right: number, top: number = 0, bottom: number = 0) {
  337. this.left = left;
  338. this.right = right;
  339. this.top = top;
  340. this.bottom = bottom;
  341. }
  342. }