From 6defdb4e8a41f163133723951b25d0489da6a778 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 26 Aug 2023 11:27:00 -0400 Subject: [PATCH] Drop unused code we are not using any gsk_spline functions currently. --- gsk/gskcontour.c | 1 - gsk/gskpath.c | 1 - gsk/gskspline.c | 208 ----------------------------------------- gsk/gsksplineprivate.h | 41 -------- gsk/meson.build | 1 - 5 files changed, 252 deletions(-) delete mode 100644 gsk/gskspline.c delete mode 100644 gsk/gsksplineprivate.h diff --git a/gsk/gskcontour.c b/gsk/gskcontour.c index 617c277ad4..a18fdce7b4 100644 --- a/gsk/gskcontour.c +++ b/gsk/gskcontour.c @@ -25,7 +25,6 @@ #include "gskpathbuilder.h" #include "gskpathprivate.h" #include "gskpathpointprivate.h" -#include "gsksplineprivate.h" #include "gskstrokeprivate.h" typedef struct _GskContourClass GskContourClass; diff --git a/gsk/gskpath.c b/gsk/gskpath.c index 78d6e7de23..52601f8b94 100644 --- a/gsk/gskpath.c +++ b/gsk/gskpath.c @@ -24,7 +24,6 @@ #include "gskcurveprivate.h" #include "gskpathbuilder.h" #include "gskpathpointprivate.h" -#include "gsksplineprivate.h" /** * GskPath: diff --git a/gsk/gskspline.c b/gsk/gskspline.c deleted file mode 100644 index 5590c7f7e0..0000000000 --- a/gsk/gskspline.c +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright © 2002 University of Southern California - * 2020 Benjamin Otte - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - * - * Authors: Benjamin Otte - * Carl D. Worth - */ - -#include "config.h" - -#include "gsksplineprivate.h" - -#include - -/* Spline deviation from the circle in radius would be given by: - - error = sqrt (x**2 + y**2) - 1 - - A simpler error function to work with is: - - e = x**2 + y**2 - 1 - - From "Good approximation of circles by curvature-continuous Bezier - curves", Tor Dokken and Morten Daehlen, Computer Aided Geometric - Design 8 (1990) 22-41, we learn: - - abs (max(e)) = 4/27 * sin**6(angle/4) / cos**2(angle/4) - - and - abs (error) =~ 1/2 * e - - Of course, this error value applies only for the particular spline - approximation that is used in _cairo_gstate_arc_segment. -*/ -static float -arc_error_normalized (float angle) -{ - return 2.0/27.0 * pow (sin (angle / 4), 6) / pow (cos (angle / 4), 2); -} - -static float -arc_max_angle_for_tolerance_normalized (float tolerance) -{ - float angle, error; - guint i; - - /* Use table lookup to reduce search time in most cases. */ - struct { - float angle; - float error; - } table[] = { - { G_PI / 1.0, 0.0185185185185185036127 }, - { G_PI / 2.0, 0.000272567143730179811158 }, - { G_PI / 3.0, 2.38647043651461047433e-05 }, - { G_PI / 4.0, 4.2455377443222443279e-06 }, - { G_PI / 5.0, 1.11281001494389081528e-06 }, - { G_PI / 6.0, 3.72662000942734705475e-07 }, - { G_PI / 7.0, 1.47783685574284411325e-07 }, - { G_PI / 8.0, 6.63240432022601149057e-08 }, - { G_PI / 9.0, 3.2715520137536980553e-08 }, - { G_PI / 10.0, 1.73863223499021216974e-08 }, - { G_PI / 11.0, 9.81410988043554039085e-09 }, - }; - - for (i = 0; i < G_N_ELEMENTS (table); i++) - { - if (table[i].error < tolerance) - return table[i].angle; - } - - i++; - do { - angle = G_PI / i++; - error = arc_error_normalized (angle); - } while (error > tolerance); - - return angle; -} - -static guint -arc_segments_needed (float angle, - float radius, - float tolerance) -{ - float max_angle; - - /* the error is amplified by at most the length of the - * major axis of the circle; see cairo-pen.c for a more detailed analysis - * of this. */ - max_angle = arc_max_angle_for_tolerance_normalized (tolerance / radius); - - return ceil (fabs (angle) / max_angle); -} - -/* We want to draw a single spline approximating a circular arc radius - R from angle A to angle B. Since we want a symmetric spline that - matches the endpoints of the arc in position and slope, we know - that the spline control points must be: - - (R * cos(A), R * sin(A)) - (R * cos(A) - h * sin(A), R * sin(A) + h * cos (A)) - (R * cos(B) + h * sin(B), R * sin(B) - h * cos (B)) - (R * cos(B), R * sin(B)) - - for some value of h. - - "Approximation of circular arcs by cubic polynomials", Michael - Goldapp, Computer Aided Geometric Design 8 (1991) 227-238, provides - various values of h along with error analysis for each. - - From that paper, a very practical value of h is: - - h = 4/3 * R * tan(angle/4) - - This value does not give the spline with minimal error, but it does - provide a very good approximation, (6th-order convergence), and the - error expression is quite simple, (see the comment for - _arc_error_normalized). -*/ -static gboolean -gsk_spline_decompose_arc_segment (const graphene_point_t *center, - float radius, - float angle_A, - float angle_B, - GskSplineAddCurveFunc curve_func, - gpointer user_data) -{ - float r_sin_A, r_cos_A; - float r_sin_B, r_cos_B; - float h; - - r_sin_A = radius * sin (angle_A); - r_cos_A = radius * cos (angle_A); - r_sin_B = radius * sin (angle_B); - r_cos_B = radius * cos (angle_B); - - h = 4.0/3.0 * tan ((angle_B - angle_A) / 4.0); - - return curve_func ((graphene_point_t[4]) { - GRAPHENE_POINT_INIT ( - center->x + r_cos_A, - center->y + r_sin_A - ), - GRAPHENE_POINT_INIT ( - center->x + r_cos_A - h * r_sin_A, - center->y + r_sin_A + h * r_cos_A - ), - GRAPHENE_POINT_INIT ( - center->x + r_cos_B + h * r_sin_B, - center->y + r_sin_B - h * r_cos_B - ), - GRAPHENE_POINT_INIT ( - center->x + r_cos_B, - center->y + r_sin_B - ) - }, - user_data); -} - -gboolean -gsk_spline_decompose_arc (const graphene_point_t *center, - float radius, - float tolerance, - float start_angle, - float end_angle, - GskSplineAddCurveFunc curve_func, - gpointer user_data) -{ - float step = start_angle - end_angle; - guint i, n_segments; - - /* Recurse if drawing arc larger than pi */ - if (ABS (step) > G_PI) - { - float mid_angle = (start_angle + end_angle) / 2.0; - - return gsk_spline_decompose_arc (center, radius, tolerance, start_angle, mid_angle, curve_func, user_data) - && gsk_spline_decompose_arc (center, radius, tolerance, mid_angle, end_angle, curve_func, user_data); - } - else if (ABS (step) < tolerance) - { - return gsk_spline_decompose_arc_segment (center, radius, start_angle, end_angle, curve_func, user_data); - } - - n_segments = arc_segments_needed (ABS (step), radius, tolerance); - step = (end_angle - start_angle) / n_segments; - - for (i = 0; i < n_segments - 1; i++, start_angle += step) - { - if (!gsk_spline_decompose_arc_segment (center, radius, start_angle, start_angle + step, curve_func, user_data)) - return FALSE; - } - return gsk_spline_decompose_arc_segment (center, radius, start_angle, end_angle, curve_func, user_data); -} - diff --git a/gsk/gsksplineprivate.h b/gsk/gsksplineprivate.h deleted file mode 100644 index c9da32734c..0000000000 --- a/gsk/gsksplineprivate.h +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright © 2020 Benjamin Otte - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library. If not, see . - * - * Authors: Benjamin Otte - */ - - -#ifndef __GSK_SPLINE_PRIVATE_H__ -#define __GSK_SPLINE_PRIVATE_H__ - -#include "gskpath.h" - -G_BEGIN_DECLS - -typedef gboolean (* GskSplineAddCurveFunc) (const graphene_point_t curve[4], - gpointer user_data); -gboolean gsk_spline_decompose_arc (const graphene_point_t *center, - float radius, - float tolerance, - float start_angle, - float end_angle, - GskSplineAddCurveFunc curve_func, - gpointer user_data); - -G_END_DECLS - -#endif /* __GSK_SPLINE_PRIVATE_H__ */ - diff --git a/gsk/meson.build b/gsk/meson.build index 5cb2e14e56..8cb796fd2b 100644 --- a/gsk/meson.build +++ b/gsk/meson.build @@ -47,7 +47,6 @@ gsk_private_sources = files([ 'gskdebug.c', 'gskprivate.c', 'gskprofiler.c', - 'gskspline.c', 'gl/gskglattachmentstate.c', 'gl/gskglbuffer.c', 'gl/gskglcommandqueue.c',