|
import { computed, type Ref } from 'vue' |
|
import { CLIPPATHS, ClipPathTypes } from '@/configs/imageClip' |
|
import type { PPTImageElement } from '@/types/slides' |
|
|
|
export default (element: Ref<PPTImageElement>) => { |
|
const clipShape = computed(() => { |
|
let _clipShape = CLIPPATHS.rect |
|
|
|
if (element.value.clip) { |
|
const shape = element.value.clip.shape || ClipPathTypes.RECT |
|
_clipShape = CLIPPATHS[shape] |
|
} |
|
if (_clipShape.radius !== undefined && element.value.radius) { |
|
_clipShape = { |
|
..._clipShape, |
|
radius: `${element.value.radius}px`, |
|
style: `inset(0 round ${element.value.radius}px)`, |
|
} |
|
} |
|
|
|
return _clipShape |
|
}) |
|
|
|
const imgPosition = computed(() => { |
|
if (!element.value.clip) { |
|
return { |
|
top: '0', |
|
left: '0', |
|
width: '100%', |
|
height: '100%', |
|
} |
|
} |
|
|
|
const [start, end] = element.value.clip.range |
|
|
|
const widthScale = (end[0] - start[0]) / 100 |
|
const heightScale = (end[1] - start[1]) / 100 |
|
const left = start[0] / widthScale |
|
const top = start[1] / heightScale |
|
|
|
return { |
|
left: -left + '%', |
|
top: -top + '%', |
|
width: 100 / widthScale + '%', |
|
height: 100 / heightScale + '%', |
|
} |
|
}) |
|
|
|
return { |
|
clipShape, |
|
imgPosition, |
|
} |
|
} |