[RFC PATCH 1/5] d2d1: Store cubic bezier control points.

Henri Verbeet hverbeet at gmail.com
Tue Mar 17 12:34:10 CDT 2020


On Sun, 15 Mar 2020 at 23:13, Connor McAdams <conmanx360 at gmail.com> wrote:
> +/* Flag bit for bezier vertices. */
> +#define D2D_VERTEX_TYPE_SPLIT_BEZIER 0x40
> +#define D2D_VERTEX_TYPE_BEZIER 0x80
>  enum d2d_vertex_type
>  {
> -    D2D_VERTEX_TYPE_NONE,
> -    D2D_VERTEX_TYPE_LINE,
> -    D2D_VERTEX_TYPE_BEZIER,
> -    D2D_VERTEX_TYPE_SPLIT_BEZIER,
> +    D2D_VERTEX_TYPE_NONE = 0,
> +    D2D_VERTEX_TYPE_LINE = 1,
> +    D2D_VERTEX_TYPE_QUADRATIC_BEZIER = 2 | D2D_VERTEX_TYPE_BEZIER,
> +    D2D_VERTEX_TYPE_CUBIC_BEZIER = 3 | D2D_VERTEX_TYPE_BEZIER,
> +    D2D_VERTEX_TYPE_SPLIT_QUAD_BEZIER = 4 | D2D_VERTEX_TYPE_SPLIT_BEZIER,
> +    D2D_VERTEX_TYPE_SPLIT_CUBIC_BEZIER = 5 | D2D_VERTEX_TYPE_SPLIT_BEZIER,
>  };
That's a bit ugly. If you really need to store extra information, you
could replace the "vertex_types" array with something like the
following:

    struct d2d_segment
    {
        uint16_t type;
        uint16_t flags;
    } *segments;

Or some variant. For what you're doing here though, it seems much
easier to do something like the following:

    static BOOL d2d_vertex_type_is_bezier(enum d2d_vertex_type t)
    {
        return t == D2D_VERTEX_TYPE_QUADRATIC_BEZIER || t ==
D2D_VERTEX_TYPE_CUBIC_BEZIER;
    }

> @@ -57,6 +62,7 @@ struct d2d_segment_idx
>      size_t figure_idx;
>      size_t vertex_idx;
>      size_t control_idx;
> +    size_t bezier_idx;
>  };
>
>  struct d2d_figure
> @@ -70,6 +76,7 @@ struct d2d_figure
>      D2D1_POINT_2F *bezier_controls;
>      size_t bezier_controls_size;
>      size_t bezier_control_count;
> +    size_t bezier_control_points;
>
Are those really needed?

> -static BOOL d2d_figure_insert_bezier_control(struct d2d_figure *figure, size_t idx, const D2D1_POINT_2F *p)
> +static BOOL d2d_figure_insert_quadratic_bezier_control(struct d2d_figure *figure, size_t idx, const D2D1_POINT_2F *p)
>  {
>      if (!d2d_array_reserve((void **)&figure->bezier_controls, &figure->bezier_controls_size,
> -            figure->bezier_control_count + 1, sizeof(*figure->bezier_controls)))
> +            figure->bezier_control_points + 1, sizeof(*figure->bezier_controls)))
>      {
>          ERR("Failed to grow bezier controls array.\n");
>          return FALSE;
>      }
>
>      memmove(&figure->bezier_controls[idx + 1], &figure->bezier_controls[idx],
> -            (figure->bezier_control_count - idx) * sizeof(*figure->bezier_controls));
> +            (figure->bezier_control_points - idx) * sizeof(*figure->bezier_controls));
>      figure->bezier_controls[idx] = *p;
> +    ++figure->bezier_control_points;
>      ++figure->bezier_control_count;
>
>      return TRUE;
>  }
>
> -static BOOL d2d_figure_add_bezier_control(struct d2d_figure *figure, const D2D1_POINT_2F *p)
> +static BOOL d2d_figure_add_quadratic_bezier_control(struct d2d_figure *figure, const D2D1_POINT_2F *p)
>  {
>      if (!d2d_array_reserve((void **)&figure->bezier_controls, &figure->bezier_controls_size,
> -            figure->bezier_control_count + 1, sizeof(*figure->bezier_controls)))
> +            figure->bezier_control_points + 1, sizeof(*figure->bezier_controls)))
>      {
>          ERR("Failed to grow bezier controls array.\n");
>          return FALSE;
>      }
>
> -    figure->bezier_controls[figure->bezier_control_count++] = *p;
> +    figure->bezier_controls[figure->bezier_control_points++] = *p;
> +    ++figure->bezier_control_count;
>
>      return TRUE;
>  }
These don't seem all that specific to quadratics.



More information about the wine-devel mailing list