RangeError: Error #1506: The specified range is invalid.

2011年10月8日 01:00

Alchemy 製の JPEG エンコーダーが激速でウヒョー!と喜んで使っていたのだけど、
いつからかこんなエラーが出てくるようになった。

RangeError: Error #1506: The specified range is invalid.
at cmodule.aircall::FSM_imalloc$/start()
at cmodule.aircall::FSM_pubrealloc/work()
at Function/()
at Function/()
at Function/()[C:\Users\littepad\hoge\hoge.as:122]

その時のソースはこんな感じ。
BitmapData を格納した配列をループでエンコード処理をしてる。

import cmodule.aircall.CLibInit;

for each(var bmd:BitmapData in bmdArray){
    // alchemy jpeg encoder
    var jpeginit:CLibInit = new CLibInit();
    var jpeglib:Object = jpeginit.init();
    var imgData:ByteArray = bmd.getPixels(bmd.rect);
    var imgEncoded:ByteArray = new ByteArray();
    imgData.position = 0;
    jpeglib.encode(imgData, imgEncoded, bmd.width, bmd.height, 75);
}


調べてみると、C ライブラリは 1 回以上イニシャライズしてはいけないらしい。
ということで、ライブラリのインスタンスが null だった場合のみ初期化するように変更してみた。

import cmodule.aircall.CLibInit;

for each(var bmd:BitmapData in bmdArray){
    // alchemy jpeg encoder
    var jpeginit:CLibInit; 
    var jpeglib:Object;
    if (jpeglib == null) {
        jpeginit = new CLibInit;
        jpeglib = jpeginit.init();
    }
    var imgData:ByteArray = bmd.getPixels(bmd.rect);
    var imgEncoded:ByteArray = new ByteArray();
    imgData.position = 0;
    jpeglib.encode(imgData, imgEncoded, bmd.width, bmd.height, 75);
}

が、それでもうまくいかないので、プライベート変数にしてやったら…。
うまくいった!

import cmodule.aircall.CLibInit;

private var _jpeginit:CLibInit;
private var _jpeglib:Object;

// コンストラクタとかでイニシャライズ
_jpeginit = new CLibInit();
_jpeglib = _jpeginit.init();

for each(var bmd:BitmapData in bmdArray){
    // alchemy jpeg encoder
    var imgData:ByteArray = bmd.getPixels(bmd.rect);
    var imgEncoded:ByteArray = new ByteArray();
    imgData.position = 0;
    _jpeglib.encode(imgData, imgEncoded, bmd.width, bmd.height, 75);
}

カテゴリー: programming タグ:

コメントはまだありません

No comments yet.

TrackBack URL

Leave a comment