How to load CanvasSvgDocument from Xml string?
I'm trying to use CanvasSvgDocument::LoadFromXml(resourcecreator, hstring) to create a CanvasSvgDocument. I'm storing the strings of various svgs so that I can quickly recreate them at CreateResources() without accessing files on disk. Though it builds fine, the call always fails with "the parameter is incorrect" and hresult_invalid_argument. Here's the code:
CanvasSvgDocument nextSvg = CanvasSvgDocument::LoadFromXml(resourceCreator, xmlString);
The resourcecreator seems correct; I can look at its properties. The xmlstring is an hstring created by loading filedata to a std::string and using to_hstring to convert it. It looks correct when examined in the debugger. I had thought the problem might be that the svgs are marked with encoding="UTF-8", and that would seem to conflict with the text being converted to wide chars. But changing the encoding reference to UTF-16, or UTF-16LE, or removing it, doesn't seem to make a difference. Creating a test string that is wide in the first place doesn't make a difference. Changing the resourceCreator to resourceCreator.Device() makes no difference, nor does using CanvasDevice::GetSharedDevice(). Is there an example of LoadFromXml as it would be correctly used in C++/winrt? There must be some basic error in this one line of code. Using VS 15.9.0 Preview 6, SDK 17763. Thanks.
[Update] A clue may lie in an answer to this question: does CanvasSvgDocument::LoadAsync() do any editing of svg data, but LoadFromXml() does not? I see that these svg files load and display if created with LoadAsync(), but LoadFromXml() crashes unless I make certain edits to the string argument. What I did was to begin with a string consisting of nothing but an empty svg and then incrementally add back elements from one of the svg files. After numerous tests I found a single reference that crashes LoadFromXml - though the same svg loads as written if via LoadAsync. It looks like this in my argument to std::wstring (added the before the " throughout).
<g id="surface1"><use xlink:href="#surface4"/></g>
remove from that the
<use xlink:href="#surface4"/>
and the svg loads without crashing, but still will not show up when drawn. The #surface4 refers to the id of a previous g element.
I don't know enough about svg to make sense of this, but if someone knows whether LoadAsync "cleans up" an svg but LoadFromXml does not, it would help in finding an answer. Perhaps it is just not possible to use LoadFromXml to load an svg using file data?
c++-winrt win2d
add a comment |
I'm trying to use CanvasSvgDocument::LoadFromXml(resourcecreator, hstring) to create a CanvasSvgDocument. I'm storing the strings of various svgs so that I can quickly recreate them at CreateResources() without accessing files on disk. Though it builds fine, the call always fails with "the parameter is incorrect" and hresult_invalid_argument. Here's the code:
CanvasSvgDocument nextSvg = CanvasSvgDocument::LoadFromXml(resourceCreator, xmlString);
The resourcecreator seems correct; I can look at its properties. The xmlstring is an hstring created by loading filedata to a std::string and using to_hstring to convert it. It looks correct when examined in the debugger. I had thought the problem might be that the svgs are marked with encoding="UTF-8", and that would seem to conflict with the text being converted to wide chars. But changing the encoding reference to UTF-16, or UTF-16LE, or removing it, doesn't seem to make a difference. Creating a test string that is wide in the first place doesn't make a difference. Changing the resourceCreator to resourceCreator.Device() makes no difference, nor does using CanvasDevice::GetSharedDevice(). Is there an example of LoadFromXml as it would be correctly used in C++/winrt? There must be some basic error in this one line of code. Using VS 15.9.0 Preview 6, SDK 17763. Thanks.
[Update] A clue may lie in an answer to this question: does CanvasSvgDocument::LoadAsync() do any editing of svg data, but LoadFromXml() does not? I see that these svg files load and display if created with LoadAsync(), but LoadFromXml() crashes unless I make certain edits to the string argument. What I did was to begin with a string consisting of nothing but an empty svg and then incrementally add back elements from one of the svg files. After numerous tests I found a single reference that crashes LoadFromXml - though the same svg loads as written if via LoadAsync. It looks like this in my argument to std::wstring (added the before the " throughout).
<g id="surface1"><use xlink:href="#surface4"/></g>
remove from that the
<use xlink:href="#surface4"/>
and the svg loads without crashing, but still will not show up when drawn. The #surface4 refers to the id of a previous g element.
I don't know enough about svg to make sense of this, but if someone knows whether LoadAsync "cleans up" an svg but LoadFromXml does not, it would help in finding an answer. Perhaps it is just not possible to use LoadFromXml to load an svg using file data?
c++-winrt win2d
add a comment |
I'm trying to use CanvasSvgDocument::LoadFromXml(resourcecreator, hstring) to create a CanvasSvgDocument. I'm storing the strings of various svgs so that I can quickly recreate them at CreateResources() without accessing files on disk. Though it builds fine, the call always fails with "the parameter is incorrect" and hresult_invalid_argument. Here's the code:
CanvasSvgDocument nextSvg = CanvasSvgDocument::LoadFromXml(resourceCreator, xmlString);
The resourcecreator seems correct; I can look at its properties. The xmlstring is an hstring created by loading filedata to a std::string and using to_hstring to convert it. It looks correct when examined in the debugger. I had thought the problem might be that the svgs are marked with encoding="UTF-8", and that would seem to conflict with the text being converted to wide chars. But changing the encoding reference to UTF-16, or UTF-16LE, or removing it, doesn't seem to make a difference. Creating a test string that is wide in the first place doesn't make a difference. Changing the resourceCreator to resourceCreator.Device() makes no difference, nor does using CanvasDevice::GetSharedDevice(). Is there an example of LoadFromXml as it would be correctly used in C++/winrt? There must be some basic error in this one line of code. Using VS 15.9.0 Preview 6, SDK 17763. Thanks.
[Update] A clue may lie in an answer to this question: does CanvasSvgDocument::LoadAsync() do any editing of svg data, but LoadFromXml() does not? I see that these svg files load and display if created with LoadAsync(), but LoadFromXml() crashes unless I make certain edits to the string argument. What I did was to begin with a string consisting of nothing but an empty svg and then incrementally add back elements from one of the svg files. After numerous tests I found a single reference that crashes LoadFromXml - though the same svg loads as written if via LoadAsync. It looks like this in my argument to std::wstring (added the before the " throughout).
<g id="surface1"><use xlink:href="#surface4"/></g>
remove from that the
<use xlink:href="#surface4"/>
and the svg loads without crashing, but still will not show up when drawn. The #surface4 refers to the id of a previous g element.
I don't know enough about svg to make sense of this, but if someone knows whether LoadAsync "cleans up" an svg but LoadFromXml does not, it would help in finding an answer. Perhaps it is just not possible to use LoadFromXml to load an svg using file data?
c++-winrt win2d
I'm trying to use CanvasSvgDocument::LoadFromXml(resourcecreator, hstring) to create a CanvasSvgDocument. I'm storing the strings of various svgs so that I can quickly recreate them at CreateResources() without accessing files on disk. Though it builds fine, the call always fails with "the parameter is incorrect" and hresult_invalid_argument. Here's the code:
CanvasSvgDocument nextSvg = CanvasSvgDocument::LoadFromXml(resourceCreator, xmlString);
The resourcecreator seems correct; I can look at its properties. The xmlstring is an hstring created by loading filedata to a std::string and using to_hstring to convert it. It looks correct when examined in the debugger. I had thought the problem might be that the svgs are marked with encoding="UTF-8", and that would seem to conflict with the text being converted to wide chars. But changing the encoding reference to UTF-16, or UTF-16LE, or removing it, doesn't seem to make a difference. Creating a test string that is wide in the first place doesn't make a difference. Changing the resourceCreator to resourceCreator.Device() makes no difference, nor does using CanvasDevice::GetSharedDevice(). Is there an example of LoadFromXml as it would be correctly used in C++/winrt? There must be some basic error in this one line of code. Using VS 15.9.0 Preview 6, SDK 17763. Thanks.
[Update] A clue may lie in an answer to this question: does CanvasSvgDocument::LoadAsync() do any editing of svg data, but LoadFromXml() does not? I see that these svg files load and display if created with LoadAsync(), but LoadFromXml() crashes unless I make certain edits to the string argument. What I did was to begin with a string consisting of nothing but an empty svg and then incrementally add back elements from one of the svg files. After numerous tests I found a single reference that crashes LoadFromXml - though the same svg loads as written if via LoadAsync. It looks like this in my argument to std::wstring (added the before the " throughout).
<g id="surface1"><use xlink:href="#surface4"/></g>
remove from that the
<use xlink:href="#surface4"/>
and the svg loads without crashing, but still will not show up when drawn. The #surface4 refers to the id of a previous g element.
I don't know enough about svg to make sense of this, but if someone knows whether LoadAsync "cleans up" an svg but LoadFromXml does not, it would help in finding an answer. Perhaps it is just not possible to use LoadFromXml to load an svg using file data?
c++-winrt win2d
c++-winrt win2d
edited Nov 22 '18 at 0:14
user3743210
asked Nov 21 '18 at 20:42
user3743210user3743210
4317
4317
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53420182%2fhow-to-load-canvassvgdocument-from-xml-string%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53420182%2fhow-to-load-canvassvgdocument-from-xml-string%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown