Java互換ライブラリ(7)

転送ルーチンの実装です。

class Bltter{
public:
    template< class DST , class SRC , class FUNCTOR >
    static void generalBlt(
        DST* dst ,      // 転送先のデータ(ピクセルフォーマットクラス)
        int dx ,        // 転送先X座標
        int dy ,        // 転送先Y座標
        int dpitch ,    // 転送先画像のpitch
        SRC* src ,      // 転送元のデータ(ピクセルフォーマットクラス)
        int sx ,        // 転送元X座標
        int sy ,        // 転送元Y座標
        int spitch ,    // 転送元画像のpitch
        int w ,         // クリップwidth
        int h ,         // クリップheight
        FUNCTOR f       // 転送用functor
    ){
        // 画像データの終端まで移動
        dst = (DST*)((byte*)dst + dx * sizeof( DST ) + (h + dy) * dpitch);
        src = (SRC*)((byte*)src + sx * sizeof( SRC ) + (h + sy) * spitch);
        
        // ダウンカウンタ&8ループ展開
        int i,j;
        for( j = h - 1 ; j >= 0 ; --j ){
            dst = (DST*)((byte*)dst - dpitch);
            src = (SRC*)((byte*)src - spitch);
            for( i = w - 1 ; i >= 8 ; i -= 8 ){
                f( dst[ i - 0 ] , src[ i - 0 ] );
                f( dst[ i - 1 ] , src[ i - 1 ] );
                f( dst[ i - 2 ] , src[ i - 2 ] );
                f( dst[ i - 3 ] , src[ i - 3 ] );
                f( dst[ i - 4 ] , src[ i - 4 ] );
                f( dst[ i - 5 ] , src[ i - 5 ] );
                f( dst[ i - 6 ] , src[ i - 6 ] );
                f( dst[ i - 7 ] , src[ i - 7 ] );
            }
            for( ; i >= 0 ; --i ){
                f( dst[ i ] , src[ i ] );
            }
        }
    }
};

クリッピングはあらかじめしていることが前提です。
で、このメソッドはどこかで実体化する必要があるので、

switch( rasterOperation ){
case RO_COPY:
    switch( srcType ){
    case TYPE_RGB565:
        switch( dstType ){
        case TYPE_RGB565:
            Bltter::generalBlt(
                (PixelTypeRGB565*)dst , dx , dy ,
                (PixelTypeRGB565*)src , sx , sy , w , h ,
                RasterOperation_Copy()
            );
            break;
        case TYPE_RGB888:
            Bltter::generalBlt(
                (PixelTypeRGB888*)dst , dx , dy ,
                (PixelTypeRGB565*)src , sx , sy , w , h ,
                RasterOperation_Copy()
            );
            break;
        }
    case TYPE_RGB888:
        switch( srcType ){
        case TYPE_RGB565:
            Bltter::generalBlt(
                (PixelTypeRGB565*)dst , dx , dy ,
                (PixelTypeRGB888*)src , sx , sy , w , h ,
                RasterOperation_Copy()
            );
            break;
        case TYPE_RGB888:
            Bltter::generalBlt(
                (PixelTypeRGB888*)dst , dx , dy ,
                (PixelTypeRGB888*)src , sx , sy , w , h ,
                RasterOperation_Copy()
            );
            break;
        }
    }
    break;
case RO_COLOR_KEY:
    switch( srcType ){
    case TYPE_RGB565:
        switch( dstType ){
        case TYPE_RGB565:
            Bltter::generalBlt(
                (PixelTypeRGB565*)dst , dx , dy ,
                (PixelTypeRGB565*)src , sx , sy , w , h ,
                RasterOperation_ColorKey< PixelTypeRGB565 >( colorKey )
            );
            break;
        case TYPE_RGB888:
            Bltter::generalBlt(
                (PixelTypeRGB888*)dst , dx , dy ,
                (PixelTypeRGB565*)src , sx , sy , w , h ,
                RasterOperation_ColorKey< PixelTypeRGB565 >( colorKey )
            );
            break;
        }
    case TYPE_RGB888:
        switch( srcType ){
        case TYPE_RGB565:
            Bltter::generalBlt(
                (PixelTypeRGB565*)dst , dx , dy ,
                (PixelTypeRGB888*)src , sx , sy , w , h ,
                RasterOperation_ColorKey< PixelTypeRGB888 >( colorKey )
            );
            break;
        case TYPE_RGB888:
            Bltter::generalBlt(
                (PixelTypeRGB888*)dst , dx , dy ,
                (PixelTypeRGB888*)src , sx , sy , w , h ,
                RasterOperation_ColorKey< PixelTypeRGB888 >( colorKey )
            );
            break;
        }
    }
    break;
}

こんな感じで書いてやる必要があります。
……長い(;´Д`)
まあ、コピペで済むので大して時間はかからないと思います……。


あと、パレット転送について説明していませんが、転送ルーチンを別にしてもいいですし、functorで解決しても構いません。
自分は別の転送ルーチンにしました。




で、あとはこいつをコンパイルしてmodを作ります。