アルファ矩形

こいつは線形補間テーブルさえあれば、アルファブレンドと同じ方法で求められます。

void RectangleAlpha(
    word* dst ,         // 転送先
    int dx ,            // 転送する X 座標
    int dy ,            // 転送する Y 座標
    int dw ,            // 転送する広さ
    int dh ,            // 転送する高さ
    int dp ,            // 転送先の pitch
    uint16 color ,      // 描画色(RGB565)
    int alpha           // アルファ値(0〜31)
){
    byte* tbl = _pTable;
    if( tbl == null ) return;
    
    dst = (word*)((byte*)dst + dx * sizeof( word ) + dy * dp );
    
    uint16 sr = ((color >>  6) & 0x03e0);
    uint16 sg = ((color >>  1) & 0x03e0);
    uint16 sb = ((color <<  5) & 0x03e0);
    
    alpha <<= 10;
    
    uint32 alpha_sr = alpha | sr;
    uint32 alpha_sg = alpha | sg;
    uint32 alpha_sb = alpha | sb;
    
    int y,x;
    for( y = 0 ; y < dh ; y++ ){
        for( x = 0 ; x < dw ; x++ ){
            uint16& d = *(uint16*)&dst[ x ];
            d = (tbl[ alpha_sr | ((d >> 11)         ) ] << 11) |
                (tbl[ alpha_sg | ((d >>  6) & 0x001f) ] <<  6) |
                (tbl[ alpha_sb | ((d      ) & 0x001f) ] <<  0);
        }
        dst = (word*)((byte*)dst + dp);
    }
}

転送元とアルファ値をあらかじめ計算して転送出来るので、アルファブレンド転送よりは速いはず。