Improve ImageBuffer.clone() (fixes openfl/openfl#533)

This commit is contained in:
Joshua Granick
2015-03-16 18:19:29 -07:00
parent 04070c7ff4
commit 68b78e1cbc
2 changed files with 41 additions and 2 deletions

View File

@@ -153,7 +153,7 @@ class Image {
public function clone ():Image {
#if (js && html5)
ImageCanvasUtil.sync (this);
//ImageCanvasUtil.sync (this);
#end
var image = new Image (buffer.clone (), offsetX, offsetY, width, height, null, type);

View File

@@ -8,6 +8,8 @@ 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
@@ -48,7 +50,44 @@ class ImageBuffer {
public function clone ():ImageBuffer {
var buffer = new ImageBuffer (data, width, height, bitsPerPixel);
buffer.src = src;
#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;