@leafer/image
Version:
74 lines (59 loc) • 2.47 kB
text/typescript
import { IImageManager, ILeaferImageConfig, ILeaferImage, IExportFileType, IMultimediaType } from '@leafer/interface'
import { Creator, Platform } from '@leafer/platform'
import { FileHelper, Resource } from '@leafer/file'
export const ImageManager: IImageManager = {
maxRecycled: 10,
recycledList: [],
patternTasker: Resource.queue, // 全局按顺序执行的任务队列,防止阻塞主线程
get(config: ILeaferImageConfig, type?: IMultimediaType): ILeaferImage {
let image: ILeaferImage = Resource.get(config.url)
if (!image) Resource.set(config.url, image = type === 'film' ? Creator.film(config) : Creator.image(config))
image.use++
return image
},
recycle(image: ILeaferImage): void {
if (image.parent) image = image.parent // 存在 image filters 的情况
image.use--
setTimeout(() => {
if (!image.use) {
if (Platform.image.isLarge(image)) {
if (image.url) Resource.remove(image.url)
} else {
image.clearLevels()
I.recycledList.push(image)
}
}
})
},
// maybe rewrite
recyclePaint(paint: any): void {
I.recycle(paint.image)
},
clearRecycled(force?: boolean): void {
const list = I.recycledList
if (list.length > I.maxRecycled || force) {
list.forEach(image => ((!image.use || force) && image.url) && Resource.remove(image.url))
list.length = 0
}
},
// need rewrite
clearLevels(): void { },
hasAlphaPixel(config: ILeaferImageConfig): boolean {
return FileHelper.alphaPixelTypes.some(item => I.isFormat(item, config))
},
isFormat(format: IExportFileType, config: ILeaferImageConfig): boolean {
if (config.format) return config.format === format
const { url } = config
if (url.startsWith('data:')) {
if (url.startsWith('data:' + FileHelper.mimeType(format))) return true
} else {
if (url.includes('.' + format) || url.includes('.' + FileHelper.upperCaseTypeMap[format])) return true
else if (format === 'png' && !url.includes('.')) return true // blob: 等无后缀名协议的图片无法分析类型,直接当透明图片处理
}
return false
},
destroy(): void {
this.clearRecycled(true)
}
}
const I = ImageManager