UNPKG

dragonbones-runtime

Version:

the tools to build dragonbones file for diffrent framework

326 lines (311 loc) 12.6 kB
////////////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2014-present, Egret Technology. // All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of the Egret nor the // names of its contributors may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY EGRET AND CONTRIBUTORS "AS IS" AND ANY EXPRESS // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL EGRET AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // ////////////////////////////////////////////////////////////////////////////////////// namespace egret { /** * A BitmapData object contains an array of pixel data. This data can represent either a fully opaque bitmap or a * transparent bitmap that contains alpha channel data. Either type of BitmapData object is stored as a buffer of 32-bit * integers. Each 32-bit integer determines the properties of a single pixel in the bitmap.<br/> * Each 32-bit integer is a combination of four 8-bit channel values (from 0 to 255) that describe the alpha transparency * and the red, green, and blue (ARGB) values of the pixel. (For ARGB values, the most significant byte represents the * alpha channel value, followed by red, green, and blue.) * @see egret.Bitmap * @version Egret 2.4 * @platform Web,Native * @language en_US */ /** * BitmapData 对象是一个包含像素数据的数组。此数据可以表示完全不透明的位图,或表示包含 Alpha 通道数据的透明位图。 * 以上任一类型的 BitmapData 对象都作为 32 位整数的缓冲区进行存储。每个 32 位整数确定位图中单个像素的属性。<br/> * 每个 32 位整数都是四个 8 位通道值(从 0 到 255)的组合,这些值描述像素的 Alpha 透明度以及红色、绿色、蓝色 (ARGB) 值。 * (对于 ARGB 值,最高有效字节代表 Alpha 通道值,其后的有效字节分别代表红色、绿色和蓝色通道值。) * @see egret.Bitmap * @version Egret 2.4 * @platform Web,Native * @language zh_CN */ export class BitmapData extends HashObject { /** * The width of the bitmap image in pixels. * @readOnly * @version Egret 2.4 * @platform Web,Native * @language en_US */ /** * 位图图像的宽度,以像素为单位。 * @readOnly * @version Egret 2.4 * @platform Web,Native * @language zh_CN */ width: number; /** * The height of the bitmap image in pixels. * @readOnly * @version Egret 2.4 * @platform Web,Native * @language en_US */ /** * 位图图像的高度,以像素为单位。 * @readOnly * @version Egret 2.4 * @platform Web,Native * @language zh_CN */ height: number; /** * Original bitmap image. * HTMLImageElement|HTMLCanvasElement|HTMLVideoElement * @version Egret 2.4 * @platform Web,Native * @private * @language en_US */ /** * 原始位图图像。 * HTMLImageElement|HTMLCanvasElement|HTMLVideoElement * @version Egret 2.4 * @platform Web,Native * @private * @language zh_CN */ source: any; /** * WebGL texture. * @version Egret 2.4 * @platform Web,Native * @private * @language en_US */ /** * WebGL纹理。 * @version Egret 2.4 * @platform Web,Native * @private * @language zh_CN */ webGLTexture: any; /** * Texture format. * @version Egret 2.4 * @platform Web,Native * @language en_US */ /** * 纹理格式。 * @version Egret 2.4 * @platform Web,Native * @language zh_CN */ format: string = "image"; /** * @private * webgl纹理生成后,是否删掉原始图像数据 */ $deleteSource: boolean = true; /** * Initializes a BitmapData object to refer to the specified source object. * @param source The source object being referenced. * @version Egret 2.4 * @platform Web,Native * @language en_US */ /** * 创建一个引用指定 source 实例的 BitmapData 对象 * @param source 被引用的 source 实例 * @version Egret 2.4 * @platform Web,Native * @language zh_CN */ constructor(source) { super(); this.source = source; this.width = source.width; this.height = source.height; } public static create(type: "arraybuffer", data: ArrayBuffer, callback?:(bitmapData: BitmapData)=>void): BitmapData; public static create(type: "base64", data: string, callback?:(bitmapData: BitmapData)=>void): BitmapData; public static create(type: "arraybuffer" | "base64", data: ArrayBuffer | string, callback?:(bitmapData: BitmapData)=>void): BitmapData { if (Capabilities.runtimeType === RuntimeType.WEB) { let base64 = ""; if (type === "arraybuffer") { base64 = egret.Base64Util.encode(data as ArrayBuffer); } else { base64 = data as string; } let imageType = "image/png";//default value if (base64.charAt(0) === '/') { imageType = "image/jpeg"; } else if (base64.charAt(0) === 'R') { imageType = "image/gif"; } else if (base64.charAt(0) === 'i') { imageType = "image/png"; } let img: HTMLImageElement = new Image(); img.src = "data:" + imageType + ";base64," + base64; img.crossOrigin = '*'; let bitmapData = new BitmapData(img); img.onload = function () { img.onload = undefined; bitmapData.source = img; bitmapData.height = img.height; bitmapData.width = img.width; if(callback){ callback(bitmapData); } } return bitmapData; } else { let buffer: ArrayBuffer = null; if (type === "arraybuffer") { buffer = data as ArrayBuffer; } else { buffer = egret.Base64Util.decode(data as string); } let native_texture = egret_native.Texture.createTextureFromArrayBuffer(buffer); let bitmapData = new BitmapData(native_texture); if(callback){ callback(bitmapData); } return bitmapData; } } public $dispose(): void { if (Capabilities.runtimeType == RuntimeType.WEB && Capabilities.renderMode == "webgl" && this.webGLTexture) { egret.WebGLUtils.deleteWebGLTexture(this.webGLTexture); this.webGLTexture = null; } //native or WebGLRenderTarget if (this.source && this.source.dispose) { this.source.dispose(); } this.source = null; BitmapData.$dispose(this); } private static _displayList = egret.createMap<DisplayObject[]>(); static $addDisplayObject(displayObject: DisplayObject, bitmapData: BitmapData): void { if(!bitmapData) { return; } let hashCode: number = bitmapData.hashCode; if (!hashCode) { return; } if (!BitmapData._displayList[hashCode]) { BitmapData._displayList[hashCode] = [displayObject]; return; } let tempList: Array<DisplayObject> = BitmapData._displayList[hashCode]; if (tempList.indexOf(displayObject) < 0) { tempList.push(displayObject); } } static $removeDisplayObject(displayObject: DisplayObject, bitmapData: BitmapData): void { if(!bitmapData) { return; } let hashCode: number = bitmapData.hashCode; if (!hashCode) { return; } if (!BitmapData._displayList[hashCode]) { return; } let tempList: Array<DisplayObject> = BitmapData._displayList[hashCode]; let index: number = tempList.indexOf(displayObject); if (index >= 0) { tempList.splice(index); } } static $invalidate(bitmapData: BitmapData): void { if(!bitmapData) { return; } let hashCode: number = bitmapData.hashCode; if (!hashCode) { return; } if (!BitmapData._displayList[hashCode]) { return; } let tempList: Array<DisplayObject> = BitmapData._displayList[hashCode]; for (let i: number = 0; i < tempList.length; i++) { if (tempList[i] instanceof egret.Bitmap) { (<egret.Bitmap>tempList[i]).$refreshImageData(); } let bitmap = tempList[i]; bitmap.$renderDirty = true; let p = bitmap.$parent; if (p && !p.$cacheDirty) { p.$cacheDirty = true; p.$cacheDirtyUp(); } let maskedObject = bitmap.$maskedObject; if (maskedObject && !maskedObject.$cacheDirty) { maskedObject.$cacheDirty = true; maskedObject.$cacheDirtyUp(); } } } static $dispose(bitmapData: BitmapData): void { if(!bitmapData) { return; } let hashCode: number = bitmapData.hashCode; if (!hashCode) { return; } if (!BitmapData._displayList[hashCode]) { return; } let tempList = BitmapData._displayList[hashCode]; for (let node of tempList) { if (node instanceof egret.Bitmap) { node.$bitmapData = null; } node.$renderDirty = true; let p = node.$parent; if (p && !p.$cacheDirty) { p.$cacheDirty = true; p.$cacheDirtyUp(); } let maskedObject = node.$maskedObject; if (maskedObject && !maskedObject.$cacheDirty) { maskedObject.$cacheDirty = true; maskedObject.$cacheDirtyUp(); } } delete BitmapData._displayList[hashCode]; } } }