36#define SQRT3 1.73205080757
124 if (!Points || !
Types)
132 Points[
i] =
node->pt;
140 path->pathdata.Points = Points;
200 REAL area_triangle, distance_start_end;
223 mp[1].
X = (mp[0].
X +
pt.X) / 2.0;
224 mp[1].
Y = (mp[0].
Y +
pt.Y) / 2.0;
225 mp[4].
X = (
end->pt.X +
x3) / 2.0;
226 mp[4].
Y = (
end->pt.Y +
y3) / 2.0;
227 mp[3].
X = (mp[4].
X +
pt.X) / 2.0;
228 mp[3].
Y = (mp[4].
Y +
pt.Y) / 2.0;
231 mp[2].
X = (mp[1].
X + mp[3].
X) / 2.0;
232 mp[2].
Y = (mp[1].
Y + mp[3].
Y) / 2.0;
241 fabs(pt_st.
X - mp[2].
X) +
fabs(pt_st.
Y - mp[2].
Y) ) <= flatness * 0.5)
251 area_triangle = (
pt.Y - pt_st.
Y)*mp[2].
X + (pt_st.
X -
pt.X)*mp[2].
Y + (pt_st.
Y*
pt.X - pt_st.
X*
pt.Y);
252 distance_start_end =
hypotf(
pt.Y - pt_st.
Y, pt_st.
X -
pt.X);
253 if(
fabs(area_triangle) <= (0.5 * flatness * distance_start_end)){
299 INT insert_index =
path->pathdata.Count;
302 if(!
path->newfigure &&
303 path->pathdata.Points[insert_index-1].X ==
points[0].X &&
304 path->pathdata.Points[insert_index-1].Y ==
points[0].Y)
308 first_point_type =
type;
318 path->pathdata.Types[insert_index] = first_point_type;
360 TRACE(
"(%p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n",
390 TRACE(
"(%p, %d, %d, %d, %d, %.2f, %.2f)\n",
401 TRACE(
"(%p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n",
422 TRACE(
"(%p, %d, %d, %d, %d, %d, %d, %d, %d)\n",
516 pt[3*
i+3].X = pts[
i+1].
X;
517 pt[3*
i+3].Y = pts[
i+1].
Y;
536 pt[len_pt-1].X =
pt[0].X;
537 pt[len_pt-1].Y =
pt[0].Y;
598 INT i, len_pt = nseg * 3 + 1;
602 TRACE(
"(%p, %p, %d, %d, %d, %.2f)\n",
path,
points,
count,
offset, nseg, tension);
629 for (
i = 0;
i < nseg - 1;
i++){
682 TRACE(
"(%p, %p, %d, %d, %d, %.2f)\n",
path,
points,
count,
offset, nseg, tension);
706 INT old_count, numpts;
716 old_count =
path->pathdata.Count;
840 if(!
path || !addingPath)
843 old_count =
path->pathdata.Count;
844 count = addingPath->pathdata.Count;
849 memcpy(&
path->pathdata.Points[old_count], addingPath->pathdata.Points,
851 memcpy(&
path->pathdata.Types[old_count], addingPath->pathdata.Types,
count);
871 TRACE(
"(%p, %.2f, %.2f, %.2f, %.2f, %.2f, %.2f)\n",
884 path->pathdata.Count = 1;
926 TRACE(
"(%p, %d, %d, %d, %d, %.2f, %.2f)\n",
944 old_count =
path->pathdata.Count;
987 float f = ((
float)
v.fract) / (1<<(
sizeof(
v.fract)*8));
1002 static const MAT2 identity = { {0,1}, {0,0}, {0,0}, {0,1} };
1006 int section_start = -1;
1013 if (
info->underlined_index_count)
1014 FIXME(
"hotkey underlines not drawn yet\n");
1029 if (section_start !=
section->start)
1038 section_start =
section->start;
1060 DWORD ofs_start = ofs;
1065 TRACE(
"Starting at count %i with pos %f, %f)\n",
path->pathdata.Count,
x,
y);
1067 while (ofs - ofs_start < ph->
cb)
1073 switch (curve->
wType)
1076 for (
j = 0;
j < curve->
cpfx; ++
j)
1084 for (
j = 0;
j < curve->
cpfx; ++
j)
1092 ERR(
"Unhandled type: %u\n", curve->
wType);
1128 RectF scaled_layout_rect;
1131 TRACE(
"(%p, %s, %d, %p, %d, %f, %p, %p)\n",
path,
debugstr_w(
string),
length, family,
style, emSize, layoutRect,
format);
1132 if (!
path || !
string || !family || !emSize || !layoutRect)
1142 scaled_layout_rect.
X = layoutRect->X;
1143 scaled_layout_rect.
Y = layoutRect->Y;
1144 scaled_layout_rect.
Width = layoutRect->Width * native_height / emSize;
1145 scaled_layout_rect.
Height = layoutRect->Height * native_height / emSize;
1173 WARN(
"Failed to create font\n");
1186 args.scale = emSize / native_height;
1206 float inc = layoutRect->Height + layoutRect->Y -
args.maxY;
1208 for (
i =
backup->pathdata.Count; i < path->pathdata.Count; ++
i)
1209 path->pathdata.Points[
i].Y += inc;
1211 float inc = layoutRect->Height + layoutRect->Y -
args.maxY;
1212 for (
i =
backup->pathdata.Count; i < path->pathdata.Count; ++
i)
1213 path->pathdata.Points[
i].Y += inc;
1227 set_rect(&
rect, layoutRect->X, layoutRect->Y, layoutRect->Width, layoutRect->Height);
1252 if (
path->pathdata.Count)
1271 if(
path->pathdata.Count > 0){
1288 for(
i = 1;
i <
path->pathdata.Count;
i++){
1308 (*path)->fill =
fill;
1309 (*path)->newfigure =
TRUE;
1351 if(!(*path)->pathdata.Points || !(*path)->pathdata.Types){
1352 free((*path)->pathdata.Points);
1353 free((*path)->pathdata.Types);
1362 (*path)->pathdata.Count =
count;
1363 (*path)->datalen =
count;
1365 (*path)->fill =
fill;
1366 (*path)->newfigure =
TRUE;
1421 if(
path->pathdata.Count == 0)
1428 pt =
path->pathdata.Points[0];
1434 while(i < path->pathdata.Count){
1439 pt =
path->pathdata.Points[
i];
1459 pt =
path->pathdata.Points[startidx];
1465 pt =
path->pathdata.Points[
i];
1477 path->pathdata.Points[
i-1].X,
path->pathdata.Points[
i-1].Y,
1497 if(!
path || !pathData)
1512 if(!
path || !fillmode)
1515 *fillmode =
path->fill;
1526 if(!
path || !lastPoint)
1531 *lastPoint =
path->pathdata.Points[
count-1];
1543 if(count < path->pathdata.Count)
1583 if(count < path->pathdata.Count)
1605 if(!
path || !bounds)
1611 bounds->
X = bounds->
Y = bounds->
Width = bounds->
Height = 0.0;
1617 low_x = high_x =
points[0].X;
1618 low_y = high_y =
points[0].Y;
1627 width = high_x - low_x;
1632 temp_pts[0].
X = low_x;
1633 temp_pts[0].
Y = low_y;
1634 temp_pts[1].
X = low_x;
1635 temp_pts[1].
Y = high_y;
1636 temp_pts[2].
X = high_x;
1637 temp_pts[2].
Y = high_y;
1638 temp_pts[3].
X = high_x;
1639 temp_pts[3].
Y = low_y;
1642 low_x = temp_pts[0].
X;
1643 low_y = temp_pts[0].
Y;
1645 for(
i = 1;
i < 4;
i++){
1646 low_x =
min(low_x, temp_pts[
i].
X);
1647 low_y =
min(low_y, temp_pts[
i].
Y);
1656 path_width = pen->width / 2.0;
1659 path_width =
max(path_width, pen->width * pen->miterlimit / 2.0);
1662 path_width =
max(path_width, pen->width * 2.2);
1664 low_x -= path_width;
1665 low_y -= path_width;
1666 width += 2.0 * path_width;
1667 height += 2.0 * path_width;
1769 TRACE(
"(%p, %d, %d, %p, %p, %p)\n",
path,
x,
y, pen, graphics,
result);
1782 TRACE(
"(%p, %0.2f, %0.2f, %p, %p, %p)\n",
path,
x,
y, pen, graphics,
result);
1871 path->pathdata.Count = 0;
1901 path->pathdata.Count);
1908 FIXME(
"(%p,%s,%p,%i,%0.2f,%0.2f,%0.2f,%0.2f,%i,%0.2f)\n",
path,
debugstr_matrix(
matrix),
1919 REAL segment_length =
hypotf(segment_dy, segment_dx);
1921 REAL bevel_dx, bevel_dy;
1923 if (segment_length == 0.0)
1932 bevel_dx = -
distance * segment_dy / segment_length;
1933 bevel_dy =
distance * segment_dx / segment_length;
1937 bevel_dx =
distance * segment_dy / segment_length;
1938 bevel_dy = -
distance * segment_dx / segment_length;
1952 if ((p2->
X - p1->
X) * (p3->
Y - p1->
Y) > (p2->
Y - p1->
Y) * (p3->
X - p1->
X))
1955 float length_0 =
hypotf(p2->
X - p1->
X, p2->
Y - p1->
Y);
1956 float length_1 =
hypotf(p3->
X - p2->
X, p3->
Y - p2->
Y);
1957 float dx0 =
distance * (p2->
X - p1->
X) / length_0;
1958 float dy0 =
distance * (p2->
Y - p1->
Y) / length_0;
1959 float dx1 =
distance * (p3->
X - p2->
X) / length_1;
1960 float dy1 =
distance * (p3->
Y - p2->
Y) / length_1;
1961 float det = (dy0*dx1 - dx0*dy1);
1962 float dx = (dx0*dx1*(dx0-dx1) + dy0*dy0*dx1 - dy1*dy1*dx0)/det;
1963 float dy = (dy0*dy1*(dy0-dy1) + dx0*dx0*dy1 - dx1*dx1*dy0)/det;
1974 FIXME(
"should add a clipped corner\n");
1995 if (add_first_points)
2006 REAL segment_length =
hypotf(segment_dy, segment_dx);
2008 REAL bevel_dx, bevel_dy;
2009 REAL extend_dx, extend_dy;
2011 extend_dx =
distance * segment_dx / segment_length;
2012 extend_dy =
distance * segment_dy / segment_length;
2014 bevel_dx = -extend_dy;
2015 bevel_dy = extend_dx;
2019 extend_dx = -2.0 * custom_cap->
inset * extend_dx;
2020 extend_dy = -2.0 * custom_cap->
inset * extend_dy;
2024 extend_dx = -3.0 * extend_dx;
2025 extend_dy = -3.0 * extend_dy;
2028 if (add_first_points)
2041 REAL segment_length =
hypotf(segment_dy, segment_dx);
2044 const REAL control_point_distance = 0.5522847498307935;
2046 if (add_first_points)
2048 dx = -
distance * segment_dx / segment_length;
2049 dy = -
distance * segment_dy / segment_length;
2051 dx2 =
dx * control_point_distance;
2052 dy2 =
dy * control_point_distance;
2078 else if (add_last_point)
2086 REAL segment_length =
hypotf(segment_dy, segment_dx);
2093 if (add_first_points) {
2099 if (add_first_points || add_last_point)
2125 REAL segment_length =
hypotf(segment_dy, segment_dx);
2127 REAL par_dx, par_dy;
2128 REAL perp_dx, perp_dy;
2130 par_dx = -
distance * segment_dx / segment_length;
2131 par_dy = -
distance * segment_dy / segment_length;
2133 perp_dx = -
distance * segment_dy / segment_length;
2134 perp_dy =
distance * segment_dx / segment_length;
2150 REAL segment_length =
hypotf(segment_dy, segment_dx);
2152 const REAL control_point_distance = 0.55228475;
2154 dx = -pen_width * segment_dx / segment_length;
2155 dy = -pen_width * segment_dy / segment_length;
2157 dx2 =
dx * control_point_distance;
2158 dy2 =
dy * control_point_distance;
2202 REAL segment_length =
hypotf(segment_dy, segment_dx);
2203 REAL par_dx, par_dy;
2204 REAL perp_dx, perp_dy;
2206 par_dx = -pen_width * segment_dx / segment_length;
2207 par_dy = -pen_width * segment_dy / segment_length;
2209 perp_dx = -pen_width * segment_dy / segment_length;
2210 perp_dy = pen_width * segment_dx / segment_length;
2226 REAL segment_length =
hypotf(segment_dy, segment_dx);
2227 REAL par_dx = pen_width * segment_dx / segment_length;
2228 REAL par_dy = pen_width * segment_dy / segment_length;
2229 REAL perp_dx = -par_dy;
2230 REAL perp_dy = par_dx;
2244 REAL segment_length =
sqrtf(segment_dy * segment_dy + segment_dx * segment_dx);
2246 REAL perp_dx, perp_dy;
2256 TRACE(
"GpAdjustableArrowCap middle_inset: %f height: %f width: %f\n",
2260 TRACE(
"GpCustomLineCap fill: %d basecap: %d inset: %f join: %d scale: %f pen_width:%f\n",
2263 sina = pen_width * custom->
scale * segment_dx / segment_length;
2264 cosa = -pen_width * custom->
scale * segment_dy / segment_length;
2274 ERR(
"Out of memory\n");
2315 if (
end <=
start || pen_width == 0.0)
2318 prev_point = *last_point;
2321 pen_width, start_cap, custom_start,
FALSE,
TRUE, last_point);
2325 pen, pen_width, last_point);
2328 pen_width, end_cap, custom_end,
TRUE,
TRUE, last_point);
2332 pen, pen_width, last_point);
2335 pen_width, start_cap, custom_start,
TRUE,
FALSE, last_point);
2347 if (
end <=
start || pen_width == 0.0)
2351 prev_point = *last_point;
2358 &
points[
i+1], pen, pen_width, last_point);
2367 prev_point = *last_point;
2370 &
points[
end-1], pen, pen_width, last_point);
2374 &
points[
i-1], pen, pen_width, last_point);
2377 &
points[
end], pen, pen_width, last_point);
2389 const REAL *dash_pattern;
2390 REAL *dash_pattern_scaled;
2396 REAL segment_length;
2398 int num_tmp_points=0;
2399 int draw_start_cap=0;
2400 static const REAL dash_dot_dot[6] = { 3.0, 1.0, 1.0, 1.0, 1.0, 1.0 };
2402 if (
end <=
start || pen_width == 0.0)
2409 dash_pattern = dash_dot_dot;
2413 dash_pattern = &dash_dot_dot[2];
2417 dash_pattern = dash_dot_dot;
2421 dash_pattern = dash_dot_dot;
2425 dash_pattern = pen->
dashes;
2430 dash_pattern_scaled =
malloc(dash_count *
sizeof(
REAL));
2431 if (!dash_pattern_scaled)
return;
2433 for (
i = 0;
i < dash_count;
i++)
2434 dash_pattern_scaled[
i] = dash_pattern_scaling * dash_pattern[
i];
2438 free(dash_pattern_scaled);
2457 segment_dy =
path->pathdata.Points[
j].Y -
path->pathdata.Points[
i].Y;
2458 segment_dx =
path->pathdata.Points[
j].X -
path->pathdata.Points[
i].X;
2459 segment_length =
hypotf(segment_dy, segment_dx);
2464 if (dash_pos == 0.0)
2466 if ((dash_index % 2) == 0)
2470 tmp_points[0].
X =
path->pathdata.Points[
i].X + segment_dx * segment_pos / segment_length;
2471 tmp_points[0].
Y =
path->pathdata.Points[
i].Y + segment_dy * segment_pos / segment_length;
2476 tmp_points[num_tmp_points].
X =
path->pathdata.Points[
i].X + segment_dx * segment_pos / segment_length;
2477 tmp_points[num_tmp_points].
Y =
path->pathdata.Points[
i].Y + segment_dy * segment_pos / segment_length;
2487 if (dash_pattern_scaled[dash_index] - dash_pos > segment_length - segment_pos)
2490 if ((dash_index % 2) == 0)
2492 tmp_points[num_tmp_points] =
path->pathdata.Points[
j];
2495 dash_pos += segment_length - segment_pos;
2501 segment_pos += dash_pattern_scaled[dash_index] - dash_pos;
2503 if (++dash_index == dash_count)
2510 if (dash_index % 2 == 0 && num_tmp_points != 0)
2518 free(dash_pattern_scaled);
2525 int i, subpath_start=0;
2556 if (!flat_path || !pen)
2593 int i, subpath_start=0;
2600 if (
path->pathdata.Count <= 1)
2622 FIXME(
"unimplemented line join %d\n", pen->
join);
2625 FIXME(
"unimplemented pen alignment %d\n", pen->
align);
2692 old_new =
path->newfigure;
2695 path->newfigure = old_new;
2776 if(!rects ||
count == 0)
2824 path->pathdata.Types[
i] &= ~PathPointTypePathMarker;
2836#define FLAGS_INTPATH 0x4000
2850 if (!
path->pathdata.Count)
return FALSE;
2852 for (
i = 0;
i <
path->pathdata.Count;
i++)
2872 size +=
sizeof(
short[2]) *
path->pathdata.Count;
2874 size +=
sizeof(
float[2]) *
path->pathdata.Count;
2886 for (
i = 0;
i <
path->pathdata.Count;
i++)
2896 for (
i = 0;
i <
path->pathdata.Count;
i++)
2904 for (
i=0;
i<
path->pathdata.Count;
i++)
_STLP_MOVE_TO_STD_NAMESPACE void fill(_ForwardIter __first, _ForwardIter __last, const _Tp &__val)
char ACPI_OBJECT_TYPE * Types
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static void list_remove(struct list_entry *entry)
static void list_init(struct list_entry *head)
GpStatus WINGDIPAPI GdipDeleteFont(GpFont *font)
GpStatus WINGDIPAPI GdipCreateFont(GDIPCONST GpFontFamily *fontFamily, REAL emSize, INT style, Unit unit, GpFont **font)
GpStatus WINGDIPAPI GdipGetEmHeight(GDIPCONST GpFontFamily *family, INT style, UINT16 *EmHeight)
GpStatus WINGDIPAPI GdipCreateFromHDC(HDC hdc, GpGraphics **graphics)
GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
GpStatus WINGDIPAPI GdipAddPathCurve3(GpPath *path, GDIPCONST GpPointF *points, INT count, INT offset, INT nseg, REAL tension)
static BOOL flatten_bezier_add(struct list *jobs, path_list_node_t *start, REAL x2, REAL y2, REAL x3, REAL y3, path_list_node_t *end)
static INT path_list_count(path_list_node_t *node)
GpStatus WINGDIPAPI GdipGetPathWorldBoundsI(GpPath *path, GpRect *bounds, GDIPCONST GpMatrix *matrix, GDIPCONST GpPen *pen)
static void widen_cap(const GpPointF *endpoint, const GpPointF *nextpoint, REAL pen_width, GpLineCap cap, GpCustomLineCap *custom_cap, int add_first_points, int add_last_point, path_list_node_t **last_point)
GpStatus WINGDIPAPI GdipClearPathMarkers(GpPath *path)
GpStatus WINGDIPAPI GdipIsOutlineVisiblePathPointI(GpPath *path, INT x, INT y, GpPen *pen, GpGraphics *graphics, BOOL *result)
GpStatus WINGDIPAPI GdipAddPathRectangleI(GpPath *path, INT x, INT y, INT width, INT height)
static void widen_dashed_figure(GpPath *path, int start, int end, int closed, GpPen *pen, REAL pen_width, path_list_node_t **last_point)
GpStatus WINGDIPAPI GdipCreatePath(GpFillMode fill, GpPath **path)
GpStatus WINGDIPAPI GdipDeletePath(GpPath *path)
static GpStatus format_string_callback(struct gdip_format_string_info *info)
GpStatus WINGDIPAPI GdipCreatePath2I(GDIPCONST GpPoint *points, GDIPCONST BYTE *types, INT count, GpFillMode fill, GpPath **path)
GpStatus WINGDIPAPI GdipAddPathPie(GpPath *path, REAL x, REAL y, REAL width, REAL height, REAL startAngle, REAL sweepAngle)
DWORD write_path_data(GpPath *path, void *data)
GpStatus WINGDIPAPI GdipAddPathEllipseI(GpPath *path, INT x, INT y, INT width, INT height)
GpStatus WINGDIPAPI GdipAddPathLine(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2)
static BOOL flatten_bezier(path_list_node_t *start, REAL x2, REAL y2, REAL x3, REAL y3, path_list_node_t *end, REAL flatness)
static void free_path_list(path_list_node_t *node)
static float fromfixedpoint(const FIXED v)
GpStatus WINGDIPAPI GdipAddPathRectangle(GpPath *path, REAL x, REAL y, REAL width, REAL height)
GpStatus WINGDIPAPI GdipAddPathCurve(GpPath *path, GDIPCONST GpPointF *points, INT count)
GpStatus WINGDIPAPI GdipIsOutlineVisiblePathPoint(GpPath *path, REAL x, REAL y, GpPen *pen, GpGraphics *graphics, BOOL *result)
GpStatus WINGDIPAPI GdipGetPathData(GpPath *path, GpPathData *pathData)
GpStatus WINGDIPAPI GdipResetPath(GpPath *path)
static void widen_closed_figure(const GpPointF *points, int start, int end, GpPen *pen, REAL pen_width, path_list_node_t **last_point)
GpStatus WINGDIPAPI GdipAddPathPieI(GpPath *path, INT x, INT y, INT width, INT height, REAL startAngle, REAL sweepAngle)
GpStatus WINGDIPAPI GdipCreatePath2(GDIPCONST GpPointF *points, GDIPCONST BYTE *types, INT count, GpFillMode fill, GpPath **path)
static void widen_open_figure(const GpPointF *points, int start, int end, GpPen *pen, REAL pen_width, GpLineCap start_cap, GpCustomLineCap *custom_start, GpLineCap end_cap, GpCustomLineCap *custom_end, path_list_node_t **last_point)
GpStatus WINGDIPAPI GdipAddPathLine2(GpPath *path, GDIPCONST GpPointF *points, INT count)
GpStatus WINGDIPAPI GdipFlattenPath(GpPath *path, GpMatrix *matrix, REAL flatness)
void widen_anchors(GpPath *flat_path, GpPen *pen, REAL pen_width, path_list_node_t **last_point)
GpStatus WINGDIPAPI GdipAddPathClosedCurve2I(GpPath *path, GDIPCONST GpPoint *points, INT count, REAL tension)
GpStatus WINGDIPAPI GdipAddPathArcI(GpPath *path, INT x1, INT y1, INT x2, INT y2, REAL startAngle, REAL sweepAngle)
GpStatus WINGDIPAPI GdipAddPathStringI(GpPath *path, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFontFamily *family, INT style, REAL emSize, GDIPCONST Rect *layoutRect, GDIPCONST GpStringFormat *format)
GpStatus WINGDIPAPI GdipGetPathLastPoint(GpPath *path, GpPointF *lastPoint)
GpStatus WINGDIPAPI GdipClosePathFigure(GpPath *path)
GpStatus WINGDIPAPI GdipAddPathPolygon(GpPath *path, GDIPCONST GpPointF *points, INT count)
static BOOL init_path_list(path_list_node_t **node, REAL x, REAL y)
GpStatus widen_flat_path_anchors(GpPath *flat_path, GpPen *pen, REAL pen_width, GpPath **anchors)
GpStatus WINGDIPAPI GdipWarpPath(GpPath *path, GpMatrix *matrix, GDIPCONST GpPointF *points, INT count, REAL x, REAL y, REAL width, REAL height, WarpMode warpmode, REAL flatness)
GpStatus WINGDIPAPI GdipClonePath(GpPath *path, GpPath **clone)
static GpStatus extend_current_figure(GpPath *path, GDIPCONST PointF *points, INT count, BYTE type)
GpStatus WINGDIPAPI GdipAddPathCurve2I(GpPath *path, GDIPCONST GpPoint *points, INT count, REAL tension)
GpStatus WINGDIPAPI GdipTransformPath(GpPath *path, GpMatrix *matrix)
GpStatus WINGDIPAPI GdipAddPathCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count)
GpStatus WINGDIPAPI GdipAddPathBezierI(GpPath *path, INT x1, INT y1, INT x2, INT y2, INT x3, INT y3, INT x4, INT y4)
static void widen_joint(const GpPointF *p1, const GpPointF *p2, const GpPointF *p3, GpPen *pen, REAL pen_width, path_list_node_t **last_point)
GpStatus WINGDIPAPI GdipAddPathLineI(GpPath *path, INT x1, INT y1, INT x2, INT y2)
GpStatus WINGDIPAPI GdipGetPathPointsI(GpPath *path, GpPoint *points, INT count)
GpStatus WINGDIPAPI GdipSetPathFillMode(GpPath *path, GpFillMode fill)
static void add_bevel_point(const GpPointF *endpoint, const GpPointF *nextpoint, REAL pen_width, int right_side, path_list_node_t **last_point)
static BOOL is_integer_path(const GpPath *path)
GpStatus WINGDIPAPI GdipAddPathPath(GpPath *path, GDIPCONST GpPath *addingPath, BOOL connect)
static void add_anchor(const GpPointF *endpoint, const GpPointF *nextpoint, GpPen *pen, REAL pen_width, GpLineCap cap, GpCustomLineCap *custom, path_list_node_t **last_point)
GpStatus WINGDIPAPI GdipWidenPath(GpPath *path, GpPen *pen, GpMatrix *matrix, REAL flatness)
GpStatus WINGDIPAPI GdipAddPathBeziers(GpPath *path, GDIPCONST GpPointF *points, INT count)
GpStatus WINGDIPAPI GdipAddPathLine2I(GpPath *path, GDIPCONST GpPoint *points, INT count)
GpStatus WINGDIPAPI GdipGetPathWorldBounds(GpPath *path, GpRectF *bounds, GDIPCONST GpMatrix *matrix, GDIPCONST GpPen *pen)
GpStatus WINGDIPAPI GdipAddPathRectangles(GpPath *path, GDIPCONST GpRectF *rects, INT count)
GpStatus WINGDIPAPI GdipWindingModeOutline(GpPath *path, GpMatrix *matrix, REAL flatness)
GpStatus WINGDIPAPI GdipAddPathPolygonI(GpPath *path, GDIPCONST GpPoint *points, INT count)
GpStatus WINGDIPAPI GdipIsVisiblePathPoint(GpPath *path, REAL x, REAL y, GpGraphics *graphics, BOOL *result)
GpStatus WINGDIPAPI GdipAddPathCurve2(GpPath *path, GDIPCONST GpPointF *points, INT count, REAL tension)
GpStatus WINGDIPAPI GdipAddPathBeziersI(GpPath *path, GDIPCONST GpPoint *points, INT count)
GpStatus WINGDIPAPI GdipGetPointCount(GpPath *path, INT *count)
GpStatus WINGDIPAPI GdipGetPathPoints(GpPath *path, GpPointF *points, INT count)
GpStatus WINGDIPAPI GdipIsVisiblePathPointI(GpPath *path, INT x, INT y, GpGraphics *graphics, BOOL *result)
GpStatus WINGDIPAPI GdipAddPathClosedCurveI(GpPath *path, GDIPCONST GpPoint *points, INT count)
GpStatus WINGDIPAPI GdipAddPathBezier(GpPath *path, REAL x1, REAL y1, REAL x2, REAL y2, REAL x3, REAL y3, REAL x4, REAL y4)
GpStatus WINGDIPAPI GdipAddPathRectanglesI(GpPath *path, GDIPCONST GpRect *rects, INT count)
static BOOL path_list_to_path(path_list_node_t *node, GpPath *path)
static path_list_node_t * add_path_list_node(path_list_node_t *node, REAL x, REAL y, BOOL type)
GpStatus WINGDIPAPI GdipReversePath(GpPath *path)
GpStatus WINGDIPAPI GdipClosePathFigures(GpPath *path)
GpStatus WINGDIPAPI GdipGetPathTypes(GpPath *path, BYTE *types, INT count)
GpStatus WINGDIPAPI GdipStartPathFigure(GpPath *path)
GpStatus WINGDIPAPI GdipAddPathArc(GpPath *path, REAL x, REAL y, REAL width, REAL height, REAL startAngle, REAL sweepAngle)
GpStatus WINGDIPAPI GdipGetPathFillMode(GpPath *path, GpFillMode *fillmode)
GpStatus WINGDIPAPI GdipAddPathEllipse(GpPath *path, REAL x, REAL y, REAL width, REAL height)
GpStatus WINGDIPAPI GdipAddPathClosedCurve(GpPath *path, GDIPCONST GpPointF *points, INT count)
GpStatus WINGDIPAPI GdipAddPathClosedCurve2(GpPath *path, GDIPCONST GpPointF *points, INT count, REAL tension)
GpStatus WINGDIPAPI GdipAddPathString(GpPath *path, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFontFamily *family, INT style, REAL emSize, GDIPCONST RectF *layoutRect, GDIPCONST GpStringFormat *format)
GpStatus WINGDIPAPI GdipSetPathMarker(GpPath *path)
GpStatus WINGDIPAPI GdipAddPathCurve3I(GpPath *path, GDIPCONST GpPoint *points, INT count, INT offset, INT nseg, REAL tension)
GpStatus WINGDIPAPI GdipDeleteMatrix(GpMatrix *matrix)
GpStatus WINGDIPAPI GdipTransformMatrixPoints(GpMatrix *matrix, GpPointF *pts, INT count)
GpStatus WINGDIPAPI GdipCreateMatrix(GpMatrix **matrix)
GpStatus WINGDIPAPI GdipGetRegionHRgn(GpRegion *region, GpGraphics *graphics, HRGN *hrgn)
GpStatus WINGDIPAPI GdipCreateRegionPath(GpPath *path, GpRegion **region)
GpStatus WINGDIPAPI GdipDeleteRegion(GpRegion *region)
_ACRTIMP double __cdecl fabs(double)
static float hypotf(float x, float y)
_ACRTIMP double __cdecl fmax(double, double)
BOOL lengthen_path(GpPath *path, INT len)
void calc_curve_bezier(const GpPointF *pts, REAL tension, REAL *x1, REAL *y1, REAL *x2, REAL *y2)
void calc_curve_bezier_endp(REAL xend, REAL yend, REAL xadj, REAL yadj, REAL tension, REAL *x, REAL *y)
INT arc2polybezier(GpPointF *points, REAL left, REAL top, REAL width, REAL height, REAL start_angle, REAL sweep_angle)
const char * debugstr_matrix(const GpMatrix *matrix)
GpStatus get_graphics_transform(GpGraphics *graphics, GpCoordinateSpace dst_space, GpCoordinateSpace src_space, GpMatrix *matrix)
static INT gdip_round(REAL x)
static void set_rect(GpRectF *rect, REAL x, REAL y, REAL width, REAL height)
GpStatus gdip_format_string(GpGraphics *graphics, HDC hdc, GDIPCONST WCHAR *string, INT length, GDIPCONST GpFont *font, GDIPCONST RectF *rect, GDIPCONST GpStringFormat *format, int ignore_empty_clip, gdip_format_string_callback callback, void *user_data)
const struct GpStringFormat default_drawstring_format
void get_font_hfont(GpGraphics *graphics, GDIPCONST GpFont *font, GDIPCONST GpStringFormat *format, HFONT *hfont, LOGFONTW *lfw_return, GDIPCONST GpMatrix *matrix)
void get_log_fontW(const GpFont *, GpGraphics *, LOGFONTW *)
@ CustomLineCapTypeAdjustableArrow
@ PathPointTypePathMarker
@ PathPointTypePathTypeMask
@ PathPointTypeCloseSubpath
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei count
GLuint GLuint GLsizei GLenum type
GLint GLint GLint GLint GLint GLint y
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLint GLint GLsizei GLsizei height
GLint GLint GLsizei width
GLuint GLenum GLenum transform
GLsizei GLsizei GLfloat distance
GLuint GLsizei GLsizei * length
GLsizei const GLfloat * points
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
#define memcpy(s1, s2, n)
struct task_struct * current
static float int float int float int x3
static float int float int float int float int x4
static float int float int float int float y3
static float int float int float int float int float y4
static float(__cdecl *square_half_float)(float x
static unsigned __int64 next
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
__WINE_SERVER_LIST_INLINE struct list * list_next(const struct list *list, const struct list *elem)
__WINE_SERVER_LIST_INLINE void list_add_after(struct list *elem, struct list *to_add)
GpCustomLineCap * customend
GpCustomLineCap * customstart
_In_ HFONT _Out_ PUINT _Out_ PUINT Width
_In_ HFONT _Out_ PUINT Height
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG x1
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG y1
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG _In_ LONG _In_ LONG y2
_In_ CLIPOBJ _In_ BRUSHOBJ _In_ LONG _In_ LONG _In_ LONG x2
BOOL WINAPI GetTextMetricsW(_In_ HDC, _Out_ LPTEXTMETRICW)
struct tagPOINTFX POINTFX
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
struct tagTTPOLYCURVE TTPOLYCURVE
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
BOOL WINAPI PtInRegion(_In_ HRGN, _In_ int, _In_ int)
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
BOOL WINAPI DeleteDC(_In_ HDC)
DWORD WINAPI GetGlyphOutlineW(_In_ HDC hdc, _In_ UINT uChar, _In_ UINT fuFormat, _Out_ LPGLYPHMETRICS lpgm, _In_ DWORD cjBuffer, _Out_writes_bytes_opt_(cjBuffer) LPVOID pvBuffer, _In_ CONST MAT2 *lpmat2)