-
Известно, что
<canvas>
2d context считает центром самого первого пикселя координату(0.5, 0.5)
, потому что координаты он считает не как индексы пикселей, а как координаты, мать её, сетки, между которыми пиксели стоят. Координата(0, 0)
обозначает не самый верхний левый пиксель, а верхнюю-левую вершину этого пикселя. Поэтому если ты пустил линию(0, 0, 10, 0)
, то получишь что-то размытое антиалиасингом серое между двумя рядами пикселями. Причём, верхнюю половину размытой линии ты не увидишь, у ибо она будет тянуться до -0.5, а экран у тебя от 0. Некоторые делаютcontext.translate(0.5, 0.5)
и так живут, а некоторые + 0.5 везде пишут. Дурка, короче, но не суть. -
Но есть ещё
OffscreenCanvas
, чтобы в памяти рисовать спрайты (например), быстро рисуемые на другом канвасе.
Теперь зацените прикол:
-
Выключаем на главном наэкранном канвасе всякий там
context.stanslate(0.5, 0.5)
и рисуем линию по целочисленным координатам. Ожидаемо видим размытую хрень. Ладно, понятно. -
Теперь, берём и то же самое рисуем на
OffscreenCanvas
, ожидая что в памяти в пиксельный буфер будут отрендерены такие же размытые линии. Далее методомcontext.drawImage(my_offscreen_canvas)
пихаем нарисованное на нашемOffscreenCanvas
главный канвас. И хоба, никакого размытия мы не видим, все линии чоткие пацанские.
Как так-то?