Commit Graph

76935 Commits

Author SHA1 Message Date
Matthias Clasen
802d539b05 path_text demo: Fixup
We don't want any filtering by curve type here.
2023-07-01 18:58:42 -04:00
Matthias Clasen
001ac59a6b pathmeasure: Drop some unused apis
We are not convinced that it is a good idea
to expose the concept of contours, and these
apis are entirely unused, so drop them.
2023-07-01 16:04:29 -04:00
Matthias Clasen
1a85ba7451 curve: Explicitly initialize memory
Unitialized memory warnings aren't fun.
2023-06-30 07:48:31 -04:00
Matthias Clasen
750088f01c Be less demanding in the get_point test
When looking for discontinuities, there
is no need to check for epsilons. As we
move close to the end of one contour / the
beginning of the next, the path length distance
between the two points will get arbitrarily
small, so we can just check that the distance
between the points is more than twice that.

This makes spurious failures of the /path/get_point
test go away.
2023-06-30 07:47:58 -04:00
Matthias Clasen
db2a167ea2 Plug a memory leak in the path tests 2023-06-30 07:47:52 -04:00
Matthias Clasen
cdca291962 Only test conic weights between 1/20 and 20
The rest just give us no end of numeric trouble.
2023-06-30 07:47:44 -04:00
Matthias Clasen
ba5f7d77f8 pathbuilder: Avoid trouble with sincos
The Windows builds seem to have problem with
this handling of sincos(), so do it the same
way we do it elsewere, by defining _sincos().
2023-06-30 07:47:44 -04:00
Matthias Clasen
17726a4330 Make gsk_stroke_to_cairo public
It comes in handy, and does no harm.
2023-06-30 07:47:44 -04:00
Matthias Clasen
b47cbd74c0 Add comment for conic curves 2023-06-30 07:47:04 -04:00
Matthias Clasen
84e8f3db83 Docs: Fix a typo 2023-06-30 07:47:04 -04:00
Matthias Clasen
ae22094fb7 Documentation fixes
gi-docgen can't handle an indent > 2 in continuation lines.
2023-06-30 07:45:12 -04:00
Matthias Clasen
c3061916bc curve: Match skia more precisely
Close reading of sources revealed that we
were not actually using the same conditions
as skia here, causing our measurements to
come out slightly different.

With this change, we are in almost perfect
agreement with skia.
2023-06-30 07:44:21 -04:00
Matthias Clasen
87346d3151 curve: Cosmetic 2023-06-30 07:44:13 -04:00
Matthias Clasen
0f38573008 tests: Less degenerate, please
We were inadvertendly using 95% degenerate paths,
instead of 5%. Oops.
2023-06-30 07:42:52 -04:00
Matthias Clasen
555aa8e409 contour: Reimplement get_winding
Follow the usual implementation more closely,
and drop reporting a separate 'on_edge' bit.

This was wrong in some cases, and we don't
need it. See the testcase in this commit
for a case where 'on_edge' was wrongly
deciding that a point is inside.
2023-06-30 07:42:52 -04:00
Matthias Clasen
efd2f41c54 Add a test for a bad case
This is narrowing down what goes wrong in the
segment test: We have an unevenly parameterized
cubic. This case gave me a lot of trouble.
2023-06-30 07:42:52 -04:00
Matthias Clasen
670058eec7 tests: Handle internal tests better
We have a better way of testing private API now,
by linking statically.
2023-06-30 07:42:52 -04:00
Matthias Clasen
6452f92ee6 Fix a stack overflow in a test
The test_in_fill_rotated test was mistakenly
assuming that conics come with 4 points, when
the only have 3. Oops.
2023-06-30 07:42:52 -04:00
Matthias Clasen
087c81f957 Fix memory overruns in the path parser
It turns out that using strchr() to identify
chars in your string isn't safe since strchr
happily matches the '\0' at the end of the input.

If we are not careful, that makes use walk
off the end of the string.

This issue was found by asan.
2023-06-30 07:42:50 -04:00
Matthias Clasen
4e2e8b2d7b Fix curve tests in release builds
g_test_init sabotages tests in release builds,
we have to use (g_test_init) to avoid the sabotage.

At the same time, we have to avoid using g_assert,
since that's a no-op in release builds.
2023-06-30 07:42:10 -04:00
Matthias Clasen
596ed7244e Fix fp16 with asan
The IFUNC resolvers that we are using here get
run early, before asan had a chance to set up its
plumbing, and therefore things go badly if they
are compiled with asan. Turning it off makes things
work again.

The gcc bug tracking this problem:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110442
2023-06-30 07:42:10 -04:00
Benjamin Otte
826efc4dff testsuite: Increase tolerances to make the path test work
I dislike the corner cases being so low (lower than 1% and off by a
whole point).
2023-06-19 18:18:44 +02:00
Benjamin Otte
d4705216ed path: Handle segments of degenerate curves via lines
When curves have long straight parts that decompose into a single line,
don't try to split them. Instead, split at a well-known position and a
the part of that long straight line as a line.

This gives way more accurate numbers and is more accurate than 1% for
everything but contours with very small weight and
start_point == end_point, where the error is closer to 1.5%.
2023-06-19 18:18:44 +02:00
Benjamin Otte
caf1b0b86c curve: Add a reason to decomposition
When decomposing curves that are too straight, we may emit lines for
long parts of the curve. These lines do not properly map
  t => distance
and it is better to treat them as a regular line than a curve.

This reason argument gives that information.

No users so far, that will happen in followup commits.
2023-06-19 18:18:44 +02:00
Benjamin Otte
5f634ee30f path: Move gsk_path_new_from_cairo() away
This is a regular path creation API, so treat it that way.

On top, it is rather awkward if the only constructor for a path that is
immediately visible to people reading the docs is the one that takes a
Cairo path - when we want to deprecate Cairo.
2023-06-19 18:18:44 +02:00
Matthias Clasen
1054485afb gtk-demo: Rewrite the text mask demo
Use GtkSnapshot and GskPath instead of cairo for this.
2023-06-19 18:18:44 +02:00
Benjamin Otte
4bb65eaf4c gtk-demo: Make path-text demo use gsk_builder_add_layout() 2023-06-19 18:18:44 +02:00
Matthias Clasen
043f5db9de path fill demo: Use gsk_path_builder_add_layout
We have an api now to hide the cairo use.
2023-06-19 18:18:44 +02:00
Matthias Clasen
5c3a5761b4 gsk: Add gsk_path_builder_add_layout
This api makes it easy to turn text into a path that
can be further manipulated. The implementation currently
goes via cairo.
2023-06-19 18:18:44 +02:00
Benjamin Otte
9ef17b9b32 path: Add gsk_path_builder_add_ellipse() 2023-06-19 18:18:44 +02:00
Benjamin Otte
215488527c path: Change semantics of gtk_path_builder_add_segment()
Allow start >= end to mean that the path continues at the beginning
after reaching the end until it reaches the point at @end.
2023-06-19 18:18:44 +02:00
Benjamin Otte
07241f44c2 path: Add gsk_path_measure_is_closed () 2023-06-19 18:18:44 +02:00
Benjamin Otte
e1bee80600 path: Add gsk_path_measure_restrict_to_contour() 2023-06-19 18:18:44 +02:00
Matthias Clasen
c56989410e Add gsk_path_measure_get_{path,tolerance}
These are just nice apis to have and avoid having to carry
these around as extra arguments in many places.

This was showing up as inconvenience in writing tests
for the measure apis.
2023-06-19 18:18:44 +02:00
Benjamin Otte
2f281f19b6 xxx path)_fill 2023-06-19 18:18:44 +02:00
Matthias Clasen
6b4d7d3891 Add gsk_path_get_stroke_bounds
A relatively cheap way to get bounds for the area
that would be affected by stroking a path.
2023-06-19 18:18:44 +02:00
Benjamin Otte
bd554f6c92 testsuite: Add tests for the dasher 2023-06-19 18:18:44 +02:00
Benjamin Otte
31fd7933b7 path: Add a foreach function that dashes a path 2023-06-19 18:18:44 +02:00
Benjamin Otte
91e11c4e8d path: Deal with non-uniformness of progress parameter
The progress is non-uniform, so simple translation of progress doesn't work.
So check if larger and smaller values inch closer towards minimal distance.
2023-06-19 18:18:44 +02:00
Benjamin Otte
e8bad9db7b path: Always decompose conics into at least 2 segments
Conics are evil in that their parameter skews towards the center, and if
it's a very flat conic (weight almost equal to 0), then we'd approximate
it with a single segment and not subdivide, which would cause the
parameter to be wildly off around 0.25 or 0.75.

And that would cause offset calculations to fail.
2023-06-19 18:18:44 +02:00
Matthias Clasen
1186fea22f testsuite Add curve tangent tests 2023-06-19 18:18:44 +02:00
Benjamin Otte
b5f3aebdd4 testsuite: Add a test for the conic that got us segment() 2023-06-19 18:18:44 +02:00
Benjamin Otte
22c3c2e7ed path: Add gsk_curve_segment()
Using split() twice with scaled t values does not work with conics.
2023-06-19 18:18:44 +02:00
Benjamin Otte
fcf3874ddb testsuite: Add a test for gsk_curve_decompose() 2023-06-19 18:18:44 +02:00
Benjamin Otte
bcdece047b testuite: Add tests for gsk_curve_get_tangent() 2023-06-19 18:18:44 +02:00
Matthias Clasen
233a2eb1bc testuite: Add tests for gsk_curve_get_point()
Add a few tests for gsk_curve_get_point().

Since GskCurve is not public api, we add gskcurve.c
as source to the test binary.
2023-06-19 18:18:44 +02:00
Benjamin Otte
28e1e71330 curve: Split eval() into get_point() and get_tangent()
That's more in line with the get_start/end_point/tangent() functions.

Plus, those calls are independent and we usually want one or the other.
2023-06-19 18:18:44 +02:00
Matthias Clasen
a51ad6c640 Add gsk_curve_get_{start,end}_tangent
Add a way to get the tangents at the start and end of the curve.
This will be used in stroking.
2023-06-19 18:18:44 +02:00
Benjamin Otte
2056a8bdd0 testsuite: Add conics to the random paths 2023-06-19 18:18:44 +02:00
Benjamin Otte
726c7af23c path: Add GskCurve
GskCurve is an abstraction for path operations. It's essentially a
collection of vfuncs per GskPathOperation.

GskStandardContour has been ported to use it where appropriate.
2023-06-19 18:18:44 +02:00