Fix the Windows icon generation, add Bitmap encoding support, break JPG/PNG support into separate lime.graphics.format.* class files

This commit is contained in:
Joshua Granick
2015-01-07 22:18:07 -08:00
parent ec2056842e
commit 003170b782
5 changed files with 342 additions and 128 deletions

View File

@@ -14,6 +14,7 @@ import helpers.FileHelper;
import helpers.ImageHelper;
import helpers.LogHelper;
import helpers.PathHelper;
import lime.graphics.format.BMP;
import lime.graphics.Image;
import lime.math.Rectangle;
import lime.utils.ByteArray;
@@ -139,9 +140,9 @@ class IconHelper {
public static function createWindowsIcon (icons:Array <Icon>, targetPath:String):Bool {
var sizes = [ 16, 24, 32, 40, 48, 64, 96, 128, 256 ];
var images = new Array <Image> ();
var data_pos = 6;
var images = new Array <Image> ();
var imageData = new Array <ByteArray> ();
for (size in sizes) {
@@ -149,101 +150,56 @@ class IconHelper {
if (image != null) {
images.push (image);
data_pos += 16;
}
}
var ico = new ByteArray ();
ico.bigEndian = false;
ico.writeShort (0);
ico.writeShort (1);
ico.writeShort (images.length);
for (image in images) {
var size = image.width;
var xor_size = size * size * 4;
var and_size = size * size >> 3;
ico.writeByte (size);
ico.writeByte (size);
ico.writeByte (0); // palette
ico.writeByte (0); // reserved
ico.writeShort (1); // planes
ico.writeShort (32); // bits per pixel
ico.writeInt (40 + xor_size + and_size); // Data size
ico.writeInt (data_pos); // Data offset
data_pos += 40 + xor_size + and_size;
}
for (image in images) {
var size = image.width;
var xor_size = size * size * 4;
var and_size = size * size >> 3;
ico.writeInt (40); // size (bytes)
ico.writeInt (size);
ico.writeInt (size * 2);
ico.writeShort (1);
ico.writeShort (32);
ico.writeInt (0); // Bit fields...
ico.writeInt (xor_size + and_size); // Size...
ico.writeInt (0); // res-x
ico.writeInt (0); // res-y
ico.writeInt (0); // cols
ico.writeInt (0); // important
var bits = image.getPixels (new Rectangle (0, 0, size, size));
var and_mask = new ByteArray ();
for (y in 0...size) {
var mask = 0;
var bit = 128;
bits.position = (size-1 - y) * 4 * size;
for (i in 0...size) {
if (size < 256) {
var a = bits.readByte ();
var r = bits.readByte ();
var g = bits.readByte ();
var b = bits.readByte ();
ico.writeByte (b);
ico.writeByte (g);
ico.writeByte (r);
ico.writeByte (a);
imageData.push (BMP.encode (image, ICO));
if (a < 128)
mask |= bit;
} else {
bit = bit >> 1;
if (bit == 0) {
and_mask.writeByte (mask);
bit = 128;
mask = 0;
}
imageData.push (image.encode ("png"));
}
images.push (image);
}
ico.writeBytes (and_mask, 0, and_mask.length);
}
var icon = new ByteArray ();
icon.bigEndian = false;
icon.writeShort (0);
icon.writeShort (1);
icon.writeShort (images.length);
var dataOffset = 6 + (16 * images.length);
for (i in 0...images.length) {
var size = images[i].width;
icon.writeByte (size > 255 ? 0 : size);
icon.writeByte (size > 255 ? 0 : size);
icon.writeByte (0);
icon.writeByte (0);
icon.writeShort (1);
icon.writeShort (32);
icon.writeInt (imageData[i].length);
icon.writeInt (dataOffset);
dataOffset += imageData[i].length;
}
for (data in imageData) {
icon.writeBytes (data);
}
if (images.length > 0) {
var file = File.write (targetPath, true);
file.writeBytes (ico, 0, ico.length);
file.close ();
File.saveBytes (targetPath, icon);
return true;
}