gdiplus: Move some Beziers helpers to gdiplus.c to use them for graphicspath.
This commit is contained in:
parent
2583975ec7
commit
2fb0c7e639
|
@ -285,3 +285,29 @@ REAL convert_unit(HDC hdc, GpUnit unit)
|
||||||
return 1.0;
|
return 1.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Calculates Bezier points from cardinal spline points. */
|
||||||
|
void calc_curve_bezier(CONST GpPointF *pts, REAL tension, REAL *x1,
|
||||||
|
REAL *y1, REAL *x2, REAL *y2)
|
||||||
|
{
|
||||||
|
REAL xdiff, ydiff;
|
||||||
|
|
||||||
|
/* calculate tangent */
|
||||||
|
xdiff = pts[2].X - pts[0].X;
|
||||||
|
ydiff = pts[2].Y - pts[0].Y;
|
||||||
|
|
||||||
|
/* apply tangent to get control points */
|
||||||
|
*x1 = pts[1].X - tension * xdiff;
|
||||||
|
*y1 = pts[1].Y - tension * ydiff;
|
||||||
|
*x2 = pts[1].X + tension * xdiff;
|
||||||
|
*y2 = pts[1].Y + tension * ydiff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calculates Bezier points from cardinal spline endpoints. */
|
||||||
|
void calc_curve_bezier_endp(REAL xend, REAL yend, REAL xadj, REAL yadj,
|
||||||
|
REAL tension, REAL *x, REAL *y)
|
||||||
|
{
|
||||||
|
/* tangent at endpoints is the line from the endpoint to the adjacent point */
|
||||||
|
*x = roundr(tension * (xadj - xend) + xend);
|
||||||
|
*y = roundr(tension * (yadj - yend) + yend);
|
||||||
|
}
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#define INCH_HIMETRIC (2540)
|
#define INCH_HIMETRIC (2540)
|
||||||
|
|
||||||
#define VERSION_MAGIC 0xdbc01001
|
#define VERSION_MAGIC 0xdbc01001
|
||||||
|
#define TENSION_CONST (0.3)
|
||||||
|
|
||||||
COLORREF ARGB2COLORREF(ARGB color);
|
COLORREF ARGB2COLORREF(ARGB color);
|
||||||
extern INT arc2polybezier(GpPointF * points, REAL x1, REAL y1, REAL x2, REAL y2,
|
extern INT arc2polybezier(GpPointF * points, REAL x1, REAL y1, REAL x2, REAL y2,
|
||||||
|
@ -46,6 +47,11 @@ extern REAL gdiplus_atan2(REAL dy, REAL dx);
|
||||||
extern GpStatus hresult_to_status(HRESULT res);
|
extern GpStatus hresult_to_status(HRESULT res);
|
||||||
extern REAL convert_unit(HDC hdc, GpUnit unit);
|
extern REAL convert_unit(HDC hdc, GpUnit unit);
|
||||||
|
|
||||||
|
extern void calc_curve_bezier(CONST GpPointF *pts, REAL tension, REAL *x1,
|
||||||
|
REAL *y1, REAL *x2, REAL *y2);
|
||||||
|
extern void calc_curve_bezier_endp(REAL xend, REAL yend, REAL xadj, REAL yadj,
|
||||||
|
REAL tension, REAL *x, REAL *y);
|
||||||
|
|
||||||
static inline INT roundr(REAL x)
|
static inline INT roundr(REAL x)
|
||||||
{
|
{
|
||||||
return (INT) floorf(x + 0.5);
|
return (INT) floorf(x + 0.5);
|
||||||
|
|
|
@ -42,7 +42,6 @@
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
|
WINE_DEFAULT_DEBUG_CHANNEL(gdiplus);
|
||||||
|
|
||||||
/* looks-right constants */
|
/* looks-right constants */
|
||||||
#define TENSION_CONST (0.3)
|
|
||||||
#define ANCHOR_WIDTH (2.0)
|
#define ANCHOR_WIDTH (2.0)
|
||||||
#define MAX_ITERS (50)
|
#define MAX_ITERS (50)
|
||||||
|
|
||||||
|
@ -194,34 +193,6 @@ static void draw_pie(GpGraphics *graphics, REAL x, REAL y, REAL width,
|
||||||
pti[2].y, pti[3].x, pti[3].y);
|
pti[2].y, pti[3].x, pti[3].y);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* GdipDrawCurve helper function.
|
|
||||||
* Calculates Bezier points from cardinal spline points. */
|
|
||||||
static void calc_curve_bezier(CONST GpPointF *pts, REAL tension, REAL *x1,
|
|
||||||
REAL *y1, REAL *x2, REAL *y2)
|
|
||||||
{
|
|
||||||
REAL xdiff, ydiff;
|
|
||||||
|
|
||||||
/* calculate tangent */
|
|
||||||
xdiff = pts[2].X - pts[0].X;
|
|
||||||
ydiff = pts[2].Y - pts[0].Y;
|
|
||||||
|
|
||||||
/* apply tangent to get control points */
|
|
||||||
*x1 = pts[1].X - tension * xdiff;
|
|
||||||
*y1 = pts[1].Y - tension * ydiff;
|
|
||||||
*x2 = pts[1].X + tension * xdiff;
|
|
||||||
*y2 = pts[1].Y + tension * ydiff;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* GdipDrawCurve helper function.
|
|
||||||
* Calculates Bezier points from cardinal spline endpoints. */
|
|
||||||
static void calc_curve_bezier_endp(REAL xend, REAL yend, REAL xadj, REAL yadj,
|
|
||||||
REAL tension, REAL *x, REAL *y)
|
|
||||||
{
|
|
||||||
/* tangent at endpoints is the line from the endpoint to the adjacent point */
|
|
||||||
*x = roundr(tension * (xadj - xend) + xend);
|
|
||||||
*y = roundr(tension * (yadj - yend) + yend);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Draws the linecap the specified color and size on the hdc. The linecap is in
|
/* Draws the linecap the specified color and size on the hdc. The linecap is in
|
||||||
* direction of the line from x1, y1 to x2, y2 and is anchored on x2, y2. Probably
|
* direction of the line from x1, y1 to x2, y2 and is anchored on x2, y2. Probably
|
||||||
* should not be called on an hdc that has a path you care about. */
|
* should not be called on an hdc that has a path you care about. */
|
||||||
|
|
Loading…
Reference in New Issue