API Docs for: 1.10.1 最后更新日期:2016年03月28日
Google搜索   
Show:

File: display/LBitmapData.js

/** @language chinese
 * <p>创建一个具有指定的宽度和高度的 LBitmapData 对象。</p>
 * <p>使用 LBitmapData 类,您可以处理 LBitmap 对象的数据(像素)。可以使用 LBitmapData 类的方法创建任意大小的Image对象,并在运行时采用多种方式操作这些图像。也可以访问使用 LLoader 类加载的Image对象。</p>
 * @class LBitmapData
 * @extends LObject
 * @constructor
 * @param {Image} image 一个Image对象。
 * @param {float} x Image可视范围x坐标(该参数可省略)。
 * @param {float} y Image可视范围y坐标(该参数可省略)。
 * @param {float} width Image可视范围宽(该参数可省略)。
 * @param {float} height Image可视范围高(该参数可省略)。
 * @param {String} dataType 指定数据格式,可以使用LBitmapData.DATA_IMAGE(Image对象)和LBitmapData.DATA_CANVAS(Canvas对象)(该参数可省略)。
 * @example
 * 	Linit(50, "mylegend", 800, 480, main);
 * 	function main () {
 * 	    var loader = new LLoader();
 * 		loader.addEventListener(LEvent.COMPLETE, loadBitmapdata);
 * 		loader.load("lufylegend.js.png", "bitmapData");
 * 	}
 * 	function loadBitmapdata (event) {
 * 		var bitmapdata = new LBitmapData(event.target);
 * 		var bitmap = new LBitmap(bitmapdata);
 * 		addChild(bitmap);
 *
 * 		var bitmapdata2 = new LBitmapData("#FF0000", 0, 0, 100, 100);
 * 		var bitmap2 = new LBitmap(bitmapdata2);
 * 		bitmap2.x = 200;
 * 		addChild(bitmap2);
 * 	}
 * @examplelink <p><a href="../../../api/LBitmapData/index.html" target="_blank">测试链接</a></p>
 * @since 1.0.0
 * @public
 */
var LBitmapData = (function() {
	function LBitmapData(image, x, y, width, height, dataType) {
		var s = this;
		LExtends(s, LObject, []);
		s.type = "LBitmapData";
		if ( typeof dataType == UNDEFINED) {
			dataType = LBitmapData.DATA_IMAGE;
		}
		s.oncomplete = null;
		s._locked = false;
		s._setPixel = false;
		/** @language chinese
		 * 位图图像的位置x,以像素为单位。
		 * @property x
		 * @type float
		 * @since 1.0.0
		 * @public
		 */
		s.x = (x == null ? 0 : x);
		/** @language chinese
		 * 位图图像的位置y,以像素为单位。
		 * @property y
		 * @type float
		 * @since 1.0.0
		 * @public
		 */
		s.y = (y == null ? 0 : y);
		/** @language chinese
		 * 位图图像的宽度,以像素为单位。
		 * @property width
		 * @type float
		 * @since 1.0.0
		 * @public
		 */
		s.width = 0;
		/** @language chinese
		 * 位图图像的高度,以像素为单位。
		 * @property height
		 * @type float
		 * @since 1.0.0
		 * @public
		 */
		s.height = 0;
		/** @language chinese
		 * 数据格式,LBitmapData.DATA_IMAGE(Image对象)或者LBitmapData.DATA_CANVAS(Canvas对象)
		 * @property dataType
		 * @type String
		 * @since 1.8.8
		 * @public
		 */
		s.dataType = null;
		if (image && typeof image == "object") {
			s.image = image;
			s.dataType = LBitmapData.DATA_IMAGE;
			s.width = (width == null ? s.image.width : width);
			s.height = (height == null ? s.image.height : height);
			s._setDataType(dataType);
		} else {
			s._createCanvas();
			s.dataType = LBitmapData.DATA_CANVAS;
			s._canvas.width = s.width = (width ? width : 1);
			s._canvas.height = s.height = (height ? height : 1);
			if ( typeof image == "string") {
				s._context.fillStyle = image;
				s._context.fillRect(0, 0, s.width, s.height);
			}else if ( typeof image == "number") {
				var d = s._context.createImageData(s.width, s.height);
				for (var i = 0; i < d.data.length; i += 4) {
					d.data[i + 0] = image >> 16 & 0xFF;
					d.data[i + 1] = image >> 8 & 0xFF;
					d.data[i + 2] = image & 0xFF;
					d.data[i + 3] = 255;
				}
				s._context.putImageData(d, 0, 0);
			}
			s.image = s._canvas;
			if (dataType == LBitmapData.DATA_IMAGE) {
				s._setDataType(dataType);
			}
		}
		s.resize();
	}
	/** @language chinese
	 * LBitmapData数据保存形式的一种,以Image对象形式保存。
	 * @property LBitmapData.DATA_IMAGE
	 * @type String
	 * @since 1.8.8
	 * @static
	 * @public
	 */
	LBitmapData.DATA_IMAGE = "data_image";
	/** @language chinese
	 * LBitmapData数据保存形式的一种,以Canvas对象形式保存。
	 * @property LBitmapData.DATA_CANVAS
	 * @type String
	 * @since 1.8.8
	 * @static
	 * @public
	 */
	LBitmapData.DATA_CANVAS = "data_canvas";
	var p = {
		_setDataType : function(dataType) {
			var s = this;
			if (s.dataType == dataType) {
				return;
			}
			if (dataType == LBitmapData.DATA_CANVAS) {
				s._createCanvas();
				s._canvas.width = s.image.width;
				s._canvas.height = s.image.height;
				s._context.clearRect(0, 0, s._canvas.width, s._canvas.height);
				s._context.drawImage(s.image, 0, 0);
				s.image = s._canvas;
			} else if (dataType == LBitmapData.DATA_IMAGE) {
				s.image = new Image();
				s.image.width = s._canvas.width;
				s.image.height = s._canvas.height;
				s.image.src = s._canvas.toDataURL();
			}
			s.dataType = dataType;
		},
		_createCanvas : function() {
			var s = this;
			if (!s._canvas) {
				s._canvas = document.createElement("canvas");
				s._context = s._canvas.getContext("2d");
			}
		},
		/** @language chinese
		 * <p>擦除LBitmapData</p>
		 * <p>使用条件:数据保存形式为LBitmapData.DATA_CANVAS。</p>
		 * @method clear
		 * @param {LRectangle} rectangle 擦除范围,默认为全部擦除。
		 * @public
		 * @since 1.9.12
		 */
		clear : function(rectangle) {
			var s = this;
			s._createCanvas();
			if(rectangle){
				s._context.clearRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
			}else{
				s._canvas.width = s.image.width;
			}
			if (s.dataType == LBitmapData.DATA_IMAGE) {
				s.image.src = s._canvas.toDataURL();
			}
		},
		/** @language chinese
		 * 用来改变LBitmapData内Image的可视范围
		 * @method setProperties
		 * @param {float} x Image可视范围x坐标。
		 * @param {float} y Image可视范围y坐标。
		 * @param {float} width Image可视范围宽。
		 * @param {float} height Image可视范围高。
		 * @example
		 * 	var bitmapdata1 = new LBitmapData(event.target, 0, 0, 200, 200);
		 * 	var bitmap1 = new LBitmap(bitmapdata1);
		 * 	addChild(bitmap1);
		 *
		 * 	var bitmapdata2 = new LBitmapData(event.target);
		 * 	bitmapdata2.setProperties(50, 100, 200, 50);
		 * 	var bitmap2 = new LBitmap(bitmapdata2);
		 * 	bitmap2.x = 240;
		 * 	addChild(bitmap2);
		 * @examplelink <p><a href="../../../api/LBitmapData/setProperties.html" target="_blank">测试链接</a></p>
		 * @public
		 * @since 1.0.0
		 */
		setProperties : function(x, y, width, height) {
			var s = this;
			s.x = x;
			s.y = y;
			s.width = width;
			s.height = height;
			s.resize();
		},
		/** @language chinese
		 * 用来改变LBitmapData内Image的可视范围的起点位置坐标
		 * @method setCoordinate
		 * @param {float} x Image可视范围x坐标。
		 * @param {float} y Image可视范围y坐标。
		 * @example
		 * 	var bitmapdata1 = new LBitmapData(event.target, 20, 20, 100, 100);
		 * 	var bitmap1 = new LBitmap(bitmapdata1);
		 * 	addChild(bitmap1);
		 *
		 * 	var bitmapdata2 = new LBitmapData(event.target, 20, 20, 100, 100);
		 * 	bitmapdata2.setCoordinate(100, 100);
		 * 	var bitmap2 = new LBitmap(bitmapdata2);
		 * 	bitmap2.x = 120;
		 * 	addChild(bitmap2);
		 * @examplelink <p><a href="../../../api/LBitmapData/setCoordinate.html" target="_blank">测试链接</a></p>
		 * @since 1.0.0
		 * @public
		 */
		setCoordinate : function(x, y) {
			var s = this;
			s.x = x;
			s.y = y;
			s.resize();
		},
		/** @language chinese
		 * 返回一个LBitmapData的克隆对象。
		 * @method clone
		 * @return {LBitmapData} 一个新的 LBitmapData 对象,它与原始对象相同.
		 * @since 1.8.2
		 * @public
		 * @example
		 * 	var bmd1 = new LBitmapData("#FF0000", 0, 0, 100, 100);
		 * 	var bm1 = new LBitmap(bmd1);
		 * 	addChild(bm1);
		 *
		 * 	var bmd2 = bmd1.clone();
		 * 	var bm2 = new LBitmap(bmd2);
		 * 	bm2.x = 120;
		 * 	addChild(bm2);
		 * @examplelink <p><a href="../../../api/LBitmapData/clone.html" target="_blank">测试链接</a></p>
		 */
		clone : function() {
			var s = this;
			return new LBitmapData(s.image, s.x, s.y, s.width, s.height, s.dataType);
		},
		_ready : function() {
			var s = this;
			s._dataType = s.dataType;
			s._setDataType(LBitmapData.DATA_CANVAS);
			s._data = s._context.getImageData(s.x, s.y, s.width, s.height);
		},
		_update : function() {
			var s = this;
			s._context.putImageData(s._data, s.x, s.y, 0, 0, s.width, s.height);
			s._setDataType(s._dataType);
			s._data = null;
		},
		/** @language chinese
		 * <p>取得一个源图像和一个滤镜对象,并生成过滤的图像。</p>
		 * <p>此方法依赖于内置滤镜对象的行为,这些对象确定受输入源矩形影响的目标矩形。</p>
		 * @method applyFilter
		 * @param {LBitmapData} sourceBitmapData 要使用的输入位图图像。源图像可以是另一个 LBitmapData 对象,也可以引用当前 LBitmapData 实例。
		 * @param {LRectangle} sourceRect 定义要用作输入的源图像区域的矩形。
		 * @param {LPoint} destPoint 目标图像(当前 LBitmapData 实例)中与源矩形的左上角对应的点。
		 * @param {LBitmapFilter} filter 用于执行过滤操作的滤镜对象。
		 * @since 1.9.11
		 * @public
		 * @examplelink <p><a href="../../../api/LBitmapData/applyFilter.html" target="_blank">测试链接</a></p>
		 */
		applyFilter : function(sourceBitmapData, sourceRect, destPoint, filter, c) {
			var s = this;
			var r = s._context.getImageData(s.x + sourceRect.x, s.y + sourceRect.y, sourceRect.width, sourceRect.height);
			var data = filter.filter(r,sourceRect.width, c);
			s.putPixels(new LRectangle(destPoint.x, destPoint.y, sourceRect.width, sourceRect.height), data);
		},
		/** @language chinese
		 * 返回一个数组,它表示 LBitmapData 对象中在特定点 (x, y) 处的 RGB 像素数据。
		 * @method getPixel
		 * @param {int} x 指定坐标点x坐标。
		 * @param {int} y 指定坐标点y坐标。
		 * @param {String} colorType 指定获取的颜色种类。[number|array](可省略)。
		 * @return {Array} 像素数据。
		 * @since 1.5.1
		 * @public
		 * @example
		 * 	var bitmapData = new LBitmapData(event.target);
		 * 	bitmapData2 = new LBitmapData(null, 0, 0, 500, 400);
		 * 	var img, imgs = [], arr;
		 * 	bitmapData.lock();
		 * 	for (var i = 0; i < 50; i++) {
		 * 		 arr = [];
		 * 		 for (var j = 0; j < 50; j++) {
		 * 			img = bitmapData.getPixel(100 + i, 100 + j);
		 * 			arr.push(img);
		 * 		}
		 * 		imgs.push(arr);
		 * 	}
		 * 	bitmapData.unlock();
		 * 	bitmapData2.lock();
		 * 	for (var i = 0; i < 50; i++) {
		 * 		arr = imgs[i];
		 * 		for (var j = 0; j < 50; j++) {
		 * 			img = arr[j];
		 * 			bitmapData2.setPixel(i, j, img);
		 * 		}
		 * 	}
		 * 	bitmapData2.unlock();
		 * 	var bitmap = new LBitmap(bitmapData);
		 * 	addChild(bitmap);
		 * 	var bitmap2 = new LBitmap(bitmapData2);
		 * 	bitmap2.x = 250;
		 * 	addChild(bitmap2);
		 * @examplelink <p><a href="../../../api/LBitmapData/getPixel.html" target="_blank">测试链接</a></p>
		 */
		getPixel : function(x, y, colorType) {
			var s = this, i, d;
			x = x >> 0;
			y = y >> 0;
			if (!s._locked) {
				s._ready();
			}
			i = s.width * 4 * y + x * 4;
			d = s._data.data;
			if (!s._locked) {
				s._update();
			}
			if (colorType == "number") {
				return d[i] << 16 | d[i + 1] << 8 | d[i + 2];
			} else {
				return [d[i], d[i + 1], d[i + 2], d[i + 3]];
			}
		},
		/** @language chinese
		 * 返回一个数组,它表示 LBitmapData 对象中在特定点 (x, y) 处的 RGB 像素数据。
		 * @method setPixel
		 * @param {int} x 指定坐标点x坐标。
		 * @param {int} y 指定坐标点y坐标。
		 * @param {Array} data 像素数据。
		 * @return {Array} 像素数据。
		 * @since 1.5.1
		 * @public
		 * @example
		 * 	var bitmapData = new LBitmapData(event.target);
		 * 	bitmapData2 = new LBitmapData(null, 0, 0, 500, 400);
		 * 	var img, imgs = [], arr;
		 * 	bitmapData.lock();
		 * 	for (var i = 0; i < 50; i++) {
		 * 		 arr = [];
		 * 		 for (var j = 0; j < 50; j++) {
		 * 			img = bitmapData.getPixel(100 + i, 100 + j);
		 * 			arr.push(img);
		 * 		}
		 * 		imgs.push(arr);
		 * 	}
		 * 	bitmapData.unlock();
		 * 	bitmapData2.lock();
		 * 	for (var i = 0; i < 50; i++) {
		 * 		arr = imgs[i];
		 * 		for (var j = 0; j < 50; j++) {
		 * 			img = arr[j];
		 * 			bitmapData2.setPixel(i, j, img);
		 * 		}
		 * 	}
		 * 	bitmapData2.unlock();
		 * 	var bitmap = new LBitmap(bitmapData);
		 * 	addChild(bitmap);
		 * 	var bitmap2 = new LBitmap(bitmapData2);
		 * 	bitmap2.x = 250;
		 * 	addChild(bitmap2);
		 * @examplelink <p><a href="../../../api/LBitmapData/setPixel.html" target="_blank">测试链接</a></p>
		 */
		setPixel : function(x, y, data) {
			var s = this;
			x = x >> 0;
			y = y >> 0;
			if (!s._locked) {
				s._ready();
			}
			var d = s._data, i = s.width * 4 * y + x * 4;
			if ( typeof data == "object") {
				d.data[i + 0] = data[0];
				d.data[i + 1] = data[1];
				d.data[i + 2] = data[2];
				d.data[i + 3] = data[3];
			} else {
				if ( typeof data == "string") {
					data = parseInt(data.replace("#", "0x"));
				}
				d.data[i + 0] = data >> 16 & 0xFF;
				d.data[i + 1] = data >> 8 & 0xFF;
				d.data[i + 2] = data & 0xFF;
				d.data[i + 3] = 255;
			}
			if (!s._locked) {
				s._update();
			}
		},
		/** @language chinese
		 * 返回一个数组,它表示 LBitmapData 对象中在特定矩形区域rect中的像素数据。
		 * @method getPixels
		 * @param {LRectangle} rect 指定矩形。
		 * @return {Array} 返回该矩形区域的像素数据。
		 * @since 1.5.1
		 * @public
		 * @example
		 * 	var bitmapData = new LBitmapData(event.target);
		 * 	bitmapData2 = new LBitmapData(null, 0, 0, 500, 400);
		 * 	var img = bitmapData.getPixels(new LRectangle(75, 50, 100, 100));
		 * 	bitmapData2.lock();
		 * 	bitmapData2.setPixels(new LRectangle(50, 30, 50, 50), img);
		 * 	bitmapData2.setPixels(new LRectangle(100, 30, 50, 50), img);
		 * 	bitmapData2.setPixels(new LRectangle(150, 30, 50, 50), img);
		 * 	bitmapData2.setPixels(new LRectangle(200, 30, 50, 50), img);
		 * 	bitmapData2.unlock();
		 *
		 * 	var bitmap = new LBitmap(bitmapData);
		 * 	addChild(bitmap);
		 *
		 * 	var bitmap2 = new LBitmap(bitmapData2);
		 * 	bitmap2.y = 250;
		 * 	addChild(bitmap2);
		 * @examplelink <p><a href="../../../api/LBitmapData/getPixels.html" target="_blank">测试链接</a></p>
		 */
		getPixels : function(rect) {
			var s = this, r;
			if (!s._locked) {
				s._ready();
			}
			r = s._context.getImageData(s.x + rect.x, s.y + rect.y, rect.width, rect.height);
			if (!s._locked) {
				s._update();
			}
			return r;
		},
		/** @language chinese
		 * 设置 LBitmapData 对象的指定区域的像素数据。
		 * @method setPixels
		 * @param {LRectangle} rect 指定矩形。
		 * @param {Array} data 像素数据。(ImageData对象 | 字符串"#000000" | 数值0x000000)
		 * @since 1.5.1
		 * @public
		 * @example
		 * 	var bitmapData = new LBitmapData(event.target);
		 * 	bitmapData2 = new LBitmapData(null, 0, 0, 500, 400);
		 * 	var img = bitmapData.getPixels(new LRectangle(75, 50, 100, 100));
		 * 	bitmapData2.lock();
		 * 	bitmapData2.setPixels(new LRectangle(50, 30, 50, 50), img);
		 * 	bitmapData2.setPixels(new LRectangle(100, 30, 50, 50), img);
		 * 	bitmapData2.setPixels(new LRectangle(150, 30, 50, 50), img);
		 * 	bitmapData2.setPixels(new LRectangle(200, 30, 50, 50), img);
		 * 	bitmapData2.unlock();
		 *
		 * 	var bitmap = new LBitmap(bitmapData);
		 * 	addChild(bitmap);
		 *
		 * 	var bitmap2 = new LBitmap(bitmapData2);
		 * 	bitmap2.y = 250;
		 * 	addChild(bitmap2);
		 * @examplelink <p><a href="../../../api/LBitmapData/setPixels.html" target="_blank">测试链接</a></p>
		 */
		setPixels : function(rect, data) {
			var s = this, i, j, d, w, sd, x, y;
			if (!s._locked) {
				s._ready();
			}
			d = s._data;
			if ( typeof data == "object") {
				w = s._canvas.width;
				for ( x = rect.x; x < rect.right; x++) {
					for ( y = rect.y; y < rect.bottom; y++) {
						i = w * 4 * (s.y + y) + (s.x + x) * 4;
						j = data.width * 4 * (y - rect.y) + (x - rect.x) * 4;
						d.data[i + 0] = data.data[j + 0];
						d.data[i + 1] = data.data[j + 1];
						d.data[i + 2] = data.data[j + 2];
						d.data[i + 3] = data.data[j + 3];
					}
				}
			} else {
				if ( typeof data == "string") {
					data = parseInt(data.replace("#", "0x"));
				}
				data = [data >> 16 & 0xFF, data >> 8 & 0xFF, data & 0xFF];
				w = s._canvas.width;
				for ( x = rect.x; x < rect.right; x++) {
					for ( y = rect.y; y < rect.bottom; y++) {
						i = w * 4 * (s.y + y) + (s.x + x) * 4;
						d.data[i + 0] = data[0];
						d.data[i + 1] = data[1];
						d.data[i + 2] = data[2];
						d.data[i + 3] = 255;
					}
				}
			}
			if (!s._locked) {
				s._update();
			}
		},
		/** @language chinese
		 * <p>设置 LBitmapData 对象的指定区域的像素数据。使用条件如下:</p>
		 * <p>1,数据保存形式为LBitmapData.DATA_CANVAS。</p>
		 * <p>2,每桢单次或少量次数操作,且不与setPixel,setPixels,getPixel,getPixels等函数同时进行。</p>
		 * <p>满足以上两个条件,可以使用putPixels来代替setPixels来更快速的设置像素,且不需要lock和unlock。</p>
		 * @method putPixels
		 * @param {LRectangle} rect 指定矩形。
		 * @param {Array} data 像素数据。(ImageData对象)
		 * @since 1.9.1
		 * @public
		 * @example
		 * 	var bitmapData = new LBitmapData(event.target);
		 * 	bitmapData2 = new LBitmapData(null, 0, 0, 500, 400,LBitmapData.DATA_CANVAS);
		 * 	bitmapData.lock();
		 * 	var img = bitmapData.getPixels(new LRectangle(75, 50, 100, 100));
		 * 	bitmapData.unlock();
		 *
		 * 	bitmapData2.putPixels(new LRectangle(50, 30, 50, 50), img);
		 *
		 * 	var bitmap = new LBitmap(bitmapData);
		 * 	addChild(bitmap);
		 *
		 * 	var bitmap2 = new LBitmap(bitmapData2);
		 * 	bitmap2.y = 250;
		 * 	addChild(bitmap2);
		 * @examplelink <p><a href="../../../api/LBitmapData/putPixels.html" target="_blank">测试链接</a></p>
		 */
		putPixels : function(rect, data) {
			var s = this;
			if (s.dataType != LBitmapData.DATA_CANVAS || typeof data != "object") {
				return;
			}
			s._context.putImageData(data, s.x + rect.x, s.y + rect.y, 0, 0, rect.width, rect.height);
		},
		/** @language chinese
		 * 此函数将操作对象锁定,保证操作对象在另一个临时操作的canvas上只绘制一遍。
		 * @method lock
		 * @since 1.5.1
		 * @public
		 */
		lock : function() {
			var s = this;
			s._locked = true;
			s._ready();
		},
		/** @language chinese
		 * 拷贝像素等操作结束后,解除对操作对象的锁定。
		 * @method unlock
		 * @since 1.5.1
		 * @public
		 */
		unlock : function() {
			var s = this;
			s._locked = false;
			s._update();
		},
		/** @language chinese
		 * 在LBitmapData位图图像上绘制 source 显示对象。可以指定 matrix、colorTransform、blendMode 和目标 clipRect 参数来控制呈现的执行方式。您可以根据需要指定是否应在缩放时对位图进行平滑处理。
		 * @method draw
		 * @param {LDisplayObject|LBitmapData} source 要绘制到 LBitmapData 对象的显示对象或 LBitmapData 对象。
		 * @param {LMatrix} matrix 一个 Matrix 对象,用于缩放、旋转位图或转换位图的坐标。如果不想将矩阵转换应用于图像,请将此参数设置为恒等矩阵(使用默认 new LMatrix() 构造函数创建),或传递 null 值。
		 * @param {LColorTransform} colorTransform 一个 LColorTransform 对象,用于调整位图的颜色值。如果没有提供任何对象,则不会转换位图图像的颜色。如果必须传递此参数但又不想转换图像,请将此参数设置为使用默认 new LColorTransform() 构造函数创建的 LColorTransform 对象。<p><a href="../../../api/LBitmapData/draw2.html" target="_blank">测试链接</a></p>
		 * @param {string} blendMode 来自 LBlendMode 类的一个字符串值,指定要应用于所生成位图的混合模式。<p><a href="../../../api/LBitmapData/draw2.html" target="_blank">测试链接</a></p>
		 * @param {LRectangle} clipRect 一个 LRectangle 对象,定义要绘制的源对象的区域。 如果不提供此值,则不会进行剪裁,并且将绘制整个源对象。<p><a href="../../../api/LBitmapData/draw2.html" target="_blank">测试链接</a></p>
		 * @since 1.7.7
		 * @public
		 * @example
		 * 	var layer = new LSprite();
		 * 	layer.graphics.drawRect(1, "#000000", [0, 0, 100, 100], true, "#000000");
		 * 	layer.graphics.drawRect(1, "#FF0000", [100, 0, 100, 100], true, "#FF0000");
		 * 	addChild(layer);
		 *
		 * 	var bitmapData = new LBitmapData(null, 0, 0, 500, 400);
		 * 	bitmapData.draw(layer);
		 * 	var bitmap = new LBitmap(bitmapData);
		 * 	bitmap.y = 150;
		 * 	addChild(bitmap);
		 * @examplelink <p><a href="../../../api/LBitmapData/draw.html" target="_blank">测试链接</a></p>
		 */
		draw : function(source, matrix, colorTransform, blendMode, clipRect) {
			var s = this, c, bd = source, x, y, w, h, save = false;
			var _dataType = s.dataType;
			s._setDataType(LBitmapData.DATA_CANVAS);
			if (matrix || colorTransform || blendMode || clipRect) {
				s._context.save();
				save = true;
			}
			if (clipRect) {
				if (!( bd instanceof LBitmapData)) {
					x = y = 0;
				} else {
					x = bd.x;
					y = bd.y;
				}
				bd = new LBitmapData(bd.getDataCanvas(), x + clipRect.x, y + clipRect.y, clipRect.width, clipRect.height, LBitmapData.DATA_CANVAS);
			}
			w = bd.getWidth() >>> 0;
			h = bd.getHeight() >>> 0;
			if (w == 0 || h == 0) {
				s._setDataType(_dataType);
				return;
			}
			c = bd.getDataCanvas();
			if (colorTransform) {
				bd.colorTransform(new LRectangle(0, 0, w, h), colorTransform);
				c = bd.image;
			}
			if (matrix) {
				s._context.setTransform(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);
			}
			if (blendMode) {
				s._context.globalCompositeOperation = blendMode;
			}
			s._context.drawImage(c, bd.x, bd.y, w, h, 0, 0, w, h);
			if (save) {
				s._context.restore();
			}
			s._setDataType(_dataType);
			s.resize();
		},
		getDataCanvas : function() {
			var s = this;
			var _dataType = s.dataType;
			s._setDataType(LBitmapData.DATA_CANVAS);
			s._setDataType(_dataType);
			return s._canvas;
		},
		getWidth : function() {
			return this.width;
		},
		getHeight : function() {
			return this.height;
		},
		resize : function() {
			var s = this, w = s.image.width - s.x, h = s.image.height - s.y;
			s.width = s.width < w ? s.width : w;
			s.height = s.height < h ? s.height : h;
		},
		/** @language chinese
		 * <p>使用 LColorTransform 对象调整位图图像的指定区域中的颜色值。如果矩形与位图图像的边界匹配,则此方法将转换整个图像的颜色值。</p>
		 * <p>使用条件:数据保存形式为LBitmapData.DATA_CANVAS。</p>
		 * @method colorTransform
		 * @param {LRectangle} rect 一个 LRectangle 对象,它定义在其中应用 LColorTransform 对象的图像区域。
		 * @param {LColorTransform} colorTransform 一个 LColorTransform 对象,它描述要应用的颜色转换值。
		 * @since 1.9.4
		 * @public
		 * @example
		 * 	LInit(50, "legend", 800, 480, main);
		 * 	function main () {
		 * 		var loader = new LLoader();
		 * 		loader.addEventListener(LEvent.COMPLETE, loadBitmapdata);
		 * 		loader.load("face.jpg", "bitmapData");
		 * 	}
		 * 	function loadBitmapdata (event) {
		 * 		var bitmapData = new LBitmapData(event.target, 0, 0, 240, 240, LBitmapData.DATA_CANVAS);
		 * 		var rect = new LRectangle(50, 50, 90, 90);
		 * 		var colorTransform = new LColorTransform(0.5, 0.7, 0.4, 1, 0, 0, 0, 0);
		 * 		bitmapData.colorTransform(rect, colorTransform);
		 * 		var bitmap = new LBitmap(bitmapData);
		 * 		addChild(bitmap);
		 * 	}
		 * @examplelink <p><a href="../../../api/LBitmapData/colorTransform.html" target="_blank">测试链接</a></p>
		 */
		colorTransform : function(rect, colorTransform) {
			var s = this;
			if (s.dataType != LBitmapData.DATA_CANVAS) {
				return;
			}
			var x = rect.x >> 0, y = rect.y >> 0, w = rect.width >> 0, h = rect.height >> 0;
			var img = s._context.getImageData(s.x + rect.x, s.y + rect.y, rect.width, rect.height);
			var data = img.data;
			for (var i = 0, l = data.length; i < l; i += 4) {
				var r = i, g = i + 1, b = i + 2, a = i + 3;
				data[r] = data[r] * colorTransform.redMultiplier + colorTransform.redOffset;
				data[g] = data[g] * colorTransform.greenMultiplier + colorTransform.greenOffset;
				data[b] = data[b] * colorTransform.blueMultiplier + colorTransform.blueOffset;
				data[a] = data[a] * colorTransform.alphaMultiplier + colorTransform.alphaOffset;
			}
			s._context.putImageData(img, s.x + rect.x, s.y + rect.y, 0, 0, rect.width, rect.height);
		},
		/** @language chinese
		 * <p>此方法在目标 LBitmapData 对象的目标点将源图像的矩形区域复制为同样大小的矩形区域。</p>
		 * <p>使用条件:数据保存形式为LBitmapData.DATA_CANVAS。</p>
		 * @method copyPixels
		 * @param {LBitmapData} sourceBitmapData 要从中复制像素的输入位图图像。源图像可以是另一个 LBitmapData 实例,也可以指当前 LBitmapData 实例。
		 * @param {LRectangle} sourceRect 定义要用作输入的源图像区域的矩形。
		 * @param {LPoint} destPoint 目标点,它表示将在其中放置新像素的矩形区域的左上角。
		 * @since 1.9.4
		 * @public
		 * @example
		 * 	LInit(50, "legend", 800, 480, main);
		 * 	function main () {
		 * 		var loader = new LLoader();
		 * 		loader.addEventListener(LEvent.COMPLETE, loadBitmapdata);
		 * 		loader.load("face.jpg", "bitmapData");
		 * 	}
		 * 	function loadBitmapdata (event) {
		 * 		var bitmapData = new LBitmapData(event.target);
		 * 		bitmapData2 = new LBitmapData(null, 0, 0, 240, 240, LBitmapData.DATA_CANVAS);
		 * 		bitmapData2.copyPixels(bitmapData, new LRectangle(0, 0, 240, 240), new LPoint(0,0));
		 * 		bitmapData2.copyPixels(bitmapData, new LRectangle(50, 50, 100, 100), new LPoint(0,50));
		 * 		bitmapData2.copyPixels(bitmapData, new LRectangle(100, 50, 100, 100), new LPoint(50,150));
		 *
		 * 		var bitmap = new LBitmap(bitmapData);
		 * 		addChild(bitmap);
		 *
		 * 		var bitmap2 = new LBitmap(bitmapData2);
		 * 		bitmap2.y = 250;
		 * 		addChild(bitmap2);
		 * 	}
		 * @examplelink <p><a href="../../../api/LBitmapData/copyPixels.html" target="_blank">测试链接</a></p>
		 */
		copyPixels : function(sourceBitmapData, sourceRect, destPoint) {
			var s = this, left, top, width, height, bd = sourceBitmapData;
			if (s.dataType != LBitmapData.DATA_CANVAS) {
				return;
			}
			left = bd.x;
			top = bd.y;
			width = bd.width;
			height = bd.height;
			bd.setProperties(sourceRect.x + bd.x, sourceRect.y + bd.y, sourceRect.width, sourceRect.height);
			s._context.drawImage(bd.image, bd.x, bd.y, bd.width, bd.height, destPoint.x, destPoint.y, bd.width, bd.height);
			bd.x = left;
			bd.y = top;
			bd.width = width;
			bd.height = height;
		}
	};
	for (var k in p) {
		LBitmapData.prototype[k] = p[k];
	}
	return LBitmapData;
})();