2024-03-11 01:33:47 +08:00

63 lines
2.4 KiB
TypeScript

import { EventType, UPDATE_BOARDRECT_DEBOUNCE_TIME } from '../constants'
import { resizeCanvas } from '../helpers/dom-helper'
import { computeBoardRect } from '../helpers/init-compute'
import { initMatting } from '../helpers/init-matting'
import { MattingProps, UseInitMattingBoardsConfig } from '../types/init-matting'
import { debounce } from 'throttle-debounce'
import { onMounted, onUnmounted, watch } from 'vue'
export function useInitMattingBoards(props: MattingProps, useInitMattingBoardsConfig: UseInitMattingBoardsConfig) {
const { picFile } = props
const {
boardContexts,
boardContexts: { inputCtx, outputCtx, inputHiddenCtx, outputHiddenCtx },
} = useInitMattingBoardsConfig
const { initMattingResult, width, height, initialized } = useInitMattingBoardsConfig
const { boardRect, transformConfig, mattingSources } = useInitMattingBoardsConfig
const updateBoardRect = () => {
boardRect.value = computeBoardRect((inputCtx.value as CanvasRenderingContext2D).canvas)
}
const resizeBoards = () => {
requestAnimationFrame(() => {
const commonConfig = { targetHeight: height.value, targetWidth: width.value, transformConfig }
resizeCanvas({
ctx: inputCtx.value as CanvasRenderingContext2D,
hiddenCtx: inputHiddenCtx.value,
...commonConfig,
})
resizeCanvas({
ctx: outputCtx.value as CanvasRenderingContext2D,
hiddenCtx: outputHiddenCtx.value,
withBorder: true,
...commonConfig,
})
})
}
watch([picFile], async () => {
if (picFile.value && width.value && height.value) {
initialized.value = false
initMattingResult.value = await initMatting({
boardContexts,
picFile: picFile.value,
targetSize: { width: width.value, height: height.value },
transformConfig: {},
imageSources: {},
})
const { raw, mask, orig, positionRange, scaleRatio } = initMattingResult.value
transformConfig.positionRange = positionRange
transformConfig.scaleRatio = scaleRatio
mattingSources.value = { raw, mask, orig }
updateBoardRect()
resizeBoards()
initialized.value = true
}
})
onMounted(() => {
window.addEventListener(EventType.Resize, resizeBoards)
window.addEventListener('scroll', debounce(UPDATE_BOARDRECT_DEBOUNCE_TIME, updateBoardRect))
})
onUnmounted(() => {
window.removeEventListener(EventType.Resize, resizeBoards)
})
}