使用 Direct2D 绘制 SVG 路径:无法绘制椭圆弧
Draw a SVG path with Direct2D: Can't draw elliptical arc
我有以下 SVG 路径:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24">
<path d="M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z" />
</svg>
阅读方便:
M 6, 2
C 4.89, 2 4,2.89 4,4
V 20
A 2,2 0 0,0 6,22
H 18
A 2,2 0 0,0 20,20
V 8L14,2
H 6
Z
我正在尝试将其转换为 ID2D1PathGeometry
。这是代码:
ID2D1PathGeometry *geo = NULL;
ID2D1GeometrySink *pSink = NULL;
d2DFactory->CreatePathGeometry(&geo);
geo->Open(&pSink);
pSink->SetFillMode(D2D1_FILL_MODE_WINDING);
pSink->BeginFigure({ 6.00f, 2.00f }, D2D1_FIGURE_BEGIN_FILLED);
pSink->AddBezier({ { 4.89f, 2.00f },{ 4.00f, 2.89f },{ 4.00f, 4.00f } });
pSink->AddLine({ 4.00f, 20.00f });
{
D2D1_ARC_SEGMENT arc;
arc.point.x = 6.00f;
arc.point.y = 22.00f;
arc.size.width = 2.00f;
arc.size.height = 2.00f;
arc.rotationAngle = 0.00f;
arc.sweepDirection = D2D1_SWEEP_DIRECTION_CLOCKWISE;
pSink->AddArc(&arc);
}
pSink->AddLine({ 18.00f, 22.00f });
{
D2D1_ARC_SEGMENT arc;
arc.point.x = 6.00f;
arc.point.y = 22.00f;
arc.size.width = 2.00f;
arc.size.height = 2.00f;
arc.rotationAngle = 0.00f;
arc.sweepDirection = D2D1_SWEEP_DIRECTION_CLOCKWISE;
pSink->AddArc(&arc);
}
pSink->AddLine({ 20.00f, 8.00f });
pSink->AddLine({ 14.00f, 2.00f });
pSink->AddLine({ 6.00f, 2.00f });
pSink->EndFigure(D2D1_FIGURE_END_CLOSED);
pSink->Close();
pSink->Release();
pRT->DrawGeometry(geo, brushBlack);
虽然我可以成功转换直线和贝塞尔曲线,但我无法转换弧线。
例如,上面的代码不会绘制任何东西,但是如果我注释以下行:
// pSink->AddArc(&arc);
它会画一个形状,但肯定不会是 Chrome 浏览器输出的,因为缺少一些片段。
问题:
1.
我的代码中有什么错误阻止我使用 Arcs 段绘制几何图形?如何解决?
2.
在w3.org文档中,弧段有以下值:
rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y
虽然我可以设置 rx
、ry
、x_axis_rotation
、sweep_flag
、x
、y
,但我看不到D2D1_ARC_SEGMENT
结构中的成员 large_arc_flag
。我怎样才能使它适应我的代码?
- 您应该检查
pSink->Close();
返回的值以确定问题所在。
D2D1_ARC_SEGMENT::arcSize
您根本没有初始化导致 UB 并可能导致代码无法添加弧线,因为标志值很可能变为无效。
我有以下 SVG 路径:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="24" height="24" viewBox="0 0 24 24">
<path d="M6,2C4.89,2 4,2.89 4,4V20A2,2 0 0,0 6,22H18A2,2 0 0,0 20,20V8L14,2H6Z" />
</svg>
阅读方便:
M 6, 2
C 4.89, 2 4,2.89 4,4
V 20
A 2,2 0 0,0 6,22
H 18
A 2,2 0 0,0 20,20
V 8L14,2
H 6
Z
我正在尝试将其转换为 ID2D1PathGeometry
。这是代码:
ID2D1PathGeometry *geo = NULL;
ID2D1GeometrySink *pSink = NULL;
d2DFactory->CreatePathGeometry(&geo);
geo->Open(&pSink);
pSink->SetFillMode(D2D1_FILL_MODE_WINDING);
pSink->BeginFigure({ 6.00f, 2.00f }, D2D1_FIGURE_BEGIN_FILLED);
pSink->AddBezier({ { 4.89f, 2.00f },{ 4.00f, 2.89f },{ 4.00f, 4.00f } });
pSink->AddLine({ 4.00f, 20.00f });
{
D2D1_ARC_SEGMENT arc;
arc.point.x = 6.00f;
arc.point.y = 22.00f;
arc.size.width = 2.00f;
arc.size.height = 2.00f;
arc.rotationAngle = 0.00f;
arc.sweepDirection = D2D1_SWEEP_DIRECTION_CLOCKWISE;
pSink->AddArc(&arc);
}
pSink->AddLine({ 18.00f, 22.00f });
{
D2D1_ARC_SEGMENT arc;
arc.point.x = 6.00f;
arc.point.y = 22.00f;
arc.size.width = 2.00f;
arc.size.height = 2.00f;
arc.rotationAngle = 0.00f;
arc.sweepDirection = D2D1_SWEEP_DIRECTION_CLOCKWISE;
pSink->AddArc(&arc);
}
pSink->AddLine({ 20.00f, 8.00f });
pSink->AddLine({ 14.00f, 2.00f });
pSink->AddLine({ 6.00f, 2.00f });
pSink->EndFigure(D2D1_FIGURE_END_CLOSED);
pSink->Close();
pSink->Release();
pRT->DrawGeometry(geo, brushBlack);
虽然我可以成功转换直线和贝塞尔曲线,但我无法转换弧线。
例如,上面的代码不会绘制任何东西,但是如果我注释以下行:
// pSink->AddArc(&arc);
它会画一个形状,但肯定不会是 Chrome 浏览器输出的,因为缺少一些片段。
问题:
1.
我的代码中有什么错误阻止我使用 Arcs 段绘制几何图形?如何解决?
2.
在w3.org文档中,弧段有以下值:
rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y
虽然我可以设置 rx
、ry
、x_axis_rotation
、sweep_flag
、x
、y
,但我看不到D2D1_ARC_SEGMENT
结构中的成员 large_arc_flag
。我怎样才能使它适应我的代码?
- 您应该检查
pSink->Close();
返回的值以确定问题所在。 D2D1_ARC_SEGMENT::arcSize
您根本没有初始化导致 UB 并可能导致代码无法添加弧线,因为标志值很可能变为无效。