J'essaie d'adapter l'échantillon SVG direct 2D à https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/D2DSvgImage pour dessiner une chaîne SVG au lieu d'un fichier. Tout ce que j'ai fait était de remplacer le code pour ouvrir un flux à partir d'un fichier Assets. Voici l'extrait pertinent:Rendu 2D direct SVG dans UWP
void D2DSvgImageRenderer::CreateDeviceDependentResources()
{
auto d2dContext = m_deviceResources->GetD2DDeviceContext();
StorageFolder^ packageFolder = Windows::ApplicationModel::Package::Current->InstalledLocation;
// Retrieve the SVG file from the app package.
// ORIGINAL create_task(packageFolder->GetFileAsync("Assets\\drawing.svg")).then([=](StorageFile^ file)
create_task([]()
{
// Open the SVG file for reading.
// ORIGINAL return file->OpenAsync(FileAccessMode::Read);
char *svg = "<svg><circle r=\"300\" cy=\"509\" cx=\"370\" style=\"fill:#ffff00;stroke:#000000;stroke-width:5\"/></svg>";
auto stream = ref new Windows::Storage::Streams::InMemoryRandomAccessStream();
auto writer = ref new Windows::Storage::Streams::DataWriter(stream);
auto p = svg;
while (*p != '\0')
{
writer->WriteByte((unsigned char)*p);
p++;
}
create_task(writer->StoreAsync()).get();
create_task(writer->FlushAsync()).get();
return stream;
}).then([=](IRandomAccessStream^ stream)
{
// Wrap the WinRT stream with a COM stream.
ComPtr<IStream> iStream;
DX::ThrowIfFailed(
CreateStreamOverRandomAccessStream(
stream,
IID_PPV_ARGS(&iStream)
)
);
// Parse the file stream into an SVG document.
DX::ThrowIfFailed(
d2dContext->CreateSvgDocument(
iStream.Get(),
D2D1::SizeF(sc_svgSize, sc_svgSize), // Create the document at a size of 500x500 DIPs.
&m_svgDocument
)
);
});
}
Mais je suis toujours reçois le inexplicable Le paramètre est incorrect exception et il n'y a aucun moyen de déboguer la raison pour laquelle il est le cas. (DirectX ne vient pas avec un moyen de déboguer ou de fournir toute indication pourquoi et quel paramètre est incorrect !?)
Ma supposition est que l'API ne nous dira jamais caché le fait que l'utilisation InMemoryRandomAccessStream
dans CreateSvgDocument
est strictement interdite . Comment puis-je réparer cela?
A quel point êtes-vous cette exception? – VTT
Le second ThrowIfFailed, c'est-à-dire l'appel à CreateSvgDocument. Je peux confirmer que l'iStream dans l'appel précédent a un contenu correct. –
Il semble que vous n'ayez pas encore fini d'écrire. Vous devrez peut-être appeler 'writer.StoreAsync()' puis 'writer.FlushAsync()' comme décrit dans l'exemple d'utilisation de la classe ['InMemoryRandomAccessStream'] (https://docs.microsoft.com/en-us/uwp/api /Windows.Storage.Streams.InMemoryRandomAccessStream). – VTT