123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- import Displayable, { DisplayableProps,
- CommonStyleProps,
- DEFAULT_COMMON_STYLE,
- DisplayableStatePropNames,
- DEFAULT_COMMON_ANIMATION_PROPS
- } from './Displayable';
- import BoundingRect from '../core/BoundingRect';
- import { ImageLike, MapToType } from '../core/types';
- import { defaults, createObject } from '../core/util';
- import { ElementCommonState } from '../Element';
- export interface ImageStyleProps extends CommonStyleProps {
- image?: string | ImageLike
- x?: number
- y?: number
- width?: number
- height?: number
- sx?: number
- sy?: number
- sWidth?: number
- sHeight?: number
- }
- export const DEFAULT_IMAGE_STYLE: CommonStyleProps = defaults({
- x: 0,
- y: 0
- }, DEFAULT_COMMON_STYLE);
- export const DEFAULT_IMAGE_ANIMATION_PROPS: MapToType<ImageProps, boolean> = {
- style: defaults<MapToType<ImageStyleProps, boolean>, MapToType<ImageStyleProps, boolean>>({
- x: true,
- y: true,
- width: true,
- height: true,
- sx: true,
- sy: true,
- sWidth: true,
- sHeight: true
- }, DEFAULT_COMMON_ANIMATION_PROPS.style)
- };
- export interface ImageProps extends DisplayableProps {
- style?: ImageStyleProps
- onload?: (image: ImageLike) => void
- }
- export type ImageState = Pick<ImageProps, DisplayableStatePropNames> & ElementCommonState
- function isImageLike(source: unknown): source is HTMLImageElement {
- return !!(source
- && typeof source !== 'string'
- // Image source is an image, canvas, video.
- && (source as HTMLImageElement).width && (source as HTMLImageElement).height);
- }
- class ZRImage extends Displayable<ImageProps> {
- style: ImageStyleProps
- // FOR CANVAS RENDERER
- __image: ImageLike
- // FOR SVG RENDERER
- __imageSrc: string
- onload: (image: ImageLike) => void
- /**
- * Create an image style object with default values in it's prototype.
- * @override
- */
- createStyle(obj?: ImageStyleProps) {
- return createObject(DEFAULT_IMAGE_STYLE, obj);
- }
- private _getSize(dim: 'width' | 'height') {
- const style = this.style;
- let size = style[dim];
- if (size != null) {
- return size;
- }
- const imageSource = isImageLike(style.image)
- ? style.image : this.__image;
- if (!imageSource) {
- return 0;
- }
- const otherDim = dim === 'width' ? 'height' : 'width';
- let otherDimSize = style[otherDim];
- if (otherDimSize == null) {
- return imageSource[dim];
- }
- else {
- return imageSource[dim] / imageSource[otherDim] * otherDimSize;
- }
- }
- getWidth(): number {
- return this._getSize('width');
- }
- getHeight(): number {
- return this._getSize('height');
- }
- getAnimationStyleProps() {
- return DEFAULT_IMAGE_ANIMATION_PROPS;
- }
- getBoundingRect(): BoundingRect {
- const style = this.style;
- if (!this._rect) {
- this._rect = new BoundingRect(
- style.x || 0, style.y || 0, this.getWidth(), this.getHeight()
- );
- }
- return this._rect;
- }
- }
- ZRImage.prototype.type = 'image';
- export default ZRImage;
|