Compare commits

...

419 Commits

Author SHA1 Message Date
ebed729f13 Refactoring 2026-01-19 13:04:45 +03:00
7146c08ef4 Refactoring 2026-01-12 22:03:11 +03:00
5ae071fa19 Added charts reading in HWP 2025-12-25 03:36:19 +03:00
f75cc7fe0f Added the basis for charts in hwp 2025-12-22 20:00:44 +03:00
deff23eaac Merge pull request 'Fix bugs' (#581) from fix/svg into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/581
2025-12-22 12:58:25 +00:00
db2a9e88a1 Merge pull request 'Fix bug 79153' (#580) from fix/bug-79153 into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/580
2025-12-22 10:11:01 +00:00
a8fe05fb6a Fix bug 79153 2025-12-22 12:15:15 +03:00
41d79b0df6 Merge pull request 'Fix bug 79082' (#578) from fix/bug-79082 into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/578
2025-12-19 10:11:19 +00:00
2330f1dae8 Fix unicode=code when isCIDFont 2025-12-19 13:02:53 +03:00
8f108582b9 Fix bug 79082 2025-12-19 12:42:44 +03:00
6c6d575908 Merge pull request 'Fix bug 79141' (#577) from fix/bug-79141 into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/577
2025-12-19 07:41:26 +00:00
14dd41a2a2 Fix bug 79141 2025-12-19 10:24:42 +03:00
c7e1250287 Merge pull request 'fix text paragraph conversion' (#508) from fix/TextStyle into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/508
2025-12-18 14:53:16 +00:00
dc6ca55b57 For bug 79141 2025-12-18 16:07:37 +03:00
fba3767e36 Merge pull request 'add tsv conversion support' (#576) from feature/add-tsv-conversion into release/v9.3.0
fix bug #47231
2025-12-18 09:42:13 +00:00
7b8eae26c1 add tsv conversion support 2025-12-18 14:51:55 +06:00
c445c0444d Merge pull request 'fix linux build' (#575) from fix/linux-build into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/575
2025-12-18 08:09:58 +00:00
94edfff846 fix linux build 2025-12-18 14:02:42 +06:00
43ba8fca21 fix bug #71085 2025-12-17 17:30:51 +03:00
f38759d071 Refactoring 2025-12-17 17:29:48 +03:00
52e47745de Added the latex formula processing flag in md 2025-12-17 14:49:11 +03:00
554d3d0dfd Fix bug in html 2025-12-17 14:48:15 +03:00
d21b44a0b8 Merge pull request 'Fix libfont' (#574) from fix/libfont into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/574
2025-12-17 11:23:53 +00:00
0da5ad2f48 Fix libfont 2025-12-17 14:19:57 +03:00
8611c5f781 Fix build 2025-12-17 12:39:12 +03:00
5089a76b43 Merge pull request 'Feature docx-renderer' (#573) from feature/docx-renderer into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/573
2025-12-17 08:14:05 +00:00
a8678c5d10 Add _GetGIDByUnicode 2025-12-17 11:10:22 +03:00
ac5c7d6d76 refactoring 2025-12-16 17:09:33 +03:00
080ae0d924 Merge remote-tracking branch 'origin/hotfix/v9.2.1' into release/v9.3.0 2025-12-16 16:10:00 +03:00
77c9bd8c6d Merge pull request 'fix rotWithShape' (#572) from fix/fix-bugs into hotfix/v9.2.1 2025-12-16 13:09:35 +00:00
8144f98bb8 fix rotWithShape 2025-12-16 16:08:23 +03:00
aec1220bff Create GetGIDByUnicode 2025-12-16 15:41:14 +03:00
3e78043cdd Merge pull request 'fix xls conversion' (#571) from fix/xls-conversion into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/571
2025-12-16 07:37:49 +00:00
0319918827 fix xls conversion 2025-12-16 13:33:30 +06:00
80d8f4b12e Merge remote-tracking branch 'origin/hotfix/v9.2.1' into release/v9.3.0 2025-12-16 10:29:05 +03:00
c52cfd0886 Merge pull request 'fix bug #78986' (#570) from fix/bug78986 into hotfix/v9.2.1
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/570
2025-12-15 18:09:15 +00:00
4c9a24bf71 fix bug #78986 2025-12-15 21:07:19 +03:00
9ece4889a1 Add ordering for any object 2025-12-15 13:28:16 +03:00
00c24f9d68 Add fix with two lines in paragraph 2025-12-15 12:10:43 +03:00
0223b1beab Fix missprint 2025-12-12 16:20:42 +03:00
5c15b76598 Merge branch 'release/v9.3.0' of https://git.onlyoffice.com/ONLYOFFICE/core into release/v9.3.0 2025-12-12 14:57:04 +03:00
72315df901 Merge pull request 'Fix bug 78919' (#569) from fix/bug-78919 into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/569
2025-12-12 11:19:15 +00:00
cb0e361490 Fix bug 78919 2025-12-12 14:08:52 +03:00
db279bd725 Merge branch 'release/v9.3.0' of https://git.onlyoffice.com/ONLYOFFICE/core into release/v9.3.0 2025-12-12 12:21:50 +03:00
40c4c922c1 Merge pull request 'fix xls record size check' (#568) from fix/record-size-check into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/568
2025-12-12 09:18:33 +00:00
67f287f30f fix xls record size check 2025-12-12 14:58:43 +06:00
964a44ed93 . 2025-12-11 19:51:50 +03:00
57984ca8a2 Merge branch 'hotfix/v9.2.1' into release/v9.3.0 2025-12-11 17:05:36 +03:00
a30f7dfdf4 Merge pull request 'Fix bug 65734' (#567) from fix/bug65734 into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/567
2025-12-11 14:04:21 +00:00
b369c32e9e fix value array xlsx 2025-12-11 17:03:42 +03:00
40a4fa1a92 Fix bug 65734 2025-12-11 17:02:56 +03:00
2779542061 Merge branch 'hotfix/v9.2.1' into release/v9.3.0 2025-12-11 11:20:23 +03:00
3209c8e42e Merge pull request 'fix/fix-bugs-9.2.1' (#566) from fix/fix-bugs-9.2.1 into hotfix/v9.2.1
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/566
2025-12-11 08:16:12 +00:00
037057ea7a fix bug #78960
(cherry picked from commit bebb39a619)
2025-12-11 11:13:01 +03:00
d373a8cc4c fix bug #78953
(cherry picked from commit 84847f1e74)
2025-12-11 11:09:34 +03:00
13e2efe724 fix bug #78955
(cherry picked from commit 6ea64599bd)
2025-12-11 11:08:56 +03:00
b09d441987 fix bug #78958
(cherry picked from commit e15391ea35)
2025-12-11 11:06:44 +03:00
9e835d5cc1 Merge pull request 'For bug 79029' (#565) from fix/bug-79029 into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/565
2025-12-11 07:24:25 +00:00
f75df05824 Fix SetDV for radiobutton 2025-12-11 10:14:13 +03:00
0d6d273573 Fix bug #74628 2025-12-10 19:07:26 +03:00
d7a1642a62 Merge pull request 'Fix bug 79005' (#564) from fixbugs/rtf into release/v9.3.0 2025-12-10 15:12:28 +00:00
d74899a116 Fix bug 79005 2025-12-10 18:08:20 +03:00
d0dfd6737c [x2t] Add m_sSigningKeyStorePath to params.xml and SIGNING_KEYSTORE_PASSPHRASE to env for pdf 2025-12-10 16:50:43 +03:00
cec10b7058 Fix problem with shape top and height 2025-12-10 15:58:50 +03:00
47258d9c30 Fix typo 2025-12-10 15:23:29 +03:00
10ab7009a1 Refactoring 2025-12-10 15:23:22 +03:00
3623b0970b Merge pull request 'Fix bug 78932' (#563) from fix/bug-78932 into release/v9.3.0
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/563
2025-12-10 11:38:48 +00:00
7ecab52601 Add Ascent/Descent bot and top in shape form 2025-12-10 12:54:01 +03:00
9fedabc0e2 Fix write Opt radiobutton at child 2025-12-10 12:46:52 +03:00
fa46455e74 Fix Opt radiobutton at child 2025-12-10 12:19:26 +03:00
9dacd4a548 Merge pull request 'fix bug #54521' (#562) from fix/bug54521 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/562
2025-12-10 09:17:46 +00:00
e815f39905 Fix bug 2025-12-10 12:04:57 +03:00
fb8a72cd6b fix bug #54521 2025-12-10 15:01:52 +06:00
ad6113cf21 Fix bugs 2025-12-10 11:50:57 +03:00
11914f8dc2 Fix non-collecting meta-info 2025-12-10 11:30:22 +03:00
50b2656c44 Change comment 2025-12-10 11:12:29 +03:00
39235f7fd6 Add ignoring meta-info in covertion and add bFontSubstitution 2025-12-10 11:10:22 +03:00
61311457be Merge pull request 'fix bug #78958' (#561) from fix/bug78958 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/561
2025-12-09 12:33:45 +00:00
e15391ea35 fix bug #78958 2025-12-09 16:43:05 +06:00
fefeb483e5 Fix bug 78932 2025-12-09 12:56:53 +03:00
e31e02d993 Font substitution info 2025-12-09 10:42:13 +03:00
5c7ef5a6eb add rdValueData 2025-12-08 23:42:44 +03:00
fc110a004d Merge remote-tracking branch 'origin/feature/pdf-link' into develop 2025-12-08 11:33:57 +03:00
12d33fad53 Merge remote-tracking branch 'origin/develop' into feature/pdf-link 2025-12-08 11:31:42 +03:00
2534d2b5c9 Fix swap rectangle 2025-12-08 11:20:59 +03:00
7019b192bd Merge pull request 'fix bug #78955' (#558) from fix/bug78955 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/558
2025-12-05 14:30:49 +00:00
ac97a5680b Merge pull request 'fix bug #78960' (#559) from fix/bug78960 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/559
2025-12-05 14:24:41 +00:00
bebb39a619 fix bug #78960 2025-12-05 20:10:56 +06:00
d014383a6d Merge pull request 'fix/bug59965' (#557) from fix/bug45616 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/557
2025-12-05 13:45:12 +00:00
6422ce7f78 Fix bugs in html 2025-12-05 15:55:23 +03:00
31f7136f70 Fix bug #78915 2025-12-05 14:05:19 +03:00
f2023f626b fix/bug59965
fix bug #59965
2025-12-05 13:57:34 +03:00
6ea64599bd fix bug #78955 2025-12-05 16:09:45 +06:00
d1d94f481d . 2025-12-04 18:49:57 +03:00
82eb921f05 Merge pull request 'fix bug #78953' (#556) from fix/bug78953 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/556
2025-12-04 15:22:13 +00:00
84847f1e74 fix bug #78953 2025-12-04 21:19:39 +06:00
eab6d5530b Fix build 2025-12-04 11:43:56 +03:00
8391667147 Merge pull request 'Fix bug #48033' (#554) from fix/rtf into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/554
2025-12-03 14:26:26 +00:00
b8748e40d5 Merge pull request 'release/v9.2.0' (#555) from release/v9.2.0 into feature/docx-renderer
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/555
2025-12-03 12:48:30 +00:00
39da47bc21 Fix bug #48033 2025-12-03 12:57:51 +03:00
3a201b8b28 Merge pull request 'fix bug #78778' (#553) from fix/bug78778 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/553
2025-12-02 14:04:25 +00:00
bbfbe4a149 Merge remote-tracking branch 'origin/fix/bug-78854' into develop 2025-12-02 16:28:20 +03:00
0c1c57ccb3 Fix bug 78854 2025-12-02 16:27:25 +03:00
fa532edad6 Deferred Link resolution 2025-12-02 15:10:49 +03:00
df82306306 Merge remote-tracking branch 'origin/develop' into feature/pdf-link 2025-12-02 12:59:10 +03:00
7a3464b985 Fix test 2025-12-02 12:56:54 +03:00
49924e23ac AcroForm at the beginning 2025-12-02 12:56:07 +03:00
1eaac39e48 . 2025-12-01 22:34:28 +03:00
7624e24027 Merge remote-tracking branch 'origin/master' into develop 2025-12-01 21:53:15 +03:00
44ffa4b72e For bug 78854 2025-12-01 19:59:30 +03:00
10bdf2703a Merge pull request 'fix/bug69510' (#552) from fix/bug69510 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/552
2025-12-01 16:09:59 +00:00
c488384dbc fix/bug69510
fix bug #69510
2025-12-01 18:57:08 +03:00
cd80bca553 Fix fill with context color in svg 2025-12-01 16:49:44 +03:00
6e49670513 Implemented support for the BaselineShift property in svg 2025-12-01 16:13:49 +03:00
b1b3e1fb7c Merge branch release/v9.2.0 into master 2025-12-01 07:25:12 +00:00
d78487e0f5 . 2025-11-29 12:25:03 +03:00
5069b68247 fix build 2025-11-28 20:46:03 +03:00
31433e20de Fix year detection on windows 2025-11-28 19:55:26 +03:00
86d0d2113e . 2025-11-28 17:30:28 +03:00
8f2b4e4153 Merge remote-tracking branch 'origin/feature/add-xls-writing' into develop 2025-11-28 15:03:05 +03:00
0be867c47d for bug #78766 2025-11-28 15:02:03 +03:00
78aae7e9d0 Merge pull request 'fix/bug76076' (#551) from fix/bug76076 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/551
2025-11-28 11:58:23 +00:00
10e63543dc Merge pull request 'fix bug #77811' (#550) from fix/bug77811 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/550
2025-11-28 11:57:22 +00:00
900cf01902 Merge pull request 'fix bug #78487' (#549) from fix/bug78487 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/549
2025-11-28 11:56:50 +00:00
f6a52876ce Fix bug 78801 2025-11-27 18:26:36 +03:00
45ad566eb1 Merge pull request 'Fix bug #75486' (#548) from fix/rtf into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/548
2025-11-27 15:09:08 +00:00
5bbea51848 Fix bug #75486 2025-11-27 18:07:12 +03:00
28a1828000 fix bug #78778 2025-11-27 17:43:59 +06:00
816430e0e2 Generate doctrenderer embed 2025-11-27 13:40:37 +03:00
29a29cc818 Fix bug 78786 2025-11-27 13:37:05 +03:00
bf66c1d9c0 fix bug #78766 2025-11-27 11:39:26 +03:00
2a3982a884 Merge pull request 'Fix bug #69318' (#546) from fix/rtf into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/546
2025-11-27 08:12:46 +00:00
b5fb8a34dc fix shared formulas conversion 2025-11-26 19:54:45 +06:00
11f0c937f4 Fix bug #69318 2025-11-26 16:28:07 +03:00
5e435d322f Merge branch 'develop' into feature/add-xls-writing 2025-11-26 17:03:08 +06:00
842d17f79e Merge pull request 'fix/bug37832' (#543) from fix/bug37832 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/543
2025-11-25 13:55:07 +00:00
d48a28fe1d Fix Redact merge image&form 2025-11-25 16:42:16 +03:00
2a22c5e1f3 fix/bug37832
fix bug #37832
2025-11-25 15:30:06 +03:00
629a35213e Merge remote-tracking branch 'origin/release/v9.2.0' into develop 2025-11-24 22:30:18 +03:00
a056b2e4a9 Merge pull request 'Fix direction determination' (#540) from fix/boolean-op into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/540
2025-11-24 14:46:42 +00:00
2dd35a7d81 Fix direction determination 2025-11-24 17:31:01 +03:00
080d89c8a0 Merge remote-tracking branch 'origin/fix/bug69510' into develop 2025-11-24 15:57:45 +03:00
1809f7f4c2 Merge remote-tracking branch 'origin/fix/pdf-redact' into develop 2025-11-24 15:16:17 +03:00
4bfd4f0a08 Fix Encrypt with Redact 2025-11-24 15:13:35 +03:00
3ef5651dfd fix/bug69510
fix bug #69510
2025-11-24 14:52:55 +03:00
8231809ef0 fix bug #78487 2025-11-24 16:42:46 +06:00
7f3d073d63 Fix hierarchy of heading levels 2025-11-24 13:12:55 +03:00
5f09e91944 . 2025-11-23 12:39:22 +03:00
f4359e0b7f no message 2025-11-22 17:25:10 +03:00
ca9cf4ee61 . 2025-11-21 16:58:09 +03:00
f52538f66a . 2025-11-21 15:52:56 +03:00
15359be125 fix bug #77811 2025-11-21 16:10:49 +06:00
fc2a12c6f2 Merge remote-tracking branch 'origin/fix/bug69510' into develop 2025-11-21 10:34:42 +03:00
42030372fe fix logging 2025-11-21 10:29:36 +03:00
bbf6c2d8e9 fix/bug69510
fix bug #69510
2025-11-20 23:42:25 +03:00
cb15cc18eb Merge pull request 'fix/bug69510' (#538) from fix/bug69510 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/538
2025-11-20 11:46:32 +00:00
389bf976a9 fix/bug69510
fix bug #69510
2025-11-20 14:41:10 +03:00
4d1b516cc9 Merge remote-tracking branch 'origin/feature/pdf-password' into develop 2025-11-20 13:28:08 +03:00
600a59c966 Fix Open with owner password 2025-11-20 13:11:37 +03:00
66b2f3c828 Fix bug 78602 2025-11-20 12:48:09 +03:00
64e077da19 For bug 76845 2025-11-20 12:08:43 +03:00
499fe52b8c Merge remote-tracking branch 'origin/release/v9.2.0' into develop 2025-11-20 11:31:17 +03:00
6f9c376040 Create CheckPerm 2025-11-20 10:41:43 +03:00
1e18352e77 Create CheckOwnerPassword 2025-11-19 18:23:23 +03:00
c3f4f32702 fix read alternative drawing 2025-11-19 18:17:33 +03:00
6df7a7e01e Merge pull request 'Fix bug #53908' (#534) from fix/rtf into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/534
2025-11-19 13:54:00 +00:00
6167f23a08 Fix bug #53908 2025-11-19 15:36:42 +03:00
7c544729bc Fix drawForm 2025-11-19 13:23:51 +03:00
d60c102dbb fix xlst->xlsb conversion 2025-11-18 19:41:06 +06:00
d709598563 Fix SaveRGBAToStream 2025-11-18 10:32:38 +03:00
7afad1fe49 fix bug #76076 2025-11-14 21:27:49 +06:00
aa53d6302f Fix RedactOutputDev::drawImageMask 2025-11-14 17:09:22 +03:00
7f665b96a5 Create Image for InlineImg 2025-11-13 18:00:15 +03:00
8926c15908 fix numFmt conversion 2025-11-13 19:49:14 +06:00
033c45b7a0 . 2025-11-13 16:40:30 +03:00
16d75fe498 Merge branch 'develop' into feature/add-xls-writing 2025-11-13 15:02:17 +06:00
fe2e1568fa Merge pull request 'fix/bug51597' (#524) from fix/bug51597 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/524
2025-11-12 18:27:24 +00:00
7e057bab6e fix list fmla conversion 2025-11-12 19:31:42 +06:00
4bf8308bff Merge branch 'develop' into feature/add-xls-writing 2025-11-12 14:16:45 +06:00
6af3f2fe35 Do RedactOutputDev::drawImageMask 2025-11-11 17:05:02 +03:00
b61d8df484 fix ptgArea3d conversion 2025-11-11 16:25:20 +06:00
fc3748e516 for bug #40743 2025-11-11 11:26:46 +03:00
468dcd7ba4 Merge remote-tracking branch 'origin/release/v9.2.0' into develop 2025-11-11 10:21:53 +03:00
7048f132c6 Fix action GoTo FitR 2025-11-10 13:13:52 +03:00
238cdc8084 Merge branch 'develop' into feature/add-xls-writing 2025-11-10 15:08:26 +06:00
580283ef45 Merge remote-tracking branch 'origin/fix/rtf' into develop 2025-11-07 16:50:47 +03:00
fd648a7dd3 Merge remote-tracking branch 'origin/release/v9.2.0' into fix/pdf-redact
# Conflicts:
#	PdfFile/SrcReader/Adaptors.cpp
2025-11-07 14:03:51 +03:00
4d4f3be717 Fix bug #77975 2025-11-07 11:32:31 +03:00
6e481f6a34 Merge pull request 'fix/bug51965' (#515) from fix/bug51965 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/515
2025-11-07 06:47:08 +00:00
2059e4bb95 fix/bug51965
fix bug #51965
2025-11-07 00:58:31 +03:00
6a5186c411 fix 2025-11-06 14:55:28 +03:00
b5ea9d68e2 fix defined names fmlas xls conversion 2025-11-06 16:24:04 +06:00
71e96930c9 Fix read Action 2025-11-06 12:08:23 +03:00
d9be0df8fb Fix data validations conversion 2025-11-06 15:00:38 +06:00
3cee4b0212 Merge pull request 'For bug 77757' (#511) from rtfbugs/fix into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/511
2025-11-05 12:22:52 +00:00
cfb62d599d For bug 77757 2025-11-05 13:55:43 +03:00
919d117a1f Fix ptgList conversion 2025-11-05 16:14:58 +06:00
d4b289d0ca Fix RedactOutputDev::drawSoftMaskedImage 2025-11-05 12:58:48 +03:00
270e8e41dd fix ptg list xls conversion 2025-11-01 19:44:50 +06:00
751b82dc51 fix dxfs conversion 2025-11-01 13:09:43 +06:00
320e30c857 Do RedactOutputDev::drawSoftMaskedImage 2025-10-31 17:13:38 +03:00
e4c84e2972 fix text paragraph conversion 2025-10-31 16:50:04 +03:00
a6898c8235 Merge branch 'develop' into feature/add-xls-writing 2025-10-31 13:58:33 +06:00
463ca05404 Do RedactOutputDev::drawImage 2025-10-30 18:44:06 +03:00
548cee436a Merge remote-tracking branch 'origin/hotfix/v9.2.0' into develop 2025-10-30 15:13:03 +03:00
b1a36d546b fix ptgName writing 2025-10-30 18:06:11 +06:00
07d3f371a2 Merge pull request 'fix/bug77123' (#506) from fix/bug77123 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/506
2025-10-30 11:02:46 +00:00
278cac8a61 Merge branch 'fix/bug77123' into fix/bug51965 2025-10-30 13:56:13 +03:00
07fd1e87d7 Merge branch 'develop' into fix/bug51965 2025-10-30 13:55:14 +03:00
817ee4dde0 fix/bug77123
fix bug #77123
2025-10-30 13:50:56 +03:00
d93bd27896 Do RedactOutputDev::drawImage 2025-10-29 18:05:39 +03:00
be56209baf Fix empty cells conversion 2025-10-29 20:10:34 +06:00
6a573d0da7 Merge branch 'develop' into feature/add-xls-writing 2025-10-29 16:12:17 +06:00
e936e330d9 Do RedactOutputDev::drawForm 2025-10-28 18:21:00 +03:00
bda95fc03d Fix column styles conversion 2025-10-28 20:04:27 +06:00
c0c0289ffb Merge remote-tracking branch 'origin/Rtf/fixbugs' into develop 2025-10-28 15:57:46 +03:00
5c110799a6 . 2025-10-28 15:51:41 +03:00
1b6c81407b Merge branch 'develop' of https://git.onlyoffice.com/ONLYOFFICE/core into develop 2025-10-28 15:46:25 +03:00
1e0d662838 Fix previous 2025-10-28 15:35:46 +03:00
ae2680c419 fix defined names formula conversion 2025-10-28 18:18:57 +06:00
1b61353b2e Merge branch release/v9.1.0 into develop 2025-10-28 11:58:11 +00:00
7777048790 Merge branch release/v9.1.0 into master 2025-10-28 11:58:09 +00:00
fd6c0907bd Merge pull request 'fix/bug77123' (#504) from fix/bug77123 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/504
2025-10-28 11:33:11 +00:00
2aef5daf12 fix/bug77123 2025-10-28 14:06:05 +03:00
6cf6ade6e3 Fix bug 2025-10-28 13:11:40 +03:00
2399ba41e4 Fix miss place 2025-10-28 13:07:03 +03:00
fe2fb0c08d Add meta info 2025-10-28 13:04:00 +03:00
317e21af6a Merge remote-tracking branch 'origin/hotfix/v9.2.0' into develop 2025-10-28 11:29:01 +03:00
4f6daaae67 fix/bug77123
fix correct receipt page parametrs
2025-10-28 10:51:52 +03:00
8203492999 Merge branch 'develop' into feature/add-xls-writing 2025-10-28 13:19:12 +06:00
910f453ce8 Do RedactOutputDev::drawForm 2025-10-27 19:17:36 +03:00
54fb5a7891 remove smart_ptr for IFileConteiner (rels) 2025-10-27 18:54:00 +03:00
93b96e5555 fix bug #77324 2025-10-27 18:53:09 +03:00
9e57f8c3b1 Improve txt 2025-10-27 17:47:58 +03:00
57221c0e32 fix/bug77123
fix bug when the tabs were longer than available width
2025-10-27 16:27:48 +03:00
76b7099a37 Fix merged cells conversion 2025-10-27 19:04:55 +06:00
85f428fda6 fix formula conversion 2025-10-27 16:49:25 +06:00
d97a62442f Improve txt file writer 2025-10-27 13:40:48 +03:00
41fb12d58b Merge branch 'develop' into feature/add-xls-writing 2025-10-27 13:36:21 +06:00
ed0811d8ab For bug #50842 2025-10-25 11:52:35 +03:00
84cc97f035 Merge remote-tracking branch 'origin/hotfix/v9.2.0' into develop 2025-10-25 11:41:47 +03:00
984807d611 fix pivot cache id conversion 2025-10-24 19:23:02 +06:00
250c85c077 Add meta info in docx-renderer 2025-10-24 15:26:33 +03:00
dbd92bfdfa Fix Link Border 2025-10-24 15:01:51 +03:00
2796fbed8b Optimization read drawSoftMaskedImage 2025-10-24 12:10:33 +03:00
9ccbb25acd Improve txt file writer 2025-10-23 17:48:08 +03:00
954d86ed0f fix sxdb conversion 2025-10-23 20:01:28 +06:00
1dd5eb3368 Write Link annots 2025-10-22 16:19:43 +03:00
47e0a0c9e7 Improve txt file reader 2025-10-22 12:37:03 +03:00
5a491aea3e Read Link annots 2025-10-21 17:04:30 +03:00
2d7c5ec2df fix defined names conversion 2025-10-21 19:03:16 +06:00
38079e8692 comment unfinished functionality 2025-10-20 16:01:45 +06:00
ac75675367 optimized theme colors conversion 2025-10-20 15:41:44 +06:00
a0fc634f5f Merge branch 'develop' into feature/add-xls-writing 2025-10-20 14:03:42 +06:00
2ebade4413 add theme colors conversion 2025-10-17 21:38:28 +06:00
5e9f99e960 For bug #50842 2025-10-17 11:59:06 +03:00
a67935908a Merge remote-tracking branch 'origin/master' into develop 2025-10-16 18:57:38 +03:00
da1bc5d2d6 add theme colors registration 2025-10-16 20:33:32 +06:00
9d5388a7bf fix pivotCache id conversion 2025-10-15 20:38:36 +06:00
2cdb04656d Fix pivotfrt writing 2025-10-15 15:16:39 +06:00
3934c28eb8 Fix pivot table conversion 2025-10-14 21:17:58 +06:00
f6337bb12c add pivot table styles conversion 2025-10-14 18:30:59 +06:00
1d88830b38 fix/bug51597
fix bug when document convert from odt to docx and docx to odt and after this document cells width will smaller then before convertation.
2025-10-14 12:33:13 +03:00
9737038776 add addlStyles writing 2025-10-13 19:19:11 +06:00
915c3497e4 add pivotAddl writing 2025-10-13 16:26:19 +06:00
53c4f320f6 add pivot frt writing 2025-10-10 19:33:23 +06:00
1aec69965d add dateType pivot oper parsing 2025-10-10 15:15:22 +06:00
afdac778b0 Merge branch 'develop' into feature/add-xls-writing 2025-10-10 13:34:45 +06:00
fbc42a514f Fix pivots conversion 2025-10-09 19:46:21 +06:00
c567c9739c Merge remote-tracking branch 'origin/release/v9.1.0' into develop 2025-10-09 12:00:09 +03:00
686b719bff add pivot cache records conversion 2025-10-08 20:12:59 +06:00
f05fa7c0ee add pivotCache source conversion 2025-10-07 20:59:28 +06:00
0d646a32c4 add workbook pivotCache conversion 2025-10-07 17:09:10 +06:00
917c33e76d Fix pivot cache conversion 2025-10-06 21:08:26 +06:00
1937895a56 add sqlTypes conversion 2025-10-06 18:14:34 +06:00
01fbf07c9e add pivot field properties conversion 2025-10-06 16:56:13 +06:00
d208215814 Merge branch 'develop' into feature/add-xls-writing 2025-10-06 13:15:13 +06:00
c45c63f914 Merge pull request 'release/v9.1.0' (#474) from release/v9.1.0 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/474
2025-10-04 19:25:57 +00:00
5c5a18de0d add pivotCache properties conversion 2025-10-02 20:04:29 +06:00
9f24bda011 add pivotCache files conversion 2025-10-02 18:13:24 +06:00
fdb9eaa2a5 Add pivotCache stream writing 2025-10-02 15:41:11 +06:00
3e9b0ffbda add default params for SXEx 2025-10-02 14:30:16 +06:00
eb2ba042ef add pivotEx default writing 2025-10-01 21:22:55 +06:00
1111f421d9 Fix sxli conversion 2025-10-01 19:24:36 +06:00
e2bda52737 fix sxvd conversion 2025-10-01 17:38:08 +06:00
6c9c2cf538 fix pivot view header conversion 2025-10-01 17:13:56 +06:00
62d826d8c6 Merge branch 'develop' into feature/add-xls-writing 2025-10-01 14:05:17 +06:00
dfbdb869d7 add row&column items conversion 2025-09-30 15:04:03 +06:00
ed7a50855e Merge remote-tracking branch 'origin/release/v9.1.0' into develop 2025-09-29 21:58:01 +03:00
526a21da57 Merge branch 'develop' into feature/add-xls-writing 2025-09-29 17:06:24 +06:00
fb6bda209b add pivotIvd conversion 2025-09-29 17:04:36 +06:00
4b0f79a1ab add sxdi conversion 2025-09-29 16:00:11 +06:00
e5946892c9 add pivot field items conversion 2025-09-26 20:37:04 +06:00
d399027127 Add pivotField conversion 2025-09-26 19:31:23 +06:00
2e732ce62f add sxview conversion 2025-09-26 15:59:28 +06:00
44e6774c5a add pivot table writing 2025-09-25 18:37:33 +06:00
7ddb363d60 fix build 2025-09-25 13:19:47 +03:00
ecd333e238 Merge pull request 'feature/compound2' (#452) from feature/compound2 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/452
2025-09-25 09:27:18 +00:00
b377493ecb Merge branch 'develop' into feature/compound_any 2025-09-25 12:23:12 +03:00
afeeeab564 Merge remote-tracking branch 'origin/release/v9.1.0' into develop 2025-09-25 10:23:12 +03:00
460abc0d55 fix xls color conversion 2025-09-24 20:48:11 +06:00
01b2aaedb2 add table styles conversion 2025-09-23 20:41:56 +06:00
580c896b72 fix table conversion 2025-09-23 18:13:47 +06:00
03a1d9fa4c add table conversion 2025-09-22 19:37:14 +06:00
61d199a0c1 add list12 writing 2025-09-19 16:16:00 +06:00
4ea31dcb00 Merge remote-tracking branch 'origin/release/v9.1.0' into develop 2025-09-18 19:07:44 +03:00
54a0c7f231 add feature11 writing 2025-09-18 20:36:54 +06:00
a4d60a1ae1 fix list parsed formula 2025-09-18 19:09:18 +06:00
b7b3e0dd65 add feat11field parts writing 2025-09-18 19:08:52 +06:00
c28a6bf1ea add feat11fieldData writing 2025-09-18 17:57:14 +06:00
9f24254cc7 add feat11 writing 2025-09-18 14:20:32 +06:00
e105eca426 add tablestyle element conversion 2025-09-17 19:51:02 +06:00
02a923afb4 add table styles conversion 2025-09-17 18:06:07 +06:00
c7a0996a6c Fix condfmt colors conversion 2025-09-16 21:33:48 +06:00
6d27231e15 add OfficeArtFOPT writing 2025-09-15 21:11:32 +06:00
a2a5ef8fcd add author writing to notes 2025-09-15 19:20:20 +06:00
1c877ebe59 add spgroup writing 2025-09-15 17:48:06 +06:00
f03248ca86 fix TextObject writing 2025-09-12 16:47:46 +06:00
a4005412a7 Merge branch 'develop' into feature/add-xls-writing 2025-09-12 13:37:30 +06:00
e50016259a add textObject processing 2025-09-11 21:38:36 +06:00
d5a6c935e5 add obj specifying for comment 2025-09-11 17:56:50 +06:00
aa3d4cb3ce add drawing preparation 2025-09-11 16:20:34 +06:00
73fa9b6aac Merge pull request 'fix bug 74748' (#439) from fix/bug-74748 into develop
Reviewed-on: https://git.onlyoffice.com/ONLYOFFICE/core/pulls/439
2025-09-11 08:54:43 +00:00
c9a0d6e4e5 Merge branch hotfix/v9.0.4 into develop 2025-09-11 08:40:08 +00:00
130de28e4b Add comments conversion 2025-09-10 18:10:17 +06:00
cd53c06be3 fix bug 74748 2025-09-09 17:53:21 +03:00
122a54f510 add textObjectWriting 2025-09-09 18:45:39 +06:00
b425405744 add gboData writing 2025-09-08 17:36:02 +06:00
28ffd27fca add FtLbsData writing 2025-09-08 16:11:51 +06:00
9bc9d86dd6 add pict fmla writing 2025-09-08 14:43:35 +06:00
a1891b597f add pictFmla writing 2025-09-05 21:24:54 +06:00
bf9ce4f535 add ft macro writing 2025-09-05 19:10:52 +06:00
508d8f25db add obj writing 2025-09-05 18:09:11 +06:00
efbfcaed37 add OfficeArtSpContainer writing 2025-09-04 20:54:51 +06:00
d1fc31ac28 add OfficeArtFRITContainer writing 2025-09-04 18:50:50 +06:00
b8efe6c554 add fdg writing 2025-09-04 17:26:28 +06:00
13410f8467 add objects writing 2025-09-03 19:37:32 +06:00
3a389147dd add dbb writing 2025-09-03 15:13:04 +06:00
ba203f734d add fdb writing 2025-09-02 20:19:02 +06:00
758454747d add sxformula writing 2025-09-02 16:46:39 +06:00
bf175e92a3 add sxdb writing 2025-09-01 20:02:35 +06:00
0c9b5821e7 add pivotcache stream writing 2025-09-01 19:29:29 +06:00
98dae842ae Add data validations conversion 2025-09-01 18:26:48 +06:00
ff53c1b474 Add others template params for cf12 conversion 2025-08-25 21:12:27 +06:00
334f9602b4 add conditional formatting filter conversion 2025-08-22 20:06:20 +06:00
fed94358fe add multistate conversion 2025-08-22 17:44:53 +06:00
89b669e319 fix databar conversion 2025-08-22 15:16:06 +06:00
db213d3ae4 add cf databar conversion 2025-08-21 21:35:04 +06:00
79df81301f add colorScale cond fmt conversion 2025-08-21 18:52:07 +06:00
197bbf7027 Add aligment conversion to conditional formatting 2025-08-20 18:17:03 +06:00
a466592bc2 add protection conversion 2025-08-20 14:48:03 +06:00
4bce73d81d Add numfmt convesion to dxf 2025-08-20 14:06:50 +06:00
ed13e54d26 Add dxf border conversion 2025-08-19 19:18:01 +06:00
e371f7ccf1 add font condfmt conversion 2025-08-18 20:42:46 +06:00
14a0e4713c add fills conversion to conditional formatting 2025-08-18 17:03:07 +06:00
74b9a426c2 fix/bug-with break-columns
update comments
2025-08-18 13:27:29 +03:00
43c7e2c9a8 Add global info using in conversion 2025-08-15 20:55:34 +06:00
39b9c28607 fix dxfn conversion 2025-08-15 17:34:07 +06:00
6e57d7e4e7 fix cfParsed formula conversion 2025-08-14 20:40:20 +06:00
f831d9a22d add condFmt conversion 2025-08-14 17:56:01 +06:00
7f54430813 Add dxf conversion 2025-08-13 17:21:03 +06:00
ea42899b9e Merge branch 'develop' into feature/add-xls-writing 2025-08-13 13:20:11 +06:00
b420fd731f Add borders style conversion 2025-08-12 20:59:33 +06:00
dbbf4d04f9 Add blanc cell processing 2025-08-12 20:16:16 +06:00
62132c27bd add fills conversion 2025-08-11 17:09:43 +06:00
e4449d7aa9 Add font color conversion 2025-08-08 18:55:02 +06:00
cb304293b7 Add palette conversion 2025-08-08 14:20:56 +06:00
ffb62243a9 Merge branch 'develop' into feature/add-xls-writing 2025-08-08 13:27:43 +06:00
63a80580cc fix number value conversion 2025-08-07 20:04:19 +06:00
fed142690b Add data consolidation conversion 2025-08-07 15:13:09 +06:00
8d368ca91c Merge branch 'develop' into feature/add-xls-writing 2025-08-07 13:07:10 +06:00
2cc2434982 fix continue record writing 2025-08-06 20:27:16 +06:00
f5989b979a Fix autofilter record writing 2025-08-06 18:44:53 +06:00
62955d5f6e Add autofilter writing 2025-08-05 21:35:39 +06:00
9fc3fcabcb Fix sort data record writing 2025-08-04 19:01:27 +06:00
6af0b89c1d Add sort state conversion 2025-08-04 17:48:04 +06:00
c34b9e00e5 Merge branch 'develop' into feature/add-xls-writing 2025-08-04 13:14:17 +06:00
e715da8680 Add header and footer conversion 2025-08-01 18:33:49 +06:00
7a26c345c5 Fix margin conversion 2025-08-01 16:42:57 +06:00
2a6e76a2bc Add pagesetup conversion 2025-08-01 15:42:05 +06:00
adfc79938d Merge branch 'develop' into feature/add-xls-writing 2025-08-01 14:00:31 +06:00
c3ce1d2756 Fix hlink conversion 2025-07-31 19:14:09 +06:00
cf5208d6a5 Add hyperlinks conversion 2025-07-31 13:53:14 +06:00
56e6a0a3b8 Merge branch 'develop' into feature/add-xls-writing 2025-07-31 13:06:10 +06:00
0a7ad2f560 Add worksheet protection conversion 2025-07-30 17:25:53 +06:00
fede5921e1 add workbook protection conversion 2025-07-30 16:54:57 +06:00
897ea781b7 Fix font conversion 2025-07-30 15:45:59 +06:00
f95014f46f Add phonetic string conversion 2025-07-29 17:25:33 +06:00
92fae52a6d Fix rich string xls conversion 2025-07-28 21:52:30 +06:00
afb0f44af2 Add crun shared string conversion 2025-07-28 20:49:38 +06:00
af20b1f63d fix cell xf index writiong 2025-07-28 18:34:52 +06:00
c779654a58 Add cell styles conversion 2025-07-25 21:04:32 +06:00
d1c99891c6 Add xfs conversion 2025-07-25 18:12:27 +06:00
ffc94bf455 Add numFmts conversion 2025-07-25 15:27:53 +06:00
680c83853a Add fonts conversion 2025-07-25 14:44:08 +06:00
33e698242c Merge branch 'develop' into feature/add-xls-writing 2025-07-25 13:16:39 +06:00
e8ad643a0e Add bookviewsConversion 2025-07-24 21:24:07 +06:00
609e3bc158 Add worksheet view conversion 2025-07-24 20:50:37 +06:00
7e51dd143a Add colls & merged cells conversion 2025-07-24 15:02:36 +06:00
31d65dea7c Merge branch 'develop' into feature/add-xls-writing 2025-07-24 13:02:00 +06:00
89172a9047 add relsSorting 2025-07-23 20:45:04 +06:00
0103717241 add dimensions conversion 2025-07-23 20:44:54 +06:00
c012662402 Add array formula writing 2025-07-23 17:21:30 +06:00
00c3085a90 Merge branch 'develop' into feature/add-xls-writing 2025-07-22 17:37:35 +06:00
f1fa861c8a Add shared formula conversion 2025-07-22 17:35:57 +06:00
c37f96da2d Add formula conversion 2025-07-21 19:20:37 +06:00
89473c5ba0 Add simple shared strings conversion 2025-07-18 20:03:37 +06:00
07afc6e4c3 add simple cells conversion 2025-07-18 16:16:03 +06:00
34c34018a0 Merge branch 'develop' into feature/add-xls-writing 2025-07-18 14:48:55 +06:00
05dd636a1c Add cellType processing function 2025-07-17 21:36:00 +06:00
e6158043b9 add sheet data conversion 2025-07-17 18:42:22 +06:00
cfd1dcc3ee Add worksheets conversion 2025-07-17 17:14:12 +06:00
7a2944ce58 Add defined names conversion 2025-07-17 15:26:34 +06:00
8a11fa5aac Merge branch 'develop' into feature/add-xls-writing 2025-07-17 13:03:44 +06:00
aa2127b55f Add bundlesheet conversion 2025-07-16 20:28:40 +06:00
86a2d66d83 Add xlsx2xls conversion 2025-07-16 19:13:12 +06:00
d6ed01e1df fix compound2 function 2023-09-04 12:25:28 +03:00
0fcf29eddc fix compound converter 2023-09-01 18:01:58 +03:00
474a500819 Add compound file to checker 2023-08-31 18:15:27 +03:00
681 changed files with 17507 additions and 3738 deletions

View File

@ -3,6 +3,8 @@ DEPENDPATH += $$PWD
CORE_ROOT_DIR = $$PWD/../../../..
include($$CORE_ROOT_DIR/Common/3dParty/boost/boost.pri)
css_calculator_without_xhtml {
HEADERS += \
$$PWD/src/CCssCalculator_Private.h \

File diff suppressed because it is too large Load Diff

View File

@ -4,11 +4,14 @@
#include <map>
#include <string>
#include <vector>
#include <sstream>
#include "../../../../DesktopEditor/graphics/Matrix.h"
#include "CUnitMeasureConverter.h"
#include <boost/optional.hpp>
#include "boost/blank.hpp"
#include <boost/variant2/variant.hpp>
namespace NSCSS
{
namespace NSProperties
@ -16,33 +19,34 @@ namespace NSCSS
#define NEXT_LEVEL UINT_MAX, true
template<typename T>
class CValue
class CValueBase
{
friend class CString;
friend class CMatrix;
friend class CDigit;
friend class CColor;
friend class CEnum;
friend class CURL;
protected:
CValueBase()
: m_unLevel(0), m_bImportant(false)
{}
CValueBase(const CValueBase& oValue)
: m_oValue(oValue.m_oValue), m_unLevel(oValue.m_unLevel), m_bImportant(oValue.m_bImportant)
{}
CValueBase(const T& oValue, unsigned int unLevel, bool bImportant)
: m_oValue(oValue), m_unLevel(unLevel), m_bImportant(bImportant)
{}
T m_oValue;
unsigned int m_unLevel;
bool m_bImportant;
public:
CValue(const T& oValue, unsigned int unLevel, bool bImportant) :
m_oValue(oValue), m_unLevel(unLevel), m_bImportant(bImportant)
{
}
virtual bool Empty() const = 0;
virtual void Clear() = 0;
virtual bool SetValue(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode) = 0;
virtual bool Empty() const = 0;
virtual void Clear() = 0;
virtual int ToInt() const = 0;
virtual double ToDouble() const = 0;
virtual std::wstring ToWString() const = 0;
static void Equation(CValue &oFirstValue, CValue &oSecondValue)
static void Equation(CValueBase &oFirstValue, CValueBase &oSecondValue)
{
if (oFirstValue.m_bImportant && !oSecondValue.m_bImportant && oFirstValue.Empty())
oSecondValue.Clear();
@ -57,18 +61,39 @@ namespace NSCSS
}
}
static bool LevelIsSame(const CValue& oFirstValue, const CValue& oSecondValue)
static bool LevelIsSame(const CValueBase& oFirstValue, const CValueBase& oSecondValue)
{
return oFirstValue.m_unLevel == oSecondValue.m_unLevel;
}
bool operator==(const T& oValue) const { return m_oValue == oValue; }
bool operator>=(const T& oValue) const { return m_oValue >= oValue; }
bool operator<=(const T& oValue) const { return m_oValue <= oValue; }
bool operator> (const T& oValue) const { return m_oValue > oValue; }
bool operator< (const T& oValue) const { return m_oValue < oValue; }
friend bool operator==(const CValueBase& oLeftValue, const CValueBase& oRightValue)
{
if (oLeftValue.Empty() && oRightValue.Empty())
return true;
virtual CValue& operator =(const CValue& oValue)
if (( oLeftValue.Empty() && !oRightValue.Empty()) ||
(!oLeftValue.Empty() && oRightValue.Empty()))
return false;
return oLeftValue.m_oValue == oRightValue.m_oValue;
}
friend bool operator!=(const CValueBase& oLeftValue, const CValueBase& oRightValue)
{
return !(oLeftValue == oRightValue);
}
bool operator==(const T& oValue) const
{
return m_oValue == oValue;
}
bool operator!=(const T& oValue) const
{
return m_oValue != oValue;
}
virtual CValueBase& operator =(const CValueBase& oValue)
{
m_oValue = oValue.m_oValue;
m_unLevel = oValue.m_unLevel;
@ -77,70 +102,93 @@ namespace NSCSS
return *this;
}
virtual CValue& operator =(const T& oValue)
virtual CValueBase& operator =(const T& oValue)
{
//m_oValue = oValue.m_oValue;
m_oValue = oValue;
return *this;
}
virtual CValue& operator+=(const CValue& oValue)
virtual CValueBase& operator+=(const CValueBase& oValue)
{
if (m_unLevel > oValue.m_unLevel || (m_bImportant && !oValue.m_bImportant) || oValue.Empty())
return *this;
m_oValue = oValue.m_oValue;
m_unLevel = oValue.m_unLevel;
m_bImportant = oValue.m_bImportant;
*this = oValue;
return *this;
}
};
virtual bool operator==(const CValue& oValue) const
template<typename T>
class CValueOptional : public CValueBase<boost::optional<T>>
{
protected:
CValueOptional() = default;
CValueOptional(const T& oValue, unsigned int unLevel = 0, bool bImportant = false)
: CValueBase<boost::optional<T>>(oValue, unLevel, bImportant)
{}
public:
virtual bool Empty() const override
{
return m_oValue == oValue.m_oValue;
return !this->m_oValue.has_value();
}
void Clear() override
{
this->m_oValue.reset();
this->m_unLevel = 0;
this->m_bImportant = false;
}
virtual bool operator!=(const CValue& oValue) const
bool operator==(const T& oValue) const
{
return m_oValue != oValue.m_oValue;
if (!this->m_oValue.has_value())
return false;
return this->m_oValue.value() == oValue;
}
virtual CValueOptional& operator=(const T& oValue)
{
this->m_oValue = oValue;
return *this;
}
};
class CString : public CValue<std::wstring>
class CString : public CValueOptional<std::wstring>
{
public:
CString();
CString(const std::wstring& wsValue, unsigned int unLevel, bool bImportant = false);
CString() = default;
CString(const std::wstring& wsValue, unsigned int unLevel = 0, bool bImportant = false);
bool SetValue(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode) override;
bool SetValue(const std::wstring& wsValue, const std::vector<std::wstring>& arValiableValues, unsigned int unLevel, bool bHardMode);
bool SetValue(const std::wstring& wsValue, const std::map<std::wstring, std::wstring>& arValiableValues, unsigned int unLevel, bool bHardMode);
bool Empty() const override;
void Clear() override;
int ToInt() const override;
double ToDouble() const override;
std::wstring ToWString() const override;
CString& operator+=(const CString& oString);
bool operator==(const wchar_t* pValue) const;
bool operator!=(const wchar_t* pValue) const;
using CValueOptional<std::wstring>::operator=;
};
class CDigit : public CValue<double>
class CDigit : public CValueOptional<double>
{
UnitMeasure m_enUnitMeasure;
double ConvertValue(double dPrevValue, UnitMeasure enUnitMeasure) const;
public:
CDigit();
CDigit(double dValue);
CDigit(double dValue, unsigned int unLevel, bool bImportant = false);
CDigit(const double& dValue, unsigned int unLevel = 0, bool bImportant = false);
bool SetValue(const std::wstring& wsValue, unsigned int unLevel = 0, bool bHardMode = true) override;
bool SetValue(const CDigit& oValue);
bool SetValue(const double& dValue, UnitMeasure enUnitMeasure, unsigned int unLevel = 0, bool bHardMode = true);
bool Empty() const override;
bool Zero() const;
void Clear() override;
@ -156,7 +204,7 @@ namespace NSCSS
UnitMeasure GetUnitMeasure() const;
bool operator==(const double& oValue) const;
bool operator==(const double& dValue) const;
bool operator==(const CDigit& oDigit) const;
bool operator!=(const double& oValue) const;
@ -171,11 +219,19 @@ namespace NSCSS
CDigit& operator+=(const CDigit& oDigit);
CDigit& operator-=(const CDigit& oDigit);
CDigit& operator+=(double dValue);
CDigit& operator-=(double dValue);
CDigit& operator*=(double dValue);
CDigit& operator/=(double dValue);
CDigit& operator =(double dValue);
CDigit& operator+=(const double& dValue);
CDigit& operator-=(const double& dValue);
CDigit& operator*=(const double& dValue);
CDigit& operator/=(const double& dValue);
using CValueOptional<double>::operator=;
private:
UnitMeasure m_enUnitMeasure;
double ConvertValue(double dPrevValue, UnitMeasure enUnitMeasure) const;
template <typename Operation>
CDigit ApplyOperation(const CDigit& oDigit, Operation operation) const;
};
struct TRGB
@ -186,6 +242,8 @@ namespace NSCSS
bool Empty() const;
int ToInt() const;
bool operator==(const TRGB& oRGB) const;
bool operator!=(const TRGB& oRGB) const;
};
@ -211,31 +269,58 @@ namespace NSCSS
typedef enum
{
ColorEmpty,
ColorNone,
ColorRGB,
ColorHEX,
ColorUrl,
ColorContextStroke,
ColorContextFill
} ColorType;
} EColorType;
class CColor : public CValue<void*>
class CColorValue
{
using color_value = boost::variant2::variant<boost::blank, std::wstring, TRGB, CURL>;
protected:
EColorType m_eType;
public:
CColorValue();
CColorValue(const CColorValue& oValue);
CColorValue(const std::wstring& wsValue);
CColorValue(const TRGB& oValue);
CColorValue(const CURL& oValue);
EColorType GetType() const;
bool operator==(const CColorValue& oValue) const;
color_value m_oValue;
};
class CColorValueContextStroke : public CColorValue
{
public:
CColorValueContextStroke();
};
class CColorValueContextFill : public CColorValue
{
public:
CColorValueContextFill();
};
class CColor : public CValueOptional<CColorValue>
{
public:
CColor();
CColor(const CColor& oColor);
~CColor();
bool SetValue(const std::wstring& wsValue, unsigned int unLevel = 0, bool bHardMode = true) override;
bool SetOpacity(const std::wstring& wsValue, unsigned int unLevel = 0, bool bHardMode = true);
bool Empty() const override;
bool None() const;
bool Url() const;
void Clear() override;
ColorType GetType() const;
EColorType GetType() const;
double GetOpacity() const;
@ -249,20 +334,15 @@ namespace NSCSS
static TRGB ConvertHEXtoRGB(const std::wstring& wsValue);
static std::wstring ConvertRGBtoHEX(const TRGB& oValue);
bool operator==(const CColor& oColor) const;
bool operator!=(const CColor& oColor) const;
CColor& operator =(const CColor& oColor);
CColor& operator+=(const CColor& oColor);
using CValueOptional<CColorValue>::operator=;
private:
CDigit m_oOpacity;
ColorType m_enType;
CDigit m_oOpacity;
void SetEmpty(unsigned int unLevel = 0);
void SetRGB(unsigned char uchR, unsigned char uchG, unsigned char uchB);
void SetRGB(const TRGB& oRGB);
void SetHEX(const std::wstring& wsValue);
void SetUrl(const std::wstring& wsValue);
bool SetUrl(const std::wstring& wsValue);
void SetNone();
};
@ -279,7 +359,7 @@ namespace NSCSS
typedef std::vector<std::pair<std::vector<double>, TransformType>> MatrixValues;
class CMatrix : public CValue<MatrixValues>
class CMatrix : public CValueBase<MatrixValues>
{
std::vector<std::wstring> CutTransforms(const std::wstring& wsValue) const;
public:
@ -304,29 +384,27 @@ namespace NSCSS
bool operator==(const CMatrix& oMatrix) const;
CMatrix& operator+=(const CMatrix& oMatrix);
CMatrix& operator-=(const CMatrix& oMatrix);
using CValueBase<MatrixValues>::operator=;
};
class CEnum : public CValue<int>
class CEnum : public CValueOptional<int>
{
std::map<std::wstring, int> m_mMap;
public:
CEnum();
bool SetValue(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode) override;
void SetMapping(const std::map<std::wstring, int>& mMap, int nDefaulvalue = -1);
bool Empty() const override;
void Clear() override;
CEnum &operator =(int nValue);
bool operator==(int nValue) const;
bool operator!=(int nValue) const;
int ToInt() const override;
using CValueOptional<int>::operator=;
private:
double ToDouble() const override;
std::wstring ToWString() const override;
int m_nDefaultValue;
std::map<std::wstring, int> m_mMap;
};
// PROPERTIES
@ -619,6 +697,30 @@ namespace NSCSS
bool operator==(const TTextDecoration& oTextDecoration) const;
};
typedef enum
{
Baseline,
Sub,
Super,
Percentage,
Length
} EBaselineShift;
class CBaselineShift
{
CEnum m_eType;
CDigit m_oValue;
public:
CBaselineShift();
bool Empty() const;
EBaselineShift GetType() const;
double GetValue() const;
bool SetValue(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
};
class CText
{
public:
@ -626,11 +728,12 @@ namespace NSCSS
static void Equation(CText &oFirstText, CText &oSecondText);
bool SetIndent (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
bool SetAlign (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
bool SetDecoration(const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
bool SetColor (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
bool SetHighlight (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
bool SetIndent (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
bool SetAlign (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
bool SetDecoration (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
bool SetColor (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
bool SetHighlight (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
bool SetBaselineShift (const std::wstring& wsValue, unsigned int unLevel, bool bHardMode = false);
const CDigit& GetIndent() const;
const CString& GetAlign() const;
@ -638,6 +741,9 @@ namespace NSCSS
const CColor& GetColor() const;
const CColor& GetHighlight() const;
EBaselineShift GetBaselineShiftType() const;
double GetBaselineShiftValue() const;
bool Empty() const;
bool Underline() const;
@ -647,6 +753,7 @@ namespace NSCSS
CText& operator+=(const CText& oText);
bool operator==(const CText& oText) const;
private:
CBaselineShift m_oBaselineShift;
TTextDecoration m_oDecoration;
CDigit m_oIndent;
CString m_oAlign;

View File

@ -5,7 +5,7 @@
namespace Md
{
#define MD_PARSER_FLAGS MD_DIALECT_GITHUB | MD_FLAG_NOINDENTEDCODEBLOCKS | MD_HTML_FLAG_SKIP_UTF8_BOM | MD_FLAG_HARD_SOFT_BREAKS | MD_HTML_FLAG_XHTML
#define MD_PARSER_FLAGS MD_DIALECT_GITHUB | MD_FLAG_NOINDENTEDCODEBLOCKS | MD_HTML_FLAG_SKIP_UTF8_BOM | MD_FLAG_HARD_SOFT_BREAKS | MD_HTML_FLAG_XHTML | MD_FLAG_LATEXMATHSPANS
#define MD_RENDERER_FLAGS MD_HTML_FLAG_XHTML
void ToHtml(const MD_CHAR* pValue, MD_SIZE uSize, void* pData)

View File

@ -90,7 +90,7 @@ static std::wstring convertUtf16ToWString(const UTF16 * Data, int nLength)
return std::wstring();
}
std::wstring wstr ((wchar_t *) pStrUtf32);
std::wstring wstr ((wchar_t *) pStrUtf32, nLength);
delete [] pStrUtf32;
return wstr;

View File

@ -1,5 +0,0 @@
<<<<<<<
if((c >= 'a' && c <= 'z') || (c>= 'A' && c<= 'Z') || (c >= '0' && c<= '9')){
=======
if((c >= 'a' && c <= 'z') || (c>= 'A' && c<= 'Z') || (c >= '0' && c<= '9') || ('-' == c) || ('_' == c) || ('.' == c) || ('~' == c)){
>>>>>>>

View File

@ -74,6 +74,7 @@ public:
bool isDocFormatFile(const std::wstring& fileName);
bool isXlsFormatFile(const std::wstring& fileName);
bool isCompoundFile (POLE::Storage* storage);
bool isOleObjectFile(POLE::Storage* storage);
bool isDocFormatFile(POLE::Storage* storage);
bool isXlsFormatFile(POLE::Storage* storage);

View File

@ -552,6 +552,15 @@ bool COfficeFileFormatChecker::isPptFormatFile(POLE::Storage *storage)
return true;
}
bool COfficeFileFormatChecker::isCompoundFile(POLE::Storage* storage)
{
if (storage == NULL) return false;
if (storage->GetAllStreams(L"/").size() == 1) return true;
return false;
}
std::wstring COfficeFileFormatChecker::getDocumentID(const std::wstring &_fileName)
{
#if defined(_WIN32) || defined(_WIN32_WCE) || defined(_WIN64)
@ -749,6 +758,11 @@ bool COfficeFileFormatChecker::isOfficeFile(const std::wstring &_fileName)
nFileType = AVS_OFFICESTUDIO_FILE_OTHER_MS_VBAPROJECT;
return true;
}
else if (isCompoundFile(&storage))
{
nFileType = AVS_OFFICESTUDIO_FILE_OTHER_COMPOUND;
return true;
}
else if (isHwpFile(&storage))
{
nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_HWP;
@ -953,7 +967,7 @@ bool COfficeFileFormatChecker::isOfficeFile(const std::wstring &_fileName)
nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_MHT;
else if (0 == sExt.compare(L".md"))
nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_MD;
else if (0 == sExt.compare(L".csv") || 0 == sExt.compare(L".xls") || 0 == sExt.compare(L".xlsx") || 0 == sExt.compare(L".xlsb"))
else if (0 == sExt.compare(L".csv") || 0 == sExt.compare(L".tsv") || 0 == sExt.compare(L".xls") || 0 == sExt.compare(L".xlsx") || 0 == sExt.compare(L".xlsb"))
nFileType = AVS_OFFICESTUDIO_FILE_SPREADSHEET_CSV;
else if (0 == sExt.compare(L".html") || 0 == sExt.compare(L".htm"))
nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_HTML;

View File

@ -136,6 +136,7 @@
#define AVS_OFFICESTUDIO_FILE_OTHER_MS_MITCRYPTO AVS_OFFICESTUDIO_FILE_OTHER + 0x000b
#define AVS_OFFICESTUDIO_FILE_OTHER_MS_VBAPROJECT AVS_OFFICESTUDIO_FILE_OTHER + 0x000c
#define AVS_OFFICESTUDIO_FILE_OTHER_PACKAGE_IN_OLE AVS_OFFICESTUDIO_FILE_OTHER + 0x000d
#define AVS_OFFICESTUDIO_FILE_OTHER_COMPOUND AVS_OFFICESTUDIO_FILE_OTHER + 0x000e
#define AVS_OFFICESTUDIO_FILE_TEAMLAB 0x1000
#define AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY AVS_OFFICESTUDIO_FILE_TEAMLAB + 0x0001

View File

@ -33,8 +33,7 @@ OO_BUILD_BRANDING = $$(OO_BRANDING)
OO_DESTDIR_BUILD_OVERRIDE = $$(DESTDIR_BUILD_OVERRIDE)
win32 {
CURRENT_YEAR = $$system(wmic PATH Win32_LocalTime GET ^Year /FORMAT:VALUE | find \"=\")
CURRENT_YEAR = $$replace(CURRENT_YEAR, "Year=", "")
CURRENT_YEAR = $$system(powershell -NoLogo -NoProfile -Command "(Get-Date).Year")
CURRENT_YEAR = $$replace(CURRENT_YEAR, "\r", "")
CURRENT_YEAR = $$replace(CURRENT_YEAR, "\n", "")
CURRENT_YEAR = $$replace(CURRENT_YEAR, "\t", "")

View File

@ -60,6 +60,7 @@ namespace NSSystemUtils
static const wchar_t* gc_EnvModified = L"MODIFIED";
static const wchar_t* gc_EnvMemoryLimit = L"X2T_MEMORY_LIMIT";
static const wchar_t* gc_EnvMemoryLimitDefault = L"4GiB";
static const wchar_t* gc_EnvSigningKeystorePassphrase = L"SIGNING_KEYSTORE_PASSPHRASE";
KERNEL_DECL std::string GetEnvVariableA(const std::wstring& strName);
KERNEL_DECL std::wstring GetEnvVariable(const std::wstring& strName);

View File

@ -245,7 +245,18 @@ public:
return 0;
}
bool CheckOwnerPassword(const std::wstring& sPassword)
{
if (m_nType == 0)
return ((CPdfFile*)m_pFile)->CheckOwnerPassword(sPassword);
return true;
}
bool CheckPerm(int nPerm)
{
if (m_nType == 0)
return ((CPdfFile*)m_pFile)->CheckPerm(nPerm);
return true;
}
BYTE* GetInfo()
{
NSWasm::CData oRes;
@ -479,6 +490,9 @@ public:
return NULL;
}
if (m_nType == 0)
((CPdfFile*)m_pFile)->SetPageFonts(nPageIndex);
BYTE* res = oRes.GetBuffer();
oRes.ClearWithoutAttack();
return res;
@ -567,6 +581,13 @@ public:
}
return NULL;
}
BYTE* GetGIDByUnicode(const std::string& sPathA)
{
if (m_nType != 0)
return NULL;
std::wstring sFontName = UTF8_TO_U(sPathA);
return ((CPdfFile*)m_pFile)->GetGIDByUnicode(sFontName);
}
std::wstring GetFontBinaryNative(const std::wstring& sName)
{

View File

@ -30,6 +30,8 @@
-(JSValue*) SplitPages : (JSValue*)arrPageIndexes : (JSValue*)data;
-(JSValue*) MergePages : (JSValue*)data : (JSValue*)nMaxID : (JSValue*)sPrefixForm;
-(JSValue*) UnmergePages;
-(JSValue*) RedactPage : (JSValue*)nPageIndex : (JSValue*)arrRedactBox : (JSValue*)dataFiller;
-(JSValue*) UndoRedact;
@end
@interface CJSCDrawingFileEmbed : NSObject<IJSCDrawingFileEmbed, JSEmbedObjectProtocol>
@ -67,6 +69,8 @@ FUNCTION_WRAPPER_JS_1(FreeWasmData, FreeWasmData)
FUNCTION_WRAPPER_JS_2(SplitPages, SplitPages)
FUNCTION_WRAPPER_JS_3(MergePages, MergePages)
FUNCTION_WRAPPER_JS_0(UnmergePages, UnmergePages)
FUNCTION_WRAPPER_JS_3(RedactPage, RedactPage)
FUNCTION_WRAPPER_JS_0(UndoRedact, UndoRedact)
@end
class CDrawingFileEmbedAdapter : public CJSEmbedObjectAdapterJSC

View File

@ -67,7 +67,7 @@ namespace NSDrawingFileEmbed
NSV8Objects::Template_Set(result, "SplitPages", _SplitPages);
NSV8Objects::Template_Set(result, "MergePages", _MergePages);
NSV8Objects::Template_Set(result, "UnmergePages", _UnmergePages);
NSV8Objects::Template_Set(result, "RedactPage", _RedactPage);
NSV8Objects::Template_Set(result, "RedactPage", _RedactPage);
NSV8Objects::Template_Set(result, "UndoRedact", _UndoRedact);
return handle_scope.Escape(result);

View File

@ -731,10 +731,10 @@ void CFontFile::CheckHintsSupport()
int CFontFile::SetCMapForCharCode(long lUnicode, int *pnCMapIndex)
{
*pnCMapIndex = -1;
if (!m_pFace)
if (!m_pFace || !m_pFace->num_charmaps)
return 0;
if ( m_bStringGID || 0 == m_pFace->num_charmaps )
if ( m_bStringGID )
return lUnicode;
int nCharIndex = 0;

View File

@ -117,7 +117,7 @@ WASM_EXPORT unsigned int ASC_FT_SetCMapForCharCode(FT_Face face, unsigned int un
return 0;
if ( 0 == face->num_charmaps )
return unicode;
return 0;
unsigned int nCharIndex = 0;

View File

@ -265,15 +265,15 @@
},
{
"folder": "../../",
"files": ["graphics/Image.cpp", "raster/BgraFrame.cpp", "raster/ImageFileFormatChecker.cpp", "graphics/Matrix.cpp"]
"files": ["graphics/Image.cpp", "raster/BgraFrame.cpp", "raster/ImageFileFormatChecker.cpp", "graphics/Matrix.cpp", "graphics/GraphicsPath.cpp"]
},
{
"folder": "../../agg-2.4/src/",
"files": ["agg_trans_affine.cpp"]
"files": ["agg_trans_affine.cpp", "agg_bezier_arc.cpp"]
},
{
"folder": "../../raster/",
"files": ["PICT/PICFile.cpp", "PICT/pic.cpp"]
"files": ["PICT/PICFile.cpp"]
},
{
"folder": "../../graphics/pro/js/qt/raster",

View File

@ -737,11 +737,13 @@ CBooleanOperations::CBooleanOperations(const CGraphicsPath& path1,
const CGraphicsPath& path2,
BooleanOpType op,
long fillType,
bool isLuminosity) :
bool isLuminosity,
bool isSelf) :
Op(op),
Close1(path1.Is_poly_closed()),
Close2(path2.Is_poly_closed()),
IsLuminosity(isLuminosity),
IsSelf(isSelf),
FillType(fillType),
Path1(path1),
Path2(path2)
@ -784,10 +786,9 @@ bool CBooleanOperations::IsSelfInters(const CGraphicsPath& p)
void CBooleanOperations::TraceBoolean()
{
bool reverse = false;
bool self = Path1 == Path2;
if (((Op == Subtraction || Op == Exclusion) ^
Path1.IsClockwise() ^
Path2.IsClockwise()) && !self)
Path2.IsClockwise()) && !IsSelf)
reverse = true;
PreparePath(Path1, 1, Segments1, Curves1);
@ -798,7 +799,7 @@ void CBooleanOperations::TraceBoolean()
GetIntersection();
if (self)
if (IsSelf)
{
if (Op == Subtraction)
return;
@ -823,6 +824,11 @@ void CBooleanOperations::TraceBoolean()
CreateNewPath(adj_matr);
return;
}
else if (Path1 == Path2)
{
Result = std::move(Path1);
return;
}
if (!Locations.empty())
{
@ -2355,7 +2361,7 @@ CGraphicsPath CalcBooleanOperation(const CGraphicsPath& path1,
CBooleanOperations o;
if (i > skip_end2 && o.IsSelfInters(paths2[i]))
{
CBooleanOperations operation(paths2[i], paths2[i], Intersection, fillType, isLuminosity);
CBooleanOperations operation(paths2[i], paths2[i], Intersection, fillType, isLuminosity, true);
CGraphicsPath p = std::move(operation.GetResult());
std::vector<CGraphicsPath> tmp_paths = p.GetSubPaths();
@ -2370,7 +2376,7 @@ CGraphicsPath CalcBooleanOperation(const CGraphicsPath& path1,
CBooleanOperations o2;
if (j > skip_end1 && o2.IsSelfInters(paths1[j]))
{
CBooleanOperations operation(paths1[j], paths1[j], Intersection, fillType, isLuminosity);
CBooleanOperations operation(paths1[j], paths1[j], Intersection, fillType, isLuminosity, true);
CGraphicsPath p = std::move(operation.GetResult());
std::vector<CGraphicsPath> tmp_paths = p.GetSubPaths();
@ -2380,7 +2386,7 @@ CGraphicsPath CalcBooleanOperation(const CGraphicsPath& path1,
paths1.insert(paths1.begin() + i + k, tmp_paths[k]);
}
CBooleanOperations operation(paths1[j], paths2[i], op, fillType, isLuminosity);
CBooleanOperations operation(paths1[j], paths2[i], op, fillType, isLuminosity, false);
paths.push_back(operation.GetResult());
}

View File

@ -108,7 +108,7 @@ namespace Aggplus
{
public:
CBooleanOperations() {};
CBooleanOperations(const CGraphicsPath& path1, const CGraphicsPath& path2, BooleanOpType op, long fillType, bool isLuminosity);
CBooleanOperations(const CGraphicsPath& path1, const CGraphicsPath& path2, BooleanOpType op, long fillType, bool isLuminosity, bool isSelf);
~CBooleanOperations();
CGraphicsPath&& GetResult();
bool IsSelfInters(const CGraphicsPath& p);
@ -166,6 +166,7 @@ namespace Aggplus
bool Close1 = true;
bool Close2 = true;
bool IsLuminosity = false;
bool IsSelf = false;
// c_nStroke, c_nWindingFillMode, c_nEvenOddFillMode
long FillType = c_nWindingFillMode;

View File

@ -2142,7 +2142,12 @@ namespace Aggplus
agg::trans_affine* full_trans = &m_oFullTransform.m_internal->m_agg_mtx;
double dDet = full_trans->determinant();
if (fabs(dDet) < 0.0001)
double sx = sqrt(full_trans->sx * full_trans->sx + full_trans->shx * full_trans->shx);
double sy = sqrt(full_trans->shy * full_trans->shy + full_trans->sy * full_trans->sy);
double scale = std::max(sx, sy);
double adaptive_threshold = 1.0 / (scale * scale * 10000.0);
if (fabs(dDet) < std::max(0.0001, adaptive_threshold))
{
path_copy.transform_all_paths(m_oFullTransform.m_internal->m_agg_mtx);
dWidth *= sqrt(fabs(dDet));
@ -2240,6 +2245,8 @@ namespace Aggplus
LONG lCount2 = lCount / 2;
double dKoef = 1.0;
if (bIsUseIdentity)
dKoef = sqrt(fabs(m_oFullTransform.m_internal->m_agg_mtx.determinant()));
for (LONG i = 0; i < lCount2; ++i)
{

View File

@ -886,17 +886,17 @@ namespace Aggplus
if (isCurve)
{
std::vector<PointD> points = GetPoints(idx, 4);
area = (points[3].Y - points[0].Y) * (points[1].X + points[2].X)
- (points[3].X - points[0].X) * (points[1].Y + points[2].Y)
+ points[1].Y * (points[0].X - points[2].X)
- points[1].X * (points[0].Y - points[2].Y)
+ points[3].Y * (points[2].X + points[0].X / 3.0)
- points[3].X * (points[2].Y + points[0].Y / 3.0);
area = 3.0 * (points[3].Y - points[0].Y) * (points[1].X + points[2].X)
- (points[3].X - points[0].X) * (points[1].Y + points[2].Y)
+ points[1].Y * (points[0].X - points[2].X)
- points[1].X * (points[0].Y - points[2].Y)
+ points[3].Y * (points[2].X + points[0].X / 3.0)
- points[3].X * (points[2].Y + points[0].Y / 3.0) / 20.0;
}
else
{
std::vector<PointD> points = GetPoints(idx, 2);
area = 4.0 * (points[1].Y * points[0].X - points[1].X * points[0].Y) / 3.0;
area = (points[1].Y * points[0].X - points[1].X * points[0].Y) / 2.0;
}
return area;

View File

@ -117,6 +117,7 @@ const long c_nDarkMode = 0x0008;
const long c_nUseDictionaryFonts = 0x0010;
const long c_nPenWidth0As1px = 0x0020;
const long c_nSupportPathTextAsText = 0x0040;
const long c_nFontSubstitution = 0x0080;
// типы рендерера
const long c_nUnknownRenderer = 0x0000;

View File

@ -46,6 +46,92 @@
// void Set(const std::wstring& ws) { m_ws = ws; }
// const std::wstring& Get() { return m_ws; }
CAnnotFieldInfo::CActionFieldPr* ReadAction(NSOnlineOfficeBinToPdf::CBufferReader* pReader)
{
CAnnotFieldInfo::CActionFieldPr* pRes = new CAnnotFieldInfo::CActionFieldPr();
pRes->nActionType = pReader->ReadByte();
switch (pRes->nActionType)
{
case 14: // JavaScript
{
pRes->wsStr1 = pReader->ReadString();
break;
}
case 1: // GoTo
{
pRes->nInt1 = pReader->ReadInt();
pRes->nKind = pReader->ReadByte();
switch (pRes->nKind)
{
case 0:
case 2:
case 3:
case 6:
case 7:
{
pRes->nFlags = pReader->ReadByte();
if (pRes->nFlags & (1 << 0))
pRes->dD[0] = pReader->ReadDouble();
if (pRes->nFlags & (1 << 1))
pRes->dD[1] = pReader->ReadDouble();
if (pRes->nFlags & (1 << 2))
pRes->dD[2] = pReader->ReadDouble();
break;
}
case 4:
{
pRes->dD[0] = pReader->ReadDouble();
pRes->dD[1] = pReader->ReadDouble();
pRes->dD[2] = pReader->ReadDouble();
pRes->dD[3] = pReader->ReadDouble();
break;
}
case 1:
case 5:
default:
{
break;
}
}
break;
}
case 10: // Named
{
pRes->wsStr1 = pReader->ReadString();
break;
}
case 6: // URI
{
pRes->wsStr1 = pReader->ReadString();
break;
}
case 9: // Hide
{
pRes->nKind = pReader->ReadByte();
int n = pReader->ReadInt();
pRes->arrStr.reserve(n);
for (int i = 0; i < n; ++i)
pRes->arrStr.push_back(pReader->ReadString());
break;
}
case 12: // ResetForm
{
pRes->nInt1 = pReader->ReadInt();
int n = pReader->ReadInt();
pRes->arrStr.reserve(n);
for (int i = 0; i < n; ++i)
pRes->arrStr.push_back(pReader->ReadString());
break;
}
}
if (pReader->ReadByte())
pRes->pNext = ReadAction(pReader);
return pRes;
}
CAnnotFieldInfo::CAnnotFieldInfo() : IAdvancedCommand(AdvancedCommandType::Annotaion)
{
m_nType = EAnnotType::Unknown;
@ -77,6 +163,7 @@ CAnnotFieldInfo::CAnnotFieldInfo() : IAdvancedCommand(AdvancedCommandType::Annot
m_pCaretPr = NULL;
m_pStampPr = NULL;
m_pRedactPr = NULL;
m_pLinkPr = NULL;
m_pWidgetPr = NULL;
}
CAnnotFieldInfo::~CAnnotFieldInfo()
@ -93,6 +180,7 @@ CAnnotFieldInfo::~CAnnotFieldInfo()
RELEASEOBJECT(m_pCaretPr);
RELEASEOBJECT(m_pStampPr);
RELEASEOBJECT(m_pRedactPr);
RELEASEOBJECT(m_pLinkPr);
RELEASEOBJECT(m_pWidgetPr);
}
@ -113,6 +201,12 @@ void CAnnotFieldInfo::SetType(int nType)
m_pTextPr = new CAnnotFieldInfo::CTextAnnotPr();
break;
}
case EAnnotType::Link:
{
RELEASEOBJECT(m_pLinkPr);
m_pLinkPr = new CAnnotFieldInfo::CLinkAnnotPr();
break;
}
case EAnnotType::FreeText:
{
CreateMarkup();
@ -305,6 +399,10 @@ bool CAnnotFieldInfo::IsRedact() const
{
return (m_nType == 25);
}
bool CAnnotFieldInfo::IsLink() const
{
return (m_nType == 1);
}
CAnnotFieldInfo::CMarkupAnnotPr* CAnnotFieldInfo::GetMarkupAnnotPr() { return m_pMarkupPr; }
CAnnotFieldInfo::CTextAnnotPr* CAnnotFieldInfo::GetTextAnnotPr() { return m_pTextPr; }
@ -318,6 +416,7 @@ CAnnotFieldInfo::CFreeTextAnnotPr* CAnnotFieldInfo::GetFreeTextAnnotPr()
CAnnotFieldInfo::CCaretAnnotPr* CAnnotFieldInfo::GetCaretAnnotPr() { return m_pCaretPr; }
CAnnotFieldInfo::CStampAnnotPr* CAnnotFieldInfo::GetStampAnnotPr() { return m_pStampPr; }
CAnnotFieldInfo::CRedactAnnotPr* CAnnotFieldInfo::GetRedactAnnotPr() { return m_pRedactPr; }
CAnnotFieldInfo::CLinkAnnotPr* CAnnotFieldInfo::GetLinkAnnotPr() { return m_pLinkPr; }
CAnnotFieldInfo::CWidgetAnnotPr* CAnnotFieldInfo::GetWidgetAnnotPr() { return m_pWidgetPr; }
bool CAnnotFieldInfo::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, IMetafileToRenderter* pCorrector)
@ -412,6 +511,8 @@ bool CAnnotFieldInfo::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, IMeta
m_pPopupPr->Read(pReader);
else if (IsWidget())
m_pWidgetPr->Read(pReader, nType);
else if (IsLink())
m_pLinkPr->Read(pReader);
return m_nType != -1;
}
@ -721,6 +822,45 @@ void CAnnotFieldInfo::CRedactAnnotPr::Read(NSOnlineOfficeBinToPdf::CBufferReader
}
}
CAnnotFieldInfo::CLinkAnnotPr::CLinkAnnotPr()
{
m_pAction = NULL;
m_pPA = NULL;
}
CAnnotFieldInfo::CLinkAnnotPr::~CLinkAnnotPr()
{
RELEASEOBJECT(m_pAction);
RELEASEOBJECT(m_pPA);
}
BYTE CAnnotFieldInfo::CLinkAnnotPr::GetH() const { return m_nH; }
int CAnnotFieldInfo::CLinkAnnotPr::GetFlags() const { return m_nFlags; }
const std::vector<double>& CAnnotFieldInfo::CLinkAnnotPr::GetQuadPoints() { return m_arrQuadPoints; }
CAnnotFieldInfo::CActionFieldPr* CAnnotFieldInfo::CLinkAnnotPr::GetA() { return m_pAction; }
CAnnotFieldInfo::CActionFieldPr* CAnnotFieldInfo::CLinkAnnotPr::GetPA() { return m_pPA; }
void CAnnotFieldInfo::CLinkAnnotPr::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader)
{
m_nFlags = pReader->ReadInt();
if (m_nFlags & (1 << 0))
{
pReader->ReadString();
m_pAction = ReadAction(pReader);
}
if (m_nFlags & (1 << 1))
{
pReader->ReadString();
m_pPA = ReadAction(pReader);
}
if (m_nFlags & (1 << 2))
m_nH = pReader->ReadByte();
if (m_nFlags & (1 << 3))
{
int n = pReader->ReadInt();
m_arrQuadPoints.reserve(n);
for (int i = 0; i < n; ++i)
m_arrQuadPoints.push_back(pReader->ReadDouble());
}
}
bool CAnnotFieldInfo::CPopupAnnotPr::IsOpen() const { return m_bOpen; }
int CAnnotFieldInfo::CPopupAnnotPr::GetFlag() const { return m_nFlag; }
int CAnnotFieldInfo::CPopupAnnotPr::GetParentID() const { return m_nParentID; }
@ -752,7 +892,7 @@ const std::wstring& CAnnotFieldInfo::CWidgetAnnotPr::GetFontKey() { return m_w
const std::vector<double>& CAnnotFieldInfo::CWidgetAnnotPr::GetTC() { return m_arrTC; }
const std::vector<double>& CAnnotFieldInfo::CWidgetAnnotPr::GetBC() { return m_arrBC; }
const std::vector<double>& CAnnotFieldInfo::CWidgetAnnotPr::GetBG() { return m_arrBG; }
const std::vector<CAnnotFieldInfo::CWidgetAnnotPr::CActionWidget*>& CAnnotFieldInfo::CWidgetAnnotPr::GetActions() { return m_arrAction; }
const std::vector<CAnnotFieldInfo::CActionFieldPr*>& CAnnotFieldInfo::CWidgetAnnotPr::GetActions() { return m_arrAction; }
CAnnotFieldInfo::CWidgetAnnotPr::CButtonWidgetPr* CAnnotFieldInfo::CWidgetAnnotPr::GetButtonWidgetPr() { return m_pButtonPr; }
CAnnotFieldInfo::CWidgetAnnotPr::CTextWidgetPr* CAnnotFieldInfo::CWidgetAnnotPr::GetTextWidgetPr() { return m_pTextPr; }
CAnnotFieldInfo::CWidgetAnnotPr::CChoiceWidgetPr* CAnnotFieldInfo::CWidgetAnnotPr::GetChoiceWidgetPr() { return m_pChoicePr; }
@ -812,93 +952,8 @@ CAnnotFieldInfo::CWidgetAnnotPr::~CWidgetAnnotPr()
RELEASEOBJECT(m_arrAction[i]);
}
CAnnotFieldInfo::CWidgetAnnotPr::CActionWidget::CActionWidget() : pNext(NULL) {}
CAnnotFieldInfo::CWidgetAnnotPr::CActionWidget::~CActionWidget() { RELEASEOBJECT(pNext); }
CAnnotFieldInfo::CWidgetAnnotPr::CActionWidget* ReadAction(NSOnlineOfficeBinToPdf::CBufferReader* pReader)
{
CAnnotFieldInfo::CWidgetAnnotPr::CActionWidget* pRes = new CAnnotFieldInfo::CWidgetAnnotPr::CActionWidget();
pRes->nActionType = pReader->ReadByte();
switch (pRes->nActionType)
{
case 14: // JavaScript
{
pRes->wsStr1 = pReader->ReadString();
break;
}
case 1: // GoTo
{
pRes->nInt1 = pReader->ReadInt();
pRes->nKind = pReader->ReadByte();
switch (pRes->nKind)
{
case 0:
case 2:
case 3:
case 6:
case 7:
{
pRes->nFlags = pReader->ReadByte();
if (pRes->nFlags & (1 << 0))
pRes->dD[0] = pReader->ReadDouble();
if (pRes->nFlags & (1 << 1))
pRes->dD[1] = pReader->ReadDouble();
if (pRes->nFlags & (1 << 2))
pRes->dD[2] = pReader->ReadDouble();
break;
}
case 4:
{
pRes->dD[0] = pReader->ReadDouble();
pRes->dD[1] = pReader->ReadDouble();
pRes->dD[2] = pReader->ReadDouble();
pRes->dD[3] = pReader->ReadDouble();
break;
}
case 1:
case 5:
default:
{
break;
}
}
break;
}
case 10: // Named
{
pRes->wsStr1 = pReader->ReadString();
break;
}
case 6: // URI
{
pRes->wsStr1 = pReader->ReadString();
break;
}
case 9: // Hide
{
pRes->nKind = pReader->ReadByte();
int n = pReader->ReadInt();
pRes->arrStr.reserve(n);
for (int i = 0; i < n; ++i)
pRes->arrStr.push_back(pReader->ReadString());
break;
}
case 12: // ResetForm
{
pRes->nInt1 = pReader->ReadInt();
int n = pReader->ReadInt();
pRes->arrStr.reserve(n);
for (int i = 0; i < n; ++i)
pRes->arrStr.push_back(pReader->ReadString());
break;
}
}
if (pReader->ReadByte())
pRes->pNext = ReadAction(pReader);
return pRes;
}
CAnnotFieldInfo::CActionFieldPr::CActionFieldPr() : pNext(NULL) {}
CAnnotFieldInfo::CActionFieldPr::~CActionFieldPr() { RELEASEOBJECT(pNext); }
void CAnnotFieldInfo::CWidgetAnnotPr::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, BYTE nType)
{
m_wsFN = pReader->ReadString();
@ -957,7 +1012,7 @@ void CAnnotFieldInfo::CWidgetAnnotPr::Read(NSOnlineOfficeBinToPdf::CBufferReader
for (int i = 0; i < nAction; ++i)
{
std::wstring wsType = pReader->ReadString();
CAnnotFieldInfo::CWidgetAnnotPr::CActionWidget* pA = ReadAction(pReader);
CAnnotFieldInfo::CActionFieldPr* pA = ReadAction(pReader);
if (pA)
{
pA->wsType = wsType;
@ -987,6 +1042,7 @@ const std::wstring& CAnnotFieldInfo::CWidgetAnnotPr::CButtonWidgetPr::GetCA() {
const std::wstring& CAnnotFieldInfo::CWidgetAnnotPr::CButtonWidgetPr::GetRC() { return m_wsRC; }
const std::wstring& CAnnotFieldInfo::CWidgetAnnotPr::CButtonWidgetPr::GetAC() { return m_wsAC; }
const std::wstring& CAnnotFieldInfo::CWidgetAnnotPr::CButtonWidgetPr::GetAP_N_Yes() { return m_wsAP_N_Yes; }
const std::vector< std::pair<std::wstring, std::wstring> >& CAnnotFieldInfo::CWidgetAnnotPr::CButtonWidgetPr::GetOpt() { return m_arrOpt; }
void CAnnotFieldInfo::CWidgetAnnotPr::CButtonWidgetPr::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, BYTE nType, int nFlags)
{
if (nType == 27)
@ -1027,6 +1083,17 @@ void CAnnotFieldInfo::CWidgetAnnotPr::CButtonWidgetPr::Read(NSOnlineOfficeBinToP
if (nFlags & (1 << 9))
m_wsV = pReader->ReadString();
m_nStyle = pReader->ReadByte();
if (nFlags & (1 << 10))
{
int n = pReader->ReadInt();
m_arrOpt.reserve(n);
for (int i = 0; i < n; ++i)
{
std::wstring s1 = pReader->ReadString();
std::wstring s2 = pReader->ReadString();
m_arrOpt.push_back(std::make_pair(s1, s2));
}
}
if (nFlags & (1 << 14))
m_wsAP_N_Yes = pReader->ReadString();
}
@ -1192,7 +1259,7 @@ bool CWidgetsInfo::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, IMetafil
for (int i = 0; i < nAction; ++i)
{
std::wstring wsType = pReader->ReadString();
CAnnotFieldInfo::CWidgetAnnotPr::CActionWidget* pA = ReadAction(pReader);
CAnnotFieldInfo::CActionFieldPr* pA = ReadAction(pReader);
if (pA)
{
pA->wsType = wsType;

View File

@ -70,6 +70,23 @@ public:
WidgetSignature = 33
};
class GRAPHICS_DECL CActionFieldPr
{
public:
CActionFieldPr();
~CActionFieldPr();
BYTE nKind;
BYTE nFlags;
BYTE nActionType;
int nInt1;
double dD[4]{};
std::wstring wsType;
std::wstring wsStr1;
std::vector<std::wstring> arrStr;
CActionFieldPr* pNext;
};
class GRAPHICS_DECL CWidgetAnnotPr
{
public:
@ -90,6 +107,7 @@ public:
const std::wstring& GetRC();
const std::wstring& GetAC();
const std::wstring& GetAP_N_Yes();
const std::vector< std::pair<std::wstring, std::wstring> >& GetOpt();
void Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, BYTE nType, int nFlags);
@ -108,6 +126,7 @@ public:
std::wstring m_wsRC;
std::wstring m_wsAC;
std::wstring m_wsAP_N_Yes;
std::vector< std::pair<std::wstring, std::wstring> > m_arrOpt;
};
class GRAPHICS_DECL CTextWidgetPr
@ -159,23 +178,6 @@ public:
};
class GRAPHICS_DECL CActionWidget
{
public:
CActionWidget();
~CActionWidget();
BYTE nKind;
BYTE nFlags;
BYTE nActionType;
int nInt1;
double dD[4]{};
std::wstring wsType;
std::wstring wsStr1;
std::vector<std::wstring> arrStr;
CActionWidget* pNext;
};
CWidgetAnnotPr(BYTE nType);
~CWidgetAnnotPr();
@ -199,7 +201,7 @@ public:
const std::vector<double>& GetTC();
const std::vector<double>& GetBC();
const std::vector<double>& GetBG();
const std::vector<CActionWidget*>& GetActions();
const std::vector<CActionFieldPr*>& GetActions();
CButtonWidgetPr* GetButtonWidgetPr();
CTextWidgetPr* GetTextWidgetPr();
@ -229,7 +231,7 @@ public:
std::vector<double> m_arrTC;
std::vector<double> m_arrBC;
std::vector<double> m_arrBG;
std::vector<CActionWidget*> m_arrAction;
std::vector<CActionFieldPr*> m_arrAction;
CButtonWidgetPr* m_pButtonPr;
CTextWidgetPr* m_pTextPr;
@ -389,7 +391,7 @@ public:
{
public:
bool IsOpen() const;
int GetFlag() const;
int GetFlag() const;
int GetParentID() const;
void Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader);
@ -478,6 +480,28 @@ public:
std::vector<double> m_arrQuadPoints;
};
class GRAPHICS_DECL CLinkAnnotPr
{
public:
CLinkAnnotPr();
~CLinkAnnotPr();
BYTE GetH() const;
int GetFlags() const;
const std::vector<double>& GetQuadPoints();
CActionFieldPr* GetA();
CActionFieldPr* GetPA();
void Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader);
private:
BYTE m_nH;
int m_nFlags;
std::vector<double> m_arrQuadPoints;
CActionFieldPr* m_pAction;
CActionFieldPr* m_pPA;
};
CAnnotFieldInfo();
virtual ~CAnnotFieldInfo();
@ -518,6 +542,7 @@ public:
bool IsCaret() const;
bool IsStamp() const;
bool IsRedact() const;
bool IsLink() const;
CMarkupAnnotPr* GetMarkupAnnotPr();
CTextAnnotPr* GetTextAnnotPr();
@ -531,6 +556,7 @@ public:
CCaretAnnotPr* GetCaretAnnotPr();
CStampAnnotPr* GetStampAnnotPr();
CRedactAnnotPr* GetRedactAnnotPr();
CLinkAnnotPr* GetLinkAnnotPr();
CWidgetAnnotPr* GetWidgetAnnotPr();
bool Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, IMetafileToRenderter* pCorrector);
@ -576,6 +602,7 @@ private:
CCaretAnnotPr* m_pCaretPr;
CStampAnnotPr* m_pStampPr;
CRedactAnnotPr* m_pRedactPr;
CLinkAnnotPr* m_pLinkPr;
CWidgetAnnotPr* m_pWidgetPr;
};
@ -610,7 +637,7 @@ public:
std::wstring sTU;
std::vector<int> arrI;
std::vector<std::wstring> arrV;
std::vector<CAnnotFieldInfo::CWidgetAnnotPr::CActionWidget*> arrAction;
std::vector<CAnnotFieldInfo::CActionFieldPr*> arrAction;
std::vector< std::pair<std::wstring, std::wstring> > arrOpt;
};

View File

@ -179,7 +179,6 @@ CHeadings::CHeading::CHeading()
nPage = 0;
dX = 0.0;
dY = 0.0;
pParent = NULL;
}
CHeadings::CHeading::~CHeading()
{
@ -196,35 +195,26 @@ CHeadings::~CHeadings()
const std::vector<CHeadings::CHeading*>& CHeadings::GetHeading() { return m_arrHeading; }
bool CHeadings::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, IMetafileToRenderter* pCorrector)
{
int nPredLevel = 0, nHeaderLevel = 0;
std::vector<CHeading*>* arrHeading = &m_arrHeading;
CHeading* pParent = NULL;
std::vector<CHeading*> arrParentStack;
int nHeadings = pReader->ReadInt();
for (int i = 0; i < nHeadings; ++i)
{
int nLevel = pReader->ReadInt();
if (nLevel > nPredLevel && i > 0)
{
nHeaderLevel = nPredLevel;
pParent = arrHeading->back();
arrHeading = &pParent->arrHeading;
}
else if (nLevel < nPredLevel && nLevel <= nHeaderLevel)
{
nHeaderLevel = nLevel;
pParent = pParent ? pParent->pParent : NULL;
arrHeading = pParent ? &pParent->arrHeading : &m_arrHeading;
}
nPredLevel = nLevel;
CHeading* pHeading = new CHeading();
pHeading->nPage = pReader->ReadInt();
pHeading->dX = pReader->ReadDouble();
pHeading->dY = pReader->ReadDouble();
pHeading->wsTitle = pReader->ReadString();
pHeading->pParent = pParent;
arrHeading->push_back(pHeading);
while (arrParentStack.size() > nLevel)
arrParentStack.pop_back();
if (arrParentStack.empty())
m_arrHeading.push_back(pHeading);
else
arrParentStack.back()->arrHeading.push_back(pHeading);
arrParentStack.push_back(pHeading);
}
return true;
}

View File

@ -181,7 +181,6 @@ public:
int nPage;
double dX;
double dY;
CHeading* pParent;
std::vector<CHeading*> arrHeading;
CHeading();

View File

@ -46,6 +46,7 @@
"_InitializeFontsRanges",
"_SetFontBinary",
"_GetFontBinary",
"_GetGIDByUnicode",
"_IsFontBinaryExist",
"_DestroyTextInfo",
"_IsNeedCMap",
@ -56,6 +57,8 @@
"_UnmergePages",
"_RedactPage",
"_UndoRedact",
"_CheckOwnerPassword",
"_CheckPerm",
"_GetImageBase64",
"_GetImageBase64Len",
"_GetImageBase64Ptr",

View File

@ -145,6 +145,14 @@ CFile.prototype["isNeedPassword"] = function()
{
return this._isNeedPassword;
};
CFile.prototype["CheckOwnerPassword"] = function(password)
{
return this._CheckOwnerPassword(password);
};
CFile.prototype["CheckPerm"] = function(perm)
{
return this._CheckPerm(perm);
};
CFile.prototype["SplitPages"] = function(arrOriginIndex, arrayBufferChanges)
{
let ptr = this._SplitPages(arrOriginIndex, arrayBufferChanges);
@ -354,6 +362,11 @@ CFile.prototype["getFontByID"] = function(ID)
return this._getFontByID(ID);
};
CFile.prototype["getGIDByUnicode"] = function(ID)
{
return this._getGIDByUnicode(ID);
};
CFile.prototype["setCMap"] = function(memoryBuffer)
{
if (!this.nativeFile)
@ -413,9 +426,9 @@ function readAction(reader, rec, readDoubleFunc, readStringFunc)
case 4:
{
rec["left"] = readDoubleFunc.call(reader);
rec["bottom"] = readDoubleFunc.call(reader);
rec["top"] = readDoubleFunc.call(reader);
rec["right"] = readDoubleFunc.call(reader);
rec["top"] = readDoubleFunc.call(reader);
rec["bottom"] = readDoubleFunc.call(reader);
break;
}
case 1:
@ -1027,6 +1040,33 @@ function readAnnotType(reader, rec, readDoubleFunc, readDouble2Func, readStringF
rec["font"]["style"] = reader.readInt();
}
}
// Link
else if (rec["type"] == 1)
{
flags = reader.readInt();
if (flags & (1 << 0))
{
rec["A"] = {};
readAction(reader, rec["A"], readDoubleFunc, readStringFunc);
}
if (flags & (1 << 1))
{
rec["PA"] = {};
readAction(reader, rec["PA"], readDoubleFunc, readStringFunc);
}
// Selection mode - H
// 0 - none, 1 - invert, 2 - push, 3 - outline
if (flags & (1 << 2))
rec["highlight"] = reader.readByte();
// QuadPoints
if (flags & (1 << 3))
{
let n = reader.readInt();
rec["QuadPoints"] = [];
for (let i = 0; i < n; ++i)
rec["QuadPoints"].push(readDoubleFunc.call(reader));
}
}
}
function readWidgetType(reader, rec, readDoubleFunc, readDouble2Func, readStringFunc, isRead = false)
{
@ -1171,6 +1211,20 @@ function readWidgetType(reader, rec, readDoubleFunc, readDouble2Func, readString
rec["value"] = readStringFunc.call(reader);
// 0 - check, 1 - cross, 2 - diamond, 3 - circle, 4 - star, 5 - square
rec["style"] = reader.readByte();
if (flags & (1 << 10))
{
let n = reader.readInt();
rec["opt"] = [];
for (let i = 0; i < n; ++i)
{
let opt1 = readStringFunc.call(reader);
let opt2 = readStringFunc.call(reader);
if (opt1 == "")
rec["opt"].push(opt2);
else
rec["opt"].push([opt2, opt1]);
}
}
if (flags & (1 << 14))
rec["ExportValue"] = readStringFunc.call(reader);
// 12.7.4.2.1

View File

@ -146,6 +146,16 @@ CFile.prototype._UndoRedact = function()
return g_native_drawing_file["UndoRedact"]();
};
CFile.prototype._CheckOwnerPassword = function(password)
{
return true;
}
CFile.prototype._CheckPerm = function(perm)
{
return true;
}
// FONTS
CFile.prototype._isNeedCMap = function()
{
@ -162,6 +172,12 @@ CFile.prototype._getFontByID = function(ID)
return g_native_drawing_file["GetFontBinary"](ID);
};
CFile.prototype._getGIDByUnicode = function(ID)
{
g_module_pointer.ptr = g_native_drawing_file["GetGIDByUnicode"](ID);
return g_module_pointer;
}
CFile.prototype._getInteractiveFormsFonts = function(type)
{
g_module_pointer.ptr = g_native_drawing_file["GetInteractiveFormsFonts"](type);

View File

@ -224,6 +224,29 @@ CFile.prototype._UndoRedact = function()
return Module["_UndoRedact"](this.nativeFile) == 1;
};
CFile.prototype._CheckOwnerPassword = function(password)
{
let passwordPtr = 0;
if (password)
{
let passwordBuf = password.toUtf8();
passwordPtr = Module["_malloc"](passwordBuf.length);
Module["HEAP8"].set(passwordBuf, passwordPtr);
}
let bRes = Module["_CheckOwnerPassword"](this.nativeFile, passwordPtr);
if (passwordPtr)
Module["_free"](passwordPtr);
return bRes == 1;
}
CFile.prototype._CheckPerm = function(perm)
{
return Module["_CheckPerm"](this.nativeFile, perm) == 1;
}
// FONTS
CFile.prototype._isNeedCMap = function()
{
@ -263,6 +286,34 @@ CFile.prototype._getFontByID = function(ID)
return res;
};
CFile.prototype._getGIDByUnicode = function(ID)
{
if (ID === undefined)
return null;
let idBuffer = ID.toUtf8();
let idPointer = Module["_malloc"](idBuffer.length);
Module["HEAP8"].set(idBuffer, idPointer);
g_module_pointer.ptr = Module["_GetGIDByUnicode"](this.nativeFile, idPointer);
Module["_free"](idPointer);
let reader = g_module_pointer.getReader();
if (!reader)
return null;
let res = {};
let nFontLength = reader.readInt();
for (let i = 0; i < nFontLength; i++)
{
let np1 = reader.readInt();
let np2 = reader.readInt();
res[np2] = np1;
}
g_module_pointer.free();
return res;
}
CFile.prototype._getInteractiveFormsFonts = function(type)
{
g_module_pointer.ptr = Module["_GetInteractiveFormsFonts"](this.nativeFile, type);

View File

@ -150,6 +150,10 @@ WASM_EXPORT BYTE* GetFontBinary(CDrawingFile* pFile, char* path)
{
return pFile->GetFontBinary(std::string(path));
}
WASM_EXPORT BYTE* GetGIDByUnicode(CDrawingFile* pFile, char* path)
{
return pFile->GetGIDByUnicode(std::string(path));
}
WASM_EXPORT void DestroyTextInfo(CDrawingFile* pFile)
{
return pFile->DestroyTextInfo();
@ -191,6 +195,17 @@ WASM_EXPORT int UndoRedact(CDrawingFile* pFile)
{
return pFile->UndoRedact() ? 1 : 0;
}
WASM_EXPORT int CheckOwnerPassword(CDrawingFile* pFile, const char* password)
{
std::wstring sPassword = L"";
if (NULL != password)
sPassword = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)password, strlen(password));
return pFile->CheckOwnerPassword(sPassword) ? 1 : 0;
}
WASM_EXPORT int CheckPerm(CDrawingFile* pFile, int nPermFlag)
{
return pFile->CheckPerm(nPermFlag) ? 1 : 0;
}
WASM_EXPORT void* GetImageBase64(CDrawingFile* pFile, int rId)
{

View File

@ -704,6 +704,23 @@ void ReadInteractiveForms(BYTE* pWidgets, int& i)
i += 1;
std::cout << "Style " << arrStyle[nPathLength] << ", ";
if (nFlags & (1 << 10))
{
int nOptLength = READ_INT(pWidgets + i);
i += 4;
for (int j = 0; j < nOptLength; ++j)
{
nPathLength = READ_INT(pWidgets + i);
i += 4;
std::cout << std::to_string(j) << " Opt1 " << std::string((char*)(pWidgets + i), nPathLength) << ", ";
i += nPathLength;
nPathLength = READ_INT(pWidgets + i);
i += 4;
std::cout << std::to_string(j) << " Opt2 " << std::string((char*)(pWidgets + i), nPathLength) << ", ";
i += nPathLength;
}
}
if (nFlags & (1 << 14))
{
nPathLength = READ_INT(pWidgets + i);
@ -938,6 +955,36 @@ void ReadInteractiveFormsFonts(CDrawingFile* pGrFile, int nType)
std::cout << "font" << j << ".txt";
}
if (pFont)
free(pFont);
if (false)
continue;
pFont = GetGIDByUnicode(pGrFile, (char*)sFontName.c_str());
nLength2 = READ_INT(pFont);
i2 = 4;
nLength2 -= 4;
while (i2 < nLength2)
{
int nFontLength = READ_INT(pFont + i2);
i2 += 4;
std::cout << std::endl << "CIDtoUnicode" << std::endl;
for (int j = 0; j < nFontLength; ++j)
{
unsigned int code = READ_INT(pFont + i2);
i2 += 4;
unsigned int unicode = READ_INT(pFont + i2);
i2 += 4;
std::cout << "cid\t" << code << "\tunicode\t" << unicode << std::endl;
}
std::cout << std::endl;
}
if (pFont)
free(pFont);
}
@ -1125,6 +1172,18 @@ int main(int argc, char* argv[])
}
}
// OWNER PASSWORD
if (false)
{
std::string sPassword = "gfhjkmgfhjkm";
std::cout << "CheckPerm 4 Edit " << CheckPerm(pGrFile, 4) << std::endl;
std::cout << "CheckPerm 4 Print " << CheckPerm(pGrFile, 3) << std::endl;
std::cout << "CheckOwnerPassword " << CheckOwnerPassword(pGrFile, sPassword.c_str()) << std::endl;
std::cout << "CheckPerm 4 Edit " << CheckPerm(pGrFile, 4) << std::endl;
std::cout << "CheckPerm 4 Print " << CheckPerm(pGrFile, 3) << std::endl;
}
BYTE* pColor = new BYTE[12] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
// REDACT
if (false)
@ -1134,17 +1193,17 @@ int main(int argc, char* argv[])
std::cout << "Redact false" << std::endl;
}
int i = nTestPage;
//for (int i = 0; i < nPagesCount; ++i)
// RASTER
if (true)
{
// RASTER
if (true)
int i = nTestPage;
//for (int i = 0; i < nPagesCount; ++i)
{
nWidth = READ_INT(pInfo + i * 16 + 12);
nHeight = READ_INT(pInfo + i * 16 + 16);
//nWidth *= 3;
//nHeight *= 3;
//nWidth *= 2;
//nHeight *= 2;
BYTE* res = NULL;
res = GetPixmap(pGrFile, i, nWidth, nHeight, 0xFFFFFF);
@ -1164,7 +1223,7 @@ int main(int argc, char* argv[])
free(pInfo);
// LINKS
if (true && nPagesCount > 0)
if (false && nPagesCount > 0)
{
BYTE* pLinks = GetLinks(pGrFile, nTestPage);
nLength = READ_INT(pLinks);
@ -1200,7 +1259,7 @@ int main(int argc, char* argv[])
}
// STRUCTURE
if (true)
if (false)
{
BYTE* pStructure = GetStructure(pGrFile);
nLength = READ_INT(pStructure);
@ -2132,6 +2191,44 @@ int main(int argc, char* argv[])
std::cout << nPathLength << ", ";
}
}
else if (sType == "Link")
{
nFlags = READ_INT(pAnnots + i);
i += 4;
if (nFlags & (1 << 0))
{
std::cout << std::endl << "A ";
ReadAction(pAnnots, i);
std::cout << std::endl;
}
if (nFlags & (1 << 1))
{
std::cout << std::endl << "PA ";
ReadAction(pAnnots, i);
std::cout << std::endl;
}
if (nFlags & (1 << 2))
{
std::string arrHighlighting[] = {"none", "invert", "push", "outline"};
nPathLength = READ_BYTE(pAnnots + i);
i += 1;
std::cout << "Highlight " << arrHighlighting[nPathLength] << ", ";
}
if (nFlags & (1 << 3))
{
std::cout << "QuadPoints";
int nQuadPointsLength = READ_INT(pAnnots + i);
i += 4;
for (int j = 0; j < nQuadPointsLength; ++j)
{
nPathLength = READ_INT(pAnnots + i);
i += 4;
std::cout << " " << (double)nPathLength / 100.0;
}
std::cout << ", ";
}
}
std::cout << std::endl << "]" << std::endl;
}
@ -2157,9 +2254,12 @@ int main(int argc, char* argv[])
// SCAN PAGE
if (false)
{
BYTE* pScan = ScanPage(pGrFile, nTestPage, 1);
BYTE* pScan = ScanPage(pGrFile, nTestPage, 2);
if (pScan)
free(pScan);
ReadInteractiveFormsFonts(pGrFile, 1);
ReadInteractiveFormsFonts(pGrFile, 2);
}
Close(pGrFile);

View File

@ -202,6 +202,19 @@ bool CImageFileFormatChecker::isWbcFile(BYTE* pBuffer,DWORD dwBytes)
return false;
}
//raster graphics file format developed by Google
bool CImageFileFormatChecker::isWebPFile(BYTE* pBuffer, DWORD dwBytes)
{
if (eFileType)return false;
if ((20 <= dwBytes) && ('R' == pBuffer[0] && 'I' == pBuffer[1] && 'F' == pBuffer[2] && 'F' == pBuffer[3]
//47 length + 12
&& 'W' == pBuffer[8] && 'E' == pBuffer[9] && 'B' == pBuffer[10] && 'P' == pBuffer[11])
&& 'V' == pBuffer[12] && 'P' == pBuffer[13] && '8' == pBuffer[14])
return true;
return false;
}
//webshot(wb ver 1) HEX 57 57 42 42 31 31 31 31
//webshot (wb ver 2) HEX 00 00 02 00 02 10 c9 00 02 00 c8 06 4c 00 02 00
bool CImageFileFormatChecker::isWbFile(BYTE* pBuffer,DWORD dwBytes)
@ -509,6 +522,10 @@ bool CImageFileFormatChecker::isImageFile(const std::wstring& fileName)
{
eFileType = _CXIMAGE_FORMAT_WB;
}
else if (isWebPFile(buffer, sizeRead))
{
eFileType = _CXIMAGE_FORMAT_WEBP;
}
else if (isPsdFile(buffer,sizeRead))
{
eFileType = _CXIMAGE_FORMAT_PSD;

View File

@ -64,6 +64,7 @@ enum __ENUM_CXIMAGE_FORMATS
_CXIMAGE_FORMAT_SVG = 24,
_CXIMAGE_FORMAT_PIC = 25,
_CXIMAGE_FORMAT_HEIF = 26,
_CXIMAGE_FORMAT_WEBP = 27
};
class GRAPHICS_DECL CImageFileFormatChecker
@ -96,6 +97,7 @@ public:
bool isTiffFile(BYTE* pBuffer,DWORD dwBytes);
bool isJpgFile(BYTE* pBuffer,DWORD dwBytes);
bool isWbFile(BYTE* pBuffer,DWORD dwBytes);
bool isWebPFile(BYTE* pBuffer, DWORD dwBytes);
bool isIcoFile(BYTE* pBuffer,DWORD dwBytes);
bool isRasFile(BYTE* pBuffer,DWORD dwBytes);

View File

@ -8,8 +8,8 @@ namespace SVG
: CObject(oReader), m_enUnits{EMarkerUnits::StrokeWidth}, m_enOrient{EMarkerOrient::Angle},
m_dAngle(0.), m_oBounds{0., 0., 0., 0.}
{
m_oWindow.m_oWidth.SetValue(3);
m_oWindow.m_oHeight.SetValue(3);
m_oWindow.m_oWidth.SetValue(3, NSCSS::Pixel);
m_oWindow.m_oHeight.SetValue(3, NSCSS::Pixel);
}
ObjectType CMarker::GetType() const

View File

@ -153,7 +153,7 @@ namespace SVG
bool CObject::ApplyClip(IRenderer *pRenderer, const TClip *pClip, const CSvgFile *pFile, const TBounds &oBounds) const
{
if (NULL == pRenderer || NULL == pClip || NULL == pFile || pClip->m_oHref.Empty() || NSCSS::NSProperties::ColorType::ColorUrl != pClip->m_oHref.GetType())
if (NULL == pRenderer || NULL == pClip || NULL == pFile || pClip->m_oHref.Empty() || NSCSS::NSProperties::EColorType::ColorUrl != pClip->m_oHref.GetType())
return false;
if (pClip->m_oRule == L"evenodd")
@ -169,7 +169,7 @@ namespace SVG
bool CObject::ApplyMask(IRenderer *pRenderer, const NSCSS::NSProperties::CColor *pMask, const CSvgFile *pFile, const TBounds &oBounds) const
{
if (NULL == pRenderer || NULL == pMask || NULL == pFile || NSCSS::NSProperties::ColorType::ColorUrl != pMask->GetType())
if (NULL == pRenderer || NULL == pMask || NULL == pFile || NSCSS::NSProperties::EColorType::ColorUrl != pMask->GetType())
return false;
return ApplyDef(pRenderer, pFile, pMask->ToWString(), oBounds);
@ -358,7 +358,7 @@ namespace SVG
bool CRenderedObject::ApplyStroke(IRenderer *pRenderer, const TStroke *pStroke, bool bUseDefault, const CRenderedObject* pContextObject) const
{
if (NULL == pRenderer || NULL == pStroke || NSCSS::NSProperties::ColorType::ColorNone == pStroke->m_oColor.GetType() || (!bUseDefault && ((pStroke->m_oWidth.Empty() || pStroke->m_oWidth.Zero()) && pStroke->m_oColor.Empty())))
if (NULL == pRenderer || NULL == pStroke || NSCSS::NSProperties::EColorType::ColorNone == pStroke->m_oColor.GetType() || (!bUseDefault && ((pStroke->m_oWidth.Empty() || pStroke->m_oWidth.Zero()) && pStroke->m_oColor.Empty())))
{
pRenderer->put_PenSize(0);
return false;
@ -369,12 +369,12 @@ namespace SVG
if (Equals(0., dStrokeWidth))
dStrokeWidth = 1.;
if (NSCSS::NSProperties::ColorType::ColorContextFill == pStroke->m_oColor.GetType() && NULL != pContextObject)
if (NSCSS::NSProperties::EColorType::ColorContextFill == pStroke->m_oColor.GetType() && NULL != pContextObject)
pRenderer->put_PenColor(pContextObject->m_oStyles.m_oFill.ToInt());
else if (NSCSS::NSProperties::ColorType::ColorContextStroke == pStroke->m_oColor.GetType() && NULL != pContextObject)
else if (NSCSS::NSProperties::EColorType::ColorContextStroke == pStroke->m_oColor.GetType() && NULL != pContextObject)
pRenderer->put_PenColor(pContextObject->m_oStyles.m_oStroke.m_oColor.ToInt());
else
pRenderer->put_PenColor((pStroke->m_oColor.Empty() || NSCSS::NSProperties::ColorType::ColorNone == pStroke->m_oColor.GetType()) ? 0 : pStroke->m_oColor.ToInt());
pRenderer->put_PenColor((pStroke->m_oColor.Empty() || NSCSS::NSProperties::EColorType::ColorNone == pStroke->m_oColor.GetType()) ? 0 : pStroke->m_oColor.ToInt());
pRenderer->put_PenSize(dStrokeWidth);
pRenderer->put_PenAlpha(255. * pStroke->m_oColor.GetOpacity());
@ -401,18 +401,18 @@ namespace SVG
bool CRenderedObject::ApplyFill(IRenderer *pRenderer, const NSCSS::NSProperties::CColor *pFill, const CSvgFile *pFile, bool bUseDefault, const CRenderedObject* pContextObject) const
{
if (NULL == pRenderer || NULL == pFill || NSCSS::NSProperties::ColorType::ColorNone == pFill->GetType() || (!bUseDefault && pFill->Empty()))
if (NULL == pRenderer || NULL == pFill || NSCSS::NSProperties::EColorType::ColorNone == pFill->GetType() || (!bUseDefault && pFill->Empty()))
{
pRenderer->put_BrushType(c_BrushTypeNoFill);
return false;
}
else if (NSCSS::NSProperties::ColorType::ColorHEX == pFill->GetType() ||
NSCSS::NSProperties::ColorType::ColorRGB == pFill->GetType())
else if (NSCSS::NSProperties::EColorType::ColorHEX == pFill->GetType() ||
NSCSS::NSProperties::EColorType::ColorRGB == pFill->GetType())
{
pRenderer->put_BrushColor1((pFill->Empty() && bUseDefault) ? 0 : pFill->ToInt());
pRenderer->put_BrushType(c_BrushTypeSolid);
}
else if (NSCSS::NSProperties::ColorType::ColorUrl == pFill->GetType())
else if (NSCSS::NSProperties::EColorType::ColorUrl == pFill->GetType())
{
if (!ApplyDef(pRenderer, pFile, pFill->ToWString(), GetBounds()))
{
@ -425,10 +425,16 @@ namespace SVG
return false;
}
}
else if (NSCSS::NSProperties::ColorType::ColorContextFill == pFill->GetType() && NULL != pContextObject)
pRenderer->put_BrushColor1(pContextObject->m_oStyles.m_oFill.ToInt());
else if (NSCSS::NSProperties::ColorType::ColorContextStroke == pFill->GetType() && NULL != pContextObject)
pRenderer->put_BrushColor1(pContextObject->m_oStyles.m_oStroke.m_oColor.ToInt());
else if (NSCSS::NSProperties::EColorType::ColorContextFill == pFill->GetType() && NULL != pContextObject)
{
if (!ApplyFill(pRenderer, &pContextObject->m_oStyles.m_oFill, pFile, bUseDefault, pContextObject))
return false;
}
else if (NSCSS::NSProperties::EColorType::ColorContextStroke == pFill->GetType() && NULL != pContextObject)
{
if (!ApplyFill(pRenderer, &pContextObject->m_oStyles.m_oStroke.m_oColor, pFile, bUseDefault, pContextObject))
return false;
}
else if (bUseDefault)
{
pRenderer->put_BrushColor1(0);

View File

@ -566,7 +566,7 @@ namespace SVG
#define CALCULATE_ANGLE(firstPoint, secondPoint) std::atan2(secondPoint.dY - firstPoint.dY, secondPoint.dX - firstPoint.dX) * 180. / M_PI
if (!m_oMarkers.m_oStart.Empty() && NSCSS::NSProperties::ColorType::ColorUrl == m_oMarkers.m_oStart.GetType())
if (!m_oMarkers.m_oStart.Empty() && NSCSS::NSProperties::EColorType::ColorUrl == m_oMarkers.m_oStart.GetType())
{
CMarker *pStartMarker = dynamic_cast<CMarker*>(pFile->GetMarkedObject(m_oMarkers.m_oStart.ToWString()));
@ -610,7 +610,7 @@ namespace SVG
}
}
if (!m_oMarkers.m_oMid.Empty() && NSCSS::NSProperties::ColorType::ColorUrl == m_oMarkers.m_oMid.GetType())
if (!m_oMarkers.m_oMid.Empty() && NSCSS::NSProperties::EColorType::ColorUrl == m_oMarkers.m_oMid.GetType())
{
CMarker *pMidMarker = dynamic_cast<CMarker*>(pFile->GetMarkedObject(m_oMarkers.m_oMid.ToWString()));
@ -638,7 +638,7 @@ namespace SVG
}
}
if (!m_oMarkers.m_oEnd.Empty() && NSCSS::NSProperties::ColorType::ColorUrl == m_oMarkers.m_oEnd.GetType())
if (!m_oMarkers.m_oEnd.Empty() && NSCSS::NSProperties::EColorType::ColorUrl == m_oMarkers.m_oEnd.GetType())
{
CMarker *pEndMarker = dynamic_cast<CMarker*>(pFile->GetMarkedObject(m_oMarkers.m_oEnd.ToWString()));

View File

@ -110,6 +110,9 @@ namespace SVG
if (mAttributes.end() != mAttributes.find(L"text-decoration"))
m_oText.SetDecoration(mAttributes.at(L"text-decoration"), ushLevel, bHardMode);
if (mAttributes.end() != mAttributes.find(L"baseline-shift"))
m_oText.SetBaselineShift(mAttributes.at(L"baseline-shift"), ushLevel, bHardMode);
//POSITION
if (mAttributes.end() != mAttributes.find(L"rotate"))
{
@ -241,7 +244,27 @@ namespace SVG
std::wstring wsFontFamily = DefaultFontFamily;
double dFontSize = ((!m_oFont.GetSize().Empty()) ? m_oFont.GetSize().ToDouble(NSCSS::Pixel) : DEFAULT_FONT_SIZE) * 72. / 25.4;
Normalize(pRenderer, dX, dY, dFontSize, oOldMatrix);
double dScaleX = 1., dScaleY = 1.;
NormalizeFontSize(dFontSize, dScaleX, dScaleY);
if (!Equals(1., dScaleX) || !Equals(1., dScaleY))
{
dX /= dScaleX;
dY /= dScaleY;
double dM11, dM12, dM21, dM22, dDx, dDy;
pRenderer->GetTransform(&dM11, &dM12, &dM21, &dM22, &dDx, &dDy);
oOldMatrix.SetElements(dM11, dM12, dM21, dM22, dDx, dDy);
Aggplus::CMatrix oMatrix(dM11, dM12, dM21, dM22, dDx, dDy);
oMatrix.Scale(dScaleX, dScaleY);
pRenderer->SetTransform(oMatrix.sx(), oMatrix.shy(), oMatrix.shx(), oMatrix.sy(), oMatrix.tx(), oMatrix.ty());
}
if (!m_oFont.GetFamily().Empty())
{
@ -271,12 +294,12 @@ namespace SVG
m_pFontManager->LoadFontByName(wsFontFamily, dFontSize, nStyle, 72., 72.);
m_pFontManager->SetCharSpacing(0);
double dKoef = 25.4 / 72.;
const double dKoef = 25.4 / 72.;
NSFonts::IFontFile* pFontFile = m_pFontManager->GetFile();
if (pFontFile)
dFHeight *= pFontFile->GetHeight() / pFontFile->Units_Per_Em() * dKoef;
dFHeight *= pFontFile->GetHeight() / pFontFile->Units_Per_Em() * dKoef;
m_pFontManager->LoadString1(m_wsText, 0, 0);
TBBox oBox = m_pFontManager->MeasureString2();
@ -299,6 +322,45 @@ namespace SVG
else if (L"center" == m_oText.GetAlign().ToWString())
dX += -fW / 2;
if (NSCSS::NSProperties::EBaselineShift::Baseline != m_oText.GetBaselineShiftType())
{
switch(m_oText.GetBaselineShiftType())
{
case NSCSS::NSProperties::Sub:
{
dY += dFHeight / 2.;
break;
}
case NSCSS::NSProperties::Super:
{
double dParentHeight{dFHeight};
if (nullptr != m_pParent)
dParentHeight = ((CTSpan*)m_pParent)->GetFontHeight() / dScaleY;
dY -= dParentHeight - dFHeight / 2.;
break;
}
case NSCSS::NSProperties::Percentage:
{
double dParentHeight{dFHeight};
if (nullptr != m_pParent)
dParentHeight = ((CTSpan*)m_pParent)->GetFontHeight() / dScaleY;
dY -= dParentHeight * (m_oText.GetBaselineShiftValue() / 100.);
break;
}
case NSCSS::NSProperties::Length:
{
dY -= m_oText.GetBaselineShiftValue() / dScaleY;
break;
}
default:
break;
}
}
if (m_oText.Underline() || m_oText.LineThrough() || m_oText.Overline())
{
pRenderer->put_PenSize((double)fUndSize);
@ -389,7 +451,7 @@ namespace SVG
oBounds.m_dRight = oBounds.m_dLeft + GetWidth();
oBounds.m_dBottom = m_oY.ToDouble(NSCSS::Pixel);
oBounds.m_dTop = oBounds.m_dBottom + ((!m_oFont.GetSize().Empty()) ? m_oFont.GetSize().ToDouble(NSCSS::Pixel) : DEFAULT_FONT_SIZE);
oBounds.m_dTop = oBounds.m_dBottom - ((!m_oFont.GetSize().Empty()) ? m_oFont.GetSize().ToDouble(NSCSS::Pixel) : DEFAULT_FONT_SIZE);
if (nullptr != pTransform)
{
@ -484,56 +546,33 @@ namespace SVG
dY = m_oY.ToDouble(NSCSS::Pixel, oBounds.m_dBottom - oBounds.m_dTop);
}
void CTSpan::Normalize(IRenderer *pRenderer, double &dX, double &dY, double &dFontHeight, Aggplus::CMatrix& oOldMatrix) const
void CTSpan::NormalizeFontSize(double& dFontHeight, double& dScaleX, double& dScaleY) const
{
if (NULL == pRenderer)
return;
Aggplus::CMatrix oCurrentMatrix(m_oTransformation.m_oTransform.GetMatrix().GetFinalValue());
double dXScale = 1., dYScale = 1.;
const double dModuleM11 = std::abs(oCurrentMatrix.sx());
const double dModuleM22 = std::abs(oCurrentMatrix.sy());
if (!ISZERO(dModuleM11) && (dModuleM11 < MIN_SCALE || dModuleM11 > MAX_SCALE))
dXScale /= dModuleM11;
dScaleX /= dModuleM11;
if (!ISZERO(dModuleM22) && (dModuleM22 < MIN_SCALE || dModuleM22 > MAX_SCALE))
dYScale /= dModuleM22;
dScaleY /= dModuleM22;
dFontHeight *= dYScale;
dFontHeight *= dScaleY;
if (!Equals(0., dFontHeight) && dFontHeight < MIN_FONT_SIZE)
{
dXScale *= MIN_FONT_SIZE / dFontHeight;
dYScale *= MIN_FONT_SIZE / dFontHeight;
dScaleX *= MIN_FONT_SIZE / dFontHeight;
dScaleY *= MIN_FONT_SIZE / dFontHeight;
dFontHeight = MIN_FONT_SIZE;
}
else if (!Equals(0., dFontHeight) && dFontHeight > MAX_FONT_SIZE)
{
dXScale *= dFontHeight / MAX_FONT_SIZE;
dYScale *= dFontHeight / MAX_FONT_SIZE;
dScaleX *= dFontHeight / MAX_FONT_SIZE;
dScaleY *= dFontHeight / MAX_FONT_SIZE;
dFontHeight = MAX_FONT_SIZE;
}
if (Equals(1., dXScale) && Equals(1., dYScale))
return;
dX /= dXScale;
dY /= dYScale;
double dM11, dM12, dM21, dM22, dDx, dDy;
pRenderer->GetTransform(&dM11, &dM12, &dM21, &dM22, &dDx, &dDy);
oOldMatrix.SetElements(dM11, dM12, dM21, dM22, dDx, dDy);
Aggplus::CMatrix oMatrix(dM11, dM12, dM21, dM22, dDx, dDy);
oMatrix.Scale(dXScale, dYScale);
pRenderer->SetTransform(oMatrix.sx(), oMatrix.shy(), oMatrix.shx(), oMatrix.sy(), oMatrix.tx(), oMatrix.ty());
}
void CTSpan::SetPosition(const Point &oPosition)
@ -569,6 +608,40 @@ namespace SVG
}
double CTSpan::GetFontHeight() const
{
if (NULL == m_pFontManager)
return ((!m_oFont.GetSize().Empty()) ? m_oFont.GetSize().ToDouble(NSCSS::Pixel) : DEFAULT_FONT_SIZE) * 72. / 25.4;
std::wstring wsFontFamily = DefaultFontFamily;
double dFontSize = ((!m_oFont.GetSize().Empty()) ? m_oFont.GetSize().ToDouble(NSCSS::Pixel) : DEFAULT_FONT_SIZE) * 72. / 25.4;
if (!m_oFont.GetFamily().Empty())
{
wsFontFamily = m_oFont.GetFamily().ToWString();
CorrectFontFamily(wsFontFamily);
}
int nStyle = 0;
if (m_oFont.GetWeight().ToWString() == L"bold")
nStyle |= 0x01;
if (m_oFont.GetStyle() .ToWString() == L"italic")
nStyle |= 0x02;
if (m_oText.Underline())
nStyle |= (1 << 2);
// Вычиления размеров текста
m_pFontManager->LoadFontByName(wsFontFamily, dFontSize, nStyle, 72., 72.);
m_pFontManager->SetCharSpacing(0);
m_pFontManager->LoadString1(m_wsText, 0, 0);
TBBox oBox = m_pFontManager->MeasureString2();
return (double)(25.4f / 72.f * (oBox.fMaxY - oBox.fMinY));
}
std::vector<CTSpan> CTSpan::Split() const
{
std::vector<CTSpan> arGlyphs;

View File

@ -44,11 +44,13 @@ namespace SVG
void CalculatePosition(double& dX, double& dY) const;
void Normalize(IRenderer* pRenderer, double& dX, double& dY, double& dFontHeight, Aggplus::CMatrix& oOldMatrix) const;
void NormalizeFontSize(double& dFontHeight, double& dScaleX, double& dScaleY) const;
void SetPosition(const Point& oPosition);
void SetPositionFromParent(CRenderedObject* pParent);
double GetFontHeight() const;
std::vector<CTSpan> Split() const;
NSFonts::IFontManager* m_pFontManager;

View File

@ -144,6 +144,7 @@ std::vector<std::wstring> CDocxRenderer::ScanPagePptx(IOfficeDrawingFile* pFile,
m_pInternal->m_oDocument.Init(false);
m_pInternal->m_oDocument.m_oCurrentPage.m_bUseDefaultFont = true;
m_pInternal->m_oDocument.m_oCurrentPage.m_bWriteStyleRaw = true;
m_pInternal->m_oDocument.m_oCurrentPage.m_bCollectMetaInfo = true;
m_pInternal->m_bIsSupportShapeCommands = true;
m_pInternal->m_eShapeSerializeType = ShapeSerializeType::sstXml;
@ -160,6 +161,7 @@ NSWasm::CData CDocxRenderer::ScanPageBin(IOfficeDrawingFile* pFile, size_t nPage
m_pInternal->m_oDocument.Init(false);
m_pInternal->m_oDocument.m_oCurrentPage.m_bUseDefaultFont = true;
m_pInternal->m_oDocument.m_oCurrentPage.m_bWriteStyleRaw = true;
m_pInternal->m_oDocument.m_oCurrentPage.m_bCollectMetaInfo = true;
m_pInternal->m_bIsSupportShapeCommands = true;
DrawPage(pFile, nPage);
@ -732,6 +734,10 @@ HRESULT CDocxRenderer::CommandLong(const LONG& lType, const LONG& lCommand)
return S_OK;
}
if (c_nFontSubstitution == lType)
{
m_pInternal->m_oDocument.m_oCurrentPage.m_bFontSubstitution = true;
}
return S_OK;
}
HRESULT CDocxRenderer::CommandDouble(const LONG& lType, const double& dCommand)

View File

@ -322,6 +322,7 @@ namespace NSDocxRenderer
HRESULT CDocument::put_FontName(std::wstring sName)
{
m_oCurrentPage.m_oFont.Name = sName;
m_oCurrentPage.m_bFontSubstitution = false;
return S_OK;
}
HRESULT CDocument::get_FontPath(std::wstring* sPath)

View File

@ -268,7 +268,7 @@ namespace NSDocxRenderer
if (!skip_shape)
{
shape->m_nOrder = ++m_nShapeOrder;
shape->m_nOrder = ++m_nCurrentOrder;
m_arShapes.push_back(shape);
}
}
@ -342,7 +342,23 @@ namespace NSDocxRenderer
bForcedBold = true;
m_oManagers.pParagraphStyleManager->UpdateAvgFontSize(m_oFont.Size);
m_oContBuilder.AddUnicode(top, baseline, left, right, m_oFont, m_oBrush, m_oManagers.pFontManager, oText, bForcedBold, m_bUseDefaultFont, m_bWriteStyleRaw);
m_nCurrentOrder++;
m_oContBuilder.AddUnicode(
top,
baseline,
left,
right,
m_oFont,
m_oBrush,
m_oManagers.pFontManager,
oText,
m_nCurrentOrder,
pGids,
bForcedBold,
m_bUseDefaultFont,
m_bWriteStyleRaw,
m_bCollectMetaInfo
);
}
void CPage::Analyze()
@ -469,8 +485,6 @@ namespace NSDocxRenderer
m_arShapes.erase(right, m_arShapes.end());
std::sort(m_arShapes.begin(), m_arShapes.end(), [] (const shape_ptr_t& s1, const shape_ptr_t& s2) {
if (s1->m_bIsBehindDoc && !s2->m_bIsBehindDoc) return true;
if (!s1->m_bIsBehindDoc && s2->m_bIsBehindDoc) return false;
return s1->m_nOrder < s2->m_nOrder;
});
}
@ -1152,11 +1166,17 @@ namespace NSDocxRenderer
if ((bIf1 && bIf6) || (bIf2 && bIf7) || (bIf4 && bIf8) || (bIf5 && bIf7))
{
cont->AddSymBack(d_sym->GetText().at(0), 0);
if (m_bCollectMetaInfo)
cont->AddSymBack(d_sym->GetText().at(0), 0, d_sym->m_arOriginLefts.at(0), d_sym->m_arGids.at(0));
else
cont->AddSymBack(d_sym->GetText().at(0), 0, d_sym->m_arOriginLefts.at(0));
}
else if (bIf3 && bIf7)
{
cont->AddSymFront(d_sym->GetText().at(0), 0);
if (m_bCollectMetaInfo)
cont->AddSymFront(d_sym->GetText().at(0), 0, d_sym->m_arOriginLefts.at(0), d_sym->m_arGids.at(0));
else
cont->AddSymFront(d_sym->GetText().at(0), 0, d_sym->m_arOriginLefts.at(0));
}
isBreak = true;
break;
@ -1586,8 +1606,9 @@ namespace NSDocxRenderer
// lamda to setup and add paragpraph
auto add_paragraph = [this, &max_right, &min_left, &ar_paragraphs] (paragraph_ptr_t& paragraph) {
paragraph->m_dBot = paragraph->m_arTextLines.back()->m_dBot;
paragraph->m_dTop = paragraph->m_arTextLines.front()->m_dTop;
double additional_bottom = paragraph->m_arTextLines.front()->m_dTopWithMaxAscent - paragraph->m_arTextLines.front()->m_dTop;
paragraph->m_dBot = paragraph->m_arTextLines.back()->m_dBot + additional_bottom;
paragraph->m_dTop = paragraph->m_arTextLines.front()->m_dTopWithMaxAscent;
paragraph->m_dRight = max_right;
paragraph->m_dLeft = min_left;
@ -1665,6 +1686,7 @@ namespace NSDocxRenderer
min_left = std::min(min_left, curr_line->m_dLeft);
max_right = std::max(max_right, curr_line->m_dRight);
paragraph->m_arTextLines.push_back(curr_line);
paragraph->m_nOrder = std::max(paragraph->m_nOrder, curr_line->m_nOrder);
};
auto build_paragraphs = [this, add_line, add_paragraph] (const std::vector<text_line_ptr_t>& text_lines) {
@ -1825,6 +1847,19 @@ namespace NSDocxRenderer
}
}
// 2 lines in paragraph fix
for (size_t index = 0; index < ar_positions.size() - 1; ++index)
{
auto& line_top = text_lines[index];
auto& line_bot = text_lines[index + 1];
bool is_start = index == 0 || ar_delims[index - 1] == true;
bool is_end = index == ar_positions.size() - 1 || ar_delims[index + 1] == true;
bool is_diff = fabs(line_top->m_dHeight - line_bot->m_dHeight) > (line_top->m_dHeight + line_bot->m_dHeight) / 4;
if (is_start && is_end && is_diff)
ar_delims[index] = true;
}
// gap check
//
// bla-bla-bla
@ -2239,6 +2274,7 @@ namespace NSDocxRenderer
if (direction == eLineDirection::ldLeft) return crossing->p.x - p.x;
if (direction == eLineDirection::ldBot) return p.y - crossing->p.y;
if (direction == eLineDirection::ldTop) return crossing->p.y - p.y;
return 0;
};
while (diff() > c_dMAX_TABLE_LINE_WIDTH_MM)
@ -2518,12 +2554,13 @@ namespace NSDocxRenderer
pParagraph->m_arTextLines.push_back(pLine);
pParagraph->m_dLeft = pLine->m_dLeft;
pParagraph->m_dTop = pLine->m_dTop;
pParagraph->m_dBot = pLine->m_dBot;
pParagraph->m_dTop = pLine->m_dTopWithMaxAscent;
pParagraph->m_dBot = pLine->m_dBot + (pLine->m_dTopWithMaxAscent - pLine->m_dTop);
pParagraph->m_dWidth = pLine->m_dWidth;
pParagraph->m_dHeight = pLine->m_dHeight;
pParagraph->m_dRight = pLine->m_dRight;
pParagraph->m_dLineHeight = pParagraph->m_dHeight;
pParagraph->m_nOrder = pLine->m_nOrder;
if (pLine->m_pDominantShape)
{
@ -2542,6 +2579,7 @@ namespace NSDocxRenderer
pShape->m_dWidth = pParagraph->m_dWidth;
pShape->m_dHeight = pParagraph->m_dHeight;
pShape->m_dRight = pParagraph->m_dRight;
pShape->m_nOrder = pParagraph->m_nOrder;
pShape->m_bIsBehindDoc = false;
return pShape;
@ -2557,6 +2595,7 @@ namespace NSDocxRenderer
pShape->m_dBot = pParagraph->m_dBot;
pShape->m_dHeight = pParagraph->m_dHeight;
pShape->m_dWidth = pParagraph->m_dWidth;
pShape->m_nOrder = pParagraph->m_nOrder;
if (pParagraph->m_bIsNeedFirstLineIndent && pParagraph->m_dFirstLine < 0)
pParagraph->m_dLeftBorder = -pParagraph->m_dFirstLine;

View File

@ -46,8 +46,10 @@ namespace NSDocxRenderer
bool m_bIsGradient {false};
bool m_bUseDefaultFont {false};
bool m_bWriteStyleRaw {false};
bool m_bCollectMetaInfo {false};
bool m_bIsBuildTables {false};
bool m_bIsLuminosityShapesFiled{false};
bool m_bFontSubstitution {false};
CPage(NSFonts::IApplicationFonts* pAppFonts, const CManagers& oManagers);
~CPage();
@ -229,6 +231,6 @@ namespace NSDocxRenderer
std::vector<shape_ptr_t> m_arLuminosityShapes;
std::vector<shape_ptr_t> m_arOneColorGradientShape;
size_t m_nShapeOrder = 0;
size_t m_nCurrentOrder = 0;
};
}

View File

@ -50,6 +50,8 @@ namespace NSDocxRenderer
double m_dHeight {0.0};
double m_dWidth {0.0};
size_t m_nOrder = 0;
CBaseItem();
CBaseItem(const CBaseItem& other);
CBaseItem(CBaseItem&& other);

View File

@ -73,11 +73,26 @@ namespace NSDocxRenderer
m_bPossibleHorSplit = rCont.m_bPossibleHorSplit;
m_bWriteStyleRaw = rCont.m_bWriteStyleRaw;
m_nOriginFontFaceIndex = rCont.m_nOriginFontFaceIndex;
m_wsOriginFontName = rCont.m_nOriginFontFaceIndex;
m_arSymWidths.clear();
m_arSymWidths.resize(rCont.m_arSymWidths.size());
for (size_t i = 0; i < rCont.m_arSymWidths.size(); ++i)
m_arSymWidths[i] = rCont.m_arSymWidths[i];
m_arGids.clear();
m_arGids.resize(rCont.m_arGids.size());
for (size_t i = 0; i < rCont.m_arGids.size(); ++i)
m_arGids[i] = rCont.m_arGids[i];
m_arOriginLefts.clear();
m_arOriginLefts.resize(rCont.m_arOriginLefts.size());
for (size_t i = 0; i < rCont.m_arOriginLefts.size(); ++i)
m_arOriginLefts[i] = rCont.m_arOriginLefts[i];
m_bFontSubstitution = rCont.m_bFontSubstitution;
return *this;
}
@ -128,13 +143,27 @@ namespace NSDocxRenderer
cont->m_dWidth = cont->m_dRight - cont->m_dLeft;
cont->m_arSymWidths.clear();
cont->m_arOriginLefts.clear();
cont->m_arGids.clear();
for (size_t i = index + 1; i < len; ++i)
{
cont->m_arSymWidths.push_back(m_arSymWidths[i]);
cont->m_arOriginLefts.push_back(m_arOriginLefts[i]);
if (!m_arGids.empty() && cont->m_bCollectMetaInfo)
cont->m_arGids.push_back(m_arGids[i]);
}
m_oText = m_oText.substr(0, index + 1);
m_dRight = cont->m_dLeft;
m_dWidth = m_dRight - m_dLeft;
m_arSymWidths.resize(index + 1);
m_arOriginLefts.resize(index + 1);
if (!m_arGids.empty())
m_arGids.resize(index + 1);
m_bPossibleHorSplit = false;
return cont;
@ -470,24 +499,42 @@ namespace NSDocxRenderer
oWriter.WriteString(L"</a:t>");
if (m_bIsAddBrEnd) oWriter.WriteString(L"<a:br/>");
std::wstring origin_gids{};
for (auto& gid : m_arGids)
origin_gids += std::to_wstring(gid) + L";";
// Origin width string
std::wstring origin_lefts{};
for (auto& l : m_arOriginLefts)
origin_lefts += std::to_wstring(static_cast<int>(l * c_dMMToEMU)) + L";";
// meta info for pdf-editor
oWriter.WriteString(L"<metaorigin:pos");
oWriter.WriteString(L" x=\"");
oWriter.AddDouble(m_dLeft, 4);
oWriter.AddInt(static_cast<int>(m_dLeft * c_dMMToEMU));
oWriter.WriteString(L"\" y=\"");
oWriter.AddDouble(m_dBot, 4);
oWriter.WriteString(L"\" widths=\"");
for (auto& w : m_arSymWidths)
{
oWriter.AddDouble(w, 4);
oWriter.WriteString(L",");
}
oWriter.AddInt(static_cast<int>(m_dBot * c_dMMToEMU));
oWriter.WriteString(L"\" />");
oWriter.WriteString(L"<metaorigin:font ");
oWriter.WriteString(L" font=\"");
oWriter.WriteString(L" name=\"");
oWriter.WriteString(m_wsOriginFontName);
oWriter.WriteString(L"\" faceindex=\"");
oWriter.AddInt(m_nOriginFontFaceIndex);
oWriter.WriteString(L"\" />");
oWriter.WriteString(L"<metaorigin:syminfo");
oWriter.WriteString(L" lefts=\"");
oWriter.WriteString(origin_lefts);
oWriter.WriteString(L"\" gids=\"");
oWriter.WriteString(origin_gids);
oWriter.WriteString(L"\" />");
oWriter.WriteString(L"<metaorigin:fontsubstitution");
oWriter.WriteString(L" value=\"");
oWriter.AddInt(m_bFontSubstitution);
oWriter.WriteString(L"\" />");
oWriter.WriteString(L"</a:r>");
}
void CContText::ToBin(NSWasm::CData& oWriter) const
@ -508,6 +555,31 @@ namespace NSDocxRenderer
oWriter.WriteBYTE(0); oWriter.WriteStringUtf16(m_oText.ToStdWString());
oWriter.WriteBYTE(kBin_g_nodeAttributeEnd);
// Meta-info
oWriter.StartRecord(111);
oWriter.WriteBYTE(kBin_g_nodeAttributeStart);
oWriter.WriteBYTE(0); oWriter.WriteStringUtf16(m_wsOriginFontName); // Origin font name
oWriter.WriteBYTE(1); oWriter.AddInt(m_nOriginFontFaceIndex); // Origin face index
oWriter.WriteBYTE(2); oWriter.AddSInt(static_cast<int>(m_dLeft * c_dMMToEMU)); // Origin left
oWriter.WriteBYTE(3); oWriter.AddSInt(static_cast<int>(m_dBot * c_dMMToEMU)); // Origin bot
std::wstring origin_gids{};
for (auto& gid : m_arGids)
origin_gids += std::to_wstring(gid) + L";";
oWriter.WriteBYTE(4); oWriter.WriteStringUtf16(origin_gids); // Origin gids string
// Origin width string
std::wstring origin_lefts{};
for (auto& l : m_arOriginLefts)
origin_lefts += std::to_wstring(static_cast<int>(l * c_dMMToEMU)) + L";";
oWriter.WriteBYTE(5); oWriter.WriteStringUtf16(origin_lefts); // Origin lefts
oWriter.WriteBYTE(6); oWriter.WriteBool(m_bFontSubstitution); // Font Substitution (just pass from pdf)
oWriter.WriteBYTE(kBin_g_nodeAttributeEnd);
oWriter.EndRecord();
// WriteRecord WriteRunProperties
[&oWriter, this, lCalculatedSpacing] () {
oWriter.StartRecord(0);
@ -664,7 +736,10 @@ namespace NSDocxRenderer
return text.length() == 1 && CContText::IsUnicodeDiacriticalMark(text.at(0));
}
void CContText::AddTextBack(const NSStringUtils::CStringUTF32& oText, const std::vector<double>& arSymWidths)
void CContText::AddTextBack(const NSStringUtils::CStringUTF32& oText,
const std::vector<double>& arSymWidths,
const std::vector<unsigned int>& arGids,
const std::vector<double>& arOriginLefts)
{
bool is_space_twice = m_oText.at(m_oText.length() - 1) == c_SPACE_SYM &&
oText.at(0) == c_SPACE_SYM;
@ -681,20 +756,49 @@ namespace NSDocxRenderer
m_arSymWidths.push_back(w);
m_dWidth += w;
m_oText += oText.at(i);
m_arOriginLefts.push_back(arOriginLefts[i]);
if (!arGids.empty() && m_bCollectMetaInfo)
m_arGids.push_back(arGids[i]);
}
m_dRight = m_dLeft + m_dWidth;
}
void CContText::AddTextFront(const NSStringUtils::CStringUTF32& oText, const std::vector<double>& arSymWidths)
void CContText::AddTextFront(const NSStringUtils::CStringUTF32& oText,
const std::vector<double>& arSymWidths,
const std::vector<unsigned int>& arGids,
const std::vector<double>& arOriginLefts)
{
m_oText = oText + m_oText;
double addtitional_width = 0;
for (auto& w : arSymWidths)
addtitional_width += w;
auto ar_sym_w = m_arSymWidths;
m_arSymWidths = arSymWidths;
for (auto& w : ar_sym_w)
m_arSymWidths.push_back(w);
m_dWidth += addtitional_width;
m_dLeft = m_dRight - m_dWidth;
if (!arGids.empty() && m_bCollectMetaInfo)
{
auto ar_gids = m_arGids;
m_arGids = arGids;
for (auto& gid : ar_gids)
m_arGids.push_back(gid);
}
auto ar_lefts = m_arOriginLefts;
m_arOriginLefts = arOriginLefts;
for (auto& left : ar_lefts)
m_arOriginLefts.push_back(left);
}
void CContText::SetText(const NSStringUtils::CStringUTF32& oText, const std::vector<double>& arSymWidths)
void CContText::SetText(const NSStringUtils::CStringUTF32& oText,
const std::vector<double>& arSymWidths,
std::vector<unsigned int>&& arGids,
std::vector<double>&& arOriginLefts)
{
m_oText = oText;
m_arSymWidths.clear();
@ -705,32 +809,52 @@ namespace NSDocxRenderer
m_dWidth += w;
}
m_dRight = m_dLeft + m_dWidth;
m_arOriginLefts = std::move(arOriginLefts);
if (m_bCollectMetaInfo)
m_arGids = std::move(arGids);
}
void CContText::AddSymBack(uint32_t cSym, double dWidth)
void CContText::AddSymBack(uint32_t cSym, double dWidth, double dLeft, unsigned int nGid)
{
bool is_space_twice = m_oText.at(m_oText.length() - 1) == c_SPACE_SYM && cSym == c_SPACE_SYM;
if (is_space_twice)
{
m_arSymWidths.back() += dWidth;
}
else
{
m_arSymWidths.push_back(dWidth);
m_oText += cSym;
m_arOriginLefts.push_back(dLeft);
if (m_bCollectMetaInfo)
{
m_arGids.push_back(nGid);
}
}
m_dWidth += dWidth;
m_dRight = m_dLeft + m_dWidth;
}
void CContText::AddSymFront(uint32_t cSym, double dWidth)
void CContText::AddSymFront(uint32_t cSym, double dWidth, double dLeft, unsigned int nGid)
{
NSStringUtils::CStringUTF32 text;
text += cSym;
text += m_oText;
m_oText = text;
m_dLeft -= dWidth;
m_dWidth = m_dRight - m_dLeft;
m_arSymWidths.insert(m_arSymWidths.begin(), dWidth);
m_arOriginLefts.insert(m_arOriginLefts.begin(), dLeft);
if (m_bCollectMetaInfo)
{
m_arGids.insert(m_arGids.begin(), nGid);
}
}
void CContText::SetSym(uint32_t cSym, double dWidth)
void CContText::SetSym(uint32_t cSym, double dWidth, double dLeft, unsigned int nGid)
{
m_oText = L"";
m_oText += cSym;
@ -738,6 +862,18 @@ namespace NSDocxRenderer
m_arSymWidths.push_back(dWidth);
m_dWidth = dWidth;
m_dRight = m_dLeft + m_dWidth;
m_arSymWidths.clear();
m_arSymWidths.push_back(dWidth);
m_arOriginLefts.clear();
m_arOriginLefts.push_back(dLeft);
if (m_bCollectMetaInfo)
{
m_arGids.clear();
m_arGids.push_back(nGid);
}
}
void CContText::RemoveLastSym()
{
@ -745,6 +881,10 @@ namespace NSDocxRenderer
m_dWidth -= m_arSymWidths[m_arSymWidths.size() - 1];
m_dRight = m_dLeft + m_dWidth;
m_arSymWidths.resize(m_arSymWidths.size() - 1);
m_arOriginLefts.resize(m_arOriginLefts.size() - 1);
if (!m_arGids.empty() && m_bCollectMetaInfo)
m_arGids.resize(m_arGids.size() - 1);
}
uint32_t CContText::GetLastSym() const
{
@ -761,14 +901,7 @@ namespace NSDocxRenderer
}
const std::vector<double> CContText::GetSymLefts() const noexcept
{
std::vector<double> lefts;
double left = m_dLeft;
for (auto& w : m_arSymWidths)
{
lefts.push_back(left);
left += w;
}
return lefts;
return m_arOriginLefts;
}
bool CContText::CheckFontEffects
@ -1004,19 +1137,42 @@ namespace NSDocxRenderer
const NSStructures::CBrush& oBrush,
CFontManager* pFontManager,
const NSStringUtils::CStringUTF32& oText,
size_t nOrder,
const PUINT pGids,
bool bForcedBold,
bool bUseDefaultFont,
bool bWriteStyleRaw)
bool bWriteStyleRaw,
bool bCollectMetaInfo,
bool bFontSubstitution)
{
double dWidth = dRight - dLeft;
double dHeight = dBot - dTop;
std::vector<unsigned int> gids;
if (bCollectMetaInfo)
{
for (size_t i = 0; i < oText.length(); ++i)
if (pGids)
gids.push_back(pGids[i]);
else
gids.push_back(0);
}
std::vector<double> origin_lefts;
double curr_origin_left = dLeft;
for (size_t i = 0; i < oText.length(); ++i)
{
origin_lefts.push_back(curr_origin_left);
curr_origin_left += dWidth / oText.length();
}
// if new text is close to current cont
if (m_pCurrCont != nullptr &&
fabs(m_pCurrCont->m_dBot - dBot) < c_dTHE_SAME_STRING_Y_PRECISION_MM &&
m_oPrevFont.IsEqual2(&oFont) &&
m_oPrevBrush.IsEqual(&oBrush) && !(
oText.length() == 1 && CContText::IsUnicodeDiacriticalMark(oText.at(0))))
oText.length() == 1 && CContText::IsUnicodeDiacriticalMark(oText.at(0))) &&
bFontSubstitution == m_pCurrCont->m_bFontSubstitution)
{
double avg_width = dWidth / oText.length();
@ -1040,7 +1196,7 @@ namespace NSDocxRenderer
for (size_t i = 0; i < oText.length(); ++i)
ar_widths.push_back(left_avg_width);
m_pCurrCont->AddTextBack(oText, ar_widths);
m_pCurrCont->AddTextBack(oText, ar_widths, gids, origin_lefts);
is_added = true;
}
@ -1052,7 +1208,7 @@ namespace NSDocxRenderer
for (size_t i = 0; i < oText.length(); ++i)
ar_widths.push_back(right_avg_width);
m_pCurrCont->AddTextFront(oText, ar_widths);
m_pCurrCont->AddTextFront(oText, ar_widths, gids, origin_lefts);
is_added = true;
}
@ -1062,6 +1218,7 @@ namespace NSDocxRenderer
m_pCurrCont->m_dBot = std::max(m_pCurrCont->m_dBot, dBot);
m_pCurrCont->m_dHeight = m_pCurrCont->m_dBot - m_pCurrCont->m_dTop;
m_pCurrCont->m_dWidth = m_pCurrCont->m_dRight - m_pCurrCont->m_dLeft;
m_pCurrCont->m_nOrder = nOrder;
return;
}
}
@ -1094,7 +1251,8 @@ namespace NSDocxRenderer
ar_widths.push_back(avg_width);
}
pCont->SetText(oText, ar_widths);
pCont->m_bCollectMetaInfo = bCollectMetaInfo;
pCont->SetText(oText, ar_widths, std::move(gids), std::move(origin_lefts));
pCont->m_bIsRtl = CContText::IsUnicodeRtl(oText.at(0));
pCont->m_dWidth = dWidth;
@ -1104,10 +1262,12 @@ namespace NSDocxRenderer
double em_height = oMetrics.dEmHeight;
double ratio = font_size / em_height * c_dPtToMM;
pCont->m_dTopWithAscent = pCont->m_dBot - (oMetrics.dAscent * ratio) - oMetrics.dBaselineOffset;
pCont->m_dBotWithDescent = pCont->m_dBot + (oMetrics.dDescent * ratio) - oMetrics.dBaselineOffset;
pCont->m_dTopWithAscent = pCont->m_dBot - (oMetrics.dAscent * ratio);
pCont->m_dBotWithDescent = pCont->m_dBot + (oMetrics.dDescent * ratio);
pCont->m_dSpaceWidthMM = pFontManager->GetSpaceWidthMM();
pCont->m_wsOriginFontName = oFont.Name;
pCont->m_nOriginFontFaceIndex = oFont.FaceIndex;
if (bUseDefaultFont)
{
@ -1124,6 +1284,8 @@ namespace NSDocxRenderer
pCont->m_oSelectedFont.Italic = m_pFontSelector->IsSelectedItalic();
}
pCont->m_bWriteStyleRaw = bWriteStyleRaw;
pCont->m_bFontSubstitution = bFontSubstitution;
pCont->m_nOrder = nOrder;
if (pCont->IsDiacritical())
{

View File

@ -63,6 +63,7 @@ namespace NSDocxRenderer
// origin font
std::wstring m_wsOriginFontName{};
int m_nOriginFontFaceIndex{};
// sizes
double m_dSpaceWidthMM{0};
@ -76,6 +77,11 @@ namespace NSDocxRenderer
bool m_bIsAddBrEnd{false};
bool m_bWriteStyleRaw{false};
bool m_bPossibleHorSplit{false};
bool m_bCollectMetaInfo{false};
std::vector<unsigned int> m_arGids{};
std::vector<double> m_arOriginLefts{};
bool m_bFontSubstitution = false;
CContText() = default;
CContText(CFontManager* pManager) : m_pManager(pManager) {}
@ -92,13 +98,23 @@ namespace NSDocxRenderer
void CalcSelected();
size_t GetLength() const noexcept;
void AddTextBack(const NSStringUtils::CStringUTF32& oText, const std::vector<double>& arSymWidths);
void AddTextFront(const NSStringUtils::CStringUTF32& oText, const std::vector<double>& arSymWidths);
void SetText(const NSStringUtils::CStringUTF32& oText, const std::vector<double>& arSymWidths);
void AddTextBack(const NSStringUtils::CStringUTF32& oText,
const std::vector<double>& arSymWidths,
const std::vector<unsigned int>& arGids,
const std::vector<double>& arOriginLefts);
void AddTextFront(const NSStringUtils::CStringUTF32& oText,
const std::vector<double>& arSymWidths,
const std::vector<unsigned int>& arGids,
const std::vector<double>& arOriginLefts);
void SetText(const NSStringUtils::CStringUTF32& oText,
const std::vector<double>& arSymWidths,
std::vector<unsigned int>&& arGids,
std::vector<double>&& arOriginLefts);
void AddSymBack(uint32_t cSym, double dWidth, double dLeft, unsigned int nGid = 0);
void AddSymFront(uint32_t cSym, double dWidth, double dLeft, unsigned int nGid = 0);
void SetSym(uint32_t cSym, double dWidth, double dLeft, unsigned int nGid = 0);
void AddSymBack(uint32_t cSym, double dWidth);
void AddSymFront(uint32_t cSym, double dWidth);
void SetSym(uint32_t cSym, double dWidth);
void RemoveLastSym();
uint32_t GetLastSym() const;
@ -172,9 +188,13 @@ namespace NSDocxRenderer
const NSStructures::CBrush& oBrush,
CFontManager* pFontManager,
const NSStringUtils::CStringUTF32& oText,
size_t nOrder = 0,
const PUINT pGids = nullptr,
bool bForcedBold = false,
bool bUseDefaultFont = false,
bool bWriteStyleRaw = false);
bool bWriteStyleRaw = false,
bool bCollectMetaInfo = false,
bool bFontSubstitution = false);
void NullCurrCont();
void Clear();

View File

@ -313,7 +313,7 @@ namespace NSDocxRenderer
auto last_sym = text[text.length() - 1];
if (last_sym != c_SPACE_SYM && m_arTextLines.size() != 1)
pLastCont->AddSymBack(c_SPACE_SYM, 0);
pLastCont->AddSymBack(c_SPACE_SYM, 0, pLastCont->m_dRight, 0);
}
}
}

View File

@ -46,7 +46,6 @@ namespace NSDocxRenderer
std::wstring m_strDstMedia {};
double m_dRotation {0.0};
size_t m_nOrder {0};
bool m_bIsNoFill {true};
bool m_bIsNoStroke {true};

View File

@ -21,6 +21,7 @@ namespace NSDocxRenderer
{
RecalcWithNewItem(oCont.get());
m_arConts.push_back(oCont);
m_nOrder = std::max(m_nOrder, oCont->m_nOrder);
}
void CTextLine::AddConts(const std::vector<std::shared_ptr<CContText>>& arConts)
{
@ -112,7 +113,7 @@ namespace NSDocxRenderer
wide_space->m_dHeight = pCurrent->m_dHeight;
wide_space->SetSym(c_SPACE_SYM, wide_space->m_dRight - wide_space->m_dLeft);
wide_space->SetSym(c_SPACE_SYM, wide_space->m_dRight - wide_space->m_dLeft, wide_space->m_dLeft, 0);
wide_space->m_pFontStyle = pFirst->m_pFontStyle;
wide_space->m_pShape = nullptr;
wide_space->m_iNumDuplicates = 0;
@ -146,12 +147,12 @@ namespace NSDocxRenderer
{
if (!bIsSpaceDelta)
{
pFirst->AddTextBack(pCurrent->GetText(), pCurrent->GetSymWidths());
pFirst->AddTextBack(pCurrent->GetText(), pCurrent->GetSymWidths(), pCurrent->m_arGids, pCurrent->m_arOriginLefts);
}
else
{
pFirst->AddSymBack(c_SPACE_SYM, pCurrent->m_dLeft - pFirst->m_dRight);
pFirst->AddTextBack(pCurrent->GetText(), pCurrent->GetSymWidths());
pFirst->AddSymBack(c_SPACE_SYM, pCurrent->m_dLeft - pFirst->m_dRight, pFirst->m_dRight, 0);
pFirst->AddTextBack(pCurrent->GetText(), pCurrent->GetSymWidths(), pCurrent->m_arGids, pCurrent->m_arOriginLefts);
}
if (pFirst->m_pCont.expired())
@ -166,9 +167,9 @@ namespace NSDocxRenderer
if (bIsSpaceDelta)
{
if (pFirst->GetNumberOfFeatures() <= pCurrent->GetNumberOfFeatures())
pFirst->AddSymBack(c_SPACE_SYM, pCurrent->m_dLeft - pFirst->m_dRight);
pFirst->AddSymBack(c_SPACE_SYM, pCurrent->m_dLeft - pFirst->m_dRight, pFirst->m_dRight, 0);
else
pCurrent->AddSymFront(c_SPACE_SYM, pCurrent->m_dLeft - pFirst->m_dRight);
pCurrent->AddSymFront(c_SPACE_SYM, pCurrent->m_dLeft - pFirst->m_dRight, pFirst->m_dRight, 0);
}
pFirst = pCurrent;
}

View File

@ -288,7 +288,8 @@ struct CTextSettings
CTextSettings(const CTextSettings& oTS) :
bBdo(oTS.bBdo), bPre(oTS.bPre), bQ(oTS.bQ), bAddSpaces(oTS.bAddSpaces), bMergeText(oTS.bMergeText),
nLi(oTS.nLi), bNumberingLi(oTS.bNumberingLi), sPStyle(oTS.sPStyle), eTextMode(oTS.eTextMode)
nLi(oTS.nLi), bNumberingLi(oTS.bNumberingLi), sPStyle(oTS.sPStyle), eTextMode(oTS.eTextMode),
oAdditionalStyle(oTS.oAdditionalStyle)
{}
void AddPStyle(const std::wstring& wsStyle)
@ -331,12 +332,12 @@ void WriteEmptyParagraph(NSStringUtils::CStringBuilder* pXml, bool bVahish = fal
if (!bInP)
pXml->WriteString(L"<w:p><w:pPr>");
pXml->WriteString(L"<w:r><w:rPr><w:rFonts w:eastAsia=\"Times New Roman\"/>");
pXml->WriteString(L"<w:rPr><w:rFonts w:eastAsia=\"Times New Roman\"/>");
if (bVahish)
pXml->WriteString(L"<w:vanish/>");
pXml->WriteString(L"<w:sz w:val=\"2\"/><w:szCs w:val=\"2\"/><w:vanish/>");
pXml->WriteString(L"</w:rPr></w:r>");
pXml->WriteString(L"</w:rPr>");
if (!bInP)
pXml->WriteString(L"</w:pPr></w:p>");
@ -1404,6 +1405,123 @@ void ReplaceSpaces(std::wstring& wsValue)
}
}
std::wstring StandardizeHeaderId(const std::wstring& header)
{
if (header.empty())
return std::wstring();
std::wstring result;
result.reserve(header.size());
// Флаг, указывающий, был ли предыдущий символ дефисом
bool prevWasHyphen = false;
bool inWhitespaceSequence = false;
wchar_t lowerC;
for (wchar_t c : header)
{
// Приведение к нижнему регистру
lowerC = std::tolower(c);
// Проверяем, является ли символ буквой или цифрой
if (std::iswalnum(lowerC))
{
result.push_back(lowerC);
prevWasHyphen = false;
inWhitespaceSequence = false;
}
// Проверяем, является ли символ пробельным (пробел, табуляция и т.д.)
else if (std::iswspace(lowerC))
{
// Заменяем последовательности пробельных символов на один дефис
if (!inWhitespaceSequence && !result.empty())
{
result.push_back(L'-');
inWhitespaceSequence = true;
}
}
// Проверяем, является ли символ дефисом или подчеркиванием
else if (c == L'-' || c == L'_')
{
// Добавляем дефис, если предыдущий символ не был дефисом
if (!prevWasHyphen && !result.empty())
{
result.push_back(L'-');
prevWasHyphen = true;
}
inWhitespaceSequence = false;
}
// Все остальные символы (знаки препинания) пропускаем
// Но если это буква в Unicode, мы можем её обработать
else if (std::iswalpha(lowerC))
{
// Для Unicode-символов, которые являются буквами
result.push_back(lowerC);
prevWasHyphen = false;
inWhitespaceSequence = false;
}
// Остальные символы игнорируем
}
// Удаляем дефисы в начале и конце
size_t start = 0;
size_t end = result.length();
while (start < end && result[start] == L'-')
++start;
while (end > start && result[end - 1] == L'-')
--end;
// Удаляем последовательные дефисы
std::wstring finalResult;
finalResult.reserve(end - start);
bool lastWasHyphen = false;
for (size_t i = start; i < end; i++)
{
if (result[i] == L'-')
{
if (!lastWasHyphen)
{
finalResult.push_back(L'-');
lastWasHyphen = true;
}
}
else
{
finalResult.push_back(result[i]);
lastWasHyphen = false;
}
}
return finalResult;
}
bool ElementInHeader(const std::vector<NSCSS::CNode> arSelsectors)
{
for (const NSCSS::CNode& oNode : arSelsectors)
{
if (2 != oNode.m_wsName.length() && L'h' != oNode.m_wsName[0])
continue;
switch (GetHtmlTag(oNode.m_wsName))
{
case HTML_TAG(H1):
case HTML_TAG(H2):
case HTML_TAG(H3):
case HTML_TAG(H4):
case HTML_TAG(H5):
case HTML_TAG(H6):
return true;
default:
continue;
}
}
return false;
}
std::wstring EncodeXmlString(const std::wstring& s)
{
std::wstring sRes = s;
@ -1445,6 +1563,11 @@ bool CanUseThisPath(const std::wstring& wsPath, const std::wstring& wsSrcPath, c
return true;
}
bool UnreadableNode(const std::wstring& wsNodeName)
{
return L"head" == wsNodeName || L"meta" == wsNodeName || L"style" == wsNodeName;
}
class CHtmlFile2_Private
{
public:
@ -1467,6 +1590,9 @@ private:
int m_nId; // ID остальные элементы
int m_nShapeId; // Id shape's
using anchors_map = std::map<std::wstring, std::wstring>;
anchors_map m_mAnchors; // Map якорей с индивидуальными id
NSStringUtils::CStringBuilder m_oStylesXml; // styles.xml
NSStringUtils::CStringBuilder m_oDocXmlRels; // document.xml.rels
NSStringUtils::CStringBuilder m_oNoteXmlRels; // footnotes.xml.rels
@ -1486,8 +1612,10 @@ private:
bool m_bBanUpdatePageData; // Запретить обновление данных о странице?
HtmlTag m_eLastElement;
TState()
: m_bInP(false), m_bInR(false), m_bInT(false), m_bWasPStyle(false), m_bWasSpace(true), m_bInHyperlink(false), m_bBanUpdatePageData(false)
: m_bInP(false), m_bInR(false), m_bInT(false), m_bWasPStyle(false), m_bWasSpace(true), m_bInHyperlink(false), m_bBanUpdatePageData(false), m_eLastElement(HTML_TAG(UNKNOWN))
{}
} m_oState;
@ -2178,10 +2306,18 @@ private:
m_oState.m_bWasSpace = true;
}
void WriteBookmark(NSStringUtils::CStringBuilder* pXml, const std::wstring& wsId)
std::wstring AddAnchor(const std::wstring& wsAnchorValue)
{
const std::wstring wsAnchorId{L"anchor-" + std::to_wstring(m_mAnchors.size() + 1)};
m_mAnchors[wsAnchorValue] = wsAnchorId;
return wsAnchorId;
}
std::wstring WriteBookmark(NSStringUtils::CStringBuilder* pXml, const std::wstring& wsId)
{
if (NULL == pXml)
return;
return std::wstring();
const std::wstring sCrossId = std::to_wstring(m_mBookmarks.size() + 1);
std::wstring sName;
@ -2190,7 +2326,13 @@ private:
sName = wsId + L"_" + std::to_wstring(++m_mBookmarks[wsId]);
else
{
sName = wsId;
const anchors_map::const_iterator itFound{m_mAnchors.find(wsId)};
if (m_mAnchors.end() != itFound)
sName = itFound->second;
else
sName = AddAnchor(wsId);
m_mBookmarks.insert({wsId, 1});
}
@ -2198,8 +2340,20 @@ private:
pXml->WriteString(sCrossId);
pXml->WriteString(L"\" w:name=\"");
pXml->WriteEncodeXmlString(sName);
pXml->WriteString(L"\"/><w:bookmarkEnd w:id=\"");
pXml->WriteString(sCrossId);
pXml->WriteString(L"\"/>");
return sCrossId;
}
void WriteEmptyBookmark(NSStringUtils::CStringBuilder* pXml, const std::wstring& wsId)
{
const std::wstring wsCrossId{WriteBookmark(pXml, wsId)};
if (wsCrossId.empty())
return;
pXml->WriteString(L"<w:bookmarkEnd w:id=\"");
pXml->WriteString(wsCrossId);
pXml->WriteString(L"\"/>");
}
@ -2279,7 +2433,7 @@ private:
else if(sName == L"id")
{
oNode.m_wsId = EncodeXmlString(m_oLightReader.GetText());
WriteBookmark(oXml, oNode.m_wsId);
WriteEmptyBookmark(oXml, oNode.m_wsId);
if (!m_oStylesCalculator.HaveStylesById(oNode.m_wsId))
oNode.m_wsId.clear();
@ -2402,6 +2556,11 @@ private:
if (!bPre && sText.end() == std::find_if_not(sText.begin(), sText.end(), [](wchar_t wchChar){ return iswspace(wchChar) && 0xa0 != wchChar;}))
return false;
std::wstring wsHeaderId;
if (ElementInHeader(arSelectors))
wsHeaderId = StandardizeHeaderId(sText);
if(oTS.bBdo)
std::reverse(sText.begin(), sText.end());
@ -2418,6 +2577,11 @@ private:
WriteToStringBuilder(oPPr, *pXml);
std::wstring wsCrossId;
if (!wsHeaderId.empty())
WriteEmptyBookmark(pXml, wsHeaderId);
NSStringUtils::CStringBuilder oRPr;
std::wstring sRStyle;
@ -3066,11 +3230,10 @@ private:
bool readInside (NSStringUtils::CStringBuilder* oXml, std::vector<NSCSS::CNode>& sSelectors, CTextSettings& oTS, const std::wstring& sName)
{
//TODO:: обработать все варианты return'а
if(sName == L"#text")
return ReadText(oXml, sSelectors, oTS);
if (TagIsUnprocessed(sName))
if (UnreadableNode(sName) || TagIsUnprocessed(sName))
return false;
std::wstring sNote = GetSubClass(oXml, sSelectors);
@ -3378,7 +3541,12 @@ private:
}
if (HTML_TAG(DIV) != eHtmlTag && HTML_TAG(ASIDE) != eHtmlTag)
{
if (bResult)
m_oState.m_eLastElement = eHtmlTag;
m_oState.m_bBanUpdatePageData = true;
}
readNote(oXml, sSelectors, sNote);
sSelectors.pop_back();
@ -3755,6 +3923,9 @@ private:
if(m_oLightReader.IsEmptyNode())
return false;
if (HTML_TAG(TABLE) == m_oState.m_eLastElement)
WriteEmptyParagraph(oXml, true);
CTable oTable;
CTextSettings oTextSettings{oTS};
oTextSettings.sPStyle.clear();
@ -3871,7 +4042,6 @@ private:
oTable.Shorten();
oTable.CompleteTable();
oTable.ConvertToOOXML(*oXml);
WriteEmptyParagraph(oXml, true);
return true;
}
@ -3912,9 +4082,6 @@ private:
bool ReadListElement(NSStringUtils::CStringBuilder* oXml, std::vector<NSCSS::CNode>& arSelectors, CTextSettings& oTS)
{
if (OpenP(oXml))
wrP(oXml, arSelectors, oTS);
const bool bResult{readStream(oXml, arSelectors, oTS)};
CloseP(oXml, arSelectors);
@ -3927,8 +4094,6 @@ private:
if(m_oLightReader.IsEmptyNode())
return false;
GetSubClass(oXml, arSelectors);
CloseP(oXml, arSelectors);
CTextSettings oTSLi(oTS);
@ -3969,6 +4134,8 @@ private:
m_oNumberXml.WriteString(wsStart);
m_oNumberXml.WriteString(L"\"/><w:numFmt w:val=\"decimal\"/><w:isLgl w:val=\"false\"/><w:suff w:val=\"tab\"/><w:lvlText w:val=\"%9.\"/><w:lvlJc w:val=\"right\"/><w:pPr><w:ind w:left=\"6469\" w:hanging=\"180\"/></w:pPr></w:lvl></w:abstractNum>");
}
else
oTSLi.bNumberingLi = false;
CTextSettings oTSList{oTSLi};
@ -3990,7 +4157,6 @@ private:
}
CloseP(oXml, arSelectors);
arSelectors.pop_back();
return true;
}
@ -4158,12 +4324,28 @@ private:
if(bCross)
{
m_oState.m_bInHyperlink = true;
oXml->WriteString(L"<w:hyperlink w:tooltip=\"Current Document\" w:anchor=\"");
oXml->WriteString(L"<w:hyperlink w:anchor=\"");
size_t nSharp = sRef.find('#');
std::wstring wsAnchorValue;
if(nSharp == std::wstring::npos)
oXml->WriteString(NSFile::GetFileName(sRef));
wsAnchorValue = NSFile::GetFileName(sRef);
else
oXml->WriteEncodeXmlString(sRef.c_str() + nSharp + 1);
wsAnchorValue = (sRef.c_str() + nSharp + 1);
if (!wsAnchorValue.empty())
{
const anchors_map::iterator itFound = m_mAnchors.find(wsAnchorValue);
std::wstring wsAnchorId;
if (m_mAnchors.end() != itFound)
wsAnchorId = itFound->second;
else
wsAnchorId = AddAnchor(wsAnchorValue);
oXml->WriteEncodeXmlString(wsAnchorId);
}
}
// Внешняя ссылка
else
@ -4562,11 +4744,21 @@ private:
if (!m_oState.m_bInP)
return L"";
std::wstring sRStyle = GetStyle(*sSelectors.back().m_pCompiledStyle, false);
NSCSS::CCompiledStyle oMainStyle{*sSelectors.back().m_pCompiledStyle};
std::wstring sRSettings;
m_oXmlStyle.WriteLiteRStyle(oTS.oAdditionalStyle);
const std::wstring sRSettings = m_oXmlStyle.GetStyle();
m_oXmlStyle.Clear();
std::wstring sRStyle = GetStyle(oMainStyle, false);
if (!oTS.oAdditionalStyle.Empty())
{
NSCSS::CCompiledStyle oSettingStyle{oTS.oAdditionalStyle};
NSCSS::CCompiledStyle::StyleEquation(oMainStyle, oSettingStyle);
m_oXmlStyle.WriteLiteRStyle(oSettingStyle);
sRSettings = m_oXmlStyle.GetStyle();
m_oXmlStyle.Clear();
}
std::wstring wsFontSize;
@ -4574,7 +4766,7 @@ private:
if (0 != nCalculatedFontChange)
{
int nFontSizeLevel{static_cast<int>((sSelectors.back().m_pCompiledStyle->m_oFont.Empty()) ? 3 : GetFontSizeLevel(sSelectors.back().m_pCompiledStyle->m_oFont.GetSize().ToInt(NSCSS::Point) * 2))};
int nFontSizeLevel{static_cast<int>((oMainStyle.m_oFont.Empty()) ? 3 : GetFontSizeLevel(oMainStyle.m_oFont.GetSize().ToInt(NSCSS::Point) * 2))};
nFontSizeLevel += nCalculatedFontChange;

View File

@ -22,6 +22,58 @@ DEFINES += HWPFILE_USE_DYNAMIC_LIBRARY \
SOURCES += \
HWPFile.cpp \
HwpDoc/Chart/Attribute.cpp \
HwpDoc/Chart/Axis.cpp \
HwpDoc/Chart/Backdrop.cpp \
HwpDoc/Chart/Bar.cpp \
HwpDoc/Chart/Brush.cpp \
HwpDoc/Chart/CategoryScale.cpp \
HwpDoc/Chart/ChartReader.cpp \
HwpDoc/Chart/ChartStream.cpp \
HwpDoc/Chart/Contour.cpp \
HwpDoc/Chart/ContourGradient.cpp \
HwpDoc/Chart/Coor.cpp \
HwpDoc/Chart/Coor3.cpp \
HwpDoc/Chart/DataGrid.cpp \
HwpDoc/Chart/DataPoint.cpp \
HwpDoc/Chart/DateScale.cpp \
HwpDoc/Chart/Doughnut.cpp \
HwpDoc/Chart/Elevation.cpp \
HwpDoc/Chart/Fill.cpp \
HwpDoc/Chart/Footnote.cpp \
HwpDoc/Chart/Frame.cpp \
HwpDoc/Chart/Gradient.cpp \
HwpDoc/Chart/HiLo.cpp \
HwpDoc/Chart/Intersection.cpp \
HwpDoc/Chart/LCoor.cpp \
HwpDoc/Chart/LRect.cpp \
HwpDoc/Chart/Label.cpp \
HwpDoc/Chart/Legend.cpp \
HwpDoc/Chart/Light.cpp \
HwpDoc/Chart/Location.cpp \
HwpDoc/Chart/Marker.cpp \
HwpDoc/Chart/Pen.cpp \
HwpDoc/Chart/Pie.cpp \
HwpDoc/Chart/Plot.cpp \
HwpDoc/Chart/Position.cpp \
HwpDoc/Chart/PrintInformation.cpp \
HwpDoc/Chart/Rect.cpp \
HwpDoc/Chart/Series.cpp \
HwpDoc/Chart/Shadow.cpp \
HwpDoc/Chart/StatLine.cpp \
HwpDoc/Chart/Surface.cpp \
HwpDoc/Chart/TextLayout.cpp \
HwpDoc/Chart/Tick.cpp \
HwpDoc/Chart/Title.cpp \
HwpDoc/Chart/ValueScale.cpp \
HwpDoc/Chart/View3D.cpp \
HwpDoc/Chart/VtChart.cpp \
HwpDoc/Chart/VtColor.cpp \
HwpDoc/Chart/VtFont.cpp \
HwpDoc/Chart/VtPicture.cpp \
HwpDoc/Chart/Wall.cpp \
HwpDoc/Chart/Weighting.cpp \
HwpDoc/Chart/XYZ.cpp \
HwpDoc/Common/XMLReader.cpp \
HwpDoc/Common/WriterContext.cpp \
HwpDoc/Conversion/Converter2OOXML.cpp \
@ -99,6 +151,61 @@ SOURCES += \
HEADERS += \
HWPFile.h \
HwpDoc/Chart/Attribute.h \
HwpDoc/Chart/Axis.h \
HwpDoc/Chart/Backdrop.h \
HwpDoc/Chart/Bar.h \
HwpDoc/Chart/Brush.h \
HwpDoc/Chart/CategoryScale.h \
HwpDoc/Chart/CharCommon.h \
HwpDoc/Chart/ChartObject.h \
HwpDoc/Chart/ChartReader.h \
HwpDoc/Chart/ChartStream.h \
HwpDoc/Chart/Contour.h \
HwpDoc/Chart/ContourGradient.h \
HwpDoc/Chart/Coor.h \
HwpDoc/Chart/Coor3.h \
HwpDoc/Chart/DataGrid.h \
HwpDoc/Chart/DataPoint.h \
HwpDoc/Chart/DateScale.h \
HwpDoc/Chart/Doughnut.h \
HwpDoc/Chart/Elevation.h \
HwpDoc/Chart/Fill.h \
HwpDoc/Chart/Footnote.h \
HwpDoc/Chart/Frame.h \
HwpDoc/Chart/Gradient.h \
HwpDoc/Chart/HiLo.h \
HwpDoc/Chart/Intersection.h \
HwpDoc/Chart/LCoor.h \
HwpDoc/Chart/LRect.h \
HwpDoc/Chart/Label.h \
HwpDoc/Chart/Legend.h \
HwpDoc/Chart/Light.h \
HwpDoc/Chart/Location.h \
HwpDoc/Chart/Marker.h \
HwpDoc/Chart/Pen.h \
HwpDoc/Chart/Pie.h \
HwpDoc/Chart/Plot.h \
HwpDoc/Chart/Position.h \
HwpDoc/Chart/PrintInformation.h \
HwpDoc/Chart/Rect.h \
HwpDoc/Chart/Series.h \
HwpDoc/Chart/Shadow.h \
HwpDoc/Chart/StatLine.h \
HwpDoc/Chart/Surface.h \
HwpDoc/Chart/TextLayout.h \
HwpDoc/Chart/Tick.h \
HwpDoc/Chart/Title.h \
HwpDoc/Chart/Types.h \
HwpDoc/Chart/ValueScale.h \
HwpDoc/Chart/View3D.h \
HwpDoc/Chart/VtChart.h \
HwpDoc/Chart/VtColor.h \
HwpDoc/Chart/VtFont.h \
HwpDoc/Chart/VtPicture.h \
HwpDoc/Chart/Wall.h \
HwpDoc/Chart/Weighting.h \
HwpDoc/Chart/XYZ.h \
HwpDoc/Common/Common.h \
HwpDoc/Common/NodeNames.h \
HwpDoc/Common/WriterContext.h \

View File

@ -0,0 +1,15 @@
#include "Attribute.h"
namespace HWP { namespace CHART
{
CAttribute::CAttribute()
{
}
bool CAttribute::Read(CChartStream& oStream)
{
return m_oBrush.Read(oStream) && m_oPen.Read(oStream) &&
oStream.ReadString(m_sText) && oStream.ReadDouble(m_dValue);
}
}}

View File

@ -0,0 +1,25 @@
#ifndef ATTRIBUTE_H
#define ATTRIBUTE_H
#include "Brush.h"
#include "Pen.h"
#include "Collection.h"
namespace HWP { namespace CHART
{
class CAttribute : public IChartObject
{
CBrush m_oBrush;
CPen m_oPen;
CHART_STRING m_sText;
CHART_DOUBLE m_dValue;
public:
CAttribute();
bool Read(CChartStream& oStream) override;
};
using CAttributes = CCollection<CAttribute>;
}}
#endif // ATTRIBUTE_H

View File

@ -0,0 +1,51 @@
#include "Axis.h"
namespace HWP { namespace CHART
{
CAxisGrid::CAxisGrid()
{
}
bool CAxisGrid::Read(CChartStream& oStream)
{
return m_oMajorPen.Read(oStream) && m_oMinorPen.Read(oStream);
}
CAxisScale::CAxisScale()
{
}
bool CAxisScale::Read(CChartStream& oStream)
{
return oStream.ReadBoolean(m_bHide) && oStream.ReadInteger(m_nLogBase) &&
oStream.ReadString(m_sPercentBasis) && oStream.ReadInteger(m_nType);
}
CAxisTitle::CAxisTitle()
{
}
bool CAxisTitle::Read(CChartStream& oStream)
{
return m_oBackdrop.Read(oStream) && oStream.ReadString(m_sText) &&
m_oTextLayout.Read(oStream) && oStream.ReadInteger(m_nTextLength) &&
oStream.ReadBoolean(m_bVisible) && m_oVtFont.Read(oStream);
}
CAxis::CAxis()
{
}
bool CAxis::Read(CChartStream& oStream)
{
return m_oAxisGrid.Read(oStream) && m_oAxisScale.Read(oStream) &&
m_oAxisTitle.Read(oStream) && m_oCategoryScale.Read(oStream) &&
m_oDateScale.Read(oStream) && m_oIntersection.Read(oStream) &&
m_oLabels.Read(oStream) && oStream.ReadInteger(m_nLabelLevelCount) &&
m_oPen.Read(oStream) && m_oTick.Read(oStream) && m_oValueScale.Read(oStream);
}
}}

View File

@ -0,0 +1,73 @@
#ifndef AXIS_H
#define AXIS_H
#include "Pen.h"
#include "VtFont.h"
#include "Backdrop.h"
#include "TextLayout.h"
#include "CategoryScale.h"
#include "DateScale.h"
#include "Intersection.h"
#include "Label.h"
#include "Tick.h"
#include "ValueScale.h"
namespace HWP { namespace CHART
{
class CAxisGrid : public IChartObject
{
CPen m_oMajorPen;
CPen m_oMinorPen;
public:
CAxisGrid();
bool Read(CChartStream& oStream) override;
};
class CAxisScale : public IChartObject
{
CHART_BOOLEAN m_bHide;
CHART_INTEGER m_nLogBase;
CHART_STRING m_sPercentBasis;
CHART_INTEGER m_nType;
public:
CAxisScale();
bool Read(CChartStream& oStream) override;
};
class CAxisTitle : public IChartObject
{
CBackdrop m_oBackdrop;
CHART_STRING m_sText;
CTextLayout m_oTextLayout;
CHART_INTEGER m_nTextLength;
CHART_BOOLEAN m_bVisible;
CVtFont m_oVtFont;
public:
CAxisTitle();
bool Read(CChartStream& oStream) override;
};
class CAxis : public IChartObject
{
CAxisGrid m_oAxisGrid;
CAxisScale m_oAxisScale;
CAxisTitle m_oAxisTitle;
CCategoryScale m_oCategoryScale;
CDateScale m_oDateScale;
CIntersection m_oIntersection;
CLabels m_oLabels;
CHART_INTEGER m_nLabelLevelCount;
CPen m_oPen;
CTick m_oTick;
CValueScale m_oValueScale;
public:
CAxis();
bool Read(CChartStream& oStream) override;
};
}}
#endif // AXIS_H

View File

@ -0,0 +1,14 @@
#include "Backdrop.h"
namespace HWP { namespace CHART
{
CBackdrop::CBackdrop()
{
}
bool CBackdrop::Read(CChartStream& oStream)
{
return m_oFrame.Read(oStream) && m_oFill.Read(oStream) && m_oShadow.Read(oStream);
}
}}

View File

@ -0,0 +1,22 @@
#ifndef BACKDROP_H
#define BACKDROP_H
#include "Frame.h"
#include "Fill.h"
#include "Shadow.h"
namespace HWP { namespace CHART
{
class CBackdrop : public IChartObject
{
CFrame m_oFrame;
CFill m_oFill;
CShadow m_oShadow;
public:
CBackdrop();
bool Read(CChartStream& oStream) override;
};
}}
#endif // BACKDROP_H

View File

@ -0,0 +1,14 @@
#include "Bar.h"
namespace HWP { namespace CHART
{
CBar::CBar()
{
}
bool CBar::Read(CChartStream& oStream)
{
return oStream.ReadInteger(m_nSides) && oStream.ReadSingle(m_snTopRatio);
}
}}

View File

@ -0,0 +1,19 @@
#ifndef BAR_H
#define BAR_H
#include "ChartObject.h"
namespace HWP { namespace CHART
{
class CBar : public IChartObject
{
CHART_INTEGER m_nSides;
CHART_SINGLE m_snTopRatio;
public:
CBar();
bool Read(CChartStream& oStream) override;
};
}}
#endif // BAR_H

View File

@ -0,0 +1,15 @@
#include "Brush.h"
namespace HWP { namespace CHART
{
CBrush::CBrush()
{
}
bool CBrush::Read(CChartStream& oStream)
{
return m_oFillColor.Read(oStream) && oStream.ReadInteger(m_nIndex) &&
m_oPatternColor.Read(oStream) && oStream.ReadInteger(m_nStyle);
}
}}

View File

@ -0,0 +1,21 @@
#ifndef BRUSH_H
#define BRUSH_H
#include "VtColor.h"
namespace HWP { namespace CHART
{
class CBrush : public IChartObject
{
CVtColor m_oFillColor;
CHART_INTEGER m_nIndex;
CVtColor m_oPatternColor;
CHART_INTEGER m_nStyle;
public:
CBrush();
bool Read(CChartStream& oStream) override;
};
}}
#endif // BRUSH_H

View File

@ -0,0 +1,15 @@
#include "CategoryScale.h"
namespace HWP { namespace CHART
{
CCategoryScale::CCategoryScale()
{
}
bool CCategoryScale::Read(CChartStream& oStream)
{
return oStream.ReadBoolean(m_bAuto) && oStream.ReadInteger(m_nDivisionsPerLabel) &&
oStream.ReadInteger(m_nDivisionsPerTick) && oStream.ReadBoolean(m_bLabelTick);
}
}}

View File

@ -0,0 +1,21 @@
#ifndef CATEGORYSCALE_H
#define CATEGORYSCALE_H
#include "ChartObject.h"
namespace HWP { namespace CHART
{
class CCategoryScale : public IChartObject
{
CHART_BOOLEAN m_bAuto;
CHART_INTEGER m_nDivisionsPerLabel;
CHART_INTEGER m_nDivisionsPerTick;
CHART_BOOLEAN m_bLabelTick;
public:
CCategoryScale();
bool Read(CChartStream& oStream) override;
};
}}
#endif // CATEGORYSCALE_H

View File

@ -0,0 +1,17 @@
#ifndef CHARCOMMON_H
#define CHARCOMMON_H
#include <cstdint>
#include <string>
namespace HWP { namespace CHART
{
typedef bool CHART_BOOLEAN;
typedef int8_t CHART_INTEGER;
typedef int CHART_LONG;
typedef float CHART_SINGLE;
typedef double CHART_DOUBLE;
typedef std::wstring CHART_STRING;
}}
#endif // CHARCOMMON_H

View File

@ -0,0 +1,21 @@
#ifndef CHARTOBJECT_H
#define CHARTOBJECT_H
#include "Types.h"
#include "ChartStream.h"
namespace HWP { namespace CHART
{
class IChartObject
{
CHART_LONG m_lId;
CHART_LONG m_lStoredtypeId;
protected:
IChartObject() = default;
public:
virtual bool Read(CChartStream& oStream) = 0;
// virtual ETypes GetType() const = 0;
};
}}
#endif // CHARTOBJECT_H

View File

@ -0,0 +1,28 @@
#include "ChartReader.h"
#include "VtChart.h"
namespace HWP { namespace CHART
{
CChartReader::CChartReader()
{
}
bool CChartReader::ReadFromOle(CHWPStream& oOleData)
{
CChartStream oChartStream(&oOleData);
oChartStream.Skip(44); //Unknown data
CHART_STRING sStoredName;
oChartStream.ReadString(sStoredName);
CVtChart oVtChart;
if (!oVtChart.Read(oChartStream))
return false;
return false;
}
}}

View File

@ -0,0 +1,17 @@
#ifndef CHARTREADER_H
#define CHARTREADER_H
#include "../HWPStream.h"
namespace HWP { namespace CHART
{
class CChartReader
{
public:
CChartReader();
bool ReadFromOle(CHWPStream& oOleData);
};
}}
#endif // CHARTREADER_H

View File

@ -0,0 +1,74 @@
#include "ChartStream.h"
namespace HWP { namespace CHART
{
CChartStream::CChartStream()
: m_pStream(nullptr), m_bExternStream(false)
{}
CChartStream::CChartStream(CHWPStream* pStream, bool bExtern)
: m_pStream(pStream), m_bExternStream(bExtern)
{}
CChartStream::~CChartStream()
{
if (nullptr != m_pStream && !m_bExternStream)
delete m_pStream;
}
#define CHECK_VALID()\
if (!Valid())\
return false
bool CChartStream::ReadBoolean(CHART_BOOLEAN& bValue)
{
CHECK_VALID();
return m_pStream->ReadBool(bValue);
}
bool CChartStream::ReadInteger(CHART_INTEGER& nValue)
{
CHECK_VALID();
return m_pStream->ReadByte((HWP_BYTE&)nValue);
}
bool CChartStream::ReadLong(CHART_LONG& lValue)
{
CHECK_VALID();
return m_pStream->ReadInt(lValue);
}
bool CChartStream::ReadSingle(CHART_SINGLE& fValue)
{
CHECK_VALID();
return m_pStream->ReadFloat(fValue);
}
bool CChartStream::ReadDouble(CHART_DOUBLE& dValue)
{
CHECK_VALID();
return m_pStream->ReadDouble(dValue);
}
bool CChartStream::ReadString(HWP_STRING& sValue)
{
CHECK_VALID();
short shCount;
if (!m_pStream->ReadShort(shCount))
return false;
return m_pStream->ReadString(sValue, shCount, EStringCharacter::ASCII);
}
void CChartStream::Skip(int nStep)
{
if (nullptr != m_pStream)
m_pStream->Skip(nStep);
}
bool CChartStream::Valid() const
{
return nullptr != m_pStream && m_pStream->IsValid();
}
}}

View File

@ -0,0 +1,31 @@
#ifndef CHARTSTREAM_H
#define CHARTSTREAM_H
#include "../HWPStream.h"
#include "CharCommon.h"
namespace HWP { namespace CHART
{
class CChartStream
{
CHWPStream *m_pStream;
bool m_bExternStream;
public:
CChartStream();
CChartStream(CHWPStream* pStream, bool bExtern = true);
~CChartStream();
bool ReadBoolean(CHART_BOOLEAN& bValue);
bool ReadInteger(CHART_INTEGER& nValue);
bool ReadLong(CHART_LONG& lValue);
bool ReadSingle(CHART_SINGLE& fValue);
bool ReadDouble(CHART_DOUBLE& dValue);
bool ReadString(HWP_STRING& sValue);
void Skip(int nStep);
private:
bool Valid() const;
};
}}
#endif // CHARTSTREAM_H

View File

@ -0,0 +1,7 @@
#include "Collection.h"
CCollection::CCollection()
{
}

View File

@ -0,0 +1,54 @@
#ifndef COLLECTION_H
#define COLLECTION_H
#include "ChartObject.h"
namespace HWP { namespace CHART
{
template<typename T>
class CCollection : public IChartObject
{
std::vector<const T*> m_arItems;
public:
CCollection() = default;
~CCollection()
{
for (const T* pItem : m_arItems)
delete pItem;
}
bool AddItem(const T* pItem)
{
if(nullptr == pItem)
return false;
m_arItems.push_back(pItem);
return true;
}
virtual bool Read(CChartStream& oStream) override
{
CHART_LONG lCount;
if (!oStream.ReadLong(lCount))
return false;
for (long lIndex = 0; lIndex < lCount; ++lIndex)
{
T* pItem = new T();
if (nullptr == pItem)
continue;
if (!pItem->Read(oStream) || !AddItem(pItem))
{
delete pItem;
return false;
}
return true;
}
}
};
}}
#endif // COLLECTION_H

View File

@ -0,0 +1,14 @@
#include "Contour.h"
namespace HWP { namespace CHART
{
CContour::CContour()
{
}
bool CContour::Read(CChartStream& oStream)
{
return oStream.ReadInteger(m_nDisplayType);
}
}}

View File

@ -0,0 +1,18 @@
#ifndef CONTOUR_H
#define CONTOUR_H
#include "ChartObject.h"
namespace HWP { namespace CHART
{
class CContour : public IChartObject
{
CHART_INTEGER m_nDisplayType;
public:
CContour();
bool Read(CChartStream& oStream) override;
};
}}
#endif // CONTOUR_H

View File

@ -0,0 +1,15 @@
#include "ContourGradient.h"
namespace HWP { namespace CHART
{
CContourGradient::CContourGradient()
{
}
bool CContourGradient::Read(CChartStream& oStream)
{
return m_oFromBrushColor.Read(oStream) && m_oToBrushColor.Read(oStream) &&
m_oFromPenColor.Read(oStream) && m_oToPenColor.Read(oStream);
}
}}

View File

@ -0,0 +1,21 @@
#ifndef CONTOURGRADIENT_H
#define CONTOURGRADIENT_H
#include "VtColor.h"
namespace HWP { namespace CHART
{
class CContourGradient : public IChartObject
{
CVtColor m_oFromBrushColor;
CVtColor m_oToBrushColor;
CVtColor m_oFromPenColor;
CVtColor m_oToPenColor;
public:
CContourGradient();
bool Read(CChartStream& oStream) override;
};
}}
#endif // CONTOURGRADIENT_H

View File

@ -0,0 +1,14 @@
#include "Coor.h"
namespace HWP { namespace CHART
{
CCoor::CCoor()
{
}
bool CCoor::Read(CChartStream& oStream)
{
return oStream.ReadSingle(m_snX) && oStream.ReadSingle(m_snY);
}
}}

View File

@ -0,0 +1,19 @@
#ifndef COOR_H
#define COOR_H
#include "ChartObject.h"
namespace HWP { namespace CHART
{
class CCoor : public IChartObject
{
CHART_SINGLE m_snX;
CHART_SINGLE m_snY;
public:
CCoor();
bool Read(CChartStream& oStream) override;
};
}}
#endif // COOR_H

View File

@ -0,0 +1,14 @@
#include "Coor3.h"
namespace HWP { namespace CHART
{
CCoor3::CCoor3()
{
}
bool CCoor3::Read(CChartStream& oStream)
{
return oStream.ReadSingle(m_snX) && oStream.ReadSingle(m_snY) && oStream.ReadSingle(m_snZ);
}
}}

View File

@ -0,0 +1,20 @@
#ifndef COOR3_H
#define COOR3_H
#include "ChartObject.h"
namespace HWP { namespace CHART
{
class CCoor3 : public IChartObject
{
CHART_SINGLE m_snX;
CHART_SINGLE m_snY;
CHART_SINGLE m_snZ;
public:
CCoor3();
bool Read(CChartStream& oStream) override;
};
}}
#endif // COOR3_H

View File

@ -0,0 +1,17 @@
#include "DataGrid.h"
namespace HWP { namespace CHART
{
CDataGrid::CDataGrid()
{
}
bool CDataGrid::Read(CChartStream& oStream)
{
return oStream.ReadInteger(m_nColumnCount) && oStream.ReadString(m_sColumnLabel) &&
oStream.ReadInteger(m_nColumnLabelCount) && oStream.ReadInteger(m_nCompositeColumnLabel) &&
oStream.ReadString(m_sCompositeRowLabel) && oStream.ReadInteger(m_nRowCount) &&
oStream.ReadString(m_sRowLabel) && oStream.ReadInteger(m_nRowLabelCount);
}
}}

View File

@ -0,0 +1,25 @@
#ifndef DATAGRID_H
#define DATAGRID_H
#include "ChartObject.h"
namespace HWP { namespace CHART
{
class CDataGrid : public IChartObject
{
CHART_INTEGER m_nColumnCount;
CHART_STRING m_sColumnLabel;
CHART_INTEGER m_nColumnLabelCount;
CHART_INTEGER m_nCompositeColumnLabel;
CHART_STRING m_sCompositeRowLabel;
CHART_INTEGER m_nRowCount;
CHART_STRING m_sRowLabel;
CHART_INTEGER m_nRowLabelCount;
public:
CDataGrid();
bool Read(CChartStream& oStream) override;
};
}}
#endif // DATAGRID_H

View File

@ -0,0 +1,31 @@
#include "DataPoint.h"
namespace HWP { namespace CHART
{
CDataPointLabel::CDataPointLabel()
{
}
bool CDataPointLabel::Read(CChartStream& oStream)
{
return m_oBackdrop.Read(oStream) && oStream.ReadInteger(m_nComponent) &&
oStream.ReadBoolean(m_bCustom) && oStream.ReadInteger(m_nLineStyle) &&
oStream.ReadInteger(m_nLocationType) && m_oOffset.Read(oStream) &&
oStream.ReadString(m_sPercentFormat) && oStream.ReadString(m_sText) &&
m_oTextLayout.Read(oStream) && oStream.ReadInteger(m_nTextLength) &&
oStream.ReadString(m_sValueFormat) && m_oVtFont.Read(oStream);
}
CDataPoint::CDataPoint()
{
}
bool CDataPoint::Read(CChartStream& oStream)
{
return m_oBrush.Read(oStream) && m_oDataPointLabel.Read(oStream) &&
m_oEdgePen.Read(oStream) && oStream.ReadSingle(m_snOffset) &&
m_oMarker.Read(oStream) && m_oVtPicture.Read(oStream);
}
}}

View File

@ -0,0 +1,53 @@
#ifndef DATAPOINT_H
#define DATAPOINT_H
#include "Backdrop.h"
#include "Coor.h"
#include "TextLayout.h"
#include "VtFont.h"
#include "Pen.h"
#include "Marker.h"
#include "Brush.h"
#include "VtPicture.h"
#include "Collection.h"
namespace HWP { namespace CHART
{
class CDataPointLabel : public IChartObject
{
CBackdrop m_oBackdrop;
CHART_INTEGER m_nComponent;
CHART_BOOLEAN m_bCustom;
CHART_INTEGER m_nLineStyle;
CHART_INTEGER m_nLocationType;
CCoor m_oOffset;
CHART_STRING m_sPercentFormat;
CHART_STRING m_sText;
CTextLayout m_oTextLayout;
CHART_INTEGER m_nTextLength;
CHART_STRING m_sValueFormat;
CVtFont m_oVtFont;
public:
CDataPointLabel();
bool Read(CChartStream& oStream) override;
};
class CDataPoint : public IChartObject
{
CBrush m_oBrush;
CDataPointLabel m_oDataPointLabel;
CPen m_oEdgePen;
CHART_SINGLE m_snOffset;
CMarker m_oMarker;
CVtPicture m_oVtPicture;
public:
CDataPoint();
bool Read(CChartStream& oStream) override;
};
using CDataPoints = CCollection<CDataPoint>;
}}
#endif // DATAPOINT_H

View File

@ -0,0 +1,17 @@
#include "DateScale.h"
namespace HWP { namespace CHART
{
CDateScale::CDateScale()
{
}
bool CDateScale::Read(CChartStream& oStream)
{
return oStream.ReadBoolean(m_bAuto) && oStream.ReadInteger(m_nMajFreq) &&
oStream.ReadInteger(m_nMajInt) && oStream.ReadDouble(m_dMaximum) &&
oStream.ReadDouble(m_dMinimum) && oStream.ReadInteger(m_nMinFreq) &&
oStream.ReadInteger(m_nMinInt) && oStream.ReadBoolean(m_bSkipWeekend);
}
}}

View File

@ -0,0 +1,25 @@
#ifndef DATESCALE_H
#define DATESCALE_H
#include "ChartObject.h"
namespace HWP { namespace CHART
{
class CDateScale : public IChartObject
{
CHART_BOOLEAN m_bAuto;
CHART_INTEGER m_nMajFreq;
CHART_INTEGER m_nMajInt;
CHART_DOUBLE m_dMaximum;
CHART_DOUBLE m_dMinimum;
CHART_INTEGER m_nMinFreq;
CHART_INTEGER m_nMinInt;
CHART_BOOLEAN m_bSkipWeekend;
public:
CDateScale();
bool Read(CChartStream& oStream) override;
};
}}
#endif // DATESCALE_H

View File

@ -0,0 +1,14 @@
#include "Doughnut.h"
namespace HWP { namespace CHART
{
CDoughnut::CDoughnut()
{
}
bool CDoughnut::Read(CChartStream& oStream)
{
return oStream.ReadInteger(m_nSides) && oStream.ReadSingle(m_snInteriorRatio);
}
}}

View File

@ -0,0 +1,19 @@
#ifndef DOUGHNUT_H
#define DOUGHNUT_H
#include "ChartObject.h"
namespace HWP { namespace CHART
{
class CDoughnut : public IChartObject
{
CHART_INTEGER m_nSides;
CHART_SINGLE m_snInteriorRatio;
public:
CDoughnut();
bool Read(CChartStream& oStream) override;
};
}}
#endif // DOUGHNUT_H

View File

@ -0,0 +1,18 @@
#include "Elevation.h"
namespace HWP { namespace CHART
{
CElevation::CElevation()
{
}
bool CElevation::Read(CChartStream& oStream)
{
return m_oAttributes.Read(oStream) && oStream.ReadBoolean(m_bAutoValues) &&
oStream.ReadInteger(m_nColorType) && oStream.ReadInteger(m_nColSmoothing) &&
m_oContour.Read(oStream) && m_oContourGradient.Read(oStream) &&
oStream.ReadInteger(m_nRowSmoothing) && oStream.ReadBoolean(m_bSeparateContourData) &&
m_oSurface.Read(oStream);
}
}}

View File

@ -0,0 +1,29 @@
#ifndef ELEVATION_H
#define ELEVATION_H
#include "Attribute.h"
#include "Contour.h"
#include "ContourGradient.h"
#include "Surface.h"
namespace HWP { namespace CHART
{
class CElevation : public IChartObject
{
CAttributes m_oAttributes;
CHART_BOOLEAN m_bAutoValues;
CHART_INTEGER m_nColorType;
CHART_INTEGER m_nColSmoothing;
CContour m_oContour;
CContourGradient m_oContourGradient;
CHART_INTEGER m_nRowSmoothing;
CHART_BOOLEAN m_bSeparateContourData;
CSurface m_oSurface;
public:
CElevation();
bool Read(CChartStream& oStream) override;
};
}}
#endif // ELEVATION_H

View File

@ -0,0 +1,15 @@
#include "Fill.h"
namespace HWP { namespace CHART
{
CFill::CFill()
{
}
bool CFill::Read(CChartStream& oStream)
{
return m_oBrush.Read(oStream) && /*&&*/
oStream.ReadInteger(m_nStyle) && m_oVtPicture.Read(oStream);
}
}}

View File

@ -0,0 +1,27 @@
#ifndef FILL_H
#define FILL_H
#include "Brush.h"
#include "Gradient.h"
#include "VtPicture.h"
namespace HWP { namespace CHART
{
class CFill : public IChartObject
{
CBrush m_oBrush;
// union
// {
// CGradient m_oGradient;
// CVtPicture m_oPicture;
// } m_oGradient;
CHART_INTEGER m_nStyle;
CVtPicture m_oVtPicture;
public:
CFill();
bool Read(CChartStream& oStream) override;
};
}}
#endif // FILL_H

View File

@ -0,0 +1,16 @@
#include "Footnote.h"
namespace HWP { namespace CHART
{
CFootnote::CFootnote()
{
}
bool CFootnote::Read(CChartStream& oStream)
{
return m_oBackdrop.Read(oStream) && m_oLocation.Read(oStream) &&
oStream.ReadString(m_sText) && m_oTextLayout.Read(oStream) &&
oStream.ReadInteger(m_nTextLength) && m_oVtFont.Read(oStream);
}
}}

View File

@ -0,0 +1,26 @@
#ifndef FOOTNOTE_H
#define FOOTNOTE_H
#include "Backdrop.h"
#include "Location.h"
#include "TextLayout.h"
#include "VtFont.h"
namespace HWP { namespace CHART
{
class CFootnote : public IChartObject
{
CBackdrop m_oBackdrop;
CLocation m_oLocation;
CHART_STRING m_sText;
CTextLayout m_oTextLayout;
CHART_INTEGER m_nTextLength;
CVtFont m_oVtFont;
public:
CFootnote();
bool Read(CChartStream& oStream) override;
};
}}
#endif // FOOTNOTE_H

View File

@ -0,0 +1,15 @@
#include "Frame.h"
namespace HWP { namespace CHART
{
CFrame::CFrame()
{
}
bool CFrame::Read(CChartStream& oStream)
{
return oStream.ReadInteger(m_nStyle) && oStream.ReadSingle(m_snWidth) &&
m_oFrameColor.Read(oStream) && m_oSpaceColor.Read(oStream);
}
}}

View File

@ -0,0 +1,21 @@
#ifndef FRAME_H
#define FRAME_H
#include "VtColor.h"
namespace HWP { namespace CHART
{
class CFrame : public IChartObject
{
CHART_INTEGER m_nStyle;
CHART_SINGLE m_snWidth;
CVtColor m_oFrameColor;
CVtColor m_oSpaceColor;
public:
CFrame();
bool Read(CChartStream& oStream) override;
};
}}
#endif // FRAME_H

View File

@ -0,0 +1,15 @@
#include "Gradient.h"
namespace HWP { namespace CHART
{
CGradient::CGradient()
{
}
bool CGradient::Read(CChartStream& oStream)
{
return m_oFromColor.Read(oStream) && oStream.ReadInteger(m_nStyle) &&
m_oToColor.Read(oStream);
}
}}

View File

@ -0,0 +1,20 @@
#ifndef GRADIENT_H
#define GRADIENT_H
#include "VtColor.h"
namespace HWP { namespace CHART
{
class CGradient : public IChartObject
{
CVtColor m_oFromColor;
CHART_INTEGER m_nStyle;
CVtColor m_oToColor;
public:
CGradient();
bool Read(CChartStream& oStream) override;
};
}}
#endif // GRADIENT_H

View File

@ -0,0 +1,14 @@
#include "HiLo.h"
namespace HWP { namespace CHART
{
CHiLo::CHiLo()
{
}
bool CHiLo::Read(CChartStream& oStream)
{
return m_oGainColor.Read(oStream) && m_oLossColor.Read(oStream);
}
}}

View File

@ -0,0 +1,19 @@
#ifndef HILO_H
#define HILO_H
#include "VtColor.h"
namespace HWP { namespace CHART
{
class CHiLo : public IChartObject
{
CVtColor m_oGainColor;
CVtColor m_oLossColor;
public:
CHiLo();
bool Read(CChartStream& oStream) override;
};
}}
#endif // HILO_H

View File

@ -0,0 +1,16 @@
#include "Intersection.h"
namespace HWP { namespace CHART
{
CIntersection::CIntersection()
{
}
bool CIntersection::Read(CChartStream& oStream)
{
return oStream.ReadBoolean(m_bAuto) && oStream.ReadInteger(m_nAxisId) &&
oStream.ReadInteger(m_nIndex) && oStream.ReadBoolean(m_bLabelsInsidePlot) &&
oStream.ReadDouble(m_dPoint);
}
}}

Some files were not shown because too many files have changed in this diff Show More