Improve Flash target color conversion (Image API)

This commit is contained in:
Joshua Granick
2015-07-22 18:36:22 -07:00
parent 816166c44d
commit c637863cb7

View File

@@ -12,6 +12,9 @@ import lime.graphics.format.JPEG;
import lime.graphics.format.PNG;
import lime.graphics.utils.ImageCanvasUtil;
import lime.graphics.utils.ImageDataUtil;
import lime.math.color.ARGB;
import lime.math.color.BGRA;
import lime.math.color.RGBA;
import lime.math.ColorMatrix;
import lime.math.Rectangle;
import lime.math.Vector2;
@@ -388,8 +391,16 @@ class Image {
case FLASH:
rect.offset (offsetX, offsetY);
if (format == null || format == RGBA32) color = ((color & 0xFF) << 24) | (color >> 8);
buffer.__srcBitmapData.fillRect (rect.__toFlashRectangle (), color);
var argb:ARGB = switch (format) {
case ARGB32: color;
case BGRA32: (color:BGRA);
default: (color:RGBA);
}
buffer.__srcBitmapData.fillRect (rect.__toFlashRectangle (), argb);
default:
@@ -418,8 +429,15 @@ class Image {
case FLASH:
if (format == null || format == RGBA32) color = ((color & 0xFF) << 24) | (color >> 8);
buffer.__srcBitmapData.floodFill (x + offsetX, y + offsetY, color);
var argb:ARGB = switch (format) {
case ARGB32: color;
case BGRA32: (color:BGRA);
default: (color:RGBA);
}
buffer.__srcBitmapData.floodFill (x + offsetX, y + offsetY, argb);
default:
@@ -536,15 +554,13 @@ class Image {
case FLASH:
var color = buffer.__srcBitmapData.getPixel (x + offsetX, y + offsetY);
var color:ARGB = buffer.__srcBitmapData.getPixel (x + offsetX, y + offsetY);
if (format == null || format == RGBA32) {
switch (format) {
return ((color & 0xFF) << 24) | (color >> 8);
} else {
return color;
case ARGB32: return color;
case BGRA32: var bgra:BGRA = color; return bgra;
default: var rgba:RGBA = color; return rgba;
}
@@ -577,15 +593,13 @@ class Image {
case FLASH:
var color = buffer.__srcBitmapData.getPixel32 (x + offsetX, y + offsetY);
var color:ARGB = buffer.__srcBitmapData.getPixel32 (x + offsetX, y + offsetY);
if (format == null || format == RGBA32) {
switch (format) {
return ((color & 0xFF) << 24) | (color >> 8);
} else {
return color;
case ARGB32: return color;
case BGRA32: var bgra:BGRA = color; return bgra;
default: var rgba:RGBA = color; return rgba;
}
@@ -621,20 +635,38 @@ class Image {
rect.offset (offsetX, offsetY);
var byteArray = buffer.__srcBitmapData.getPixels (rect.__toFlashRectangle ());
if (format == null || format == RGBA32) {
switch (format) {
var color;
var length = Std.int (byteArray.length / 4);
for (i in 0...length) {
case ARGB32: // do nothing
case BGRA32:
color = byteArray.readUnsignedInt ();
byteArray.position -= 4;
byteArray.writeUnsignedInt (((color & 0xFF) << 24) | (color >> 8));
var color:BGRA;
var length = Std.int (byteArray.length / 4);
}
for (i in 0...length) {
color = (byteArray.readUnsignedInt ():ARGB);
byteArray.position -= 4;
byteArray.writeUnsignedInt (color);
}
byteArray.position = 0;
byteArray.position = 0;
default:
var color:RGBA;
var length = Std.int (byteArray.length / 4);
for (i in 0...length) {
color = (byteArray.readUnsignedInt ():ARGB);
byteArray.position -= 4;
byteArray.writeUnsignedInt (color);
}
byteArray.position = 0;
}
@@ -771,8 +803,15 @@ class Image {
case FLASH:
if (format == null || format == RGBA32) color = ((color & 0xFF) << 24) | (color >> 8);
buffer.__srcBitmapData.setPixel (x + offsetX, y + offsetX, color);
var argb:ARGB = switch (format) {
case ARGB32: color;
case BGRA32: (color:BGRA);
default: (color:RGBA);
}
buffer.__srcBitmapData.setPixel (x + offsetX, y + offsetX, argb);
default:
@@ -801,8 +840,15 @@ class Image {
case FLASH:
if (format == null || format == RGBA32) color = ((color & 0xFF) << 24) | (color >> 8);
buffer.__srcBitmapData.setPixel32 (x + offsetX, y + offsetY, color);
var argb:ARGB = switch (format) {
case ARGB32: color;
case BGRA32: (color:BGRA);
default: (color:RGBA);
}
buffer.__srcBitmapData.setPixel32 (x + offsetX, y + offsetY, argb);
default:
@@ -833,27 +879,54 @@ class Image {
case FLASH:
rect.offset (offsetX, offsetY);
if (format == null || format == RGBA32) {
switch (format) {
var srcData = byteArray;
byteArray = new ByteArray ();
#if flash
byteArray.length = srcData.length;
#end
var color;
var length = Std.int (byteArray.length / 4);
for (i in 0...length) {
case ARGB32: // do nothing
case BGRA32:
color = srcData.readUnsignedInt ();
byteArray.writeUnsignedInt (((color & 0xFF) << 24) | (color >> 8));
var srcData = byteArray;
byteArray = new ByteArray ();
#if flash
byteArray.length = srcData.length;
#end
}
var color:BGRA;
var length = Std.int (byteArray.length / 4);
for (i in 0...length) {
color = srcData.readUnsignedInt ();
byteArray.writeUnsignedInt (cast (color, ARGB));
}
srcData.position = 0;
byteArray.position = 0;
default:
var srcData = byteArray;
byteArray = new ByteArray ();
#if flash
byteArray.length = srcData.length;
#end
var color:RGBA;
var length = Std.int (byteArray.length / 4);
for (i in 0...length) {
color = srcData.readUnsignedInt ();
byteArray.writeUnsignedInt (cast (color, ARGB));
}
srcData.position = 0;
byteArray.position = 0;
srcData.position = 0;
byteArray.position = 0;
}
buffer.__srcBitmapData.setPixels (rect.__toFlashRectangle (), byteArray);
default: