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を作ります。