From d2d34517d87db08ea84f1a2cb41fbd8e21baee0b Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Thu, 8 Jan 2015 16:58:29 -0800 Subject: [PATCH] Add BitmapData.merge --- lime/graphics/Image.hx | 34 ++++++++++++++++++++++++++ lime/graphics/utils/ImageCanvasUtil.hx | 16 ++++++++++++ lime/graphics/utils/ImageDataUtil.hx | 34 ++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) diff --git a/lime/graphics/Image.hx b/lime/graphics/Image.hx index 03cd443bd..a6968925f 100644 --- a/lime/graphics/Image.hx +++ b/lime/graphics/Image.hx @@ -524,6 +524,40 @@ class Image { } + public function merge (sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, redMultiplier:Int, greenMultiplier:Int, blueMultiplier:Int, alphaMultiplier:Int):Void { + + if (buffer == null || sourceImage == null) return; + + switch (type) { + + case CANVAS: + + ImageCanvasUtil.convertToCanvas (this); + ImageCanvasUtil.merge (this, sourceImage, sourceRect, destPoint, redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier); + + case DATA: + + #if (js && html5) + ImageCanvasUtil.convertToData (this); + ImageCanvasUtil.convertToData (sourceImage); + #end + + ImageDataUtil.merge (this, sourceImage, sourceRect, destPoint, redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier); + + case FLASH: + + sourceRect.offset (offsetX, offsetY); + buffer.__srcBitmapData.merge (sourceImage.buffer.__srcBitmapData, sourceRect.__toFlashRectangle (), destPoint.__toFlashPoint (), redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier); + + default: + + return null; + + } + + } + + public function resize (newWidth:Int, newHeight:Int):Void { switch (type) { diff --git a/lime/graphics/utils/ImageCanvasUtil.hx b/lime/graphics/utils/ImageCanvasUtil.hx index f1820096d..fb1b9fd7c 100644 --- a/lime/graphics/utils/ImageCanvasUtil.hx +++ b/lime/graphics/utils/ImageCanvasUtil.hx @@ -158,7 +158,11 @@ class ImageCanvasUtil { // TODO: Better solution? + #if (js && html5 && !dom) + buffer.data = cast buffer.__srcImageData.data; + #else buffer.data = new UInt8Array (buffer.__srcImageData.data); + #end } @@ -232,6 +236,18 @@ class ImageCanvasUtil { } + public static function merge (image:Image, sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, redMultiplier:Int, greenMultiplier:Int, blueMultiplier:Int, alphaMultiplier:Int):Void { + + convertToCanvas (sourceImage); + createImageData (sourceImage); + convertToCanvas (image); + createImageData (image); + + ImageDataUtil.merge (image, sourceImage, sourceRect, destPoint, redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier); + + } + + public static function resize (image:Image, newWidth:Int, newHeight:Int):Void { var buffer = image.buffer; diff --git a/lime/graphics/utils/ImageDataUtil.hx b/lime/graphics/utils/ImageDataUtil.hx index 092c27348..5b578ca37 100644 --- a/lime/graphics/utils/ImageDataUtil.hx +++ b/lime/graphics/utils/ImageDataUtil.hx @@ -442,6 +442,40 @@ class ImageDataUtil { } + public static function merge (image:Image, sourceImage:Image, sourceRect:Rectangle, destPoint:Vector2, redMultiplier:Int, greenMultiplier:Int, blueMultiplier:Int, alphaMultiplier:Int):Void { + + var rowOffset = Std.int (destPoint.y + image.offsetY - sourceRect.y - sourceImage.offsetY); + var columnOffset = Std.int (destPoint.x + image.offsetX - sourceRect.x - sourceImage.offsetY); + + var sourceData = sourceImage.buffer.data; + var sourceStride = sourceImage.buffer.width * 4; + var sourceOffset:Int = 0; + + var data = image.buffer.data; + var stride = image.buffer.width * 4; + var offset:Int = 0; + + for (row in Std.int (sourceRect.top + sourceImage.offsetY)...Std.int (sourceRect.bottom + sourceImage.offsetY)) { + + for (column in Std.int (sourceRect.left + sourceImage.offsetX)...Std.int (sourceRect.right + sourceImage.offsetX)) { + + sourceOffset = (row * sourceStride) + (column * 4); + offset = ((row + rowOffset) * stride) + ((column + columnOffset) * 4); + + data[offset] = Std.int (((sourceData[offset] * redMultiplier) + (data[offset] * (256 - redMultiplier))) / 256); + data[offset + 1] = Std.int (((sourceData[offset + 1] * greenMultiplier) + (data[offset + 1] * (256 - greenMultiplier))) / 256); + data[offset + 2] = Std.int (((sourceData[offset + 2] * blueMultiplier) + (data[offset + 2] * (256 - blueMultiplier))) / 256); + data[offset + 3] = Std.int (((sourceData[offset + 3] * alphaMultiplier) + (data[offset + 3] * (256 - alphaMultiplier))) / 256); + + } + + } + + image.dirty = true; + + } + + public static function multiplyAlpha (image:Image):Void { var data = image.buffer.data;