Как загрузить CanvasSvgDocument из файла? - PullRequest
0 голосов
/ 16 ноября 2018

В проекте C ++ / winrt у меня есть большое количество небольших ресурсов SVG для загрузки из файла. Поскольку было бы медленно перезагружать их все с диска при каждом событии CreateResources из CanvasVirtualControl, я заранее загрузил их и сохранил данные для каждого в массиве. Когда происходит CreateResources, я собираюсь загрузить CanvasSvgDocument для каждого из них, используя метод CanvasSvgDocument LoadFromXml (System.string). Однако, если я создаю svgDocument с помощью resourcecreator, я получаю неверный аргумент сбой при вызове LoadFromXml (). Аргумент resourceCreator выглядит правильно (VS Preview 6 теперь позволяет мне видеть локальные переменные!), А аргумент строки данных xml выглядит как действительные данные svg, поэтому мое лучшее предположение о сбое заключается в том, что строка данных имеет неправильный формат. Данные файла - UTF-8. Если я преобразую это в std :: wstring, как это необходимо для аргумента LoadFromXml, можно ли его понимать как байтовые данные? Например, я создаю std :: wstring таким образом, учитывая указатель на неподписанные данные char-файла и его длину в байтах:

m_data_string = std::wstring(data, data + dataLength);

Когда триггеры CreateResources запущены, на эту строку данных ссылаются следующим образом:

m_svg = CanvasSvgDocument(resourceCreator);
m_svg.LoadFromXml(resourceCreator, m_data_string);

Но LoadFromXml падает с ошибкой этого недопустимого параметра. Я вижу, что длина строки данных является правильной, но, конечно, это количество символов, а не фактический размер данных. Может ли быть конфликт между атрибутом UTF-8 в svg и тем фактом, что он теперь записывается как 16-битные символы? Если так, как можно загрузить документ XML из таких данных?

[Обновить] с предложением использовать winrt :: to_hstring. Я прочитал данные без знака в std :: string,

std::string cstring = std::string("");
cstring.assign(data, data + dataLength);

Затем я конвертирую это:

m_data_string = winrt::to_hstring(cstring);

И, наконец, попробуйте загрузить SVG, как и раньше:

m_svg.LoadFromXml(resourceCreator, m_data_string);

И он вылетает, как и раньше. Я заметил, что в отладчике преобразованная строка ни в одном случае не выглядела как бред, в обоих случаях она считывалась в отладчике как ожидаемые данные SVG. Но если эта строка имеет широкие символы, не будет ли это конфликтом с атрибутом в SVG, который идентифицирует его как UTF-8?

[Обновление] Я начинаю задумываться, не использовал ли кто-нибудь CanvasSvgDocument.Draw () для рисования SVG, загруженного из файла. Файлы теперь загружаются без сбоев без изменения их внутренней ссылки на кодировку. Но - они не будут рисовать. Эти файлы - 239 из них - UTF-8, svg 1.1, и они хорошо отображаются при открытии в Edge или любом браузере. Но если я загружаю данные файла в hstring, создаю CanvasSvgDocument, а затем использую CanvasSvgDocument.LoadFromXml, чтобы загрузить их, они не рисуются при вызове методом рисования CanvasSvgDocument. Другое рисование фигур и т. Д. Отлично работает во время сеанса рисования. Вот что может быть подсказкой: если я вызываю GetXML () для одного из этих svgs после его загрузки, возвращается только следующее:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"></svg>

То есть информация о чертеже отсутствует. Или это полная степень того, что GetXml () должен возвращать? Это не показалось бы полезным. Таким образом, возможно CanvasSvgDocument.LoadFromXml (ResourceCreator, String) на самом деле еще не работает? Итак, я снова задаюсь вопросом: есть ли способ загрузить функциональный CanvasSvgDocument из данных файла?

1 Ответ

0 голосов
/ 16 ноября 2018

Мой первый ответ здесь был неправильным: ошибка в моем коде выше заключается в том, что LoadFromXml () является статическим методом, и кто-то указал мне в другом месте, я отбрасываю возвращенный результат. Это должно быть theSvg = CanvasSvgDocument :: LoadFromXml (string). Исправив это, я вернулся к проблеме загрузки данных UTF-8 в метод, аргументом которого является строка широких символов. Изменение внутренней ссылки на UTF-16 не помогает в конце концов. Загрузка svg с помощью CanvasSvgDocument :: LoadAsync (filestream) работает, но если я хочу загрузить их без повторного доступа к диску, мне нужно будет найти способ сделать RandomAccessFileStream из буфера байтов и затем использовать LoadAsync. Я думаю. Если нет другого способа заставить LoadFromXmL () работать - в настоящее время он завершается с ошибкой неверного аргумента.

...