From 68b78e1cbc5300c0df48b7ab7a5bf7ff100a7a73 Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Mon, 16 Mar 2015 18:19:29 -0700 Subject: [PATCH] Improve ImageBuffer.clone() (fixes openfl/openfl#533) --- lime/graphics/Image.hx | 2 +- lime/graphics/ImageBuffer.hx | 41 +++++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/lime/graphics/Image.hx b/lime/graphics/Image.hx index 78341941c..4017dfe88 100644 --- a/lime/graphics/Image.hx +++ b/lime/graphics/Image.hx @@ -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); diff --git a/lime/graphics/ImageBuffer.hx b/lime/graphics/ImageBuffer.hx index 8787f1ed7..3a4b2ef63 100644 --- a/lime/graphics/ImageBuffer.hx +++ b/lime/graphics/ImageBuffer.hx @@ -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;