TextAnimatorProperty.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. import {
  2. addSaturationToRGB,
  3. addBrightnessToRGB,
  4. addHueToRGB,
  5. } from '../common';
  6. import {
  7. extendPrototype,
  8. } from '../functionExtensions';
  9. import DynamicPropertyContainer from '../helpers/dynamicProperties';
  10. import {
  11. createSizedArray,
  12. } from '../helpers/arrays';
  13. import PropertyFactory from '../PropertyFactory';
  14. import bez from '../bez';
  15. import Matrix from '../../3rd_party/transformation-matrix';
  16. import TextAnimatorDataProperty from './TextAnimatorDataProperty';
  17. import LetterProps from './LetterProps';
  18. function TextAnimatorProperty(textData, renderType, elem) {
  19. this._isFirstFrame = true;
  20. this._hasMaskedPath = false;
  21. this._frameId = -1;
  22. this._textData = textData;
  23. this._renderType = renderType;
  24. this._elem = elem;
  25. this._animatorsData = createSizedArray(this._textData.a.length);
  26. this._pathData = {};
  27. this._moreOptions = {
  28. alignment: {},
  29. };
  30. this.renderedLetters = [];
  31. this.lettersChangedFlag = false;
  32. this.initDynamicPropertyContainer(elem);
  33. }
  34. TextAnimatorProperty.prototype.searchProperties = function () {
  35. var i;
  36. var len = this._textData.a.length;
  37. var animatorProps;
  38. var getProp = PropertyFactory.getProp;
  39. for (i = 0; i < len; i += 1) {
  40. animatorProps = this._textData.a[i];
  41. this._animatorsData[i] = new TextAnimatorDataProperty(this._elem, animatorProps, this);
  42. }
  43. if (this._textData.p && 'm' in this._textData.p) {
  44. this._pathData = {
  45. a: getProp(this._elem, this._textData.p.a, 0, 0, this),
  46. f: getProp(this._elem, this._textData.p.f, 0, 0, this),
  47. l: getProp(this._elem, this._textData.p.l, 0, 0, this),
  48. r: getProp(this._elem, this._textData.p.r, 0, 0, this),
  49. p: getProp(this._elem, this._textData.p.p, 0, 0, this),
  50. m: this._elem.maskManager.getMaskProperty(this._textData.p.m),
  51. };
  52. this._hasMaskedPath = true;
  53. } else {
  54. this._hasMaskedPath = false;
  55. }
  56. this._moreOptions.alignment = getProp(this._elem, this._textData.m.a, 1, 0, this);
  57. };
  58. TextAnimatorProperty.prototype.getMeasures = function (documentData, lettersChangedFlag) {
  59. this.lettersChangedFlag = lettersChangedFlag;
  60. if (!this._mdf && !this._isFirstFrame && !lettersChangedFlag && (!this._hasMaskedPath || !this._pathData.m._mdf)) {
  61. return;
  62. }
  63. this._isFirstFrame = false;
  64. var alignment = this._moreOptions.alignment.v;
  65. var animators = this._animatorsData;
  66. var textData = this._textData;
  67. var matrixHelper = this.mHelper;
  68. var renderType = this._renderType;
  69. var renderedLettersCount = this.renderedLetters.length;
  70. var xPos;
  71. var yPos;
  72. var i;
  73. var len;
  74. var letters = documentData.l;
  75. var pathInfo;
  76. var currentLength;
  77. var currentPoint;
  78. var segmentLength;
  79. var flag;
  80. var pointInd;
  81. var segmentInd;
  82. var prevPoint;
  83. var points;
  84. var segments;
  85. var partialLength;
  86. var totalLength;
  87. var perc;
  88. var tanAngle;
  89. var mask;
  90. if (this._hasMaskedPath) {
  91. mask = this._pathData.m;
  92. if (!this._pathData.n || this._pathData._mdf) {
  93. var paths = mask.v;
  94. if (this._pathData.r.v) {
  95. paths = paths.reverse();
  96. }
  97. // TODO: release bezier data cached from previous pathInfo: this._pathData.pi
  98. pathInfo = {
  99. tLength: 0,
  100. segments: [],
  101. };
  102. len = paths._length - 1;
  103. var bezierData;
  104. totalLength = 0;
  105. for (i = 0; i < len; i += 1) {
  106. bezierData = bez.buildBezierData(paths.v[i],
  107. paths.v[i + 1],
  108. [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]],
  109. [paths.i[i + 1][0] - paths.v[i + 1][0], paths.i[i + 1][1] - paths.v[i + 1][1]]);
  110. pathInfo.tLength += bezierData.segmentLength;
  111. pathInfo.segments.push(bezierData);
  112. totalLength += bezierData.segmentLength;
  113. }
  114. i = len;
  115. if (mask.v.c) {
  116. bezierData = bez.buildBezierData(paths.v[i],
  117. paths.v[0],
  118. [paths.o[i][0] - paths.v[i][0], paths.o[i][1] - paths.v[i][1]],
  119. [paths.i[0][0] - paths.v[0][0], paths.i[0][1] - paths.v[0][1]]);
  120. pathInfo.tLength += bezierData.segmentLength;
  121. pathInfo.segments.push(bezierData);
  122. totalLength += bezierData.segmentLength;
  123. }
  124. this._pathData.pi = pathInfo;
  125. }
  126. pathInfo = this._pathData.pi;
  127. currentLength = this._pathData.f.v;
  128. segmentInd = 0;
  129. pointInd = 1;
  130. segmentLength = 0;
  131. flag = true;
  132. segments = pathInfo.segments;
  133. if (currentLength < 0 && mask.v.c) {
  134. if (pathInfo.tLength < Math.abs(currentLength)) {
  135. currentLength = -Math.abs(currentLength) % pathInfo.tLength;
  136. }
  137. segmentInd = segments.length - 1;
  138. points = segments[segmentInd].points;
  139. pointInd = points.length - 1;
  140. while (currentLength < 0) {
  141. currentLength += points[pointInd].partialLength;
  142. pointInd -= 1;
  143. if (pointInd < 0) {
  144. segmentInd -= 1;
  145. points = segments[segmentInd].points;
  146. pointInd = points.length - 1;
  147. }
  148. }
  149. }
  150. points = segments[segmentInd].points;
  151. prevPoint = points[pointInd - 1];
  152. currentPoint = points[pointInd];
  153. partialLength = currentPoint.partialLength;
  154. }
  155. len = letters.length;
  156. xPos = 0;
  157. yPos = 0;
  158. var yOff = documentData.finalSize * 1.2 * 0.714;
  159. var firstLine = true;
  160. var animatorProps;
  161. var animatorSelector;
  162. var j;
  163. var jLen;
  164. var letterValue;
  165. jLen = animators.length;
  166. var mult;
  167. var ind = -1;
  168. var offf;
  169. var xPathPos;
  170. var yPathPos;
  171. var initPathPos = currentLength;
  172. var initSegmentInd = segmentInd;
  173. var initPointInd = pointInd;
  174. var currentLine = -1;
  175. var elemOpacity;
  176. var sc;
  177. var sw;
  178. var fc;
  179. var k;
  180. var letterSw;
  181. var letterSc;
  182. var letterFc;
  183. var letterM = '';
  184. var letterP = this.defaultPropsArray;
  185. var letterO;
  186. //
  187. if (documentData.j === 2 || documentData.j === 1) {
  188. var animatorJustifyOffset = 0;
  189. var animatorFirstCharOffset = 0;
  190. var justifyOffsetMult = documentData.j === 2 ? -0.5 : -1;
  191. var lastIndex = 0;
  192. var isNewLine = true;
  193. for (i = 0; i < len; i += 1) {
  194. if (letters[i].n) {
  195. if (animatorJustifyOffset) {
  196. animatorJustifyOffset += animatorFirstCharOffset;
  197. }
  198. while (lastIndex < i) {
  199. letters[lastIndex].animatorJustifyOffset = animatorJustifyOffset;
  200. lastIndex += 1;
  201. }
  202. animatorJustifyOffset = 0;
  203. isNewLine = true;
  204. } else {
  205. for (j = 0; j < jLen; j += 1) {
  206. animatorProps = animators[j].a;
  207. if (animatorProps.t.propType) {
  208. if (isNewLine && documentData.j === 2) {
  209. animatorFirstCharOffset += animatorProps.t.v * justifyOffsetMult;
  210. }
  211. animatorSelector = animators[j].s;
  212. mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);
  213. if (mult.length) {
  214. animatorJustifyOffset += animatorProps.t.v * mult[0] * justifyOffsetMult;
  215. } else {
  216. animatorJustifyOffset += animatorProps.t.v * mult * justifyOffsetMult;
  217. }
  218. }
  219. }
  220. isNewLine = false;
  221. }
  222. }
  223. if (animatorJustifyOffset) {
  224. animatorJustifyOffset += animatorFirstCharOffset;
  225. }
  226. while (lastIndex < i) {
  227. letters[lastIndex].animatorJustifyOffset = animatorJustifyOffset;
  228. lastIndex += 1;
  229. }
  230. }
  231. //
  232. for (i = 0; i < len; i += 1) {
  233. matrixHelper.reset();
  234. elemOpacity = 1;
  235. if (letters[i].n) {
  236. xPos = 0;
  237. yPos += documentData.yOffset;
  238. yPos += firstLine ? 1 : 0;
  239. currentLength = initPathPos;
  240. firstLine = false;
  241. if (this._hasMaskedPath) {
  242. segmentInd = initSegmentInd;
  243. pointInd = initPointInd;
  244. points = segments[segmentInd].points;
  245. prevPoint = points[pointInd - 1];
  246. currentPoint = points[pointInd];
  247. partialLength = currentPoint.partialLength;
  248. segmentLength = 0;
  249. }
  250. letterM = '';
  251. letterFc = '';
  252. letterSw = '';
  253. letterO = '';
  254. letterP = this.defaultPropsArray;
  255. } else {
  256. if (this._hasMaskedPath) {
  257. if (currentLine !== letters[i].line) {
  258. switch (documentData.j) {
  259. case 1:
  260. currentLength += totalLength - documentData.lineWidths[letters[i].line];
  261. break;
  262. case 2:
  263. currentLength += (totalLength - documentData.lineWidths[letters[i].line]) / 2;
  264. break;
  265. default:
  266. break;
  267. }
  268. currentLine = letters[i].line;
  269. }
  270. if (ind !== letters[i].ind) {
  271. if (letters[ind]) {
  272. currentLength += letters[ind].extra;
  273. }
  274. currentLength += letters[i].an / 2;
  275. ind = letters[i].ind;
  276. }
  277. currentLength += (alignment[0] * letters[i].an) * 0.005;
  278. var animatorOffset = 0;
  279. for (j = 0; j < jLen; j += 1) {
  280. animatorProps = animators[j].a;
  281. if (animatorProps.p.propType) {
  282. animatorSelector = animators[j].s;
  283. mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);
  284. if (mult.length) {
  285. animatorOffset += animatorProps.p.v[0] * mult[0];
  286. } else {
  287. animatorOffset += animatorProps.p.v[0] * mult;
  288. }
  289. }
  290. if (animatorProps.a.propType) {
  291. animatorSelector = animators[j].s;
  292. mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);
  293. if (mult.length) {
  294. animatorOffset += animatorProps.a.v[0] * mult[0];
  295. } else {
  296. animatorOffset += animatorProps.a.v[0] * mult;
  297. }
  298. }
  299. }
  300. flag = true;
  301. // Force alignment only works with a single line for now
  302. if (this._pathData.a.v) {
  303. currentLength = letters[0].an * 0.5 + ((totalLength - this._pathData.f.v - letters[0].an * 0.5 - letters[letters.length - 1].an * 0.5) * ind) / (len - 1);
  304. currentLength += this._pathData.f.v;
  305. }
  306. while (flag) {
  307. if (segmentLength + partialLength >= currentLength + animatorOffset || !points) {
  308. perc = (currentLength + animatorOffset - segmentLength) / currentPoint.partialLength;
  309. xPathPos = prevPoint.point[0] + (currentPoint.point[0] - prevPoint.point[0]) * perc;
  310. yPathPos = prevPoint.point[1] + (currentPoint.point[1] - prevPoint.point[1]) * perc;
  311. matrixHelper.translate((-alignment[0] * letters[i].an) * 0.005, -(alignment[1] * yOff) * 0.01);
  312. flag = false;
  313. } else if (points) {
  314. segmentLength += currentPoint.partialLength;
  315. pointInd += 1;
  316. if (pointInd >= points.length) {
  317. pointInd = 0;
  318. segmentInd += 1;
  319. if (!segments[segmentInd]) {
  320. if (mask.v.c) {
  321. pointInd = 0;
  322. segmentInd = 0;
  323. points = segments[segmentInd].points;
  324. } else {
  325. segmentLength -= currentPoint.partialLength;
  326. points = null;
  327. }
  328. } else {
  329. points = segments[segmentInd].points;
  330. }
  331. }
  332. if (points) {
  333. prevPoint = currentPoint;
  334. currentPoint = points[pointInd];
  335. partialLength = currentPoint.partialLength;
  336. }
  337. }
  338. }
  339. offf = letters[i].an / 2 - letters[i].add;
  340. matrixHelper.translate(-offf, 0, 0);
  341. } else {
  342. offf = letters[i].an / 2 - letters[i].add;
  343. matrixHelper.translate(-offf, 0, 0);
  344. // Grouping alignment
  345. matrixHelper.translate((-alignment[0] * letters[i].an) * 0.005, (-alignment[1] * yOff) * 0.01, 0);
  346. }
  347. for (j = 0; j < jLen; j += 1) {
  348. animatorProps = animators[j].a;
  349. if (animatorProps.t.propType) {
  350. animatorSelector = animators[j].s;
  351. mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);
  352. // This condition is to prevent applying tracking to first character in each line. Might be better to use a boolean "isNewLine"
  353. if (xPos !== 0 || documentData.j !== 0) {
  354. if (this._hasMaskedPath) {
  355. if (mult.length) {
  356. currentLength += animatorProps.t.v * mult[0];
  357. } else {
  358. currentLength += animatorProps.t.v * mult;
  359. }
  360. } else if (mult.length) {
  361. xPos += animatorProps.t.v * mult[0];
  362. } else {
  363. xPos += animatorProps.t.v * mult;
  364. }
  365. }
  366. }
  367. }
  368. if (documentData.strokeWidthAnim) {
  369. sw = documentData.sw || 0;
  370. }
  371. if (documentData.strokeColorAnim) {
  372. if (documentData.sc) {
  373. sc = [documentData.sc[0], documentData.sc[1], documentData.sc[2]];
  374. } else {
  375. sc = [0, 0, 0];
  376. }
  377. }
  378. if (documentData.fillColorAnim && documentData.fc) {
  379. fc = [documentData.fc[0], documentData.fc[1], documentData.fc[2]];
  380. }
  381. for (j = 0; j < jLen; j += 1) {
  382. animatorProps = animators[j].a;
  383. if (animatorProps.a.propType) {
  384. animatorSelector = animators[j].s;
  385. mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);
  386. if (mult.length) {
  387. matrixHelper.translate(-animatorProps.a.v[0] * mult[0], -animatorProps.a.v[1] * mult[1], animatorProps.a.v[2] * mult[2]);
  388. } else {
  389. matrixHelper.translate(-animatorProps.a.v[0] * mult, -animatorProps.a.v[1] * mult, animatorProps.a.v[2] * mult);
  390. }
  391. }
  392. }
  393. for (j = 0; j < jLen; j += 1) {
  394. animatorProps = animators[j].a;
  395. if (animatorProps.s.propType) {
  396. animatorSelector = animators[j].s;
  397. mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);
  398. if (mult.length) {
  399. matrixHelper.scale(1 + ((animatorProps.s.v[0] - 1) * mult[0]), 1 + ((animatorProps.s.v[1] - 1) * mult[1]), 1);
  400. } else {
  401. matrixHelper.scale(1 + ((animatorProps.s.v[0] - 1) * mult), 1 + ((animatorProps.s.v[1] - 1) * mult), 1);
  402. }
  403. }
  404. }
  405. for (j = 0; j < jLen; j += 1) {
  406. animatorProps = animators[j].a;
  407. animatorSelector = animators[j].s;
  408. mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);
  409. if (animatorProps.sk.propType) {
  410. if (mult.length) {
  411. matrixHelper.skewFromAxis(-animatorProps.sk.v * mult[0], animatorProps.sa.v * mult[1]);
  412. } else {
  413. matrixHelper.skewFromAxis(-animatorProps.sk.v * mult, animatorProps.sa.v * mult);
  414. }
  415. }
  416. if (animatorProps.r.propType) {
  417. if (mult.length) {
  418. matrixHelper.rotateZ(-animatorProps.r.v * mult[2]);
  419. } else {
  420. matrixHelper.rotateZ(-animatorProps.r.v * mult);
  421. }
  422. }
  423. if (animatorProps.ry.propType) {
  424. if (mult.length) {
  425. matrixHelper.rotateY(animatorProps.ry.v * mult[1]);
  426. } else {
  427. matrixHelper.rotateY(animatorProps.ry.v * mult);
  428. }
  429. }
  430. if (animatorProps.rx.propType) {
  431. if (mult.length) {
  432. matrixHelper.rotateX(animatorProps.rx.v * mult[0]);
  433. } else {
  434. matrixHelper.rotateX(animatorProps.rx.v * mult);
  435. }
  436. }
  437. if (animatorProps.o.propType) {
  438. if (mult.length) {
  439. elemOpacity += ((animatorProps.o.v) * mult[0] - elemOpacity) * mult[0];
  440. } else {
  441. elemOpacity += ((animatorProps.o.v) * mult - elemOpacity) * mult;
  442. }
  443. }
  444. if (documentData.strokeWidthAnim && animatorProps.sw.propType) {
  445. if (mult.length) {
  446. sw += animatorProps.sw.v * mult[0];
  447. } else {
  448. sw += animatorProps.sw.v * mult;
  449. }
  450. }
  451. if (documentData.strokeColorAnim && animatorProps.sc.propType) {
  452. for (k = 0; k < 3; k += 1) {
  453. if (mult.length) {
  454. sc[k] += (animatorProps.sc.v[k] - sc[k]) * mult[0];
  455. } else {
  456. sc[k] += (animatorProps.sc.v[k] - sc[k]) * mult;
  457. }
  458. }
  459. }
  460. if (documentData.fillColorAnim && documentData.fc) {
  461. if (animatorProps.fc.propType) {
  462. for (k = 0; k < 3; k += 1) {
  463. if (mult.length) {
  464. fc[k] += (animatorProps.fc.v[k] - fc[k]) * mult[0];
  465. } else {
  466. fc[k] += (animatorProps.fc.v[k] - fc[k]) * mult;
  467. }
  468. }
  469. }
  470. if (animatorProps.fh.propType) {
  471. if (mult.length) {
  472. fc = addHueToRGB(fc, animatorProps.fh.v * mult[0]);
  473. } else {
  474. fc = addHueToRGB(fc, animatorProps.fh.v * mult);
  475. }
  476. }
  477. if (animatorProps.fs.propType) {
  478. if (mult.length) {
  479. fc = addSaturationToRGB(fc, animatorProps.fs.v * mult[0]);
  480. } else {
  481. fc = addSaturationToRGB(fc, animatorProps.fs.v * mult);
  482. }
  483. }
  484. if (animatorProps.fb.propType) {
  485. if (mult.length) {
  486. fc = addBrightnessToRGB(fc, animatorProps.fb.v * mult[0]);
  487. } else {
  488. fc = addBrightnessToRGB(fc, animatorProps.fb.v * mult);
  489. }
  490. }
  491. }
  492. }
  493. for (j = 0; j < jLen; j += 1) {
  494. animatorProps = animators[j].a;
  495. if (animatorProps.p.propType) {
  496. animatorSelector = animators[j].s;
  497. mult = animatorSelector.getMult(letters[i].anIndexes[j], textData.a[j].s.totalChars);
  498. if (this._hasMaskedPath) {
  499. if (mult.length) {
  500. matrixHelper.translate(0, animatorProps.p.v[1] * mult[0], -animatorProps.p.v[2] * mult[1]);
  501. } else {
  502. matrixHelper.translate(0, animatorProps.p.v[1] * mult, -animatorProps.p.v[2] * mult);
  503. }
  504. } else if (mult.length) {
  505. matrixHelper.translate(animatorProps.p.v[0] * mult[0], animatorProps.p.v[1] * mult[1], -animatorProps.p.v[2] * mult[2]);
  506. } else {
  507. matrixHelper.translate(animatorProps.p.v[0] * mult, animatorProps.p.v[1] * mult, -animatorProps.p.v[2] * mult);
  508. }
  509. }
  510. }
  511. if (documentData.strokeWidthAnim) {
  512. letterSw = sw < 0 ? 0 : sw;
  513. }
  514. if (documentData.strokeColorAnim) {
  515. letterSc = 'rgb(' + Math.round(sc[0] * 255) + ',' + Math.round(sc[1] * 255) + ',' + Math.round(sc[2] * 255) + ')';
  516. }
  517. if (documentData.fillColorAnim && documentData.fc) {
  518. letterFc = 'rgb(' + Math.round(fc[0] * 255) + ',' + Math.round(fc[1] * 255) + ',' + Math.round(fc[2] * 255) + ')';
  519. }
  520. if (this._hasMaskedPath) {
  521. matrixHelper.translate(0, -documentData.ls);
  522. matrixHelper.translate(0, (alignment[1] * yOff) * 0.01 + yPos, 0);
  523. if (this._pathData.p.v) {
  524. tanAngle = (currentPoint.point[1] - prevPoint.point[1]) / (currentPoint.point[0] - prevPoint.point[0]);
  525. var rot = (Math.atan(tanAngle) * 180) / Math.PI;
  526. if (currentPoint.point[0] < prevPoint.point[0]) {
  527. rot += 180;
  528. }
  529. matrixHelper.rotate((-rot * Math.PI) / 180);
  530. }
  531. matrixHelper.translate(xPathPos, yPathPos, 0);
  532. currentLength -= (alignment[0] * letters[i].an) * 0.005;
  533. if (letters[i + 1] && ind !== letters[i + 1].ind) {
  534. currentLength += letters[i].an / 2;
  535. currentLength += (documentData.tr * 0.001) * documentData.finalSize;
  536. }
  537. } else {
  538. matrixHelper.translate(xPos, yPos, 0);
  539. if (documentData.ps) {
  540. // matrixHelper.translate(documentData.ps[0],documentData.ps[1],0);
  541. matrixHelper.translate(documentData.ps[0], documentData.ps[1] + documentData.ascent, 0);
  542. }
  543. switch (documentData.j) {
  544. case 1:
  545. matrixHelper.translate(letters[i].animatorJustifyOffset + documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[letters[i].line]), 0, 0);
  546. break;
  547. case 2:
  548. matrixHelper.translate(letters[i].animatorJustifyOffset + documentData.justifyOffset + (documentData.boxWidth - documentData.lineWidths[letters[i].line]) / 2, 0, 0);
  549. break;
  550. default:
  551. break;
  552. }
  553. matrixHelper.translate(0, -documentData.ls);
  554. matrixHelper.translate(offf, 0, 0);
  555. matrixHelper.translate((alignment[0] * letters[i].an) * 0.005, (alignment[1] * yOff) * 0.01, 0);
  556. xPos += letters[i].l + (documentData.tr * 0.001) * documentData.finalSize;
  557. }
  558. if (renderType === 'html') {
  559. letterM = matrixHelper.toCSS();
  560. } else if (renderType === 'svg') {
  561. letterM = matrixHelper.to2dCSS();
  562. } else {
  563. letterP = [matrixHelper.props[0], matrixHelper.props[1], matrixHelper.props[2], matrixHelper.props[3], matrixHelper.props[4], matrixHelper.props[5], matrixHelper.props[6], matrixHelper.props[7], matrixHelper.props[8], matrixHelper.props[9], matrixHelper.props[10], matrixHelper.props[11], matrixHelper.props[12], matrixHelper.props[13], matrixHelper.props[14], matrixHelper.props[15]];
  564. }
  565. letterO = elemOpacity;
  566. }
  567. if (renderedLettersCount <= i) {
  568. letterValue = new LetterProps(letterO, letterSw, letterSc, letterFc, letterM, letterP);
  569. this.renderedLetters.push(letterValue);
  570. renderedLettersCount += 1;
  571. this.lettersChangedFlag = true;
  572. } else {
  573. letterValue = this.renderedLetters[i];
  574. this.lettersChangedFlag = letterValue.update(letterO, letterSw, letterSc, letterFc, letterM, letterP) || this.lettersChangedFlag;
  575. }
  576. }
  577. };
  578. TextAnimatorProperty.prototype.getValue = function () {
  579. if (this._elem.globalData.frameId === this._frameId) {
  580. return;
  581. }
  582. this._frameId = this._elem.globalData.frameId;
  583. this.iterateDynamicProperties();
  584. };
  585. TextAnimatorProperty.prototype.mHelper = new Matrix();
  586. TextAnimatorProperty.prototype.defaultPropsArray = [];
  587. extendPrototype([DynamicPropertyContainer], TextAnimatorProperty);
  588. export default TextAnimatorProperty;