使用 ActionScript BitmapData 对象

使用 ActionScript BitmapData 类在扩展的 ActionScript 端和本机端传递位图。在本机函数中,输入参数、输出参数或返回值可以与 ActionScript BitmapData 类对象相对应。

与其他 ActionScript 类对象一样,FREObject 变量是 ActionScript BitmapData 对象的本机端表示形式。C API 提供了函数用于处理使用 FREObject 变量的 BitmapData 类对象。使用 FRESetObjectProperty() 、 FREGetObjectProperty() 和 FRECallObjectMethod() 可获取并设置 ActionScript ByteArray 对象的属性并调用其方法。

但是,若要操作本机代码中 BitmapData 对象的位,请使用 C API 函数 FREAcquireBitmapData() 或 FREAcquireBitmapData2() 。这些方法访问在 ActionScript 端创建的 BitmapData 对象的位:

FREResult FREAcquireBitmapData( 
            FREObject                     object, 
            FREBitmapData*                 descriptorToSet 
); 
// The type FREBitmapData is defined as: 
 
typedef struct { 
    uint32_t            width;         
    uint32_t            height;  
    bool            hasAlpha;  
    bool            isPremultiplied; 
    uint32_t            lineStride32; 
    uint32_t*            bits32; 
} FREBitmapData; 
 
//Or: 
FREResult FREAcquireBitmapData2( 
            FREObject                     object, 
            FREBitmapData2*                 descriptorToSet 
); 
// The type FREBitmapData is defined as: 
 
typedef struct { 
    uint32_t            width;         
    uint32_t            height;  
    bool            hasAlpha;  
    bool            isInvertedY; 
    bool            isPremultiplied; 
    uint32_t            lineStride32; 
    uint32_t*            bits32; 
} FREBitmapData2;

FREBitmapData 或 FREBitmapData2 结构的所有字段均为只读字段。不过, bits32 字段指向实际的位图值,您可以在本机实现中修改这些值。向 AIR 3.1 中的 API 添加了 FREBitmapData2 结构和 FREAquireBitmapData2 函数。 FREBitmapData2 包含一个额外字段 isInvertedY ,该字段指示存储图像数据行的顺序。

若要指示本机实现已修改位图的全部或部分,请使位图矩形无效。使用 C API 函数 FREInvalidateBitmapDataRect() :

FREResult FREInvalidateBitmapDataRect( 
        FREObject object, 
        uint32_t x, 
        uint32_t y, 
        uint32_t width, 
        uint32_t height 
);

x 和 y 字段是要失效的矩形的坐标,相对于 0,0 坐标,0,0 是位图的左上角。 width 和 height 字段是要失效的矩形的维度(以像素为单位)。

操作完位图后,请使用 C API 函数 FREReleaseBitmapData() :

FREResult FREReleaseBitmapData(FREObject object);
注: 不要在调用 FREAcquireBitmapData() 和 FREReleaseBitmapData() 之间调用除 FREInvalidateBitmapDataRect() 之外的任何 C API 函数。存在这种限制的原因是其他调用执行的代码会使指向位图内容的指针无效。