palette bitmaps support

This commit is contained in:
2016-10-15 05:01:56 +07:00
parent 61c053af15
commit 0f045402f4
3 changed files with 60 additions and 14 deletions

View File

@@ -193,5 +193,9 @@ namespace FTSwfTools {
target.Position = 0;
return target;
}
static public SwfStreamReader DecompressZBytesToReader(byte[] compressd_bytes) {
return new SwfStreamReader(DecompressZBytes(compressd_bytes));
}
}
}

View File

@@ -1,4 +1,6 @@
namespace FTSwfTools.SwfTags {
using FTSwfTools.SwfTypes;
namespace FTSwfTools.SwfTags {
public class DefineBitsLossless2Tag : SwfTagBase {
public ushort CharacterId;
public byte BitmapFormat;
@@ -36,10 +38,29 @@
}
public byte[] ToARGB32() {
var result = new byte[BitmapWidth * BitmapHeight * 4];
var swf_reader = new SwfStreamReader(
SwfStreamReader.DecompressZBytes(ZlibBitmapData));
if ( BitmapFormat == 5 ) {
var result = new byte[BitmapWidth * BitmapHeight * 4];
var swf_reader = SwfStreamReader.DecompressZBytesToReader(ZlibBitmapData);
if ( BitmapFormat == 3 ) {
var palette = new SwfColor[BitmapColorTableSize];
for ( var i = 0; i < palette.Length; ++i ) {
palette[i] = SwfColor.Read(swf_reader, true);
}
var palette_pitch = BitmapWidth % 4 == 0
? BitmapWidth
: BitmapWidth + (4 - BitmapWidth % 4);
var palette_indices = swf_reader.ReadRest();
for ( var i = 0; i < BitmapHeight; ++i ) {
for ( var j = 0; j < BitmapWidth; ++j ) {
var result_index = j + i * BitmapWidth;
var palette_index = palette_indices[j + i * palette_pitch];
var palette_color = palette[palette_index];
result[result_index * 4 + 0] = palette_color.A;
result[result_index * 4 + 1] = palette_color.R;
result[result_index * 4 + 2] = palette_color.G;
result[result_index * 4 + 3] = palette_color.B;
}
}
} else if ( BitmapFormat == 5 ) {
for ( var i = 0; i < BitmapWidth * BitmapHeight; ++i ) {
var pix32 = swf_reader.ReadUInt32();
result[i * 4 + 0] = (byte)((pix32 ) & 0xFF);
@@ -48,9 +69,9 @@
result[i * 4 + 3] = (byte)((pix32 >> 24) & 0xFF);
}
} else {
//TODO: IMPLME
throw new System.Exception(string.Format(
"Unsupported DefineBitsLossless2 Format: {0}", BitmapFormat));
"Incorrect DefineBitsLossless2 format: {0}",
BitmapFormat));
}
return result;
}

View File

@@ -1,4 +1,6 @@
namespace FTSwfTools.SwfTags {
using FTSwfTools.SwfTypes;
namespace FTSwfTools.SwfTags {
public class DefineBitsLosslessTag : SwfTagBase {
public ushort CharacterId;
public byte BitmapFormat;
@@ -36,10 +38,29 @@
}
public byte[] ToARGB32() {
var result = new byte[BitmapWidth * BitmapHeight * 4];
var swf_reader = new SwfStreamReader(
SwfStreamReader.DecompressZBytes(ZlibBitmapData));
if ( BitmapFormat == 5 ) {
var result = new byte[BitmapWidth * BitmapHeight * 4];
var swf_reader = SwfStreamReader.DecompressZBytesToReader(ZlibBitmapData);
if ( BitmapFormat == 3 ) {
var palette = new SwfColor[BitmapColorTableSize];
for ( var i = 0; i < palette.Length; ++i ) {
palette[i] = SwfColor.Read(swf_reader, false);
}
var palette_pitch = BitmapWidth % 4 == 0
? BitmapWidth
: BitmapWidth + (4 - BitmapWidth % 4);
var palette_indices = swf_reader.ReadRest();
for ( var i = 0; i < BitmapHeight; ++i ) {
for ( var j = 0; j < BitmapWidth; ++j ) {
var result_index = j + i * BitmapWidth;
var palette_index = palette_indices[j + i * palette_pitch];
var palette_color = palette[palette_index];
result[result_index * 4 + 0] = palette_color.A;
result[result_index * 4 + 1] = palette_color.R;
result[result_index * 4 + 2] = palette_color.G;
result[result_index * 4 + 3] = palette_color.B;
}
}
} else if ( BitmapFormat == 5 ) {
for ( var i = 0; i < BitmapWidth * BitmapHeight; ++i ) {
var pix24 = swf_reader.ReadUInt32();
result[i * 4 + 0] = 255;
@@ -48,9 +69,9 @@
result[i * 4 + 3] = (byte)((pix24 >> 24) & 0xFF);
}
} else {
//TODO: IMPLME
throw new System.Exception(string.Format(
"Unsupported DefineBitsLossless Format: {0}", BitmapFormat));
"Incorrect DefineBitsLossless format: {0}",
BitmapFormat));
}
return result;
}