Commit graph

179 commits

Author SHA1 Message Date
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
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
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
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
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
1302c18f28 common sw_engine: polished code
--OOM handling
++exception handling
++log info
2023-05-08 10:55:03 +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
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
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
Hermet Park
9b3c34c3b1 updated copyright. 2023-01-14 13:48:11 +09:00
projectitis
3dd65dfed0 common picture: support image mesh feature
Tvg Picture newly provides mesh() api to support texture mapping.
These apis allows to have a coarse triangle list which have polygon coordinates
and texture uvs those are used for traditional polygon texture mapping.

Note that these apis are beta version.

@API Additions:

Result mesh(const Polygon* triangles, const uint32_t triangleCount) noexcept
uint32_t mesh(const Polygon** triangles) const noexcept

@Examples:

//Mapping with two polygons
Polygon polygon[2];

//First polygon
polygon[0].vertex[0].pt = {0, 0};
polygon[0].vertex[1].pt = {100, 0};
polygon[0].vertex[2].pt = {0, 100};
polygon[0].vertex[0].uv = {0, 0};
polygon[0].vertex[1].uv = {1, 0};
polygon[0].vertex[2].uv = {0, 1};

//Second polygon
polygon[1].vertex[0].pt = {100, 0};
polygon[1].vertex[1].pt = {100, 100};
polygon[1].vertex[2].pt = {0, 100};
polygon[1].vertex[0].uv = {1, 0};
polygon[1].vertex[1].uv = {1, 1};
polygon[1].vertex[2].uv = {0, 1};

//Apply polygons to the picture
picture->mesh(polygon, 2);

@Issues: https://github.com/Samsung/thorvg/issues/1218
2022-08-20 11:58:55 +09:00
Omar Polo
53074d250f fix OpenBSD compile issue
Linux seems the only system AFAICS to have alloca.h.  All the BSDs have
the declaration in stdlib.h
2022-07-13 10:28:46 +09:00
Rémi Verschelde
46c3fc1f94 Format code files with dos2unix, ensure newline at EOF 2022-07-10 23:21:05 +09:00
Rémi Verschelde
becb70f09d Cleanup FreeBSD preprocessor checks (if vs ifdef)
Should be equivalent but checking if the value is defined (`#ifdef`) is cleaner
than checking if it is set to something different from 0 (`#if`).
2022-05-24 10:32:53 +09:00
Hermet Park
0e8cd1e525 fix FreeBSD compile issue.
alloca is defined in stdlib.h on [freeBSD](https://www.freebsd.org/cgi/man.cgi?alloca)

additional fix to 75c1314ab0
2022-05-17 22:05:10 +09:00
Michal Maciola
9212c0d158 sw_engine: fix comparison of integer expressions of different signedness
Some gcc versions and configurations was giving an error:
error: "comparison of integer expressions of different signedness: 'const SwCoord'
{aka 'const long int'} and 'uint32_t' {aka 'unsigned int'} [-Werror=sign-compare]"
This patch should fix the error
2022-01-17 12:02:51 +09:00
Michal Maciola
a0895cc91b sw_engine: fixed declaration of 'i' shadows a previous local
Some gcc versions and configurations was giving an error: error:
"declaration of 'i' shadows a previous local"
This patch should fix these errors
2022-01-17 12:01:58 +09:00
Hermet Park
f0141e63de updated copyright date. 2022-01-12 14:08:48 +09:00
Hermet Park
440cc81b4d sw_engine raster: fix a regression bug.
Picture example were broken by 90fa26b7bb

the correct condition must be like this change.
2022-01-06 12:40:22 +09:00
JunsuChoi
90fa26b7bb sw_engine SwRaster: Initialize uninitialized transform value 2022-01-05 17:08:59 +09:00
Michal Maciola
4cbeb5e3df compositeMethod: introduced LumaMask
Introduced CompositeMethod::LumaMask that converts the source pixels to the
grayscale (luma value) before alpha blending. Thanks to it, mask works more like
typical mask in graphics editor software.
Grayscale is calculated with  weighted method:
(0.0721*B + 0.7154*G + 0.2125*R) * A
Introduced surface->blender.lumaValue function
2021-12-30 21:27:32 +09:00
Hermet Park
05fefcf61f sw_engine raster: ++safety of the scaled image rasterization
Prevent out of buffer boundary access.

@Issues: https://github.com/Samsung/thorvg/pull/1119
2021-12-17 16:46:37 +09:00
Hermet Park
45132a7051 sw_engine raster: improve the transformed rle image rasterizer.
replace the transformed rle rgba image with the texmap raster.

this patch removes the several scattered transformed image rasterizer,
reuse the unified one texmap method instead.

yay, it's much clean and optimal.
2021-12-14 19:04:16 +09:00
Hermet Park
4cdf648e14 sw_engine image: support non-premultiplied alpha images.
Previously, translucent png images are not displayed properly
due to alpha channels premultiplication.

This patch implements that missing part to support it properly
by introducing the Surface data between canvas engine & rasterizer

@Issue: https://github.com/Samsung/thorvg/issues/655
2021-12-02 17:10:12 +09:00
Hermet Park
e7b7705875 sw_engine raster: remove unnecessary functions.
These alpha/inverse alpha blender table is not useful so far,
we remove them since it just decrease the performance by by-pass addressing.
2021-12-01 18:36:12 +09:00
JunsuChoi
e36c2029ce sw_engine SWRaster: Explicitly declare type cast to uint32_t 2021-11-30 15:46:26 +09:00
JunsuChoi
5715270dfb sw_engine SWRaster: Initialize uninitialized local variable 2021-11-30 14:54:55 +09:00
Hermet Park
c0cd645bb5 sw_engine raster: fix the regression bug of the image simple scaling rendering.
Gave up the optimization this logic.

It brings too many digressed code, not good for maintenance...
2021-11-30 12:03:10 +09:00
Hermet Park
d2640c6313 Revert "sw_engine raster: code refactoring."
This reverts commit 860068301a.

found a regression bug. this macro doesn't work actually.
2021-11-26 17:21:27 +09:00