Commit graph

1248 commits

Author SHA1 Message Date
Mira Grudzinska
54b328b1a9 sw_engine avx: addad ALPHA_BLEND and avxRasterTranslucentRect functions
Both functions implemented using 128-bit registers.
avxRasterTranslucentRect is around 5 times faster than cRasterTranslucentRect (i7-8700 CPU - Coffe Lake)
2021-08-28 15:55:50 +09:00
Michal Maciola
7be4bf4c4f wasm: intoduce saveTvg via File System API
This patch adds saveTvg() function into thorvgwasm.cpp.
Functions saves tvg using File System API.
To enable fs, changed build flag: -s FORCE_FILESYSTEM=1.
Increase in result thorvg-wasm.js size: about 68kB to about 125kB.
2021-08-28 15:35:48 +09:00
Michal Maciola
fe474856b9 tvg_loader: make sure the pointer does not exceed the size 2021-08-27 11:45:37 +09:00
Hermet Park
d599f744c8 tvg format: fix broken encoding/decoding.
a regression bug was introduced by 52a7a257b2
in size calculation of data in case of uncompressed version.

@Issue: https://github.com/Samsung/thorvg/issues/739
2021-08-25 21:48:30 +09:00
Hermet Park
3d80f0a9e9 common picture: quick fix the broken bounds() interface.
picture must return the boundary info - 0, 0, w, h
We assume that it has a designated picture size.

Aside from this issue,
bounds() api must be reviewed, its behavior is quite in a trouble...
unless the result is not transformed, its information is useless...

@Issue: https://github.com/Samsung/thorvg/issues/741
2021-08-25 19:32:26 +09:00
Michal Maciola
ae3141d65c svg: fix opacity percentage value parsing
Percentage values wasn't handled by _toOpacity() function. Other incorrect values
was handled wrongly. Now fixed.
2021-08-25 14:57:30 +09:00
Hermet Park
f5f1e9f3a4
Update CONTRIBUTING.md 2021-08-24 20:35:06 +09:00
Michal Szczecinski
94a3e92fdd sw common: Added neon translucent rect API implementation.
Changes:
Added neonRasterTranslucentRect implementation. Rendering was tested on
32 lottie fiels. Without neon ~ 18.1 FPS was measured. With neon ~ 20.1
FPS was measured.
2021-08-24 18:44:08 +09:00
Hermet Park
52a7a257b2 tvg_format: newly introduced for tvg data compression.
By choosing compress option, tvg tries to compress the data to reduce the binary size.
Since the compression has the double-edges sword, we provides an option to users
to select it by their demand. Basically, compression is better than non-compression.

After profiling, we decided to use the encoder/decoder of Guilherme R. Lampert's.

Here is the profiling result:

test.tvg: 296037 -> 243411 (-17%)
tiger.tvg: 54568 -> 50622 (-7%)
image-embedded.tvg: 2282 -> 1231 (-46%)

@Issue: https://github.com/Samsung/thorvg/issues/639

About compression method:

Lempel–Ziv–Welch (LZW) encoder/decoder by Guilherme R. Lampert

This is the compression scheme used by the GIF image format and the Unix 'compress' tool.
Main differences from this implementation is that End Of Input (EOI) and Clear Codes (CC)
are not stored in the output and the max code length in bits is 12, vs 16 in compress.

EOI is simply detected by the end of the data stream, while CC happens if the
dictionary gets filled. Data is written/read from bit streams, which handle
byte-alignment for us in a transparent way.

The decoder relies on the hardcoded data layout produced by the encoder, since
no additional reconstruction data is added to the output, so they must match.
The nice thing about LZW is that we can reconstruct the dictionary directly from
the stream of codes generated by the encoder, so this avoids storing additional
headers in the bit stream.

The output code length is variable. It starts with the minimum number of bits
required to store the base byte-sized dictionary and automatically increases
as the dictionary gets larger (it starts at 9-bits and grows to 10-bits when
code 512 is added, then 11-bits when 1024 is added, and so on). If the dictionary
is filled (4096 items for a 12-bits dictionary), the whole thing is cleared and
the process starts over. This is the main reason why the encoder and the decoder
must match perfectly, since the lengths of the codes will not be specified with
the data itself.
2021-08-24 14:24:17 +09:00
Hermet Park
80f02c64d1
Update README.md 2021-08-24 14:22:28 +09:00
Hermet Park
077132e9d9 res: updated images 2021-08-24 14:20:56 +09:00
Hermet Park
ff32d7ce2e res: updated images.
documentation images are not updated,
remove the file first and add again.
2021-08-24 14:19:20 +09:00
Hermet Park
e845256057 res: updated images. 2021-08-24 14:14:03 +09:00
Hermet Park
8d02b459ad
Update README.md 2021-08-24 14:13:02 +09:00
Michal Maciola
8ed6a1a12d utc: increase coverage of picture and fill 2021-08-20 12:36:09 +09:00
Michal Maciola
f66ea21e9c utc: increase coverage SwEngine 2021-08-20 12:35:25 +09:00
Hermet Park
2ceee70fcf wasm: turn off the vectorization.
We can visit this feature later when it's stable.
2021-08-20 12:33:18 +09:00
Michal Maciola
d82b088b7a utc: increase coverage up #1 2021-08-19 14:49:14 +09:00
Michal Maciola
3a05ae4c01 utc: increase coverage up 2021-08-19 14:49:14 +09:00
Hermet Park
6f95e9dbe7 infra: simplify vector meson option.
neon/avx can't be resided in together,
we replace it with a string variable.
2021-08-19 14:46:59 +09:00
Michal Maciola
78dd50acc0
svg2png: enhance the feature.
Svg2png fully redesigned.
Introduced whole directory parsing. Created flags interface.

Usage:
   svg2png [svgFileName] [-r resolution] [-b bgColor]

Flags:
    -r set output image resolution.
    -b set output image background color.

Examples:
    $ svg2png input.svg
    $ svg2png input.svg -r 200x200
    $ svg2png input.svg -r 200x200 -b ff00ff
    $ svg2png input1.svg input2.svg -r 200x200 -b ff00ff
2021-08-18 20:29:10 +09:00
Michal Maciola
399caaaff9 picture: fix reloading images
Calling picture->load after it was already once called resulted in
segmentation fault or memory leak (depending on whether the vector (svg, tvg)
or raster (jpg, png, raw) file was loaded).
This patch checks the image has already been loaded. If so, the load()
returns InsufficientCondition.

@issue: fixes #719
2021-08-18 19:17:14 +09:00
Hermet Park
ca16e8b403 build: renamed the cpu vectorization option. 2021-08-18 19:00:48 +09:00
Michal Szczecinski
e3eaa05548 build: Fixed simd options detection 2021-08-18 18:58:12 +09:00
Hermet Park
1dd5e5c2ea
Update README.md 2021-08-17 14:14:48 +09:00
Michal Szczecinski
359b7d0dbb sw_common neon: Fix issue with unaligned memory.
Neon operations should be performed on memory aligned to 8 bytes.
This commit fixes this issue and increase stability of neon rasterizer.
2021-08-17 12:56:26 +09:00
Hermet Park
e1d5ade705 sw_engine: memory optimization.
Save the size of the Countour array,
16 bits is large enough to count the points number in one Shape.
2021-08-12 20:13:58 +09:00
Hermet Park
2280bb9ce7 sw_engine shape: fix a corner case that close tag is overwritten with a wrong value.
if the last contour dispatching is dealt with closed command but actual command
is not the closed, the close tag is written with the opened

In this case, stroking rendering is buggy.
2021-08-12 19:40:59 +09:00
Hermet Park
da55b84ed8 tvg_saver: optimize tvg format.
So this optimization stragtegy is to merging shapes.
If two shapes have the same layer, having save properties except the paths,
we can integrate two shapes to one, this helps to build up a simpler
scene-tree, reduce the runtime memory, helps for faster processing for rendering.

As far as I checked tiger.svg, it removes 142 shape nodes,
decreased the binary size: 60537 -> 54568.

Overall, avg 4% binary size can be reduced among our example svgs by this patch.
2021-08-12 18:39:58 +09:00
Hermet Park
e15b1dbc5f sw_engine: allow sharing shapes & connected strokes all in one.
This patch enhanced the sw raster engine to allow the both closed & open pathes
in one shape rendering.

@Issue: https://github.com/Samsung/thorvg/issues/266
2021-08-12 18:39:46 +09:00
Hermet Park
669ac392ca
Add files via upload 2021-08-12 00:39:36 +09:00
Hermet Park
79620d6a6c
Delete example_tvgsize.png 2021-08-12 00:38:31 +09:00
Hermet Park
2819e093b1
Add files via upload 2021-08-12 00:37:56 +09:00
Hermet Park
b3892d14f6
Delete example_tvg.webp 2021-08-12 00:37:44 +09:00
Hermet Park
e4f8f1e03c
Delete example_tvgsize.png 2021-08-12 00:37:36 +09:00
Hermet Park
6a8f1ae3cd
Add files via upload 2021-08-12 00:36:27 +09:00
Hermet Park
02dd8bee65
Update README.md 2021-08-12 00:35:57 +09:00
Hermet Park
672b514cb6
Add files via upload 2021-08-12 00:33:57 +09:00
Hermet Park
9ed4e21937
Add files via upload 2021-08-12 00:31:53 +09:00
Hermet Park
a382a78aee
Update README.md 2021-08-12 00:31:28 +09:00
Michal Maciola
e6ebb5379b common: RenderRegion x, y protect against negative value in unsigned int
This change protects against negative value in unsigned int of
RenderRegion.x/y. This fixes a problem of invisible paint if ClipPath
bounds was negative.

@issue: #704
2021-08-11 21:46:59 +09:00
Hermet Park
abebdbe545 tvg_saver: optimize saving data.
This optimizes binary size by skipping the scene if it has the only child.

though the reduced size is too trivial size (avg 0.4% as far as I checked our example svgs),
we can reduce the loading job & runtime memory as well.
2021-08-11 12:19:31 +09:00
Hermet Park
2337ea2b01 common interator: add count() interface. 2021-08-10 11:58:48 +09:00
Hermet Park
5b89389161 tvg_saver: skip the invisible paint as possible. 2021-08-10 10:29:28 +09:00
Hermet Park
41ad6e16e9 --annoying compiler warnings. 2021-08-09 21:24:27 +09:00
Hermet Park
98701eeffe sw_engine raster: move neon implementation to the neon domained file. 2021-08-09 20:54:38 +09:00
Hermet Park
dd1a1723c9 doc api: updated missed version info. 2021-08-09 18:21:45 +09:00
Hermet Park
81f0f199d9 doc api: up to date v0.4.0 2021-08-09 18:20:25 +09:00
Michal Maciola
5f25154ba8 common: meson.build added default_options cpp_std=gnu++14 2021-08-09 18:08:38 +09:00
Hermet Park
0773185f92 common initializer: remove unnecessary code.
x is always not equal to zero.
2021-08-09 16:14:36 +09:00