Files
vulcan/vweb/src/emulator_display.jsx
T

26 lines
820 B
React
Raw Normal View History

2024-04-28 00:00:45 -05:00
import React, { useCallback, useEffect, useRef, useMemo } from 'react'
import { Display } from '../pkg'
2023-02-01 20:31:06 -06:00
2024-04-28 00:00:45 -05:00
export default function({ cpu }) {
2023-02-01 20:31:06 -06:00
const canvas = useRef(null)
2023-02-02 23:18:04 -06:00
const ctx = useRef(null)
2024-04-28 00:00:45 -05:00
const display = useMemo(() => new Display(), [])
2023-02-02 23:18:04 -06:00
const request = useRef(null)
const drawFrame = useCallback(() => {
2024-04-28 00:00:45 -05:00
display.draw(cpu, ctx.current)
2023-02-02 23:18:04 -06:00
request.current = requestAnimationFrame(drawFrame)
2024-04-28 00:00:45 -05:00
}, [display, cpu])
2023-02-01 20:31:06 -06:00
useEffect(() => {
2023-02-02 23:18:04 -06:00
ctx.current = canvas.current.getContext('2d')
request.current = requestAnimationFrame(drawFrame)
return () => cancelAnimationFrame(request.current)
2024-04-28 00:00:45 -05:00
}, [canvas.current, drawFrame])
2023-02-02 23:18:04 -06:00
2023-02-01 20:31:06 -06:00
return (
2024-04-28 00:00:45 -05:00
<div className='display'>
<canvas ref={canvas} width={640} height={480}></canvas>
</div>
2023-02-01 20:31:06 -06:00
)
}