* Caution: User should cache loaded images, but not just count on LRU. * Consider if required images more than LRU size, will dead loop occur? * * @param {string|HTMLImageElement|HTMLCanvasElement|Canvas} newImageOrSrc * @param {HTMLImageElement|HTMLCanvasElement|Canvas} image Existent image. *
(newImageOrSrc, image, hostEl, cb, cbPayload)
| 7520 | * @return {HTMLImageElement|HTMLCanvasElement|Canvas} image |
| 7521 | */ |
| 7522 | function createOrUpdateImage(newImageOrSrc, image, hostEl, cb, cbPayload) { |
| 7523 | if (!newImageOrSrc) { |
| 7524 | return image; |
| 7525 | } |
| 7526 | else if (typeof newImageOrSrc === 'string') { |
| 7527 | |
| 7528 | // Image should not be loaded repeatly. |
| 7529 | if ((image && image.__zrImageSrc === newImageOrSrc) || !hostEl) { |
| 7530 | return image; |
| 7531 | } |
| 7532 | |
| 7533 | // Only when there is no existent image or existent image src |
| 7534 | // is different, this method is responsible for load. |
| 7535 | var cachedImgObj = globalImageCache.get(newImageOrSrc); |
| 7536 | |
| 7537 | var pendingWrap = {hostEl: hostEl, cb: cb, cbPayload: cbPayload}; |
| 7538 | |
| 7539 | if (cachedImgObj) { |
| 7540 | image = cachedImgObj.image; |
| 7541 | !isImageReady(image) && cachedImgObj.pending.push(pendingWrap); |
| 7542 | } |
| 7543 | else { |
| 7544 | image = new Image(); |
| 7545 | image.onload = image.onerror = imageOnLoad; |
| 7546 | |
| 7547 | globalImageCache.put( |
| 7548 | newImageOrSrc, |
| 7549 | image.__cachedImgObj = { |
| 7550 | image: image, |
| 7551 | pending: [pendingWrap] |
| 7552 | } |
| 7553 | ); |
| 7554 | |
| 7555 | image.src = image.__zrImageSrc = newImageOrSrc; |
| 7556 | } |
| 7557 | |
| 7558 | return image; |
| 7559 | } |
| 7560 | // newImageOrSrc is an HTMLImageElement or HTMLCanvasElement or Canvas |
| 7561 | else { |
| 7562 | return newImageOrSrc; |
| 7563 | } |
| 7564 | } |
| 7565 | |
| 7566 | function imageOnLoad() { |
| 7567 | var cachedImgObj = this.__cachedImgObj; |
no test coverage detected