Files
lime/lime/graphics/ImageBuffer.hx
2015-03-16 18:19:29 -07:00

155 lines
3.4 KiB
Haxe

package lime.graphics;
import lime.utils.UInt8Array;
#if (js && html5)
import js.html.CanvasElement;
import js.html.CanvasRenderingContext2D;
import js.html.Image in HTMLImage;
import js.html.ImageData;
import js.html.Uint8ClampedArray;
import js.Browser;
#elseif flash
import flash.display.BitmapData;
#end
@:allow(lime.graphics.Image)
class ImageBuffer {
public var bitsPerPixel:Int;
public var data:UInt8Array;
public var height:Int;
public var premultiplied:Bool;
public var src (get, set):Dynamic;
public var transparent:Bool;
public var width:Int;
@:noCompletion private var __srcBitmapData:#if flash BitmapData #else Dynamic #end;
@:noCompletion private var __srcCanvas:#if (js && html5) CanvasElement #else Dynamic #end;
@:noCompletion private var __srcContext:#if (js && html5) CanvasRenderingContext2D #else Dynamic #end;
@:noCompletion private var __srcCustom:Dynamic;
@:noCompletion private var __srcImage:#if (js && html5) HTMLImage #else Dynamic #end;
@:noCompletion private var __srcImageData:#if (js && html5) ImageData #else Dynamic #end;
public function new (data:UInt8Array = null, width:Int = 0, height:Int = 0, bitsPerPixel:Int = 4) {
this.data = data;
this.width = width;
this.height = height;
this.bitsPerPixel = bitsPerPixel;
transparent = true;
}
public function clone ():ImageBuffer {
var buffer = new ImageBuffer (data, width, height, bitsPerPixel);
#if flash
if (__srcBitmapData != null) buffer.__srcBitmapData = __srcBitmapData.clone ();
#elseif (js && html5)
if (__srcImageData != null) {
buffer.__srcCanvas = cast Browser.document.createElement ("canvas");
buffer.__srcContext = cast buffer.__srcCanvas.getContext ("2d");
buffer.__srcCanvas.width = __srcImageData.width;
buffer.__srcCanvas.height = __srcImageData.height;
buffer.__srcImageData = buffer.__srcContext.createImageData (__srcImageData.width, __srcImageData.height);
var copy = new Uint8ClampedArray (__srcImageData.data);
buffer.__srcImageData.data.set (copy);
} else if (__srcCanvas != null) {
buffer.__srcCanvas = cast Browser.document.createElement ("canvas");
buffer.__srcContext = cast buffer.__srcCanvas.getContext ("2d");
buffer.__srcCanvas.width = __srcCanvas.width;
buffer.__srcCanvas.height = __srcCanvas.height;
buffer.__srcContext.drawImage (__srcCanvas, 0, 0);
} else {
buffer.__srcImage = __srcImage;
}
#else
if (data != null) {
buffer.data = new UInt8Array (data.byteLength);
var copy = new UInt8Array (data);
buffer.data.set (copy);
}
buffer.__srcCustom = __srcCustom;
#end
buffer.premultiplied = premultiplied;
buffer.transparent = transparent;
return buffer;
}
// Get & Set Methods
private function get_src ():Dynamic {
#if (js && html5)
if (__srcImage != null) return __srcImage;
return __srcCanvas;
#elseif flash
return __srcBitmapData;
#else
return __srcCustom;
#end
}
private function set_src (value:Dynamic):Dynamic {
#if (js && html5)
if (Std.is (value, HTMLImage)) {
__srcImage = cast value;
} else if (Std.is (value, CanvasElement)) {
__srcCanvas = cast value;
__srcContext = cast __srcCanvas.getContext ("2d");
}
#elseif flash
__srcBitmapData = cast value;
#else
__srcCustom = value;
#end
return value;
}
}