Add BitmapData.merge

This commit is contained in:
Joshua Granick
2015-01-08 16:58:29 -08:00
parent cf447330d1
commit d2d34517d8
3 changed files with 84 additions and 0 deletions

View File

@@ -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) {

View File

@@ -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;

View File

@@ -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;