mirror of
https://github.com/palxiao/poster-design.git
synced 2025-06-20 15:42:53 +08:00
63 lines
2.4 KiB
TypeScript
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)
|
|
})
|
|
}
|