mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
Compare commits
497 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cf90cd9e12 | |||
| 690d17f6c4 | |||
| 7776743d8d | |||
| 159ffec93b | |||
| aba868b9ac | |||
| 7d6a95d521 | |||
| 0ff68fcd8d | |||
| 25fc759e61 | |||
| ace094fc2a | |||
| 77901663a0 | |||
| e11f145d30 | |||
| 5c69cb0358 | |||
| 2f4fee3555 | |||
| 7710090d31 | |||
| c7df1bc3ce | |||
| 7fdead0eda | |||
| e78a4c84b4 | |||
| 62481e5def | |||
| 192704636f | |||
| 0a9356f54b | |||
| ae8b458f79 | |||
| 8a88fce72f | |||
| d23ebbdb38 | |||
| 5a9f74f5ad | |||
| ef3cbf03b3 | |||
| a6a73ffe3a | |||
| 33c5852834 | |||
| f055d0d592 | |||
| bf68f87aa7 | |||
| d4c245029d | |||
| fb72c73ca0 | |||
| cf19a912ee | |||
| 01d76af52f | |||
| 795274a886 | |||
| 5ccef7bdff | |||
| 581e54691b | |||
| ba79959955 | |||
| ea9ef2349d | |||
| aaf9772805 | |||
| 8b62c50107 | |||
| 3889ca0c94 | |||
| ca4c17847d | |||
| 1994a25b61 | |||
| 1e59463499 | |||
| 5d642ff7c4 | |||
| 74baaca570 | |||
| 5609c5fc7d | |||
| a9394ac989 | |||
| 51a8984ab8 | |||
| b413dbfb4a | |||
| 22bf7a149a | |||
| 430adb678d | |||
| d5126dbda9 | |||
| f6eb25b3f1 | |||
| c2231fca7c | |||
| 0529bc9d82 | |||
| 29eb5bed4d | |||
| 157c8acf57 | |||
| 397421c9c1 | |||
| 59e977d94c | |||
| e25071cecf | |||
| c3e19a6376 | |||
| 4868df7e10 | |||
| 7d55ebafbc | |||
| 03078b01d1 | |||
| 4c1420a3a6 | |||
| ff6866c68a | |||
| 4d3f925a11 | |||
| b05bdc68ce | |||
| 4ddc517b93 | |||
| fb78b3b611 | |||
| 617714a907 | |||
| 0ee70f03c1 | |||
| e30abd06a2 | |||
| 70d8a1a927 | |||
| 8e12b946a8 | |||
| 6e8c2d46fa | |||
| efead80648 | |||
| 3efd9aebc9 | |||
| 2eed2729cc | |||
| f9000aba58 | |||
| e61999c5fe | |||
| 108b749d4f | |||
| cb2dff90b9 | |||
| 48a055d390 | |||
| f8293950ca | |||
| 84b19f48c7 | |||
| ec107421bb | |||
| d2acd7d86d | |||
| 18d274cff2 | |||
| 1686efd6ba | |||
| e73992f869 | |||
| 13a1d953b8 | |||
| 0764850b79 | |||
| 9cfbb0012c | |||
| dfb8359d11 | |||
| bd4d242aee | |||
| 06cf8b4a3d | |||
| 16fec2e641 | |||
| 08c9dd34ac | |||
| 0ed9b41710 | |||
| fefe6b3053 | |||
| 50f3ad5d65 | |||
| f134870e73 | |||
| 180451e272 | |||
| 9b97070db7 | |||
| 9b16f92ae5 | |||
| edb2a0f503 | |||
| 39b61f1094 | |||
| 0e68fac03d | |||
| 46ce3f962e | |||
| 2be05c4439 | |||
| cb5d6d72b9 | |||
| 9f9da695d0 | |||
| 809ed0f91d | |||
| 1f4f05d52e | |||
| daaf4f0390 | |||
| 1432c7b07e | |||
| e9b9f0f550 | |||
| d61a309ca0 | |||
| 5c54ec3280 | |||
| aefce8c03c | |||
| a879cd94c6 | |||
| 42b86ceb53 | |||
| 5cb048e074 | |||
| eac27ae43b | |||
| 0415a3ec56 | |||
| ad4754f7fc | |||
| b589d8e3ce | |||
| 84ae9da444 | |||
| bd7bcc6b4d | |||
| 7259f9b376 | |||
| 44b1abf27d | |||
| d878291091 | |||
| 4ee2ca7098 | |||
| 78cb8a7d55 | |||
| 29fe342a1c | |||
| a2916309b3 | |||
| 9b38a17d5f | |||
| 0803b33067 | |||
| 004fcbe7ba | |||
| bbfdab9231 | |||
| 14d9d2b01e | |||
| 7b6a706ca3 | |||
| d593418616 | |||
| a160bc7ad1 | |||
| f341dac2c3 | |||
| 4041e5b31c | |||
| 0774df72ca | |||
| a3b0bb2294 | |||
| 20a2424605 | |||
| a871295ad7 | |||
| 2cf11468d4 | |||
| b59b2ba039 | |||
| 950449b8de | |||
| 15ba22dc5c | |||
| 63b2b0b432 | |||
| 86eddff91d | |||
| c426474c50 | |||
| 4fc9fc68e2 | |||
| 540fce9ab8 | |||
| 505231291f | |||
| 441e9276f4 | |||
| 9bbea65319 | |||
| ba9d6b430a | |||
| 95073fd590 | |||
| 6bc58b973c | |||
| 9da99f35b8 | |||
| d81efffbef | |||
| 650db9c31f | |||
| a22882af85 | |||
| c5436f38fa | |||
| 4064aba5fb | |||
| 88ea658a9c | |||
| b263eab373 | |||
| 457332f5f4 | |||
| f763e6bad5 | |||
| 079814117c | |||
| 69595f9211 | |||
| 1a8ada7858 | |||
| 6d5d74de0c | |||
| e42c3ac2d2 | |||
| 1633ad4ec7 | |||
| 81caee014c | |||
| 57497bc14b | |||
| 5663169473 | |||
| af04c2bac1 | |||
| e4477c9926 | |||
| 759d5e3ee9 | |||
| 5d4f785cc1 | |||
| 1b04d28591 | |||
| 5c251c1924 | |||
| 2ba62286d0 | |||
| 28768e32af | |||
| 48883ca955 | |||
| 87289a2bd8 | |||
| ceede2a1ad | |||
| 96a826ff3f | |||
| 8c2e8c3b0d | |||
| 8d804aee3a | |||
| 84bffd422b | |||
| 9aeaa6931e | |||
| e23809622c | |||
| 58d068a4dd | |||
| 75cf6858b6 | |||
| c13b4cb209 | |||
| b568f5a4e3 | |||
| 0288ee87bd | |||
| 7227630d5e | |||
| e8f9489f83 | |||
| 183744efc4 | |||
| 4751706525 | |||
| a311f6f73f | |||
| b949cf7c72 | |||
| 2c29a5a02f | |||
| 4a2595ed7d | |||
| faf4273c2a | |||
| 41fc05cdbb | |||
| 794f10f42f | |||
| 8137e2bac1 | |||
| 0b79546f14 | |||
| c1689caf7e | |||
| d907167da6 | |||
| 8eb5a078d8 | |||
| a7173cfefe | |||
| 59fcd227ea | |||
| f651c3286d | |||
| 2cc1ff4843 | |||
| 96929ac63a | |||
| 153f522a82 | |||
| 177de8c7f6 | |||
| a6bfc5ed2d | |||
| e5eb83e53a | |||
| 4b6044da56 | |||
| 2278c88d63 | |||
| 578a792fda | |||
| b26d9ca0a1 | |||
| e7dff77c8e | |||
| 15c555ffa6 | |||
| aa8e26f366 | |||
| bd37046d7b | |||
| 30757ef731 | |||
| cf4cc21e5f | |||
| 84108b9617 | |||
| ff12c4a4ba | |||
| 752829d819 | |||
| 4c549a1f81 | |||
| 292fcf7e6f | |||
| 9e5c896098 | |||
| 600e59b356 | |||
| af2c49b9c7 | |||
| 292f079872 | |||
| 2b26449e5b | |||
| dfc9434174 | |||
| 48c122a200 | |||
| 631fce0c35 | |||
| 2007619d78 | |||
| fee163957b | |||
| 5ef77d25a9 | |||
| dc538180a4 | |||
| 6e9f7fff71 | |||
| 0f055f696f | |||
| 086fc272df | |||
| 58fb5b715c | |||
| da2fd8f9b4 | |||
| 0cde91fed2 | |||
| 77bd3703c6 | |||
| 503b9140e3 | |||
| 98dfe303ca | |||
| 8fc6368a05 | |||
| 69a255a3f1 | |||
| 1370043ce4 | |||
| 085337230a | |||
| 14555839b5 | |||
| 8bb77f373d | |||
| d1364c4b80 | |||
| 8287f4c9ff | |||
| 8243a284a1 | |||
| 910a68765a | |||
| f599ad625f | |||
| 13236c4a81 | |||
| 186674d749 | |||
| 9d0f8ec414 | |||
| 75845fd471 | |||
| f3836e86cb | |||
| b83d5abbe0 | |||
| 288fb4d812 | |||
| 787f394ca8 | |||
| 2db233fa7b | |||
| ea6f4a7295 | |||
| e5370989dd | |||
| 940af313fd | |||
| ce8effaaa1 | |||
| fce70b0c0c | |||
| 423411b679 | |||
| eb95a37dfe | |||
| 492f2d3dc0 | |||
| aa9bbbaa62 | |||
| a50c8701f4 | |||
| 244061bbb7 | |||
| 62fc4066fd | |||
| 75c855a1d0 | |||
| 8e38736cf5 | |||
| 607d32e32b | |||
| 67ca3c57b8 | |||
| 9908c9e507 | |||
| 2869ef8ab6 | |||
| 3aa91fcfd4 | |||
| f8c664daef | |||
| 63f6190da8 | |||
| a2aeb83fa8 | |||
| ed65322e03 | |||
| 5c52d72932 | |||
| e3eb812659 | |||
| a096d0787f | |||
| e6496a34a8 | |||
| d933472b53 | |||
| ef664af175 | |||
| 2f2578dacd | |||
| 951ebdc479 | |||
| 06dba97bf1 | |||
| bbddaf0bb7 | |||
| 07e43a64e6 | |||
| 4cdc234418 | |||
| a651f3a29d | |||
| e2759153dc | |||
| 9ce4444aa7 | |||
| 20c56559d9 | |||
| 02cce6ff1b | |||
| 018ddb1540 | |||
| 7c46dc9d3b | |||
| e93f270621 | |||
| 228feb9487 | |||
| b05c240439 | |||
| 470f64ca41 | |||
| 864b9c3da6 | |||
| 89059d71bd | |||
| ae58e99e04 | |||
| ac711129e3 | |||
| ad51957b5e | |||
| 36c2e3dd22 | |||
| d9637f12e1 | |||
| bba7826ba3 | |||
| 83ba8e890f | |||
| 99d72986d8 | |||
| 462bd9f302 | |||
| 3042dc08cc | |||
| 3cb014edd9 | |||
| 4efc453cc4 | |||
| 61e5896830 | |||
| 032b61f532 | |||
| 07be7f5de4 | |||
| bfa6a6d826 | |||
| 285cbdc9c5 | |||
| 72cc8a1566 | |||
| 5deee7049f | |||
| 22943e61bc | |||
| f5ff9b5b9b | |||
| 78d50a329a | |||
| 5fe5efb001 | |||
| 87f0b9cb05 | |||
| 3537f9edfa | |||
| 1709ef0c08 | |||
| f62859046e | |||
| 5b93fb7fe3 | |||
| 848204d7d0 | |||
| 2896e00e0f | |||
| 63e16a4967 | |||
| 1e43922247 | |||
| a0d3d402a3 | |||
| 09ab798f0d | |||
| 4497e59602 | |||
| b7627222d3 | |||
| 3f020f9e16 | |||
| b0257d138f | |||
| 54efbc22fc | |||
| 1a47ad9c31 | |||
| 27dcc07cee | |||
| 69305816f7 | |||
| 7ca14893b9 | |||
| ccfaa64cc1 | |||
| 365f73df56 | |||
| a1f149945c | |||
| 2c3ebd218e | |||
| 6da3453104 | |||
| 7e9c6bd266 | |||
| a432af9b7e | |||
| 766c4b61a1 | |||
| 372ae97780 | |||
| 5b1dea7a19 | |||
| 4871e28398 | |||
| 3a69bf7b3a | |||
| 7373566cd5 | |||
| c1c15d067a | |||
| 22e0772cdb | |||
| 61d75ed092 | |||
| 8550cec836 | |||
| f82b8ad14f | |||
| 0258c03400 | |||
| cb7247a3cd | |||
| 8dab6c0b7a | |||
| 0cf46a4ca5 | |||
| 610b0b0831 | |||
| 8ad3170a26 | |||
| 9c5e02de53 | |||
| 6678012307 | |||
| 97c314e379 | |||
| 765cf636d4 | |||
| e29016e803 | |||
| f892a000ff | |||
| a18c2c1d4c | |||
| a2b75cabf0 | |||
| 8a511c45bd | |||
| a3f414bb3a | |||
| be7a51989d | |||
| 15b4eee571 | |||
| 02fbbc6ce5 | |||
| ca885745f2 | |||
| e50d21e9ea | |||
| b4dd7230ca | |||
| 0ce7733113 | |||
| 411495ee0d | |||
| 0ec39e3d32 | |||
| 8d7692d6f2 | |||
| 2895e27c32 | |||
| a5351fbf12 | |||
| d75c7c93f0 | |||
| 9366c7e2a3 | |||
| 565bab2d4d | |||
| 230fe73eb4 | |||
| d84f8b3146 | |||
| 36677119e8 | |||
| dd07e9d868 | |||
| 5807ffa45a | |||
| c002de1ad3 | |||
| 94c4e22b8e | |||
| 01776552f5 | |||
| 3e5eb3d251 | |||
| b4ddfac5ed | |||
| d50451739c | |||
| bb3de819cd | |||
| 1eeaea8c34 | |||
| 2d9206b79b | |||
| f6e126026a | |||
| 14962ccaef | |||
| 282e1fe025 | |||
| f633fad046 | |||
| 3a73292e81 | |||
| f024c9fb8f | |||
| a096559e29 | |||
| fdaf8e6c6b | |||
| 6ebdc0f530 | |||
| b0dfb4c731 | |||
| 254e5168af | |||
| fe6590366d | |||
| 86d5b5920f | |||
| f7af725d77 | |||
| 3ae6927ac3 | |||
| 4988c1853e | |||
| 6588e1d80b | |||
| 07c9efd29f | |||
| 2fba8eb6d7 | |||
| 7f9164ddb2 | |||
| 0c28276753 | |||
| 44ef271b92 | |||
| 68cfa314b6 | |||
| 9eee80b43e | |||
| 49d3e46a0f | |||
| bcea33ed19 | |||
| a8f9ff175e | |||
| 6301240a92 | |||
| f6c0ffc644 | |||
| d646876347 | |||
| 84c34eed65 | |||
| c23eece6ae | |||
| 31f52731f6 | |||
| 59806039ed | |||
| 7eebede9a6 | |||
| eecc623723 | |||
| 85f86c2de6 | |||
| 62f5b03bb4 | |||
| eecd983377 | |||
| 6bafc84285 | |||
| a4ac108c7c | |||
| 20e782bf5b | |||
| dddd37af12 | |||
| 87d9ad5b88 | |||
| 1ab39932c4 | |||
| 8213524b6b | |||
| 501419523d | |||
| caa50dbc47 | |||
| 6fcd76a469 | |||
| 50a83e819f | |||
| aa5af32b27 | |||
| 954f3d5471 | |||
| 4c94c647cc | |||
| 284c5836e2 |
162
.github/workflows/codeql.yaml
vendored
Normal file
162
.github/workflows/codeql.yaml
vendored
Normal 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 }}
|
||||
@ -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();
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -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))
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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();
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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=";
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
|
||||
34
Common/OfficeFileFormatDefines.h
Normal file
34
Common/OfficeFileFormatDefines.h
Normal 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";
|
||||
@ -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
|
||||
|
||||
|
||||
@ -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
56
Common/js/logging.h
Normal 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
|
||||
@ -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);
|
||||
};
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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_
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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")
|
||||
{
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
@ -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";
|
||||
|
||||
@ -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
|
||||
};
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
|
||||
};
|
||||
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
@ -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_
|
||||
|
||||
@ -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_
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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));
|
||||
|
||||
461
DesktopEditor/doctrenderer/json/json.cpp
Normal file
461
DesktopEditor/doctrenderer/json/json.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
282
DesktopEditor/doctrenderer/json/json.h
Normal file
282
DesktopEditor/doctrenderer/json/json.h
Normal 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_
|
||||
37
DesktopEditor/doctrenderer/json/json_p.h
Normal file
37
DesktopEditor/doctrenderer/json/json_p.h
Normal 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_
|
||||
199
DesktopEditor/doctrenderer/json/json_values.cpp
Normal file
199
DesktopEditor/doctrenderer/json/json_values.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
118
DesktopEditor/doctrenderer/json/json_values.h
Normal file
118
DesktopEditor/doctrenderer/json/json_values.h
Normal 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_
|
||||
149
DesktopEditor/doctrenderer/json/serialization.h
Normal file
149
DesktopEditor/doctrenderer/json/serialization.h
Normal 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_
|
||||
@ -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));
|
||||
|
||||
64
DesktopEditor/doctrenderer/server.h
Normal file
64
DesktopEditor/doctrenderer/server.h
Normal 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
|
||||
@ -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
|
||||
@ -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\\\"
|
||||
|
||||
@ -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
|
||||
|
||||
316
DesktopEditor/doctrenderer/test/js_internal/main.cpp
Normal file
316
DesktopEditor/doctrenderer/test/js_internal/main.cpp
Normal 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
|
||||
40
DesktopEditor/doctrenderer/test/js_internal/test.pro
Normal file
40
DesktopEditor/doctrenderer/test/js_internal/test.pro
Normal 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
|
||||
996
DesktopEditor/doctrenderer/test/json/main.cpp
Normal file
996
DesktopEditor/doctrenderer/test/json/main.cpp
Normal 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
|
||||
39
DesktopEditor/doctrenderer/test/json/test.pro
Normal file
39
DesktopEditor/doctrenderer/test/json/test.pro
Normal 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
|
||||
@ -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())
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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++)
|
||||
{
|
||||
|
||||
@ -51,6 +51,8 @@ class GRAPHICS_DECL CApplicationFontsWorker
|
||||
public:
|
||||
// использовать ли системные шрифты
|
||||
bool m_bIsUseSystemFonts;
|
||||
bool m_bIsUseSystemUserFonts;
|
||||
|
||||
// дополнительные папки с шрифтами
|
||||
std::vector<std::wstring> m_arAdditionalFolders;
|
||||
|
||||
|
||||
@ -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_
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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"]
|
||||
|
||||
@ -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"]();
|
||||
};
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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_
|
||||
@ -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
|
||||
|
||||
@ -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_
|
||||
|
||||
150
DesktopEditor/graphics/BaseThreadMonitor.cpp
Normal file
150
DesktopEditor/graphics/BaseThreadMonitor.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
87
DesktopEditor/graphics/BaseThreadMonitor.h
Normal file
87
DesktopEditor/graphics/BaseThreadMonitor.h
Normal 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_
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
|
||||
65
DesktopEditor/graphics/GraphicsLayer.cpp
Normal file
65
DesktopEditor/graphics/GraphicsLayer.cpp
Normal 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;
|
||||
}
|
||||
}
|
||||
|
||||
44
DesktopEditor/graphics/GraphicsLayer.h
Normal file
44
DesktopEditor/graphics/GraphicsLayer.h
Normal 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
|
||||
101
DesktopEditor/graphics/GraphicsLayerBlend.h
Normal file
101
DesktopEditor/graphics/GraphicsLayerBlend.h
Normal 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
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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) \
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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 \
|
||||
|
||||
@ -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 \
|
||||
|
||||
@ -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(")
|
||||
|
||||
@ -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")
|
||||
@ -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/",
|
||||
|
||||
@ -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
Reference in New Issue
Block a user