How to load CanvasSvgDocument from Xml string?












0















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?










share|improve this question





























    0















    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?










    share|improve this question



























      0












      0








      0








      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?










      share|improve this question
















      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






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 22 '18 at 0:14







      user3743210

















      asked Nov 21 '18 at 20:42









      user3743210user3743210

      4317




      4317
























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


          }
          });














          draft saved

          draft discarded


















          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
















          draft saved

          draft discarded




















































          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.




          draft saved


          draft discarded














          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





















































          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







          Popular posts from this blog

          android studio warns about leanback feature tag usage required on manifest while using Unity exported app?

          SQL update select statement

          'app-layout' is not a known element: how to share Component with different Modules