2017-08-16 3 views
0

je suit chemin SVG:Tracer un chemin SVG avec Direct2D: Ne peut pas dessiner un arc elliptique

<?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> 

Pour facile de lecture:

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 

Je suis en train de convertir en un ID2D1PathGeometry. Voici le code:

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); 

Bien que je puisse convertir des lignes et bezier avec succès, j'ai échoué à convertir les arcs.
Par exemple, le code ci-dessus ne dessinerai pas quoi que ce soit, mais si je les commentaires suivants lignes:

// pSink->AddArc(&arc); 

Il dessine une forme, mais ne sera certainement pas exactement ce qui est émis par le navigateur Chrome, en raison du manque certains segments .

Question:

1.

Quelle est l'erreur dans mon code qui me dessine la géométrie avec empêcher le segment Arcs? Comment le réparer?

2.

Dans w3.org document, un segment de l'arc ont follwing valeur:

rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, x, y 

Alors que je peux mettre rx, ry, x_axis_rotation, sweep_flag, x, y, je ne vois pas la membre large_arc_flag dans D2D1_ARC_SEGMENT struct. Comment puis-je l'adapter à mon code?

+0

Est-ce que cela aide? https://dxr.mozilla.org/mozilla-central/source/gfx/2d/PathD2D.cpp –

Répondre

1
  1. Vous devez inspecter la valeur renvoyée par pSink->Close(); pour déterminer ce qui s'est passé.
  2. D2D1_ARC_SEGMENT::arcSize que vous n'initialisiez pas du tout provoquant UB et provoquant potentiellement l'échec de l'ajout de l'arc de code puisque la valeur de l'indicateur est très probablement invalide.