Commit graph

459 commits

Author SHA1 Message Date
Hermet Park
caa214e4db sw_engine: code refactoring.
Renamed internal methods; the name 'RGBA' is sometimes confusing
because the channel composition does not accurately reflect it.

Therefore, it should be removed or replaced with 'Pixel'.
2023-06-20 14:57:01 +09:00
Hermet Park
00a87825b9 sw_engine: optimize code.
Considering the fundamental scenario,
the masking feature would likely be used less frequently.

We sacrifice a small amount of performance
by substituting the multiple implementations with blender calls.

However, this trade-off can result in a reduction in binary size.

Bin size: 212089 -> 205907 (-6kb)
2023-06-20 14:57:01 +09:00
Hermet Park
0b65d1fce5 sw_engine raster: ++tiny optimization
Attempt to perform as much computation as possible
before entering the rasterization stage.

This contains the code refactoring as well.
2023-06-20 11:30:18 +09:00
Hermet Park
c50d2fde5f common sw_engine: support blending methods.
The blending feature allows user to combine colors to create visually appealing effects,
including transparency, lighting, shading, and color mixing, among others.

Its process involves the combination of colors or images from the source paint object
with the destination (the lower layer image) using blending operations.

The blending operation is determined by the chosen @p BlendMethod,
which specifies how the colors or images are combined.

@APIs:
 - enum class BlendMethod::Normal, Add, Screen, Multiply, Overlay, Lighten, Difference, Exclusion, SrcOver, Darken, Lighten, ColorDodge, ColorBurn
 - BlendMethod Paint::blend() const noexcept;
 - Result Paint::blend(BlendMethod method) const noexcept;

@Issue: https://github.com/thorvg/thorvg/issues/307

Co-authored-by: Peter Vullings <peter@projectitis.com>
Co-authored-by: Hermet Park <hermetpark@lottiefiles.com>
2023-06-20 11:30:18 +09:00
Hermet Park
eea54f5fea sw_engine: code chores & fix gradient filling bugs.
renaming internal methods for integrating with upcoming blending features.
this also fixes minor wrong gradient filling blending equations.
2023-06-20 11:30:18 +09:00
Hermet Park
b60a291edc sw_engine: code refactoring
Removed the fake blender structure.
Unified matting and join as Surface methods.
2023-06-20 11:30:18 +09:00
Hermet Park
814d87626c common engines: optimizing data packing for compactness.
Standardized the opacity data type to use 1 byte
across all instances to maintain consistency and reduce scattered usage.
2023-06-15 10:35:34 +09:00
Hermet Park
8305383989 sw_engine: optimize 64-bit rasterization.
Write the pixels per 64-bit data.
This optimization can potentially double the performance in the best case scenario.
It's visually noticeable, especially when the resolution is sufficiently large.

@Issue: https://github.com/thorvg/thorvg/issues/1471
2023-06-13 10:42:40 +09:00
Martin Capitanio
44a750ee5d API, CAPI, sw_engine: add suport for stroke-miterlimit. 2023-06-13 10:42:20 +09:00
Hermet Park
dbdf103e82 sw_engine texmap: code clean up.
eliminate logic duplication by introducing a c++ template mechanism.

This will retain the opacity condition branches to minimize binary size.
2023-06-05 16:52:57 +09:00
Hermet Park
3399da198f sw_engine fill: code clean up.
eliminate logic duplication by introducing direct blend operation.
2023-06-05 16:52:57 +09:00
Hermet Park
fbe1b1fb5f sw_engine raster: code clean up.
eliminate logic duplication by introducing functions.
2023-06-05 16:52:57 +09:00
Hermet Park
92265ef0f1 sw_engine: Keep compact masking raster code.
Reduce duplicated masking raster code by replacing with c++ templates
this change does not noticeably impact performance (< error bound).

Binary Size diff: 218379 -> 217851 (-0.5kb)
2023-06-03 15:50:48 +09:00
Hermet Park
0294782c77 sw_engine: keep code clean. 2023-06-03 15:50:48 +09:00
Hermet Park
c3a002a474 sw_engine: Keep compact image raster code.
Reduce duplicated image raster code between scaler approaches.

Although this allows for a function call per pixel,
this change does not noticeably impact performance (< error bound).

Binary Size diff: 222541 -> 218379 (-4kb)
2023-06-03 15:50:48 +09:00
Hermet Park
a3691ff249 sw_engine: gradient filling code refactoring.
Reduce excessive gradient filling code duplication by employing C++ template method.

This change does not affect performance or binary size adversely.

Binary Size Diff: 223399 -> 222693 (-706)
2023-06-03 15:50:48 +09:00
Hermet Park
fddc409728 common sw_engine: adds missing composite methods.
Now tvg user could combine Mask Alpha & Mask Method like this:

paint->composite(target, tvg::CompositeMethod::AddMask);

binary size diff: 201307 -> 223399 (+22kb)

@APIs:
- CompositeMethod::AddMask
- CompositeMethod::SubtractMask
- CompositeMethod::IntersectMask
- CompositeMethod::DifferenceMask

@Issue: https://github.com/thorvg/thorvg/issues/404
2023-06-03 15:50:48 +09:00
Hermet Park
9032c00347 sw_engine texmap: code optimization.
Unify textmap methods that are overly duplicated with each other.

Still trying to simplifying raster code so that thorvg could introduce
the a bunch of masking method code nicely.

This reduces the size like: 214773 -> 212843 (-2kb)
2023-05-31 18:07:57 +09:00
Hermet Park
01974f652c sw_engine: code refactoring.
Unify raster methods that are overly duplicated with each others.
2023-05-30 20:07:34 +09:00
Hermet Park
86d287038b sw_engine: minor code clean up
keep code consistency, no logical changes.
2023-05-30 20:07:34 +09:00
Hermet Park
eb8539e0b4 sw_engine fill: optimize linear/radial fill fetching.
Save the separated for-loop by
unifying the blending/composition in one fetching stage.
2023-05-29 09:45:21 +09:00
Hermet Park
4d842d03f6 sw_engine: code refactoring.
unify raster methods that are overly duplicated with each other.
2023-05-29 09:45:21 +09:00
Hermet Park
62963268cb sw_engine: code cleanup
Remove unused template multiply.
Currently, 8-bit multiplication is the only valid operation.
2023-05-29 09:45:21 +09:00
Hermet Park
ee9b947c0c sw_engine: optimize alpha blending operation.
Compact blending instructions by distinquish the
shape & images. since we gurantee the shape color is
premultiplied alpha.

As a result, this enhanced performance by 0.002s in examples/Performance
on my local machine.

This also contains code cleanup chores.
2023-05-29 09:45:21 +09:00
Vincenzo Pupillo
368ff01618 Fix invalid conversion error in Avx raster. 2023-05-22 10:34:25 +09:00
Hermet Park
4838c25fa4 sw_engine raster: compact blender alpha table size. 2023-05-20 20:11:58 +09:00
Hermet Park
5643ecabd8 sw_engine: code refactoring
Introduced a blender alpha() to maintain clean and organized code.
2023-05-20 20:11:58 +09:00
Hermet Park
0aae65a171 sw_engine code refactoring.
Introduced a compositor table to maintain clean and organized code.
2023-05-20 20:11:58 +09:00
Hermet Park
21c7debf14 composite: Support Inverse Luma Masking
The CompositeMethod now includes the newly supported InvLumaMask option:

The source pixels are converted to grayscale (luma values),
and the complement of the target's pixels is alpha blended.
As a result, only the part of the source where the grayscale
is not covered by the target is visible.

@APIs: CompositeMethod::InvLumaMask

@Example: examples/InvLumaMasking.cpp

@Issue: https://github.com/thorvg/thorvg/issues/404
2023-05-20 20:11:58 +09:00
Hermet Park
0e960e2d2b sw_engine: remove an unused function. 2023-05-19 10:56:59 +09:00
Hermet Park
89db13037d common sw_engine: gather scattered stroking composition.
There are two branches for completing stroke composition between the canvas and sw_engine.

It is necessary to centralize the task on the canvas engine side so that
we can maintain the logic without confusion.
2023-05-19 10:35:24 +09:00
Hermet Park
7956a21fc2 sw_engine: fix the dead lock issue.
fully recovered from the scene clipping multi-tasksing.

@Issue: https://github.com/thorvg/thorvg/issues/1430
2023-05-09 15:56:30 +09:00
Mira Grudzinska
cfead5ff68 sw_renderer: fixing names after refactor
the 'buffer' doesn't exist any more in the Surface
struct. Replaced by tjhe 'buf32' - error visible
only while avx and neon rendering supported.
2023-05-08 22:04:01 +09:00
Hermet Park
3376f44de5 sw_engine: ++8bit grayscale rasterizer.
These rasterizers are added for 8bit maskings.
2023-05-08 10:55:03 +09:00
Hermet Park
4893746eb2 sw_engine: code refactoring
use shorter name.
2023-05-08 10:55:03 +09:00
Hermet Park
da6216f9bf sw_engine: specify buffer size so that we can clearly access the buffer data.
Also, it introduces the 'pixel_t' type to ensure that anonymous pixel data
follows the system's decision.
2023-05-08 10:55:03 +09:00
Hermet Park
f18d2557e3 sw_engine raster: code refactoring.
Move partial region in rasterClear()
2023-05-08 10:55:03 +09:00
Hermet Park
527b1af926 common sw_engine: applied colorspace format size.
Now backend engines know which channel size is required for
compositions.

@Issue: https://github.com/thorvg/thorvg/issues/976
2023-05-08 10:55:03 +09:00
Hermet Park
01b26c43a6 engine: add Renderer::colorSpace() interface
This is necessary for acquiring current format size.

@Issue: https://github.com/thorvg/thorvg/issues/976
2023-05-08 10:55:03 +09:00
Hermet Park
1302c18f28 common sw_engine: polished code
--OOM handling
++exception handling
++log info
2023-05-08 10:55:03 +09:00
Hermet Park
3c8a4afaa7 sw_engine: fix the broken scene clipping.
The implementation has been reverted by https://github.com/thorvg/thorvg/issues/1409

Since the sanitizer is not matured fully and it's false positive as far as I figured,
We revert the scene clipping part.

@Issue: https://github.com/thorvg/thorvg/issues/524
2023-05-06 19:22:21 +09:00
Hermet Park
d7eb913741 sw_engine: fix a logical wrong.
the value should be updated properly.
2023-05-06 15:14:11 +09:00
Hermet Park
e8eef1af1d common taskscheduler: revert 4db25db962
There is a report of the thread sanitizer.
It could be a false-positive as far as I reviewed,
but we hate to be bothered by it. So let's revert it.

@Issue: https://github.com/thorvg/thorvg/issues/1409
2023-05-04 13:42:50 +09:00
Hermet Park
bc7b448c01 sw_engine: ++thread-safety
One more regression bug by afea40a947

As tasks will now be triggered by other tasks on the worker threads,
the designated memory pool data (outline) for each thread should be
reset before moving on to other tasks.

@Issue: https://github.com/thorvg/thorvg/issues/1409
2023-04-30 20:28:12 +09:00
Hermet Park
e9b12aa9f7 engine/loaders: Migrate alpha premultiplying to the engine side.
It's not efficient to handle alpha premultiplying in every loader.
The backend engine should be responsible for it.
Now, we can remove duplicate code.
2023-04-29 12:37:09 +09:00
Hermet Park
c710af2560 loaders: Remove the color space conversion on the loader side.
Now, the job is completely delegated to the backend engine.
2023-04-28 15:27:53 +09:00
Hermet Park
b733030357 sw_engine: supports the color space conversion.
Currently implements only the necessary functions for converting
between ARGB and ABGR.

Now conversion can be accelerated by the backend engines.
2023-04-28 15:27:53 +09:00
Hermet Park
cf4484c1ad engine/loaders: develop the ColorSpace feature infrastructure
Replace the existing fragile usage of the colorspace data type
with a new and robust concrete ColorSpace type.
2023-04-28 15:27:53 +09:00
Hermet Park
84012651cc common engine: code refactoring
Introduce the RenderMesh structure to reduce the number of required parameters.
2023-04-27 10:16:12 +09:00
Hermet Park
6d08586883 common engine: code refactoring
Unify renderImage and renderImageMesh and hide their routines in backends.
2023-04-27 10:16:12 +09:00