mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-10 02:40:11 +00:00
Merge branch 'measure-speedups' into 'main'
contour: Stop doing the roundtrip test See merge request GNOME/gtk!6342
This commit is contained in:
commit
99ad585252
218
gsk/gskcontour.c
218
gsk/gskcontour.c
@ -646,12 +646,28 @@ gsk_standard_contour_add_segment (const GskContour *contour,
|
||||
typedef struct
|
||||
{
|
||||
gsize idx;
|
||||
float length0;
|
||||
float length1;
|
||||
gsize n_samples;
|
||||
gsize first;
|
||||
} CurveMeasure;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
float t;
|
||||
float length;
|
||||
} CurvePoint;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GArray *curves;
|
||||
GArray *points;
|
||||
float tolerance;
|
||||
} GskStandardContourMeasure;
|
||||
|
||||
static void
|
||||
add_measure (const GskCurve *curve,
|
||||
gsize idx,
|
||||
float length,
|
||||
float tolerance,
|
||||
float t1,
|
||||
@ -661,9 +677,7 @@ add_measure (const GskCurve *curve,
|
||||
GskCurve c;
|
||||
float ll, l0;
|
||||
float t0;
|
||||
float tt, ll0;
|
||||
CurvePoint *p = &g_array_index (array, CurvePoint, array->len - 1);
|
||||
gsize idx = p->idx;
|
||||
CurvePoint *p;
|
||||
|
||||
/* Check if we can add (t1, length + l1) without further
|
||||
* splitting. We check two things:
|
||||
@ -675,6 +689,8 @@ add_measure (const GskCurve *curve,
|
||||
curve->op == GSK_PATH_CLOSE)
|
||||
goto done;
|
||||
|
||||
p = &g_array_index (array, CurvePoint, array->len - 1);
|
||||
|
||||
t0 = (p->t + t1) / 2;
|
||||
if (t0 == p->t || t0 == t1)
|
||||
goto done;
|
||||
@ -683,20 +699,15 @@ add_measure (const GskCurve *curve,
|
||||
l0 = gsk_curve_get_length (&c);
|
||||
ll = (p->length + length + l1) / 2;
|
||||
|
||||
tt = gsk_curve_at_length (curve, l0, 0.001);
|
||||
gsk_curve_split (curve, tt, &c, NULL);
|
||||
ll0 = gsk_curve_get_length (&c);
|
||||
|
||||
if (fabsf (length + l0 - ll) < tolerance &&
|
||||
fabsf (ll0 - l0) < tolerance)
|
||||
if (fabsf (length + l0 - ll) < tolerance)
|
||||
{
|
||||
done:
|
||||
g_array_append_val (array, ((CurvePoint){ idx, t1, length + l1 }));
|
||||
g_array_append_val (array, ((CurvePoint) { t1, length + l1 }));
|
||||
}
|
||||
else
|
||||
{
|
||||
add_measure (curve, length, tolerance, t0, l0, array);
|
||||
add_measure (curve, length, tolerance, t1, l1, array);
|
||||
add_measure (curve, idx, length, tolerance, t0, l0, array);
|
||||
add_measure (curve, idx, length, tolerance, t1, l1, array);
|
||||
}
|
||||
}
|
||||
|
||||
@ -708,16 +719,70 @@ cmpfloat (const void *p1, const void *p2)
|
||||
return *f1 < *f2 ? -1 : (*f1 > *f2 ? 1 : 0);
|
||||
}
|
||||
|
||||
static void
|
||||
add_samples (const GskStandardContour *self,
|
||||
GskStandardContourMeasure *measure,
|
||||
CurveMeasure *curve_measure)
|
||||
{
|
||||
gsize first;
|
||||
GskCurve curve;
|
||||
float l0, l1;
|
||||
float t[3];
|
||||
int n;
|
||||
|
||||
g_assert (curve_measure->n_samples == 0);
|
||||
g_assert (0 < curve_measure->idx && curve_measure->idx < self->n_ops);
|
||||
|
||||
first = measure->points->len;
|
||||
|
||||
l0 = curve_measure->length0;
|
||||
l1 = curve_measure->length1;
|
||||
|
||||
g_array_append_val (measure->points, ((CurvePoint) { 0, l0 } ));
|
||||
|
||||
gsk_curve_init (&curve, self->ops[curve_measure->idx]);
|
||||
|
||||
n = gsk_curve_get_curvature_points (&curve, t);
|
||||
qsort (t, n, sizeof (float), cmpfloat);
|
||||
|
||||
for (int j = 0; j < n; j++)
|
||||
{
|
||||
float l = gsk_curve_get_length_to (&curve, t[j]);
|
||||
add_measure (&curve, curve_measure->idx, l0, measure->tolerance, t[j], l, measure->points);
|
||||
}
|
||||
|
||||
add_measure (&curve, curve_measure->idx, l0, measure->tolerance, 1, l1 - l0, measure->points);
|
||||
|
||||
curve_measure->first = first;
|
||||
curve_measure->n_samples = measure->points->len - first;
|
||||
}
|
||||
|
||||
static void
|
||||
ensure_samples (const GskStandardContour *self,
|
||||
GskStandardContourMeasure *measure,
|
||||
CurveMeasure *curve_measure)
|
||||
{
|
||||
if (curve_measure->n_samples == 0)
|
||||
add_samples (self, measure, curve_measure);
|
||||
}
|
||||
|
||||
static gpointer
|
||||
gsk_standard_contour_init_measure (const GskContour *contour,
|
||||
float tolerance,
|
||||
float *out_length)
|
||||
{
|
||||
const GskStandardContour *self = (const GskStandardContour *) contour;
|
||||
GArray *array;
|
||||
GskStandardContourMeasure *measure;
|
||||
float length;
|
||||
|
||||
array = g_array_new (FALSE, FALSE, sizeof (CurvePoint));
|
||||
measure = g_new (GskStandardContourMeasure, 1);
|
||||
|
||||
measure->curves = g_array_new (FALSE, FALSE, sizeof (CurveMeasure));
|
||||
measure->points = g_array_new (FALSE, FALSE, sizeof (CurvePoint));
|
||||
measure->tolerance = tolerance;
|
||||
|
||||
/* Add a placeholder for the move, so indexes match up */
|
||||
g_array_append_val (measure->curves, ((CurveMeasure) { 0, -1, -1, 0, 0 } ));
|
||||
|
||||
length = 0;
|
||||
|
||||
@ -725,50 +790,44 @@ gsk_standard_contour_init_measure (const GskContour *contour,
|
||||
{
|
||||
GskCurve curve;
|
||||
float l;
|
||||
float t[3];
|
||||
int n;
|
||||
|
||||
gsk_curve_init (&curve, self->ops[i]);
|
||||
|
||||
g_array_append_val (array, ((CurvePoint) { i, 0, length }));
|
||||
|
||||
n = gsk_curve_get_curvature_points (&curve, t);
|
||||
qsort (t, n, sizeof (float), cmpfloat);
|
||||
|
||||
for (int j = 0; j < n; j++)
|
||||
{
|
||||
l = gsk_curve_get_length_to (&curve, t[j]);
|
||||
add_measure (&curve, length, tolerance, t[j], l, array);
|
||||
}
|
||||
|
||||
l = gsk_curve_get_length (&curve);
|
||||
add_measure (&curve, length, tolerance, 1, l, array);
|
||||
|
||||
g_array_append_val (measure->curves, ((CurveMeasure) { i, length, length + l, 0, 0 } ));
|
||||
|
||||
length += l;
|
||||
}
|
||||
|
||||
*out_length = length;
|
||||
|
||||
#if 0
|
||||
g_print ("%lu ops, %u measure points\n", self->n_ops, array->len);
|
||||
for (gsize i = 0; i < array->len; i++)
|
||||
{
|
||||
CurvePoint *pp = &g_array_index (array, CurvePoint, i);
|
||||
const char *opname[] = { "M", "Z", "L", "Q", "C" };
|
||||
GskPathOperation op = gsk_pathop_op (self->ops[pp->idx]);
|
||||
|
||||
g_print ("%lu %s %g -> %g\n", pp->idx, opname[op], pp->t, pp->length);
|
||||
}
|
||||
#endif
|
||||
|
||||
return array;
|
||||
return measure;
|
||||
}
|
||||
|
||||
static void
|
||||
gsk_standard_contour_free_measure (const GskContour *contour,
|
||||
gpointer data)
|
||||
{
|
||||
g_array_free (data, TRUE);
|
||||
GskStandardContourMeasure *measure = data;
|
||||
|
||||
g_array_free (measure->curves, TRUE);
|
||||
g_array_free (measure->points, TRUE);
|
||||
g_free (measure);
|
||||
}
|
||||
|
||||
static int
|
||||
find_curve (gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
const CurveMeasure *m = a;
|
||||
const float distance = *(const float *) b;
|
||||
|
||||
if (distance < m->length0)
|
||||
return 1;
|
||||
else if (distance > m->length1)
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -778,7 +837,10 @@ gsk_standard_contour_get_point (const GskContour *contour,
|
||||
GskRealPathPoint *result)
|
||||
{
|
||||
const GskStandardContour *self = (const GskStandardContour *) contour;
|
||||
GArray *array = measure_data;
|
||||
GskStandardContourMeasure *measure = measure_data;
|
||||
CurveMeasure *curve_measure;
|
||||
gboolean found G_GNUC_UNUSED;
|
||||
guint idx;
|
||||
gsize i0, i1;
|
||||
CurvePoint *p0, *p1;
|
||||
|
||||
@ -789,12 +851,18 @@ gsk_standard_contour_get_point (const GskContour *contour,
|
||||
return;
|
||||
}
|
||||
|
||||
i0 = 0;
|
||||
i1 = array->len - 1;
|
||||
found = g_array_binary_search (measure->curves, &distance, find_curve, &idx);
|
||||
g_assert (found);
|
||||
|
||||
curve_measure = &g_array_index (measure->curves, CurveMeasure, idx);
|
||||
ensure_samples (self, measure, curve_measure);
|
||||
|
||||
i0 = curve_measure->first;
|
||||
i1 = curve_measure->first + curve_measure->n_samples - 1;
|
||||
while (i0 + 1 < i1)
|
||||
{
|
||||
gsize i = (i0 + i1) / 2;
|
||||
CurvePoint *p = &g_array_index (array, CurvePoint, i);
|
||||
CurvePoint *p = &g_array_index (measure->points, CurvePoint, i);
|
||||
|
||||
if (p->length < distance)
|
||||
i0 = i;
|
||||
@ -802,41 +870,37 @@ gsk_standard_contour_get_point (const GskContour *contour,
|
||||
i1 = i;
|
||||
else
|
||||
{
|
||||
result->idx = p->idx;
|
||||
result->idx = curve_measure->idx;
|
||||
result->t = p->t;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
p0 = &g_array_index (array, CurvePoint, i0);
|
||||
p1 = &g_array_index (array, CurvePoint, i1);
|
||||
p0 = &g_array_index (measure->points, CurvePoint, i0);
|
||||
p1 = &g_array_index (measure->points, CurvePoint, i1);
|
||||
|
||||
if (distance >= p1->length)
|
||||
{
|
||||
if (p1->idx == self->n_ops - 1)
|
||||
if (curve_measure->idx == self->n_ops - 1)
|
||||
{
|
||||
result->idx = p1->idx;
|
||||
result->idx = curve_measure->idx;
|
||||
result->t = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
result->idx = p1->idx + 1;
|
||||
result->idx = curve_measure->idx + 1;
|
||||
result->t = 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
float fraction, t0;
|
||||
float fraction;
|
||||
|
||||
g_assert (p0->idx == p1->idx || p0->t == 1);
|
||||
|
||||
t0 = p0->idx == p1->idx ? p0->t : 0;
|
||||
|
||||
result->idx = p1->idx;
|
||||
result->idx = curve_measure->idx;
|
||||
|
||||
fraction = (distance - p0->length) / (p1->length - p0->length);
|
||||
g_assert (fraction >= 0.f && fraction <= 1.f);
|
||||
result->t = t0 * (1 - fraction) + p1->t * fraction;
|
||||
result->t = p0->t * (1 - fraction) + p1->t * fraction;
|
||||
g_assert (result->t >= 0.f && result->t <= 1.f);
|
||||
}
|
||||
}
|
||||
@ -846,26 +910,27 @@ gsk_standard_contour_get_distance (const GskContour *contour,
|
||||
GskRealPathPoint *point,
|
||||
gpointer measure_data)
|
||||
{
|
||||
GArray *array = measure_data;
|
||||
const GskStandardContour *self = (const GskStandardContour *) contour;
|
||||
GskStandardContourMeasure *measure = measure_data;
|
||||
CurveMeasure *curve_measure;
|
||||
gsize i0, i1;
|
||||
CurvePoint *p0, *p1;
|
||||
float fraction, t0;
|
||||
float fraction;
|
||||
|
||||
if (G_UNLIKELY (point->idx == 0))
|
||||
return 0;
|
||||
|
||||
i0 = 0;
|
||||
i1 = array->len - 1;
|
||||
curve_measure = &g_array_index (measure->curves, CurveMeasure, point->idx);
|
||||
ensure_samples (self, measure, curve_measure);
|
||||
|
||||
i0 = curve_measure->first;
|
||||
i1 = curve_measure->first + curve_measure->n_samples - 1;
|
||||
while (i0 + 1 < i1)
|
||||
{
|
||||
gsize i = (i0 + i1) / 2;
|
||||
CurvePoint *p = &g_array_index (array, CurvePoint, i);
|
||||
CurvePoint *p = &g_array_index (measure->points, CurvePoint, i);
|
||||
|
||||
if (p->idx > point->idx)
|
||||
i1 = i;
|
||||
else if (p->idx < point->idx)
|
||||
i0 = i;
|
||||
else if (p->t > point->t)
|
||||
if (p->t > point->t)
|
||||
i1 = i;
|
||||
else if (p->t < point->t)
|
||||
i0 = i;
|
||||
@ -873,17 +938,12 @@ gsk_standard_contour_get_distance (const GskContour *contour,
|
||||
return p->length;
|
||||
}
|
||||
|
||||
p0 = &g_array_index (array, CurvePoint, i0);
|
||||
p1 = &g_array_index (array, CurvePoint, i1);
|
||||
p0 = &g_array_index (measure->points, CurvePoint, i0);
|
||||
p1 = &g_array_index (measure->points, CurvePoint, i1);
|
||||
|
||||
g_assert (p0->idx == p1->idx || p0->t == 1);
|
||||
g_assert (p0->t <= point->t && point->t <= p1->t);
|
||||
|
||||
t0 = p0->idx == p1->idx ? p0->t : 0;
|
||||
|
||||
g_assert (p1->idx == point->idx);
|
||||
g_assert (t0 <= point->t && point->t <= p1->t);
|
||||
|
||||
fraction = (point->t - t0) / (p1->t - t0);
|
||||
fraction = (point->t - p0->t) / (p1->t - p0->t);
|
||||
g_assert (fraction >= 0.f && fraction <= 1.f);
|
||||
|
||||
return p0->length * (1 - fraction) + p1->length * fraction;
|
||||
|
@ -2,7 +2,7 @@
|
||||
* see https://pomax.github.io/bezierinfo/legendre-gauss.html
|
||||
*/
|
||||
|
||||
#if 0
|
||||
#if defined(USE_64_SAMPLES)
|
||||
/* n = 64 */
|
||||
static const double T[] = {
|
||||
-0.0243502926634244325089558428537156614268871093149758091634531663960566965166295288529853061657116894882370493013671717560479926679408068852617342586968190919443025679363843727751902756254975073084367002129407854253246662805532069172532219089321005870178809284335033318073251039701073379759,
|
||||
@ -137,7 +137,8 @@ static const double C[] = {
|
||||
0.0017832807216964329472960791449719331799593472719279556695308063655858546954239803486698215802150348282744786016134857283616955449868451969230490863774274598030023211055562492709717566919237924255297982774711177411074145151155610163293142044147991553384925940046957893721166251082473659733,
|
||||
0.0017832807216964329472960791449719331799593472719279556695308063655858546954239803486698215802150348282744786016134857283616955449868451969230490863774274598030023211055562492709717566919237924255297982774711177411074145151155610163293142044147991553384925940046957893721166251082473659733
|
||||
};
|
||||
#else
|
||||
|
||||
#elif defined(USE_32_SAMPLES)
|
||||
/* n = 32 */
|
||||
|
||||
static double T[] = {
|
||||
@ -210,4 +211,62 @@ static double C[] = {
|
||||
0.0070186100094700966004070637388531825133772207289396032320082356192151241454178686953297376907573215077936155545790593837513204206518026084505878987243348925784479817181234617862457418214505322067610482902501455504204433524520665822704844582452877416001060465891907497519632353148380799619
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
/* n = 24 */
|
||||
|
||||
static double T[] = {
|
||||
-0.0640568928626056260850430826247450385909991954207473934243510817897392835939101078028928761342525090823242273835115756994869112500371756765277735374378372436515481804668409746233647956019276711845937319580510697455314397618513360822351096139837050674073737720614748330506959387258141490546,
|
||||
0.0640568928626056260850430826247450385909991954207473934243510817897392835939101078028928761342525090823242273835115756994869112500371756765277735374378372436515481804668409746233647956019276711845937319580510697455314397618513360822351096139837050674073737720614748330506959387258141490546,
|
||||
-0.1911188674736163091586398207570696318404051033147533561489185765880859526918717419824911112452097307135934146013595461392721542943443689459384015952736491888634107638852139839821480663334386199430823059446316182589874503457282270169922471283825305735240671464262733609193984099421023790425,
|
||||
0.1911188674736163091586398207570696318404051033147533561489185765880859526918717419824911112452097307135934146013595461392721542943443689459384015952736491888634107638852139839821480663334386199430823059446316182589874503457282270169922471283825305735240671464262733609193984099421023790425,
|
||||
-0.3150426796961633743867932913198102407864782608248172687542301295298821563412434083438735095552082106072251617364030643536658931791308690387340350108862316429911426633492164449851684039691011610681827256891467485494251442677599304969349712405008328365242087382043028815467866505618650936915,
|
||||
0.3150426796961633743867932913198102407864782608248172687542301295298821563412434083438735095552082106072251617364030643536658931791308690387340350108862316429911426633492164449851684039691011610681827256891467485494251442677599304969349712405008328365242087382043028815467866505618650936915,
|
||||
-0.4337935076260451384870842319133497124524215109279688080808012846567644070336309140577354304660756168836170633415002629755076381975174699198632370585889341378575229685577710965327823199539830928400741454067377627746745635503614810834602257701251585352190552527778684113280867150779959852524,
|
||||
0.4337935076260451384870842319133497124524215109279688080808012846567644070336309140577354304660756168836170633415002629755076381975174699198632370585889341378575229685577710965327823199539830928400741454067377627746745635503614810834602257701251585352190552527778684113280867150779959852524,
|
||||
-0.5454214713888395356583756172183723700107839925876181754336143898305648391795708970958348674408062501977746653313676778948810297400650828985504068941547021866808914316854182653519436295728612315264181208390018064915325250677148594855874434492614547180849377989457776201862945948751249939033,
|
||||
0.5454214713888395356583756172183723700107839925876181754336143898305648391795708970958348674408062501977746653313676778948810297400650828985504068941547021866808914316854182653519436295728612315264181208390018064915325250677148594855874434492614547180849377989457776201862945948751249939033,
|
||||
-0.6480936519369755692524957869107476266696582986189567802989336650244483175685397719281177703657272433990519954414744003453347794058626075519074876962003580684127104697893556584036149935275154534232685850207671594298434446955488396349075497667624732345971957611938685137884801129695447597312,
|
||||
0.6480936519369755692524957869107476266696582986189567802989336650244483175685397719281177703657272433990519954414744003453347794058626075519074876962003580684127104697893556584036149935275154534232685850207671594298434446955488396349075497667624732345971957611938685137884801129695447597312,
|
||||
-0.7401241915785543642438281030999784255232924870141854568663823682719003386409229324413313561311287943298526270745398288213617461973439599491355223046073660810109486527571776420522757185953076208759863287235084614803697918067466580746275122563457575959399650481778575563118955957829855078072,
|
||||
0.7401241915785543642438281030999784255232924870141854568663823682719003386409229324413313561311287943298526270745398288213617461973439599491355223046073660810109486527571776420522757185953076208759863287235084614803697918067466580746275122563457575959399650481778575563118955957829855078072,
|
||||
-0.8200019859739029219539498726697452080761264776678555872439810260013829789535545400822605211725837960666424765858309152369975956748693910897310401393217997751433463343851603146734984964062776585418194561809063555489816762580329418137298754264378316716417347949040725111554705589243953692169,
|
||||
0.8200019859739029219539498726697452080761264776678555872439810260013829789535545400822605211725837960666424765858309152369975956748693910897310401393217997751433463343851603146734984964062776585418194561809063555489816762580329418137298754264378316716417347949040725111554705589243953692169,
|
||||
-0.8864155270044010342131543419821967550873330433089200403710379167756748343989591721041235019961817012535295108910075024175885664874383567124270976139069615059721185542370372118538064873468961679956606315961988138722471292807573552657465373246065266349095264290446955886450980216411579068464,
|
||||
0.8864155270044010342131543419821967550873330433089200403710379167756748343989591721041235019961817012535295108910075024175885664874383567124270976139069615059721185542370372118538064873468961679956606315961988138722471292807573552657465373246065266349095264290446955886450980216411579068464,
|
||||
-0.9382745520027327585236490017087214496548196580774513466350271759095894960525356709599646415358699555094267057623515929895997449470704383076095012442349544937551633313675972481722466159802428487600880633341786121580661077521685134893546419567859808853944866142065617471979973235700469563606,
|
||||
0.9382745520027327585236490017087214496548196580774513466350271759095894960525356709599646415358699555094267057623515929895997449470704383076095012442349544937551633313675972481722466159802428487600880633341786121580661077521685134893546419567859808853944866142065617471979973235700469563606,
|
||||
-0.9747285559713094981983919930081690617411830530401787198115935651071811212809802245386374742817154549827412585755713491144798180281062083910290010368962899139003272102551955405455775700818480561392470581718221938768668731616756379649281934548623489251537698395239432800432811839537332490367,
|
||||
0.9747285559713094981983919930081690617411830530401787198115935651071811212809802245386374742817154549827412585755713491144798180281062083910290010368962899139003272102551955405455775700818480561392470581718221938768668731616756379649281934548623489251537698395239432800432811839537332490367,
|
||||
-0.9951872199970213601799974097007368118745976925960028774416005451142838320694577378833972893371157088623453462978965853994497237745715598401409351804188189455255566266162142239452364851560816782389596967291836243391359167365098731808888455424405665558369621091780571617968925046375452278564,
|
||||
0.9951872199970213601799974097007368118745976925960028774416005451142838320694577378833972893371157088623453462978965853994497237745715598401409351804188189455255566266162142239452364851560816782389596967291836243391359167365098731808888455424405665558369621091780571617968925046375452278564,
|
||||
};
|
||||
|
||||
static double C[] = {
|
||||
0.1279381953467521569740561652246953718517112395416678824212995763723475915405364024120919775667347423307078678605027534354336365506630173201256407760369958705384835762891562911475479559477218918074170718365754182501974550951925484331523758090745471505157505768499921691572488912345533434646,
|
||||
0.1279381953467521569740561652246953718517112395416678824212995763723475915405364024120919775667347423307078678605027534354336365506630173201256407760369958705384835762891562911475479559477218918074170718365754182501974550951925484331523758090745471505157505768499921691572488912345533434646,
|
||||
0.1258374563468282961213753825111836887264033255813454041780915168813938726666625968820381792564211407244125340112283619371640023694354842556219623307075721695505167028832011944572440814161265754364153991752782846305315778293182951298508346824950922490384565834525141570991957343073460241123,
|
||||
0.1258374563468282961213753825111836887264033255813454041780915168813938726666625968820381792564211407244125340112283619371640023694354842556219623307075721695505167028832011944572440814161265754364153991752782846305315778293182951298508346824950922490384565834525141570991957343073460241123,
|
||||
0.1216704729278033912044631534762624256070295592038057787774717545126253937177169619177578034307728419129571458407698685455109927385962626203664197972099671299080663146992247474377374928428629909818345130957392521139337403891946990001210368274459006298591636884893163373907763429334385715701,
|
||||
0.1216704729278033912044631534762624256070295592038057787774717545126253937177169619177578034307728419129571458407698685455109927385962626203664197972099671299080663146992247474377374928428629909818345130957392521139337403891946990001210368274459006298591636884893163373907763429334385715701,
|
||||
0.1155056680537256013533444839067835598622703113764964705844493600886702535513185499403442576468127956599599096047023274406552399890629831050388267870570157536484442644788074009392626299528272339158271789101012709245867329169327356527615681351864802567093740938014246237226139721687821239517,
|
||||
0.1155056680537256013533444839067835598622703113764964705844493600886702535513185499403442576468127956599599096047023274406552399890629831050388267870570157536484442644788074009392626299528272339158271789101012709245867329169327356527615681351864802567093740938014246237226139721687821239517,
|
||||
0.107444270115965634782577342446606222794628690134220021766541640886821866394437105980586727120915236672945076498454815476823439901643102885282830543962266851556251956709331696682107380679861280071851870323872823740641856241992841364843152888380035317713347953732555881218806283399463124951,
|
||||
0.107444270115965634782577342446606222794628690134220021766541640886821866394437105980586727120915236672945076498454815476823439901643102885282830543962266851556251956709331696682107380679861280071851870323872823740641856241992841364843152888380035317713347953732555881218806283399463124951,
|
||||
0.097618652104113888269880664464247154427918968853685944083310610022954338577591978348020039690718187482414745713364268645676642419728572107043424944384211806071042042791689191672508012725933985685876262715739521302925263010913644942223616059647289160432915821120275634713911721781926285332,
|
||||
0.097618652104113888269880664464247154427918968853685944083310610022954338577591978348020039690718187482414745713364268645676642419728572107043424944384211806071042042791689191672508012725933985685876262715739521302925263010913644942223616059647289160432915821120275634713911721781926285332,
|
||||
0.0861901615319532759171852029837426671850805882379330055884071438612868844607805312688886562972816971732787465671984327992158782827038381983594380916492525003385563462630861694048857276454548529177279961693054540872738963763950131372564031674654030737773100525128451496727198421916322556908,
|
||||
0.0861901615319532759171852029837426671850805882379330055884071438612868844607805312688886562972816971732787465671984327992158782827038381983594380916492525003385563462630861694048857276454548529177279961693054540872738963763950131372564031674654030737773100525128451496727198421916322556908,
|
||||
0.0733464814110803057340336152531165181193365098484994714027024906600413884758709348323251422694445551958844309079341158927693012247996928526423877450601776912550600854944985229487704917122675007345403564777169078420148392438502785281584325129303566997853186794893103931008654660416023204965,
|
||||
0.0733464814110803057340336152531165181193365098484994714027024906600413884758709348323251422694445551958844309079341158927693012247996928526423877450601776912550600854944985229487704917122675007345403564777169078420148392438502785281584325129303566997853186794893103931008654660416023204965,
|
||||
0.0592985849154367807463677585001085845412001265652134910373765512940983031775082415660683556106090092998654733952492642466909653073834070291103432919838456250955380753837859345492817299145644958959367291816621761687898337760987530926613795554356869343124524696513178977787335055019515914172,
|
||||
0.0592985849154367807463677585001085845412001265652134910373765512940983031775082415660683556106090092998654733952492642466909653073834070291103432919838456250955380753837859345492817299145644958959367291816621761687898337760987530926613795554356869343124524696513178977787335055019515914172,
|
||||
0.0442774388174198061686027482113382288593128418338578967413972297210243762822664396343947170155594934934611803046066530352490769669525012630503089839091175520932522330681764807671830570648211944799908348398720715944900305481342571090714940628894962186599515560606956040614089479788668773348,
|
||||
0.0442774388174198061686027482113382288593128418338578967413972297210243762822664396343947170155594934934611803046066530352490769669525012630503089839091175520932522330681764807671830570648211944799908348398720715944900305481342571090714940628894962186599515560606956040614089479788668773348,
|
||||
0.0285313886289336631813078159518782864491977979319081166016648047576440056374291434256854254228098755422737224452711633426188506404779428430343631052424983978091405445557790206527391293478807818130301641760878492678184457761229065303399826533483010921962299302202888714000294545957159715602,
|
||||
0.0285313886289336631813078159518782864491977979319081166016648047576440056374291434256854254228098755422737224452711633426188506404779428430343631052424983978091405445557790206527391293478807818130301641760878492678184457761229065303399826533483010921962299302202888714000294545957159715602,
|
||||
0.0123412297999871995468056670700372915759100408913665168172873209410917255178811137917987186719204245118391668507179752021919736085531955203240536027970786521356478573832633493407323107496772162595516230980489700767963287958540270795597236457014112169997285946194632806836898378754527134097,
|
||||
0.0123412297999871995468056670700372915759100408913665168172873209410917255178811137917987186719204245118391668507179752021919736085531955203240536027970786521356478573832633493407323107496772162595516230980489700767963287958540270795597236457014112169997285946194632806836898378754527134097,
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -852,7 +852,7 @@ static const GskCurveClass GSK_QUAD_CURVE_CLASS = {
|
||||
gsk_quad_curve_get_length_to,
|
||||
};
|
||||
|
||||
/* }}} */
|
||||
/* }}} */
|
||||
/* {{{ Cubic */
|
||||
|
||||
static void
|
||||
|
@ -188,6 +188,12 @@ test_curve_length (void)
|
||||
GskCurve c, c1, c2;
|
||||
float l, l1, l2, l1a;
|
||||
|
||||
/* This curve is a bad case for our sampling, since it has
|
||||
* a very sharp turn. gskcontour.c handles these better, by
|
||||
* splitting at the curvature extrema.
|
||||
*
|
||||
* Here, we just bump our epsilon up high enough.
|
||||
*/
|
||||
parse_curve (&c, "M 1462.632080 -1593.118896 C 751.533630 -74.179169 -914.280090 956.537720 -83.091866 207.213776");
|
||||
|
||||
gsk_curve_split (&c, 0.5, &c1, &c2);
|
||||
@ -198,7 +204,7 @@ test_curve_length (void)
|
||||
l2 = gsk_curve_get_length (&c2);
|
||||
|
||||
g_assert_cmpfloat_with_epsilon (l1, l1a, 0.1);
|
||||
g_assert_cmpfloat_with_epsilon (l, l1 + l2, 0.5);
|
||||
g_assert_cmpfloat_with_epsilon (l, l1 + l2, 0.62);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -801,7 +801,7 @@ test_split (void)
|
||||
|
||||
length = gsk_path_measure_get_length (measure);
|
||||
/* chosen high enough to stop the testsuite from failing */
|
||||
epsilon = MAX (length / 1000, 1.f / 1024);
|
||||
epsilon = MAX (length / 250, 1.f / 1024);
|
||||
|
||||
split = g_test_rand_double_range (0, length);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user