Я использую холст HTML5 в проекте, и иногда мне нужно рисовать тени на SVG внутри холста. Я заметил, что по сравнению с Chrome Safari при этом делает две вещи неправильно:
Эти проблемы можно проиллюстрировать следующим кодом:
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
context.shadowOffsetX = 10;
context.shadowOffsetY = 10;
context.shadowColor = 'red'
var image = new Image();
image.src = 'https://storage.googleapis.com/card-conjurer/img/manaSymbols/0.svg';
image.onload = function() {
context.drawImage(image, 10, 10, 100, 100);
}<canvas id='canvas'></canvas>Я пока не могу вставлять изображения, но вот несколько ссылок на изображения, иллюстрирующие проблему:
(это скриншоты кода выше)
Результаты Safari... довольно уродливы, как видите. Есть ли способ заставить Safari отображать SVG с тенями на холсте HTML5, как это делает Chrome?
Любая помощь будет принята с благодарностью. Большое спасибо за ваше время!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это ошибка, вы должны сообщить об этом в баг-трекер webkit.
Хотя вы можете обойти это, сначала нарисовав изображение на втором холсте, просто чтобы растеризовать это изображение svg и использовать этот холст в качестве источника для затенения:
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
var image = new Image();
image.src = 'https://storage.googleapis.com/card-conjurer/img/manaSymbols/0.svg';
image.onload = function() {
const off = canvas.cloneNode();
off.getContext('2d').drawImage(image, 10, 10, 100, 100);
context.shadowOffsetX = 10;
context.shadowOffsetY = 10;
context.shadowColor = 'red';
context.drawImage(off, 0, 0);
}<canvas id='canvas'></canvas>Чтобы использовать один холст, нам нужно использовать трюк со смещением, но это не всегда легко сделать, поскольку для этого требуется четкое знание положения нашего рисунка:
var canvas = document.getElementById('canvas');
var context = canvas.getContext('2d');
var image = new Image();
image.src = 'https://storage.googleapis.com/card-conjurer/img/manaSymbols/0.svg';
image.onload = function() {
// first pass without shadow
context.drawImage(image, 10, 10, 100, 100);
// set shadow offsets to the position in page of bottom-right corner
context.shadowOffsetX = 10 + 110;
context.shadowOffsetY = 10 + 110;
context.shadowColor = 'red';
// draw behind
context.globalCompositeOperation = "destination-over";
// draw with inverse offset, so that the image is not visible
// but the shadow is in-screen
context.drawImage(canvas, -110, -110);
}<canvas id='canvas'></canvas>