import {AssertUtil} from '../../common/AssertUtil';
import {MemoryUtil} from '../../common/MemoryUtil';
import {Event} from '../../common/lang/Event';
import {Listeners} from '../../common/lang/Listeners';
import {LoggerUtil} from '../../common/lang/LoggerUtil';
import {ObjectBase} from '../../common/lang/ObjectBase';
import {ObjectUtil} from '../../common/lang/ObjectUtil';
import {Linker} from '../../common/reflect/Linker';
import {EnvironmentService} from '../../core/service/EnvironmentService';
import {Size2} from '../../math/Size2';
import {HtmlUtil} from '../util/HtmlUtil';
//==========================================================
// 图片。
//
// @class
// @author maocy
// @history 150105
//==========================================================
export class ImageResource extends ObjectBase {
// 准备好
public ready: boolean;
// 尺寸
public size: Size2;
// 地址
public url: string;
// 句柄
public handle: HTMLImageElement;
// 加载监听器
public loadListeners: Listeners;
// 环境服务
@Linker(EnvironmentService)
public _environmentService: EnvironmentService;
//==========================================================
// 构造处理。
//==========================================================
public constructor() {
super();
// 设置属性
this.size = new Size2();
this.loadListeners = new Listeners(this);
}
//==========================================================
// 测试是否准备好。
//
// @return 是否准备好
//==========================================================
public testReady() {
return this.ready;
}
//==========================================================
// 加载完成处理。
//==========================================================
public ohLoad(hEvent) {
var self: ImageResource = (this as any).__linker;
var hImage = self.handle;
self.size.set(hImage.naturalWidth, hImage.naturalHeight);
self.ready = true;
// 处理加载事件
var event: Event = MemoryUtil.alloc(Event);
event.sender = self;
self.loadListeners.process(event);
MemoryUtil.free(event);
LoggerUtil.info(self, 'Load image success. (url={1}, size={2})', self.url, self.size);
}
//==========================================================
// 加载完成处理。
//==========================================================
public ohError(hEvent) {
var self = (this as any).__linker;
var url = self._url;
LoggerUtil.error(self, 'Load image failure. (url={1})', url);
debugger
}
/**
* 加载网络地址资源。
*
* @param uri 网络地址
* @return 同步对象
*/
public loadUrl(uri: string): Promise {
AssertUtil.debugNotEmpty(uri);
var url = this.url = this._environmentService.parseUrl(uri);
// 创建图片
var hImage = this.handle;
if (!hImage) {
hImage = this.handle = new Image();
(hImage as any).__linker = this;
hImage.onload = this.ohLoad;
hImage.onerror = this.ohError;
}
// 加载图片
hImage.src = url;
var self = this as any;
var promise = new Promise(function (resolve, reject) {
self.resolve = resolve;
self.reject = reject;
});
return promise;
}
//==========================================================
// 释放处理。
//==========================================================
public dispose() {
// 清空属性
this.size = ObjectUtil.dispose(this.size);
this.loadListeners = ObjectUtil.dispose(this.loadListeners);
this.handle = HtmlUtil.dispose(this.handle);
// 父处理
super.dispose();
}
}