Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Investigate Offscreen Canvas Rendering #5355

Closed
etimberg opened this issue Mar 20, 2018 · 4 comments
Closed

Investigate Offscreen Canvas Rendering #5355

etimberg opened this issue Mar 20, 2018 · 4 comments

Comments

@etimberg
Copy link
Member

Per https://twitter.com/ebidel/status/975788240463585281 Chrome and Firefox are introducing an OffscreenCanvas than can be rendered from a web worker.

We should investigate and see if Chart.js can use this. If so, might be a good advanced topic in the documentation

@Punit-Rathod
Copy link

I was wondering if there has been any progress on this? It would be great to be able to render charts in a web worker.

@piotr-cz
Copy link

I've managed to do it, however there are few problems:

  • Chart.js expects Canvas which is an instance of HTMLElement.
    When you pass an OffscreenCanvas you'd have to add a proxy for some of it's methods and properties like getAttribute, setAttribute, classList, width, height, getBoundingClientRect, clientWidth and clientHeight.
  • Legend doesn't work
  • Events don't work

Example

let canvasElement = document.createElement('canvas')
canvasElement.width = 375
canvasElement.height = 200

if (canvasElement.transferControlToOffscreen) {
  const originalCanvasElement = canvasElement

  canvasElement = originalCanvasElement.transferControlToOffscreen()

  canvasElement.getAttribute = originalCanvasElement.getAttribute.bind(originalCanvasElement)
  canvasElement.setAttribute = originalCanvasElement.setAttribute.bind(originalCanvasElement)
  canvasElement.style = originalCanvasElement.style
  canvasElement.classList = originalCanvasElement.classList
  canvasElement.width = originalCanvasElement.width
  canvasElement.height = originalCanvasElement.height
  canvasElement.getBoundingClientRect = originalCanvasElement.getBoundingClientRect
  canvasElement.clientWidth = originalCanvasElement.clientWidth
  canvasElement.clientHeight = originalCanvasElement.clientHeight
}

new Chart(canvasElement)

More info: https://developers.google.com/web/updates/2018/08/offscreen-canvas#use_with_popular_libraries

@KasimJasarevic
Copy link

KasimJasarevic commented Oct 27, 2019

I've managed to do it, however there are few problems:

  • Chart.js expects Canvas which is an instance of HTMLElement.
    When you pass an OffscreenCanvas you'd have to add a proxy for some of it's methods and properties like getAttribute, setAttribute, classList, width, height, getBoundingClientRect, clientWidth and clientHeight.
  • Legend doesn't work
  • Events don't work

Example

let canvasElement = document.createElement('canvas')
canvasElement.width = 375
canvasElement.height = 200

if (canvasElement.transferControlToOffscreen) {
  const originalCanvasElement = canvasElement

  canvasElement = originalCanvasElement.transferControlToOffscreen()

  canvasElement.getAttribute = originalCanvasElement.getAttribute.bind(originalCanvasElement)
  canvasElement.setAttribute = originalCanvasElement.setAttribute.bind(originalCanvasElement)
  canvasElement.style = originalCanvasElement.style
  canvasElement.classList = originalCanvasElement.classList
  canvasElement.width = originalCanvasElement.width
  canvasElement.height = originalCanvasElement.height
  canvasElement.getBoundingClientRect = originalCanvasElement.getBoundingClientRect
  canvasElement.clientWidth = originalCanvasElement.clientWidth
  canvasElement.clientHeight = originalCanvasElement.clientHeight
}

new Chart(canvasElement)

More info: https://developers.google.com/web/updates/2018/08/offscreen-canvas#use_with_popular_libraries

Add canvasElement.addEventListener = originalCanvasElement.addEventListener.bind(originalCanvasElement);

How I can use this with web worker because I want to update and re render existing chart in second thread

@etimberg
Copy link
Member Author

etimberg commented Mar 6, 2021

@etimberg etimberg closed this as completed Mar 6, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants