const StillImage = { props: [ 'src', 'referrerpolicy', 'mimetype', 'imageLoadError', 'imageLoadHandler', 'alt', 'height', 'width', 'dataSrc', 'loading', ], data() { return { // for lazy loading, see loadLazy() realSrc: this.src, stopGifs: this.$store.getters.mergedConfig.stopGifs, } }, computed: { animated() { if (!this.realSrc) { return false } return ( this.stopGifs && (this.mimetype === 'image/gif' || this.realSrc.endsWith('.gif')) ) }, style() { const appendPx = (str) => (/\d$/.test(str) ? str + 'px' : str) return { height: this.height ? appendPx(this.height) : null, width: this.width ? appendPx(this.width) : null, } }, }, methods: { loadLazy() { if (this.dataSrc) { this.realSrc = this.dataSrc } }, onLoad() { if (!this.realSrc) { return } const image = this.$refs.src if (!image) return this.imageLoadHandler && this.imageLoadHandler(image) const canvas = this.$refs.canvas if (!canvas) return const width = image.naturalWidth const height = image.naturalHeight canvas.width = width canvas.height = height canvas.getContext('2d').drawImage(image, 0, 0, width, height) }, onError() { this.imageLoadError && this.imageLoadError() }, }, watch: { src() { this.realSrc = this.src }, dataSrc() { this.$el.removeAttribute('data-loaded') }, }, } export default StillImage