Skip to content

Commit

Permalink
A BitmapData encoder/decoder
Browse files Browse the repository at this point in the history
M custom objects encoding now uses IExternalizable methods when available

git-svn-id: http://aerys-qark.googlecode.com/svn/trunk@9 5cda2b45-c24c-6f34-eaa9-e0910a1cbe04
  • Loading branch information
jeanmarc.leroux@aerys.in committed Jan 20, 2011
1 parent 4d81ef4 commit 74d36d8
Showing 1 changed file with 63 additions and 25 deletions.
88 changes: 63 additions & 25 deletions src/aerys/qark/Qark.as
Original file line number Diff line number Diff line change
@@ -1,41 +1,47 @@
package aerys.qark
{
import flash.display.BitmapData;
import flash.utils.ByteArray;
import flash.utils.IExternalizable;
import flash.utils.describeType;
import flash.utils.getDefinitionByName;
import flash.utils.getQualifiedClassName;

public class Qark
{
private static const FLAG_OBJECT : int = 0;
private static const FLAG_ARRAY : int = 1;
private static const FLAG_INTEGER : int = 2;
private static const FLAG_FLOAT : int = 3;
private static const FLAG_STRING : int = 4;
private static const FLAG_UTF_STRING : int = 5;
private static const FLAG_BYTES : int = 6;
private static const FLAG_BOOLEAN : int = 7;
private static const FLAG_CUSTOM : int = 8;

private static const ENCODERS : Array = [encodeObject,
private static const FLAG_CUSTOM : int = 0;
private static const FLAG_OBJECT : int = 1;
private static const FLAG_ARRAY : int = 2;
private static const FLAG_INTEGER : int = 3;
private static const FLAG_FLOAT : int = 4;
private static const FLAG_STRING : int = 5;
private static const FLAG_UTF_STRING : int = 6;
private static const FLAG_BYTES : int = 7;
private static const FLAG_BOOLEAN : int = 8;
private static const FLAG_BITMAP_DATA : int = 9;


private static const ENCODERS : Array = [encodeCustomObject,
encodeObject,
encodeArray,
encodeInteger,
encodeFloat,
encodeString,
encodeUTFString,
encodeBytes,
encodeBoolean,
encodeCustomObject];
encodeBitmapData];

private static const DECODERS : Array = [decodeObject,
private static const DECODERS : Array = [decodeCustomObject,
decodeObject,
decodeArray,
decodeInteger,
decodeFloat,
decodeString,
decodeUTFString,
decodeBytes,
decodeBoolean,
decodeCustomObject];
decodeBitmapData];

private static function getTypeFlag(source : *) : int
{
Expand All @@ -51,6 +57,8 @@ package aerys.qark
return FLAG_BYTES;
if (source is Boolean)
return FLAG_BOOLEAN;
if (source is BitmapData)
return FLAG_BITMAP_DATA;
if (getQualifiedClassName(source) == "Object")
return FLAG_OBJECT;

Expand Down Expand Up @@ -221,29 +229,59 @@ package aerys.qark

private static function encodeCustomObject(source : Object, target : ByteArray) : void
{
var variables : XMLList = describeType(source).variable;
var object : Object = new Object();

encodeString(getQualifiedClassName(source), target);

for each (var variable : XML in variables)
if (source is IExternalizable)
{
(source as IExternalizable).writeExternal(target);
}
else
{
var propertyName : String = variable.@name;
var variables : XMLList = describeType(source).variable;
var object : Object = new Object();

encodeString(getQualifiedClassName(source), target);

for each (var variable : XML in variables)
{
var propertyName : String = variable.@name;

object[propertyName] = source[propertyName];
}

object[propertyName] = source[propertyName];
encodeObject(object, target);
}

encodeObject(object, target);
}

private static function decodeCustomObject(source : ByteArray) : Object
{
var className : String = decodeString(source);
var instance : Object = new (getDefinitionByName(className))();

decodeObject(source, instance);
if (instance is IExternalizable)
(instance as IExternalizable).readExternal(source);
else
decodeObject(source, instance);

return instance;
}

private static function encodeBitmapData(source : BitmapData, target : ByteArray) : void
{
var ba : ByteArray = source.getPixels(source.rect);

target.writeShort(source.width);
target.writeShort(source.height);

encodeBytes(ba, target);
}

private static function decodeBitmapData(source : ByteArray) : BitmapData
{
var bmp : BitmapData = new BitmapData(source.readShort(),
source.readShort());

bmp.setPixels(bmp.rect, decodeBytes(source));

return bmp;
}
}
}

0 comments on commit 74d36d8

Please sign in to comment.