Compare commits

...

497 Commits

Author SHA1 Message Date
cf90cd9e12 Merge pull request #1426 from ONLYOFFICE/fix/bug61241
fix bug #61241
2024-02-20 22:47:29 +03:00
690d17f6c4 fix bug #61241 2024-02-20 22:29:13 +03:00
7776743d8d Fix bug 66567 2024-02-19 22:15:10 +03:00
159ffec93b Merge pull request #1423 from ONLYOFFICE/fix/bug66562
Fix bug #66562
2024-02-19 17:37:53 +03:00
aba868b9ac Fix bug #66562 2024-02-19 18:25:05 +06:00
7d6a95d521 Fix bug 65583 2024-02-18 22:10:54 +03:00
0ff68fcd8d Merge pull request #1422 from ONLYOFFICE/fix/bug66545 2024-02-17 10:42:05 +03:00
25fc759e61 Fix bug 66545 2024-02-17 10:18:10 +03:00
ace094fc2a for bug #63610 2024-02-16 17:31:21 +03:00
77901663a0 Fix bug 66513 2024-02-16 12:50:59 +03:00
e11f145d30 Merge pull request #1420 from ONLYOFFICE/fix/bug66504
Fix bug 66504
2024-02-15 17:26:44 +03:00
5c69cb0358 Fix MemStream::setPos 2024-02-15 17:20:57 +03:00
2f4fee3555 Fix bug 66504 2024-02-15 16:35:27 +03:00
7710090d31 Merge pull request #1419 from ONLYOFFICE/fix/pdf-name
Fix T name due to Adobe
2024-02-15 16:16:16 +03:00
c7df1bc3ce Merge pull request #1418 from ONLYOFFICE/fix/bug66504
Fix bug 66504
2024-02-15 16:15:56 +03:00
7fdead0eda Fix T name due to Adobe 2024-02-15 16:13:33 +03:00
e78a4c84b4 Fix bug 66504 2024-02-15 15:50:36 +03:00
62481e5def Fix bug 66473 2024-02-15 11:20:01 +03:00
192704636f Fix build 2024-02-14 20:47:26 +03:00
0a9356f54b For bug 65400 2024-02-14 20:06:36 +03:00
ae8b458f79 fix bug #66497 2024-02-14 18:58:12 +03:00
8a88fce72f Merge pull request #1417 from ONLYOFFICE/feature/pdf-line
Write AP of pdf line annot
2024-02-14 14:58:44 +03:00
d23ebbdb38 Fix BC,BG for widget, C,S Line endpoint offset 2024-02-14 14:40:10 +03:00
5a9f74f5ad fix bug #66467 2024-02-14 14:22:44 +03:00
ef3cbf03b3 Merge pull request #1416 from ONLYOFFICE/fix/66463
Fix bug #66463
2024-02-14 13:30:19 +03:00
a6a73ffe3a Refactoring 2024-02-14 13:20:08 +03:00
33c5852834 Fix bug #66436 2024-02-13 20:25:30 +03:00
f055d0d592 Fix Line endpoint offset 2024-02-13 17:48:55 +03:00
bf68f87aa7 fix bug #65975 2024-02-13 14:41:10 +03:00
d4c245029d Create AdjustLineEndpoint and DrawLineArrow 2024-02-12 17:42:24 +03:00
fb72c73ca0 fix bug #66440 2024-02-10 18:40:10 +03:00
cf19a912ee fix bug #66392 2024-02-10 16:16:20 +03:00
01d76af52f Create AP for Line annots 2024-02-09 18:01:16 +03:00
795274a886 for bug #66401 2024-02-09 16:15:17 +03:00
5ccef7bdff Merge pull request #1415 from ONLYOFFICE/fix/WmfSize
Fix Wmf file Size
2024-02-09 13:15:06 +03:00
581e54691b Fix Wmf file Size 2024-02-09 12:59:17 +03:00
ba79959955 fix bug #66419 2024-02-08 17:59:20 +03:00
ea9ef2349d fix bug #66401
remove template
2024-02-08 15:09:27 +03:00
aaf9772805 Fix getting the cache key for qt tool (#1414) 2024-02-08 14:06:47 +03:00
8b62c50107 [android][x2t] Add format checker 2024-02-08 12:34:33 +03:00
3889ca0c94 Add codeql check (#1413)
* Add new action with codeql scanner

* Cosmetic changes

* Disable scanning on PR event

* codeql: ignore some unimportant paths

---------

Co-authored-by: Danil Titarenko <77471369+danilapog@users.noreply.github.com>
2024-02-08 12:11:41 +03:00
ca4c17847d fix bug #63352 2024-02-07 15:30:13 +03:00
1994a25b61 fix bug #66396 2024-02-07 11:38:03 +03:00
1e59463499 fix bug #66395 2024-02-07 11:33:07 +03:00
5d642ff7c4 fix bug #66394 2024-02-07 11:30:26 +03:00
74baaca570 Merge pull request #1411 from ONLYOFFICE/feature/android
Feature/android
2024-02-07 11:11:10 +03:00
5609c5fc7d fix bug #55873 2024-02-06 19:49:46 +03:00
a9394ac989 fix bug #66333 2024-02-06 17:43:33 +03:00
51a8984ab8 Merge pull request #1408 from ONLYOFFICE/fix/pdf-refactoring
Fix pdf bug
2024-02-06 17:16:48 +03:00
b413dbfb4a fix bug #66345 2024-02-06 14:03:17 +03:00
22bf7a149a Fix bug 66223 2024-02-06 12:26:52 +03:00
430adb678d Fix typo 2024-02-06 00:34:18 +03:00
d5126dbda9 PdfAnnot refactoring, For bug 66223 2024-02-05 18:00:18 +03:00
f6eb25b3f1 GetButtonIcon without W,H 2024-02-05 17:27:55 +03:00
c2231fca7c Add BaseThreadMonitor class 2024-02-05 12:32:41 +03:00
0529bc9d82 Merge remote-tracking branch 'origin/hotfix/v8.0.1' into fix/pdf-refactoring 2024-02-05 11:24:37 +03:00
29eb5bed4d Add new class 2024-02-05 10:54:54 +03:00
157c8acf57 fix bug #66312 2024-02-03 15:51:14 +03:00
397421c9c1 Fix build 2024-02-02 22:43:23 +03:00
59e977d94c Fix typo 2024-02-02 14:21:12 +03:00
e25071cecf Merge pull request #1407 from ONLYOFFICE/fix/bug66076
Fix bug 66076
2024-02-02 12:02:24 +03:00
c3e19a6376 Merge pull request #1406 from ONLYOFFICE/fix/pdf-formfield-fonts
Fix create unused font for CheckBox FormField
2024-02-02 12:01:03 +03:00
4868df7e10 Fix refactoring 2024-02-02 11:21:06 +03:00
7d55ebafbc Add openssl and logging 2024-02-02 11:16:43 +03:00
03078b01d1 Revert "Without static Decrypt"
This reverts commit 0ee70f03c1.
2024-02-02 10:52:31 +03:00
4c1420a3a6 PdfReader refactoring 2024-02-01 17:55:41 +03:00
ff6866c68a Merge pull request #1404 from ONLYOFFICE/fix/fix-bugs-v8.0
Fix/fix bugs v8.0
2024-02-01 11:41:33 +03:00
4d3f925a11 fix bug #65994 2024-01-31 14:46:24 +03:00
b05bdc68ce Fix create unused font for CheckBox FormField 2024-01-31 13:50:09 +03:00
4ddc517b93 fix bug #65786 2024-01-30 19:58:51 +03:00
fb78b3b611 for bug #66201 2024-01-30 19:14:47 +03:00
617714a907 fix same bugs 2024-01-30 19:13:55 +03:00
0ee70f03c1 Without static Decrypt 2024-01-30 17:00:08 +03:00
e30abd06a2 Merge branch release/v8.0.0 into master 2024-01-30 11:25:04 +00:00
70d8a1a927 For bug 66076 2024-01-30 01:17:31 +03:00
8e12b946a8 Merge pull request #1401 from ONLYOFFICE/fix/bug66223
Fix bug 66223
2024-01-29 18:53:44 +03:00
6e8c2d46fa Merge pull request #1402 from ONLYOFFICE/fix/bug66185
Fix bug #66185
2024-01-29 18:53:07 +03:00
efead80648 Fix bug #66185 2024-01-29 18:28:11 +03:00
3efd9aebc9 Fix bug 66223 2024-01-29 18:00:04 +03:00
2eed2729cc Merge pull request #1400 from ONLYOFFICE/fix/savingAnnots
Fix saving annots
2024-01-29 14:54:44 +03:00
f9000aba58 Fix saving annots 2024-01-29 14:49:00 +03:00
e61999c5fe fix bug #66192 2024-01-29 12:18:08 +03:00
108b749d4f fix unknown codepage 2024-01-29 11:51:33 +03:00
cb2dff90b9 Fix bug 63590 2024-01-29 00:02:55 +03:00
48a055d390 Fix metafiles with bad sizes. And revert one commit. 2024-01-29 00:00:37 +03:00
f8293950ca Merge pull request #1398 from ONLYOFFICE/fix/pdf-forms
Fix Opt for radiobutton, fix unicode for JS
2024-01-26 19:03:50 +03:00
84b19f48c7 Fix Opt for radiobutton, fix unicode for JS 2024-01-26 18:19:32 +03:00
ec107421bb Merge remote-tracking branch 'origin/fix/bug66175' into fix/fix-bugs-v8.0 2024-01-26 17:33:26 +03:00
d2acd7d86d Fix bug #66175 2024-01-26 16:54:30 +03:00
18d274cff2 Merge pull request #1396 from ONLYOFFICE/fix/bug65955
fix bug #65955
2024-01-26 15:51:23 +03:00
1686efd6ba Fix bug 66147 2024-01-26 15:11:51 +03:00
e73992f869 fix bug #65955 2024-01-26 15:10:46 +03:00
13a1d953b8 Merge pull request #1395 from ONLYOFFICE/fix/bug66136
Fix bug #66136
2024-01-25 17:02:40 +03:00
0764850b79 Fix bug #66136 2024-01-25 16:55:57 +03:00
9cfbb0012c Merge remote-tracking branch 'origin/fix/footersConversion' into fix/fix-bugs-v8.0 2024-01-25 16:35:24 +03:00
dfb8359d11 Merge pull request #1394 from ONLYOFFICE/fix/bug-pdf-web
[x2t] Fix bug with pdf opening in web
2024-01-25 13:54:36 +03:00
bd4d242aee [x2t] Fix bug with pdf opening in web 2024-01-25 13:52:16 +03:00
06cf8b4a3d Fix footer converion from xlsb to xlsx 2024-01-25 16:52:08 +06:00
16fec2e641 fix bug #66123 2024-01-25 12:08:44 +03:00
08c9dd34ac Fix build 65925 2024-01-24 21:59:09 +03:00
0ed9b41710 Merge pull request #1393 from ONLYOFFICE/fix/bug66122
fix bug #66122
2024-01-24 21:23:20 +03:00
fefe6b3053 fix bug #66122 2024-01-24 21:18:37 +03:00
50f3ad5d65 Merge branch 'release/v8.0.0' of https://github.com/ONLYOFFICE/core into release/v8.0.0 2024-01-24 21:03:16 +03:00
f134870e73 Fix bug 66072 2024-01-24 21:02:27 +03:00
180451e272 Merge pull request #1392 from ONLYOFFICE/fix/wmf
Fixed a bug with calculating the image size in wmf
2024-01-24 20:59:51 +03:00
9b97070db7 Fixed a bug with calculating the image size in wmf 2024-01-24 20:44:47 +03:00
9b16f92ae5 Merge pull request #1391 from ONLYOFFICE/fix/pdf-forms
Fix xref stream for big file
2024-01-24 16:49:50 +03:00
edb2a0f503 Fix xref stream for big file 2024-01-24 16:46:01 +03:00
39b61f1094 Merge pull request #1390 from ONLYOFFICE/fix/pdf-forms
Fix pdf forms
2024-01-24 15:52:46 +03:00
0e68fac03d Fix test 2024-01-24 15:36:40 +03:00
46ce3f962e Create SetEmptyAP 2024-01-24 14:35:20 +03:00
2be05c4439 Fix write AP_V with parent V, read/write AA 2024-01-24 12:47:14 +03:00
cb5d6d72b9 Fix convertation pdf/xps/djvu to doct 2024-01-24 12:30:50 +03:00
9f9da695d0 Add format detector to export 2024-01-24 10:54:43 +03:00
809ed0f91d Fix convertation to forms from forms format 2024-01-23 22:58:25 +03:00
1f4f05d52e Fix bug 65244 2024-01-23 21:59:25 +03:00
daaf4f0390 Fix bug 66011 2024-01-23 21:28:16 +03:00
1432c7b07e Fix pdf write 2024-01-23 18:44:36 +03:00
e9b9f0f550 Fix color precision 2024-01-23 18:41:29 +03:00
d61a309ca0 fix bug #66085 2024-01-23 15:12:10 +03:00
5c54ec3280 Fix bug 63779 2024-01-23 13:21:51 +03:00
aefce8c03c Merge pull request #1387 from ONLYOFFICE/fix/bug65989
Fix bug 65989
2024-01-23 10:41:46 +03:00
a879cd94c6 Fix bug 65989 2024-01-23 10:32:59 +03:00
42b86ceb53 Fix work in embedded mode (xp) 2024-01-22 21:25:44 +03:00
5cb048e074 Merge remote-tracking branch 'origin/fix/bug65600' into release/v8.0.0 2024-01-22 21:05:01 +03:00
eac27ae43b Fix bug #65600 2024-01-22 19:10:31 +05:00
0415a3ec56 Fix write unicode with encrypt 2024-01-22 16:45:27 +03:00
ad4754f7fc fix bug #65595 2024-01-22 16:17:15 +03:00
b589d8e3ce fix bug #65975 2024-01-22 16:02:48 +03:00
84ae9da444 fix bug #65976 2024-01-22 12:48:45 +03:00
bd7bcc6b4d fix bug #65977 2024-01-22 12:20:24 +03:00
7259f9b376 Merge remote-tracking branch 'origin/fix/bug50186' into release/v8.0.0 2024-01-22 11:28:18 +03:00
44b1abf27d Fix convertation to forms from forms format 2024-01-22 11:11:12 +03:00
d878291091 Fix bug 65650 2024-01-21 21:00:39 +03:00
4ee2ca7098 Fix bug 65965 2024-01-20 22:25:01 +03:00
78cb8a7d55 Fix bug #50186 2024-01-19 21:32:51 +05:00
29fe342a1c Merge pull request #1386 from ONLYOFFICE/fix/pdf-pushbutton
Fix pdf pushbutton
2024-01-19 14:36:32 +03:00
a2916309b3 Fix ShiftRespectBorder 2024-01-19 13:21:28 +03:00
9b38a17d5f Merge pull request #1385 from ONLYOFFICE/fix/pdf-font
Fix pdf font
2024-01-19 11:09:10 +03:00
0803b33067 Write PushButton 2024-01-18 18:37:54 +03:00
004fcbe7ba Merge remote-tracking branch 'origin/fix/bug65838' into release/v8.0.0 2024-01-18 17:49:51 +03:00
bbfdab9231 Fix bug #65838 2024-01-18 19:42:37 +05:00
14d9d2b01e fix bug #65829 2024-01-18 17:15:52 +03:00
7b6a706ca3 Merge remote-tracking branch 'origin/fix/bug65600' into release/v8.0.0 2024-01-18 13:17:36 +03:00
d593418616 Fix bug #65600 2024-01-18 01:12:15 +05:00
a160bc7ad1 Find dShiftY for pushbutton 2024-01-17 18:05:06 +03:00
f341dac2c3 Merge pull request #1384 from ONLYOFFICE/fix/Metafiles
Fix bugs in metafiles conversion
2024-01-17 15:52:36 +03:00
4041e5b31c Fix bug #65918 2024-01-17 13:52:58 +03:00
0774df72ca fix bug #65914 2024-01-17 13:43:10 +03:00
a3b0bb2294 Fix bug #65915 2024-01-16 23:13:40 +03:00
20a2424605 Fix WriteString method 2024-01-16 22:13:46 +03:00
a871295ad7 fix bug #65827 2024-01-16 18:28:49 +03:00
2cf11468d4 fix bug #65831 2024-01-16 18:12:04 +03:00
b59b2ba039 Merge pull request #1366 from ONLYOFFICE/feature/js-serialize-update
Added IsInit() function and more exceptions
2024-01-16 17:28:45 +03:00
950449b8de Merge pull request #1383 from ONLYOFFICE/feature/json-stringify
Add JSON_stringify
2024-01-16 17:24:21 +03:00
15ba22dc5c Implemented for V8 2024-01-16 18:16:22 +04:00
63b2b0b432 Merge pull request #1382 from ONLYOFFICE/release/v8.0.0
Release/v8.0.0
2024-01-16 16:22:09 +03:00
86eddff91d Add tests 2024-01-16 15:32:03 +04:00
c426474c50 Implement function 2024-01-16 15:31:40 +04:00
4fc9fc68e2 Merge pull request #1381 from ONLYOFFICE/fix/bug65853
Fix bug 65853
2024-01-16 12:46:06 +03:00
540fce9ab8 Fix bug 65853 2024-01-16 12:44:51 +03:00
505231291f Fix bug 65853 2024-01-16 12:42:34 +03:00
441e9276f4 Merge remote-tracking branch 'origin/fix/bug65779' into release/v8.0.0 2024-01-16 11:07:29 +03:00
9bbea65319 Merge remote-tracking branch 'origin/fix/bug65359' into release/v8.0.0 2024-01-16 10:59:43 +03:00
ba9d6b430a Fix bug 65862 2024-01-15 20:09:42 +03:00
95073fd590 Fix bug #65779 2024-01-15 20:05:28 +05:00
6bc58b973c Fix selection font for standard fonts 2024-01-15 17:26:35 +03:00
9da99f35b8 Fix duplicate for button font = DA font 2024-01-15 16:30:44 +03:00
d81efffbef Write m_sButtonFontName 2024-01-15 16:04:32 +03:00
650db9c31f Add run_path addon params 2024-01-14 22:07:49 +03:00
a22882af85 Merge remote-tracking branch 'origin/fix/bug65485' into release/v8.0.0 2024-01-13 15:26:17 +03:00
c5436f38fa Fix bug #65485 2024-01-13 15:13:34 +03:00
4064aba5fb Create SetButtonFont 2024-01-12 17:25:28 +03:00
88ea658a9c Merge pull request #1380 from ONLYOFFICE/fix/bug65392
Fix bug #65392 and other minor fixes
2024-01-12 16:12:15 +03:00
b263eab373 Fixed a bug with the minimum pen size in converting a metafile to svg 2024-01-12 16:10:55 +03:00
457332f5f4 Removing excess 2024-01-12 15:57:07 +03:00
f763e6bad5 Fixed bugs with image sizes when converting a metafile to svg 2024-01-12 15:49:37 +03:00
079814117c Fixed missing radial gradient color in metafile to svg conversion 2024-01-12 15:17:37 +03:00
69595f9211 Fix bug #65392 2024-01-11 18:18:27 +03:00
1a8ada7858 Merge pull request #1374 from ONLYOFFICE/fix/bug64722
Fix bug #64722
2024-01-11 17:24:39 +03:00
6d5d74de0c Write border for pushbutton AP 2024-01-11 17:24:00 +03:00
e42c3ac2d2 Merge pull request #1378 from ONLYOFFICE/fix/bug65687
Fix bug 65687
2024-01-11 15:44:25 +03:00
1633ad4ec7 Fix big files 2024-01-11 15:32:26 +03:00
81caee014c Fix bug 65687 2024-01-11 15:28:40 +03:00
57497bc14b Add caption to pushbutton AP 2024-01-11 14:30:09 +03:00
5663169473 Include stdexcept for windows 2024-01-11 14:57:02 +04:00
af04c2bac1 Added more exceptions 2024-01-11 14:57:02 +04:00
e4477c9926 Add IsInit() function 2024-01-11 14:57:02 +04:00
759d5e3ee9 Fix bug 65685 2024-01-11 13:56:45 +03:00
5d4f785cc1 Add support chunked resources in xps 2024-01-11 13:29:00 +03:00
1b04d28591 fix bug - read slide(AlternateContent) 2024-01-11 12:06:48 +03:00
5c251c1924 . 2024-01-10 18:56:19 +03:00
2ba62286d0 Create SetAP for pushbutton 2024-01-10 18:19:58 +03:00
28768e32af Fix bug #65359 2024-01-10 16:07:38 +05:00
48883ca955 Merge remote-tracking branch 'origin/fix/bug65600' into release/v8.0.0 2024-01-09 12:28:52 +03:00
87289a2bd8 Fix bug #65601 2024-01-07 04:19:35 +05:00
ceede2a1ad Convert hidden slides pptx to odp 2024-01-06 02:47:02 +05:00
96a826ff3f Merge pull request #1377 from ONLYOFFICE/fix/pdf-widget 2023-12-30 21:10:41 +03:00
8c2e8c3b0d Fix bug #65600 2023-12-29 18:40:38 +05:00
8d804aee3a Improved security when accessing an image file in svg 2023-12-29 14:22:29 +03:00
84bffd422b Fix Action for forms 2023-12-29 13:59:38 +03:00
9aeaa6931e Merge pull request #1376 from ONLYOFFICE/fix/pdf-widget
Fix/pdf widget
2023-12-29 12:37:16 +03:00
e23809622c Fix CheckBox value for AP 2023-12-29 11:24:19 +03:00
58d068a4dd Fix CheckBox/RadioButton form's switch value 2023-12-29 11:14:45 +03:00
75cf6858b6 Fix dShiftY for text in forms 2023-12-29 10:47:43 +03:00
c13b4cb209 Write combobox/listbox forms 2023-12-28 18:24:30 +03:00
b568f5a4e3 Merge pull request #1375 from ONLYOFFICE/fix/bug65621-xlsb
fix bug #65621
2023-12-28 16:58:37 +03:00
0288ee87bd fix bug #65621 2023-12-28 19:08:09 +06:00
7227630d5e Merge pull request #1373 from ONLYOFFICE/fix/bug65486
fix bug #65486
2023-12-28 13:22:29 +03:00
e8f9489f83 fix build 2023-12-28 13:16:51 +03:00
183744efc4 Merge pull request #1372 from ONLYOFFICE/fix/bug65284
Fix bug #65284
2023-12-28 12:17:23 +03:00
4751706525 Fix convert pdf => pdf 2023-12-27 21:09:23 +03:00
a311f6f73f Fix decoding a pict image from a color map 2023-12-27 19:38:29 +03:00
b949cf7c72 Merge pull request #1371 from ONLYOFFICE/fix/pdf-widget
Fix pdf widget
2023-12-27 18:42:54 +03:00
2c29a5a02f Fix pdf=>pdf convertation 2023-12-27 18:42:00 +03:00
4a2595ed7d Fix build 2023-12-27 18:11:47 +03:00
faf4273c2a Write Text Widget 2023-12-27 18:00:37 +03:00
41fc05cdbb Merge remote-tracking branch 'origin/fix/bug65359' into release/v8.0.0 2023-12-27 16:30:51 +03:00
794f10f42f Merge remote-tracking branch 'origin/fix/bug65366' into release/v8.0.0 2023-12-27 16:30:22 +03:00
8137e2bac1 Merge remote-tracking branch 'origin/fix/bug65691' into release/v8.0.0 2023-12-27 16:30:05 +03:00
0b79546f14 Merge branch 'fix/bug65691' of https://github.com/ONLYOFFICE/core into fix/bug65691 2023-12-27 17:50:50 +05:00
c1689caf7e Fix bug #65691 2023-12-27 17:49:54 +05:00
d907167da6 Fix bug #65366 2023-12-27 17:46:29 +05:00
8eb5a078d8 Fix bug #65284 2023-12-27 13:00:00 +03:00
a7173cfefe Fix download image for button icon's 2023-12-27 11:24:16 +03:00
59fcd227ea Create ChangePassword for pdf 2023-12-26 17:31:19 +03:00
f651c3286d Fix bug #65591 2023-12-26 17:23:10 +05:00
2cc1ff4843 Fix attribure name conversion 2023-12-26 17:22:54 +05:00
96929ac63a Write Underline border for forms 2023-12-26 11:21:03 +03:00
153f522a82 Merge pull request #1370 from ONLYOFFICE/fix/bug65620
Fix bug #65620
2023-12-25 19:52:01 +03:00
177de8c7f6 Write Beveled and Inset border for forms 2023-12-25 18:00:56 +03:00
a6bfc5ed2d Fix C and IC for Text/FreeText annots 2023-12-25 18:00:05 +03:00
e5eb83e53a Fix bug #65359 2023-12-25 18:36:24 +05:00
4b6044da56 Convert accel deccel attribures 2023-12-25 15:35:26 +05:00
2278c88d63 Add accelerate decelerate attributes 2023-12-25 15:34:33 +05:00
578a792fda fix bug #65259 2023-12-24 17:20:56 +03:00
b26d9ca0a1 Fixed a bug with missing gradient color in MetafileToSvg 2023-12-22 20:10:02 +03:00
e7dff77c8e Fix bug #65620 2023-12-22 20:04:27 +03:00
15c555ffa6 Try to find dBaseLine for Text Form 2023-12-22 17:56:21 +03:00
aa8e26f366 Fix swivel and bounce effects conversion 2023-12-22 17:53:14 +05:00
bd37046d7b Fix Grow & Turn entrance effect conversion 2023-12-22 17:25:33 +05:00
30757ef731 Fix wipe etrance effect conversion 2023-12-22 17:25:12 +05:00
cf4cc21e5f For bug 65620 2023-12-22 13:51:59 +03:00
84108b9617 Merge pull request #1369 from ONLYOFFICE/feature/pdf-widget
Fix getButtonIcons
2023-12-22 10:59:20 +03:00
ff12c4a4ba Return getButtonIcons only XObject image 2023-12-22 10:38:36 +03:00
752829d819 Create GetFontData for save widget 2023-12-22 09:52:04 +03:00
4c549a1f81 fix bug #65548 2023-12-21 20:41:46 +03:00
292fcf7e6f Merge remote-tracking branch 'origin/fix/bug65366' into release/v8.0.0 2023-12-21 17:37:33 +03:00
9e5c896098 Merge remote-tracking branch 'origin/fix/bug65360' into release/v8.0.0 2023-12-21 17:37:12 +03:00
600e59b356 Merge remote-tracking branch 'origin/fix/bug50186' into release/v8.0.0 2023-12-21 17:36:52 +03:00
af2c49b9c7 Merge pull request #1368 from ONLYOFFICE/fix/bug65636
Fix bug #65636
2023-12-21 17:14:17 +03:00
292f079872 Fix bug #50186 2023-12-21 19:13:54 +05:00
2b26449e5b Fix bug #65636 2023-12-21 17:11:02 +03:00
dfc9434174 Merge pull request #1367 from ONLYOFFICE/feature/pdf-widget
Fix pdf save forms
2023-12-21 16:36:38 +03:00
48c122a200 Add write I, array of V and fix Opt 2023-12-21 15:57:52 +03:00
631fce0c35 . 2023-12-21 12:57:13 +03:00
2007619d78 . 2023-12-21 12:34:23 +03:00
fee163957b . 2023-12-21 12:27:06 +03:00
5ef77d25a9 Merge remote-tracking branch 'origin/release/v8.0.0' into feature/pdf-widget 2023-12-21 10:13:31 +03:00
dc538180a4 for bug #65626 2023-12-20 23:20:36 +03:00
6e9f7fff71 Fix fonts, I and V 2023-12-20 18:10:41 +03:00
0f055f696f fix bug #65626 2023-12-20 16:56:52 +03:00
086fc272df fix bug #65566 2023-12-20 16:54:00 +03:00
58fb5b715c Fix x2t manifest 2023-12-20 11:24:39 +03:00
da2fd8f9b4 Create AP value 2023-12-19 18:07:03 +03:00
0cde91fed2 Fix bug #65360 2023-12-19 19:07:26 +05:00
77bd3703c6 Fix manifest file 2023-12-19 15:59:25 +03:00
503b9140e3 Fix bug #65366
Convert preset subtype
2023-12-19 17:33:11 +05:00
98dfe303ca fix bug #65483 2023-12-18 22:06:35 +03:00
8fc6368a05 Fix bug 63615 2023-12-18 21:22:25 +03:00
69a255a3f1 Fix build 2023-12-18 20:56:02 +03:00
1370043ce4 Merge branch 'release/v8.0.0' of https://github.com/ONLYOFFICE/core into release/v8.0.0 2023-12-18 20:05:37 +03:00
085337230a Fix build 2023-12-18 20:05:34 +03:00
14555839b5 Merge branch 'release/v8.0.0' of https://github.com/ONLYOFFICE/core into release/v8.0.0 2023-12-18 19:54:06 +03:00
8bb77f373d Create write caption for pushbutton 2023-12-18 17:37:15 +03:00
d1364c4b80 Merge pull request #1364 from ONLYOFFICE/feature/pdf-widget
Fix pdf font
2023-12-18 16:53:18 +03:00
8287f4c9ff Merge pull request #1363 from ONLYOFFICE/fix/SvgReader
Fix build
2023-12-18 15:59:33 +03:00
8243a284a1 Fix build 2023-12-18 15:57:59 +03:00
910a68765a Fix empty font and StemV from FontDescriptor 2023-12-18 15:54:11 +03:00
f599ad625f Merge pull request #1360 from ONLYOFFICE/fix/MetafileBugs
Fix metafile bugs
2023-12-18 15:27:07 +03:00
13236c4a81 For bug 65437. Add param --use-system-user-fonts to allfontsgen 2023-12-18 15:23:32 +03:00
186674d749 . 2023-12-18 13:06:38 +03:00
9d0f8ec414 . 2023-12-18 12:48:40 +03:00
75845fd471 . 2023-12-17 19:46:44 +03:00
f3836e86cb fix bug #65567 2023-12-17 15:06:57 +03:00
b83d5abbe0 remove download 2023-12-17 14:45:44 +03:00
288fb4d812 fix build 2023-12-17 14:33:02 +03:00
787f394ca8 fix bug #65566 2023-12-17 12:45:58 +03:00
2db233fa7b fix convert bin 2023-12-17 11:35:46 +03:00
ea6f4a7295 fix build 2023-12-16 19:19:36 +03:00
e5370989dd del unused 2023-12-15 18:18:19 +03:00
940af313fd for bug #65061 2023-12-15 18:03:50 +03:00
ce8effaaa1 Merge remote-tracking branch 'origin/fix/bug65359' into release/v8.0.0 2023-12-15 17:19:31 +03:00
fce70b0c0c Merge remote-tracking branch 'origin/fix/bug65362' into release/v8.0.0 2023-12-15 17:15:56 +03:00
423411b679 Merge remote-tracking branch 'origin/fix/bug65503' into release/v8.0.0 2023-12-15 17:14:54 +03:00
eb95a37dfe Fix bug #65503 2023-12-15 17:54:58 +05:00
492f2d3dc0 Merge pull request #1361 from ONLYOFFICE/fix/bug58972
Fix bug 58972
2023-12-15 15:52:17 +03:00
aa9bbbaa62 Add Named action for Link annots, fix CropBox 2023-12-15 15:26:24 +03:00
a50c8701f4 Merge branch 'release/v8.0.0' into fix/MetafileBugs 2023-12-15 13:23:44 +03:00
244061bbb7 Fixed a bug with extra spaces 2023-12-15 13:17:44 +03:00
62fc4066fd Merge pull request #1359 from ONLYOFFICE/fix/pdf-fonts
Fix GetFontBinary and build
2023-12-15 12:21:16 +03:00
75c855a1d0 . 2023-12-15 12:11:10 +03:00
8e38736cf5 for bug #65516 2023-12-15 12:05:20 +03:00
607d32e32b Fix bug #65362 2023-12-15 14:01:10 +05:00
67ca3c57b8 Fix GetFontBinary and build 2023-12-15 11:46:55 +03:00
9908c9e507 fix bug #65516 2023-12-14 19:58:16 +03:00
2869ef8ab6 fix bug #65485 2023-12-14 19:11:56 +03:00
3aa91fcfd4 Fix bug #65241 and other fixes 2023-12-14 18:54:39 +03:00
f8c664daef Fix smil attribute name conversion 2023-12-14 20:34:22 +05:00
63f6190da8 Fix pptx transition conversion 2023-12-14 20:28:40 +05:00
a2aeb83fa8 fix bug #65523 2023-12-14 17:46:39 +03:00
ed65322e03 Merge pull request #1358 from ONLYOFFICE/feature/pdf-widget
Write pdf widget text and button
2023-12-14 17:27:10 +03:00
5c52d72932 Fix duration serialization 2023-12-14 17:44:56 +05:00
e3eb812659 fix bug #65528 2023-12-14 14:42:42 +03:00
a096d0787f Clear comments 2023-12-14 14:37:18 +03:00
e6496a34a8 Merge remote-tracking branch 'origin/release/v8.0.0' into feature/pdf-widget 2023-12-14 13:49:23 +03:00
d933472b53 Fix unique XObject name 2023-12-14 13:48:49 +03:00
ef664af175 fix bug #65522 2023-12-14 12:52:30 +03:00
2f2578dacd Write pushbutton widget to pdf 2023-12-14 11:56:39 +03:00
951ebdc479 Add support builder variables before open 2023-12-14 10:30:44 +03:00
06dba97bf1 Fix documentation for jsValue 2023-12-13 19:06:37 +03:00
bbddaf0bb7 [android] Update dependencies. Remove support api 23-25 2023-12-13 13:37:53 +03:00
07e43a64e6 Fix build 2023-12-13 10:51:35 +03:00
4cdc234418 for bug #46216 2023-12-12 20:37:53 +03:00
a651f3a29d fix bug #46216 2023-12-12 20:03:04 +03:00
e2759153dc Fix JS 2023-12-12 17:36:15 +03:00
9ce4444aa7 Merge pull request #1357 from ONLYOFFICE/fix/pdf-fonts
Fix JS
2023-12-12 17:31:46 +03:00
20c56559d9 Fix JS 2023-12-12 17:30:34 +03:00
02cce6ff1b Write PushButton widget to pdf 2023-12-12 16:45:19 +03:00
018ddb1540 Added dependency of the permission for embedded metafiles on the parent metafile 2023-12-12 15:11:35 +03:00
7c46dc9d3b Fix bug #65392 2023-12-12 15:09:08 +03:00
e93f270621 . 2023-12-12 14:51:19 +03:00
228feb9487 fix custom shape 2023-12-12 14:35:52 +03:00
b05c240439 Fix indents 2023-12-12 14:10:27 +03:00
470f64ca41 Merge pull request #1355 from ONLYOFFICE/fix/AlphaMask
Changing the working principle of the alpha mask
2023-12-12 14:00:44 +03:00
864b9c3da6 Add missed file 2023-12-12 13:58:50 +03:00
89059d71bd Move blend functions from library header 2023-12-12 13:55:40 +03:00
ae58e99e04 fix build 2023-12-11 19:00:45 +03:00
ac711129e3 Test radiobutton и checkbox annots 2023-12-11 18:07:13 +03:00
ad51957b5e Fix bug #65359 2023-12-11 19:33:52 +05:00
36c2e3dd22 . 2023-12-11 14:42:13 +03:00
d9637f12e1 fix build 2023-12-11 13:23:33 +03:00
bba7826ba3 Merge remote-tracking branch 'origin/fix/bug50186' into release/v8.0.0 2023-12-11 12:45:59 +03:00
83ba8e890f Merge remote-tracking branch 'origin/fix/bug65399' into release/v8.0.0 2023-12-11 12:45:44 +03:00
99d72986d8 Merge remote-tracking branch 'origin/release/v8.0.0' into feature/pdf-widget
# Conflicts:
#	DesktopEditor/graphics/pro/js/wasm/src/drawingfile_test.cpp
#	PdfFile/SrcReader/PdfAnnot.cpp
#	PdfFile/SrcReader/RendererOutputDev.cpp
2023-12-11 12:04:46 +03:00
462bd9f302 Merge pull request #1356 from ONLYOFFICE/feature/serialize-js
Removed virtual functions from json functionality
2023-12-11 10:19:28 +03:00
3042dc08cc Make IValue desctructor non-virtual 2023-12-11 11:14:21 +04:00
3cb014edd9 Merge pull request #1353 from ONLYOFFICE/feature/pdf-fonts
Get widget's Embedded, Standard and All fonts
2023-12-09 14:24:48 +03:00
4efc453cc4 Refactoring drawing base module 2023-12-09 14:24:10 +03:00
61e5896830 Fix bug #65399 2023-12-09 00:57:22 +05:00
032b61f532 Fix bug #65284 2023-12-07 20:16:00 +03:00
07be7f5de4 for bug #65355 2023-12-07 18:25:34 +03:00
bfa6a6d826 Fix bug #50186 2023-12-07 20:12:46 +05:00
285cbdc9c5 Fix GetWidgetFonts for Info 2023-12-07 12:18:11 +03:00
72cc8a1566 Minor improvements 2023-12-07 12:16:18 +03:00
5deee7049f Fix RD field 2023-12-07 10:25:58 +03:00
22943e61bc Add GetFontByParams 2023-12-06 18:51:18 +03:00
f5ff9b5b9b Merge pull request #1354 from ONLYOFFICE/feature/graphics-pict
Feature/graphics pict
2023-12-06 18:42:11 +03:00
78d50a329a Merge remote-tracking branch 'origin/release/v8.0.0' into develop 2023-12-06 18:40:42 +03:00
5fe5efb001 fix bug #59795 2023-12-06 18:23:33 +03:00
87f0b9cb05 fix bug #53908 2023-12-06 16:21:11 +03:00
3537f9edfa Get widget's Embedded, Standard and All fonts 2023-12-06 15:46:08 +03:00
1709ef0c08 For bug #50186 2023-12-06 15:51:33 +05:00
f62859046e Fix bug 2023-12-05 21:22:29 +03:00
5b93fb7fe3 fix bug #61791 2023-12-05 21:01:39 +03:00
848204d7d0 fix bug #65151 2023-12-05 18:41:53 +03:00
2896e00e0f Create BlendMode for pdf ap 2023-12-05 18:31:48 +03:00
63e16a4967 Merge branch 'release/v8.0.0' into feature/AddOoxmlTests 2023-12-05 13:25:43 +06:00
1e43922247 Fix bug in blending 2023-12-04 19:44:19 +03:00
a0d3d402a3 Redesigned work with the alpha mask 2023-12-04 19:37:38 +03:00
09ab798f0d Merge pull request #1351 from ONLYOFFICE/fix/bug38048
Fix bug #38048
2023-12-04 17:40:55 +03:00
4497e59602 Fix build 2023-12-04 17:39:46 +03:00
b7627222d3 Fix bug #38048 2023-12-04 17:07:54 +03:00
3f020f9e16 Create SetAP for CButtonWidget 2023-12-04 16:35:30 +03:00
b0257d138f Merge pull request #1341 from ONLYOFFICE/fix/pdf-widget
Add getInteractiveFormsFonts and getFontByID for drawingfile
2023-12-04 10:12:52 +03:00
54efbc22fc Fix indents 2023-12-03 22:04:47 +03:00
1a47ad9c31 fix bug #65352 2023-12-03 14:08:13 +03:00
27dcc07cee Merge pull request #1342 from ONLYOFFICE/feature/GraphicsLayers
Feature/graphics layers
2023-12-01 22:27:01 +03:00
69305816f7 Merge pull request #1350 from ONLYOFFICE/feature/serialize-js
JSC: Automatic Dispose for CJSContext on destruction
2023-12-01 21:30:31 +03:00
7ca14893b9 JSC: Added Dispose() to ~CJSContext() 2023-12-01 18:38:22 +04:00
ccfaa64cc1 fix bug #65340 2023-12-01 16:48:52 +03:00
365f73df56 Merge branch 'release/v7.6.0' into develop 2023-12-01 16:14:41 +03:00
a1f149945c Merge remote-tracking branch 'origin/fix/bug65311' into release/v7.6.0 2023-12-01 16:13:43 +03:00
2c3ebd218e fix bug #65309 2023-12-01 16:13:34 +03:00
6da3453104 Merge pull request #1348 from ONLYOFFICE/fix/bug19081
Fix bug #19081
2023-12-01 10:31:50 +03:00
7e9c6bd266 Merge pull request #1347 from ONLYOFFICE/feature/serialize-js
Feature/serialize js
2023-11-30 18:21:03 +03:00
a432af9b7e Fix indents 2023-11-30 18:17:35 +03:00
766c4b61a1 Added test: serialization usage with script 2023-11-30 19:10:57 +04:00
372ae97780 Fix bug #65311 2023-11-30 20:02:29 +05:00
5b1dea7a19 fix bug #65265 2023-11-30 17:27:02 +03:00
4871e28398 Fix getInt to getNum 2023-11-30 17:15:21 +03:00
3a69bf7b3a Fix bug #19081 2023-11-30 17:13:28 +03:00
7373566cd5 Fix indents 2023-11-30 17:06:13 +03:00
c1c15d067a Remove theme from test params file 2023-11-30 16:54:45 +06:00
22e0772cdb move tests to ooxml 2023-11-30 16:32:53 +06:00
61d75ed092 revert test 2023-11-30 10:38:21 +03:00
8550cec836 Fix EditWidgets 2023-11-30 10:27:22 +03:00
f82b8ad14f Merge pull request #1345 from ONLYOFFICE/fix/pdf-build
Fix build
2023-11-30 10:01:14 +03:00
0258c03400 Fix build 2023-11-30 09:46:52 +03:00
cb7247a3cd Merge remote-tracking branch 'origin/release/v7.6.0' into develop 2023-11-29 19:40:01 +03:00
8dab6c0b7a Merge remote-tracking branch 'origin/feature/AddX2tTests' into release/v7.6.0 2023-11-29 19:39:12 +03:00
0cf46a4ca5 fix bug #65292 2023-11-29 19:37:06 +03:00
610b0b0831 JSC: fixed json tests 2023-11-29 20:13:07 +04:00
8ad3170a26 JSC: fixed createString() functions 2023-11-29 20:12:49 +04:00
9c5e02de53 Fix bug 65301 2023-11-29 19:00:44 +03:00
6678012307 Fix write CO, Add read FileAttachment 2023-11-29 17:36:59 +03:00
97c314e379 All tests were added. Small serialization rework.
- Code coverage: 100%
- Restructured serialization code to handle primitives first
2023-11-29 14:22:51 +04:00
765cf636d4 Remove unused files 2023-11-29 16:20:34 +06:00
e29016e803 Add tests for simple2.xlsx 2023-11-29 15:53:24 +06:00
f892a000ff Add second test file 2023-11-29 15:53:13 +06:00
a18c2c1d4c Add test to qmake project 2023-11-29 15:52:50 +06:00
a2b75cabf0 Update common files 2023-11-29 15:52:23 +06:00
8a511c45bd Add tests for simple file 2023-11-29 15:52:06 +06:00
a3f414bb3a Change simple1 file 2023-11-29 15:51:10 +06:00
be7a51989d Add content types test 2023-11-29 15:50:49 +06:00
15b4eee571 Add xlsb2xlsx files test preparation 2023-11-29 15:50:15 +06:00
02fbbc6ce5 Fix test common files 2023-11-29 15:49:59 +06:00
ca885745f2 Add x2t test projects 2023-11-29 15:49:26 +06:00
e50d21e9ea fix bug #65257 2023-11-28 20:34:40 +03:00
b4dd7230ca fix bug #65190 2023-11-28 19:04:42 +03:00
0ce7733113 Fix the shaping of a rtl text 2023-11-28 18:21:17 +03:00
411495ee0d Fix align and font for text widget 2023-11-28 18:03:38 +03:00
0ec39e3d32 Write widget's parent 2023-11-28 16:04:04 +03:00
8d7692d6f2 Add FontStyle for widgets 2023-11-28 14:58:58 +03:00
2895e27c32 Made code coverage 100% for CValue & CValueRef 2023-11-28 15:19:51 +04:00
a5351fbf12 . 2023-11-28 14:15:39 +03:00
d75c7c93f0 Optimization 2023-11-28 13:47:02 +03:00
9366c7e2a3 Refactoring 2023-11-28 13:32:50 +03:00
565bab2d4d Remove warnings 2023-11-28 13:21:51 +03:00
230fe73eb4 Fix DecodeHeader() and DestroyImage() 2023-11-28 12:50:06 +03:00
d84f8b3146 fix bug #65265 2023-11-28 11:43:38 +03:00
36677119e8 Merge pull request #1343 from ONLYOFFICE/feature/refactoringX2tConverter
Feature/refactoring x2t converter
2023-11-28 10:40:25 +03:00
dd07e9d868 Small fix 2023-11-28 10:38:44 +03:00
5807ffa45a Fix bugs with oformpdf format 2023-11-28 00:43:39 +03:00
c002de1ad3 Fix build 2023-11-27 23:40:56 +03:00
94c4e22b8e Add oform_pdf format 2023-11-27 23:38:06 +03:00
01776552f5 fix bug #65260 2023-11-27 23:17:54 +03:00
3e5eb3d251 Added tests to basic CValue functionality 2023-11-27 21:29:56 +04:00
b4ddfac5ed Refactoring 2023-11-27 18:49:31 +03:00
d50451739c Create FileAttachment annot 2023-11-27 18:19:32 +03:00
bb3de819cd Added the use of multi-layer rendering in Svg reader 2023-11-27 17:22:07 +03:00
1eeaea8c34 Refactoring 2023-11-27 17:21:14 +03:00
2d9206b79b Changed some places where set() were used 2023-11-27 18:05:53 +04:00
f6e126026a Changed set()-s and add() for JSC 2023-11-27 17:55:57 +04:00
14962ccaef set()-s and add() now take JSSmart<CJSValue> 2023-11-27 17:44:16 +04:00
282e1fe025 Refactoring 2023-11-27 14:45:48 +03:00
f633fad046 [Test] Add macro to parse excel dates format 2023-11-26 11:27:51 +03:00
3a73292e81 Refactoring 2023-11-24 18:43:25 +03:00
f024c9fb8f DashPattern for border Text Widget 2023-11-24 17:34:38 +03:00
a096559e29 Changed the order of comparison in toJS() 2023-11-24 17:07:09 +04:00
fdaf8e6c6b Fixed fromJS() 2023-11-24 16:23:16 +04:00
6ebdc0f530 Remove duplicated code 2023-11-23 22:39:26 +03:00
b0dfb4c731 Added allocator and deallocator for typed arrays 2023-11-23 19:13:03 +04:00
254e5168af Added a test example of using graphics layers 2023-11-23 16:32:46 +03:00
fe6590366d Added implementation of graphic layers 2023-11-23 16:32:27 +03:00
86d5b5920f Test write TextWidget 2023-11-23 15:49:39 +03:00
f7af725d77 [Test] Add macro to parse excel dates format 2023-11-23 15:32:47 +03:00
3ae6927ac3 Reworked CValue, added CValueRef 2023-11-23 16:25:21 +04:00
4988c1853e Refactoring 2023-11-22 21:49:13 +03:00
6588e1d80b Fix changes 2023-11-22 17:26:04 +03:00
07c9efd29f Fix changes 2023-11-22 17:24:19 +03:00
2fba8eb6d7 Merge branch 'release/v7.6.0' into develop 2023-11-22 17:16:27 +03:00
7f9164ddb2 Fix 2023-11-22 16:32:23 +03:00
0c28276753 Create getInteractiveFormsFonts and getFontByID 2023-11-22 16:20:46 +03:00
44ef271b92 Release GetWidgetFonts 2023-11-22 11:58:19 +03:00
68cfa314b6 Add PictDecoder to BgraFrame 2023-11-21 18:43:22 +03:00
9eee80b43e Merge remote-tracking branch 'origin/release/v7.6.0' into fix/pdf-widget 2023-11-21 18:27:20 +03:00
49d3e46a0f Create GetWidgetFonts 2023-11-21 18:25:32 +03:00
bcea33ed19 Implemented reference mechanism for CValue 2023-11-21 16:53:48 +04:00
a8f9ff175e Create StartAP, AddLineToAP, EndAP 2023-11-20 17:56:17 +03:00
6301240a92 fix PICTDecoder 2023-11-20 11:55:23 +03:00
f6c0ffc644 CValue major rework 2023-11-18 00:56:32 +04:00
d646876347 V8: Exclude undefined properties from result 2023-11-17 13:52:24 +04:00
84c34eed65 Fixes
+ Fixed build for mac
+ Removed undefined properties from tests
2023-11-17 13:52:24 +04:00
c23eece6ae JSC: Implemented CJSObject::getPropertyNames() 2023-11-17 13:52:24 +04:00
31f52731f6 Added tests for CJSObject::getPropertyNames() 2023-11-17 13:52:24 +04:00
59806039ed V8: Implemented CJSObject::getPropertyNames() 2023-11-17 13:52:24 +04:00
7eebede9a6 Tests rearrangement 2023-11-17 13:52:24 +04:00
eecc623723 Add some new functionality
+ Getters for CValue
+ Reworked CObject
+ Partly functioning fromJS() function
+ Changed test example
2023-11-17 13:52:24 +04:00
85f86c2de6 Added typed arrays 2023-11-17 13:52:24 +04:00
62f5b03bb4 Added arrays 2023-11-17 13:52:24 +04:00
eecd983377 Rewrited toJS() as a static function 2023-11-17 13:52:24 +04:00
6bafc84285 Made destructors virtual 2023-11-17 13:52:24 +04:00
a4ac108c7c Some minor improvements 2023-11-17 13:52:23 +04:00
20e782bf5b Test example improvements 2023-11-17 13:52:23 +04:00
dddd37af12 Refactoring: added base class 2023-11-17 13:52:23 +04:00
87d9ad5b88 Basic functionality 2023-11-17 13:52:23 +04:00
1ab39932c4 fix bug #65109 2023-11-15 13:23:48 +03:00
8213524b6b DecodePICT project 2023-11-14 16:43:08 +03:00
501419523d Refactoring 2023-11-14 11:24:17 +03:00
caa50dbc47 Fix bug #45384 2023-11-13 19:47:22 +03:00
6fcd76a469 Refactoring 2023-11-10 12:23:27 +03:00
50a83e819f Merge branch hotfix/v7.5.1 into master 2023-11-08 12:05:57 +00:00
aa5af32b27 Fix bug #52825 2023-11-02 17:49:24 +03:00
954f3d5471 Merge branch hotfix/v7.5.1 into master 2023-10-31 14:41:39 +00:00
4c94c647cc Added a restriction on the use of the file system 2023-10-31 11:41:12 +03:00
284c5836e2 Fix bug #64722 2023-10-24 12:10:20 +03:00
465 changed files with 34075 additions and 13965 deletions

162
.github/workflows/codeql.yaml vendored Normal file
View File

@ -0,0 +1,162 @@
name: "CodeQL Scanner"
on:
push:
branches:
- 'master'
- 'release/**'
- 'hotfix/**'
paths-ignore:
- '**/README.md'
- '**/LICENSE'
- '.github/**'
#pull_request:
# branches:
# - 'master'
# - 'release/**'
# - 'hotfix/**'
schedule:
- cron: '00 19 * * 5'
# This job take a lot of time, so if the number of worker
# processes from one branch or one PR exceeds 1, all previous
# running processes will be automatically canceled to avoid the accumulation
# of a large number of concurrent workers
concurrency:
group: codeql-${{ github.event.pull_request.number || github.ref_name }}
cancel-in-progress: true
env:
SOURCE_ROOT: "/build/core"
jobs:
analyze:
name: Analyze
runs-on: ${{ 'ubuntu-latest' }}
container:
image: ${{ matrix.image }}
options: --privileged
volumes:
- /usr/local/lib:/foovolume/android
- /usr/local/share:/foovolume/boost
- /usr/share:/foovolume/dotnet
- /opt:/foovolume/opt
- /opt/hostedtoolcache:/foovolume/tool
timeout-minutes: ${{ (matrix.language == 'swift' && 120) || 360 }}
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'c-cpp' ]
image: ["ubuntu:20.04"]
# CodeQL supports [ 'c-cpp', 'csharp', 'go', 'java-kotlin', 'javascript-typescript', 'python', 'ruby', 'swift' ]
# Use only 'java-kotlin' to analyze code written in Java, Kotlin or both
# Use only 'javascript-typescript' to analyze code written in JavaScript, TypeScript or both
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
steps:
- uses: actions/setup-node@v4
with:
node-version: 20
- name: make free space in container
run: |
rm -rf /foovolume/android/android
rm -rf /foovolume/dotnet/dotnet
rm -rf /foovolume/boost/boost
rm -rf /foovolume/opt/ghc
rm -rf /foovolume/tool/*
df -h
# Prepare container environment
# Install some deps
# Set cache restore keys
- name: Prepare environment
id: prepare
shell: bash
env:
TZ: Etc/UTC
run: |
pwd
ls -la
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime
echo $TZ > /etc/timezone
apt-get update
apt-get install -y python3 python2 sudo curl jq git
apt-get install -y python || true
rm /usr/bin/python || true
ln -s /usr/bin/python2 /usr/bin/python
mkdir -p /build
git clone --depth 1 \
--single-branch \
--branch ${{ github.base_ref || github.ref_name }} https://github.com/ONLYOFFICE/core.git ${SOURCE_ROOT}
git clone --depth 1 \
--single-branch \
--branch ${{ github.base_ref || github.ref_name }} https://github.com/ONLYOFFICE/build_tools.git /build/build_tools
echo "party-key=$(curl -L -H "Accept: application/vnd.github+json" \
-H "X-GitHub-Api-Version: 2022-11-28" \
"https://api.github.com/repos/ONLYOFFICE/core/commits?per_page=1&path=/Common/3dParty&sha=${{ github.base_ref || github.ref_name }}" | \
jq -r '.[].sha')" >> "$GITHUB_OUTPUT"
echo "qt-key=$(cat /build/build_tools/tools/linux/automate.py | egrep -m1 -o "qt_source_([0-9])?.([0-9])?.([0-9])?")" >> "$GITHUB_OUTPUT"
# Restore 3dParty from cache if cache key is match
- uses: actions/cache/restore@v3
id: restore-3d
with:
path: /build/core/Common/3dParty
key: 3dParty-${{ steps.prepare.outputs.party-key }}
# Restore qt tool from cache if cache key is match
- uses: actions/cache/restore@v3
id: restore-qt
with:
path: /build/build_tools/tools/linux/qt_build
key: qt-${{ steps.prepare.outputs.qt-key }}
# NOTE:
# init codeql with custom source-root dir
# because sources code was checkout with git from cli
# NOT with checkout action
# Also. Init and scan with codeql only if all cache hit
# otherwise will no initialization, just build and cache depends
- name: Initialize CodeQL
if: >
steps.restore-3d.outputs.cache-hit == 'true'
&& steps.restore-qt.outputs.cache-hit == 'true'
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
source-root: ${{ env.SOURCE_ROOT }}
- name: build
shell: bash
run: |
cd /build/build_tools/tools/linux
python3 ./automate.py core
- name: Perform CodeQL Analysis
if: >
steps.restore-3d.outputs.cache-hit == 'true'
&& steps.restore-qt.outputs.cache-hit == 'true'
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{matrix.language}}"
# Make new 3dParty cache if restore action do not restore any cache
- uses: actions/cache/save@v3
if: steps.restore-3d.outputs.cache-hit != 'true'
id: save-3d
with:
path: /build/core/Common/3dParty
key: 3dParty-${{ steps.prepare.outputs.party-key }}
# Make new qt tool cache if restore action do not restore any cache
- uses: actions/cache/save@v3
if: steps.restore-qt.outputs.cache-hit != 'true'
id: save-qt
with:
path: /build/build_tools/tools/linux/qt_build
key: qt-${{ steps.prepare.outputs.qt-key }}

View File

@ -460,9 +460,6 @@ namespace NSCSS
{
sValue += *iWord;
if (L' ' == sValue.front())
sValue.erase(0, 1);
if (!sValue.empty() && ((*iWord).back() == L';' || iWord == (arWords.end() - 1)))
{
if (sValue.back() == L';')
@ -470,6 +467,10 @@ namespace NSCSS
std::transform(sProperty.begin(), sProperty.end(), sProperty.begin(), tolower);
std::transform(sValue.begin(), sValue.end(), sValue.begin(), tolower);
NS_STATIC_FUNCTIONS::RemoveSpaces(sProperty);
NS_STATIC_FUNCTIONS::RemoveSpaces(sValue);
AddPropSel(sProperty, sValue, unLevel, bHardMode);
sProperty.clear();
sValue.clear();

View File

@ -100,7 +100,8 @@ namespace NS_STATIC_FUNCTIONS
unEnd = wsLine.find_first_of(wsDelimiters, unStart);
}
arWords.emplace_back(wsLine.data() + unStart);
if (std::wstring::npos != unStart)
arWords.emplace_back(wsLine.data() + unStart);
return arWords;
}
@ -169,13 +170,27 @@ namespace NS_STATIC_FUNCTIONS
return mRules;
}
std::wstring RemoveSpaces(std::wstring &wsString)
void RemoveSpaces(std::wstring &wsString)
{
std::wstring::const_iterator ciStart = std::find_if_not(wsString.begin(), wsString.end(), std::iswspace);
if (ciStart == wsString.end())
return L"";
return wsString.clear();
std::wstring::const_reverse_iterator criEnd = std::find_if_not(wsString.rbegin(),wsString.rend(), std::iswspace);
return std::wstring(ciStart, criEnd.base());
wsString = std::wstring(ciStart, criEnd.base());
}
double CalculatePersentage(const std::wstring &wsValue, double dRelativeValue)
{
double dValue = ReadDouble(wsValue);
if (std::wstring::npos != wsValue.find(L'%'))
return dValue / 100. * dRelativeValue;
return dValue;
}
}
}

View File

@ -24,7 +24,9 @@ namespace NSCSS
std::vector<unsigned short int> GetWeightSelector(const std::wstring& sSelector);
std::map<std::wstring, std::wstring> GetRules(const std::wstring& wsStyles);
std::wstring RemoveSpaces(std::wstring& wsString);
void RemoveSpaces(std::wstring& wsString);
double CalculatePersentage(const std::wstring& wsValue, double dRelativeValue);
}
#define SWITCH(str) switch(SWITCH_CASE::str_hash_for_switch(str))

View File

@ -3,6 +3,7 @@
#include "StaticFunctions.h"
#include "ConstValues.h"
#include <cfloat>
#include <cmath>
#include <wchar.h>
namespace NSCSS
@ -156,7 +157,7 @@ namespace NSCSS
}
CDigit::CDigit()
: CValue(DBL_MIN, 0, false), m_enUnitMeasure(None)
: CValue(DBL_MAX, 0, false), m_enUnitMeasure(None)
{}
CDigit::CDigit(double dValue)
@ -169,17 +170,17 @@ namespace NSCSS
bool CDigit::Empty() const
{
return DBL_MIN == m_oValue;
return DBL_MAX == m_oValue;
}
bool CDigit::Zero() const
{
return (std::abs(m_oValue) <= DBL_EPSILON);
return (std::abs(0 - m_oValue) <= DBL_EPSILON);
}
void CDigit::Clear()
{
m_oValue = DBL_MIN;
m_oValue = DBL_MAX;
}
void CDigit::ConvertTo(UnitMeasure enUnitMeasure, double dPrevValue)
@ -190,7 +191,7 @@ namespace NSCSS
int CDigit::ToInt() const
{
if (DBL_MIN == m_oValue)
if (DBL_MAX == m_oValue)
return 0;
return static_cast<int>(m_oValue + 0.5);
@ -198,7 +199,7 @@ namespace NSCSS
double CDigit::ToDouble() const
{
if (DBL_MIN == m_oValue)
if (DBL_MAX == m_oValue)
return 0.;
return m_oValue;
@ -206,7 +207,7 @@ namespace NSCSS
std::wstring CDigit::ToWString() const
{
if (DBL_MIN == m_oValue)
if (DBL_MAX == m_oValue)
return std::wstring();
return std::to_wstring(m_oValue);
@ -214,7 +215,7 @@ namespace NSCSS
int CDigit::ToInt(UnitMeasure enUnitMeasure, double dPrevValue) const
{
if (DBL_MIN == m_oValue)
if (DBL_MAX == m_oValue)
return 0;
return static_cast<int>(ConvertValue(dPrevValue, enUnitMeasure) + 0.5);
@ -222,7 +223,7 @@ namespace NSCSS
double CDigit::ToDouble(UnitMeasure enUnitMeasure, double dPrevValue) const
{
if (DBL_MIN == m_oValue)
if (DBL_MAX == m_oValue)
return 0;
return ConvertValue(dPrevValue, enUnitMeasure);
@ -230,8 +231,8 @@ namespace NSCSS
std::wstring CDigit::ToWString(UnitMeasure enUnitMeasure, double dPrevValue) const
{
if (DBL_MIN == m_oValue)
return 0;
if (DBL_MAX == m_oValue)
return std::wstring();
return std::to_wstring(ConvertValue(dPrevValue, enUnitMeasure));
}
@ -306,7 +307,7 @@ namespace NSCSS
CDigit &CDigit::operator+=(const CDigit &oDigit)
{
if (m_unLevel > oDigit.m_unLevel || (m_bImportant && !oDigit.m_bImportant) || DBL_MIN == oDigit.m_oValue)
if (m_unLevel > oDigit.m_unLevel || (m_bImportant && !oDigit.m_bImportant) || DBL_MAX == oDigit.m_oValue)
return *this;
m_oValue += oDigit.ToDouble(m_enUnitMeasure);
@ -364,7 +365,7 @@ namespace NSCSS
if (!CUnitMeasureConverter::GetValue(wsValue, dNewValue, enNewUnitMeasure))
return false;
if (Percent == enNewUnitMeasure && !Empty() && unLevel > m_unLevel)
if (Percent == enNewUnitMeasure && !Empty() && (unLevel > m_unLevel || bHardMode))
{
m_oValue *= dNewValue / 100.;
}
@ -438,6 +439,14 @@ namespace NSCSS
return wsCopyValue.substr(unBegin + 2, wsCopyValue.find(L')') - unBegin - 2);
}
void CColor::SetEmpty(unsigned int unLevel)
{
m_oValue.Clear();
m_oValue.m_enType = ColorEmpty;
m_unLevel = unLevel;
m_bImportant = false;
}
CColor::CColor()
: CValue({}, 0, false), m_oOpacity(1.)
@ -450,11 +459,8 @@ namespace NSCSS
if (wsValue.empty())
{
m_oValue.Clear();
m_oValue.m_enType = ColorEmpty;
m_unLevel = unLevel;
m_bImportant = false;
return true;
SetEmpty(unLevel);
return false;
}
std::wstring wsNewValue(wsValue);
@ -494,14 +500,26 @@ namespace NSCSS
if (std::wstring::npos == unEnd)
return false;
std::vector<std::wstring> arValues = NS_STATIC_FUNCTIONS::GetWordsW(wsNewValue.substr(4, unEnd - 3), false, L" (),");
std::vector<std::wstring> arValues = NS_STATIC_FUNCTIONS::GetWordsW(wsNewValue.substr(4, unEnd - 4), false, L" (),");
if (3 > arValues.size())
return false;
m_oValue.SetRGB(NS_STATIC_FUNCTIONS::ReadDouble(arValues[0]),
NS_STATIC_FUNCTIONS::ReadDouble(arValues[1]),
NS_STATIC_FUNCTIONS::ReadDouble(arValues[2]));
INT nRed = std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[0], 255));
INT nGreen = std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[1], 255));
INT nBlue = std::ceil(NS_STATIC_FUNCTIONS::CalculatePersentage(arValues[2], 255));
if (nRed < 0 || nGreen < 0 || nBlue < 0)
{
SetEmpty(unLevel);
return false;
}
if (255 < nRed) nRed = 255;
if (255 < nGreen) nGreen = 255;
if (255 < nBlue) nBlue = 255;
m_oValue.SetRGB(nRed, nGreen, nBlue);
if (wsNewValue.substr(0, 4) == L"rgba" && 4 == arValues.size())
m_oOpacity.SetValue(arValues[3], unLevel, bHardMode);
@ -560,6 +578,9 @@ namespace NSCSS
double CColor::GetOpacity() const
{
if (m_oOpacity.Empty())
return 1.;
if (Percent == m_oOpacity.GetUnitMeasure())
return m_oOpacity.ToDouble() / 100.;
@ -2066,7 +2087,9 @@ namespace NSCSS
if ((*iWord).empty())
continue;
return m_oFamily.SetValue(NSCSS::NS_STATIC_FUNCTIONS::RemoveSpaces(*iWord), unLevel, bHardMode);
NSCSS::NS_STATIC_FUNCTIONS::RemoveSpaces(*iWord);
return m_oFamily.SetValue(*iWord, unLevel, bHardMode);
}
return false;

View File

@ -212,6 +212,7 @@ namespace NSCSS
static TRGB ConvertHEXtoRGB(const std::wstring& wsValue);
static std::wstring ConvertRGBtoHEX(const TRGB& oValue);
static std::wstring CutURL(const std::wstring& wsValue);
void SetEmpty(unsigned int unLevel = 0);
public:
CColor();

View File

@ -34,6 +34,7 @@
#include "../../../../DesktopEditor/common/File.h"
#include "../../../../DesktopEditor/graphics/BaseThread.h"
#include "../include/FileTransporter.h"
#include "../../../../DesktopEditor/common/ProcessEnv.h"
namespace NSNetwork
{
@ -240,13 +241,25 @@ namespace NSNetwork
{
m_pInternal->m_bComplete = false;
bool bIsCanUseNetwork = true;
if (NSProcessEnv::IsPresent(NSProcessEnv::Converter::gc_allowNetworkRequest))
bIsCanUseNetwork = NSProcessEnv::GetBoolValue(NSProcessEnv::Converter::gc_allowNetworkRequest);
int hrResultAll = 0;
if(m_pInternal->m_eLoadType == m_pInternal->DOWNLOADFILE)
hrResultAll = m_pInternal->DownloadFile();
else if(m_pInternal->m_eLoadType == m_pInternal->UPLOADFILE)
hrResultAll = m_pInternal->UploadFile();
else if(m_pInternal->m_eLoadType == m_pInternal->UPLOADDATA)
hrResultAll = m_pInternal->UploadData();
if (bIsCanUseNetwork)
{
if(m_pInternal->m_eLoadType == m_pInternal->DOWNLOADFILE)
hrResultAll = m_pInternal->DownloadFile();
else if(m_pInternal->m_eLoadType == m_pInternal->UPLOADFILE)
hrResultAll = m_pInternal->UploadFile();
else if(m_pInternal->m_eLoadType == m_pInternal->UPLOADDATA)
hrResultAll = m_pInternal->UploadData();
}
else
{
hrResultAll = 1;
}
if (0 == hrResultAll)
m_pInternal->m_bComplete = true;

View File

@ -442,6 +442,36 @@ namespace NSNetwork
std::function<void(int)> func_onProgress = nullptr;
};
void EscapeQuotesPS(std::wstring& command, bool isPath)
{
/*
var symbols = [0x22, 0x27, 0x2018, 0x2019, 0x201a, 0x201b, 0x201c, 0x201d, 0x201e, 0x201f];
var output = "";
for (let i = 0; i < symbols.length; i++) output += (" " + encodeURI(String.fromCharCode(symbols[i])));
console.log(output);
result:
"%22 %27 %E2%80%98 %E2%80%99 %E2%80%9A %E2%80%9B %E2%80%9C %E2%80%9D %E2%80%9E %E2%80%9F"
*/
std::wstring sTmp = L" ";
if (isPath)
{
sTmp[0] = (wchar_t)'\\'; NSStringExt::Replace(command, sTmp, L"/");
}
sTmp[0] = (wchar_t)0x22; NSStringExt::Replace(command, sTmp, L"%22");
sTmp[0] = (wchar_t)0x27; NSStringExt::Replace(command, sTmp, L"%27");
sTmp[0] = (wchar_t)0x2018; NSStringExt::Replace(command, sTmp, L"%E2%80%98");
sTmp[0] = (wchar_t)0x2019; NSStringExt::Replace(command, sTmp, L"%E2%80%99");
sTmp[0] = (wchar_t)0x201a; NSStringExt::Replace(command, sTmp, L"%E2%80%9A");
sTmp[0] = (wchar_t)0x201b; NSStringExt::Replace(command, sTmp, L"%E2%80%9B");
sTmp[0] = (wchar_t)0x201c; NSStringExt::Replace(command, sTmp, L"%E2%80%9C");
sTmp[0] = (wchar_t)0x201d; NSStringExt::Replace(command, sTmp, L"%E2%80%9D");
sTmp[0] = (wchar_t)0x201e; NSStringExt::Replace(command, sTmp, L"%E2%80%9E");
sTmp[0] = (wchar_t)0x201f; NSStringExt::Replace(command, sTmp, L"%E2%80%9F");
}
bool DownloadFilePS(const std::wstring& sFileURLOriginal, const std::wstring& strFileOutput)
{
@ -452,8 +482,8 @@ namespace NSNetwork
std::wstring sFileDst = strFileOutput;
std::wstring sFileURL = sFileURLOriginal;
NSStringExt::Replace(sFileDst, L"\\", L"/");
NSStringExt::Replace(sFileURL, L"'", L"%27");
EscapeQuotesPS(sFileDst, true);
EscapeQuotesPS(sFileURL, false);
std::wstring sApp = L"powershell.exe c \"(new-object System.Net.WebClient).DownloadFile('" + sFileURL + L"','" + sFileDst + L"')\"";
wchar_t* pCommandLine = new wchar_t[sApp.length() + 1];

View File

@ -33,6 +33,7 @@
#include <iostream>
#include <unistd.h>
#include "../../DesktopEditor/common/Directory.h"
#include "../../DesktopEditor/common/ProcessEnv.h"
#ifdef USE_EXTERNAL_TRANSPORT
@ -96,7 +97,7 @@ namespace NSNetwork
{
std::string sProgramBinA = U_TO_UTF8(sCurlBin);
const char* nargs[10];
const char* nargs[16];
nargs[0] = sProgramBinA.c_str();
nargs[1] = "--url";
nargs[2] = sUrlA.c_str();
@ -107,6 +108,36 @@ namespace NSNetwork
nargs[7] = "--connect-timeout";
nargs[8] = "10";
nargs[9] = NULL;
nargs[10] = NULL;
nargs[11] = NULL;
nargs[12] = NULL;
nargs[13] = NULL;
nargs[14] = NULL;
nargs[15] = NULL;
std::string sProxy;
std::string sProxyIser;
std::string sProxyHeader;
int nIndexLast = 9;
if (NSProcessEnv::IsPresent(NSProcessEnv::Converter::gc_proxy))
{
sProxy = NSProcessEnv::GetStringValueA(NSProcessEnv::Converter::gc_proxy);
nargs[nIndexLast++] = "--proxy";
nargs[nIndexLast++] = sProxy.c_str();
}
if (NSProcessEnv::IsPresent(NSProcessEnv::Converter::gc_proxyUser))
{
sProxyIser = NSProcessEnv::GetStringValueA(NSProcessEnv::Converter::gc_proxyUser);
nargs[nIndexLast++] = "--proxy-user";
nargs[nIndexLast++] = sProxyIser.c_str();
}
if (NSProcessEnv::IsPresent(NSProcessEnv::Converter::gc_proxyHeader))
{
sProxyHeader = NSProcessEnv::GetStringValueA(NSProcessEnv::Converter::gc_proxyHeader);
nargs[nIndexLast++] = "--proxy-header";
nargs[nIndexLast++] = sProxyHeader.c_str();
}
const char* nenv[3];
nenv[0] = "LD_PRELOAD=";

View File

@ -95,6 +95,7 @@ public:
bool isHtmlFormatFile(unsigned char* pBuffer, int dwBytes, bool testCloseTag);
bool isMultiPartsHtmlFormatFile(unsigned char* pBuffer, int dwBytes);
bool isPdfFormatFile(unsigned char* pBuffer, int dwBytes, std::wstring& documentID);
bool isPdfOformFormatFile(unsigned char* pBuffer, int dwBytes);
bool isOpenOfficeFlatFormatFile(unsigned char* pBuffer, int dwBytes);
bool isBinaryDoctFormatFile(unsigned char* pBuffer, int dwBytes);

View File

@ -35,13 +35,18 @@
#include "../DesktopEditor/xml/include/xmlutils.h"
#include "../OOXML/Base/Base.h"
#include "../OfficeUtils/src/OfficeUtils.h"
// #if defined FILE_FORMAT_CHECKER_WITH_MACRO
// #include "../MsBinaryFile/PptFile/Main/PPTFormatLib.h"
// #endif
//#define FILE_FORMAT_CHECKER_WITH_MACRO
#if defined FILE_FORMAT_CHECKER_WITH_MACRO
#include "../MsBinaryFile/PptFile/Main/PPTFormatLib.h"
#endif
#include "3dParty/pole/pole.h"
#include <algorithm>
#include "OfficeFileFormatDefines.h"
#define MIN_SIZE_BUFFER 4096
#define MAX_SIZE_BUFFER 102400
@ -63,7 +68,7 @@ std::string ReadStringFromOle(POLE::Stream *stream, unsigned int max_size)
if (cch > max_size)
{
// error ... skip to 0
unsigned int pos_orinal = stream->tell();
unsigned int pos_orinal = (unsigned int)stream->tell();
unsigned int pos = 0;
stream->read(stringBytes, max_size);
@ -81,7 +86,7 @@ std::string ReadStringFromOle(POLE::Stream *stream, unsigned int max_size)
if (cch > 0)
{
// dont read the terminating zero
cch = stream->read(stringBytes, cch);
cch = (_UINT32)stream->read(stringBytes, cch);
result = std::string((char *)stringBytes, cch);
}
}
@ -241,7 +246,7 @@ bool COfficeFileFormatChecker::isPdfFormatFile(unsigned char *pBuffer, int dwByt
if (NULL != pLast)
{
std::string s(pFirst, pLast - pFirst);
documentID = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE *)s.c_str(), s.length());
documentID = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE*)pFirst, (LONG)(pLast - pFirst));
}
}
return true;
@ -249,6 +254,39 @@ bool COfficeFileFormatChecker::isPdfFormatFile(unsigned char *pBuffer, int dwByt
return false;
}
bool COfficeFileFormatChecker::isPdfOformFormatFile(unsigned char *pBuffer, int dwBytes)
{
pBuffer[dwBytes - 1] = 0;
char* pFirst = strstr((char*)pBuffer, "%\315\312\322\251\015");
if (!pFirst || pFirst - (char*)pBuffer + 6 >= dwBytes)
return false;
pFirst += 6;
if (strncmp(pFirst, "1 0 obj\012<<\012", 11) != 0 || pFirst - (char*)pBuffer + 11 >= dwBytes)
return false;
pFirst += 11;
char* pStream = strstr(pFirst, "stream\015\012");
char* pMeta = strstr(pFirst, g_format_oform_pdf_meta_tag);
if (!pStream || !pMeta || pStream < pMeta)
return false;
pMeta += strlen(g_format_oform_pdf_meta_tag) + 3;
char* pMetaLast = strstr(pMeta, " ");
if (!pMetaLast)
return false;
pMeta = pMetaLast + 1;
pMetaLast = strstr(pMeta, " ");
if (!pMetaLast)
return false;
return true;
}
bool COfficeFileFormatChecker::isOleObjectFile(POLE::Storage *storage)
{
if (storage == NULL)
@ -265,17 +303,17 @@ bool COfficeFileFormatChecker::isOleObjectFile(POLE::Storage *storage)
{
streamCompObject.seek(28); // skip Header
unsigned int sz_obj = streamCompObject.size() - streamCompObject.tell();
unsigned int sz_obj = (unsigned int)(streamCompObject.size() - streamCompObject.tell());
if (sz_obj > 4)
{
UserType = ReadStringFromOle(&streamCompObject, sz_obj);
sz_obj = streamCompObject.size() - streamCompObject.tell();
sz_obj = (unsigned int)(streamCompObject.size() - streamCompObject.tell());
if (sz_obj > 4)
ClipboardFormat = ReadStringFromOle(&streamCompObject, sz_obj);
sz_obj = streamCompObject.size() - streamCompObject.tell();
sz_obj = (unsigned int)(streamCompObject.size() - streamCompObject.tell());
if (sz_obj > 4)
Program = ReadStringFromOle(&streamCompObject, sz_obj);
}
@ -311,7 +349,7 @@ bool COfficeFileFormatChecker::isOleObjectFile(POLE::Storage *storage)
if (2 == streamLinkInfo.read((BYTE *)&cch, 2))
{
unsigned char *str = new unsigned char[cch];
cch = streamLinkInfo.read(str, cch);
cch = (short)streamLinkInfo.read(str, cch);
ClipboardFormat = std::string((char *)str, cch);
RELEASEARRAYOBJECTS(str);
@ -555,7 +593,7 @@ bool COfficeFileFormatChecker::isMS_OFFICECRYPTOFormatFile(POLE::Storage *storag
sData.resize(stream.size());
if (stream.read((BYTE *)sData.c_str(), stream.size()) > 0)
{
documentID = NSFile::CUtf8Converter::GetUnicodeStringFromUTF8((BYTE *)sData.c_str(), sData.length());
documentID = UTF8_TO_U(sData);
}
}
return result;
@ -715,6 +753,9 @@ bool COfficeFileFormatChecker::isOfficeFile(const std::wstring &_fileName)
else if (isPdfFormatFile(bufferDetect, sizeRead, sDocumentID)) // min size - 5
{
nFileType = AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF;
if (isPdfOformFormatFile(bufferDetect, sizeRead))
nFileType = AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM_PDF;
}
else if (isDjvuFormatFile(bufferDetect, sizeRead)) // min size - 8
{
@ -727,7 +768,6 @@ bool COfficeFileFormatChecker::isOfficeFile(const std::wstring &_fileName)
{
file.SeekFile(fileSize - MIN_SIZE_BUFFER);
file.ReadFile(bufferDetect, MIN_SIZE_BUFFER, dwDetectdBytes);
int sizeRead = (int)dwDetectdBytes;
}
if (isHtmlFormatFile(bufferDetect, sizeRead, true)) // min size - 6
{
@ -756,7 +796,6 @@ bool COfficeFileFormatChecker::isOfficeFile(const std::wstring &_fileName)
}
//------------------------------------------------------------------------------------------------
file.CloseFile();
}
if (bufferDetect)
delete[] bufferDetect;
@ -868,7 +907,7 @@ bool COfficeFileFormatChecker::isOOXFormatFile(const std::wstring &fileName, boo
const char *vssmFormatLine = "application/vnd.ms-powerpoint.slideshow.macroEnabled.main+xml";
const char *vstmFormatLine = "application/vnd.ms-powerpoint.template.macroEnabled.main+xml";
std::string strContentTypes((char*)pBuffer, nBufferSize);
std::string strContentTypes((char*)pBuffer, nBufferSize);
if (std::string::npos != strContentTypes.find(oformFormatLine))
{
@ -1210,7 +1249,7 @@ bool COfficeFileFormatChecker::isOOXFlatFormatFile(unsigned char *pBuffer, int d
{ // utf-16- big
// swap bytes
DWORD file_size_round = (dwBytes / 2) * 2;
for (long i = 0; i < file_size_round; i += 2)
for (DWORD i = 0; i < file_size_round; i += 2)
{
char v = pBuffer[i];
pBuffer[i] = pBuffer[i + 1];
@ -1337,6 +1376,7 @@ std::wstring COfficeFileFormatChecker::GetExtensionByType(int type)
return L".ots";
case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_PDF:
case AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM_PDF:
return L".pdf";
case AVS_OFFICESTUDIO_FILE_CROSSPLATFORM_SWF:
return L".swf";
@ -1383,23 +1423,33 @@ std::wstring COfficeFileFormatChecker::GetExtensionByType(int type)
return L".ico";
case AVS_OFFICESTUDIO_FILE_CANVAS_WORD:
case AVS_OFFICESTUDIO_FILE_CANVAS_SPREADSHEET:
case AVS_OFFICESTUDIO_FILE_CANVAS_PRESENTATION: return L".bin";
case AVS_OFFICESTUDIO_FILE_OTHER_OLD_DOCUMENT:
case AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY: return L".doct";
case AVS_OFFICESTUDIO_FILE_TEAMLAB_XLSY: return L".xlst";
case AVS_OFFICESTUDIO_FILE_OTHER_OLD_PRESENTATION:
case AVS_OFFICESTUDIO_FILE_OTHER_OLD_DRAWING:
case AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY: return L".pptt";
case AVS_OFFICESTUDIO_FILE_CANVAS_SPREADSHEET:
case AVS_OFFICESTUDIO_FILE_CANVAS_PRESENTATION:
return L".bin";
case AVS_OFFICESTUDIO_FILE_OTHER_OLD_DOCUMENT:
case AVS_OFFICESTUDIO_FILE_TEAMLAB_DOCY:
return L".doct";
case AVS_OFFICESTUDIO_FILE_TEAMLAB_XLSY:
return L".xlst";
case AVS_OFFICESTUDIO_FILE_OTHER_OLD_PRESENTATION:
case AVS_OFFICESTUDIO_FILE_OTHER_OLD_DRAWING:
case AVS_OFFICESTUDIO_FILE_TEAMLAB_PPTY:
return L".pptt";
case AVS_OFFICESTUDIO_FILE_DRAW_VSDX: return L".vsdx";
case AVS_OFFICESTUDIO_FILE_DRAW_VSSX: return L".vssx";
case AVS_OFFICESTUDIO_FILE_DRAW_VSTX: return L".vstx";
case AVS_OFFICESTUDIO_FILE_DRAW_VSDM: return L".vsdm";
case AVS_OFFICESTUDIO_FILE_DRAW_VSSM: return L".vssm";
case AVS_OFFICESTUDIO_FILE_DRAW_VSTM: return L".vstm";
}
return L"";
case AVS_OFFICESTUDIO_FILE_DRAW_VSDX:
return L".vsdx";
case AVS_OFFICESTUDIO_FILE_DRAW_VSSX:
return L".vssx";
case AVS_OFFICESTUDIO_FILE_DRAW_VSTX:
return L".vstx";
case AVS_OFFICESTUDIO_FILE_DRAW_VSDM:
return L".vsdm";
case AVS_OFFICESTUDIO_FILE_DRAW_VSSM:
return L".vssm";
case AVS_OFFICESTUDIO_FILE_DRAW_VSTM:
return L".vstm";
}
return L"";
}
int COfficeFileFormatChecker::GetFormatByExtension(const std::wstring &sExt)
@ -1496,7 +1546,7 @@ int COfficeFileFormatChecker::GetFormatByExtension(const std::wstring &sExt)
return AVS_OFFICESTUDIO_FILE_SPREADSHEET_OTS;
if (L".ods" == ext)
return AVS_OFFICESTUDIO_FILE_SPREADSHEET_ODS;
if (L".ooxml" == ext)
return AVS_OFFICESTUDIO_FILE_OTHER_OOXML;
if (L".odf" == ext)

View File

@ -0,0 +1,34 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#pragma once
static const char* g_format_oform_pdf_meta_tag = "ONLYOFFICEFORM";

View File

@ -55,6 +55,7 @@
#define AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX_PACKAGE AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0014
#define AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0015
#define AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCXF AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0016
#define AVS_OFFICESTUDIO_FILE_DOCUMENT_OFORM_PDF AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0017
#define AVS_OFFICESTUDIO_FILE_DOCUMENT_XML AVS_OFFICESTUDIO_FILE_DOCUMENT + 0x0030

View File

@ -229,6 +229,14 @@ core_linux {
QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN\'"
QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN/system\'"
QMAKE_LFLAGS += -Wl,--disable-new-dtags
!disable_rpath_addon {
RUN_PATH_ADDON = $$(RUN_PATH_ADDON)
!isEmpty(RUN_PATH_ADDON){
RUN_PATH_ADDON_ARRAY = $$split(RUN_PATH_ADDON, ";;")
for(rpath_item, RUN_PATH_ADDON_ARRAY):QMAKE_LFLAGS += "-Wl,-rpath,\'$$rpath_item\'"
}
}
}
}

56
Common/js/logging.h Normal file
View File

@ -0,0 +1,56 @@
#ifndef _LOG_FILE_H
#define _LOG_FILE_H
#include <stdio.h>
#define LOG_BUFFER_SIZE 1000
namespace Logging
{
void logBytes(char* name, unsigned char* str, int len)
{
char buffer[LOG_BUFFER_SIZE];
char* name_cur = name;
char* buf_cur = buffer;
while (*name_cur != 0)
{
*buf_cur++ = *name_cur++;
}
*buf_cur++ = ':';
*buf_cur++ = ' ';
*buf_cur++ = '[';
for (int i = 0; i < len; ++i)
{
unsigned char c = str[i];
unsigned char n1 = (unsigned char)(c / 100);
c -= (n1 * 100);
unsigned char n2 = (unsigned char)(c / 10);
c -= (n2 * 10);
if (buf_cur - buffer + 4 >= LOG_BUFFER_SIZE)
{
*buf_cur++ = '\0';
printf("%s\n", buffer);
buf_cur = buffer;
}
*buf_cur++ = (char)('0' + n1);
*buf_cur++ = (char)('0' + n2);
*buf_cur++ = (char)('0' + c);
*buf_cur++ = ',';
}
buf_cur--;
*buf_cur++ = ']';
*buf_cur++ = '\0';
printf("%s\n", buffer);
}
}
#endif // _LOG_FILE_H

View File

@ -30,8 +30,8 @@ Math.imul = Math.imul || function(a, b) {
var al = a & 0xffff;
var bh = (b >>> 16) & 0xffff;
var bl = b & 0xffff;
// сдвиг на 0 бит закрепляет знак в старшей части числа
// окончательный |0 преобразует беззнаковое значение обратно в знаковое значение
// shift by 0 bits fixes the sign in the high part of the number
// final |0 converts the unsigned value back to a signed value
return ((al * bl) + (((ah * bl + al * bh) << 16) >>> 0)|0);
};

View File

@ -30,25 +30,27 @@ HEADERS += ./kernel_config.h
# BLOCKER
HEADERS += \
./../DesktopEditor/graphics/TemporaryCS.h
./../DesktopEditor/graphics/TemporaryCS.h
SOURCES += \
./../DesktopEditor/graphics/TemporaryCS.cpp
./../DesktopEditor/graphics/TemporaryCS.cpp
# THREAD
core_android:DEFINES += NOT_USE_PTHREAD_CANCEL USE_FILE32API
HEADERS += \
./../DesktopEditor/graphics/BaseThread.h
./../DesktopEditor/graphics/BaseThread.h \
./../DesktopEditor/graphics/BaseThreadMonitor.h
SOURCES += \
./../DesktopEditor/graphics/BaseThread.cpp
./../DesktopEditor/graphics/BaseThread.cpp \
./../DesktopEditor/graphics/BaseThreadMonitor.cpp
# TIMER
HEADERS += \
./../DesktopEditor/graphics/Timer.h
./../DesktopEditor/graphics/Timer.h
SOURCES += \
./../DesktopEditor/graphics/Timer.cpp
./../DesktopEditor/graphics/Timer.cpp
# PATH
HEADERS += ./../DesktopEditor/common/Path.h
@ -92,11 +94,11 @@ HEADERS += ./../DesktopEditor/common/ProcessEnv.h
SOURCES += ./../DesktopEditor/common/ProcessEnv.cpp
core_windows {
LIBS += -lRpcrt4
LIBS += -lShell32
LIBS += -lRpcrt4
LIBS += -lShell32
}
core_ios {
OBJECTIVE_SOURCES += ./../DesktopEditor/common/File_ios.mm
LIBS += -framework Foundation
OBJECTIVE_SOURCES += ./../DesktopEditor/common/File_ios.mm
LIBS += -framework Foundation
}

View File

@ -32,10 +32,10 @@
#include <iostream>
#include <set>
#include "../fontengine/ApplicationFontsWorker.h"
#include "../common/Directory.h"
#include "../fontengine/ApplicationFontsWorker.h"
//#define _GENERATE_FONT_MAP_
// #define _GENERATE_FONT_MAP_
#ifdef _GENERATE_FONT_MAP_
#include "../freetype_names/FontMaps/FontDictionary.h"
@ -43,37 +43,37 @@
std::wstring CorrectDir(const std::wstring& sDir)
{
if (sDir.empty())
return L"";
if (sDir.empty())
return L"";
const wchar_t* data = sDir.c_str();
const wchar_t* data = sDir.c_str();
std::wstring::size_type pos1 = (data[0] == '\"') ? 1 : 0;
std::wstring::size_type pos2 = sDir.length();
std::wstring::size_type pos1 = (data[0] == '\"') ? 1 : 0;
std::wstring::size_type pos2 = sDir.length();
if (data[pos2 - 1] == '\"')
--pos2;
if (data[pos2 - 1] == '\"')
--pos2;
if (pos2 > 0 && ((data[pos2 - 1] == '\\') || (data[pos2 - 1] == '/')))
--pos2;
if (pos2 > 0 && ((data[pos2 - 1] == '\\') || (data[pos2 - 1] == '/')))
--pos2;
return sDir.substr(pos1, pos2 - pos1);
return sDir.substr(pos1, pos2 - pos1);
}
std::wstring CorrectValue(const std::wstring& value)
{
if (value.empty())
return L"";
if (value.empty())
return L"";
const wchar_t* data = value.c_str();
const wchar_t* data = value.c_str();
std::wstring::size_type pos1 = (data[0] == '\"') ? 1 : 0;
std::wstring::size_type pos2 = value.length();
std::wstring::size_type pos1 = (data[0] == '\"') ? 1 : 0;
std::wstring::size_type pos2 = value.length();
if (data[pos2 - 1] == '\"')
--pos2;
if (data[pos2 - 1] == '\"')
--pos2;
return value.substr(pos1, pos2 - pos1);
return value.substr(pos1, pos2 - pos1);
}
#ifdef WIN32
@ -82,149 +82,157 @@ int wmain(int argc, wchar_t** argv)
int main(int argc, char** argv)
#endif
{
std::vector<std::wstring> arFontsDirs;
bool bIsUseSystemFonts = false;
std::wstring strAllFontsWebPath = L"";
std::wstring strAllFontsPath = L"";
std::wstring strThumbnailsFolder = L"";
std::wstring strFontsSelectionBin = L"";
std::wstring strOutputDir = L"";
int nFontFlag = 3;
std::vector<std::wstring> arFontsDirs;
bool bIsUseSystemFonts = false;
bool bIsUseSystemUserFonts = true;
std::wstring strAllFontsWebPath = L"";
std::wstring strAllFontsPath = L"";
std::wstring strThumbnailsFolder = L"";
std::wstring strFontsSelectionBin = L"";
std::wstring strOutputDir = L"";
int nFontFlag = 3;
for (int i = 0; i < argc; ++i)
{
for (int i = 0; i < argc; ++i)
{
#ifdef WIN32
std::wstring sParam(argv[i]);
std::wstring sParam(argv[i]);
#else
std::string sParamA(argv[i]);
std::wstring sParam = UTF8_TO_U(sParamA);
std::string sParamA(argv[i]);
std::wstring sParam = UTF8_TO_U(sParamA);
#endif
if (sParam.find(L"--") == 0)
{
std::wstring sKey = L"";
std::wstring sValue = L"";
if (sParam.find(L"--") == 0)
{
std::wstring sKey = L"";
std::wstring sValue = L"";
std::wstring::size_type _pos = sParam.find('=');
if (std::wstring::npos == _pos)
{
sKey = sParam;
}
else
{
sKey = sParam.substr(0, _pos);
sValue = sParam.substr(_pos + 1);
}
std::wstring::size_type _pos = sParam.find('=');
if (std::wstring::npos == _pos)
{
sKey = sParam;
}
else
{
sKey = sParam.substr(0, _pos);
sValue = sParam.substr(_pos + 1);
}
if (sKey == L"--use-system")
{
sValue = CorrectValue(sValue);
if (sValue == L"1" || sValue == L"true")
bIsUseSystemFonts = true;
}
else if (sKey == L"--allfonts-web")
{
strAllFontsWebPath = CorrectDir(sValue);
}
else if (sKey == L"--allfonts")
{
strAllFontsPath = CorrectDir(sValue);
}
else if (sKey == L"--images")
{
strThumbnailsFolder = CorrectDir(sValue);
}
else if (sKey == L"--selection")
{
strFontsSelectionBin = CorrectDir(sValue);
}
else if (sKey == L"--input")
{
const wchar_t* src = sValue.c_str();
const wchar_t* limit = src + sValue.length();
if (sKey == L"--use-system")
{
sValue = CorrectValue(sValue);
if (sValue == L"1" || sValue == L"true")
bIsUseSystemFonts = true;
}
else if (sKey == L"--use-system-user-fonts")
{
sValue = CorrectValue(sValue);
if (sValue == L"0" || sValue == L"false")
bIsUseSystemUserFonts = false;
}
else if (sKey == L"--allfonts-web")
{
strAllFontsWebPath = CorrectDir(sValue);
}
else if (sKey == L"--allfonts")
{
strAllFontsPath = CorrectDir(sValue);
}
else if (sKey == L"--images")
{
strThumbnailsFolder = CorrectDir(sValue);
}
else if (sKey == L"--selection")
{
strFontsSelectionBin = CorrectDir(sValue);
}
else if (sKey == L"--input")
{
const wchar_t* src = sValue.c_str();
const wchar_t* limit = src + sValue.length();
const wchar_t* srcPrev = src;
while (src < limit)
{
if (*src == ';')
{
if (srcPrev != src)
{
arFontsDirs.push_back(CorrectDir(std::wstring(srcPrev, src - srcPrev)));
}
src++;
srcPrev = src;
}
else
src++;
}
const wchar_t* srcPrev = src;
while (src < limit)
{
if (*src == ';')
{
if (srcPrev != src)
{
arFontsDirs.push_back(CorrectDir(std::wstring(srcPrev, src - srcPrev)));
}
src++;
srcPrev = src;
}
else
src++;
}
if (src > srcPrev)
{
arFontsDirs.push_back(CorrectDir(std::wstring(srcPrev, src - srcPrev)));
}
}
else if (sKey == L"--output-web")
{
strOutputDir = CorrectDir(sValue);
}
else if (sKey == L"--font-format")
{
// first byte => isSupportCFF
// second byte => isUnsupport DFont (mac)
if (src > srcPrev)
{
arFontsDirs.push_back(CorrectDir(std::wstring(srcPrev, src - srcPrev)));
}
}
else if (sKey == L"--output-web")
{
strOutputDir = CorrectDir(sValue);
}
else if (sKey == L"--font-format")
{
// first byte => isSupportCFF
// second byte => isUnsupport DFont (mac)
int nFlag = std::stoi(sValue);
if (nFlag > 0)
nFontFlag = nFlag;
}
}
}
int nFlag = std::stoi(sValue);
if (nFlag > 0)
nFontFlag = nFlag;
}
}
}
/*
--input="./fontsInput" --allfonts="./fonts/AllFonts.js" --allfonts-web="./fonts/AllFonts2.js" --images="./fonts" --selection="./fonts/font_selection.bin" --output-web="./fonts" --use-system="false"
*/
/*
--input="./fontsInput" --allfonts="./fonts/AllFonts.js" --allfonts-web="./fonts/AllFonts2.js" --images="./fonts" --selection="./fonts/font_selection.bin" --output-web="./fonts"
--use-system="false"
*/
CApplicationFontsWorker oWorker;
// это не рабочая папка, где только шрифты
oWorker.m_bIsCleanDirectory = false;
oWorker.m_bIsRemoveOldThumbnails = true;
CApplicationFontsWorker oWorker;
// это не рабочая папка, где только шрифты
oWorker.m_bIsCleanDirectory = false;
oWorker.m_bIsRemoveOldThumbnails = true;
// input fonts
oWorker.m_bIsUseSystemFonts = bIsUseSystemFonts;
oWorker.m_arAdditionalFolders = arFontsDirs;
// input fonts
oWorker.m_bIsUseSystemFonts = bIsUseSystemFonts;
if (bIsUseSystemFonts)
oWorker.m_bIsUseSystemUserFonts = bIsUseSystemUserFonts;
oWorker.m_arAdditionalFolders = arFontsDirs;
// font_selection.bin
// fonts.log
oWorker.m_sDirectory = NSFile::GetDirectoryName(strFontsSelectionBin);
// font_selection.bin
// fonts.log
oWorker.m_sDirectory = NSFile::GetDirectoryName(strFontsSelectionBin);
// thumbnails
oWorker.m_sThumbnailsDirectory = strThumbnailsFolder;
oWorker.m_bIsNeedThumbnails = !oWorker.m_sThumbnailsDirectory.empty();
oWorker.m_bSeparateThumbnails = true;
// thumbnails
oWorker.m_sThumbnailsDirectory = strThumbnailsFolder;
oWorker.m_bIsNeedThumbnails = !oWorker.m_sThumbnailsDirectory.empty();
oWorker.m_bSeparateThumbnails = true;
// allfonts
oWorker.m_sAllFontsJSPath = strAllFontsPath;
oWorker.m_sWebAllFontsJSPath = strAllFontsWebPath;
// allfonts
oWorker.m_sAllFontsJSPath = strAllFontsPath;
oWorker.m_sWebAllFontsJSPath = strAllFontsWebPath;
// webfonts
oWorker.m_sWebFontsDirectory = strOutputDir;
// webfonts
oWorker.m_sWebFontsDirectory = strOutputDir;
// opentype
oWorker.m_bIsUseOpenType = (0x01 == (0x01 & nFontFlag));
// opentype
oWorker.m_bIsUseOpenType = (0x01 == (0x01 & nFontFlag));
NSFonts::IApplicationFonts* pApplicationFonts = oWorker.Check();
if (oWorker.m_bIsNeedThumbnails)
oWorker.CheckThumbnails();
RELEASEINTERFACE(pApplicationFonts);
NSFonts::IApplicationFonts* pApplicationFonts = oWorker.Check();
if (oWorker.m_bIsNeedThumbnails)
oWorker.CheckThumbnails();
RELEASEINTERFACE(pApplicationFonts);
#ifdef _GENERATE_FONT_MAP_
NSCommon::DumpFontsDictionary(L"./fonts_dictionary.txt");
NSCommon::DumpFontsDictionary(L"./fonts_dictionary.txt");
#endif
return 0;
return 0;
}

View File

@ -515,17 +515,26 @@ namespace NSDirectory
}
std::wstring GetFolderPath(const std::wstring& wsFolderPath)
{
int n1 = (int)wsFolderPath.rfind('\\');
if (n1 < 0)
{
n1 = (int)wsFolderPath.rfind('/');
if (n1 < 0)
{
return L"";
}
return wsFolderPath.substr(0, n1);
}
return wsFolderPath.substr(0, n1);
#ifdef _WIN32
std::wstring::size_type nPos1 = wsFolderPath.rfind('\\');
#else
std::wstring::size_type nPos1 = std::wstring::npos;
#endif
std::wstring::size_type nPos2 = wsFolderPath.rfind('/');
std::wstring::size_type nPos = std::wstring::npos;
if (nPos1 != std::wstring::npos)
{
nPos = nPos1;
if (nPos2 != std::wstring::npos && nPos2 > nPos)
nPos = nPos2;
}
else
nPos = nPos2;
if (nPos == std::wstring::npos)
return wsFolderPath;
return wsFolderPath.substr(0, nPos);
}
std::wstring CreateTempFileWithUniqueName (const std::wstring & strFolderPathRoot, std::wstring Prefix)
{

View File

@ -256,7 +256,7 @@ namespace NSFile
}
pUnicodeString[lIndexUnicode++] = (WCHAR)(val);
lIndex += 5;
lIndex += 6;
}
}
@ -986,14 +986,16 @@ namespace NSFile
}
long CFileBinary::GetFilePosition()
{
m_lFilePosition = ftell(m_pFile);
if (!m_pFile) return 0;
m_lFilePosition = ftell(m_pFile);
return m_lFilePosition;
}
unsigned long CFileBinary::GetPosition()
{
m_lFilePosition = ftell(m_pFile);
if (!m_pFile) return 0;
m_lFilePosition = ftell(m_pFile);
return (unsigned long)m_lFilePosition;
}

View File

@ -31,6 +31,7 @@
*/
#include "Path.h"
#include "File.h"
#include <stack>
#if defined(_WIN32) || defined (_WIN64)
#include <tchar.h>
@ -110,7 +111,7 @@ namespace NSSystemPath
}
template<class CHAR, class STRING = std::basic_string<CHAR, std::char_traits<CHAR>, std::allocator<CHAR>>>
STRING NormalizePathTemplate(const STRING& strFileName)
STRING NormalizePathTemplate(const STRING& strFileName, const bool& canHead = false)
{
const CHAR* pData = strFileName.c_str();
int nLen = (int) strFileName.length();
@ -124,6 +125,12 @@ namespace NSSystemPath
int nCurrentW = 0;
bool bIsUp = false;
if (canHead)
{
nCurrentSlash = 0;
pSlashPoints[0] = 0;
}
if (pData[nCurrent] == '/' || pData[nCurrent] == '\\')
{
#if !defined(_WIN32) && !defined (_WIN64)
@ -177,12 +184,69 @@ namespace NSSystemPath
return result;
}
std::string NormalizePath(const std::string& strFileName)
std::string NormalizePath(const std::string& strFileName, const bool& canHead)
{
return NormalizePathTemplate<char>(strFileName);
return NormalizePathTemplate<char>(strFileName, canHead);
}
std::wstring NormalizePath(const std::wstring& strFileName)
std::wstring NormalizePath(const std::wstring& strFileName, const bool& canHead)
{
return NormalizePathTemplate<wchar_t>(strFileName);
return NormalizePathTemplate<wchar_t>(strFileName, canHead);
}
std::wstring ShortenPath(const std::wstring &strPath, const bool& bRemoveExternalPath)
{
std::stack<std::wstring> arStack;
std::wstring wsToken;
for (size_t i = 0; i < strPath.size(); ++i)
{
if (L'/' == strPath[i] || L'\\' == strPath[i])
{
if (L".." == wsToken)
{
if (!arStack.empty() && L".." != arStack.top())
arStack.pop();
else
arStack.push(wsToken);
}
else if (L"." != wsToken && !wsToken.empty())
arStack.push(wsToken);
wsToken.clear();
}
else
wsToken += strPath[i];
}
if (L".." == wsToken)
{
if (!arStack.empty() && L".." == arStack.top())
arStack.pop();
else
arStack.push(wsToken);
}
else if (L"." != wsToken && !wsToken.empty())
arStack.push(wsToken);
wsToken.clear();
if (arStack.empty())
return std::wstring();
std::wstring wsNewPath;
while (!arStack.empty())
{
if (bRemoveExternalPath && L".." == arStack.top())
break;
wsNewPath = arStack.top() + L'/' + wsNewPath;
arStack.pop();
}
wsNewPath.pop_back();
return wsNewPath;
}
}

View File

@ -41,8 +41,9 @@ namespace NSSystemPath
KERNEL_DECL std::wstring GetDirectoryName(const std::wstring& strFileName);
KERNEL_DECL std::wstring GetFileName(const std::wstring& strFileName);
KERNEL_DECL std::wstring Combine(const std::wstring& strLeft, const std::wstring& strRight);
KERNEL_DECL std::string NormalizePath(const std::string& strFileName);
KERNEL_DECL std::wstring NormalizePath(const std::wstring& strFileName);
KERNEL_DECL std::string NormalizePath(const std::string& strFileName, const bool& canHead = false);
KERNEL_DECL std::wstring NormalizePath(const std::wstring& strFileName, const bool& canHead = false);
KERNEL_DECL std::wstring ShortenPath(const std::wstring& strPath, const bool& bRemoveExternalPath = false);
}
#endif //_BUILD_PATH_CROSSPLATFORM_H_

View File

@ -37,14 +37,20 @@
#define CXIMAGE_SUPPORT_PGX 1
#define CXIMAGE_SUPPORT_PNM 1
#define CXIMAGE_SUPPORT_RAS 1
#define CXIMAGE_SUPPORT_PIC 1
#define CXIMAGE_SUPPORT_JBG 0 // GPL'd see ../jbig/copying.txt & ../jbig/patents.htm
#define CXIMAGE_SUPPORT_MNG 1
#define CXIMAGE_SUPPORT_SKA 1
#define CXIMAGE_SUPPORT_RAW 1
#define CXIMAGE_SUPPORT_PSD 1
#ifndef BUILDING_WASM_MODULE
#define CXIMAGE_SUPPORT_RAW 1
#else
#define CXIMAGE_SUPPORT_RAW 0
#endif
#ifdef CXIMAGE_DISABLE_SUPPORT_MNG
#undef CXIMAGE_SUPPORT_MNG
#define CXIMAGE_SUPPORT_MNG 0

View File

@ -130,10 +130,13 @@ CXIMAGE_FORMAT_RAW = 19,
#if CXIMAGE_SUPPORT_PSD
CXIMAGE_FORMAT_PSD = 20,
#endif
#if CXIMAGE_SUPPORT_PIC
CXIMAGE_FORMAR_PIC = 25,
#endif
CMAX_IMAGE_FORMATS = CXIMAGE_SUPPORT_BMP + CXIMAGE_SUPPORT_GIF + CXIMAGE_SUPPORT_JPG +
CXIMAGE_SUPPORT_PNG + CXIMAGE_SUPPORT_MNG + CXIMAGE_SUPPORT_ICO +
CXIMAGE_SUPPORT_TIF + CXIMAGE_SUPPORT_TGA + CXIMAGE_SUPPORT_PCX +
CXIMAGE_SUPPORT_WBMP+ CXIMAGE_SUPPORT_WMF +
CXIMAGE_SUPPORT_WBMP+ CXIMAGE_SUPPORT_WMF + CXIMAGE_SUPPORT_PIC +
CXIMAGE_SUPPORT_JBG + CXIMAGE_SUPPORT_JP2 + CXIMAGE_SUPPORT_JPC +
CXIMAGE_SUPPORT_PGX + CXIMAGE_SUPPORT_PNM + CXIMAGE_SUPPORT_RAS +
CXIMAGE_SUPPORT_SKA + CXIMAGE_SUPPORT_RAW + CXIMAGE_SUPPORT_PSD + 1

View File

@ -546,7 +546,7 @@ namespace NSDoctRenderer
* 3) The builder object methods cannot be called with the JS variables. Wrap them with the jsValue instruction if necessary:
* var jsVar = "123.docx";
* builder.SaveFile("docx", jsVar); // Incorrect
* builder.SaveFile("docx", jsValue(jsVar)); // Correct
* builder.SaveFile("docx", "jsValue(jsVar)"); // Correct
*
* 4) For convenience, format types are replaced with strings.
* For example, builder.CreateFile("docx"); is the same as CDocBuilder.CreateFile(AVS_OFFICESTUDIO_FILE_DOCUMENT_DOCX);

View File

@ -30,6 +30,7 @@
*
*/
#include "docbuilder_p.h"
#include "server.h"
std::wstring NSDoctRenderer::CDocBuilder_Private::m_sExternalDirectory = L"";
@ -203,21 +204,11 @@ std::string GetCorrectArgument(const std::string& sInput)
return sResult;
}
bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstring& path, const std::string& sString, const std::wstring& sCachePath, CV8Params* pParams)
bool CV8RealTimeWorker::InitVariables()
{
LOGGER_SPEED_START();
CJSContextScope scope(m_context);
JSSmart<CJSTryCatch> try_catch = m_context->GetExceptions();
LOGGER_SPEED_LAP("compile");
m_context->runScript(sString, try_catch, sCachePath);
if(try_catch->Check())
return false;
LOGGER_SPEED_LAP("run");
if (true)
{
std::string sArg = GetCorrectArgument(m_sUtf8ArgumentJSON);
@ -245,6 +236,26 @@ bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstri
if (try_catch->Check())
return false;
}
return true;
}
bool CV8RealTimeWorker::OpenFile(const std::wstring& sBasePath, const std::wstring& path, const std::string& sString, const std::wstring& sCachePath, CV8Params* pParams)
{
LOGGER_SPEED_START();
CJSContextScope scope(m_context);
JSSmart<CJSTryCatch> try_catch = m_context->GetExceptions();
LOGGER_SPEED_LAP("compile");
m_context->runScript(sString, try_catch, sCachePath);
if(try_catch->Check())
return false;
LOGGER_SPEED_LAP("run");
if (!InitVariables())
return false;
NSNativeControl::CNativeControl* pNative = NULL;
bool bIsBreak = false;
@ -492,12 +503,12 @@ namespace NSDoctRenderer
if (oParent->isArray())
{
JSSmart<CJSArray> oParentArray = oParent->toArray();
oParentArray->set(m_internal->m_parent->m_parent_index, m_internal->m_value.GetPointer());
oParentArray->set(m_internal->m_parent->m_parent_index, m_internal->m_value);
}
else if (oParent->isObject() && !m_internal->m_parent->m_parent_prop_name.empty())
{
JSSmart<CJSObject> oParentObject = oParent->toObject();
oParentObject->set(m_internal->m_parent->m_parent_prop_name.c_str(), m_internal->m_value.GetPointer());
oParentObject->set(m_internal->m_parent->m_parent_prop_name.c_str(), m_internal->m_value);
}
}
@ -729,7 +740,7 @@ namespace NSDoctRenderer
std::string sPropA = U_TO_UTF8(sProp);
value.m_internal->CheckNative();
m_internal->m_value->toObject()->set(sPropA.c_str(), value.m_internal->m_value.GetPointer());
m_internal->m_value->toObject()->set(sPropA.c_str(), value.m_internal->m_value);
}
void CDocBuilderValue::SetProperty(const wchar_t* name, CDocBuilderValue value)
{
@ -742,7 +753,7 @@ namespace NSDoctRenderer
JSSmart<CJSArray> array = m_internal->m_value->toArray();
value.m_internal->CheckNative();
array->set(index, value.m_internal->m_value.GetPointer());
array->set(index, value.m_internal->m_value);
}
// primitives
@ -1511,6 +1522,8 @@ namespace NSDoctRenderer
{
m_pInternal->m_bIsServerSafeVersion = true;
m_pInternal->m_sFolderForSaveOnlyUseNames = std::wstring(value);
CServerInstance::getInstance().Enable(true);
}
else if (sParam == "--all-fonts-path")
{

View File

@ -427,6 +427,7 @@ public:
bool OpenFile(const std::wstring& sBasePath, const std::wstring& path, const std::string& sString, const std::wstring& sCachePath, CV8Params* pParams = NULL);
bool SaveFileWithChanges(int type, const std::wstring& _path, const std::wstring& sJsonParams = L"");
bool InitVariables();
};
namespace NSDoctRenderer
@ -1291,7 +1292,11 @@ namespace NSDoctRenderer
Init();
CheckWorker();
bool bRes = CheckWorker();
if (!bRes && m_pWorker && m_bJavascriptBeforeEditor)
m_pWorker->InitVariables();
return m_pWorker->ExecuteCommand(command, retValue);
}

View File

@ -540,6 +540,42 @@ namespace NSDoctRenderer
}
break;
}
case DoctRendererFormat::WATERMARK:
{
if (!pParams->m_sJsonParams.empty())
{
std::string sTmp = U_TO_UTF8((pParams->m_sJsonParams));
args[0] = context->JSON_Parse(sTmp.c_str());
JSSmart<CJSValue> js_watermark = js_objectApi->call_func("asc_nativeGetWatermark", 1, args);
if (!try_catch->Check() && js_watermark->isString())
{
std::string sWatermark = js_watermark->toStringA();
std::string::size_type pos = sWatermark.find(',');
if (pos != std::string::npos)
{
int nInputSize = (int)(sWatermark.length() - pos) - 1;
char* pInput = (char*)(sWatermark.c_str() + pos + 1);
int nOutputSize = 0;
BYTE* pOutput = NULL;
if (NSFile::CBase64Converter::Decode(pInput, nInputSize, pOutput, nOutputSize))
{
NSFile::CFileBinary oFileWatermark;
if (oFileWatermark.CreateFileW(pParams->m_strDstFilePath))
{
oFileWatermark.WriteFile(pOutput, nOutputSize);
oFileWatermark.CloseFile();
}
RELEASEARRAYOBJECTS(pOutput);
}
}
}
}
break;
}
default:
break;
}
@ -606,27 +642,20 @@ namespace NSDoctRenderer
// Api object
JSSmart<CJSObject> js_objectApi;
// OPEN
bool bIsWatermark = (m_oParams.m_eDstFormat == NSDoctRenderer::DoctRendererFormat::WATERMARK) ? true : false;
JSSmart<CJSValue> openOptions;
if (!bIsBreak)
{
CChangesWorker oWorkerLoader;
int nVersion = oWorkerLoader.OpenNative(pNative->GetFilePath());
JSSmart<CJSValue> args_open[4];
args_open[0] = oWorkerLoader.GetDataFull()->toValue();
args_open[1] = CJSContext::createInt(nVersion);
std::wstring sXlsx = NSFile::GetDirectoryName(pNative->GetFilePath()) + L"/Editor.xlsx";
args_open[2] = NSFile::CFileBinary::Exists(sXlsx) ? CJSContext::createString(sXlsx) : CJSContext::createUndefined();
if (!m_oParams.m_sJsonParams.empty())
{
std::string sTmp = U_TO_UTF8((m_oParams.m_sJsonParams));
args_open[3] = context->JSON_Parse(sTmp.c_str());
openOptions = context->JSON_Parse(sTmp.c_str());
if (0 < m_oParams.m_nLcid)
{
if (args_open[3]->isObject())
args_open[3]->toObject()->set("locale", CJSContext::createInt(m_oParams.m_nLcid));
if (openOptions->isObject())
openOptions->toObject()->set("locale", CJSContext::createInt(m_oParams.m_nLcid));
}
}
else
@ -634,10 +663,35 @@ namespace NSDoctRenderer
JSSmart<CJSObject> optionsParams = CJSContext::createObject();
if (0 < m_oParams.m_nLcid)
optionsParams->set("locale", CJSContext::createInt(m_oParams.m_nLcid));
args_open[3] = optionsParams->toValue();
openOptions = optionsParams->toValue();
}
}
// OPEN
if (!bIsBreak)
{
if (!bIsWatermark)
{
CChangesWorker oWorkerLoader;
int nVersion = oWorkerLoader.OpenNative(pNative->GetFilePath());
JSSmart<CJSValue> args_open[4];
args_open[0] = oWorkerLoader.GetDataFull()->toValue();
args_open[1] = CJSContext::createInt(nVersion);
std::wstring sXlsx = NSFile::GetDirectoryName(pNative->GetFilePath()) + L"/Editor.xlsx";
args_open[2] = NSFile::CFileBinary::Exists(sXlsx) ? CJSContext::createString(sXlsx) : CJSContext::createUndefined();
args_open[3] = openOptions;
global_js->call_func("NativeOpenFileData", 4, args_open);
}
else
{
JSSmart<CJSValue> args_open[1];
args_open[0] = openOptions;
global_js->call_func("NativeCreateApi", 1, args_open);
}
global_js->call_func("NativeOpenFileData", 4, args_open);
if (try_catch->Check())
{
strError = L"code=\"open\"";
@ -655,7 +709,7 @@ namespace NSDoctRenderer
LOGGER_SPEED_LAP("open");
// CHANGES
if (!bIsBreak)
if (!bIsBreak && !bIsWatermark)
{
if (m_oParams.m_arChanges.size() != 0)
{
@ -892,6 +946,7 @@ namespace NSDoctRenderer
case DoctRendererFormat::PDF:
case DoctRendererFormat::IMAGE:
case DoctRendererFormat::HTML:
case DoctRendererFormat::WATERMARK:
{
arSdkFiles = &m_pInternal->m_arDoctSDK;
m_pInternal->m_strEditorType = L"document";

View File

@ -42,14 +42,15 @@ namespace NSDoctRenderer
{
enum FormatFile
{
DOCT = 0,
XLST = 1,
PPTT = 2,
PDF = 3,
HTML = 4,
DOCT = 0,
XLST = 1,
PPTT = 2,
PDF = 3,
HTML = 4,
PPTX_THEME_THUMBNAIL = 5,
IMAGE = 6,
VSDT = 7,
IMAGE = 6,
VSDT = 7,
WATERMARK = 8,
INVALID = 255
};

View File

@ -21,62 +21,74 @@ ADD_DEPENDENCY(graphics, kernel, UnicodeConverter, kernel_network)
core_android:DEFINES += DISABLE_MEMORY_LIMITATION
HEADERS += \
config.h \
doctrenderer.h \
docbuilder.h
config.h \
doctrenderer.h \
docbuilder.h
SOURCES += \
nativecontrol.cpp \
doctrenderer.cpp \
docbuilder.cpp \
docbuilder_p.cpp \
graphics.cpp \
nativecontrol.cpp \
doctrenderer.cpp \
docbuilder.cpp \
docbuilder_p.cpp \
graphics.cpp \
hash.cpp
SOURCES += \
../../Common/OfficeFileFormatChecker2.cpp \
../../Common/3dParty/pole/pole.cpp \
../../OOXML/Base/unicode_util.cpp
../../Common/OfficeFileFormatChecker2.cpp \
../../Common/3dParty/pole/pole.cpp \
../../OOXML/Base/unicode_util.cpp
HEADERS += \
docbuilder_p.h \
nativecontrol.h \
graphics.h \
hash.h
docbuilder_p.h \
nativecontrol.h \
graphics.h \
hash.h \
server.h
HEADERS += \
embed/PointerEmbed.h \
embed/ZipEmbed.h \
embed/GraphicsEmbed.h \
embed/MemoryStreamEmbed.h \
embed/NativeControlEmbed.h \
embed/NativeBuilderEmbed.h \
embed/NativeBuilderDocumentEmbed.h \
embed/TextMeasurerEmbed.h \
embed/HashEmbed.h \
embed/Default.h \
js_internal/js_base.h
embed/PointerEmbed.h \
embed/ZipEmbed.h \
embed/GraphicsEmbed.h \
embed/MemoryStreamEmbed.h \
embed/NativeControlEmbed.h \
embed/NativeBuilderEmbed.h \
embed/NativeBuilderDocumentEmbed.h \
embed/TextMeasurerEmbed.h \
embed/HashEmbed.h \
embed/Default.h \
js_internal/js_base.h
SOURCES += \
embed/PointerEmbed.cpp \
embed/ZipEmbed.cpp \
embed/GraphicsEmbed.cpp \
embed/MemoryStreamEmbed.cpp \
embed/NativeControlEmbed.cpp \
embed/NativeBuilderEmbed.cpp \
embed/NativeBuilderDocumentEmbed.cpp \
embed/TextMeasurerEmbed.cpp \
embed/HashEmbed.cpp \
embed/Default.cpp
embed/PointerEmbed.cpp \
embed/ZipEmbed.cpp \
embed/GraphicsEmbed.cpp \
embed/MemoryStreamEmbed.cpp \
embed/NativeControlEmbed.cpp \
embed/NativeBuilderEmbed.cpp \
embed/NativeBuilderDocumentEmbed.cpp \
embed/TextMeasurerEmbed.cpp \
embed/HashEmbed.cpp \
embed/Default.cpp
# Serialize objects to JS
HEADERS += \
json/json.h \
json/json_p.h \
json/json_values.h \
json/serialization.h
SOURCES += \
json/json.cpp \
json/json_values.cpp
include($$PWD/js_internal/js_base.pri)
!use_javascript_core {
build_xp:DESTDIR=$$DESTDIR/xp
build_xp:DESTDIR=$$DESTDIR/xp
}
use_javascript_core {
OBJECTIVE_SOURCES += ../common/Mac/NSString+StringUtils.mm
OBJECTIVE_SOURCES += ../common/Mac/NSString+StringUtils.mm
}
# files for embedded classes

View File

@ -564,3 +564,14 @@ JSSmart<CJSValue> CGraphicsEmbed::GetTransform()
e->set("ty", res.ty);
return e->toValue();
}
JSSmart<CJSValue> CGraphicsEmbed::CreateLayer(JSSmart<CJSValue> opacity)
{
m_pInternal->CreateLayer(opacity->toDouble());
return NULL;
}
JSSmart<CJSValue> CGraphicsEmbed::BlendLayer()
{
m_pInternal->BlendLayer();
return NULL;
}

View File

@ -82,11 +82,11 @@ public:
JSSmart<CJSValue> drawHorLine (JSSmart<CJSValue> align, JSSmart<CJSValue> y, JSSmart<CJSValue> x, JSSmart<CJSValue> r, JSSmart<CJSValue> penW);
JSSmart<CJSValue> drawHorLine2(JSSmart<CJSValue> align, JSSmart<CJSValue> y, JSSmart<CJSValue> x, JSSmart<CJSValue> r, JSSmart<CJSValue> penW);
JSSmart<CJSValue> drawVerLine (JSSmart<CJSValue> align, JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> b, JSSmart<CJSValue> penW);
// мега крутые функции для таблиц
JSSmart<CJSValue> drawHorLineExt(JSSmart<CJSValue> align, JSSmart<CJSValue> y, JSSmart<CJSValue> x, JSSmart<CJSValue> r, JSSmart<CJSValue> penW, JSSmart<CJSValue> leftMW, JSSmart<CJSValue> rightMW);
JSSmart<CJSValue> rect (JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> TableRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
// функции клиппирования
JSSmart<CJSValue> AddClipRect(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
JSSmart<CJSValue> RemoveClipRect();
JSSmart<CJSValue> SetClip(JSSmart<CJSValue> x, JSSmart<CJSValue> y, JSSmart<CJSValue> w, JSSmart<CJSValue> h);
@ -132,6 +132,10 @@ public:
JSSmart<CJSValue> CoordTransformOffset(JSSmart<CJSValue> tx, JSSmart<CJSValue> ty);
JSSmart<CJSValue> GetTransform();
// layer
JSSmart<CJSValue> CreateLayer(JSSmart<CJSValue> opacity);
JSSmart<CJSValue> BlendLayer();
DECLARE_EMBED_METHODS
};

View File

@ -1,4 +1,5 @@
#include "NativeControlEmbed.h"
#include "../server.h"
JSSmart<CJSValue> CNativeControlEmbed::SetFilePath(JSSmart<CJSValue> path)
{
@ -24,7 +25,17 @@ JSSmart<CJSValue> CNativeControlEmbed::GetFileId()
JSSmart<CJSValue> CNativeControlEmbed::GetFileBinary(JSSmart<CJSValue> file)
{
return CJSContext::createUint8Array(file->toStringW());
std::wstring sFilePath = file->toStringW();
if (CServerInstance::getInstance().IsEnable())
{
std::wstring sFileFolder = NSFile::GetDirectoryName(m_pInternal->GetFilePath());
if (0 == sFilePath.find(sFileFolder))
return CJSContext::createUint8Array(sFilePath);
return CJSContext::createNull();
}
return CJSContext::createUint8Array(sFilePath);
}
JSSmart<CJSValue> CNativeControlEmbed::GetFontBinary(JSSmart<CJSValue> file)
@ -59,6 +70,8 @@ JSSmart<CJSValue> CNativeControlEmbed::GetFontsDirectory()
JSSmart<CJSValue> CNativeControlEmbed::GetFileString(JSSmart<CJSValue> file)
{
if (CServerInstance::getInstance().IsEnable())
return CJSContext::createNull();
return CJSContext::createUint8Array(file->toStringW());
}

View File

@ -2,6 +2,7 @@
#include "../../raster/BgraFrame.h"
#include "../../graphics/pro/Image.h"
#include "../../raster/ImageFileFormatChecker.h"
#include "server.h"
JSSmart<CJSValue> CZipEmbed::open(JSSmart<CJSValue> typedArray_or_Folder)
{
@ -18,7 +19,8 @@ JSSmart<CJSValue> CZipEmbed::open(JSSmart<CJSValue> typedArray_or_Folder)
}
else if (typedArray_or_Folder->isString())
{
m_pFolder = new CFolderSystem(typedArray_or_Folder->toStringW());
if (!CServerInstance::getInstance().IsEnable())
m_pFolder = new CFolderSystem(typedArray_or_Folder->toStringW());
}
if (!m_pFolder)
@ -174,7 +176,7 @@ JSSmart<CJSValue> CZipEmbed::encodeImageData(JSSmart<CJSValue> typedArray, JSSma
if (oFrame.Encode(pBuffer, nEncodedSize, format->toInt32()))
{
BYTE* pData = NSAllocator::Alloc((size_t)nEncodedSize);
memcpy(pData, oFrame.get_Data(), (size_t)nEncodedSize);
memcpy(pData, pBuffer, (size_t)nEncodedSize);
oFrame.FreeEncodedMemory(pBuffer);
oFrame.put_Data(NULL);
@ -228,7 +230,7 @@ JSSmart<CJSValue> CZipEmbed::encodeImage(JSSmart<CJSValue> typedArray, JSSmart<C
if (oFrame.Encode(pBuffer, nEncodedSize, format->toInt32()))
{
BYTE* pData = NSAllocator::Alloc((size_t)nEncodedSize);
memcpy(pData, oFrame.get_Data(), (size_t)nEncodedSize);
memcpy(pData, pBuffer, (size_t)nEncodedSize);
oFrame.FreeEncodedMemory(pBuffer);
oFrame.put_Data(NULL);

View File

@ -108,6 +108,8 @@
-(JSValue*) DrawPath : (JSValue*)path;
-(JSValue*) CoordTransformOffset : (JSValue*)tx : (JSValue*)ty;
-(JSValue*) GetTransform;
-(JSValue*) CreateLayer : (JSValue*)opacity;
-(JSValue*) BlendLayer;
@end
@interface CJSCGraphicsEmbed : NSObject<IJSCGraphicsEmbed, JSEmbedObjectProtocol>
@ -223,6 +225,8 @@ FUNCTION_WRAPPER_JS_0(GetlineWidth, GetlineWidth)
FUNCTION_WRAPPER_JS_1(DrawPath, DrawPath)
FUNCTION_WRAPPER_JS_2(CoordTransformOffset, CoordTransformOffset)
FUNCTION_WRAPPER_JS_0(GetTransform, GetTransform)
FUNCTION_WRAPPER_JS_1(CreateLayer, CreateLayer)
FUNCTION_WRAPPER_JS_0(BlendLayer, BlendLayer)
@end
class CGraphicsEmbedAdapter : public CJSEmbedObjectAdapterJSC

View File

@ -111,6 +111,8 @@ namespace NSGraphicsEmbed
FUNCTION_WRAPPER_V8_1(_DrawPath, DrawPath)
FUNCTION_WRAPPER_V8_2(_CoordTransformOffset, CoordTransformOffset)
FUNCTION_WRAPPER_V8_0(_GetTransform, GetTransform)
FUNCTION_WRAPPER_V8_1(_CreateLayer, CreateLayer)
FUNCTION_WRAPPER_V8_0(_BlendLayer, BlendLayer)
v8::Handle<v8::ObjectTemplate> CreateTemplate(v8::Isolate* isolate)
{
@ -221,6 +223,8 @@ namespace NSGraphicsEmbed
NSV8Objects::Template_Set(result, "DrawPath", _DrawPath);
NSV8Objects::Template_Set(result, "CoordTransformOffset", _CoordTransformOffset);
NSV8Objects::Template_Set(result, "GetTransform", _GetTransform);
NSV8Objects::Template_Set(result, "CreateLayer", _CreateLayer);
NSV8Objects::Template_Set(result, "BlendLayer", _BlendLayer);
return handle_scope.Escape(result);
}

View File

@ -1,5 +1,6 @@
#include "graphics.h"
#include "../common/Base64.h"
#include "../raster/Metafile/MetaFileCommon.h"
#include <string>
#include <iostream>
@ -1132,28 +1133,30 @@ namespace NSGraphics
}
std::string CGraphics::toDataURL(std::wstring type)
{
std::wstring sPath = NSFile::CFileBinary::CreateTempFileWithUniqueName(m_sApplicationImagesDirectory, L"img");
#ifdef _DEBUG
std::wcout << "toDataURL " << sPath << std::endl;
std::wcout << "toDataURL " << type << std::endl;
#endif
m_oFrame.SaveFile(sPath, _CXIMAGE_FORMAT_PNG);
std::wstring sFormat = (type.length() > 6) ? type.substr(6) : type;
NSFile::CFileBinary oReader;
if (oReader.OpenFile(sPath))
BYTE* pDataImage = NULL;
int nDataImageSize = 0;
int nImageFormat = _CXIMAGE_FORMAT_PNG;
if ((L"jpg" == sFormat) ||(L"jpeg" == sFormat))
nImageFormat = _CXIMAGE_FORMAT_JPG;
std::string sRes = "";
if (m_oFrame.Encode(pDataImage, nDataImageSize, nImageFormat))
{
DWORD dwFileSize = oReader.GetFileSize();
BYTE* pFileContent = new BYTE[dwFileSize];
DWORD dwReaded;
oReader.ReadFile(pFileContent, dwFileSize, dwReaded);
oReader.CloseFile();
NSFile::CFileBinary::Remove(sPath);
int nEncodeLen = NSBase64::Base64EncodeGetRequiredLength(dwFileSize);
BYTE* pImageData = new BYTE[nEncodeLen];
if (TRUE == NSBase64::Base64Encode(pFileContent, dwFileSize, pImageData, &nEncodeLen))
return "data:" + U_TO_UTF8(type) + ";base64, " + std::string((char*)pImageData, nEncodeLen);
char* cData64 = NULL;
int nData64Dst = 0;
if (NSFile::CBase64Converter::Encode(pDataImage, nDataImageSize, cData64, nData64Dst, NSBase64::B64_BASE64_FLAG_NOCRLF))
{
sRes = ("data:" + U_TO_UTF8(type) + ";base64," + std::string(cData64, nData64Dst));
}
RELEASEARRAYOBJECTS(cData64);
}
return "";
RELEASEARRAYOBJECTS(pDataImage);
return sRes;
}
CColor CGraphics::GetPenColor()
{
@ -1235,7 +1238,7 @@ namespace NSGraphics
pMetafile->GetBounds(&x, &y, &w, &h);
sName += L"png";
pMetafile->ConvertToRaster(sName.c_str(), 4, 1000);
MetaFile::ConvertToRasterMaxSize(pMetafile, sName.c_str(), 4, 1000);
RELEASEOBJECT(pMetafile);
}
@ -1371,4 +1374,14 @@ namespace NSGraphics
m_pRenderer->GetTransform(&oRes.sx, &oRes.shy, &oRes.shx, &oRes.sy, &oRes.tx, &oRes.ty);
return oRes;
}
void CGraphics::CreateLayer(double opacity)
{
m_pRenderer->BeginCommand(c_nLayerType);
m_pRenderer->put_LayerOpacity(opacity);
}
void CGraphics::BlendLayer()
{
m_pRenderer->EndCommand(c_nLayerType);
}
}

View File

@ -235,6 +235,10 @@ namespace NSGraphics
void DrawPath(int path);
void CoordTransformOffset(double tx, double ty);
CTransform GetTransform();
// layer
void CreateLayer(double opacity);
void BlendLayer();
};
}

View File

@ -65,14 +65,9 @@ namespace NSJSBase {
{
}
void CJSObject::set(const char* name, JSSmart<CJSValue> value)
{
this->set(name, value.GetPointer());
}
void CJSObject::set(const char* name, JSSmart<CJSObject> obj)
{
JSSmart<CJSValue> value = obj->toValue();
this->set(name, value.GetPointer());
this->set(name, obj->toValue());
}
CJSArray::CJSArray()

View File

@ -215,19 +215,22 @@ namespace NSJSBase
* Returns specified property of the object.
* @param name The name of a property.
*/
virtual JSSmart<CJSValue> get(const char* name) = 0;
virtual JSSmart<CJSValue> get(const char* name) = 0;
/**
* Sets a property of the object.
* @param name The name of a property.
* @param value The value of a property.
*/
virtual void set(const char* name, CJSValue* value) = 0;
virtual void set(const char* name, JSSmart<CJSValue> value) = 0;
virtual void set(const char* name, const int& value) = 0;
virtual void set(const char* name, const double& value) = 0;
// Common funcs
void set(const char* name, JSSmart<CJSValue> value);
// Common function
void set(const char* name, JSSmart<CJSObject> value);
/**
* Returns a vector containing the names of the properties of this object as strings, including properties from prototype objects.
*/
virtual std::vector<std::string> getPropertyNames() = 0;
/**
* Returns a pointer to the native embedded object.
*/
@ -269,8 +272,7 @@ namespace NSJSBase
* @param index The index of the array value.
* @param value The array value to be set.
*/
virtual void set(const int& index, CJSValue* value) = 0;
virtual void set(const int& index, const bool& value) = 0;
virtual void set(const int& index, JSSmart<CJSValue> value) = 0;
virtual void set(const int& index, const int& value) = 0;
virtual void set(const int& index, const double& value) = 0;
@ -278,7 +280,7 @@ namespace NSJSBase
* Add the specified value to the array.
* @param value The value to be added.
*/
virtual void add(CJSValue* value) = 0;
virtual void add(JSSmart<CJSValue> value) = 0;
/**
* Add null to the array.
*/
@ -493,6 +495,12 @@ namespace NSJSBase
* @return The pointer to resulted JS value after parsing.
*/
JSSmart<CJSValue> JSON_Parse(const char* json_content);
/**
* Creates a string that contains the JSON-serialized representation of a JS value.
* @param value The JS value to serialize.
* @return The string that contains the result of serialization, or empty string in case of errors.
*/
std::string JSON_Stringify(JSSmart<CJSValue> value);
/**
* Do not use this function. It is for internal needs.
* Associates current context with the specifed thread id.
@ -673,7 +681,7 @@ namespace NSJSBase
*
* NOTE: If you don't want to export certain functions from your embedded class for some reason,
* then add the inline comment "[noexport]" at the start of a function declaration.
* Also you can use `#ifdef ... #endif` blocks (see doctrenderer/test/internal/Embed.h for an example).
* Also you can use `#ifdef ... #endif` blocks (see doctrenderer/test/embed/external/Embed.h for an example).
*/
#endif // _CORE_EXT_JS_BASE_H_

View File

@ -12,25 +12,25 @@
namespace NSJSBase
{
class CJSContextPrivate
{
public:
JSContext* context;
std::vector<ASC_THREAD_ID> m_arThreads;
class CJSContextPrivate
{
public:
JSContext* context;
std::vector<ASC_THREAD_ID> m_arThreads;
public:
CJSContextPrivate()
{
context = nil;
}
~CJSContextPrivate()
{
context = nil;
}
public:
CJSContextPrivate()
{
context = nil;
}
~CJSContextPrivate()
{
context = nil;
}
static JSContext* GetCurrentContext();
static bool IsOldVersion();
};
static JSContext* GetCurrentContext();
static bool IsOldVersion();
};
// embed
id CreateEmbedNativeObject(NSString* name);
@ -38,495 +38,501 @@ namespace NSJSBase
namespace NSJSBase
{
template<typename T>
class CJSValueJSCTemplate : public T
{
public:
JSValue* value;
template <typename T>
class CJSValueJSCTemplate : public T
{
public:
JSValue* value;
CJSValueJSCTemplate()
{
value = nil;
}
CJSValueJSCTemplate(JSValue* _value)
{
value = _value;
}
CJSValueJSCTemplate()
{
value = nil;
}
CJSValueJSCTemplate(JSValue* _value)
{
value = _value;
}
public:
public:
virtual ~CJSValueJSCTemplate()
{
value = nil;
}
virtual ~CJSValueJSCTemplate()
{
value = nil;
}
virtual bool isUndefined();
virtual bool isNull();
virtual bool isBool();
virtual bool isNumber();
virtual bool isString();
virtual bool isArray();
virtual bool isTypedArray();
virtual bool isObject();
virtual bool isFunction();
virtual bool isEmpty();
virtual bool isUndefined();
virtual bool isNull();
virtual bool isBool();
virtual bool isNumber();
virtual bool isString();
virtual bool isArray();
virtual bool isTypedArray();
virtual bool isObject();
virtual bool isFunction();
virtual bool isEmpty();
virtual void doUndefined();
virtual void doNull();
virtual bool toBool();
virtual int toInt32();
virtual unsigned int toUInt32();
virtual double toDouble();
virtual std::string toStringA();
virtual std::wstring toStringW();
virtual void doUndefined();
virtual void doNull();
virtual bool toBool();
virtual int toInt32();
virtual unsigned int toUInt32();
virtual double toDouble();
virtual std::string toStringA();
virtual std::wstring toStringW();
virtual JSSmart<CJSObject> toObject();
virtual JSSmart<CJSArray> toArray();
virtual JSSmart<CJSTypedArray> toTypedArray();
virtual JSSmart<CJSFunction> toFunction();
JSContext* getContext()
{
if (nil == value || nil == value.context)
return CJSContextPrivate::GetCurrentContext();
return value.context;
}
};
JSContext* getContext()
{
if (nil == value || nil == value.context)
return CJSContextPrivate::GetCurrentContext();
return value.context;
}
};
typedef CJSValueJSCTemplate<CJSValue> CJSValueJSC;
typedef CJSValueJSCTemplate<CJSValue> CJSValueJSC;
class CJSObjectJSC : public CJSValueJSCTemplate<CJSObject>
{
public:
CJSObjectJSC()
{
}
CJSObjectJSC(JSValue* _value) : CJSValueJSCTemplate<CJSObject>(_value)
{
}
class CJSObjectJSC : public CJSValueJSCTemplate<CJSObject>
{
public:
CJSObjectJSC()
{
}
CJSObjectJSC(JSValue* _value) : CJSValueJSCTemplate<CJSObject>(_value)
{
}
virtual ~CJSObjectJSC()
{
value = nil;
}
virtual ~CJSObjectJSC()
{
value = nil;
}
virtual JSSmart<CJSValue> get(const char* name)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [value valueForProperty:[[NSString alloc] initWithUTF8String:name]];
return _value;
}
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [value valueForProperty:[[NSString alloc] initWithUTF8String:name]];
return _value;
}
virtual void set(const char* name, CJSValue* value_param)
{
CJSValueJSC* _value = static_cast<CJSValueJSC*>(value_param);
[value setValue:_value->value forProperty:[[NSString alloc] initWithUTF8String:name]];
}
virtual void set(const char* name, JSSmart<CJSValue> value_param)
{
CJSValueJSC* _value = static_cast<CJSValueJSC*>(value_param.GetPointer());
[value setValue:_value->value forProperty:[[NSString alloc] initWithUTF8String:name]];
}
virtual void set(const char* name, const int& _value)
{
[value setValue:[JSValue valueWithInt32:_value inContext: getContext()] forProperty:[[NSString alloc] initWithUTF8String:name]];
}
virtual void set(const char* name, const int& _value)
{
[value setValue:[JSValue valueWithInt32:_value inContext:getContext()] forProperty:[[NSString alloc] initWithUTF8String:name]];
}
virtual void set(const char* name, const double& _value)
{
[value setValue:[JSValue valueWithDouble:_value inContext: getContext()] forProperty:[[NSString alloc] initWithUTF8String:name]];
}
virtual void set(const char* name, const double& _value)
{
[value setValue:[JSValue valueWithDouble:_value inContext:getContext()] forProperty:[[NSString alloc] initWithUTF8String:name]];
}
virtual CJSEmbedObject* getNative()
{
id _wrapper = [value toObject];
if ([_wrapper conformsToProtocol:@protocol(JSEmbedObjectProtocol)])
{
return (CJSEmbedObject*)([_wrapper getNative]);
}
return NULL;
}
virtual std::vector<std::string> getPropertyNames()
{
NSArray* names = [[value toObject] allKeys];
uint32_t len = [names count];
virtual JSSmart<CJSValue> call_func(const char* name, const int argc = 0, JSSmart<CJSValue> argv[] = NULL)
{
NSMutableArray* arr = nil;
std::vector<std::string> ret(len);
for (uint32_t i = 0; i < len; i++)
{
NSString* name = [names objectAtIndex:i];
ret[i] = [name stdstring];
}
if (argc > 0)
{
arr = [[NSMutableArray alloc] init];
for (int i = 0; i < argc; ++i)
{
CJSValueJSC* _val = (CJSValueJSC*)argv[i].operator ->();
[arr addObject:_val->value];
}
}
return ret;
}
CJSValueJSC* _return = new CJSValueJSC();
_return->value = [value invokeMethod: [[NSString alloc] initWithUTF8String:name]
withArguments: arr];
virtual CJSEmbedObject* getNative()
{
id _wrapper = [value toObject];
if ([_wrapper conformsToProtocol:@protocol(JSEmbedObjectProtocol)])
{
return (CJSEmbedObject*)([_wrapper getNative]);
}
return NULL;
}
return _return;
}
virtual JSSmart<CJSValue> call_func(const char* name, const int argc = 0, JSSmart<CJSValue> argv[] = NULL)
{
NSMutableArray* arr = nil;
virtual JSSmart<CJSValue> toValue()
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = value;
//_value->value = [JSValue valueWithJSValueRef:[value JSValueRef] inContext:context];
return _value;
}
};
if (argc > 0)
{
arr = [[NSMutableArray alloc] init];
for (int i = 0; i < argc; ++i)
{
CJSValueJSC* _val = (CJSValueJSC*)argv[i].operator->();
[arr addObject:_val->value];
}
}
class CJSArrayJSC : public CJSValueJSCTemplate<CJSArray>
{
public:
int m_count;
public:
CJSArrayJSC()
{
m_count = 0;
}
virtual ~CJSArrayJSC()
{
value = nil;
}
CJSValueJSC* _return = new CJSValueJSC();
_return->value = [value invokeMethod:[[NSString alloc] initWithUTF8String:name] withArguments:arr];
virtual int getCount()
{
int nCount = 0;
JSValue* _ret = [value valueForProperty:@"length"];
if (nil != _ret && NO == [_ret isUndefined])
nCount = [_ret toInt32];
_ret = nil;
return nCount;
}
return _return;
}
virtual JSSmart<CJSValue> get(const int& index)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [value valueAtIndex:(NSUInteger)index];
return _value;
}
virtual JSSmart<CJSValue> toValue()
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = value;
//_value->value = [JSValue valueWithJSValueRef:[value JSValueRef] inContext:context];
return _value;
}
};
virtual void set(const int& index, CJSValue* value_param)
{
CJSValueJSC* _value = static_cast<CJSValueJSC*>(value_param);
[value setValue:_value->value atIndex:index];
}
class CJSArrayJSC : public CJSValueJSCTemplate<CJSArray>
{
public:
int m_count;
virtual void add(CJSValue* value_param)
{
set(getCount(), value_param);
}
public:
CJSArrayJSC()
{
m_count = 0;
}
virtual ~CJSArrayJSC()
{
value = nil;
}
virtual void set(const int& index, const bool& _value)
{
[value setValue:[JSValue valueWithBool:_value inContext : getContext()] atIndex:index];
}
virtual int getCount()
{
int nCount = 0;
JSValue* _ret = [value valueForProperty:@"length"];
if (nil != _ret && NO == [_ret isUndefined])
nCount = [_ret toInt32];
_ret = nil;
return nCount;
}
virtual void set(const int& index, const int& _value)
{
[value setValue:[JSValue valueWithInt32:_value inContext : getContext()] atIndex:index];
}
virtual JSSmart<CJSValue> get(const int& index)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [value valueAtIndex:(NSUInteger)index];
return _value;
}
virtual void set(const int& index, const double& _value)
{
[value setValue:[JSValue valueWithDouble:_value inContext : getContext()] atIndex:index];
}
virtual void set(const int& index, JSSmart<CJSValue> value_param)
{
CJSValueJSC* _value = static_cast<CJSValueJSC*>(value_param.GetPointer());
[value setValue:_value->value atIndex:index];
}
virtual void add_null()
{
[value setValue:[JSValue valueWithNullInContext:getContext()] atIndex:m_count++];
}
virtual void add(JSSmart<CJSValue> value_param)
{
set(getCount(), value_param);
}
virtual void add_undefined()
{
[value setValue:nil atIndex:m_count++];
}
virtual void set(const int& index, const int& _value)
{
[value setValue:[JSValue valueWithInt32:_value inContext:getContext()] atIndex:index];
}
virtual void add_bool(const bool& _value)
{
[value setValue:[JSValue valueWithBool:_value inContext : getContext()] atIndex:m_count++];
}
virtual void set(const int& index, const double& _value)
{
[value setValue:[JSValue valueWithDouble:_value inContext:getContext()] atIndex:index];
}
virtual void add_byte(const BYTE& _value)
{
[value setValue:[JSValue valueWithInt32:(int)_value inContext : getContext()] atIndex:m_count++];
}
virtual void add_null()
{
[value setValue:[JSValue valueWithNullInContext:getContext()] atIndex:m_count++];
}
virtual void add_int(const int& _value)
{
[value setValue:[JSValue valueWithInt32:_value inContext : getContext()] atIndex:m_count++];
}
virtual void add_undefined()
{
[value setValue:nil atIndex:m_count++];
}
virtual void add_double(const double& _value)
{
[value setValue:[JSValue valueWithDouble:_value inContext : getContext()] atIndex:m_count++];
}
virtual void add_bool(const bool& _value)
{
[value setValue:[JSValue valueWithBool:_value inContext:getContext()] atIndex:m_count++];
}
virtual void add_stringa(const std::string& _value)
{
[value setValue:[NSString stringWithAString:_value] atIndex:m_count++];
}
virtual void add_byte(const BYTE& _value)
{
[value setValue:[JSValue valueWithInt32:(int)_value inContext:getContext()] atIndex:m_count++];
}
virtual void add_string(const std::wstring& _value)
{
[value setValue:[NSString stringWithWString:_value] atIndex:m_count++];
}
virtual void add_int(const int& _value)
{
[value setValue:[JSValue valueWithInt32:_value inContext:getContext()] atIndex:m_count++];
}
virtual JSSmart<CJSValue> toValue()
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = value;
return _value;
}
};
virtual void add_double(const double& _value)
{
[value setValue:[JSValue valueWithDouble:_value inContext:getContext()] atIndex:m_count++];
}
class CJSTypedArrayJSC : public CJSValueJSCTemplate<CJSTypedArray>
{
public:
CJSTypedArrayJSC(JSContext* _context, BYTE* data = NULL, int count = 0, const bool& isExternalize = true)
{
if (0 >= count)
return;
virtual void add_stringa(const std::string& _value)
{
[value setValue:[NSString stringWithAString:_value] atIndex:m_count++];
}
if (!CJSContextPrivate::IsOldVersion())
{
JSObjectRef object = JSObjectMakeTypedArrayWithBytesNoCopy(_context.JSGlobalContextRef,
kJSTypedArrayTypeUint8Array,
(void*)data, (size_t)count,
isExternalize ? data_no_destroy_memory : data_destroy_memory,
nullptr, nullptr);
if (object)
{
value = [JSValue valueWithJSValueRef:object inContext:_context];
}
}
else
{
char* pDst = NULL;
int nDstLen = 0;
NSFile::CBase64Converter::Encode(data, count, pDst, nDstLen, NSBase64::B64_BASE64_FLAG_NOCRLF);
virtual void add_string(const std::wstring& _value)
{
[value setValue:[NSString stringWithWString:_value] atIndex:m_count++];
}
std::string sCode = "jsc_fromBase64(\"" + std::string(pDst, nDstLen) + "\", " + std::to_string(count) + ");";
RELEASEARRAYOBJECTS(pDst);
value = [_context evaluateScript:[NSString stringWithAString:sCode]];
}
}
virtual ~CJSTypedArrayJSC()
{
value = nil;
}
virtual JSSmart<CJSValue> toValue()
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = value;
return _value;
}
};
static void data_destroy_memory(void* bytes, void* deallocatorContext)
{
NSJSBase::NSAllocator::Free((unsigned char*)bytes, 0);
}
static void data_no_destroy_memory(void* bytes, void* deallocatorContext)
{
}
class CJSTypedArrayJSC : public CJSValueJSCTemplate<CJSTypedArray>
{
public:
CJSTypedArrayJSC(JSContext* _context, BYTE* data = NULL, int count = 0, const bool& isExternalize = true)
{
if (0 >= count)
return;
virtual int getCount()
{
if (nil == value)
return 0;
JSContext* context = getContext();
if (!CJSContextPrivate::IsOldVersion())
{
JSObjectRef obj = JSValueToObject(context.JSGlobalContextRef, value.JSValueRef, NULL);
return (int)JSObjectGetTypedArrayByteLength(context.JSGlobalContextRef, obj, NULL);
}
int nCount = 0;
JSValue* _ret = [value valueForProperty:@"length"];
if (nil != _ret && NO == [_ret isUndefined])
nCount = [_ret toInt32];
_ret = nil;
return nCount;
}
if (!CJSContextPrivate::IsOldVersion())
{
JSObjectRef object = JSObjectMakeTypedArrayWithBytesNoCopy(
_context.JSGlobalContextRef, kJSTypedArrayTypeUint8Array, (void*)data, (size_t)count, isExternalize ? data_no_destroy_memory : data_destroy_memory, nullptr, nullptr);
if (object)
{
value = [JSValue valueWithJSValueRef:object inContext:_context];
}
}
else
{
char* pDst = NULL;
int nDstLen = 0;
NSFile::CBase64Converter::Encode(data, count, pDst, nDstLen, NSBase64::B64_BASE64_FLAG_NOCRLF);
virtual CJSDataBuffer getData()
{
JSContext* context = getContext();
CJSDataBuffer buffer;
if (!CJSContextPrivate::IsOldVersion())
{
JSObjectRef obj = JSValueToObject(context.JSGlobalContextRef, value.JSValueRef, NULL);
buffer.IsExternalize = false;
buffer.Data = (BYTE*)JSObjectGetTypedArrayBytesPtr(context.JSGlobalContextRef, obj, NULL);
buffer.Len = (size_t)JSObjectGetTypedArrayByteLength(context.JSGlobalContextRef, obj, NULL);
return buffer;
}
std::string sCode = "jsc_fromBase64(\"" + std::string(pDst, nDstLen) + "\", " + std::to_string(count) + ");";
RELEASEARRAYOBJECTS(pDst);
value = [_context evaluateScript:[NSString stringWithAString:sCode]];
}
}
virtual ~CJSTypedArrayJSC()
{
value = nil;
}
NSMutableArray* arr = [[NSMutableArray alloc] init];
[arr addObject:value];
static void data_destroy_memory(void* bytes, void* deallocatorContext)
{
NSJSBase::NSAllocator::Free((unsigned char*)bytes, 0);
}
static void data_no_destroy_memory(void* bytes, void* deallocatorContext)
{
}
JSValue* dataBase64 = [context[@"jsc_toBase64"] callWithArguments:arr];
std::string sBase64Data = [[dataBase64 toString] stdstring];
dataBase64 = nil;
virtual int getCount()
{
if (nil == value)
return 0;
JSContext* context = getContext();
if (!CJSContextPrivate::IsOldVersion())
{
JSObjectRef obj = JSValueToObject(context.JSGlobalContextRef, value.JSValueRef, NULL);
return (int)JSObjectGetTypedArrayByteLength(context.JSGlobalContextRef, obj, NULL);
}
int nCount = 0;
JSValue* _ret = [value valueForProperty:@"length"];
if (nil != _ret && NO == [_ret isUndefined])
nCount = [_ret toInt32];
_ret = nil;
return nCount;
}
buffer.IsExternalize = true;
virtual CJSDataBuffer getData()
{
JSContext* context = getContext();
CJSDataBuffer buffer;
if (!CJSContextPrivate::IsOldVersion())
{
JSObjectRef obj = JSValueToObject(context.JSGlobalContextRef, value.JSValueRef, NULL);
buffer.IsExternalize = false;
buffer.Data = (BYTE*)JSObjectGetTypedArrayBytesPtr(context.JSGlobalContextRef, obj, NULL);
buffer.Len = (size_t)JSObjectGetTypedArrayByteLength(context.JSGlobalContextRef, obj, NULL);
return buffer;
}
int nLenDst = NSBase64::Base64DecodeGetRequiredLength((int)sBase64Data.length());
buffer.Data = NSAllocator::Alloc(nLenDst);
NSMutableArray* arr = [[NSMutableArray alloc] init];
[arr addObject:value];
if (FALSE == NSBase64::Base64Decode(sBase64Data.c_str(), (int)sBase64Data.length(), buffer.Data, &nLenDst))
{
buffer.Free();
return buffer;
}
return buffer;
}
JSValue* dataBase64 = [context[@"jsc_toBase64"] callWithArguments:arr];
std::string sBase64Data = [[dataBase64 toString] stdstring];
dataBase64 = nil;
virtual JSSmart<CJSValue> toValue()
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = value;
return _value;
}
};
buffer.IsExternalize = true;
class CJSFunctionJSC : public CJSValueJSCTemplate<CJSFunction>
{
public:
CJSFunctionJSC()
{
}
virtual ~CJSFunctionJSC()
{
value = nil;
}
int nLenDst = NSBase64::Base64DecodeGetRequiredLength((int)sBase64Data.length());
buffer.Data = NSAllocator::Alloc(nLenDst);
if (FALSE == NSBase64::Base64Decode(sBase64Data.c_str(), (int)sBase64Data.length(), buffer.Data, &nLenDst))
{
buffer.Free();
return buffer;
}
return buffer;
}
virtual JSSmart<CJSValue> toValue()
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = value;
return _value;
}
};
class CJSFunctionJSC : public CJSValueJSCTemplate<CJSFunction>
{
public:
CJSFunctionJSC()
{
}
virtual ~CJSFunctionJSC()
{
value = nil;
}
virtual JSSmart<CJSValue> Call(CJSValue* recv, int argc, JSSmart<CJSValue> argv[])
{
NSMutableArray* arr = [[NSMutableArray alloc] init];
for (int i = 0; i < argc; ++i)
{
CJSValueJSC* _val = (CJSValueJSC*)argv[i].operator ->();
[arr addObject:_val->value];
}
{
NSMutableArray* arr = [[NSMutableArray alloc] init];
for (int i = 0; i < argc; ++i)
{
CJSValueJSC* _val = (CJSValueJSC*)argv[i].operator->();
[arr addObject:_val->value];
}
CJSValueJSC* _return = new CJSValueJSC();
_return->value = [value callWithArguments:arr];
CJSValueJSC* _return = new CJSValueJSC();
_return->value = [value callWithArguments:arr];
return _return;
}
};
return _return;
}
};
template<typename T>
template <typename T>
JSSmart<CJSObject> CJSValueJSCTemplate<T>::toObject()
{
CJSObjectJSC* _value = new CJSObjectJSC();
_value->value = value;
return _value;
}
{
CJSObjectJSC* _value = new CJSObjectJSC();
_value->value = value;
return _value;
}
template<typename T>
template <typename T>
JSSmart<CJSArray> CJSValueJSCTemplate<T>::toArray()
{
CJSArrayJSC* _value = new CJSArrayJSC();
_value->value = value;
return _value;
}
{
CJSArrayJSC* _value = new CJSArrayJSC();
_value->value = value;
return _value;
}
template<typename T>
template <typename T>
JSSmart<CJSTypedArray> CJSValueJSCTemplate<T>::toTypedArray()
{
CJSTypedArrayJSC* _value = new CJSTypedArrayJSC(getContext());
_value->value = value;
return _value;
}
{
CJSTypedArrayJSC* _value = new CJSTypedArrayJSC(getContext());
_value->value = value;
return _value;
}
template<typename T>
template <typename T>
JSSmart<CJSFunction> CJSValueJSCTemplate<T>::toFunction()
{
CJSFunctionJSC* _value = new CJSFunctionJSC();
_value->value = value;
return _value;
}
}
{
CJSFunctionJSC* _value = new CJSFunctionJSC();
_value->value = value;
return _value;
}
} // namespace NSJSBase
namespace NSJSBase
{
// TRY - CATCH
class CJSCTryCatch : public CJSTryCatch
{
public:
JSContext* context;
// TRY - CATCH
class CJSCTryCatch : public CJSTryCatch
{
public:
JSContext* context;
public:
CJSCTryCatch() : CJSTryCatch()
{
context = CJSContextPrivate::GetCurrentContext();
}
virtual ~CJSCTryCatch()
{
context = nil;
}
public:
CJSCTryCatch() : CJSTryCatch()
{
context = CJSContextPrivate::GetCurrentContext();
}
virtual ~CJSCTryCatch()
{
context = nil;
}
public:
virtual bool Check();
};
public:
virtual bool Check();
};
}
inline JSSmart<NSJSBase::CJSValue> js_value(JSValue* _value)
{
return new NSJSBase::CJSValueJSC(_value);
return new NSJSBase::CJSValueJSC(_value);
}
inline JSSmart<NSJSBase::CJSValue> js_object(JSValue* _value)
{
return new NSJSBase::CJSObjectJSC(_value);
return new NSJSBase::CJSObjectJSC(_value);
}
inline JSValue* js_return(JSSmart<NSJSBase::CJSValue> _value)
{
if (!_value.is_init())
return nil;
NSJSBase::CJSValueJSC* _tmp = (NSJSBase::CJSValueJSC*)(_value.operator ->());
return _tmp->value;
if (!_value.is_init())
return nil;
NSJSBase::CJSValueJSC* _tmp = (NSJSBase::CJSValueJSC*)(_value.operator->());
return _tmp->value;
}
#define FUNCTION_WRAPPER_JS_0(NAME, NAME_EMBED) \
-(JSValue*) NAME \
{ \
return js_return(m_internal->NAME_EMBED()); \
}
#define FUNCTION_WRAPPER_JS_0(NAME, NAME_EMBED) \
-(JSValue*)NAME \
{ \
return js_return(m_internal->NAME_EMBED()); \
}
#define FUNCTION_WRAPPER_JS(NAME, NAME_EMBED) FUNCTION_WRAPPER_JS_0(NAME, NAME_EMBED)
#define FUNCTION_WRAPPER_JS_1(NAME, NAME_EMBED) \
-(JSValue*) NAME:(JSValue*)p1 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1))); \
}
#define FUNCTION_WRAPPER_JS_2(NAME, NAME_EMBED) \
-(JSValue*) NAME:(JSValue*)p1 : (JSValue*)p2 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2))); \
}
#define FUNCTION_WRAPPER_JS_3(NAME, NAME_EMBED) \
-(JSValue*) NAME:(JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3))); \
}
#define FUNCTION_WRAPPER_JS_4(NAME, NAME_EMBED) \
-(JSValue*) NAME:(JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4))); \
}
#define FUNCTION_WRAPPER_JS_5(NAME, NAME_EMBED) \
-(JSValue*) NAME:(JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 : (JSValue*)p5 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4), js_value(p5))); \
}
#define FUNCTION_WRAPPER_JS_6(NAME, NAME_EMBED) \
-(JSValue*) NAME:(JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 : (JSValue*)p5 : (JSValue*)p6 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4), js_value(p5), js_value(p6))); \
}
#define FUNCTION_WRAPPER_JS_7(NAME, NAME_EMBED) \
-(JSValue*) NAME:(JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 : (JSValue*)p5 : (JSValue*)p6 : (JSValue*)p7 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4), js_value(p5), js_value(p6), js_value(p7))); \
}
#define FUNCTION_WRAPPER_JS_8(NAME, NAME_EMBED) \
-(JSValue*) NAME:(JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 : (JSValue*)p5 : (JSValue*)p6 : (JSValue*)p7 : (JSValue*)p8 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4), js_value(p5), js_value(p6), js_value(p7), js_value(p8))); \
}
#define FUNCTION_WRAPPER_JS_1(NAME, NAME_EMBED) \
-(JSValue*)NAME : (JSValue*)p1 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1))); \
}
#define FUNCTION_WRAPPER_JS_2(NAME, NAME_EMBED) \
-(JSValue*)NAME : (JSValue*)p1 : (JSValue*)p2 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2))); \
}
#define FUNCTION_WRAPPER_JS_3(NAME, NAME_EMBED) \
-(JSValue*)NAME : (JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3))); \
}
#define FUNCTION_WRAPPER_JS_4(NAME, NAME_EMBED) \
-(JSValue*)NAME : (JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4))); \
}
#define FUNCTION_WRAPPER_JS_5(NAME, NAME_EMBED) \
-(JSValue*)NAME : (JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 : (JSValue*)p5 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4), js_value(p5))); \
}
#define FUNCTION_WRAPPER_JS_6(NAME, NAME_EMBED) \
-(JSValue*)NAME : (JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 : (JSValue*)p5 : (JSValue*)p6 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4), js_value(p5), js_value(p6))); \
}
#define FUNCTION_WRAPPER_JS_7(NAME, NAME_EMBED) \
-(JSValue*)NAME : (JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 : (JSValue*)p5 : (JSValue*)p6 : (JSValue*)p7 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4), js_value(p5), js_value(p6), js_value(p7))); \
}
#define FUNCTION_WRAPPER_JS_8(NAME, NAME_EMBED) \
-(JSValue*)NAME : (JSValue*)p1 : (JSValue*)p2 : (JSValue*)p3 : (JSValue*)p4 : (JSValue*)p5 : (JSValue*)p6 : (JSValue*)p7 : (JSValue*)p8 \
{ \
return js_return(m_internal->NAME_EMBED(js_value(p1), js_value(p2), js_value(p3), js_value(p4), js_value(p5), js_value(p6), js_value(p7), js_value(p8))); \
}
#endif // _BUILD_NATIVE_CONTROL_JSC_BASE_H_

View File

@ -6,436 +6,456 @@ using namespace NSJSBase;
class CGlobalContext
{
private:
// считаем, что vector будет небольшим, поэтому он будет быстрее, чем map
std::vector<std::pair<ASC_THREAD_ID, CJSContextPrivate*>> m_contexts;
bool m_bIsOldVersion;
// считаем, что vector будет небольшим, поэтому он будет быстрее, чем map
std::vector<std::pair<ASC_THREAD_ID, CJSContextPrivate*>> m_contexts;
bool m_bIsOldVersion;
CGlobalContext()
{
m_bIsOldVersion = false;
#ifndef _IOS
if (@available(macOS 10.12, *))
{
// none
}
else
{
m_bIsOldVersion = true;
}
#endif
}
~CGlobalContext()
{
for (std::vector<std::pair<ASC_THREAD_ID, CJSContextPrivate*>>::iterator i = m_contexts.begin(); i != m_contexts.end(); i++)
{
CJSContextPrivate* ctx = i->second;
delete ctx;
}
m_contexts.clear();
}
CGlobalContext()
{
m_bIsOldVersion = false;
#ifndef _IOS
if (@available(macOS 10.12, *))
{
// none
}
else
{
m_bIsOldVersion = true;
}
#endif
}
~CGlobalContext()
{
for (std::vector<std::pair<ASC_THREAD_ID, CJSContextPrivate*>>::iterator i = m_contexts.begin(); i != m_contexts.end(); i++)
{
CJSContextPrivate* ctx = i->second;
delete ctx;
}
m_contexts.clear();
}
public:
bool RegisterContext(CJSContextPrivate* ctx, ASC_THREAD_ID* id = NULL)
{
ASC_THREAD_ID nCurrentThread = (id == NULL) ? NSThreads::GetCurrentThreadId() : *id;
for (std::vector<std::pair<ASC_THREAD_ID, CJSContextPrivate*>>::const_iterator i = m_contexts.begin(); i != m_contexts.end(); i++)
{
if (i->first == nCurrentThread)
{
return false;
}
}
bool RegisterContext(CJSContextPrivate* ctx, ASC_THREAD_ID* id = NULL)
{
ASC_THREAD_ID nCurrentThread = (id == NULL) ? NSThreads::GetCurrentThreadId() : *id;
for (std::vector<std::pair<ASC_THREAD_ID, CJSContextPrivate*>>::const_iterator i = m_contexts.begin(); i != m_contexts.end(); i++)
{
if (i->first == nCurrentThread)
{
return false;
}
}
CJSContextPrivate* pContext = new CJSContextPrivate();
pContext->context = ctx->context;
m_contexts.push_back(std::pair<ASC_THREAD_ID, CJSContextPrivate*>(nCurrentThread, pContext));
return true;
}
void UnregisterContextForId(ASC_THREAD_ID nCurrentThread)
{
for (std::vector<std::pair<ASC_THREAD_ID, CJSContextPrivate*>>::iterator i = m_contexts.begin(); i != m_contexts.end(); i++)
{
if (i->first == nCurrentThread)
{
CJSContextPrivate* ctx = i->second;
delete ctx;
CJSContextPrivate* pContext = new CJSContextPrivate();
pContext->context = ctx->context;
m_contexts.push_back(std::pair<ASC_THREAD_ID, CJSContextPrivate*>(nCurrentThread, pContext));
return true;
}
void UnregisterContextForId(ASC_THREAD_ID nCurrentThread)
{
for (std::vector<std::pair<ASC_THREAD_ID, CJSContextPrivate*>>::iterator i = m_contexts.begin(); i != m_contexts.end(); i++)
{
if (i->first == nCurrentThread)
{
CJSContextPrivate* ctx = i->second;
delete ctx;
m_contexts.erase(i);
return;
}
}
}
void UnregisterContext()
{
UnregisterContextForId(NSThreads::GetCurrentThreadId());
}
m_contexts.erase(i);
return;
}
}
}
void UnregisterContext()
{
UnregisterContextForId(NSThreads::GetCurrentThreadId());
}
bool IsOldVersion()
{
return m_bIsOldVersion;
}
bool IsOldVersion()
{
return m_bIsOldVersion;
}
JSContext* GetCurrent()
{
ASC_THREAD_ID nCurrentThread = NSThreads::GetCurrentThreadId();
for (std::vector<std::pair<ASC_THREAD_ID, CJSContextPrivate*>>::const_iterator i = m_contexts.begin(); i != m_contexts.end(); i++)
{
if (i->first == nCurrentThread)
{
return i->second->context;
}
}
return [JSContext currentContext];
}
JSContext* GetCurrent()
{
ASC_THREAD_ID nCurrentThread = NSThreads::GetCurrentThreadId();
for (std::vector<std::pair<ASC_THREAD_ID, CJSContextPrivate*>>::const_iterator i = m_contexts.begin(); i != m_contexts.end(); i++)
{
if (i->first == nCurrentThread)
{
return i->second->context;
}
}
return [JSContext currentContext];
}
static CGlobalContext& GetInstance()
{
static CGlobalContext instance;
return instance;
}
static CGlobalContext& GetInstance()
{
static CGlobalContext instance;
return instance;
}
};
JSContext* CJSContextPrivate::GetCurrentContext()
{
return CGlobalContext::GetInstance().GetCurrent();
return CGlobalContext::GetInstance().GetCurrent();
}
bool CJSContextPrivate::IsOldVersion()
{
return CGlobalContext::GetInstance().IsOldVersion();
return CGlobalContext::GetInstance().IsOldVersion();
}
template<typename T>
template <typename T>
bool CJSValueJSCTemplate<T>::isUndefined()
{
return (value == nil) ? true : ([value isUndefined] == YES);
return (value == nil) ? true : ([value isUndefined] == YES);
}
template<typename T>
template <typename T>
bool CJSValueJSCTemplate<T>::isNull()
{
return (value == nil) ? false : ([value isNull] == YES);
return (value == nil) ? false : ([value isNull] == YES);
}
template<typename T>
template <typename T>
bool CJSValueJSCTemplate<T>::isBool()
{
return (value == nil) ? false : ([value isBoolean] == YES);
return (value == nil) ? false : ([value isBoolean] == YES);
}
template<typename T>
template <typename T>
bool CJSValueJSCTemplate<T>::isNumber()
{
return (value == nil) ? false : ([value isNumber] == YES);
return (value == nil) ? false : ([value isNumber] == YES);
}
template<typename T>
template <typename T>
bool CJSValueJSCTemplate<T>::isString()
{
return (value == nil) ? false : ([value isString] == YES);
return (value == nil) ? false : ([value isString] == YES);
}
template<typename T>
template <typename T>
bool CJSValueJSCTemplate<T>::isArray()
{
return (value == nil) ? false : JSValueIsArray(getContext().JSGlobalContextRef, value.JSValueRef);
return (value == nil) ? false : JSValueIsArray(getContext().JSGlobalContextRef, value.JSValueRef);
}
template<typename T>
template <typename T>
bool CJSValueJSCTemplate<T>::isTypedArray()
{
return (value == nil) ? false : (kJSTypedArrayTypeNone != JSValueGetTypedArrayType(getContext().JSGlobalContextRef, value.JSValueRef, NULL));
return (value == nil) ? false : (kJSTypedArrayTypeNone != JSValueGetTypedArrayType(getContext().JSGlobalContextRef, value.JSValueRef, NULL));
}
template<typename T>
template <typename T>
bool CJSValueJSCTemplate<T>::isObject()
{
return (value == nil) ? false : ([value isObject] == YES);
return (value == nil) ? false : ([value isObject] == YES);
}
template<typename T>
template <typename T>
bool CJSValueJSCTemplate<T>::isFunction()
{
return isObject();
return isObject();
}
template<typename T>
template <typename T>
bool CJSValueJSCTemplate<T>::isEmpty()
{
return (value == nil) ? true : false;
return (value == nil) ? true : false;
}
template<typename T>
template <typename T>
void CJSValueJSCTemplate<T>::doUndefined()
{
value = [JSValue valueWithUndefinedInContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
value = [JSValue valueWithUndefinedInContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
}
template<typename T>
template <typename T>
void CJSValueJSCTemplate<T>::doNull()
{
value = [JSValue valueWithNullInContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
value = [JSValue valueWithNullInContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
}
template<typename T>
template <typename T>
bool CJSValueJSCTemplate<T>::toBool()
{
return ([value toBool] == YES) ? true : false;
return ([value toBool] == YES) ? true : false;
}
template<typename T>
template <typename T>
int CJSValueJSCTemplate<T>::toInt32()
{
return [value toInt32];
return [value toInt32];
}
template<typename T>
template <typename T>
unsigned int CJSValueJSCTemplate<T>::toUInt32()
{
return [value toUInt32];
return [value toUInt32];
}
template<typename T>
template <typename T>
double CJSValueJSCTemplate<T>::toDouble()
{
return [value toDouble];
return [value toDouble];
}
template<typename T>
template <typename T>
std::string CJSValueJSCTemplate<T>::toStringA()
{
return [[value toString] stdstring];
return [[value toString] stdstring];
}
template<typename T>
template <typename T>
std::wstring CJSValueJSCTemplate<T>::toStringW()
{
return [[value toString] stdwstring];
return [[value toString] stdwstring];
}
namespace NSJSBase
{
CJSContext::CJSContext(const bool& bIsInitialize)
{
m_internal = new CJSContextPrivate();
if (bIsInitialize)
Initialize();
}
CJSContext::~CJSContext()
{
m_internal->context = nil;
RELEASEOBJECT(m_internal);
}
CJSContext::CJSContext(const bool& bIsInitialize)
{
m_internal = new CJSContextPrivate();
if (bIsInitialize)
Initialize();
}
CJSContext::~CJSContext()
{
if (m_internal->context)
Dispose();
RELEASEOBJECT(m_internal);
}
JSSmart<CJSTryCatch> CJSContext::GetExceptions()
{
return new CJSCTryCatch();
}
{
return new CJSCTryCatch();
}
void CJSContext::Initialize()
{
m_internal->context = [[JSContext alloc] init];
void CJSContext::Initialize()
{
m_internal->context = [[JSContext alloc] init];
ASC_THREAD_ID nThreadId = NSThreads::GetCurrentThreadId();
MoveToThread(&nThreadId);
if (CGlobalContext::GetInstance().IsOldVersion())
{
[m_internal->context evaluateScript:@"function jsc_toBase64(r){for(var o=[\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",\"K\",\"L\",\"M\",\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",\"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\",\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\",\"h\",\"i\",\"j\",\"k\",\"l\",\"m\",\"n\",\"o\",\"p\",\"q\",\"r\",\"s\",\"t\",\"u\",\"v\",\"w\",\"x\",\"y\",\"z\",\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"+\",\"/\"],a=r.length,f=4*(a/3>>0),n=f/76>>0,t=19,v=0,e=[],i=\"\",s=0;s<=n;s++){s==n&&(t=f%76/4>>0);for(var u=0;u<t;u++){for(var c=0,h=0;h<3;h++)c|=r[0+v++],c<<=8;i=\"\";for(var A=0;A<4;A++){i+=o[c>>>26&255],c<<=6,c&=4294967295}e.push(i)}}if(n=a%3!=0?a%3+1:0){for(c=0,h=0;h<3;h++)h<a%3&&(c|=r[0+v++]),c<<=8;i=\"\";for(A=0;A<n;A++){i+=o[c>>>26&255],c<<=6}t=0!=n?4-n:0;for(u=0;u<t;u++)i+=\"=\";e.push(i)}return e.join(\"\")}function jsc_fromBase64(r,o){for(var a,f=r.length,n=0,t=new Array(void 0===o?f:o),v=t,e=0,i=0;e<f;){for(var s=0,u=0,c=0;c<4&&!(f<=e);c++){var h=65<=(a=r.charCodeAt(e++))&&a<=90?a-65:97<=a&&a<=122?a-71:48<=a&&a<=57?a+4:43==a?62:47==a?63:-1;-1!=h?(s<<=6,s|=h,u+=6):c--}for(s<<=24-u,i=u>>>3,c=0;c<i;c++)v[n++]=(16711680&s)>>>16,s<<=8}return t}\n"];
}
ASC_THREAD_ID nThreadId = NSThreads::GetCurrentThreadId();
MoveToThread(&nThreadId);
if (CGlobalContext::GetInstance().IsOldVersion())
{
[m_internal->context evaluateScript:@"function jsc_toBase64(r){for(var o=[\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",\"K\",\"L\",\"M\",\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",\"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\",\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\",\"h\",\"i\",\"j\",\"k\",\"l\",\"m\",\"n\",\"o\",\"p\",\"q\",\"r\",\"s\",\"t\",\"u\",\"v\",\"w\",\"x\",\"y\",\"z\",\"0\",\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\",\"9\",\"+\",\"/\"],a=r.length,f=4*(a/3>>0),n=f/76>>0,t=19,v=0,e=[],i=\"\",s=0;s<=n;s++){s==n&&(t=f%76/4>>0);for(var u=0;u<t;u++){for(var c=0,h=0;h<3;h++)c|=r[0+v++],c<<=8;i=\"\";for(var A=0;A<4;A++){i+=o[c>>>26&255],c<<=6,c&=4294967295}e.push(i)}}if(n=a%3!=0?a%3+1:0){for(c=0,h=0;h<3;h++)h<a%3&&(c|=r[0+v++]),c<<=8;i=\"\";for(A=0;A<n;A++){i+=o[c>>>26&255],c<<=6}t=0!=n?4-n:0;for(u=0;u<t;u++)i+=\"=\";e.push(i)}return e.join(\"\")}function jsc_fromBase64(r,o){for(var a,f=r.length,n=0,t=new Array(void 0===o?f:o),v=t,e=0,i=0;e<f;){for(var s=0,u=0,c=0;c<4&&!(f<=e);c++){var h=65<=(a=r.charCodeAt(e++))&&a<=90?a-65:97<=a&&a<=122?a-71:48<=a&&a<=57?a+4:43==a?62:47==a?63:-1;-1!=h?(s<<=6,s|=h,u+=6):c--}for(s<<=24-u,i=u>>>3,c=0;c<i;c++)v[n++]=(16711680&s)>>>16,s<<=8}return t}\n"];
}
// insert CreateEmbedObject() function to global object of this context
m_internal->context[@"CreateEmbedObject"] = ^(NSString* name) {
return CreateEmbedNativeObject(name);
};
JSValue* global_js = [m_internal->context globalObject];
[global_js setValue:global_js forProperty:[[NSString alloc] initWithUTF8String:"window"]];
}
void CJSContext::Dispose()
{
for (std::vector<ASC_THREAD_ID>::const_iterator i = m_internal->m_arThreads.begin(); i != m_internal->m_arThreads.end(); i++)
{
CGlobalContext::GetInstance().UnregisterContextForId(*i);
}
m_internal->context = nil;
}
JSValue* global_js = [m_internal->context globalObject];
[global_js setValue:global_js forProperty:[[NSString alloc] initWithUTF8String:"window"]];
}
void CJSContext::Dispose()
{
for (std::vector<ASC_THREAD_ID>::const_iterator i = m_internal->m_arThreads.begin(); i != m_internal->m_arThreads.end(); i++)
{
CGlobalContext::GetInstance().UnregisterContextForId(*i);
}
m_internal->context = nil;
}
JSSmart<CJSObject> CJSContext::GetGlobal()
{
CJSObjectJSC* ret = new CJSObjectJSC();
ret->value = [m_internal->context globalObject];
return ret;
}
{
CJSObjectJSC* ret = new CJSObjectJSC();
ret->value = [m_internal->context globalObject];
return ret;
}
CJSValue* CJSContext::createUndefined()
{
CJSValueJSC* _value = new CJSValueJSC();
_value->doUndefined();
return _value;
}
CJSValue* CJSContext::createUndefined()
{
CJSValueJSC* _value = new CJSValueJSC();
_value->doUndefined();
return _value;
}
CJSValue* CJSContext::createNull()
{
CJSValueJSC* _value = new CJSValueJSC();
_value->doNull();
return _value;
}
CJSValue* CJSContext::createNull()
{
CJSValueJSC* _value = new CJSValueJSC();
_value->doNull();
return _value;
}
CJSValue* CJSContext::createBool(const bool& value)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [JSValue valueWithBool:(value ? YES : NO) inContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSValue* CJSContext::createBool(const bool& value)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [JSValue valueWithBool:(value ? YES : NO) inContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSValue* CJSContext::createInt(const int& value)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [JSValue valueWithInt32:((int32_t) value) inContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSValue* CJSContext::createInt(const int& value)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [JSValue valueWithInt32:((int32_t)value) inContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSValue* CJSContext::createUInt(const unsigned int& value)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [JSValue valueWithUInt32:((uint32_t) value) inContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSValue* CJSContext::createUInt(const unsigned int& value)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [JSValue valueWithUInt32:((uint32_t)value) inContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSValue* CJSContext::createDouble(const double& value)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [JSValue valueWithDouble:value inContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSValue* CJSContext::createDouble(const double& value)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [JSValue valueWithDouble:value inContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSValue* CJSContext::createString(const char* value, const int& len)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [NSString stringWithUtf8Buffer:value length:(size_t)((len == -1) ? strlen(value) : len)];
return _value;
}
CJSValue* CJSContext::createString(const char* value, const int& len)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [JSValue valueWithObject:[NSString stringWithUtf8Buffer:value length:(size_t)((len == -1) ? strlen(value) : len)] inContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSValue* CJSContext::createString(const wchar_t* value, const int& length)
{
std::string sUtf8 = NSFile::CUtf8Converter::GetUtf8StringFromUnicode2(value, (length != -1) ? (LONG)length : (LONG)wcslen(value));
return createString((const char*)sUtf8.c_str(), (int)sUtf8.length());
}
CJSValue* CJSContext::createString(const wchar_t* value, const int& length)
{
std::string sUtf8 = NSFile::CUtf8Converter::GetUtf8StringFromUnicode2(value, (length != -1) ? (LONG)length : (LONG)wcslen(value));
return createString((const char*)sUtf8.c_str(), (int)sUtf8.length());
}
CJSValue* CJSContext::createString(const std::string& value)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [NSString stringWithAString:value];
return _value;
}
CJSValue* CJSContext::createString(const std::string& value)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [JSValue valueWithObject:[NSString stringWithAString:value] inContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSValue* CJSContext::createString(const std::wstring& value)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [NSString stringWithWString:value];
return _value;
}
CJSValue* CJSContext::createString(const std::wstring& value)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [JSValue valueWithObject:[NSString stringWithWString:value] inContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSObject* CJSContext::createObject()
{
CJSObjectJSC* _value = new CJSObjectJSC();
_value->value = [JSValue valueWithNewObjectInContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSObject* CJSContext::createObject()
{
CJSObjectJSC* _value = new CJSObjectJSC();
_value->value = [JSValue valueWithNewObjectInContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSArray* CJSContext::createArray(const int& count)
{
CJSArrayJSC* _value = new CJSArrayJSC();
_value->value = [JSValue valueWithNewArrayInContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSArray* CJSContext::createArray(const int& count)
{
CJSArrayJSC* _value = new CJSArrayJSC();
_value->value = [JSValue valueWithNewArrayInContext:NSJSBase::CJSContextPrivate::GetCurrentContext()];
return _value;
}
CJSTypedArray* CJSContext::createUint8Array(BYTE* data, int count, const bool& isExternalize)
{
JSContext* _current = NSJSBase::CJSContextPrivate::GetCurrentContext();
CJSTypedArrayJSC* _value = new CJSTypedArrayJSC(_current, data, count, isExternalize);
return _value;
}
CJSTypedArray* CJSContext::createUint8Array(BYTE* data, int count, const bool& isExternalize)
{
JSContext* _current = NSJSBase::CJSContextPrivate::GetCurrentContext();
CJSTypedArrayJSC* _value = new CJSTypedArrayJSC(_current, data, count, isExternalize);
return _value;
}
JSSmart<CJSValue> CJSContext::runScript(const std::string& script, JSSmart<CJSTryCatch> exception, const std::wstring& scriptPath)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [m_internal->context evaluateScript:[NSString stringWithAString:script]];
return _value;
}
JSSmart<CJSValue> CJSContext::runScript(const std::string& script, JSSmart<CJSTryCatch> exception, const std::wstring& scriptPath)
{
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [m_internal->context evaluateScript:[NSString stringWithAString:script]];
return _value;
}
unsigned char* NSAllocator::Alloc(const size_t& size)
{
return (unsigned char*)malloc(size);
}
void NSAllocator::Free(unsigned char* data, const size_t& size)
{
free(data);
}
unsigned char* NSAllocator::Alloc(const size_t& size)
{
return (unsigned char*)malloc(size);
}
void NSAllocator::Free(unsigned char* data, const size_t& size)
{
free(data);
}
JSSmart<CJSContext> CJSContext::GetCurrent()
{
CJSContext* ret = new CJSContext();
ret->m_internal->context = NSJSBase::CJSContextPrivate::GetCurrentContext();
return ret;
}
JSSmart<CJSContext> CJSContext::GetCurrent()
{
CJSContext* ret = new CJSContext();
ret->m_internal->context = NSJSBase::CJSContextPrivate::GetCurrentContext();
return ret;
}
void CJSContext::ExternalInitialize(const std::wstring& sDirectory)
{
}
void CJSContext::ExternalDispose()
{
}
bool CJSContext::IsSupportNativeTypedArrays()
{
return (CJSContextPrivate::IsOldVersion() == false) ? true : false;
}
void CJSContext::ExternalInitialize(const std::wstring& sDirectory)
{
}
void CJSContext::ExternalDispose()
{
}
bool CJSContext::IsSupportNativeTypedArrays()
{
return (CJSContextPrivate::IsOldVersion() == false) ? true : false;
}
JSSmart<CJSValue> CJSContext::JSON_Parse(const char *sTmp)
{
if (!sTmp)
return CJSContext::createUndefined();
JSSmart<CJSValue> CJSContext::JSON_Parse(const char* sTmp)
{
if (!sTmp)
return CJSContext::createUndefined();
NSString* sValue = [[NSString alloc] initWithUTF8String:sTmp];
JSStringRef sValueRef = JSStringCreateWithCFString((__bridge CFStringRef)sValue);
JSValueRef oValueJSRef = JSValueMakeFromJSONString(m_internal->context.JSGlobalContextRef, sValueRef);
NSString* sValue = [[NSString alloc] initWithUTF8String:sTmp];
JSStringRef sValueRef = JSStringCreateWithCFString((__bridge CFStringRef)sValue);
JSValueRef oValueJSRef = JSValueMakeFromJSONString(m_internal->context.JSGlobalContextRef, sValueRef);
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [JSValue valueWithJSValueRef:oValueJSRef inContext: m_internal->context];
return _value;
}
CJSValueJSC* _value = new CJSValueJSC();
_value->value = [JSValue valueWithJSValueRef:oValueJSRef inContext:m_internal->context];
return _value;
}
void CJSContext::MoveToThread(ASC_THREAD_ID* id)
{
if (CGlobalContext::GetInstance().RegisterContext(m_internal, id))
{
m_internal->m_arThreads.push_back((NULL == id) ? NSThreads::GetCurrentThreadId() : *id);
}
}
std::string CJSContext::JSON_Stringify(JSSmart<CJSValue> value)
{
CJSValueJSC* _value = static_cast<CJSValueJSC*>(value.GetPointer());
JSStringRef ret = JSValueCreateJSONString(m_internal->context.JSGlobalContextRef, _value->value.JSValueRef, 0, nullptr);
if (ret == nullptr)
return "";
void CJSContext::Enter()
{
}
const size_t nBufferSize = JSStringGetMaximumUTF8CStringSize(ret);
char* buffer = new char[nBufferSize];
if (buffer == nullptr)
return "";
void CJSContext::Exit()
{
}
JSStringGetUTF8CString(ret, buffer, nBufferSize);
std::string sRet(buffer);
delete[] buffer;
class CJSLocalScopePrivate
{
public:
CJSLocalScopePrivate()
{
}
~CJSLocalScopePrivate()
{
}
};
CJSLocalScope::CJSLocalScope() : m_internal(nullptr)
{
}
return sRet;
}
CJSLocalScope::~CJSLocalScope()
{
}
void CJSContext::MoveToThread(ASC_THREAD_ID* id)
{
if (CGlobalContext::GetInstance().RegisterContext(m_internal, id))
{
m_internal->m_arThreads.push_back((NULL == id) ? NSThreads::GetCurrentThreadId() : *id);
}
}
void CJSContext::Enter()
{
}
void CJSContext::Exit()
{
}
class CJSLocalScopePrivate
{
public:
CJSLocalScopePrivate()
{
}
~CJSLocalScopePrivate()
{
}
};
CJSLocalScope::CJSLocalScope() : m_internal(nullptr)
{
}
CJSLocalScope::~CJSLocalScope()
{
}
}
namespace NSJSBase
{
bool CJSCTryCatch::Check()
{
JSValue* exc = [context exception];
if (exc == nil || [exc isNull] || [exc isUndefined])
return false;
bool CJSCTryCatch::Check()
{
JSValue* exc = [context exception];
if (exc == nil || [exc isNull] || [exc isUndefined])
return false;
NSString* pExсeption = [exc toString];
std::cerr << [pExсeption stdstring] << std::endl;
NSLog(@"%@", pExсeption);
NSString* pExсeption = [exc toString];
std::cerr << [pExсeption stdstring] << std::endl;
NSLog(@"%@", pExсeption);
exc = nil;
return true;
}
exc = nil;
return true;
}
}
// embed

View File

@ -413,11 +413,44 @@ namespace NSJSBase
else
_value->doUndefined();
#else
// TODO: Use MaybeLocal version
_value->value = v8::JSON::Parse(CreateV8String(CV8Worker::GetCurrent(), sTmp));
#endif
return _value;
}
std::string CJSContext::JSON_Stringify(JSSmart<CJSValue> value)
{
// if don't return an empty string explicitly, V8 will return "undefined", which is incorrect
if (value->isUndefined())
return "";
CJSValueV8* _value = static_cast<CJSValueV8*>(value.GetPointer());
v8::MaybeLocal<v8::String> result;
#ifndef V8_OS_XP
#ifdef V8_VERSION_89_PLUS
result = v8::JSON::Stringify(m_internal->m_context, _value->value);
#else
v8::MaybeLocal<v8::Object> json_object = _value->value->ToObject(m_internal->m_context);
if (json_object.IsEmpty())
// in case of null and other non-object values
result = _value->value->ToString(m_internal->m_context);
else
result = v8::JSON::Stringify(m_internal->m_context, json_object.ToLocalChecked());
#endif
#else
// there is no built-in stringifier in V8_XP, so use JSON.stringify() from JS
v8::Local<v8::Object> json = m_internal->m_context->Global()->Get(CreateV8String(m_internal->m_isolate, "JSON"))->ToObject();
v8::Local<v8::Function> stringify = json->Get(CreateV8String(m_internal->m_isolate, "stringify")).As<v8::Function>();
result = stringify->Call(json, 1, &_value->value)->ToString(m_internal->m_context);
#endif
if (result.IsEmpty())
return "";
v8::String::Utf8Value data(V8IsolateFirstArg result.ToLocalChecked());
return std::string((char*)(*data), data.length());
}
void CJSContext::MoveToThread(ASC_THREAD_ID* id)
{
// none

View File

@ -425,9 +425,9 @@ namespace NSJSBase
return _value;
}
virtual void set(const char* name, CJSValue* value_param)
virtual void set(const char* name, JSSmart<CJSValue> value_param)
{
CJSValueV8* _value = static_cast<CJSValueV8*>(value_param);
CJSValueV8* _value = static_cast<CJSValueV8*>(value_param.GetPointer());
v8::Local<v8::String> _name = CreateV8String(CV8Worker::GetCurrent(), name);
value->Set(V8ContextFirstArg _name, _value->value);
}
@ -446,6 +446,28 @@ namespace NSJSBase
value->Set(V8ContextFirstArg _name, v8::Number::New(isolate, _value));
}
virtual std::vector<std::string> getPropertyNames()
{
v8::Local<v8::Context> context = CV8Worker::GetCurrentContext();
v8::Local<v8::Array> names = value->GetPropertyNames(context).ToLocalChecked();
uint32_t len = names->Length();
std::vector<std::string> ret;
for (uint32_t i = 0; i < len; i++)
{
v8::Local<v8::Value> propertyName = names->Get(context, i).ToLocalChecked();
v8::Local<v8::Value> propertyValue = value->Get(context, propertyName).ToLocalChecked();
// skip undefined properties
if (propertyValue->IsUndefined())
continue;
CJSValueV8 _value;
_value.value = propertyName;
ret.push_back(_value.toStringA());
}
return ret;
}
virtual CJSEmbedObject* getNative()
{
v8::Handle<v8::External> field = v8::Handle<v8::External>::Cast(value->GetInternalField(0));
@ -530,23 +552,18 @@ namespace NSJSBase
return _value;
}
virtual void set(const int& index, CJSValue* value_param)
virtual void set(const int& index, JSSmart<CJSValue> value_param)
{
CJSValueV8* _value = static_cast<CJSValueV8*>(value_param);
CJSValueV8* _value = static_cast<CJSValueV8*>(value_param.GetPointer());
value->Set(V8ContextFirstArg index, _value->value);
}
virtual void add(CJSValue* value_param)
virtual void add(JSSmart<CJSValue> value_param)
{
CJSValueV8* _value = static_cast<CJSValueV8*>(value_param);
CJSValueV8* _value = static_cast<CJSValueV8*>(value_param.GetPointer());
value->Set(V8ContextFirstArg getCount(), _value->value);
}
virtual void set(const int& index, const bool& _value)
{
value->Set(V8ContextFirstArg index, v8::Boolean::New(CV8Worker::GetCurrent(), _value));
}
virtual void set(const int& index, const int& _value)
{
value->Set(V8ContextFirstArg index, v8::Integer::New(CV8Worker::GetCurrent(), _value));

View File

@ -0,0 +1,461 @@
#include "json.h"
#include "json_p.h"
#include "json_values.h"
// for working with typed arrays: Alloc() and Free()
#include "js_base.h"
namespace NSJSON
{
CTypedValue::CTypedValue() : m_type(vtUndefined)
{
}
CTypedValue::CTypedValue(IBaseValue* value, ValueType type) : m_value(value), m_type(type)
{
}
CTypedValue::~CTypedValue()
{
}
IValue::IValue() : m_internal(new CTypedValue())
{
}
IValue::IValue(const std::shared_ptr<CTypedValue>& internal) : m_internal(internal)
{
}
IValue::~IValue()
{
}
bool IValue::IsUndefined() const
{
return m_internal->m_type == CTypedValue::vtUndefined;
}
bool IValue::IsNull() const
{
return m_internal->m_type == CTypedValue::vtNull;
}
bool IValue::IsInit() const
{
// the same as (m_internal->m_type != CTypedValue::vtUndefined && m_internal->m_type != CTypedValue::vtNull) but a little bit faster
return m_internal->m_value.get() != nullptr;
}
bool IValue::IsBool() const
{
return (m_internal->m_type == CTypedValue::vtPrimitive &&
static_cast<CPrimitive*>(m_internal->m_value.get())->isBool());
}
bool IValue::IsInt() const
{
return (m_internal->m_type == CTypedValue::vtPrimitive &&
static_cast<CPrimitive*>(m_internal->m_value.get())->isInt());
}
bool IValue::IsDouble() const
{
return (m_internal->m_type == CTypedValue::vtPrimitive &&
static_cast<CPrimitive*>(m_internal->m_value.get())->isDouble());
}
bool IValue::IsStringA() const
{
return (m_internal->m_type == CTypedValue::vtPrimitive &&
static_cast<CPrimitive*>(m_internal->m_value.get())->isStringA());
}
bool IValue::IsStringW() const
{
return (m_internal->m_type == CTypedValue::vtPrimitive &&
static_cast<CPrimitive*>(m_internal->m_value.get())->isStringW());
}
bool IValue::IsArray() const
{
return m_internal->m_type == CTypedValue::vtArray;
}
bool IValue::IsTypedArray() const
{
return m_internal->m_type == CTypedValue::vtTypedArray;
}
bool IValue::IsObject() const
{
return m_internal->m_type == CTypedValue::vtObject;
}
bool IValue::ToBool() const
{
if (m_internal->m_type != CTypedValue::vtPrimitive)
{
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return false;
}
return static_cast<CPrimitive*>(m_internal->m_value.get())->toBool();
}
int IValue::ToInt() const
{
if (m_internal->m_type != CTypedValue::vtPrimitive)
{
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return 0;
}
return static_cast<CPrimitive*>(m_internal->m_value.get())->toInt();
}
double IValue::ToDouble() const
{
if (m_internal->m_type != CTypedValue::vtPrimitive)
{
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return 0.0;
}
return static_cast<CPrimitive*>(m_internal->m_value.get())->toDouble();
}
std::string IValue::ToStringA() const
{
if (m_internal->m_type != CTypedValue::vtPrimitive)
{
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return "";
}
return static_cast<CPrimitive*>(m_internal->m_value.get())->toStringA();
}
std::wstring IValue::ToStringW() const
{
if (m_internal->m_type != CTypedValue::vtPrimitive)
{
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return L"";
}
return static_cast<CPrimitive*>(m_internal->m_value.get())->toStringW();
}
IValue::operator bool() const
{
return ToBool();
}
IValue::operator int() const
{
return ToInt();
}
IValue::operator double() const
{
return ToDouble();
}
IValue::operator std::string() const
{
return ToStringA();
}
IValue::operator std::wstring() const
{
return ToStringW();
}
IValue::IValue(bool value) : m_internal(new CTypedValue(new CPrimitive(value), CTypedValue::vtPrimitive))
{
}
IValue::IValue(int value) : m_internal(new CTypedValue(new CPrimitive(value), CTypedValue::vtPrimitive))
{
}
IValue::IValue(double value) : m_internal(new CTypedValue(new CPrimitive(value), CTypedValue::vtPrimitive))
{
}
IValue::IValue(const char* value) : m_internal(new CTypedValue(new CPrimitive(std::string(value)), CTypedValue::vtPrimitive))
{
}
IValue::IValue(const std::string& value) : m_internal(new CTypedValue(new CPrimitive(value), CTypedValue::vtPrimitive))
{
}
IValue::IValue(const wchar_t* value) : m_internal(new CTypedValue(new CPrimitive(std::wstring(value)), CTypedValue::vtPrimitive))
{
}
IValue::IValue(const std::wstring& value) : m_internal(new CTypedValue(new CPrimitive(value), CTypedValue::vtPrimitive))
{
}
int IValue::GetCount() const
{
if (m_internal->m_type == CTypedValue::vtArray)
{
return static_cast<CArray*>(m_internal->m_value.get())->getCount();
}
else if (m_internal->m_type == CTypedValue::vtTypedArray)
{
return static_cast<CTypedArray*>(m_internal->m_value.get())->getCount();
}
else
{
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return 0;
}
}
const CValueRef IValue::Get(int index) const
{
if (m_internal->m_type != CTypedValue::vtArray)
{
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return CValue();
}
if (index < 0 || index >= GetCount())
{
#ifdef JSON_DEBUG
throw std::out_of_range("std::out_of_range");
#endif
return CValue();
}
return static_cast<CArray*>(m_internal->m_value.get())->get(index);
}
CValueRef IValue::Get(int index)
{
return static_cast<const IValue&>(*this).Get(index);
}
const CValueRef IValue::operator[](int index) const
{
return Get(index);
}
CValueRef IValue::operator[](int index)
{
return Get(index);
}
IValue::IValue(std::initializer_list<CValue> elements) : m_internal(new CTypedValue(new CArray(elements), CTypedValue::vtArray))
{
}
const BYTE* IValue::GetData() const
{
if (m_internal->m_type != CTypedValue::vtTypedArray)
{
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return nullptr;
}
return static_cast<CTypedArray*>(m_internal->m_value.get())->getData();
}
BYTE* IValue::GetData()
{
return const_cast<BYTE*>(static_cast<const CValue&>(*this).GetData());
}
const CValueRef IValue::Get(const char* name) const
{
if (m_internal->m_type != CTypedValue::vtObject)
{
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return CValue();
}
return static_cast<CObject*>(m_internal->m_value.get())->get(name);
}
CValueRef IValue::Get(const char* name)
{
return static_cast<const IValue&>(*this).Get(name);
}
const CValueRef IValue::operator[](const char* name) const
{
return Get(name);
}
CValueRef IValue::operator[](const char* name)
{
return Get(name);
}
std::vector<std::string> IValue::GetPropertyNames() const
{
if (m_internal->m_type != CTypedValue::vtObject)
{
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return {};
}
return static_cast<CObject*>(m_internal->m_value.get())->getPropertyNames();
}
CValue::CValue() : IValue()
{
}
CValue::CValue(const CValue& other) : IValue(std::make_shared<CTypedValue>(*other.m_internal))
{
}
CValue::CValue(const CValueRef& ref) : IValue(std::make_shared<CTypedValue>(*ref.m_internal))
{
}
CValue::~CValue()
{
}
CValue& CValue::operator=(const CValue& other)
{
*m_internal = *other.m_internal;
return *this;
}
CValue& CValue::operator=(const CValueRef& ref)
{
*m_internal = *ref.m_internal;
return *this;
}
CValue::CValue(bool value) : IValue(value)
{
}
CValue::CValue(int value) : IValue(value)
{
}
CValue::CValue(double value) : IValue(value)
{
}
CValue::CValue(const char* value) : IValue(value)
{
}
CValue::CValue(const std::string& value) : IValue(value)
{
}
CValue::CValue(const wchar_t* value) : IValue(value)
{
}
CValue::CValue(const std::wstring& value) : IValue(value)
{
}
CValue::CValue(std::initializer_list<CValue> elements) : IValue(elements)
{
}
CValue CValue::CreateArray(int count)
{
CValue ret;
if (count < 0)
return ret;
ret.m_internal->m_value = std::make_shared<CArray>(count);
ret.m_internal->m_type = CTypedValue::vtArray;
return ret;
}
CValue CValue::CreateTypedArray(BYTE* data, int count, bool isExternalize)
{
CValue ret;
if (count <= 0)
return ret;
ret.m_internal->m_value = std::make_shared<CTypedArray>(data, count, isExternalize);
ret.m_internal->m_type = CTypedValue::vtTypedArray;
return ret;
}
BYTE* CValue::AllocTypedArray(size_t size)
{
return NSJSBase::NSAllocator::Alloc(size);
}
void CValue::FreeTypedArray(BYTE* data, size_t size)
{
NSJSBase::NSAllocator::Free(data, size);
}
CValue CValue::CreateObject()
{
CValue ret;
ret.m_internal->m_value = std::make_shared<CObject>();
ret.m_internal->m_type = CTypedValue::vtObject;
return ret;
}
CValue CValue::CreateUndefined()
{
return CValue();
}
CValue CValue::CreateNull()
{
CValue ret;
ret.m_internal->m_type = CTypedValue::vtNull;
return ret;
}
CValueRef::CValueRef(const CValueRef& other) : IValue(other.m_internal)
{
}
CValueRef::CValueRef(const CValue& value) : IValue(value.m_internal)
{
}
CValueRef::~CValueRef()
{
}
CValueRef& CValueRef::operator=(const CValueRef& other)
{
// not reassign the pointer, but copy its content!
*m_internal = *other.m_internal;
return *this;
}
CValueRef& CValueRef::operator=(const CValue& value)
{
// not reassign the pointer, but copy its content!
*m_internal = *value.m_internal;
return *this;
}
}

View File

@ -0,0 +1,282 @@
#ifndef JSON_H_
#define JSON_H_
#include <initializer_list>
#include <memory>
#include <string>
#include <vector>
#ifdef JSBASE_NO_USE_DYNAMIC_LIBRARY
#define JSON_DECL
#else
#include "../../common/base_export.h"
#ifdef JSBASE_USE_DYNAMIC_LIBRARY_BUILDING
#define JSON_DECL Q_DECL_EXPORT
#else
#define JSON_DECL Q_DECL_IMPORT
#endif
#endif
// uncomment to enable exceptions throwing
//#define JSON_DEBUG
#ifdef JSON_DEBUG
#include <stdexcept>
#endif
namespace NSJSON
{
typedef unsigned char BYTE;
class CValue;
class CValueRef;
class CTypedValue;
// Main value interface.
// This class provide interface to work with each type of values.
class JSON_DECL IValue
{
protected:
IValue();
IValue(const std::shared_ptr<CTypedValue>& internal);
~IValue();
// Disable copy for this class (implemented in heirs)
IValue(const IValue& other) = delete;
IValue& operator=(const IValue& other) = delete;
public:
// TYPE CHECKS
/**
* Returns true if the value is undefined.
*/
bool IsUndefined() const;
/**
* Returns true if the value is null.
*/
bool IsNull() const;
/**
* Returns true if the value is not undefined or null.
*/
bool IsInit() const;
/**
* Returns true if the value is a boolean value.
*/
bool IsBool() const;
/**
* Returns true if the value is an integer.
*/
bool IsInt() const;
/**
* Returns true if the value is a double value.
*/
bool IsDouble() const;
/**
* Returns true if the value is a string.
*/
bool IsStringA() const;
/**
* Returns true if the value is a wstring.
*/
bool IsStringW() const;
/**
* Returns true if the value is an array.
*/
bool IsArray() const;
/**
* Returns true if the value is a typed array.
*/
bool IsTypedArray() const;
/**
* Returns true if the value is an object.
*/
bool IsObject() const;
// FUNCTIONS FOR WORKING WITH PRIMITIVE VALUES
/**
* Converts this value to a boolean value.
* @returns Corresponding boolean value. If the value is not a boolean, returns false instead.
*/
bool ToBool() const;
/**
* Converts this value to an integer.
* @returns Corresponding integer value. If the value is not a number, returns 0 instead.
*/
int ToInt() const;
/**
* Converts this value to a double value.
* @returns Corresponding double value. If the value is not a number, returns 0.0 instead.
*/
double ToDouble() const;
/**
* Converts this value to a std::string.
* @returns Corresponding std::string. If the value is not a string, returns empty string instead.
*/
std::string ToStringA() const;
/**
* Converts this value to a wstring.
* @returns Corresponding std::wstring. If the value is not a string, returns empty string instead.
*/
std::wstring ToStringW() const;
// Type cast operators work the same way as conversion functions
operator bool() const;
operator int() const;
operator double() const;
operator std::string() const;
operator std::wstring() const;
protected:
// Creates a value from primitive types
IValue(bool value);
IValue(int value);
IValue(double value);
IValue(const char* value);
IValue(const std::string& value);
IValue(const wchar_t* value);
IValue(const std::wstring& value);
public:
// FUNCTIONS FOR WORKING WITH ARRAYS
/**
* Gets lengths of the array/typed array.
* @returns Returns the number of elements in the array or number of bytes in typed array. If current value is not an array/typed array, returns 0.
*/
int GetCount() const;
/**
* Gets an array value by its index.
* @param index The index of the array value.
* @returns the value in the array. If current value is not an array, returns undefined value.
*/
const CValueRef Get(int index) const;
CValueRef Get(int index);
// operators [] works the same way as Get(index)
const CValueRef operator[](int index) const;
CValueRef operator[](int index);
protected:
// create array from initializer list
IValue(std::initializer_list<CValue> elements);
public:
// FUNCTIONS FOR WORKING WITH TYPED ARRAYS
/**
* Gets data of typed array.
* @return the pointer to memory, allocated for this typed array. If current value is not a typed array, returns nullptr.
*/
const BYTE* GetData() const;
BYTE* GetData();
// FUNCTIONS FOR WORKING WITH OBJECTS
/**
* Gets a property of this object.
* @param name The name of the property.
* @returns the value of the object's property. If current value is not an object, returns undefined value.
*/
const CValueRef Get(const char* name) const;
CValueRef Get(const char* name);
// operators [] works the same way as Get(name)
const CValueRef operator[](const char* name) const;
CValueRef operator[](const char* name);
/**
* Retrieves all property names from current object.
* @returns a vector containing the names of the properties of this object as strings. If current value is not an object, returns an empty vector.
*/
std::vector<std::string> GetPropertyNames() const;
protected:
std::shared_ptr<CTypedValue> m_internal;
};
// Main value implementation
class JSON_DECL CValue : public IValue
{
public:
CValue();
CValue(const CValue& other);
CValue(const CValueRef& ref);
~CValue();
CValue& operator=(const CValue& other);
CValue& operator=(const CValueRef& ref);
// PRIMITIVES CONSTRUCTORS
CValue(bool value);
CValue(int value);
CValue(double value);
CValue(const char* value);
CValue(const std::string& value);
CValue(const wchar_t* value);
CValue(const std::wstring& value);
// ARRAY CONSTRUCTORS
/**
* Creates an array with initializer list syntax (CValue arr = {1, 2, 3}).
* @param elements The elements of an array as an std::initializer_list.
*/
CValue(std::initializer_list<CValue> elements);
/**
* Creates and returns new array.
* @param count The number of elements reserved for the array.
*/
static CValue CreateArray(int count);
// TYPED ARRAY
/**
* Creates and returns new typed array.
* @param data The pointer to binary data. The pointer should be acquired with AllocTypedArray()!
* @param count The length of an array in bytes.
* @param isExternalize If true the memory block will not be reclaimed when the created typed array is destroyed.
* If this parameter is false then the memory block will be released using FreeTypedArray() during the typed array destruction.
*/
static CValue CreateTypedArray(BYTE* data, int count, bool isExternalize = true);
/**
* Allocates the memory for a typed array by creating a buffer array of the specified size.
* @param size The buffer array size.
*/
static BYTE* AllocTypedArray(size_t size);
/**
* Frees the memory for a typed array.
* @param data The allocated memory to be released.
* @param size The buffer array size.
*/
static void FreeTypedArray(BYTE* data, size_t size);
// OBJECT CONSTRUCTOR
/**
* Creates and returns empty object.
*/
static CValue CreateObject();
// OTHER FUNCTIONS
/**
* Creates and returns undefined value (the same as CValue()).
*/
static CValue CreateUndefined();
/**
* Creates and returns null value.
*/
static CValue CreateNull();
friend class CValueRef;
};
// Main value reference implementation
class JSON_DECL CValueRef : public IValue
{
public:
CValueRef(const CValueRef& other);
CValueRef(const CValue& value);
~CValueRef();
CValueRef& operator=(const CValueRef& other);
CValueRef& operator=(const CValue& value);
friend class CValue;
};
}
#endif // JSON_H_

View File

@ -0,0 +1,37 @@
#ifndef JSON_PRIVATE_H_
#define JSON_PRIVATE_H_
#include <memory>
namespace NSJSON
{
class IBaseValue;
// Wrapper around IBaseValue with specific value type
class CTypedValue
{
public:
enum ValueType
{
vtUndefined,
vtNull,
vtPrimitive,
vtArray,
vtTypedArray,
vtObject
};
public:
CTypedValue();
CTypedValue(IBaseValue* value, ValueType type);
~CTypedValue();
// default copy behaviour
CTypedValue(const CTypedValue& other) = default;
CTypedValue& operator=(const CTypedValue& other) = default;
public:
std::shared_ptr<IBaseValue> m_value;
ValueType m_type;
};
}
#endif // JSON_PRIVATE_H_

View File

@ -0,0 +1,199 @@
#include "json_values.h"
namespace NSJSON
{
IBaseValue::IBaseValue()
{
}
IBaseValue::~IBaseValue()
{
}
CPrimitive::CPrimitive(bool value) : m_type(ptBoolean)
{
m_bool = value;
}
CPrimitive::CPrimitive(int value) : m_type(ptInteger)
{
m_int = value;
}
CPrimitive::CPrimitive(double value) : m_type(ptDouble)
{
m_double = value;
}
CPrimitive::CPrimitive(const std::string& str) : m_type(ptStringA)
{
new (&m_string) std::string(str);
}
CPrimitive::CPrimitive(const std::wstring& wstr) : m_type(ptStringW)
{
new (&m_wstring) std::wstring(wstr);
}
CPrimitive::~CPrimitive()
{
switch (m_type)
{
case ptStringA:
m_string.~basic_string<char>();
break;
case ptStringW:
m_wstring.~basic_string<wchar_t>();
break;
default:
break;
}
}
bool CPrimitive::isBool() const
{
return m_type == ptBoolean;
}
bool CPrimitive::isInt() const
{
return m_type == ptInteger;
}
bool CPrimitive::isDouble() const
{
return m_type == ptDouble;
}
bool CPrimitive::isStringA() const
{
return m_type == ptStringA;
}
bool CPrimitive::isStringW() const
{
return m_type == ptStringW;
}
bool CPrimitive::toBool() const
{
if (m_type == ptBoolean)
return m_bool;
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return false;
}
int CPrimitive::toInt() const
{
if (m_type == ptInteger)
return m_int;
if (m_type == ptDouble)
return (int)m_double;
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return 0;
}
double CPrimitive::toDouble() const
{
if (m_type == ptDouble)
return m_double;
if (m_type == ptInteger)
return (double)m_int;
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return 0.0;
}
std::string CPrimitive::toStringA() const
{
if (m_type == ptStringA)
return m_string;
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return "";
}
std::wstring CPrimitive::toStringW() const
{
if (m_type == ptStringW)
return m_wstring;
#ifdef JSON_DEBUG
throw std::bad_cast();
#endif
return L"";
}
CArray::CArray(int count) : m_values(count)
{
}
CArray::CArray(std::initializer_list<CValue> elements) : m_values(elements)
{
}
CArray::~CArray()
{
}
int CArray::getCount() const
{
return (int)m_values.size();
}
CValue& CArray::get(int index)
{
return m_values[index];
}
CTypedArray::CTypedArray(BYTE* data, int len, bool isExternalize) : m_data(data), m_len(len), m_isExternalize(isExternalize)
{
}
CTypedArray::~CTypedArray()
{
if (!m_isExternalize)
{
CValue::FreeTypedArray(m_data, m_len);
}
}
BYTE* CTypedArray::getData()
{
return m_data;
}
int CTypedArray::getCount() const
{
return m_len;
}
CObject::CObject()
{
}
CObject::~CObject()
{
}
CValue& CObject::get(const std::string& name)
{
return m_values[name];
}
std::vector<std::string> CObject::getPropertyNames()
{
std::vector<std::string> ret;
for (const storage_t::value_type& entry : m_values)
{
if (!entry.second.IsUndefined())
ret.push_back(entry.first);
}
return ret;
}
}

View File

@ -0,0 +1,118 @@
#ifndef JSON_VALUES_H_
#define JSON_VALUES_H_
#include <string>
#include <unordered_map>
#include <vector>
#include "json.h"
namespace NSJSON
{
class IBaseValue
{
public:
IBaseValue();
virtual ~IBaseValue();
};
class CPrimitive : public IBaseValue
{
private:
enum PrimitiveType
{
ptBoolean,
ptInteger,
ptDouble,
ptStringA,
ptStringW
};
public:
CPrimitive(bool value);
CPrimitive(int value);
CPrimitive(double value);
CPrimitive(const std::string& str);
CPrimitive(const std::wstring& wstr);
~CPrimitive();
// disable copy
CPrimitive(const CPrimitive& other) = delete;
CPrimitive& operator=(const CPrimitive& other) = delete;
// type check
bool isBool() const;
bool isInt() const;
bool isDouble() const;
bool isStringA() const;
bool isStringW() const;
// getters
bool toBool() const;
int toInt() const;
double toDouble() const;
std::string toStringA() const;
std::wstring toStringW() const;
private:
union
{
bool m_bool;
int m_int;
double m_double;
std::string m_string;
std::wstring m_wstring;
};
PrimitiveType m_type;
};
class CArray : public IBaseValue
{
public:
CArray(int count);
CArray(std::initializer_list<CValue> elements);
~CArray();
public:
int getCount() const;
CValue& get(int index);
private:
std::vector<CValue> m_values;
};
class CTypedArray : public IBaseValue
{
public:
CTypedArray(BYTE* data, int len, bool isExternalize = true);
~CTypedArray();
public:
BYTE* getData();
int getCount() const;
private:
BYTE* m_data;
int m_len;
bool m_isExternalize;
};
class CObject : public IBaseValue
{
private:
using storage_t = std::unordered_map<std::string, CValue>;
public:
CObject();
~CObject();
public:
CValue& get(const std::string& name);
std::vector<std::string> getPropertyNames();
private:
storage_t m_values;
};
}
#endif // JSON_VALUES_H_

View File

@ -0,0 +1,149 @@
#ifndef SERIALIZATION_H_
#define SERIALIZATION_H_
#include "json.h"
#include "../js_internal/js_base.h"
#include <cmath>
namespace NSJSON
{
static JSSmart<NSJSBase::CJSValue> toJS(const CValue& value)
{
if (value.IsUndefined())
return NSJSBase::CJSContext::createUndefined();
if (value.IsNull())
return NSJSBase::CJSContext::createNull();
JSSmart<NSJSBase::CJSValue> ret;
// handle primitive types first, as they are most commonly used
if (value.IsBool())
{
ret = NSJSBase::CJSContext::createBool((bool)value);
}
else if (value.IsInt())
{
ret = NSJSBase::CJSContext::createInt((int)value);
}
else if (value.IsDouble())
{
ret = NSJSBase::CJSContext::createDouble((double)value);
}
else if (value.IsStringA())
{
ret = NSJSBase::CJSContext::createString((std::string)value);
}
else if (value.IsStringW())
{
ret = NSJSBase::CJSContext::createString((std::wstring)value);
}
// arrays
else if (value.IsArray())
{
const int len = value.GetCount();
JSSmart<NSJSBase::CJSArray> jsArr = NSJSBase::CJSContext::createArray(len);
for (int i = 0; i < len; i++)
{
jsArr->set(i, toJS(value[i]));
}
ret = jsArr->toValue();
}
// typed arrays
else if (value.IsTypedArray())
{
JSSmart<NSJSBase::CJSTypedArray> jsTypedArr = NSJSBase::CJSContext::createUint8Array(const_cast<BYTE*>(value.GetData()), value.GetCount());
ret = jsTypedArr->toValue();
}
// objects (there is no need for IsObject())
else
{
JSSmart<NSJSBase::CJSObject> jsObj = NSJSBase::CJSContext::createObject();
std::vector<std::string> properties = value.GetPropertyNames();
for (const std::string& name : properties)
{
JSSmart<NSJSBase::CJSValue> jsValue = toJS(value[name.c_str()]);
jsObj->set(name.c_str(), jsValue);
}
ret = jsObj->toValue();
}
return ret;
}
static CValue fromJS(JSSmart<NSJSBase::CJSValue> jsValue)
{
if (jsValue->isUndefined())
return CValue::CreateUndefined();
if (jsValue->isNull())
return CValue::CreateNull();
CValue ret;
// handle primitive types first, as they are most commonly used
if (jsValue->isBool())
{
ret = CValue(jsValue->toBool());
}
else if (jsValue->isNumber())
{
double number = jsValue->toDouble();
if (std::isfinite(number))
{
// check if number is an integer or double
double integral; // integral part
double fractional = std::modf(number, &integral); // fractional part
// TODO: this may not work for non-32 bit integers
if (fractional == 0.0 && integral >= INT_MIN && integral <= INT_MAX)
ret = (int)integral;
else
ret = number;
}
else
{
// handle NaN, inf, -inf
ret = number;
}
}
else if (jsValue->isString())
{
// convert all strings to std::wstring, because in JS all strings are encoded in UTF-16
ret = jsValue->toStringW();
}
// arrays
else if (jsValue->isArray())
{
JSSmart<NSJSBase::CJSArray> jsArr = jsValue->toArray();
const int len = jsArr->getCount();
ret = CValue::CreateArray(len);
for (int i = 0; i < len; i++)
{
JSSmart<NSJSBase::CJSValue> jsElement = jsArr->get(i);
ret[i] = fromJS(jsElement);
}
}
// typed arrays
else if (jsValue->isTypedArray())
{
JSSmart<NSJSBase::CJSTypedArray> jsTypedArr = jsValue->toTypedArray();
const int len = jsTypedArr->getCount();
BYTE* data = jsTypedArr->getData().Data;
ret = CValue::CreateTypedArray(data, len);
}
// objects
else if (jsValue->isObject())
{
JSSmart<NSJSBase::CJSObject> jsObj = jsValue->toObject();
std::vector<std::string> properties = jsObj->getPropertyNames();
ret = CValue::CreateObject();
for (const std::string& name : properties)
{
JSSmart<NSJSBase::CJSValue> jsPropertyValue = jsObj->get(name.c_str());
ret[name.c_str()] = fromJS(jsPropertyValue);
}
}
// else the type is not supported and will be converted as undefined value
return ret;
}
}
#endif // SERIALIZATION_H_

View File

@ -33,6 +33,7 @@
#include "../../DesktopEditor/raster/ImageFileFormatChecker.h"
#include "../../DesktopEditor/raster/BgraFrame.h"
#include "../../Common/Network/FileTransporter/include/FileTransporter.h"
#include "server.h"
CImagesWorker::CImagesWorker(const std::wstring& sFolder)
{
@ -42,6 +43,8 @@ CImagesWorker::CImagesWorker(const std::wstring& sFolder)
}
std::wstring CImagesWorker::GetImageLocal(const std::wstring& sUrl)
{
if (CServerInstance::getInstance().IsEnable())
return L"error";
std::wstring sExt = NSFile::GetFileExtention(sUrl);
std::wstring sRet = L"image" + std::to_wstring(m_nIndex++) + L"." + sExt;
m_mapImages.insert(std::make_pair(sUrl, sRet));

View File

@ -0,0 +1,64 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#ifndef SERVER_SETTINGS_H
#define SERVER_SETTINGS_H
// class for server version (disable local files and etc)
class CServerInstance
{
private:
bool m_bIsEnabled;
CServerInstance()
{
m_bIsEnabled = false;
}
public:
static CServerInstance& getInstance()
{
static CServerInstance server;
return server;
}
void Enable(const bool& enabled)
{
m_bIsEnabled = enabled;
}
bool IsEnable()
{
return m_bIsEnabled;
}
};
#endif // SERVER_SETTINGS_H

View File

@ -1,7 +1,7 @@
#ifndef _BUILD_NATIVE_HASH_EMBED_H_
#define _BUILD_NATIVE_HASH_EMBED_H_
#include "../../js_internal/js_base.h"
#include "js_internal/js_base.h"
#define ENABLE_SUM_DEL
#define ENABLE_GET

View File

@ -9,7 +9,7 @@ TEMPLATE = app
CONFIG += core_static_link_libstd
CORE_ROOT_DIR = $$PWD/../../../../../core
CORE_ROOT_DIR = $$PWD/../../../../../../core
PWD_ROOT_DIR = $$PWD
include($$CORE_ROOT_DIR/Common/base.pri)
@ -18,7 +18,7 @@ include($$CORE_ROOT_DIR/DesktopEditor/doctrenderer/js_internal/js_base_embed.pri
############### destination path ###############
DESTDIR = $$PWD/build
################################################
INCLUDEPATH += ../..
INCLUDEPATH += $$CORE_ROOT_DIR/DesktopEditor/doctrenderer
DEFINES += CURR_DIR=\\\"$$PWD_ROOT_DIR\\\"

View File

@ -1,32 +1,32 @@
QT -= core
QT -= gui
TARGET = test
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
CONFIG += core_static_link_libstd
CORE_ROOT_DIR = $$PWD/../../../../../core
CORE_3DPARTY_DIR = $$CORE_ROOT_DIR/Common/3dParty
PWD_ROOT_DIR = $$PWD
include($$CORE_ROOT_DIR/Common/base.pri)
include($$CORE_3DPARTY_DIR/googletest/googletest.pri)
DESTDIR = $$PWD/build
INCLUDEPATH += ../..
ADD_DEPENDENCY(doctrenderer)
core_linux {
LIBS += -Wl,-unresolved-symbols=ignore-in-shared-libs
LIBS += -ldl
}
SOURCES += \
test.cpp
QT -= core
QT -= gui
TARGET = test
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
CONFIG += core_static_link_libstd
CORE_ROOT_DIR = $$PWD/../../../../../../../core
CORE_3DPARTY_DIR = $$CORE_ROOT_DIR/Common/3dParty
PWD_ROOT_DIR = $$PWD
include($$CORE_ROOT_DIR/Common/base.pri)
include($$CORE_3DPARTY_DIR/googletest/googletest.pri)
DESTDIR = $$PWD/build
INCLUDEPATH += $$CORE_ROOT_DIR/DesktopEditor/doctrenderer
ADD_DEPENDENCY(doctrenderer)
core_linux {
LIBS += -Wl,-unresolved-symbols=ignore-in-shared-libs
LIBS += -ldl
}
SOURCES += \
main.cpp

View File

@ -0,0 +1,316 @@
#include "js_internal/js_base.h"
#ifdef JS_INTERNAL_GOOGLE_TEST
#include "gtest/gtest.h"
#include <algorithm>
#else
#include <iostream>
#endif
using namespace NSJSBase;
#ifdef JS_INTERNAL_GOOGLE_TEST
// CJSObject::getPropertyNames() tests
// run with "--gtest_filter=CGetPropertyNamesTest.*" to run only this test suite
class CGetPropertyNamesTest : public testing::Test
{
public:
void SetUp() override
{
// create and enter context
m_pContext = new CJSContext();
m_pContext->Enter();
}
void TearDown() override
{
m_pContext->Exit();
}
std::vector<std::string> getObjectProperties(const std::string& objLiteral)
{
JSSmart<CJSObject> obj = m_pContext->runScript("(() => { return " + objLiteral + ";})();")->toObject();
return obj->getPropertyNames();
}
// The order of properties of object in JS is not always the same as insertion order.
// So this function sorts and compares two vectors with property names.
bool compare(std::vector<std::string>& lhs, std::vector<std::string>& rhs)
{
std::sort(lhs.begin(), lhs.end());
std::sort(rhs.begin(), rhs.end());
return lhs == rhs;
}
std::string printInfo(const std::string& info, const std::vector<std::string>& names)
{
std::string ret = info;
ret += '[';
const int lenResult = names.size();
for (int i = 0; i < lenResult; i++)
{
ret += "\"" + names[i] + "\"";
if (i < lenResult - 1)
ret += ',';
}
ret += "]\n";
return ret;
}
public:
JSSmart<CJSContext> m_pContext;
};
TEST_F(CGetPropertyNamesTest, normal_object)
{
std::vector<std::string> result = getObjectProperties("{number: 42, name: 'foo', arr: [1, 'abc', 2, 3], func() { return 'bar'; }}");
std::vector<std::string> expected = {"number", "name", "arr", "func"};
EXPECT_TRUE(compare(result, expected)) << printInfo("Actual: ", result) << printInfo("Expected: ", expected);
}
TEST_F(CGetPropertyNamesTest, empty_object)
{
std::vector<std::string> result = getObjectProperties("{}");
std::vector<std::string> expected = {};
EXPECT_TRUE(compare(result, expected)) << printInfo("Actual: ", result) << printInfo("Expected: ", expected);
}
TEST_F(CGetPropertyNamesTest, only_one_function_in_object)
{
std::vector<std::string> result = getObjectProperties("{add(a, b) { return a + b; }}");
std::vector<std::string> expected = {"add"};
EXPECT_TRUE(compare(result, expected)) << printInfo("Actual: ", result) << printInfo("Expected: ", expected);
}
TEST_F(CGetPropertyNamesTest, inner_object)
{
std::vector<std::string> result = getObjectProperties("{inner: {number: 42, name: 'foo'}}");
std::vector<std::string> expected = {"inner"};
EXPECT_TRUE(compare(result, expected)) << printInfo("Actual: ", result) << printInfo("Expected: ", expected);
}
TEST_F(CGetPropertyNamesTest, object_with_null_and_undefined_properties)
{
std::vector<std::string> result = getObjectProperties("{number: null, name: undefined, func() { return 'bar'; }}");
std::vector<std::string> expected = {"number", "func"};
EXPECT_TRUE(compare(result, expected)) << printInfo("Actual: ", result) << printInfo("Expected: ", expected);
}
TEST_F(CGetPropertyNamesTest, object_with_only_undefined_properties)
{
std::vector<std::string> result = getObjectProperties("{foo: undefined, bar: undefined}");
std::vector<std::string> expected = {};
EXPECT_TRUE(compare(result, expected)) << printInfo("Actual: ", result) << printInfo("Expected: ", expected);
}
TEST_F(CGetPropertyNamesTest, array_as_object)
{
std::vector<std::string> result = getObjectProperties("{0: 4, 1: 2, 2: undefined, 3: 'foo', 42: 'bar'}");
std::vector<std::string> expected = {"0", "1", "3", "42"};
EXPECT_TRUE(compare(result, expected)) << printInfo("Actual: ", result) << printInfo("Expected: ", expected);
}
TEST_F(CGetPropertyNamesTest, object_with_prototype)
{
m_pContext->runScript(
"var personPrototype = { greet() { return 'Hello, world!'; } };"
"function Person(name) { this.name = name; }"
);
JSSmart<CJSObject> obj = m_pContext->runScript("new Person('Foo');")->toObject();
std::vector<std::string> result1 = obj->getPropertyNames();
std::vector<std::string> expected1 = {"name"};
EXPECT_TRUE(compare(result1, expected1)) << printInfo("Actual: ", result1) << printInfo("Expected: ", expected1);
m_pContext->runScript("Person.prototype.greet = personPrototype.greet;");
std::vector<std::string> result2 = obj->getPropertyNames();
std::vector<std::string> expected2 = {"name", "greet"};
EXPECT_TRUE(compare(result2, expected2)) << printInfo("Actual: ", result2) << printInfo("Expected: ", expected2);
}
// CJSContext::JSON_Stringify() tests
// run with "--gtest_filter=CJSONStringifyTest.*" to run only this test suite
class CJSONStringifyTest : public testing::Test
{
public:
void SetUp() override
{
// create and enter context
m_pContext = new CJSContext();
m_pContext->Enter();
}
void TearDown() override
{
m_pContext->Exit();
}
JSSmart<CJSObject> createObject(const std::string& objLiteral)
{
return m_pContext->runScript("(() => { return " + objLiteral + ";})();")->toObject();
}
public:
JSSmart<CJSContext> m_pContext;
};
TEST_F(CJSONStringifyTest, undefined)
{
JSSmart<CJSValue> jsValue = CJSContext::createUndefined();
std::string sRes = m_pContext->JSON_Stringify(jsValue);
EXPECT_EQ(sRes, "");
}
TEST_F(CJSONStringifyTest, null)
{
JSSmart<CJSValue> jsValue = CJSContext::createNull();
std::string sRes = m_pContext->JSON_Stringify(jsValue);
EXPECT_EQ(sRes, "null");
}
TEST_F(CJSONStringifyTest, numbers)
{
JSSmart<CJSValue> jsValue = CJSContext::createInt(42);
std::string sRes = m_pContext->JSON_Stringify(jsValue);
EXPECT_EQ(sRes, "42");
jsValue = CJSContext::createUInt(7);
sRes = m_pContext->JSON_Stringify(jsValue);
EXPECT_EQ(sRes, "7");
jsValue = CJSContext::createDouble(3.1415926535);
sRes = m_pContext->JSON_Stringify(jsValue);
EXPECT_EQ(sRes, "3.1415926535");
}
TEST_F(CJSONStringifyTest, strings)
{
JSSmart<CJSValue> jsValue = CJSContext::createString("");
std::string sRes = m_pContext->JSON_Stringify(jsValue);
EXPECT_EQ(sRes, "\"\"");
jsValue = CJSContext::createString("foo bar");
sRes = m_pContext->JSON_Stringify(jsValue);
EXPECT_EQ(sRes, "\"foo bar\"");
}
TEST_F(CJSONStringifyTest, arrays)
{
JSSmart<CJSArray> jsArr = CJSContext::createArray(0);
std::string sRes = m_pContext->JSON_Stringify(jsArr->toValue());
EXPECT_EQ(sRes, "[]");
jsArr = CJSContext::createArray(4);
jsArr->set(0, 42);
// inner array
JSSmart<CJSArray> jsArrInner = CJSContext::createArray(2);
jsArrInner->set(0, CJSContext::createString("foo"));
jsArrInner->set(1, CJSContext::createDouble(2.71828));
jsArr->set(1, jsArrInner->toValue());
jsArr->set(2, CJSContext::createNull());
jsArr->set(3, CJSContext::createUndefined());
sRes = m_pContext->JSON_Stringify(jsArr->toValue());
EXPECT_EQ(sRes, "[42,[\"foo\",2.71828],null,null]");
}
TEST_F(CJSONStringifyTest, typed_arrays)
{
BYTE* data = NSAllocator::Alloc(4);
data[0] = 0x1A;
data[1] = 0x54;
data[2] = 0xFE;
data[3] = 0xFF;
JSSmart<CJSTypedArray> jsTypedArr = CJSContext::createUint8Array(data, 4, false);
std::string sRes = m_pContext->JSON_Stringify(jsTypedArr->toValue());
EXPECT_EQ(sRes, "{\"0\":26,\"1\":84,\"2\":254,\"3\":255}");
}
TEST_F(CJSONStringifyTest, empty_object)
{
JSSmart<CJSObject> jsObj = CJSContext::createObject();
std::string sRes = m_pContext->JSON_Stringify(jsObj->toValue());
EXPECT_EQ(sRes, "{}");
jsObj->set("number", CJSContext::createInt(42));
jsObj->set("name", CJSContext::createString("foo"));
sRes = m_pContext->JSON_Stringify(jsObj->toValue());
EXPECT_EQ(sRes, "{\"number\":42,\"name\":\"foo\"}");
}
TEST_F(CJSONStringifyTest, normal_object)
{
JSSmart<CJSObject> jsObj = createObject("{number: 42, name: 'foo', arr: [1, 'abc', 2, 3], func() { return 'bar'; }}");
std::string sRes = m_pContext->JSON_Stringify(jsObj->toValue());
EXPECT_EQ(sRes, "{\"number\":42,\"name\":\"foo\",\"arr\":[1,\"abc\",2,3]}");
}
TEST_F(CJSONStringifyTest, only_one_function_in_object)
{
JSSmart<CJSObject> jsObj = createObject("{add(a, b) { return a + b; }}");
std::string sRes = m_pContext->JSON_Stringify(jsObj->toValue());
EXPECT_EQ(sRes, "{}");
}
TEST_F(CJSONStringifyTest, inner_object)
{
JSSmart<CJSObject> jsObj = createObject("{inner: {number: 42, name: 'foo'}, own: 'bar'}");
std::string sRes = m_pContext->JSON_Stringify(jsObj->toValue());
EXPECT_EQ(sRes, "{\"inner\":{\"number\":42,\"name\":\"foo\"},\"own\":\"bar\"}");
}
TEST_F(CJSONStringifyTest, object_with_null_and_undefined_properties)
{
JSSmart<CJSObject> jsObj = createObject("{number: null, name: undefined, func() { return 'bar'; }}");
std::string sRes = m_pContext->JSON_Stringify(jsObj->toValue());
EXPECT_EQ(sRes, "{\"number\":null}");
}
TEST_F(CJSONStringifyTest, object_with_only_undefined_properties)
{
JSSmart<CJSObject> jsObj = createObject("{foo: undefined, bar: undefined}");
std::string sRes = m_pContext->JSON_Stringify(jsObj->toValue());
EXPECT_EQ(sRes, "{}");
}
TEST_F(CJSONStringifyTest, array_as_object)
{
JSSmart<CJSObject> jsObj = createObject("{0: 4, 1: 2, 2: undefined, 3: 'foo', 42: 'bar'}");
std::string sRes = m_pContext->JSON_Stringify(jsObj->toValue());
EXPECT_EQ(sRes, "{\"0\":4,\"1\":2,\"3\":\"foo\",\"42\":\"bar\"}");
}
TEST_F(CJSONStringifyTest, object_with_prototype)
{
m_pContext->runScript(
"var personPrototype = { age: 42, greet() { return 'Hello, world!'; } };"
"function Person(name) { this.name = name; }"
);
JSSmart<CJSObject> jsObj = m_pContext->runScript("new Person('Foo');")->toObject();
std::string sRes = m_pContext->JSON_Stringify(jsObj->toValue());
EXPECT_EQ(sRes, "{\"name\":\"Foo\"}");
m_pContext->runScript("Object.assign(Person.prototype, personPrototype);");
sRes = m_pContext->JSON_Stringify(jsObj->toValue());
// expect the same result, because JSON.stringify does not preserve any of the not-owned properties of the object
EXPECT_EQ(sRes, "{\"name\":\"Foo\"}");
}
#else
int main()
{
JSSmart<CJSContext> pContext = new CJSContext();
CJSContextScope scope(pContext);
JSSmart<CJSObject> jsObj = CJSContext::createObject();
jsObj->set("number", CJSContext::createInt(42));
jsObj->set("name", CJSContext::createString("foo"));
std::cout << pContext->JSON_Stringify(jsObj->toValue()) << std::endl;
return 0;
}
#endif // JS_INTERNAL_GOOGLE_TEST

View File

@ -0,0 +1,40 @@
QT -= core
QT -= gui
TARGET = test
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
CONFIG += core_static_link_libstd
CORE_ROOT_DIR = $$PWD/../../../../../core
CORE_3DPARTY_DIR = $$CORE_ROOT_DIR/Common/3dParty
PWD_ROOT_DIR = $$PWD
#CONFIG += build_xp
include($$CORE_ROOT_DIR/Common/base.pri)
# Comment to inspect custom main
# Uncomment to run google tests
CONFIG += js_internal_google_test
js_internal_google_test {
include($$CORE_3DPARTY_DIR/googletest/googletest.pri)
DEFINES += JS_INTERNAL_GOOGLE_TEST
}
DESTDIR = $$PWD/build
INCLUDEPATH += ../..
ADD_DEPENDENCY(doctrenderer)
core_linux {
LIBS += -Wl,-unresolved-symbols=ignore-in-shared-libs
LIBS += -ldl
}
SOURCES += \
main.cpp

View File

@ -0,0 +1,996 @@
#include "json/serialization.h"
#ifdef JSON_GOOGLE_TEST
#include "gtest/gtest.h"
#include <algorithm>
#else
#include <iostream>
#endif
using namespace NSJSBase;
using namespace NSJSON;
#ifdef JSON_GOOGLE_TEST
class CJSONTest : public testing::Test
{
public:
void SetUp() override
{
// create and enter context
m_pContext = new CJSContext();
m_pContext->Enter();
}
void TearDown() override
{
m_pContext->Exit();
}
bool compare(const CValue& value, JSSmart<CJSValue> jsValue, bool makeExpects = true)
{
if (value.IsUndefined())
{
if (makeExpects)
EXPECT_TRUE(jsValue->isUndefined());
return jsValue->isUndefined();
}
if (value.IsNull())
{
if (makeExpects)
EXPECT_TRUE(jsValue->isNull());
return jsValue->isNull();
}
if (value.IsArray())
{
if (makeExpects)
EXPECT_TRUE(jsValue->isArray());
if (!jsValue->isArray())
return false;
JSSmart<CJSArray> jsArr = jsValue->toArray();
const int len = value.GetCount();
if (makeExpects)
EXPECT_EQ(len, jsArr->getCount());
if (len != jsArr->getCount())
return false;
for (int i = 0; i < len; i++)
{
if (!compare(value[i], jsArr->get(i), makeExpects))
{
if (makeExpects)
ADD_FAILURE() << "Array values at index [" << i << "] are different!";
return false;
}
}
}
else if (value.IsTypedArray())
{
if (makeExpects)
EXPECT_TRUE(jsValue->isTypedArray());
if (!jsValue->isTypedArray())
return false;
JSSmart<CJSTypedArray> jsTypedArr = jsValue->toTypedArray();
if (makeExpects)
EXPECT_EQ(value.GetCount(), jsTypedArr->getCount());
if (value.GetCount() != jsTypedArr->getCount())
return false;
// compare pointers, not values
if (makeExpects)
EXPECT_EQ(value.GetData(), jsTypedArr->getData().Data);
if (value.GetData() != jsTypedArr->getData().Data)
return false;
}
else if (value.IsObject())
{
if (makeExpects)
EXPECT_TRUE(jsValue->isObject());
if (!jsValue->isObject())
return false;
JSSmart<CJSObject> jsObj = jsValue->toObject();
std::vector<std::string> properties = value.GetPropertyNames();
std::vector<std::string> jsProperties = jsObj->getPropertyNames();
const int len = properties.size();
if (makeExpects)
EXPECT_EQ(len, jsProperties.size());
if (len != jsProperties.size())
return false;
// sort both vectors since the order of properties may vary in them
std::sort(properties.begin(), properties.end());
std::sort(jsProperties.begin(), jsProperties.end());
for (int i = 0; i < len; i++)
{
if (makeExpects)
EXPECT_EQ(properties[i], jsProperties[i]);
if (properties[i] != jsProperties[i])
return false;
const char* sProperty = properties[i].c_str();
if (!compare(value[sProperty], jsObj->get(sProperty), makeExpects))
{
if (makeExpects)
ADD_FAILURE() << "Object property values for property \"" << sProperty << "\" are different!";
return false;
}
}
}
else
{
// primitive types
if (value.IsBool())
{
if (makeExpects)
EXPECT_TRUE(jsValue->isBool());
if (!jsValue->isBool())
return false;
bool val = (bool)value;
bool jsVal = jsValue->toBool();
if (makeExpects)
EXPECT_EQ(val, jsVal);
if (val != jsVal)
return false;
}
else if (value.IsInt())
{
if (makeExpects)
EXPECT_TRUE(jsValue->isNumber());
if (!jsValue->isNumber())
return false;
int val = (int)value;
int jsVal = jsValue->toInt32();
if (makeExpects)
EXPECT_EQ(val, jsVal);
if (val != jsVal)
return false;
}
else if (value.IsDouble())
{
if (makeExpects)
EXPECT_TRUE(jsValue->isNumber());
if (!jsValue->isNumber())
return false;
double val = (double)value;
double jsVal = jsValue->toDouble();
if (!std::isnan(val))
{
// strict check without tolerance
if (makeExpects)
EXPECT_EQ(val, jsVal);
if (val != jsVal)
return false;
}
else
{
if (makeExpects)
EXPECT_TRUE(std::isnan(jsVal));
if (!std::isnan(jsVal))
return false;
}
}
else if (value.IsStringA())
{
if (makeExpects)
EXPECT_TRUE(jsValue->isString());
if (!jsValue->isString())
return false;
std::string val = value.ToStringA();
std::string jsVal = jsValue->toStringA();
if (makeExpects)
EXPECT_EQ(val, jsVal);
if (val != jsVal)
return false;
}
else
{
if (makeExpects)
{
EXPECT_TRUE(value.IsStringW());
EXPECT_TRUE(jsValue->isString());
}
if (!jsValue->isString())
return false;
std::wstring val = value.ToStringW();
std::wstring jsVal = jsValue->toStringW();
if (makeExpects)
EXPECT_EQ(val, jsVal);
if (val != jsVal)
return false;
}
}
return true;
}
public:
JSSmart<CJSContext> m_pContext;
};
// --------- CValue basic functinality tests ----------
TEST_F(CJSONTest, undefined_from_default_constructor)
{
CValue val;
JSSmart<CJSValue> jsVal = CJSContext::createUndefined();
EXPECT_TRUE(compare(val, jsVal));
val = 0;
EXPECT_FALSE(compare(val, jsVal, false));
}
TEST_F(CJSONTest, undefined_from_static_method)
{
CValue val = CValue::CreateUndefined();
JSSmart<CJSValue> jsVal = CJSContext::createUndefined();
EXPECT_TRUE(compare(val, jsVal));
val = 5;
EXPECT_FALSE(compare(val, jsVal, false));
}
TEST_F(CJSONTest, null_)
{
CValue val = CValue::CreateNull();
JSSmart<CJSValue> jsVal = CJSContext::createNull();
EXPECT_TRUE(compare(val, jsVal));
val = CValue();
EXPECT_FALSE(compare(val, jsVal, false));
}
TEST_F(CJSONTest, bool_)
{
CValue val = true;
JSSmart<CJSValue> jsVal = CJSContext::createBool(true);
EXPECT_TRUE(compare(val, jsVal));
val = false;
EXPECT_FALSE(compare(val, jsVal, false));
}
TEST_F(CJSONTest, int_)
{
CValue val = 42;
EXPECT_FALSE(val.IsDouble());
JSSmart<CJSValue> jsVal = CJSContext::createInt(42);
EXPECT_TRUE(compare(val, jsVal));
val = 100;
EXPECT_FALSE(compare(val, jsVal, false));
val = 3;
jsVal = CJSContext::createDouble(3.0);
EXPECT_TRUE(compare(val, jsVal));
}
TEST_F(CJSONTest, double_)
{
CValue val = 3.141592;
EXPECT_FALSE(val.IsInt());
JSSmart<CJSValue> jsVal = CJSContext::createDouble(3.141592);
EXPECT_TRUE(compare(val, jsVal));
val = 2.81828;
jsVal = CJSContext::createDouble(3.0);
EXPECT_FALSE(compare(val, jsVal, false));
val = 3.0;
jsVal = CJSContext::createInt(3);
EXPECT_TRUE(compare(val, jsVal));
}
TEST_F(CJSONTest, string_char_constructor)
{
CValue val = "test";
JSSmart<CJSValue> jsVal = CJSContext::createString("test");
EXPECT_TRUE(compare(val, jsVal));
jsVal = CJSContext::createString(L"test");
EXPECT_TRUE(compare(val, jsVal));
val = "";
EXPECT_FALSE(compare(val, jsVal, false));
}
TEST_F(CJSONTest, string_string_constructor)
{
CValue val = std::string("test");
JSSmart<CJSValue> jsVal = CJSContext::createString("test");
EXPECT_TRUE(compare(val, jsVal));
jsVal = CJSContext::createString(L"test");
EXPECT_TRUE(compare(val, jsVal));
val = "";
EXPECT_FALSE(compare(val, jsVal, false));
}
TEST_F(CJSONTest, wstring_wchar_constructor)
{
CValue val = L"тест";
JSSmart<CJSValue> jsVal = CJSContext::createString(L"тест");
EXPECT_TRUE(compare(val, jsVal));
val = "test";
EXPECT_FALSE(compare(val, jsVal, false));
jsVal = CJSContext::createString(L"test");
EXPECT_TRUE(compare(val, jsVal));
}
TEST_F(CJSONTest, wstring_wstring_constructor)
{
CValue val = std::wstring(L"тест");
JSSmart<CJSValue> jsVal = CJSContext::createString(L"тест");
EXPECT_TRUE(compare(val, jsVal));
val = "test";
EXPECT_FALSE(compare(val, jsVal, false));
jsVal = CJSContext::createString(L"test");
EXPECT_TRUE(compare(val, jsVal));
}
TEST_F(CJSONTest, array_from_static_method)
{
CValue arr = CValue::CreateArray(4);
arr[0] = CValue::CreateNull();
arr[1] = 42;
arr[2] = CValue::CreateArray(2);
arr[2][0] = true;
arr[2][1] = 2.5;
EXPECT_TRUE(arr[3].IsUndefined());
#ifdef JSON_DEBUG
EXPECT_THROW(arr[100].IsUndefined(), std::out_of_range);
EXPECT_THROW(arr[-1].IsUndefined(), std::out_of_range);
EXPECT_THROW(arr[5] = 1, std::out_of_range);
#else
EXPECT_TRUE(arr[100].IsUndefined());
EXPECT_TRUE(arr[-1].IsUndefined());
arr[5] = 1;
#endif
EXPECT_EQ(arr.GetCount(), 4);
JSSmart<CJSArray> jsArr = CJSContext::createArray(4);
jsArr->set(0, CJSContext::createNull());
jsArr->set(1, CJSContext::createInt(42));
jsArr->set(2, CJSContext::createArray(2));
jsArr->get(2)->toArray()->set(0, CJSContext::createBool(true));
jsArr->get(2)->toArray()->set(1, CJSContext::createDouble(2.5));
jsArr->set(3, CJSContext::createUndefined());
EXPECT_TRUE(compare(arr, jsArr->toValue()));
arr[1] = 41;
EXPECT_FALSE(compare(arr, jsArr->toValue(), false));
}
TEST_F(CJSONTest, array_from_initializer_list)
{
CValue arr = {CValue::CreateNull(), 42, {true, 2.5}, CValue::CreateUndefined()};
EXPECT_TRUE(arr[3].IsUndefined());
#ifdef JSON_DEBUG
EXPECT_THROW(arr[100].IsUndefined(), std::out_of_range);
EXPECT_THROW(arr[-1].IsUndefined(), std::out_of_range);
EXPECT_THROW(arr[5] = 1, std::out_of_range);
#else
EXPECT_TRUE(arr[100].IsUndefined());
EXPECT_TRUE(arr[-1].IsUndefined());
arr[5] = 1;
#endif
EXPECT_EQ(arr.GetCount(), 4);
JSSmart<CJSArray> jsArr = CJSContext::createArray(4);
jsArr->set(0, CJSContext::createNull());
jsArr->set(1, CJSContext::createInt(42));
jsArr->set(2, CJSContext::createArray(2));
jsArr->get(2)->toArray()->set(0, CJSContext::createBool(true));
jsArr->get(2)->toArray()->set(1, CJSContext::createDouble(2.5));
jsArr->set(3, CJSContext::createUndefined());
EXPECT_TRUE(compare(arr, jsArr->toValue()));
arr[1] = 41;
EXPECT_FALSE(compare(arr, jsArr->toValue(), false));
}
TEST_F(CJSONTest, array_empty)
{
CValue arr = CValue::CreateArray(0);
EXPECT_TRUE(arr.IsArray());
EXPECT_EQ(arr.GetCount(), 0);
#ifdef JSON_DEBUG
EXPECT_THROW(arr[0].IsUndefined(), std::out_of_range);
#else
EXPECT_TRUE(arr[0].IsUndefined());
#endif
}
TEST_F(CJSONTest, array_negative_size)
{
CValue arr = CValue::CreateArray(-1);
EXPECT_TRUE(arr.IsUndefined());
#ifdef JSON_DEBUG
EXPECT_THROW(arr[0].IsUndefined(), std::bad_cast);
#else
EXPECT_TRUE(arr[0].IsUndefined());
#endif
}
TEST_F(CJSONTest, typed_array_externalize)
{
BYTE* data = CValue::AllocTypedArray(10);
CValue typedArr = CValue::CreateTypedArray(data, 10);
JSSmart<CJSTypedArray> jsTypedArr = CJSContext::createUint8Array(data, 10);
EXPECT_TRUE(compare(typedArr, jsTypedArr->toValue()));
typedArr = CValue::CreateTypedArray(data, 11);
EXPECT_FALSE(compare(typedArr, jsTypedArr->toValue(), false));
BYTE* data2 = CValue::AllocTypedArray(10);
typedArr = CValue::CreateTypedArray(data2, 10);
EXPECT_FALSE(compare(typedArr, jsTypedArr->toValue(), false));
CValue::FreeTypedArray(data, 10);
CValue::FreeTypedArray(data2, 10);
}
TEST_F(CJSONTest, typed_array_not_externalize)
{
BYTE* data = CValue::AllocTypedArray(10);
CValue typedArr = CValue::CreateTypedArray(data, 10, false);
JSSmart<CJSTypedArray> jsTypedArr = CJSContext::createUint8Array(data, 10);
EXPECT_TRUE(compare(typedArr, jsTypedArr->toValue()));
}
TEST_F(CJSONTest, typed_array_empty)
{
BYTE* data = CValue::AllocTypedArray(0);
CValue typedArr = CValue::CreateTypedArray(data, 0, false);
EXPECT_TRUE(typedArr.IsUndefined());
}
TEST_F(CJSONTest, typed_array_negative_size)
{
BYTE* data = CValue::AllocTypedArray(10);
CValue typedArr = CValue::CreateTypedArray(nullptr, -10);
EXPECT_TRUE(typedArr.IsUndefined());
CValue::FreeTypedArray(data, 10);
}
TEST_F(CJSONTest, typed_array_copy)
{
BYTE* data = CValue::AllocTypedArray(10);
CValue typedArr = CValue::CreateTypedArray(data, 10, false);
{
CValue typedArr2 = typedArr;
typedArr2.GetData()[4] = 0x42;
}
EXPECT_EQ(typedArr.GetData()[4], 0x42);
}
TEST_F(CJSONTest, object)
{
CValue obj = CValue::CreateObject();
JSSmart<CJSObject> jsObj = CJSContext::createObject();
EXPECT_TRUE(compare(obj, jsObj->toValue()));
obj["name"] = "Foo";
jsObj->set("name", CJSContext::createString("Foo"));
EXPECT_TRUE(compare(obj, jsObj->toValue()));
obj["name"] = "Bar";
EXPECT_FALSE(compare(obj, jsObj->toValue(), false));
obj["number"] = 42;
jsObj->set("name", CJSContext::createString("Bar"));
jsObj->set("number", CJSContext::createInt(42));
EXPECT_TRUE(compare(obj, jsObj->toValue()));
obj["extra"] = CValue::CreateUndefined();
EXPECT_TRUE(compare(obj, jsObj->toValue()));
obj["extra"] = CValue::CreateNull();
EXPECT_FALSE(compare(obj, jsObj->toValue(), false));
}
TEST_F(CJSONTest, references)
{
CValue val = 42;
CValueRef ref = val;
EXPECT_EQ((int)val, 42);
EXPECT_EQ((int)ref, 42);
ref = 10;
EXPECT_EQ((int)val, 10);
EXPECT_EQ((int)ref, 10);
// CValue from CValueRef
CValue val2 = ref;
val2 = 12;
EXPECT_EQ((int)val2, 12);
EXPECT_EQ((int)ref, 10);
EXPECT_EQ((int)val, 10);
// chaining CValueRef-s
CValueRef ref2 = ref;
val = "foo";
EXPECT_EQ((std::string)ref, "foo");
EXPECT_EQ((std::string)ref2, "foo");
val = {1, 2, 3};
EXPECT_EQ((int)ref[1], 2);
// CValue assignment to CValueRef
val2 = ref2;
EXPECT_EQ((int)val2[0], 1);
val2 = true;
EXPECT_EQ((bool)val2, true);
EXPECT_TRUE(ref.IsArray());
EXPECT_TRUE(ref2.IsArray());
// CValueRef from operator[]
CValueRef ref3 = val[2];
ref3 = ref2[0];
EXPECT_EQ((int)val[2], 1);
}
TEST_F(CJSONTest, constants)
{
const CValue val = 42;
// NOTE: you can't change constant value explicitly, but you can do it using references:
CValueRef ref = val;
ref = 10;
EXPECT_EQ((int)val, 10);
EXPECT_EQ((int)ref, 10);
// NOTE: const references saves its const properties
const CValueRef ref2 = ref;
// you can't do that:
// ref2 = 100;
EXPECT_EQ((int)ref2, 10);
}
TEST_F(CJSONTest, wrong_usage)
{
CValue val = 42;
#ifdef JSON_DEBUG
EXPECT_THROW(val["name"].IsUndefined(), std::bad_cast);
EXPECT_THROW(val[0].IsUndefined(), std::bad_cast);
EXPECT_THROW(val.GetPropertyNames(), std::bad_cast);
EXPECT_THROW(val.GetCount(), std::bad_cast);
EXPECT_THROW(val.GetData(), std::bad_cast);
#else
EXPECT_TRUE(val["name"].IsUndefined());
EXPECT_TRUE(val[0].IsUndefined());
EXPECT_TRUE(val.GetPropertyNames().empty());
EXPECT_EQ(val.GetCount(), 0);
EXPECT_EQ(val.GetData(), nullptr);
#endif
EXPECT_DOUBLE_EQ(val.ToDouble(), 42.0);
#ifdef JSON_DEBUG
EXPECT_THROW((bool)val, std::bad_cast);
EXPECT_THROW((std::string)val, std::bad_cast);
EXPECT_THROW((std::wstring)val, std::bad_cast);
#else
EXPECT_EQ((bool)val, false);
EXPECT_EQ((std::string)val, "");
EXPECT_EQ((std::wstring)val, L"");
#endif
val = 3.1415926535;
EXPECT_EQ((int)val, 3);
val = "test";
#ifdef JSON_DEBUG
EXPECT_THROW((bool)val, std::bad_cast);
EXPECT_THROW((int)val, std::bad_cast);
EXPECT_THROW((double)val, std::bad_cast);
EXPECT_THROW((std::wstring)val, std::bad_cast);
#else
EXPECT_EQ((bool)val, false);
EXPECT_EQ((int)val, 0);
EXPECT_EQ((double)val, 0.0);
EXPECT_EQ((std::wstring)val, L"");
#endif
val = L"тест";
#ifdef JSON_DEBUG
EXPECT_THROW((bool)val, std::bad_cast);
EXPECT_THROW((int)val, std::bad_cast);
EXPECT_THROW((double)val, std::bad_cast);
EXPECT_THROW((std::string)val, std::bad_cast);
#else
EXPECT_EQ((bool)val, false);
EXPECT_EQ((int)val, 0);
EXPECT_EQ((double)val, 0.0);
EXPECT_EQ((std::string)val, "");
#endif
val = CValue::CreateObject();
#ifdef JSON_DEBUG
EXPECT_THROW(val[0].IsUndefined(), std::bad_cast);
EXPECT_THROW((bool)val, std::bad_cast);
EXPECT_THROW((int)val, std::bad_cast);
EXPECT_THROW((double)val, std::bad_cast);
EXPECT_THROW((std::string)val, std::bad_cast);
EXPECT_THROW((std::wstring)val, std::bad_cast);
#else
EXPECT_TRUE(val[0].IsUndefined());
EXPECT_EQ((bool)val, false);
EXPECT_EQ((int)val, 0);
EXPECT_EQ((double)val, 0.0);
EXPECT_EQ((std::string)val, "");
EXPECT_EQ((std::wstring)val, L"");
#endif
}
TEST_F(CJSONTest, is_init)
{
CValue val;
EXPECT_FALSE(val.IsInit());
val = CValue::CreateNull();
EXPECT_FALSE(val.IsInit());
val = 42;
EXPECT_TRUE(val.IsInit());
CValue val2 = val;
val2 = CValue::CreateUndefined();
EXPECT_TRUE(val.IsInit());
EXPECT_FALSE(val2.IsInit());
CValueRef ref = val;
ref = CValue::CreateUndefined();
EXPECT_FALSE(val.IsInit());
EXPECT_FALSE(ref.IsInit());
ref = 3;
EXPECT_TRUE(val.IsInit());
EXPECT_TRUE(ref.IsInit());
}
// ----------- toJS() tests -----------
TEST_F(CJSONTest, toJS_undefined)
{
CValue val;
JSSmart<CJSValue> jsVal = toJS(val);
EXPECT_TRUE(compare(val, jsVal));
}
TEST_F(CJSONTest, toJS_null)
{
CValue val = CValue::CreateNull();
JSSmart<CJSValue> jsVal = toJS(val);
EXPECT_TRUE(compare(val, jsVal));
}
TEST_F(CJSONTest, toJS_typed_arrays)
{
BYTE* data = CValue::AllocTypedArray(4);
data[0] = 0x1A;
data[1] = 0x54;
data[2] = 0xFE;
data[3] = 0xFF;
CValue typedArr = CValue::CreateTypedArray(data, 4, false);
JSSmart<CJSValue> jsTypedArr = toJS(typedArr);
// NOTE: BE CAREFUL WHEN CALLLING toJS() MULTIPLE TIMES WITH THE SAME TYPED ARRAY!
// second typed array will NOT be initialized properly, since there is another `CJSTypedArray` containing this memory!
// JSSmart<CJSValue> jsTypedArr2 = toJS(typedArr);
EXPECT_TRUE(compare(typedArr, jsTypedArr));
}
TEST_F(CJSONTest, toJS_arrays)
{
BYTE* data = CValue::AllocTypedArray(4);
data[0] = 0x1A;
data[1] = 0x54;
data[2] = 0xFE;
data[3] = 0xFF;
CValue typedArr = CValue::CreateTypedArray(data, 4, false);
// can't add typed array to this inner array (see test above), only to external array
CValue arrInner = {true, 42, L"тест функции toJS()", 2.71828, CValue(), "abc de f", L"test"};
CValue arr = {0, arrInner, arrInner, CValue::CreateNull(), arrInner, CValue::CreateArray(4), typedArr};
JSSmart<CJSValue> jsArr = toJS(arr);
EXPECT_TRUE(compare(arr, jsArr));
}
TEST_F(CJSONTest, toJS_arrays_circular)
{
// NOTE: BE CAREFULL WHEN CREATING CIRCULAR REFERENCE DEPENDENCY IN YOUR ARRAY OR OBJECT!
CValue arr = CValue::CreateArray(2);
CValueRef ref = arr;
arr[0] = 3;
arr[1] = ref;
// or simply:
// arr[1] = arr;
EXPECT_EQ((int)arr[0], 3);
EXPECT_EQ((int)arr[1][0], 3);
EXPECT_EQ((int)arr[1][1][1][1][1][1][1][1][1][1][0], 3);
EXPECT_TRUE(arr[1][1][1][1].IsArray());
// here you will get stack overflow, because each inner array reference will be transformed to a new copy of `CJSArray`
// JSSmart<CJSValue> jsArr = toJS(arr);
// keep only 2 inner recursions
CValue arrRec = arr[1][1];
arrRec[1] = 42;
EXPECT_TRUE(arr[1].IsInt());
JSSmart<CJSValue> jsArr = toJS(arr);
EXPECT_TRUE(compare(arr, jsArr));
}
TEST_F(CJSONTest, toJS_objects)
{
CValue obj = CValue::CreateObject();
obj["name"] = L"Foo";
obj["parameters"] = CValue::CreateObject();
CValueRef parameters = obj["parameters"];
parameters["size"] = 42;
parameters["arr"] = {CValue::CreateNull(), CValue::CreateArray(0), {42, L"тест функции toJS()", 2.71828}, CValue::CreateObject(), CValue(), "abc de f", L"test"};
parameters["0"] = 0;
BYTE* data = CValue::AllocTypedArray(4);
data[0] = 0x1A;
data[1] = 0x54;
data[2] = 0xFE;
data[3] = 0xFF;
CValue typedArr = CValue::CreateTypedArray(data, 4, false);
obj["typed"] = typedArr;
// NOTE: you can create property even without a name (like in JS)
obj[""] = "Bar";
JSSmart<CJSValue> jsObj = toJS(obj);
EXPECT_TRUE(compare(obj, jsObj));
}
// ----------- fromJS() tests -----------
TEST_F(CJSONTest, fromJS_undefined)
{
JSSmart<CJSValue> jsVal = CJSContext::createUndefined();
CValue val = fromJS(jsVal);
EXPECT_TRUE(compare(val, jsVal));
}
TEST_F(CJSONTest, fromJS_null)
{
JSSmart<CJSValue> jsVal = CJSContext::createNull();
CValue val = fromJS(jsVal);
EXPECT_TRUE(compare(val, jsVal));
}
TEST_F(CJSONTest, fromJS_and_toJS_edge_numbers)
{
JSSmart<CJSArray> jsVal = CJSContext::createArray(16);
jsVal->set(0, INT_MIN);
jsVal->set(1, INT_MAX);
jsVal->set(2, 0);
jsVal->set(3, 42);
jsVal->set(4, 0.0);
jsVal->set(5, 3.1415926535);
jsVal->set(6, 42.0);
jsVal->set(7, (double)INT_MIN);
jsVal->set(8, (double)INT_MAX);
jsVal->set(9, std::pow(2.0, 31) - 1);
jsVal->set(10, std::pow(2.0, 31));
jsVal->set(11, -std::pow(2.0, 31));
jsVal->set(12, -std::pow(2.0, 31) - 1);
jsVal->set(13, INFINITY);
jsVal->set(14, NAN);
jsVal->set(15, -INFINITY);
CValue val = fromJS(jsVal->toValue());
EXPECT_TRUE(compare(val, jsVal->toValue()));
EXPECT_TRUE(val[0].IsInt()); // INT_MIN
EXPECT_TRUE(val[1].IsInt()); // INT_MAX
EXPECT_TRUE(val[2].IsInt()); // 0
EXPECT_TRUE(val[3].IsInt()); // 42
EXPECT_TRUE(val[4].IsInt()); // 0.0
EXPECT_TRUE(val[5].IsDouble()); // 3.1415926535
EXPECT_TRUE(val[6].IsInt()); // 42.0
EXPECT_TRUE(val[7].IsInt()); // (double)INT_MIN
EXPECT_TRUE(val[8].IsInt()); // (double)INT_MAX
EXPECT_TRUE(val[9].IsInt()); // 2^31 - 1 == INT_MAX
EXPECT_TRUE(val[10].IsDouble()); // 2^31
EXPECT_TRUE(val[11].IsInt()); // -2^31 == INT_MIN
EXPECT_TRUE(val[12].IsDouble()); // -2^31 - 1
EXPECT_TRUE(val[13].IsDouble()); // inf
EXPECT_TRUE(val[14].IsDouble()); // NaN
EXPECT_TRUE(val[15].IsDouble()); // -inf
JSSmart<CJSValue> jsVal2 = toJS(val);
EXPECT_TRUE(compare(val, jsVal2));
}
TEST_F(CJSONTest, fromJS_typed_arrays)
{
BYTE* data = NSAllocator::Alloc(4);
data[0] = 0x1A;
data[1] = 0x54;
data[2] = 0xFE;
data[3] = 0xFF;
JSSmart<CJSValue> jsTypedArr = CJSContext::createUint8Array(data, 4, false);
CValue typedArr = fromJS(jsTypedArr);
EXPECT_TRUE(compare(typedArr, jsTypedArr));
}
TEST_F(CJSONTest, fromJS_arrays)
{
BYTE* data = NSAllocator::Alloc(4);
data[0] = 0x1A;
data[1] = 0x54;
data[2] = 0xFE;
data[3] = 0xFF;
JSSmart<CJSValue> jsTypedArr = CJSContext::createUint8Array(data, 4, false);
JSSmart<CJSArray> jsArrInner = CJSContext::createArray(0);
jsArrInner->add_bool(true);
jsArrInner->add_int(42);
jsArrInner->add_string(L"тест функции fromJS()");
jsArrInner->add_double(2.71828);
jsArrInner->add_undefined();
jsArrInner->add_stringa("abc de f");
jsArrInner->add_string(L"test");
JSSmart<CJSArray> jsArr = CJSContext::createArray(0);
jsArr->add_int(0);
jsArr->add(jsArrInner->toValue());
jsArr->add(jsArrInner->toValue());
jsArr->add_null();
jsArr->add(jsArrInner->toValue());
jsArr->add(CJSContext::createArray(4));
jsArr->add(jsTypedArr);
CValue arr = fromJS(jsArr->toValue());
EXPECT_TRUE(compare(arr, jsArr->toValue()));
}
TEST_F(CJSONTest, fromJS_objects)
{
JSSmart<CJSObject> jsObj = CJSContext::createObject();
jsObj->set("name", CJSContext::createString(L"Foo"));
JSSmart<CJSObject> jsParam = CJSContext::createObject();
jsParam->set("size", 42);
jsParam->set("arr", CJSContext::createArray(0));
JSSmart<CJSArray> jsArr = jsParam->get("arr")->toArray();
jsArr->add_null();
jsArr->add(CJSContext::createArray(0));
jsArr->add(CJSContext::createArray(3));
jsArr->get(2)->toArray()->set(0, 42);
jsArr->get(2)->toArray()->set(1, CJSContext::createString(L"тест функции fromJS()"));
jsArr->get(2)->toArray()->set(2, 2.71828);
jsArr->add(CJSContext::createObject());
jsArr->add_undefined();
jsArr->add_stringa("abc de f");
jsArr->add_bool(true);
jsParam->set("0", 0);
jsObj->set("parameters", jsParam);
BYTE* data = NSAllocator::Alloc(4);
data[0] = 0x1A;
data[1] = 0x54;
data[2] = 0xFE;
data[3] = 0xFF;
JSSmart<CJSValue> jsTypedArr = CJSContext::createUint8Array(data, 4, false);
jsObj->set("typed", jsTypedArr);
jsObj->set("", CJSContext::createString("Bar"));
CValue obj = fromJS(jsObj->toValue());
EXPECT_TRUE(compare(obj, jsObj->toValue()));
}
TEST_F(CJSONTest, serialization_with_script)
{
JSSmart<CJSValue> jsObj = m_pContext->runScript(
"(() => {"
" let obj = {};"
" obj['name'] = 'Foo';"
" obj['parameters'] = { size: 42, arr: [null, [], [42, 'test', 2.71828], {}, undefined, 'abc de f', ''], 0: 0, typedArr: { data: null, count: 0 } };"
" obj[''] = 'Bar';"
" return obj;"
"})();"
);
CValue obj = fromJS(jsObj);
EXPECT_EQ(obj["name"].ToStringW(), L"Foo");
EXPECT_EQ(obj[""].ToStringW(), L"Bar");
EXPECT_EQ((double)obj["parameters"]["arr"][2][0], 42);
EXPECT_TRUE(obj["parameters"]["arr"][4].IsUndefined());
EXPECT_EQ((int)obj["parameters"]["0"], 0);
EXPECT_TRUE(obj["parameters"]["typedArr"]["data"].IsNull());
EXPECT_TRUE(compare(obj, jsObj));
// function test() returns 0 if all checks have passed and number of failed check otherwise
m_pContext->runScript(
"function test(obj) {"
" if (obj['name'] !== 'Foo')"
" return 1;"
" if (obj[''] !== 'Bar')"
" return 2;"
" if (obj['parameters']['arr'][2][0] !== 42)"
" return 3;"
" if (obj['parameters']['arr'][4] !== undefined)"
" return 4;"
" if (obj['parameters']['0'] !== 0)"
" return 5;"
" if (obj['parameters']['typedArr']['data'] !== null)"
" return 6;"
" return 0;"
"}"
);
JSSmart<CJSObject> global = m_pContext->GetGlobal();
JSSmart<CJSValue> args[1];
args[0] = toJS(obj);
JSSmart<CJSValue> jsCheckResult = global->call_func("test", 1, args);
EXPECT_TRUE(jsCheckResult->isNumber());
EXPECT_EQ(jsCheckResult->toInt32(), 0);
EXPECT_TRUE(compare(obj, args[0]));
}
#else
int main()
{
JSSmart<CJSContext> pContext = new CJSContext();
CJSContextScope scope(pContext);
// top object with some text parameters
CValue textPr = CValue::CreateObject();
CValue colorRGB = CValue::CreateObject();
colorRGB["r"] = 12;
colorRGB["g"] = 34;
colorRGB["b"] = 56;
CValue colorRGBA = CValue::CreateObject();
colorRGBA["rgb"] = colorRGB;
colorRGBA["alpha"] = 80;
// CValueRef behaves as reference
CValueRef name = textPr["name"];
// from now on, name - is a reference to the property "name" of textPr. Changing it will affect this object property:
name = "Foo";
// Also you can chain references
CValueRef name3 = name;
name3 = "FooBar"; // this change applies to textPr["name"]
// The same but with CValue wouldnt' work:
CValue name2 = textPr["name"];
name2 = "Bar"; // this change doesn't affect the property "name" of textPr
textPr["size"] = 4.2;
textPr["color"] = colorRGBA;
textPr["font"] = CValue::CreateObject();
textPr["font"]["fontName"] = L"Times New Roman";
textPr["font"]["bold"] = true;
// undefined member:
textPr["font"]["italic"] = CValue::CreateUndefined();
// or just
// textPr["font"]["italic"];
// null member:
textPr["extras"] = CValue::CreateNull();
// array
CValue numbers = {10000, 12, 42, 0, 147};
// inner array
CValue innerArray = {true, "abc", 3.1415926535, L"ABC", 4};
numbers[3] = innerArray;
textPr["numbers"] = numbers;
// create typed array
BYTE* pData = CValue::AllocTypedArray(4);
pData[0] = 11;
pData[1] = 23;
pData[2] = 58;
pData[3] = 13;
// add typed array
CValue typedArr = CValue::CreateTypedArray(pData, 4, false);
textPr["typedArr"] = typedArr;
// convert to JS
JSSmart<CJSObject> jsObj = toJS(textPr)->toObject();
JSSmart<CJSObject> global = pContext->GetGlobal();
global->set("textPr", jsObj);
JSSmart<CJSValue> ret = pContext->runScript("(function () { return JSON.stringify(textPr, null, 4); })();");
if (ret.IsInit())
{
std::cout << ret->toStringA() << std::endl;
}
// convert fromJS() the same object:
CValue textPr2 = fromJS(jsObj->toValue());
// and then back toJS() to see if result is the same
JSSmart<CJSObject> jsObj2 = toJS(textPr2)->toObject();
global->set("textPr2", jsObj2);
ret = pContext->runScript("(function () { return JSON.stringify(textPr2, null, 4); })();");
if (ret.IsInit())
{
std::cout << ret->toStringA() << std::endl;
}
return 0;
}
#endif // JSON_GOOGLE_TEST

View File

@ -0,0 +1,39 @@
QT -= core
QT -= gui
TARGET = test
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
CONFIG += core_static_link_libstd
CORE_ROOT_DIR = $$PWD/../../../../../core
CORE_3DPARTY_DIR = $$CORE_ROOT_DIR/Common/3dParty
PWD_ROOT_DIR = $$PWD
include($$CORE_ROOT_DIR/Common/base.pri)
# Comment to inspect simple usage example
# Uncomment to run google tests
CONFIG += json_google_test
json_google_test {
include($$CORE_3DPARTY_DIR/googletest/googletest.pri)
DEFINES += JSON_GOOGLE_TEST
}
DESTDIR = $$PWD/build
INCLUDEPATH += ../..
ADD_DEPENDENCY(doctrenderer)
core_linux {
LIBS += -Wl,-unresolved-symbols=ignore-in-shared-libs
LIBS += -ldl
}
SOURCES += \
main.cpp

View File

@ -1707,7 +1707,7 @@ static long GetNextNameValue(HKEY key, const std::wstring& sSubkey, std::wstring
#endif
std::vector<std::wstring> CApplicationFonts::GetSetupFontFiles()
std::vector<std::wstring> CApplicationFonts::GetSetupFontFiles(const bool& bIsUseUserFonts)
{
#if defined(_WIN32) || defined (_WIN64)
// Ищем директорию с фонтами (обычно это C:\Windows\Fonts)
@ -1778,13 +1778,16 @@ std::vector<std::wstring> CApplicationFonts::GetSetupFontFiles()
{
std::vector<std::wstring> oArray2 = NSDirectory::GetFiles(L"C:\\Windows\\Fonts", true);
wchar_t sUserName[1000];
DWORD nUserNameLen = 1000 + 1;
GetUserNameW(sUserName, &nUserNameLen);
std::wstring strUserName(sUserName, nUserNameLen - 1);
if (bIsUseUserFonts)
{
wchar_t sUserName[1000];
DWORD nUserNameLen = 1000 + 1;
GetUserNameW(sUserName, &nUserNameLen);
std::wstring strUserName(sUserName, nUserNameLen - 1);
NSDirectory::GetFiles2(L"C:\\Users\\" + strUserName + L"\\AppData\\Local\\Microsoft\\Windows\\Fonts", oArray2, false);
NSDirectory::GetFiles2(L"C:\\Users\\" + strUserName + L"\\AppData\\Local\\Microsoft\\FontCache\\4\\CloudFonts", oArray2, true);
NSDirectory::GetFiles2(L"C:\\Users\\" + strUserName + L"\\AppData\\Local\\Microsoft\\Windows\\Fonts", oArray2, false);
NSDirectory::GetFiles2(L"C:\\Users\\" + strUserName + L"\\AppData\\Local\\Microsoft\\FontCache\\4\\CloudFonts", oArray2, true);
}
for (std::vector<std::wstring>::iterator i = oArray2.begin(); i != oArray2.end(); i++)
{
@ -1800,9 +1803,11 @@ std::vector<std::wstring> CApplicationFonts::GetSetupFontFiles()
std::vector<std::wstring> _array = NSDirectory::GetFiles(L"/usr/share/fonts", true);
NSDirectory::GetFiles2(L"/usr/share/X11/fonts", _array, true);
NSDirectory::GetFiles2(L"/usr/X11R6/lib/X11/fonts", _array, true);
NSDirectory::GetFiles2(L"/usr/local/share/fonts", _array, true);
NSDirectory::GetFiles2(L"/run/host/fonts", _array, true);
if (bIsUseUserFonts)
NSDirectory::GetFiles2(L"/usr/local/share/fonts", _array, true);
#ifndef BUILDING_WASM_MODULE
std::wstring custom_fonts_path = NSSystemUtils::GetEnvVariable(L"CUSTOM_FONTS_PATH");
if (!custom_fonts_path.empty())

View File

@ -345,7 +345,7 @@ public:
void InitializeFromBin(BYTE* pData, unsigned int nLen);
void InitializeRanges(unsigned char* data);
std::vector<std::wstring> GetSetupFontFiles();
std::vector<std::wstring> GetSetupFontFiles(const bool& bIsUseUserFonts = true);
void InitializeFromArrayFiles(std::vector<std::wstring>& files, int nFlag = 0);
#if defined(_WIN32) || defined (_WIN64)

View File

@ -1566,6 +1566,7 @@ public:
CApplicationFontsWorker::CApplicationFontsWorker()
{
m_bIsUseSystemFonts = true;
m_bIsUseSystemUserFonts = true;
m_bIsNeedThumbnails = true;
m_bIsUseOpenType = true;
m_bIsUseAllVersions = false;
@ -1658,7 +1659,7 @@ NSFonts::IApplicationFonts* CApplicationFontsWorker::Check()
std::vector<std::wstring> strFontsW_Cur;
if (m_bIsUseSystemFonts)
strFontsW_CurSrc = pApplicationF->GetSetupFontFiles();
strFontsW_CurSrc = pApplicationF->GetSetupFontFiles(m_bIsUseSystemUserFonts);
for (std::vector<std::wstring>::iterator i = m_arAdditionalFolders.begin(); i != m_arAdditionalFolders.end(); i++)
{

View File

@ -51,6 +51,8 @@ class GRAPHICS_DECL CApplicationFontsWorker
public:
// использовать ли системные шрифты
bool m_bIsUseSystemFonts;
bool m_bIsUseSystemUserFonts;
// дополнительные папки с шрифтами
std::vector<std::wstring> m_arAdditionalFolders;

View File

@ -1,4 +1,4 @@
/*
/*
* (c) Copyright Ascensio System SIA 2010-2023
*
* This program is a free software product. You can redistribute it and/or
@ -38,7 +38,7 @@
#ifdef _DEBUG
#define _LOGGING_NATIVE_
#else
//#define _LOGGING_NATIVE_
// #define _LOGGING_NATIVE_
#endif
#ifdef _LINUX
@ -51,9 +51,9 @@ static void LOGGING(const std::string& strFile, const std::wstring& strMessage)
{
#ifdef _LOGGING_NATIVE_
FILE* f = fopen(strFile.c_str(), "a+");
BYTE* pData = NULL;
LONG lLen = 0;
LONG lLen = 0;
NSFile::CUtf8Converter::GetUtf8StringFromUnicode(strMessage.c_str(), (LONG)strMessage.length(), pData, lLen);
pData[lLen] = 0;
@ -79,10 +79,10 @@ namespace NSMemoryStream
public:
CMemoryStream()
{
m_pBuffer = NULL;
m_pBufferMem = NULL;
m_pBuffer = NULL;
m_pBufferMem = NULL;
m_lSize = 0;
m_lSize = 0;
}
virtual ~CMemoryStream()
{
@ -100,10 +100,10 @@ namespace NSMemoryStream
inline void Clear()
{
m_lSize = 0;
m_lSize = 0;
m_pBuffer = NULL;
m_pBufferMem = NULL;
m_pBuffer = NULL;
m_pBufferMem = NULL;
}
inline void ClearNoAttack()
@ -133,17 +133,17 @@ namespace NSMemoryStream
BYTE* pNew = new BYTE[m_lSize];
memcpy(pNew, m_pBuffer, m_pBufferMem - m_pBuffer);
m_pBufferMem = pNew + (m_pBufferMem - m_pBuffer);
m_pBufferMem = pNew + (m_pBufferMem - m_pBuffer);
RELEASEARRAYOBJECTS(m_pBuffer);
m_pBuffer = pNew;
m_pBuffer = pNew;
}
}
else
{
m_lSize = 1000;
m_pBuffer = new BYTE[m_lSize];
m_pBufferMem = m_pBuffer;
m_lSize = 1000;
m_pBuffer = new BYTE[m_lSize];
m_pBufferMem = m_pBuffer;
CheckBufferSize(lPlus);
}
@ -166,23 +166,34 @@ namespace NSMemoryStream
}
inline void WriteLONG(const LONG& lValue)
{
CheckBufferSize(sizeof(INT));
CheckBufferSize(sizeof(INT));
#ifdef _ARM_ALIGN_
INT v = lValue;
memcpy(m_pBufferMem, &v, sizeof(INT));
INT v = lValue;
memcpy(m_pBufferMem, &v, sizeof(INT));
#else
*((INT*)(m_pBufferMem)) = (INT)lValue;
*((INT*)(m_pBufferMem)) = (INT)lValue;
#endif
m_pBufferMem += sizeof(INT);
m_pBufferMem += sizeof(INT);
}
inline void WriteUSHORT(const USHORT& lValue)
{
CheckBufferSize(sizeof(USHORT));
#ifdef _ARM_ALIGN_
USHORT v = lValue;
memcpy(m_pBufferMem, &v, sizeof(USHORT));
#else
*((USHORT*)(m_pBufferMem)) = (USHORT)lValue;
#endif
m_pBufferMem += sizeof(USHORT);
}
inline void WriteDouble(const double& dValue)
{
CheckBufferSize(sizeof(double));
#ifdef _ARM_ALIGN_
double v = dValue;
memcpy(m_pBufferMem, &v, sizeof(double));
double v = dValue;
memcpy(m_pBufferMem, &v, sizeof(double));
#else
*((double*)(m_pBufferMem)) = dValue;
*((double*)(m_pBufferMem)) = dValue;
#endif
m_pBufferMem += sizeof(double);
}
@ -202,112 +213,50 @@ namespace NSMemoryStream
}
inline void WriteStringA2(const char* pData, int nLen)
{
CheckBufferSize(nLen + sizeof(INT));
CheckBufferSize(nLen + sizeof(INT));
#ifdef __ANDROID__
memcpy(m_pBufferMem, &nLen, sizeof(INT));
#else
*((INT*)(m_pBufferMem)) = (INT)nLen;
#endif
m_pBufferMem += sizeof(INT);
m_pBufferMem += sizeof(INT);
memcpy(m_pBufferMem, pData, nLen);
m_pBufferMem += nLen;
}
inline void WriteStringTruncate2(const wchar_t* pData, int nLenDouble)
{
if (sizeof(wchar_t) == 2)
{
memcpy(m_pBufferMem, pData, nLenDouble);
}
else
{
int len = nLenDouble >> 1;
USHORT* mass = new USHORT[len];
for (int i = 0; i < len; ++i)
mass[i] = (USHORT)pData[i];
memcpy(m_pBufferMem, mass, nLenDouble);
RELEASEARRAYOBJECTS(mass);
}
m_pBufferMem += nLenDouble;
}
inline void WriteString(const wchar_t* pData, int nLen)
{
#ifdef _ARM_ALIGN_
CheckBufferSize(nLen + sizeof(USHORT));
USHORT v = (USHORT)(nLen);
memcpy(m_pBufferMem, &v, sizeof(USHORT));
m_pBufferMem += sizeof(USHORT);
int nLen2 = nLen << 1;
if (sizeof(wchar_t) == 2)
{
memcpy(m_pBufferMem, pData, nLen2);
}
else
{
int len = nLen >> 1;
USHORT* mass = new USHORT[len];
for (int i = 0; i < len; ++i)
mass[i] = (USHORT)pData[i];
memcpy(m_pBufferMem, mass, nLen2);
RELEASEARRAYOBJECTS(mass);
}
m_pBufferMem += nLen2;
#else
CheckBufferSize(nLen + sizeof(USHORT));
*((USHORT*)(m_pBufferMem)) = (USHORT)nLen;
m_pBufferMem += sizeof(USHORT);
int nLen2 = nLen << 1;
if (sizeof(wchar_t) == 2)
{
memcpy(m_pBufferMem, pData, nLen2);
}
else
{
int len = nLen >> 1;
USHORT* mass = new USHORT[len];
for (int i = 0; i < len; ++i)
mass[i] = (USHORT)pData[i];
memcpy(m_pBufferMem, mass, nLen2);
RELEASEARRAYOBJECTS(mass);
}
m_pBufferMem += nLen2;
#endif
CheckBufferSize(nLen2 + sizeof(USHORT));
WriteUSHORT((USHORT)(nLen));
WriteStringTruncate2(pData, nLen2);
}
inline void WriteString2(const wchar_t* pData, int nLen)
{
#ifdef _ARM_ALIGN_
int nLen2 = nLen << 1;
CheckBufferSize(nLen2 + sizeof(INT));
INT v = (INT)(nLen2);
memcpy(m_pBufferMem, &v, sizeof(INT));
m_pBufferMem += sizeof(INT);
if (sizeof(wchar_t) == 2)
{
memcpy(m_pBufferMem, pData, nLen2);
}
else
{
USHORT* mass = new USHORT[nLen];
for (int i = 0; i < nLen; ++i)
mass[i] = (USHORT)pData[i];
memcpy(m_pBufferMem, mass, nLen2);
RELEASEARRAYOBJECTS(mass);
}
m_pBufferMem += nLen2;
#else
int nLen2 = nLen << 1;
CheckBufferSize(nLen2 + sizeof(INT));
*((INT*)(m_pBufferMem)) = (INT)nLen2;
m_pBufferMem += sizeof(INT);
if (sizeof(wchar_t) == 2)
{
memcpy(m_pBufferMem, pData, nLen2);
}
else
{
USHORT* mass = new USHORT[nLen];
for (int i = 0; i < nLen; ++i)
mass[i] = (USHORT)pData[i];
memcpy(m_pBufferMem, mass, nLen2);
RELEASEARRAYOBJECTS(mass);
}
m_pBufferMem += nLen2;
#endif
CheckBufferSize(nLen2 + sizeof(INT));
WriteLONG(nLen2);
WriteStringTruncate2(pData, nLen2);
}
inline void __WriteBYTE(const BYTE& lValue)
@ -326,20 +275,20 @@ namespace NSMemoryStream
inline void __WriteLONG(const LONG& lValue)
{
#ifdef _ARM_ALIGN_
INT v = (INT)lValue;
memcpy(m_pBufferMem, &v, sizeof(INT));
INT v = (INT)lValue;
memcpy(m_pBufferMem, &v, sizeof(INT));
#else
*((INT*)(m_pBufferMem)) = (INT)lValue;
*((INT*)(m_pBufferMem)) = (INT)lValue;
#endif
m_pBufferMem += sizeof(INT);
m_pBufferMem += sizeof(INT);
}
inline void __WriteDouble(const double& dValue)
{
#ifdef _ARM_ALIGN_
double v = dValue;
memcpy(m_pBufferMem, &v, sizeof(double));
double v = dValue;
memcpy(m_pBufferMem, &v, sizeof(double));
#else
*((double*)(m_pBufferMem)) = dValue;
*((double*)(m_pBufferMem)) = dValue;
#endif
m_pBufferMem += sizeof(double);
}
@ -350,7 +299,7 @@ namespace NSMemoryStream
memcpy(m_pBufferMem, pData, len);
m_pBufferMem += len;
}
};
}
};
} // namespace NSMemoryStream
#endif // _BUILD_MEMORYSTREAM_H_

View File

@ -35,7 +35,20 @@
var AscFonts = window['AscFonts'];
if (window["NATIVE_EDITOR_ENJINE"])
window.setImmediate = function(fn) { fn(); };
{
var immediateArray = [];
window.setImmediate = function(fn) {
if (immediateArray)
immediateArray.push(fn);
else
fn();
};
window.immediateRun = function() {
for (var i = 0; i < immediateArray.length; i++)
immediateArray[i]();
immediateArray = undefined;
};
}
var setImmediate = window.setImmediate;
@ -595,6 +608,8 @@ AscFonts.Hyphen_Word = function(lang, word)
return hyphens;
};
if (window["NATIVE_EDITOR_ENJINE"])
window.immediateRun();
AscFonts.onLoadModule();
})(window, undefined);

View File

@ -262,6 +262,10 @@
"folder": "../../",
"files": ["graphics/Image.cpp", "raster/BgraFrame.cpp", "raster/ImageFileFormatChecker.cpp"]
},
{
"folder": "../../raster/",
"files": ["PICT/PICFile.cpp", "PICT/pic.cpp"]
},
{
"folder": "../../graphics/pro/js/qt/raster",
"files": ["pro_Fonts_empty.cpp", "pro_Graphics_empty.cpp", "raster.cpp"]

View File

@ -441,9 +441,9 @@ function onLoadFontsModule(window, undefined)
this.codePoints = codePointsBuffer;
this.codePointsCount = 0
}
CCodePointsCalculator.prototype.start = function()
CCodePointsCalculator.prototype.start = function(startCluster)
{
this.currentCluster = 0;
this.currentCluster = startCluster;
this.currentCodePoint = 0;
this.codePointsCount = 0;
}
@ -452,10 +452,14 @@ function onLoadFontsModule(window, undefined)
this.currentCodePoint += this.codePointsCount;
let nCodePointsCount = 0;
if (cluster < this.currentCluster)
{
// TODO: RTL
while (this.currentCluster > cluster)
{
this.currentCluster -= this.clusterBuffer[this.currentCodePoint + nCodePointsCount];
++nCodePointsCount;
}
}
else
{
@ -562,9 +566,12 @@ function onLoadFontsModule(window, undefined)
let retObj = AscFonts.HB_ShapeText(fontFile, STRING_POINTER, features, script, direction, language, READER);
if (retObj["error"])
return;
CODEPOINTS_CALCULATOR.start();
let prevCluster = -1, type, flags, gid, cluster, x_advance, y_advance, x_offset, y_offset, codePoints;
let isRtl = direction === AscFonts.HB_DIRECTION.HB_DIRECTION_RTL;
CODEPOINTS_CALCULATOR.start(isRtl ? CLUSTER_MAX : 0);
let prevCluster = -1;
let type, flags, gid, cluster, x_advance, y_advance, x_offset, y_offset;
let isLigature = false;
let nWidth = 0;
let reader = READER;
@ -579,10 +586,10 @@ function onLoadFontsModule(window, undefined)
y_advance = reader.readInt();
x_offset = reader.readInt();
y_offset = reader.readInt();
if (cluster !== prevCluster && -1 !== prevCluster)
{
CODEPOINTS_CALCULATOR.calculate(cluster);
CODEPOINTS_CALCULATOR.calculate(isRtl ? prevCluster : cluster);
textShaper.FlushGrapheme(AscFonts.GetGrapheme(CODEPOINTS_CALCULATOR), nWidth, CODEPOINTS_CALCULATOR.getCount(), isLigature);
nWidth = 0;
}
@ -597,9 +604,10 @@ function onLoadFontsModule(window, undefined)
AscFonts.AddGlyphToGrapheme(gid, x_advance, y_advance, x_offset, y_offset);
nWidth += x_advance * COEF;
}
CODEPOINTS_CALCULATOR.calculate(CLUSTER_MAX);
CODEPOINTS_CALCULATOR.calculate(isRtl ? 0 : CLUSTER_MAX);
textShaper.FlushGrapheme(AscFonts.GetGrapheme(CODEPOINTS_CALCULATOR), nWidth, CODEPOINTS_CALCULATOR.getCount(), isLigature);
retObj["free"]();
};

View File

@ -1,69 +1,66 @@
#include "AlphaMask.h"
#include "AlphaMask_private.h"
#include <string.h>
namespace Aggplus
{
CAlphaMask::CAlphaMask()
: m_internal(new CAlphaMask_private())
: m_pBuffer(NULL)
{}
CAlphaMask::CAlphaMask(BYTE *pBuffer, EMaskDataType eDataType, bool bExternalBuffer)
: m_pBuffer(pBuffer), m_enDataType(eDataType), m_bExternalBuffer(bExternalBuffer)
{}
CAlphaMask::~CAlphaMask()
{
RELEASEOBJECT(m_internal)
if (!m_bExternalBuffer)
RELEASEARRAYOBJECTS(m_pBuffer);
}
void CAlphaMask::Clear()
BYTE *CAlphaMask::GetBuffer()
{
m_internal->Clear();
return m_pBuffer;
}
StatusAlphaMask CAlphaMask::GetStatus() const
EMaskDataType CAlphaMask::GetDataType() const
{
return m_internal->GetStatus();
}
AMaskDataType CAlphaMask::GetDataType() const
{
return m_internal->GetDataType();
return m_enDataType;
}
Status CAlphaMask::CreateImageBuffer(UINT unWidth, UINT unHeight)
UINT CAlphaMask::GetStep() const
{
return m_internal->Create(unWidth, unHeight, ImageBuffer);
switch(m_enDataType)
{
case EMaskDataType::ImageBuffer: return 4;
case EMaskDataType::AlphaBuffer: return 1;
}
}
Status CAlphaMask::CreateAlphaBuffer(UINT unWidth, UINT unHeight)
Status CAlphaMask::Create(UINT unWidth, UINT unHeight, EMaskDataType eDataType)
{
return m_internal->Create(unWidth, unHeight, AlphaBuffer);
if (0 == unWidth || 0 == unHeight)
return InvalidParameter;
m_enDataType = eDataType;
m_bExternalBuffer = false;
UINT unSize = unWidth * unHeight * GetStep();
m_pBuffer = new BYTE[unSize];
if (NULL == m_pBuffer)
return OutOfMemory;
memset(m_pBuffer, 0x00, unSize);
return Ok;
}
Status CAlphaMask::LoadFromAlphaBuffer(BYTE *pBuffer, UINT unWidth, UINT unHeight, bool bExternalBuffer)
Status CAlphaMask::LoadFromBuffer(BYTE *pBuffer, EMaskDataType eDataType, bool bExternalBuffer)
{
return m_internal->LoadFromBuffer(pBuffer, unWidth, unHeight, AlphaBuffer, bExternalBuffer);
}
Status CAlphaMask::LoadFromImageBuffer(BYTE *pBuffer, UINT unWidth, UINT unHeight, bool bExternalBuffer)
{
return m_internal->LoadFromBuffer(pBuffer, unWidth, unHeight, ImageBuffer, bExternalBuffer);
}
Status CAlphaMask::LoadFromFile(const std::wstring &wsFilePath)
{
return m_internal->LoadFromFile(wsFilePath);
}
Status CAlphaMask::LoadFromImage(IGrObject *pGrObject, bool bCopy)
{
return m_internal->LoadFromImage(pGrObject, bCopy);
}
BYTE *CAlphaMask::GetMask()
{
return m_internal->GetMask();
}
CAlphaMask &CAlphaMask::operator=(const CAlphaMask &oAlphaMask)
{
*m_internal = *oAlphaMask.m_internal;
return *this;
m_pBuffer = pBuffer;
m_enDataType = eDataType;
m_bExternalBuffer = bExternalBuffer;
return Ok;
}
}

View File

@ -8,45 +8,29 @@
namespace Aggplus
{
enum StatusAlphaMask
{
EmptyAlphaMask,
GenerationAlphaMask,
ApplyingAlphaMask
};
enum AMaskDataType
enum class EMaskDataType
{
ImageBuffer,
AlphaBuffer
};
class CAlphaMask_private;
class GRAPHICS_DECL CAlphaMask : public IGrObject
{
public:
CAlphaMask();
CAlphaMask(BYTE* pBuffer, EMaskDataType eDataType, bool bExternalBuffer = true);
virtual ~CAlphaMask();
StatusAlphaMask GetStatus() const;
AMaskDataType GetDataType() const;
BYTE* GetBuffer();
EMaskDataType GetDataType() const;
UINT GetStep() const;
void Clear();
Status CreateImageBuffer(UINT unWidth, UINT unHeight);
Status CreateAlphaBuffer(UINT unWidth, UINT unHeight);
Status LoadFromAlphaBuffer(BYTE* pBuffer, UINT unWidth, UINT unHeight, bool bExternalBuffer = true);
Status LoadFromImageBuffer(BYTE* pBuffer, UINT unWidth, UINT unHeight, bool bExternalBuffer = true);
Status LoadFromFile(const std::wstring& wsFilePath);
Status LoadFromImage(IGrObject* pGrObject, bool bCopy = true);
BYTE* GetMask();
CAlphaMask& operator=(const CAlphaMask& oAlphaMask);
public:
CAlphaMask_private *m_internal;
Status Create(UINT unWidth, UINT unHeight, EMaskDataType eDataType);
Status LoadFromBuffer(BYTE* pBuffer, EMaskDataType eDataType, bool bExternalBuffer = true);
private:
BYTE *m_pBuffer;
EMaskDataType m_enDataType;
bool m_bExternalBuffer;
};
}

View File

@ -1,218 +0,0 @@
#include "AlphaMask_private.h"
#include "../raster/BgraFrame.h"
namespace Aggplus
{
CAlphaMask_private::CAlphaMask_private()
: m_enStatus(EmptyAlphaMask), m_pImageData(NULL), m_pAlphaBufferData(NULL)
{}
CAlphaMask_private::~CAlphaMask_private()
{
Clear();
}
StatusAlphaMask CAlphaMask_private::GetStatus() const
{
return m_enStatus;
}
AMaskDataType CAlphaMask_private::GetDataType() const
{
return m_enDataType;
}
void CAlphaMask_private::Clear()
{
BYTE *pBuffer = m_oRenderingBuffer.buf();
if (NULL != pBuffer)
{
if (!m_bExternalBuffer)
RELEASEARRAYOBJECTS(pBuffer);
m_oRenderingBuffer.attach(NULL, 0, 0, 0);
}
RELEASEOBJECT(m_pImageData)
RELEASEOBJECT(m_pAlphaBufferData)
m_enStatus = EmptyAlphaMask;
}
Status CAlphaMask_private::Create(UINT unWidth, UINT unHeight, AMaskDataType enDataType)
{
if (0 == unWidth || 0 == unHeight)
return InvalidParameter;
BYTE* pAlphaBufffer = new BYTE[unWidth * unHeight * ((enDataType == ImageBuffer) ? 4 : 1)];
if (NULL == pAlphaBufffer)
return OutOfMemory;
Set(pAlphaBufffer, unWidth, unHeight, enDataType);
if (enDataType == ImageBuffer)
m_pImageData->m_oRendererBase.clear(agg::rgba8(0, 0, 0));
else if (enDataType == AlphaBuffer)
m_pAlphaBufferData->m_oRendererBase.clear(agg::gray8(0));
m_enStatus = GenerationAlphaMask;
m_bExternalBuffer = false;
return Ok;
}
Status CAlphaMask_private::LoadFromBuffer(BYTE *pBuffer, UINT unWidth, UINT unHeight, AMaskDataType enBufferType, bool bExternalBuffer)
{
if (NULL == pBuffer || 0 == unWidth || 0 == unHeight)
return InvalidParameter;
Set(pBuffer, unWidth, unHeight, enBufferType);
m_enStatus = ApplyingAlphaMask;
m_bExternalBuffer = bExternalBuffer;
return Ok;
}
Status CAlphaMask_private::LoadFromFile(const std::wstring &wsFilePath)
{
if (wsFilePath.empty())
return InvalidParameter;
CBgraFrame oFrame;
if (!oFrame.OpenFile(wsFilePath))
return GenericError;
UINT unWidth = oFrame.get_Width();
UINT unHeight = oFrame.get_Height();
Set(oFrame.get_Data(), unWidth, unHeight, ImageBuffer);
oFrame.put_Data(NULL);
m_enStatus = ApplyingAlphaMask;
m_bExternalBuffer = false;
return Ok;
}
Status CAlphaMask_private::LoadFromImage(IGrObject *pGrObject, bool bCopy)
{
if (NULL == pGrObject)
return InvalidParameter;
CImage *pImage = (CImage*)pGrObject;
if (Ok != pImage->GetLastStatus())
return GenericError;
UINT unWidth = pImage->GetWidth();
UINT unHeight = pImage->GetHeight();
BYTE *pBuffer = NULL;
if (bCopy)
{
const UINT unSize = 4 * unWidth * unWidth;
pBuffer = new BYTE[unSize];
memcpy(pBuffer, pImage->GetData(), unSize);
}
else
pBuffer = pImage->GetData();
Set(pBuffer, unWidth, unHeight, ImageBuffer);
return Ok;
}
RenBaseBGRA32 &CAlphaMask_private::GetRendererBaseImage()
{
return m_pImageData->m_oRendererBase;
}
ScanlineBGRA32Gray &CAlphaMask_private::GetScanlineImage()
{
return m_pImageData->m_oScanLine;
}
ScanlineGray8 &CAlphaMask_private::GetScanlineABuffer()
{
return m_pAlphaBufferData->m_oScanLine;
}
BYTE *CAlphaMask_private::GetMask()
{
return m_oRenderingBuffer.buf();
}
void CAlphaMask_private::StartApplying()
{
m_enStatus = ApplyingAlphaMask;
}
CAlphaMask_private &CAlphaMask_private::operator=(const CAlphaMask_private &oAlphaMask)
{
Clear();
m_enDataType = oAlphaMask.m_enDataType;
m_enStatus = oAlphaMask.m_enStatus;
m_bExternalBuffer = false;
if (EmptyAlphaMask == m_enStatus)
return *this;
const UINT unSize = oAlphaMask.m_oRenderingBuffer.width() * oAlphaMask.m_oRenderingBuffer.height() * ((m_enDataType == ImageBuffer) ? 4 : 1);
BYTE* pBuffer = new BYTE[unSize];
memcpy(pBuffer, oAlphaMask.m_oRenderingBuffer.buf(), unSize);
Set(pBuffer, oAlphaMask.m_oRenderingBuffer.width(), oAlphaMask.m_oRenderingBuffer.height(), m_enDataType);
return *this;
}
void CAlphaMask_private::Set(BYTE *pBuffer, UINT unWidth, UINT unHeight, AMaskDataType enDataType)
{
Clear();
m_enDataType = enDataType;
switch (enDataType)
{
case ImageBuffer:
{
m_oRenderingBuffer.attach(pBuffer, unWidth, unHeight, 4 * unWidth);
m_pImageData = new AMaskFromImage(m_oRenderingBuffer);
m_pImageData->m_oPixfmt.attach(m_oRenderingBuffer);
m_pImageData->m_oRendererBase.attach(m_pImageData->m_oPixfmt);
m_pImageData->m_oAlphaMask.attach(m_oRenderingBuffer);
break;
}
case AlphaBuffer:
{
m_oRenderingBuffer.attach(pBuffer, unWidth, unHeight, unWidth);
m_pAlphaBufferData = new AMaskFromABuffer(m_oRenderingBuffer);
m_pAlphaBufferData->m_oPixfmt.attach(m_oRenderingBuffer);
m_pAlphaBufferData->m_oRendererBase.attach(m_pAlphaBufferData->m_oPixfmt);
m_pAlphaBufferData->m_oAlphaMask.attach(m_oRenderingBuffer);
break;
}
}
}
agg::rendering_buffer &CAlphaMask_private::GetRenderingBuffer()
{
return m_oRenderingBuffer;
}
}

View File

@ -1,78 +0,0 @@
#ifndef _BUILD_ALPHAMASK_PRIVATE_H_
#define _BUILD_ALPHAMASK_PRIVATE_H_
#include <string>
#include "aggplustypes.h"
#include "./AlphaMask.h"
#include "../agg-2.4/include/agg_alpha_mask_u8.h"
#include "../agg-2.4/include/agg_renderer_base.h"
#include "../agg-2.4/include/agg_pixfmt_gray.h"
#include "../agg-2.4/include/agg_pixfmt_rgba.h"
#include "../agg-2.4/include/agg_scanline_u.h"
namespace Aggplus
{
template <class PixelFormat, class AlphaMask>
struct TAlphaMaskData
{
TAlphaMaskData(agg::rendering_buffer& oRenderingBuffer)
: m_oPixfmt(oRenderingBuffer), m_oScanLine(m_oAlphaMask)
{};
PixelFormat m_oPixfmt;
agg::renderer_base<PixelFormat> m_oRendererBase;
AlphaMask m_oAlphaMask;
agg::scanline_u8_am<AlphaMask> m_oScanLine; // Используется для применения альфа маски
};
typedef agg::renderer_base<agg::pixfmt_bgra32> RenBaseBGRA32;
typedef agg::scanline_u8_am<agg::alpha_mask_bgra32gray> ScanlineBGRA32Gray;
typedef agg::scanline_u8_am<agg::alpha_mask_gray8> ScanlineGray8;
class CAlphaMask_private
{
public:
CAlphaMask_private();
~CAlphaMask_private();
StatusAlphaMask GetStatus() const;
AMaskDataType GetDataType() const;
void Clear();
Status Create(UINT unWidth, UINT unHeight, AMaskDataType enDataType);
Status LoadFromBuffer(BYTE* pBuffer, UINT unWidth, UINT unHeight, AMaskDataType enBufferType, bool bExternalBuffer = true);
Status LoadFromFile(const std::wstring& wsFilePath);
Status LoadFromImage(IGrObject* pGrObject, bool bCopy = true);
agg::rendering_buffer& GetRenderingBuffer();
RenBaseBGRA32& GetRendererBaseImage();
ScanlineBGRA32Gray& GetScanlineImage();
ScanlineGray8& GetScanlineABuffer();
BYTE* GetMask();
void StartApplying();
CAlphaMask_private& operator=(const CAlphaMask_private& oAlphaMask);
private:
void Set(BYTE* pBuffer, UINT unWidth, UINT unHeight, AMaskDataType enDataType);
agg::rendering_buffer m_oRenderingBuffer;
StatusAlphaMask m_enStatus;
AMaskDataType m_enDataType;
bool m_bExternalBuffer;
public:
typedef TAlphaMaskData<agg::pixfmt_bgra32, agg::alpha_mask_bgra32gray> AMaskFromImage;
typedef TAlphaMaskData<agg::pixfmt_gray8, agg::alpha_mask_gray8> AMaskFromABuffer;
AMaskFromImage *m_pImageData;
AMaskFromABuffer *m_pAlphaBufferData;
};
}
#endif // _BUILD_ALPHAMASK_PRIVATE_H_

View File

@ -30,13 +30,13 @@
*
*/
#if defined(__ANDROID__) && !defined (NOT_USE_PTHREAD_CANCEL)
#if defined(__ANDROID__) && !defined(NOT_USE_PTHREAD_CANCEL)
#include <pthread_setcanceltype.h>
#endif
#include "./BaseThread.h"
#include "./BaseThreadMonitor.h"
#if defined(_WIN32) || defined(_WIN64) ||defined(_WIN32_WCE)
#if defined(_WIN32) || defined(_WIN64) || defined(_WIN32_WCE)
#include <winbase.h>
@ -49,203 +49,230 @@
namespace NSThreads
{
class CThreadDescriptor
{
public:
CThreadDescriptor()
{
}
virtual ~CThreadDescriptor()
{
}
};
class CThreadDescriptor
{
public:
CThreadDescriptor()
{
}
virtual ~CThreadDescriptor()
{
}
};
ASC_THREAD_ID GetCurrentThreadId()
{
#if defined(_WIN32) || defined (_WIN64)
return ::GetCurrentThreadId();
ASC_THREAD_ID GetCurrentThreadId()
{
#if defined(_WIN32) || defined(_WIN64)
return ::GetCurrentThreadId();
#else
return pthread_self();
return pthread_self();
#endif
}
}
void Sleep(int nMilliseconds)
void Sleep(int nMilliseconds)
{
#if defined(_WIN32) || defined(_WIN64) || defined(_WIN32_WCE)
::Sleep((DWORD)nMilliseconds);
#else
struct timespec tim, tim2;
tim.tv_sec = nMilliseconds / 1000;
tim.tv_nsec = (nMilliseconds % 1000) * 1000000;
tim.tv_sec = nMilliseconds / 1000;
tim.tv_nsec = (nMilliseconds % 1000) * 1000000;
::nanosleep(&tim , &tim2);
::nanosleep(&tim, &tim2);
#endif
}
#if defined(_WIN32) || defined(_WIN64) || defined(_WIN32_WCE)
DWORD WINAPI CBaseThread::__ThreadProc(void* pv)
{
CBaseThread* pThis = (CBaseThread*)pv;
DWORD value = pThis->ThreadProc();
if (pThis->m_bIsNeedDestroy)
delete pThis;
return value;
}
DWORD WINAPI CBaseThread::__ThreadProc(void* pv)
{
CBaseThread* pThis = (CBaseThread*)pv;
class __native_thread : public CThreadDescriptor
{
friend class CBaseThread;
private:
HANDLE m_thread = nullptr;
CBaseThreadMonitor::Get().Register(pThis);
DWORD value = pThis->ThreadProc();
CBaseThreadMonitor::Get().Unregister(pThis);
public:
__native_thread() : CThreadDescriptor()
{
}
virtual ~__native_thread()
{
if (m_thread)
{
CloseHandle(m_thread);
m_thread = NULL;
}
}
};
if (pThis->m_bIsNeedDestroy)
delete pThis;
return value;
}
class __native_thread : public CThreadDescriptor
{
friend class CBaseThread;
private:
HANDLE m_thread = nullptr;
public:
__native_thread() : CThreadDescriptor()
{
}
virtual ~__native_thread()
{
if (m_thread)
{
CloseHandle(m_thread);
m_thread = NULL;
}
}
};
#else
void* CBaseThread::__ThreadProc(void* pv)
{
void* CBaseThread::__ThreadProc(void* pv)
{
#ifndef NOT_USE_PTHREAD_CANCEL
int old_thread_type;
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &old_thread_type);
int old_thread_type;
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, &old_thread_type);
#endif
CBaseThread* pThis = (CBaseThread*)pv;
pThis->ThreadProc();
CBaseThread* pThis = (CBaseThread*)pv;
if (pThis->m_bIsNeedDestroy)
delete pThis;
CBaseThreadMonitor::Get().Register(pThis);
DWORD value = pThis->ThreadProc();
CBaseThreadMonitor::Get().Unregister(pThis);
return NULL;
}
class __native_thread : public CThreadDescriptor
{
friend class CBaseThread;
private:
pthread_t m_thread;
if (pThis->m_bIsNeedDestroy)
delete pThis;
public:
__native_thread() : CThreadDescriptor()
{
m_thread = NULL;
}
virtual ~__native_thread()
{
}
};
return NULL;
}
class __native_thread : public CThreadDescriptor
{
friend class CBaseThread;
private:
pthread_t m_thread;
public:
__native_thread() : CThreadDescriptor()
{
m_thread = NULL;
}
virtual ~__native_thread()
{
}
};
#endif
CBaseThread::CBaseThread()
{
m_hThread = NULL;
m_bRunThread = FALSE;
m_bSuspend = FALSE;
CBaseThread::CBaseThread()
{
m_hThread = NULL;
m_bRunThread = FALSE;
m_bSuspend = FALSE;
m_lError = 0;
m_lThreadPriority = 0;
m_lError = 0;
m_lThreadPriority = 0;
m_bIsNeedDestroy = false;
}
CBaseThread::~CBaseThread()
{
Stop();
}
void CBaseThread::Start(int lPriority)
{
if (m_bRunThread)
return;
m_lError = 0;
m_bSuspend = FALSE;
m_bIsNeedDestroy = false;
}
CBaseThread::~CBaseThread()
{
Stop();
}
void CBaseThread::Start(int lPriority)
{
if (m_bRunThread)
return;
m_lError = 0;
m_bSuspend = FALSE;
m_hThread = new __native_thread();
m_hThread = new __native_thread();
m_bRunThread = TRUE;
m_bRunThread = TRUE;
m_bIsExit.store(false);
m_bIsExit.store(false);
#if defined(_WIN32) || defined(_WIN64) || defined(_WIN32_WCE)
DWORD dwTemp;
((__native_thread*)m_hThread)->m_thread = CreateThread(NULL, 0, &__ThreadProc, (void*)this, 0, &dwTemp);
SetThreadPriority(((__native_thread*)m_hThread)->m_thread, lPriority);
DWORD dwTemp;
((__native_thread*)m_hThread)->m_thread = CreateThread(NULL, 0, &__ThreadProc, (void*)this, 0, &dwTemp);
SetThreadPriority(((__native_thread*)m_hThread)->m_thread, lPriority);
#else
pthread_create(&((__native_thread*)m_hThread)->m_thread, 0, &__ThreadProc, (void*)this);
pthread_create(&((__native_thread*)m_hThread)->m_thread, 0, &__ThreadProc, (void*)this);
#endif
m_lThreadPriority = lPriority;
}
void CBaseThread::Suspend()
{
m_bSuspend = TRUE;
}
void CBaseThread::Resume()
{
m_bSuspend = FALSE;
}
void CBaseThread::Stop()
{
if (!m_bRunThread)
return;
m_lThreadPriority = lPriority;
}
void CBaseThread::Suspend()
{
m_bSuspend = TRUE;
}
void CBaseThread::Resume()
{
m_bSuspend = FALSE;
}
void CBaseThread::Stop()
{
if (!m_bRunThread)
return;
m_bIsExit.store(true);
m_bRunThread = FALSE;
m_bIsExit.store(true);
m_bRunThread = FALSE;
Join();
RELEASEOBJECT(m_hThread);
}
void CBaseThread::StopNoJoin()
{
m_bRunThread = FALSE;
m_bIsExit.store(true);
RELEASEOBJECT(m_hThread);
}
void CBaseThread::DestroyOnFinish()
{
m_bIsNeedDestroy = true;
}
Join();
RELEASEOBJECT(m_hThread);
}
void CBaseThread::StopNoJoin()
{
m_bRunThread = FALSE;
m_bIsExit.store(true);
RELEASEOBJECT(m_hThread);
}
void CBaseThread::DestroyOnFinish()
{
m_bIsNeedDestroy = true;
}
INT CBaseThread::IsSuspended() { return m_bSuspend; }
INT CBaseThread::IsRunned() { return m_bRunThread; }
int CBaseThread::GetError() { return m_lError; }
bool CBaseThread::isAborted() {return m_bIsExit && m_bIsExit.load();}
INT CBaseThread::IsSuspended()
{
return m_bSuspend;
}
INT CBaseThread::IsRunned()
{
return m_bRunThread;
}
int CBaseThread::GetError()
{
return m_lError;
}
bool CBaseThread::isAborted()
{
return m_bIsExit && m_bIsExit.load();
}
CThreadDescriptor* CBaseThread::GetDescriptor() { return m_hThread; }
int CBaseThread::GetPriority() { return m_lThreadPriority; }
CThreadDescriptor* CBaseThread::GetDescriptor()
{
return m_hThread;
}
int CBaseThread::GetPriority()
{
return m_lThreadPriority;
}
void CBaseThread::CheckSuspend()
{
while (m_bSuspend && m_bRunThread)
NSThreads::Sleep(10);
}
void CBaseThread::CheckSuspend()
{
while (m_bSuspend && m_bRunThread)
NSThreads::Sleep(10);
}
void CBaseThread::Join()
{
if (NULL == m_hThread)
return;
void CBaseThread::Join()
{
if (NULL == m_hThread)
return;
#if defined(_WIN32) || defined(_WIN64) || defined(_WIN32_WCE)
WaitForSingleObject(((__native_thread*)m_hThread)->m_thread, INFINITE);
WaitForSingleObject(((__native_thread*)m_hThread)->m_thread, INFINITE);
#else
pthread_join(((__native_thread*)m_hThread)->m_thread, 0);
pthread_join(((__native_thread*)m_hThread)->m_thread, 0);
#endif
}
}
void CBaseThread::Cancel()
{
if (NULL == m_hThread)
return;
void CBaseThread::Cancel()
{
if (NULL == m_hThread)
return;
m_bIsExit.store(true);
m_bIsExit.store(true);
m_bRunThread = FALSE;
m_bRunThread = FALSE;
Join();
RELEASEOBJECT(m_hThread);
}
}
Join();
RELEASEOBJECT(m_hThread);
}
} // namespace NSThreads

View File

@ -41,7 +41,7 @@
#include <pthread.h>
#endif
#if defined(_WIN32) || defined (_WIN64)
#if defined(_WIN32) || defined(_WIN64)
typedef DWORD ASC_THREAD_ID;
#else
typedef pthread_t ASC_THREAD_ID;
@ -51,56 +51,57 @@ typedef pthread_t ASC_THREAD_ID;
namespace NSThreads
{
KERNEL_DECL ASC_THREAD_ID GetCurrentThreadId();
KERNEL_DECL ASC_THREAD_ID GetCurrentThreadId();
KERNEL_DECL void Sleep(int nMilliseconds);
KERNEL_DECL void Sleep(int nMilliseconds);
class CThreadDescriptor;
class KERNEL_DECL CBaseThread
class CThreadDescriptor;
class KERNEL_DECL CBaseThread
{
protected:
CThreadDescriptor* m_hThread;
INT m_bRunThread;
INT m_bSuspend;
CThreadDescriptor* m_hThread;
INT m_bRunThread;
INT m_bSuspend;
int m_lError;
int m_lThreadPriority;
int m_lError;
int m_lThreadPriority;
bool m_bIsNeedDestroy;
std::atomic<bool> m_bIsExit{false};
bool m_bIsNeedDestroy;
std::atomic<bool> m_bIsExit{false};
public:
CBaseThread();
virtual ~CBaseThread();
CBaseThread();
virtual ~CBaseThread();
public:
virtual void Start(int lPriority);
virtual void Suspend();
virtual void Resume();
virtual void Stop();
virtual void StopNoJoin();
virtual void DestroyOnFinish();
virtual void Cancel();
virtual void Start(int lPriority);
virtual void Suspend();
virtual void Resume();
virtual void Stop();
virtual void StopNoJoin();
virtual void DestroyOnFinish();
virtual void Cancel();
INT IsSuspended();
INT IsRunned();
bool isAborted();
int GetError();
INT IsSuspended();
INT IsRunned();
bool isAborted();
int GetError();
CThreadDescriptor* GetDescriptor();
int GetPriority();
virtual void CheckSuspend();
CThreadDescriptor* GetDescriptor();
int GetPriority();
virtual void CheckSuspend();
protected:
virtual void Join();
virtual void Join();
virtual DWORD ThreadProc() = 0;
#if defined(_WIN32) || defined(_WIN64) || defined(_WIN32_WCE)
static DWORD WINAPI __ThreadProc(void* pv);
static DWORD WINAPI __ThreadProc(void* pv);
#else
static void* __ThreadProc(void* pv);
static void* __ThreadProc(void* pv);
#endif
};
};
}
#endif // _BUILD_BASETHREAD_H_

View File

@ -0,0 +1,150 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#include "./BaseThreadMonitor.h"
namespace NSThreads
{
CBaseThreadMonitor::CBaseThreadMonitor()
{
m_bIsInit = false;
m_pReceiver = NULL;
m_funcRelease = nullptr;
m_oCS.InitializeCriticalSection();
}
CBaseThreadMonitor::~CBaseThreadMonitor()
{
m_oCS.DeleteCriticalSection();
}
CBaseThreadMonitor& CBaseThreadMonitor::Get()
{
static CBaseThreadMonitor instance;
return instance;
}
bool CBaseThreadMonitor::Init(void* receiver)
{
CTemporaryCS oCS(&m_oCS);
if (m_bIsInit)
return false;
m_bIsInit = true;
m_pReceiver = receiver;
return true;
}
bool CBaseThreadMonitor::Destroy()
{
CTemporaryCS oCS(&m_oCS);
if (!m_bIsInit)
return false;
m_bIsInit = false;
m_pReceiver = NULL;
m_listThreads.clear();
return true;
}
bool CBaseThreadMonitor::IsInit()
{
CTemporaryCS oCS(&m_oCS);
return m_bIsInit;
}
NSCriticalSection::CRITICAL_SECTION* CBaseThreadMonitor::GetCS()
{
return &m_oCS;
}
CBaseThread* CBaseThreadMonitor::GetBaseThread(const ASC_THREAD_ID& nThreadId)
{
// лист - потому что будет всегда мало записей - и то будет быстрее мапа. двигаем всегда текущий на первое место
if (m_listThreads.size() == 0)
return NULL;
std::list<CBaseThreadInfo>::iterator i = m_listThreads.begin();
if (i->ID == nThreadId)
return i->Instance;
i++;
while (i != m_listThreads.end())
{
if (i->ID == nThreadId)
{
m_listThreads.erase(i);
m_listThreads.insert(m_listThreads.begin(), *i);
return i->Instance;
}
i++;
}
return NULL;
}
void CBaseThreadMonitor::SetReleaseHandler(std::function<void(void* initializer, CBaseThread*)> func)
{
CTemporaryCS oCS(&m_oCS);
m_funcRelease = func;
}
void CBaseThreadMonitor::Register(CBaseThread* pInstance)
{
CTemporaryCS oCS(&m_oCS);
if (!m_bIsInit)
return;
m_listThreads.push_back({NSThreads::GetCurrentThreadId(), pInstance});
}
void CBaseThreadMonitor::Unregister(CBaseThread* pInstance)
{
CTemporaryCS oCS(&m_oCS);
if (!m_bIsInit)
return;
for (std::list<CBaseThreadInfo>::iterator i = m_listThreads.begin(); i != m_listThreads.end(); i++)
{
if (i->Instance == pInstance)
{
m_listThreads.erase(i);
if (m_funcRelease)
m_funcRelease(m_pReceiver, pInstance);
return;
}
}
}
}

View File

@ -0,0 +1,87 @@
/*
* (c) Copyright Ascensio System SIA 2010-2023
*
* This program is a free software product. You can redistribute it and/or
* modify it under the terms of the GNU Affero General Public License (AGPL)
* version 3 as published by the Free Software Foundation. In accordance with
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
* that Ascensio System SIA expressly excludes the warranty of non-infringement
* of any third-party rights.
*
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
*
* You can contact Ascensio System SIA at 20A-6 Ernesta Birznieka-Upish
* street, Riga, Latvia, EU, LV-1050.
*
* The interactive user interfaces in modified source and object code versions
* of the Program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU AGPL version 3.
*
* Pursuant to Section 7(b) of the License you must retain the original Product
* logo when distributing the program. Pursuant to Section 7(e) we decline to
* grant you any rights under trademark law for use of our trademarks.
*
* All the Product's GUI elements, including illustrations and icon sets, as
* well as technical writing content are licensed under the terms of the
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
*
*/
#ifndef _BUILD_BASETHREAD_MONITOR_H_
#define _BUILD_BASETHREAD_MONITOR_H_
#include "BaseThread.h"
#include "TemporaryCS.h"
#include <functional>
#include <list>
namespace NSThreads
{
class CBaseThreadInfo
{
public:
ASC_THREAD_ID ID;
CBaseThread* Instance;
};
class KERNEL_DECL CBaseThreadMonitor
{
private:
NSCriticalSection::CRITICAL_SECTION m_oCS;
bool m_bIsInit;
void* m_pReceiver;
std::function<void(void* initializer, CBaseThread*)> m_funcRelease;
std::list<CBaseThreadInfo> m_listThreads;
private:
CBaseThreadMonitor();
public:
static CBaseThreadMonitor& Get();
~CBaseThreadMonitor();
public:
bool IsInit();
bool Init(void* receiver);
bool Destroy();
CBaseThread* GetBaseThread(const ASC_THREAD_ID& nThreadId);
void SetReleaseHandler(std::function<void(void* initializer, CBaseThread*)> func);
NSCriticalSection::CRITICAL_SECTION* GetCS();
private:
void Register(CBaseThread* pInstance);
void Unregister(CBaseThread* pInstance);
friend class CBaseThread;
};
}
#endif // _BUILD_BASETHREAD_MONITOR_H_

View File

@ -32,7 +32,6 @@
#include "Graphics.h"
#include <algorithm>
#include "../fontengine/FontFile.h"
#include "AlphaMask_private.h"
namespace Aggplus
{
@ -105,7 +104,9 @@ namespace Aggplus
#endif
m_dDpiTile = -1;
m_pAlphaMask = NULL;
m_nTextRenderMode = FT_RENDER_MODE_NORMAL;
m_nBlendMode = agg::comp_op_src_over;
@ -146,7 +147,9 @@ namespace Aggplus
#endif
m_dDpiTile = -1;
m_pAlphaMask = NULL;
m_nTextRenderMode = FT_RENDER_MODE_NORMAL;
m_nBlendMode = agg::comp_op_src_over;
@ -161,6 +164,12 @@ namespace Aggplus
#endif
RELEASEINTERFACE(m_pAlphaMask);
while (!m_arLayers.empty())
{
RELEASEINTERFACE(m_arLayers.top());
m_arLayers.pop();
}
}
INT CGraphics::IsDib()
@ -453,7 +462,7 @@ namespace Aggplus
m_rasterizer.get_rasterizer().reset_clipping();
m_rasterizer.get_rasterizer().clip_box(m_dClipLeft, m_dClipTop, m_dClipWidth + m_dClipLeft, m_dClipHeight + m_dClipTop);
GetRendererBase().clip_box((int)m_dClipLeft, (int)m_dClipTop, (int)(m_dClipWidth + m_dClipLeft), (int)(m_dClipHeight + m_dClipTop));
m_frame_buffer.ren_base().clip_box((int)m_dClipLeft, (int)m_dClipTop, (int)(m_dClipWidth + m_dClipLeft), (int)(m_dClipHeight + m_dClipTop));
m_oClip.Reset();
@ -996,7 +1005,7 @@ namespace Aggplus
if(width == 0.00 || height == 0.00)
return InvalidParameter;
CGraphicsPath oPath;
oPath.MoveTo(x, y);
oPath.LineTo(x+width, y);
@ -1212,34 +1221,164 @@ namespace Aggplus
return TRUE;
}
Status CGraphics::SetAlphaMask(CAlphaMask* pAlphaMask)
Status CGraphics::SetAlphaMask(CAlphaMask *pAlphaMask)
{
RELEASEINTERFACE(m_pAlphaMask);
m_pAlphaMask = pAlphaMask;
if (m_pAlphaMask)
{
m_pAlphaMask->AddRef();
m_pAlphaMask->m_internal->StartApplying();
}
return Ok;
return CreateLayer();
}
Status CGraphics::CreateAlphaMask()
Status CGraphics::StartCreatingAlphaMask()
{
return CreateLayer();
}
Status CGraphics::EndCreatingAlphaMask()
{
if (m_arLayers.empty())
return WrongState;
CGraphicsLayer *pCurrentGraphicsLayer = m_arLayers.top();
m_arLayers.pop();
if (pCurrentGraphicsLayer->Empty())
return GenericError;
BYTE* pBuffer = pCurrentGraphicsLayer->GetBuffer();
pCurrentGraphicsLayer->ClearBuffer(false);
RELEASEINTERFACE(pCurrentGraphicsLayer);
RELEASEINTERFACE(m_pAlphaMask);
m_pAlphaMask = new CAlphaMask();
return m_pAlphaMask->CreateImageBuffer(m_frame_buffer.width(), m_frame_buffer.height());
m_pAlphaMask = new CAlphaMask(pBuffer, EMaskDataType::ImageBuffer, false);
return CreateLayer();
}
Status CGraphics::ResetAlphaMask()
{
BlendLayer();
RELEASEINTERFACE(m_pAlphaMask);
return Ok;
}
Status CGraphics::StartApplyingAlphaMask()
Status CGraphics::AddLayer(CGraphicsLayer *pGraphicsLayer)
{
m_pAlphaMask->m_internal->StartApplying();
if (NULL == pGraphicsLayer || pGraphicsLayer->Empty())
return InvalidParameter;
m_arLayers.push(pGraphicsLayer);
pGraphicsLayer->AddRef();
int nStride = m_frame_buffer.ren_buf().stride();
const unsigned int unWidth = m_frame_buffer.ren_buf().width();
const unsigned int unHeight = m_frame_buffer.ren_buf().height();
m_frame_buffer.create(unWidth, unHeight, false, nStride, pGraphicsLayer->GetBuffer());
return Ok;
}
Status CGraphics::CreateLayer()
{
int nStride = m_frame_buffer.ren_buf().stride();
const unsigned int unWidth = m_frame_buffer.ren_buf().width();
const unsigned int unHeight = m_frame_buffer.ren_buf().height();
UINT unSize = unWidth * unHeight * m_frame_buffer.pix_size;
BYTE *pBuffer = new BYTE[unSize];
memset(pBuffer, 0x00, unSize);
m_frame_buffer.create(unWidth, unHeight, false, nStride, pBuffer);
m_arLayers.push(new CGraphicsLayer(pBuffer, false));
return Ok;
}
Status CGraphics::BlendLayer()
{
if (m_arLayers.empty())
return WrongState;
CGraphicsLayer *pCurrentGraphicsLayer = m_arLayers.top();
m_arLayers.pop();
BYTE* pBuffer = NULL;
if (!m_arLayers.empty())
pBuffer = m_arLayers.top()->GetBuffer();
else
pBuffer = m_pPixels;
if (NULL == pBuffer)
{
RELEASEINTERFACE(pCurrentGraphicsLayer);
return WrongState;
}
m_frame_buffer.ren_buf().attach(pBuffer, m_frame_buffer.ren_buf().width(), m_frame_buffer.ren_buf().height(), m_frame_buffer.ren_buf().stride());
if (NULL == m_pAlphaMask)
Aggplus::BlendTo(pCurrentGraphicsLayer, m_frame_buffer.pixfmt());
else
{
switch(m_pAlphaMask->GetDataType())
{
case EMaskDataType::ImageBuffer:
{
Aggplus::BlendTo<agg::rgb_to_gray_mask_u8<2, 1, 0>>(pCurrentGraphicsLayer, m_frame_buffer.pixfmt(), m_pAlphaMask->GetBuffer(), m_pAlphaMask->GetStep());
break;
}
case EMaskDataType::AlphaBuffer:
{
Aggplus::BlendTo<agg::one_component_mask_u8>(pCurrentGraphicsLayer, m_frame_buffer.pixfmt(), m_pAlphaMask->GetBuffer(), m_pAlphaMask->GetStep());
break;
}
}
}
RELEASEINTERFACE(pCurrentGraphicsLayer);
return Ok;
}
Status CGraphics::RemoveLayer()
{
if (m_arLayers.empty())
return WrongState;
CGraphicsLayer *pCurrentGraphicsLayer = m_arLayers.top();
m_arLayers.pop();
RELEASEINTERFACE(pCurrentGraphicsLayer);
return Ok;
}
Status CGraphics::SetLayerSettings(const TGraphicsLayerSettings &oSettings)
{
if (m_arLayers.empty())
return WrongState;
m_arLayers.top()->SetSettings(oSettings);
return Ok;
}
Status CGraphics::SetLayerOpacity(double dOpacity)
{
if (dOpacity < 0. || dOpacity > 1.)
return InvalidParameter;
if (m_arLayers.empty())
return WrongState;
m_arLayers.top()->SetOpacity(dOpacity);
return Ok;
}
@ -1254,36 +1393,12 @@ namespace Aggplus
return m_oClip.IsClip();
}
agg::rendering_buffer& CGraphics::GetRenderingBuffer()
{
if (m_pAlphaMask && GenerationAlphaMask == m_pAlphaMask->m_internal->GetStatus())
return m_pAlphaMask->m_internal->GetRenderingBuffer();
return m_frame_buffer.ren_buf();
}
base_renderer_type& CGraphics::GetRendererBase()
{
if (m_pAlphaMask && GenerationAlphaMask == m_pAlphaMask->GetStatus() && ImageBuffer == m_pAlphaMask->GetDataType())
return (base_renderer_type&)m_pAlphaMask->m_internal->GetRendererBaseImage();
return m_frame_buffer.ren_base();
}
template<class Renderer>
void CGraphics::render_scanlines(Renderer& ren)
{
if (!m_oClip.IsClip())
{
if (m_pAlphaMask && ApplyingAlphaMask == m_pAlphaMask->GetStatus())
{
if (ImageBuffer == m_pAlphaMask->GetDataType())
return agg::render_scanlines(m_rasterizer.get_rasterizer(), m_pAlphaMask->m_internal->GetScanlineImage(), ren);
else if (AlphaBuffer == m_pAlphaMask->GetDataType())
return agg::render_scanlines(m_rasterizer.get_rasterizer(), m_pAlphaMask->m_internal->GetScanlineABuffer(), ren);
}
return agg::render_scanlines(m_rasterizer.get_rasterizer(), m_rasterizer.get_scanline(), ren);
agg::render_scanlines(m_rasterizer.get_rasterizer(), m_rasterizer.get_scanline(), ren);
}
else
{
@ -1335,13 +1450,13 @@ namespace Aggplus
{
if (!m_oClip.IsClip())
{
if (m_pAlphaMask && ApplyingAlphaMask == m_pAlphaMask->GetStatus())
{
if (ImageBuffer == m_pAlphaMask->GetDataType())
return agg::render_scanlines(ras, m_pAlphaMask->m_internal->GetScanlineImage(), ren);
else if (AlphaBuffer == m_pAlphaMask->GetDataType())
return agg::render_scanlines(ras, m_pAlphaMask->m_internal->GetScanlineABuffer(), ren);
}
// if (m_pAlphaMask && ApplyingAlphaMask == m_pAlphaMask->GetStatus())
// {
// if (ImageBuffer == m_pAlphaMask->GetDataType())
// return agg::render_scanlines(ras, m_pAlphaMask->m_internal->GetScanlineImage(), ren);
// else if (AlphaBuffer == m_pAlphaMask->GetDataType())
// return agg::render_scanlines(ras, m_pAlphaMask->m_internal->GetScanlineABuffer(), ren);
// }
return agg::render_scanlines(ras, m_rasterizer.get_scanline(), ren);
}
@ -1383,7 +1498,7 @@ namespace Aggplus
comp_renderer_type ren_base;
pixfmt_type_comp pixfmt;
pixfmt.attach(GetRenderingBuffer());
pixfmt.attach(m_frame_buffer.ren_buf());
pixfmt.comp_op(m_nBlendMode);
ren_base.attach(pixfmt);
ren_solid.attach(ren_base);
@ -1394,7 +1509,7 @@ namespace Aggplus
else
{
typedef agg::renderer_scanline_aa_solid<base_renderer_type> solid_renderer_type;
solid_renderer_type ren_fine(GetRendererBase());
solid_renderer_type ren_fine(m_frame_buffer.ren_base());
ren_fine.color(dwColor.GetAggColor());
render_scanlines(ren_fine);
@ -1465,7 +1580,7 @@ namespace Aggplus
gradient_span_alloc span_alloc;
typedef agg::renderer_scanline_aa<base_renderer_type, gradient_span_alloc, gradient_span_gen> renderer_gradient_type;
renderer_gradient_type ren_gradient( GetRendererBase(), span_alloc, span_gen );
renderer_gradient_type ren_gradient( m_frame_buffer.ren_base(), span_alloc, span_gen );
if (fabs(m_dGlobalAlpha - 1.0) < FLT_EPSILON)
{
@ -1546,7 +1661,7 @@ namespace Aggplus
gradient_span_alloc span_alloc;
typedef agg::renderer_scanline_aa<base_renderer_type, gradient_span_alloc, gradient_span_gen> renderer_gradient_type;
renderer_gradient_type ren_gradient( GetRendererBase(), span_alloc, span_gen );
renderer_gradient_type ren_gradient( m_frame_buffer.ren_base(), span_alloc, span_gen );
if (fabs(m_dGlobalAlpha - 1.0) < FLT_EPSILON)
{
@ -1605,7 +1720,7 @@ namespace Aggplus
hatch_span_alloc span_alloc;
typedef agg::renderer_scanline_aa<base_renderer_type, hatch_span_alloc, hatch_span_gen> renderer_hatch_type;
renderer_hatch_type ren_hatch( GetRendererBase(), span_alloc, span_gen );
renderer_hatch_type ren_hatch( m_frame_buffer.ren_base(), span_alloc, span_gen );
if (fabs(m_dGlobalAlpha - 1.0) < FLT_EPSILON)
{
@ -1647,7 +1762,7 @@ namespace Aggplus
pixfmt img_pixf(PatRendBuff);
img_source_type img_src(img_pixf);
span_gen_type sg(img_src, interpolator);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
if (fabs(m_dGlobalAlpha - 1.0) < FLT_EPSILON)
{
@ -1685,7 +1800,7 @@ namespace Aggplus
pixfmt img_pixf(PatRendBuff);
img_source_type img_src(img_pixf, agg::rgba(0, 0, 0, 0));
span_gen_type sg(img_src, interpolator);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
//agg::render_scanlines(m_rasterizer.get_rasterizer(), m_rasterizer.get_scanline(), ri);
render_scanlines(ri);
}
@ -1717,7 +1832,7 @@ namespace Aggplus
typedef agg::span_image_filter_rgba_nn<img_source_type, interpolator_type_linear> span_gen_type;
typedef agg::renderer_scanline_aa<base_renderer_type, span_alloc_type, span_gen_type> renderer_type;
span_gen_type sg(img_src, interpolator);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
render_scanlines_alpha(ri, Alpha);
break;
}
@ -1726,7 +1841,7 @@ namespace Aggplus
typedef agg::span_image_filter_rgba_bilinear<img_source_type, interpolator_type_linear> span_gen_type;
typedef agg::renderer_scanline_aa<base_renderer_type, span_alloc_type, span_gen_type> renderer_type;
span_gen_type sg(img_src, interpolator);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
render_scanlines_alpha(ri, Alpha);
break;
}
@ -1737,7 +1852,7 @@ namespace Aggplus
agg::image_filter_lut filter;
filter.calculate(agg::image_filter_bicubic(), false);
span_gen_type sg(img_src, interpolator, filter);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
render_scanlines_alpha(ri, Alpha);
break;
}
@ -1748,7 +1863,7 @@ namespace Aggplus
agg::image_filter_lut filter;
filter.calculate(agg::image_filter_spline16(), false);
span_gen_type sg(img_src, interpolator, filter);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
render_scanlines_alpha(ri, Alpha);
break;
}
@ -1759,7 +1874,7 @@ namespace Aggplus
agg::image_filter_lut filter;
filter.calculate(agg::image_filter_blackman256(), false);
span_gen_type sg(img_src, interpolator, filter);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
render_scanlines_alpha(ri, Alpha);
break;
}
@ -1770,7 +1885,7 @@ namespace Aggplus
agg::image_filter_lut filter;
filter.calculate(agg::image_filter_bilinear(), false);
span_gen_type sg(img_src, interpolator, filter);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
render_scanlines_alpha(ri, Alpha);
break;
}
@ -1793,7 +1908,7 @@ namespace Aggplus
typedef agg::span_image_filter_rgba_nn<img_source_type, interpolator_type_linear> span_gen_type;
typedef agg::renderer_scanline_aa<base_renderer_type, span_alloc_type, span_gen_type> renderer_type;
span_gen_type sg(img_src, interpolator);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
render_scanlines_alpha(ri, Alpha);
break;
}
@ -1802,7 +1917,7 @@ namespace Aggplus
typedef agg::span_image_filter_rgba_bilinear<img_source_type, interpolator_type_linear> span_gen_type;
typedef agg::renderer_scanline_aa<base_renderer_type, span_alloc_type, span_gen_type> renderer_type;
span_gen_type sg(img_src, interpolator);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
render_scanlines_alpha(ri, Alpha);
break;
}
@ -1813,7 +1928,7 @@ namespace Aggplus
agg::image_filter_lut filter;
filter.calculate(agg::image_filter_bicubic(), false);
span_gen_type sg(img_src, interpolator, filter);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
render_scanlines_alpha(ri, Alpha);
break;
}
@ -1824,7 +1939,7 @@ namespace Aggplus
agg::image_filter_lut filter;
filter.calculate(agg::image_filter_spline16(), false);
span_gen_type sg(img_src, interpolator, filter);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
render_scanlines_alpha(ri, Alpha);
break;
}
@ -1835,7 +1950,7 @@ namespace Aggplus
agg::image_filter_lut filter;
filter.calculate(agg::image_filter_blackman256(), false);
span_gen_type sg(img_src, interpolator, filter);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
render_scanlines_alpha(ri, Alpha);
break;
}
@ -1846,7 +1961,7 @@ namespace Aggplus
agg::image_filter_lut filter;
filter.calculate(agg::image_filter_bilinear(), false);
span_gen_type sg(img_src, interpolator, filter);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
render_scanlines_alpha(ri, Alpha);
break;
}
@ -1888,7 +2003,7 @@ namespace Aggplus
pixfmt img_pixf(PatRendBuff);
img_source_type img_src(img_pixf);
span_gen_type sg(img_src, interpolator);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
double dAlpha = m_dGlobalAlpha * Alpha / 255.0;
if (fabs(dAlpha - 1.0) < FLT_EPSILON)
@ -1914,7 +2029,7 @@ namespace Aggplus
pixfmt img_pixf(PatRendBuff);
img_source_type img_src(img_pixf);
span_gen_type sg(img_src, interpolator);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
double dAlpha = m_dGlobalAlpha * Alpha / 255.0;
if (fabs(dAlpha - 1.0) < FLT_EPSILON)
@ -1940,7 +2055,7 @@ namespace Aggplus
pixfmt img_pixf(PatRendBuff);
img_source_type img_src(img_pixf);
span_gen_type sg(img_src, interpolator);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
double dAlpha = m_dGlobalAlpha * Alpha / 255.0;
if (fabs(dAlpha - 1.0) < FLT_EPSILON)
@ -1966,7 +2081,7 @@ namespace Aggplus
pixfmt img_pixf(PatRendBuff);
img_source_type img_src(img_pixf);
span_gen_type sg(img_src, interpolator);
renderer_type ri(GetRendererBase(), span_allocator, sg);
renderer_type ri(m_frame_buffer.ren_base(), span_allocator, sg);
double dAlpha = m_dGlobalAlpha * Alpha / 255.0;
if (fabs(dAlpha - 1.0) < FLT_EPSILON)
@ -2107,7 +2222,7 @@ namespace Aggplus
((CBrushSolid*)pBrush)->GetColor(&clr);
typedef agg::renderer_scanline_aa_solid<base_renderer_type> solid_renderer_type;
solid_renderer_type ren_fine(GetRendererBase());
solid_renderer_type ren_fine(m_frame_buffer.ren_base());
ren_fine.color(clr.GetAggColor());
//agg::render_scanlines(storage, m_rasterizer.get_scanline(), ren_fine);
@ -2122,7 +2237,7 @@ namespace Aggplus
((CBrushSolid*)pBrush)->GetColor(&clr);
typedef agg::renderer_scanline_aa_solid<base_renderer_type> solid_renderer_type;
solid_renderer_type ren_fine(GetRendererBase());
solid_renderer_type ren_fine(m_frame_buffer.ren_base());
ren_fine.color(clr.GetAggColor());
if (m_nTextRenderMode == FT_RENDER_MODE_LCD)
@ -2255,7 +2370,7 @@ namespace Aggplus
gradient_span_alloc span_alloc;
typedef agg::renderer_scanline_aa<base_renderer_type, gradient_span_alloc, gradient_span_gen> renderer_gradient_type;
renderer_gradient_type ren_gradient( GetRendererBase(), span_alloc, span_gen );
renderer_gradient_type ren_gradient( m_frame_buffer.ren_base(), span_alloc, span_gen );
if (fabs(m_dGlobalAlpha - 1.0) < FLT_EPSILON)
{

View File

@ -64,6 +64,7 @@
#include "Color.h"
#include "Matrix.h"
#include "GraphicsLayerBlend.h"
#include "GraphicsPath.h"
#include "AlphaMask.h"
#include "Clip.h"
@ -71,6 +72,7 @@
#include "Image.h"
#include "../fontengine/FontManager.h"
#include <stack>
#include <vector>
#if defined(_WIN32) || defined (_WIN64)
@ -281,6 +283,8 @@ protected:
CAlphaMask* m_pAlphaMask;
std::stack<CGraphicsLayer*> m_arLayers;
agg::svg::frame_buffer_rgba<blender_type> m_frame_buffer;
agg::svg::rasterizer m_rasterizer;
@ -398,9 +402,18 @@ public:
//Работа с альфа-маской
Status SetAlphaMask(CAlphaMask* pAlphaMask);
Status CreateAlphaMask();
Status StartCreatingAlphaMask();
Status EndCreatingAlphaMask();
Status ResetAlphaMask();
Status StartApplyingAlphaMask();
//Работа со слоями
Status AddLayer(CGraphicsLayer* pGraphicsLayer);
Status CreateLayer();
Status BlendLayer();
Status RemoveLayer();
Status SetLayerSettings(const TGraphicsLayerSettings& oSettings);
Status SetLayerOpacity(double dOpacity);
void CalculateFullTransform();
bool IsClip();
@ -420,9 +433,6 @@ protected:
template<class Renderer>
void render_scanlines_alpha(Renderer& ren, BYTE Alpha);
agg::rendering_buffer& GetRenderingBuffer();
base_renderer_type& GetRendererBase();
void DoFillPathSolid(CColor dwColor);
void DoFillPathGradient(CBrushLinearGradient *pBrush);
void DoFillPathGradient2(CBrushLinearGradient *pBrush);

View File

@ -0,0 +1,65 @@
#include "GraphicsLayer.h"
#include <cmath>
namespace Aggplus
{
CGraphicsLayer::CGraphicsLayer(BYTE *pBuffer, bool bExternalBuffer)
: m_pBuffer(pBuffer), m_bExternalBuffer(NULL != pBuffer && bExternalBuffer)
{
SetDefaultSettings();
}
CGraphicsLayer::~CGraphicsLayer()
{
ClearBuffer();
}
bool CGraphicsLayer::Empty() const
{
return NULL == m_pBuffer;
}
BYTE *CGraphicsLayer::GetBuffer()
{
return m_pBuffer;
}
void CGraphicsLayer::SetDefaultSettings()
{
m_oSettings.m_uchOpacity = 255;
}
void CGraphicsLayer::ClearBuffer(bool bDeleteData)
{
if (bDeleteData && !m_bExternalBuffer)
RELEASEARRAYOBJECTS(m_pBuffer);
m_pBuffer = NULL;
}
void CGraphicsLayer::SetSettings(const TGraphicsLayerSettings &oSettings)
{
m_oSettings = oSettings;
}
const TGraphicsLayerSettings &CGraphicsLayer::GetSettings() const
{
return m_oSettings;
}
void CGraphicsLayer::SetOpacity(double dOpacity)
{
if (dOpacity > 1. || dOpacity < 0.)
m_oSettings.m_uchOpacity = 255;
else
{
m_oSettings.m_uchOpacity = ceil(255 * dOpacity);
}
}
void CGraphicsLayer::SetOpacity(BYTE uchOpacity)
{
m_oSettings.m_uchOpacity = uchOpacity;
}
}

View File

@ -0,0 +1,44 @@
#ifndef CGRAPHICSLAYER_H
#define CGRAPHICSLAYER_H
#include "Defines.h"
#include "./config.h"
#include "../common/IGrObject.h"
#include <iostream>
namespace Aggplus
{
struct TGraphicsLayerSettings
{
BYTE m_uchOpacity;
};
class GRAPHICS_DECL CGraphicsLayer : public IGrObject
{
public:
CGraphicsLayer(BYTE* pBuffer, bool bExternalBuffer = true);
~CGraphicsLayer();
bool Empty() const;
BYTE* GetBuffer();
void SetDefaultSettings();
void ClearBuffer(bool bDeleteData = true);
void SetSettings(const TGraphicsLayerSettings& oSettings);
const TGraphicsLayerSettings& GetSettings() const;
void SetOpacity(double dOpacity);
void SetOpacity(BYTE uchOpacity);
private:
BYTE* m_pBuffer;
bool m_bExternalBuffer;
TGraphicsLayerSettings m_oSettings;
};
}
#endif // CGRAPHICSLAYER_H

View File

@ -0,0 +1,101 @@
#ifndef CGRAPHICSLAYER_BLEND_H
#define CGRAPHICSLAYER_BLEND_H
#include "GraphicsLayer.h"
namespace Aggplus
{
template <class SrcPixelFormatRenderer>
void BlendTo(CGraphicsLayer* pLayer, SrcPixelFormatRenderer& oSrc)
{
if (NULL == pLayer->GetBuffer() || 0 == oSrc.width() || 0 == oSrc.height())
return;
typedef typename SrcPixelFormatRenderer::order_type order_type;
typedef typename SrcPixelFormatRenderer::value_type value_type;
int nStep = 4;
BYTE* pSrcBuffer = pLayer->GetBuffer();
value_type* pDstBuffer = NULL;
BYTE uchAlpha;
unsigned int unSrcW = oSrc.width();
unsigned int unSrcH = oSrc.height();
BYTE nOpacity = pLayer->GetSettings().m_uchOpacity;
for (unsigned int unY = 0; unY < unSrcH; ++unY)
{
pDstBuffer = oSrc.row_ptr(unY);
for (unsigned int unX = 0; unX < unSrcW; ++unX)
{
uchAlpha = (SrcPixelFormatRenderer::base_mask + nOpacity * pSrcBuffer[order_type::A]) >> 8;
if (uchAlpha)
{
if(uchAlpha == SrcPixelFormatRenderer::base_mask)
{
pDstBuffer[order_type::R] = pSrcBuffer[order_type::R];
pDstBuffer[order_type::G] = pSrcBuffer[order_type::G];
pDstBuffer[order_type::B] = pSrcBuffer[order_type::B];
pDstBuffer[order_type::A] = SrcPixelFormatRenderer::base_mask;
}
else
{
SrcPixelFormatRenderer::blender_type::blend_pix(pDstBuffer, pSrcBuffer[order_type::R], pSrcBuffer[order_type::G], pSrcBuffer[order_type::B], uchAlpha);
}
}
pSrcBuffer += nStep;
pDstBuffer += nStep;
}
}
}
template <class AlphaMaskFunction, class SrcPixelFormatRenderer>
void BlendTo(CGraphicsLayer* pLayer, SrcPixelFormatRenderer& oSrc, BYTE* pAlphaMaskBuffer, UINT unAlphaMaskStep)
{
if (NULL == pLayer->GetBuffer() || 0 == oSrc.width() || 0 == oSrc.height())
return;
typedef typename SrcPixelFormatRenderer::order_type order_type;
typedef typename SrcPixelFormatRenderer::value_type value_type;
int nStep = 4;
BYTE* pSrcBuffer = pLayer->GetBuffer();
value_type* pDstBuffer = NULL;
BYTE* pSrcAlphaMaskBuffer = pAlphaMaskBuffer;
BYTE uchAlpha;
unsigned int unSrcW = oSrc.width();
unsigned int unSrcH = oSrc.height();
BYTE nOpacity = pLayer->GetSettings().m_uchOpacity;
for (unsigned int unY = 0; unY < unSrcH; ++unY)
{
pDstBuffer = oSrc.row_ptr(unY);
for (unsigned int unX = 0; unX < unSrcW; ++unX)
{
uchAlpha = ((SrcPixelFormatRenderer::base_mask + nOpacity * pSrcBuffer[order_type::A] * AlphaMaskFunction::calculate(pSrcAlphaMaskBuffer)) >> 16);
if(uchAlpha == SrcPixelFormatRenderer::base_mask)
{
pDstBuffer[order_type::R] = pSrcBuffer[order_type::R];
pDstBuffer[order_type::G] = pSrcBuffer[order_type::G];
pDstBuffer[order_type::B] = pSrcBuffer[order_type::B];
pDstBuffer[order_type::A] = SrcPixelFormatRenderer::base_mask;
}
else
{
SrcPixelFormatRenderer::blender_type::blend_pix(pDstBuffer, pSrcBuffer[order_type::R], pSrcBuffer[order_type::G], pSrcBuffer[order_type::B], uchAlpha);
}
pSrcBuffer += nStep;
pDstBuffer += nStep;
pSrcAlphaMaskBuffer += unAlphaMaskStep;
}
}
}
}
#endif // CGRAPHICSLAYER_BLEND_H

View File

@ -796,7 +796,12 @@ HRESULT CGraphicsRenderer::BeginCommand(const DWORD& lType)
}
case c_nMaskType:
{
m_pRenderer->CreateAlphaMask();
m_pRenderer->StartCreatingAlphaMask();
break;
}
case c_nLayerType:
{
m_pRenderer->CreateLayer();
break;
}
default:
@ -830,7 +835,7 @@ HRESULT CGraphicsRenderer::EndCommand(const DWORD& lType)
}
case c_nMaskType:
{
m_pRenderer->StartApplyingAlphaMask();
m_pRenderer->EndCreatingAlphaMask();
break;
}
case c_nResetMaskType:
@ -838,6 +843,11 @@ HRESULT CGraphicsRenderer::EndCommand(const DWORD& lType)
m_pRenderer->ResetAlphaMask();
break;
}
case c_nLayerType:
{
m_pRenderer->BlendLayer();
break;
}
default:
break;
};
@ -1401,11 +1411,16 @@ void CGraphicsRenderer::CreateFlip(BYTE* pPixels, const Aggplus::CDoubleRect& oR
m_pRenderer->SetPageUnit(Aggplus::UnitMillimeter);
}
void CGraphicsRenderer::SetAlphaMask(Aggplus::CAlphaMask* pAlphaMask)
void CGraphicsRenderer::SetAlphaMask(Aggplus::CAlphaMask *pAlphaMask)
{
m_pRenderer->SetAlphaMask(pAlphaMask);
}
HRESULT CGraphicsRenderer::put_LayerOpacity(double dValue)
{
return m_pRenderer->SetLayerOpacity(dValue);
}
void CGraphicsRenderer::put_GlobalAlphaEnabled(const bool& bEnabled, const double& dVal)
{
m_bGlobalAlphaEnabled = bEnabled;

View File

@ -350,7 +350,10 @@ public:
inline double GetPixH() { return m_pRenderer->GetPixH(); }
// alpha mask methods
void SetAlphaMask(Aggplus::CAlphaMask* pAlphaMask);
void SetAlphaMask(Aggplus::CAlphaMask* pAlphaMask);
// layer methods
HRESULT put_LayerOpacity(double dValue);
// smart methods
void drawHorLine(BYTE align, double y, double x, double r, double penW)

View File

@ -67,6 +67,8 @@ const long c_nTableCell = 0x2000;
const long c_nMaskType = 0x3000;
const long c_nResetMaskType = 0x4000;
const long c_nLayerType = 0x5000;
const long c_nPDFTilingFill = 0x2001;
const long c_nPDFTilingFillIteration = 0x2002;
@ -355,6 +357,9 @@ public:
virtual HRESULT IsSupportAdvancedCommand(const IAdvancedCommand::AdvancedCommandType& type) { return S_FALSE; }
virtual HRESULT AdvancedCommand(IAdvancedCommand* command) { return S_FALSE; }
// graphics layer settings
virtual HRESULT put_LayerOpacity(double dValue) { return S_FALSE; }
};
#define PROPERTY_RENDERER(NameBase, Name, Type) \

View File

@ -38,7 +38,7 @@
#include "../common/File.h"
#ifndef GRAPHICS_DISABLE_METAFILE
#include "../raster/Metafile/MetaFile.h"
#include "../raster/Metafile/MetaFileCommon.h"
#endif
#if defined (GetTempPath)
@ -77,9 +77,11 @@ public:
else
{
std::wstring sTempFile = NSFile::CFileBinary::CreateTempFileWithUniqueName(NSFile::CFileBinary::GetTempPath(), L"AscMetafile_");
pMetafile->ConvertToRaster(sTempFile.c_str(), 4, 1000, -1);
m_oImage.Create(sTempFile);
//pMetafile->ConvertToRaster(sTempFile.c_str(), 4, 1000, -1);
MetaFile::ConvertToRasterMaxSize(pMetafile, sTempFile.c_str(), 4, 1000);
m_oImage.Create(sTempFile);
NSFile::CFileBinary::Remove(sTempFile);
}
RELEASEINTERFACE(pMetafile);

View File

@ -57,6 +57,7 @@ namespace NSOnlineOfficeBinToPdf
case ctAnnotField: return Read_Command<CAnnotFieldInfo> (this, pCorrector);
case ctFormField: return Read_Command<CFormFieldInfo> (this, pCorrector);
case ctAnnotFieldDelete: return Read_Command<CAnnotFieldDelete>(this, pCorrector);
case ctWidgetsInfo: return Read_Command<CWidgetsInfo> (this, pCorrector);
default: break;
}

View File

@ -174,6 +174,13 @@ namespace NSOnlineOfficeBinToPdf
int len = 2 * ReadUShort();
return ReadString16(len);
}
inline std::string ReadStringA()
{
int len = ReadInt();
std::string sRes = std::string((char*)m_cur, len);
m_cur += len;
return sRes;
}
inline void SkipString16(int len)
{
Skip(len);

View File

@ -32,6 +32,7 @@
#include "./AnnotField.h"
#include "../MetafileToRenderer.h"
#include "../../common/File.h"
CAnnotFieldInfo::CAnnotFieldInfo() : IAdvancedCommand(AdvancedCommandType::Annotaion)
{
@ -457,9 +458,12 @@ bool CAnnotFieldInfo::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, IMeta
{
m_oBorder.nType = pReader->ReadByte();
m_oBorder.dWidth = pReader->ReadDouble();
int n = pReader->ReadInt();
for (int i = 0; i < n; ++i)
m_oBorder.arrDash.push_back(pReader->ReadDouble());
if (m_oBorder.nType == 2)
{
int n = pReader->ReadInt();
for (int i = 0; i < n; ++i)
m_oBorder.arrDash.push_back(pReader->ReadDouble());
}
}
if (nFlags & (1 << 5))
m_wsLM = pReader->ReadString();
@ -672,7 +676,9 @@ void CAnnotFieldInfo::CWidgetAnnotPr::Read(NSOnlineOfficeBinToPdf::CBufferReader
for (int i = 0; i < n; ++i)
m_arrTC.push_back(pReader->ReadDouble());
m_nQ = pReader->ReadByte();
m_nQ = 0;
if (nType != 29 && nType != 28 && nType != 27)
m_nQ = pReader->ReadByte();
int nWidgetFlag = pReader->ReadInt();
m_nFlag = nWidgetFlag;
@ -682,6 +688,8 @@ void CAnnotFieldInfo::CWidgetAnnotPr::Read(NSOnlineOfficeBinToPdf::CBufferReader
m_wsTU = pReader->ReadString();
if (nFlags & (1 << 1))
m_wsDS = pReader->ReadString();
if (nFlags & (1 << 2))
m_wsFK = pReader->ReadString();
if (nFlags & (1 << 3))
m_nH = pReader->ReadByte();
if (nFlags & (1 << 5))
@ -727,36 +735,47 @@ void CAnnotFieldInfo::CWidgetAnnotPr::Read(NSOnlineOfficeBinToPdf::CBufferReader
}
void CAnnotFieldInfo::CWidgetAnnotPr::CButtonWidgetPr::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, BYTE nType, int nFlags)
{
int nIFFlags = pReader->ReadInt();
m_nIFFlag = nIFFlags;
if (nType == 27)
{
m_nIFFlag = pReader->ReadInt();
if (nFlags & (1 << 10))
m_wsCA = pReader->ReadString();
if (nFlags & (1 << 11))
m_wsRC = pReader->ReadString();
if (nFlags & (1 << 12))
m_wsAC = pReader->ReadString();
if (nFlags & (1 << 13))
m_nTP = pReader->ReadByte();
if (m_nIFFlag & (1 << 0))
{
if (m_nIFFlag & (1 << 1))
m_nSW = pReader->ReadByte();
if (m_nIFFlag & (1 << 2))
m_nS = pReader->ReadByte();
if (m_nIFFlag & (1 << 3))
{
m_dA1 = pReader->ReadDouble();
m_dA2 = pReader->ReadDouble();
}
}
if (m_nIFFlag & (1 << 5))
m_nI = pReader->ReadInt();
if (m_nIFFlag & (1 << 6))
m_nRI = pReader->ReadInt();
if (m_nIFFlag & (1 << 7))
m_nIX = pReader->ReadInt();
}
else
m_nStyle = pReader->ReadByte();
if (nFlags & (1 << 13))
m_nTP = pReader->ReadByte();
if (nIFFlags & (1 << 0))
{
if (nIFFlags & (1 << 1))
m_nSW = pReader->ReadByte();
if (nIFFlags & (1 << 2))
m_nS = pReader->ReadByte();
if (nIFFlags & (1 << 3))
{
m_dA1 = pReader->ReadDouble();
m_dA2 = pReader->ReadDouble();
}
if (nFlags & (1 << 9))
m_wsV = pReader->ReadString();
m_nStyle = pReader->ReadByte();
if (nFlags & (1 << 14))
m_wsAP_N_Yes = pReader->ReadString();
}
if (nFlags & (1 << 14))
m_wsAP_N_Yes = pReader->ReadString();
}
void CAnnotFieldInfo::CWidgetAnnotPr::CTextWidgetPr::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, int nFlags, int nWidgetFlag)
{
@ -766,6 +785,8 @@ void CAnnotFieldInfo::CWidgetAnnotPr::CTextWidgetPr::Read(NSOnlineOfficeBinToPdf
m_nMaxLen = pReader->ReadInt();
if (nWidgetFlag & (1 << 25))
m_wsRV = pReader->ReadString();
if (nFlags & (1 << 12))
m_wsAPV = pReader->ReadString();
}
void CAnnotFieldInfo::CWidgetAnnotPr::CChoiceWidgetPr::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, int nFlags)
{
@ -778,11 +799,25 @@ void CAnnotFieldInfo::CWidgetAnnotPr::CChoiceWidgetPr::Read(NSOnlineOfficeBinToP
{
std::wstring s1 = pReader->ReadString();
std::wstring s2 = pReader->ReadString();
m_arrOpt.push_back(std::make_pair(s2, s1));
m_arrOpt.push_back(std::make_pair(s1, s2));
}
}
if (nFlags & (1 << 11))
m_nTI = pReader->ReadInt();
if (nFlags & (1 << 12))
m_wsAPV = pReader->ReadString();
if (nFlags & (1 << 13))
{
int n = pReader->ReadInt();
for (int i = 0; i < n; ++i)
m_arrV.push_back(pReader->ReadString());
}
if (nFlags & (1 << 14))
{
int n = pReader->ReadInt();
for (int i = 0; i < n; ++i)
m_arrI.push_back(pReader->ReadInt());
}
}
CAnnotFieldDelete::CAnnotFieldDelete() : IAdvancedCommand(AdvancedCommandType::DeleteAnnot) {}
@ -802,7 +837,7 @@ bool CWidgetsInfo::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, IMetafil
{
int n = pReader->ReadInt();
for (int i = 0; i < n; ++i)
m_arrCO.push_back(pReader->ReadString());
m_arrCO.push_back(pReader->ReadInt());
n = pReader->ReadInt();
for (int i = 0; i < n; ++i)
@ -818,9 +853,28 @@ bool CWidgetsInfo::Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, IMetafil
if (nFlags & (1 << 2))
pParent->sDV = pReader->ReadString();
if (nFlags & (1 << 3))
{
int n = pReader->ReadInt();
for (int i = 0; i < n; ++i)
pParent->arrI.push_back(pReader->ReadInt());
}
if (nFlags & (1 << 4))
pParent->nParentID = pReader->ReadInt();
if (nFlags & (1 << 5))
{
int n = pReader->ReadInt();
for (int i = 0; i < n; ++i)
pParent->arrV.push_back(pReader->ReadString());
}
m_arrParents.push_back(pParent);
}
n = pReader->ReadInt();
for (int i = 0; i < n; ++i)
{
std::string sImagePath = pReader->ReadStringA();
m_arrButtonImg.push_back(pCorrector->GetImagePath(UTF8_TO_U(sImagePath)));
}
return true;
}

View File

@ -62,7 +62,11 @@ public:
BYTE GetSW() const { return m_nSW; }
BYTE GetStyle() const { return m_nStyle; }
int GetIFFlag() const { return m_nIFFlag; }
int GetI() const { return m_nI; }
int GetRI() const { return m_nRI; }
int GetIX() const { return m_nIX; }
void GetA(double& dA1, double& dA2) const { dA1 = m_dA1; dA2 = m_dA2; }
const std::wstring& GetV() const { return m_wsV; }
const std::wstring& GetCA() const { return m_wsCA; }
const std::wstring& GetRC() const { return m_wsRC; }
const std::wstring& GetAC() const { return m_wsAC; }
@ -76,7 +80,11 @@ public:
BYTE m_nSW;
BYTE m_nStyle;
int m_nIFFlag;
int m_nI;
int m_nRI;
int m_nIX;
double m_dA1, m_dA2;
std::wstring m_wsV;
std::wstring m_wsCA;
std::wstring m_wsRC;
std::wstring m_wsAC;
@ -87,8 +95,9 @@ public:
{
public:
int GetMaxLen() const { return m_nMaxLen; }
const std::wstring& GetV() const { return m_wsV; }
const std::wstring& GetRV() const { return m_wsRV; }
const std::wstring& GetV() const { return m_wsV; }
const std::wstring& GetRV() const { return m_wsRV; }
const std::wstring& GetAPV() const { return m_wsAPV; }
void Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, int nFlags, int nWidgetFlag);
@ -96,13 +105,17 @@ public:
int m_nMaxLen;
std::wstring m_wsV;
std::wstring m_wsRV;
std::wstring m_wsAPV;
};
class CChoiceWidgetPr
{
public:
int GetTI() const { return m_nTI; }
const std::wstring& GetV() const { return m_wsV; }
const std::wstring& GetV() const { return m_wsV; }
const std::wstring& GetAPV() const { return m_wsAPV; }
const std::vector<int>& GetI() const { return m_arrI; }
const std::vector<std::wstring>& GetArrV() const { return m_arrV; }
const std::vector< std::pair<std::wstring, std::wstring> >& GetOpt() const { return m_arrOpt; }
void Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, int nFlags);
@ -110,6 +123,9 @@ public:
private:
int m_nTI;
std::wstring m_wsV;
std::wstring m_wsAPV;
std::vector<int> m_arrI;
std::vector<std::wstring> m_arrV;
std::vector< std::pair<std::wstring, std::wstring> > m_arrOpt;
};
@ -154,6 +170,7 @@ public:
const std::wstring& GetDV() const { return m_wsDV; }
const std::wstring& GetT() const { return m_wsT; }
const std::wstring& GetFontName() const { return m_wsFN; }
const std::wstring& GetFontKey() const { return m_wsFK; }
const std::vector<double>& GetTC() const { return m_arrTC; }
const std::vector<double>& GetBC() const { return m_arrBC; }
const std::vector<double>& GetBG() const { return m_arrBG; }
@ -182,6 +199,7 @@ public:
std::wstring m_wsDV;
std::wstring m_wsT;
std::wstring m_wsFN;
std::wstring m_wsFK;
std::vector<double> m_arrTC;
std::vector<double> m_arrBC;
std::vector<double> m_arrBG;
@ -478,7 +496,7 @@ private:
class GRAPHICS_DECL CWidgetsInfo : public IAdvancedCommand
{
private:
public:
struct CParent
{
int nID;
@ -487,15 +505,22 @@ private:
std::wstring sName;
std::wstring sV;
std::wstring sDV;
std::vector<int> arrI;
std::vector<std::wstring> arrV;
};
public:
CWidgetsInfo();
virtual ~CWidgetsInfo();
const std::vector<int>& GetCO() const { return m_arrCO; }
const std::vector<std::wstring>& GetButtonImg() const { return m_arrButtonImg; }
const std::vector<CParent*>& GetParents() const { return m_arrParents; }
bool Read(NSOnlineOfficeBinToPdf::CBufferReader* pReader, IMetafileToRenderter* pCorrector);
private:
std::vector<std::wstring> m_arrCO;
std::vector<int> m_arrCO;
std::vector<std::wstring> m_arrButtonImg;
std::vector<CParent*> m_arrParents;
};

View File

@ -784,7 +784,7 @@ namespace NSFonts
virtual void InitializeFromBin(BYTE* pData, unsigned int nLen) = 0;
virtual void InitializeRanges(unsigned char* data) = 0;
virtual std::vector<std::wstring> GetSetupFontFiles() = 0;
virtual std::vector<std::wstring> GetSetupFontFiles(const bool& bIsUseUserFonts = true) = 0;
virtual void InitializeFromArrayFiles(std::vector<std::wstring>& files, int nFlag = 0) = 0;
#if defined(_WIN32) || defined(_WIN64)

View File

@ -3,7 +3,7 @@ include(freetype.pri)
FONT_ENGINE_PATH = $$PWD/../../fontengine
HEADERS += \
$$PWD/Fonts.h \
$$PWD/Fonts.h \
$$FONT_ENGINE_PATH/ApplicationFonts.h \
$$FONT_ENGINE_PATH/FontFile.h \
$$FONT_ENGINE_PATH/FontPath.h \
@ -12,7 +12,7 @@ HEADERS += \
$$FONT_ENGINE_PATH/FontConverter.h
SOURCES += \
$$FONT_ENGINE_PATH/ApplicationFonts.cpp \
$$FONT_ENGINE_PATH/ApplicationFonts.cpp \
$$FONT_ENGINE_PATH/FontFile.cpp \
$$FONT_ENGINE_PATH/FontManager.cpp \
$$FONT_ENGINE_PATH/FontPath.cpp \
@ -34,7 +34,7 @@ SOURCES += $$FONT_ENGINE_PATH/TextShaper.cpp
include($$PWD/textshaper.pri)
enable_support_shaper {
include($$PWD/../../../Common/3dParty/harfbuzz/harfbuzz.pri)
include($$PWD/../../../Common/3dParty/harfbuzz/harfbuzz.pri)
}
# -------------------------------------------------
@ -46,14 +46,14 @@ SOURCES += $$FONT_ENGINE_PATH/TextHyphen.cpp
# -------------------------------------------------
core_ios {
LIBS += -framework Foundation
LIBS += -framework Foundation
}
SOURCES += $$PWD/pro_Fonts.cpp
support_font_converter {
SOURCES += \
$$FONT_ENGINE_PATH/fontconverter/StringExt.cpp \
$$FONT_ENGINE_PATH/fontconverter/StringExt.cpp \
$$FONT_ENGINE_PATH/fontconverter/Hash.cpp \
$$FONT_ENGINE_PATH/fontconverter/FontConverter.cpp \
$$FONT_ENGINE_PATH/fontconverter/FontFileEncodings.cpp \

View File

@ -1,4 +1,4 @@
QT -= core gui
QT -= core gui
TARGET = graphics
TEMPLATE = lib
@ -7,12 +7,12 @@ CONFIG += graphics_dynamic_library
DEFINES += _QT
graphics_dynamic_library {
CONFIG += shared
CONFIG += shared
CONFIG += plugin
DEFINES += GRAPHICS_USE_DYNAMIC_LIBRARY_BUILDING
DEFINES += GRAPHICS_USE_DYNAMIC_LIBRARY_BUILDING
} else {
DEFINES += GRAPHICS_NO_USE_DYNAMIC_LIBRARY
DEFINES += GRAPHICS_NO_USE_DYNAMIC_LIBRARY
CONFIG += static
}
@ -23,7 +23,7 @@ include(../../../Common/base.pri)
ADD_DEPENDENCY(UnicodeConverter, kernel)
core_windows {
LIBS += -lAdvapi32
LIBS += -lAdvapi32
LIBS += -lShell32
}
@ -32,39 +32,45 @@ HEADERS += ./../config.h
GRAPHICS_AGG_PATH = $$PWD/../../agg-2.4
INCLUDEPATH += \
$$GRAPHICS_AGG_PATH/include
$$GRAPHICS_AGG_PATH/include
# matrix
HEADERS += \
$$GRAPHICS_AGG_PATH/include/test_grads/custom_gradients.h \
./../Matrix_private.h \
$$GRAPHICS_AGG_PATH/include/test_grads/custom_gradients.h \
./../Matrix_private.h \
./../Matrix.h
SOURCES += \
./../Matrix.cpp
./../Matrix.cpp
SOURCES += \
$$GRAPHICS_AGG_PATH/src/agg_trans_affine.cpp
$$GRAPHICS_AGG_PATH/src/agg_trans_affine.cpp
# paths
HEADERS += \
./../GraphicsPath_private.h \
./../GraphicsPath_private.h \
./../GraphicsPath.h
SOURCES += \
./../GraphicsPath.cpp
./../GraphicsPath.cpp
# alpha mask
HEADERS += \
./../AlphaMask_private.h \
./../AlphaMask.h
SOURCES += \
./../AlphaMask_private.cpp \
./../AlphaMask.cpp
# grapgics layer
HEADERS += \
./../GraphicsLayer.h \
./../GraphicsLayerBlend.h
SOURCES += \
$$GRAPHICS_AGG_PATH/src/agg_arc.cpp \
./../GraphicsLayer.cpp
SOURCES += \
$$GRAPHICS_AGG_PATH/src/agg_arc.cpp \
$$GRAPHICS_AGG_PATH/src/agg_bezier_arc.cpp \
$$GRAPHICS_AGG_PATH/src/agg_curves.cpp \
$$GRAPHICS_AGG_PATH/src/agg_bspline.cpp \
@ -76,9 +82,9 @@ include(raster.pri)
#CONFIG += graphics_disable_metafile
graphics_disable_metafile {
DEFINES += GRAPHICS_DISABLE_METAFILE
DEFINES += GRAPHICS_DISABLE_METAFILE
} else {
include(metafile.pri)
include(metafile.pri)
}
CONFIG += support_font_converter
@ -90,7 +96,7 @@ SOURCES += ./officedrawingfile.cpp
# graphics
SOURCES += \
$$GRAPHICS_AGG_PATH/src/agg_arrowhead.cpp \
$$GRAPHICS_AGG_PATH/src/agg_arrowhead.cpp \
$$GRAPHICS_AGG_PATH/src/agg_image_filters.cpp \
$$GRAPHICS_AGG_PATH/src/agg_line_aa_basics.cpp \
$$GRAPHICS_AGG_PATH/src/agg_line_profile_aa.cpp \
@ -99,7 +105,7 @@ SOURCES += \
$$GRAPHICS_AGG_PATH/src/agg_vcgen_smooth_poly1.cpp
HEADERS += \
./../ArrowHead.h \
./../ArrowHead.h \
./../Brush.h \
./../Clip.h \
./../Color.h \
@ -115,7 +121,7 @@ HEADERS += \
./Image.h
SOURCES += \
./../ArrowHead.cpp \
./../ArrowHead.cpp \
./../Brush.cpp \
./../Clip.cpp \
./../Graphics.cpp \

View File

@ -5,6 +5,7 @@ import base
base.configure_common_apps()
base.replaceInFile("../../../../Common/3dParty/icu/icu/source/common/udata.cpp", "\n{\n#ifdef BUILDING_WASM_MODULE\nreturn NULL;\n#endif\n UDataMemory tData;", "\n{\n UDataMemory tData;")
base.replaceInFile("../../../../DesktopEditor/cximage/png/pnglibconf.h", "//#define PNG_CONSOLE_IO_SUPPORTED", "#define PNG_CONSOLE_IO_SUPPORTED")
# finalize
base.replaceInFile("./deploy/drawingfile.js", "function getBinaryPromise(", "function getBinaryPromise2(")

View File

@ -13,6 +13,8 @@ if not base.is_dir("xml"):
base.replaceInFile("./xml/src/xmllight_private.h", "#include \"../../common/", "#include \"../../../../../common/")
base.replaceInFile("./xml/src/xmllight_private.h", "#include \"../../../UnicodeConverter/", "#include \"../../../../../../UnicodeConverter/")
base.replaceInFile("./xml/include/xmlutils.h", "#include \"../../common/", "#include \"../../../../../common/")
base.replaceInFile("./xml/libxml2/globals.c", "int xmlGetWarningsDefaultValue = 1;", "int xmlGetWarningsDefaultValue = 0;")
base.replaceInFile("./xml/libxml2/globals.c", "static int xmlGetWarningsDefaultValueThrDef = 1;", "static int xmlGetWarningsDefaultValueThrDef = 0;")
if not base.is_dir("freetype-2.10.4"):
base.copy_dir("../../../freetype-2.10.4", "./freetype-2.10.4")
@ -34,3 +36,4 @@ if not base.is_dir("freetype-2.10.4"):
common.apply_patch("./freetype-2.10.4/builds/unix/ftsystem.c", "./wasm/patches/ftsystem.patch")
base.replaceInFile("../../../../Common/3dParty/icu/icu/source/common/udata.cpp", "\n{\n UDataMemory tData;", "\n{\n#ifdef BUILDING_WASM_MODULE\nreturn NULL;\n#endif\n UDataMemory tData;")
base.replaceInFile("../../../../DesktopEditor/cximage/png/pnglibconf.h", "#define PNG_CONSOLE_IO_SUPPORTED", "//#define PNG_CONSOLE_IO_SUPPORTED")

View File

@ -31,6 +31,7 @@
"_GetLinks",
"_GetStructure",
"_GetInteractiveFormsInfo",
"_GetInteractiveFormsFonts",
"_GetInteractiveFormsAP",
"_GetButtonIcons",
"_GetAnnotationsInfo",
@ -39,13 +40,15 @@
"_InitializeFontsBase64",
"_InitializeFontsRanges",
"_SetFontBinary",
"_GetFontBinary",
"_IsFontBinaryExist",
"_DestroyTextInfo",
"_IsNeedCMap",
"_SetCMapData"
],
"include_path": [
"wasm/src/lib", "../../../agg-2.4/include", "../../../cximage/jasper/include", "../../../cximage/jpeg", "../../../cximage/png", "freetype-2.10.4/include", "freetype-2.10.4/include/freetype", "../../../../OfficeUtils/src/zlib-1.2.11", "../../../../OfficeUtils/src", "../../../../Common/3dParty/icu/icu/source/common", "../../../xml/libxml2/include", "../../../xml/build/qt", "../../../../OfficeUtils/src/zlib-1.2.11/contrib/minizip", "../../../../PdfFile/lib/goo", "../../../../PdfFile/lib/fofi", "../../../../PdfFile/lib/splash", "../../../../PdfFile/lib", "../../../raster/Jp2/openjpeg", "../../../raster/Jp2/openjpeg/openjpeg-2.4.0/src/lib/openjp2"
"wasm/src/lib", "../../../agg-2.4/include", "../../../cximage/jasper/include", "../../../cximage/jpeg", "../../../cximage/png", "freetype-2.10.4/include", "freetype-2.10.4/include/freetype", "../../../../OfficeUtils/src/zlib-1.2.11", "../../../../OfficeUtils/src", "../../../../Common/3dParty/icu/icu/source/common", "../../../xml/libxml2/include", "../../../xml/build/qt", "../../../../OfficeUtils/src/zlib-1.2.11/contrib/minizip", "../../../../PdfFile/lib/goo", "../../../../PdfFile/lib/fofi", "../../../../PdfFile/lib/splash", "../../../../PdfFile/lib", "../../../raster/Jp2/openjpeg", "../../../raster/Jp2/openjpeg/openjpeg-2.4.0/src/lib/openjp2",
"../../../../Common/3dParty/openssl/openssl/include"
],
"define": [
"__linux__", "_LINUX", "UNIX",
@ -58,16 +61,17 @@
"LIBXML_READER_ENABLED", "LIBXML_PUSH_ENABLED", "LIBXML_HTML_ENABLED",
"LIBXML_XPATH_ENABLED", "LIBXML_OUTPUT_ENABLED", "LIBXML_C14N_ENABLED",
"LIBXML_SAX1_ENABLED", "LIBXML_TREE_ENABLED", "LIBXML_XPTR_ENABLED",
"IN_LIBXML", "LIBXML_STATIC", "BUILD_ZLIB_AS_SOURCES",
"XML_ERROR_DISABLE_MODE", "IN_LIBXML", "LIBXML_STATIC", "BUILD_ZLIB_AS_SOURCES",
"_ARM_ALIGN_",
"_tcsnicmp=strncmp", "_lseek=lseek", "_getcwd=getcwd",
"NO_CONSOLE_IO", "USE_EXTERNAL_JPEG2000", "USE_JPIP", "OPJ_STATIC", "FONT_ENGINE_DISABLE_FILESYSTEM",
"IMAGE_CHECKER_DISABLE_XML"
"IMAGE_CHECKER_DISABLE_XML",
"USE_OPENSSL_HASH"
],
"compile_files_array": [
{
"folder": "../../../raster/",
"files": ["BgraFrame.cpp", "ImageFileFormatChecker.cpp"]
"files": ["BgraFrame.cpp", "ImageFileFormatChecker.cpp", "PICT/PICFile.cpp", "PICT/pic.cpp"]
},
{
"folder": "../../../cximage/CxImage/",
@ -119,7 +123,7 @@
},
{
"folder": "../../",
"files": ["GraphicsRenderer.cpp", "pro/pro_Graphics.cpp", "pro/pro_Fonts.cpp", "pro/pro_Image.cpp", "Graphics.cpp", "Brush.cpp", "BaseThread.cpp", "GraphicsPath.cpp", "Image.cpp", "Matrix.cpp", "Clip.cpp", "TemporaryCS.cpp", "AlphaMask.cpp", "AlphaMask_private.cpp", "commands/DocInfo.cpp", "commands/AnnotField.cpp", "commands/FormField.cpp"]
"files": ["GraphicsRenderer.cpp", "pro/pro_Graphics.cpp", "pro/pro_Fonts.cpp", "pro/pro_Image.cpp", "Graphics.cpp", "Brush.cpp", "BaseThread.cpp", "GraphicsPath.cpp", "Image.cpp", "Matrix.cpp", "Clip.cpp", "TemporaryCS.cpp", "AlphaMask.cpp", "GraphicsLayer.cpp", "commands/DocInfo.cpp", "commands/AnnotField.cpp", "commands/FormField.cpp"]
},
{
"folder": "../../../fontengine/",

View File

@ -27,7 +27,8 @@ INCLUDEPATH += \
$$CORE_ROOT_DIR/DesktopEditor/cximage/jpeg \
$$CORE_ROOT_DIR/DesktopEditor/cximage/png \
$$CORE_ROOT_DIR/DesktopEditor/freetype-2.10.4/include \
$$CORE_ROOT_DIR/DesktopEditor/freetype-2.10.4/include/freetype
$$CORE_ROOT_DIR/DesktopEditor/freetype-2.10.4/include/freetype \
$$CORE_ROOT_DIR/Common/3dParty/openssl/openssl/include
win32 {
DEFINES += \
@ -53,7 +54,6 @@ HEADERS += \
../../../Matrix_private.h \
../../../GraphicsPath.h \
../../../GraphicsPath_private.h \
../../../AlphaMask_private.h \
../../../AlphaMask.h \
\
../../../../raster/BgraFrame.h \
@ -66,6 +66,7 @@ HEADERS += \
../../../../raster/Metafile/Common/MetaFileObjects.h \
../../../../raster/Metafile/Common/MetaFileRenderer.h \
../../../../raster/Metafile/Common/MetaFileUtils.h \
../../../../raster/PICT/PICTFile.h \
\
../../../ArrowHead.h \
../../../Brush.h \
@ -78,6 +79,7 @@ HEADERS += \
../../../structures.h \
../../../shading_info.h \
../../../GraphicsRenderer.h \
../../../GraphicsLayer.h \
\
../../../../fontengine/ApplicationFonts.h \
../../../../fontengine/FontFile.h \
@ -103,11 +105,12 @@ HEADERS += \
SOURCES += \
../../../Matrix.cpp \
../../../GraphicsPath.cpp \
../../../AlphaMask_private.cpp \
../../../AlphaMask.cpp \
../../../../raster/BgraFrame.cpp \
../../../../raster/ImageFileFormatChecker.cpp \
../../../../raster/Metafile/MetaFile.cpp \
../../../../raster/PICT/PICFile.cpp \
../../../../raster/PICT/pic.cpp \
\
../../../ArrowHead.cpp \
../../../Brush.cpp \
@ -115,6 +118,7 @@ SOURCES += \
../../../Graphics.cpp \
../../../GraphicsRenderer.cpp \
../../../Image.cpp \
../../../GraphicsLayer.cpp \
\
../../../../fontengine/ApplicationFonts.cpp \
../../../../fontengine/FontFile.cpp \

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