public void doFilter(INyARRgbRaster i_input, NyARBinRaster i_output) { //INyARBufferReader in_buffer_reader = i_input.getBufferReader(); //INyARBufferReader out_buffer_reader = i_output.getBufferReader(); int in_buf_type = i_input.getBufferType(); NyARIntSize size = i_output.getSize(); Debug.Assert(i_output.isEqualBufferType(NyARBufferType.INT2D_BIN_8)); Debug.Assert(checkInputType(in_buf_type) == true); Debug.Assert(i_input.getSize().isEqualSize(size.w * 2, size.h * 2) == true); int[][] out_buf = (int[][])i_output.getBuffer(); switch (i_input.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8_24: case NyARBufferType.BYTE1D_R8G8B8_24: convert24BitRgb((byte[])i_input.getBuffer(), out_buf, size); break; case NyARBufferType.BYTE1D_B8G8R8X8_32: convert32BitRgbx((byte[])i_input.getBuffer(), out_buf, size); break; case NyARBufferType.WORD1D_R5G6B5_16LE: convert16BitRgb565word((short[])i_input.getBuffer(), out_buf, size); break; default: throw new NyARException(); } return; }
public void doFilter(INyARRgbRaster i_input, NyARBinRaster i_output) { //INyARBufferReader in_buffer_reader = i_input.getBufferReader(); //INyARBufferReader out_buffer_reader = i_output.getBufferReader(); int in_buf_type = i_input.getBufferType(); NyARIntSize size = i_output.getSize(); Debug.Assert(i_output.isEqualBufferType(NyARBufferType.INT2D_BIN_8)); Debug.Assert(checkInputType(in_buf_type) == true); Debug.Assert(i_input.getSize().isEqualSize(size.w * 2, size.h * 2) == true); int[][] out_buf = (int[][])i_output.getBuffer(); switch (i_input.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8_24: case NyARBufferType.BYTE1D_R8G8B8_24: convert24BitRgb((byte[])i_input.getBuffer(), out_buf, size); break; case NyARBufferType.BYTE1D_B8G8R8X8_32: convert32BitRgbx((byte[])i_input.getBuffer(), out_buf, size); break; case NyARBufferType.WORD1D_R5G6B5_16LE: convert16BitRgb565word((short[])i_input.getBuffer(), out_buf, size); break; default: throw new NyARException(); } return; }
/** * この関数は、i_rasterを操作するピクセルドライバインスタンスを生成します。 * @param i_raster * @return * @ */ public static INyARRgbPixelDriver createDriver(INyARRgbRaster i_raster) { INyARRgbPixelDriver ret; switch (i_raster.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8_24: ret = new NyARRgbPixelDriver_BYTE1D_B8G8R8_24(); break; case NyARBufferType.BYTE1D_B8G8R8X8_32: ret = new NyARRgbPixelDriver_BYTE1D_B8G8R8X8_32(); break; case NyARBufferType.BYTE1D_R8G8B8_24: ret = new NyARRgbPixelDriver_BYTE1D_R8G8B8_24(); break; case NyARBufferType.BYTE1D_X8R8G8B8_32: ret = new NyARRgbPixelDriver_BYTE1D_X8R8G8B8_32(); break; case NyARBufferType.INT1D_GRAY_8: ret = new NyARRgbPixelDriver_INT1D_GRAY_8(); break; case NyARBufferType.INT1D_X8R8G8B8_32: ret = new NyARRgbPixelDriver_INT1D_X8R8G8B8_32(); break; case NyARBufferType.BYTE1D_R5G6B5_16BE: ret = new NyARRgbPixelDriver_WORD1D_R5G6B5_16LE(); break; default: throw new NyARException(); } ret.switchRaster(i_raster); return ret; }
/** * この関数は、(R*G*B>>16) でグレースケール化するフィルタを生成します。 * 最適化されていません。 * @param i_raster * @return * @ */ public static INyARRgb2GsFilterRgbAve createRgbCubeDriver(INyARRgbRaster i_raster) { switch (i_raster.getBufferType()) { default: return(new NyARRgb2GsFilterRgbCube_Any(i_raster)); } }
/** * この関数は(Yrcb)でグレースケール化するフィルタを生成します。 * 最適化されていません。 * @param i_raster * @return * @ */ public static INyARRgb2GsFilterYCbCr createYCbCrDriver(INyARRgbRaster i_raster) { switch (i_raster.getBufferType()) { default: return(new NyARRgb2GsFilterYCbCr_Any(i_raster)); } }
/** * この関数は、(R*G*B>>16) でグレースケール化するフィルタを生成します。 * 最適化されていません。 * @param i_raster * @return * @ */ public static INyARRgb2GsFilterRgbAve createRgbCubeDriver(INyARRgbRaster i_raster) { switch (i_raster.getBufferType()) { default: return new NyARRgb2GsFilterRgbCube_Any(i_raster); } }
/** * この関数は(Yrcb)でグレースケール化するフィルタを生成します。 * 最適化されていません。 * @param i_raster * @return * @ */ public static INyARRgb2GsFilterYCbCr createYCbCrDriver(INyARRgbRaster i_raster) { switch (i_raster.getBufferType()) { default: return new NyARRgb2GsFilterYCbCr_Any(i_raster); } }
/* DsXRGB32Rasterの内容を保持しているサーフェイスにコピーします。 */ public void setRaster(INyARRgbRaster i_sample) { Debug.Assert(!this._is_dispose); int pitch; int s_stride = this.m_width * 4; using (GraphicsStream gs = this._surface.LockRectangle(LockFlags.None, out pitch)) { try{ switch (i_sample.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8X8_32: if (pitch % s_stride == 0) { Marshal.Copy((byte[])i_sample.getBuffer(), 0, (IntPtr)((int)gs.InternalData), this.m_width * 4 * this.m_height); } else { int s_idx = 0; int d_idx = (int)gs.InternalData; for (int i = this.m_height - 1; i >= 0; i--) { //どう考えてもポインタです。 Marshal.Copy((byte[])i_sample.getBuffer(), s_idx, (IntPtr)(d_idx), s_stride); s_idx += s_stride; d_idx += pitch; } } break; case NyARBufferType.OBJECT_CS_Bitmap: NyARBitmapRaster ra = (NyARBitmapRaster)(i_sample); BitmapData bm = ra.lockBitmap(); try{ //コピー int src = (int)bm.Scan0; int dst = (int)gs.InternalData; for (int r = this.m_height - 1; r >= 0; r--) { NyARD3dUtil.RtlCopyMemory((IntPtr)dst, (IntPtr)src, s_stride); dst += pitch; src += bm.Stride; } }finally{ ra.unlockBitmap(); } break; default: throw new NyARException(); } }finally{ this._surface.UnlockRectangle(); } return; } }
/* DsXRGB32Rasterの内容を保持しているテクスチャにコピーします。 * i_rasterのサイズは、このインスタンスに指定したテクスチャサイズ(コンストラクタ等に指定したサイズ)と同じである必要です。 * ラスタデータはテクスチャの左上を基点にwidth x heightだけコピーされ、残りの部分は更新されません。 */ public void setRaster(INyARRgbRaster i_raster) { Debug.Assert(!this._is_dispose); int pitch; using (GraphicsStream texture_rect = this.m_texture.LockRectangle(0, LockFlags.None, out pitch)) { try{ int dst = (int)texture_rect.InternalData; switch (i_raster.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8X8_32: { byte[] buf = (byte[])i_raster.getBuffer(); //テクスチャのピッチって何? int src_w = this.m_width * 4; int src = 0; for (int r = this.m_height - 1; r >= 0; r--) { Marshal.Copy(buf, src, (IntPtr)dst, pitch); dst += pitch; src += src_w; } } break; case NyARBufferType.OBJECT_CS_Bitmap: NyARBitmapRaster ra = (NyARBitmapRaster)(i_raster); BitmapData bm = ra.lockBitmap(); try { int src = (int)bm.Scan0; for (int r = this.m_height - 1; r >= 0; r--) { NyARD3dUtil.RtlCopyMemory((IntPtr)dst, (IntPtr)src, pitch); dst += pitch; src += bm.Stride; } } finally { ra.unlockBitmap(); } break; default: throw new NyARException(); } } finally { //テクスチャをアンロックする this.m_texture.UnlockRectangle(0); } } return; }
public static IRasterDriver createDriver(INyARRgbRaster i_raster) { switch (i_raster.getBufferType()) { case NyARBufferType.INT1D_X8R8G8B8_32: return new NyARMatchPattDeviationDataDriver_INT1D_X8R8G8B8_32(i_raster); default: break; } return new NyARMatchPattDeviationDataDriver_RGBAny(i_raster); }
public static IRasterDriver createDriver(INyARRgbRaster i_raster) { switch (i_raster.getBufferType()) { case NyARBufferType.INT1D_X8R8G8B8_32: return(new NyARMatchPattDeviationDataDriver_INT1D_X8R8G8B8_32(i_raster)); default: break; } return(new NyARMatchPattDeviationDataDriver_RGBAny(i_raster)); }
/** * この関数は、(R*G*B)/3 でグレースケール化するフィルタを生成します。 * 最適化されている形式は以下の通りです。 * <ul> * <li>{@link NyARBufferType#BYTE1D_B8G8R8X8_32}</li> * </ul> * @param i_raster * @return * @ */ public static INyARRgb2GsFilterRgbAve createRgbAveDriver(INyARRgbRaster i_raster) { switch (i_raster.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8X8_32: return new NyARRgb2GsFilterRgbAve_BYTE1D_B8G8R8X8_32(i_raster); case NyARBufferType.BYTE1D_B8G8R8_24: return new NyARRgb2GsFilterRgbAve_BYTE1D_C8C8C8_24(i_raster); case NyARBufferType.BYTE1D_X8R8G8B8_32: return new NyARRgb2GsFilterRgbAve_INT1D_X8R8G8B8_32(i_raster); default: return new NyARRgb2GsFilterRgbAve_Any(i_raster); } }
/** * NyARRasterからパターンデータをセットします。 * この関数は、データを元に所有するデータ領域を更新します。 * @param i_buffer * @throws NyARException */ public void setRaster(INyARRgbRaster i_raster) { Debug.Assert(i_raster.getSize().isEqualSize(this._size)); switch (i_raster.getBufferType()) { case NyARBufferType.INT1D_X8R8G8B8_32: this._pow = setRaster_INT1D_X8R8G8B8_32((int[])i_raster.getBuffer(), this._size.w * this._size.h, this._optimize_for_mod, this._data); break; default: this._pow = setRaster_ANY(i_raster.getRgbPixelReader(), this._size, this._size.w * this._size.h, this._data); break; } return; }
public void multiPixel(int pk_l, int pk_t, double[] cpara, int i_resolution, INyARRgbRaster i_in_raster, INyARRgbRaster o_out) { //出力形式による分岐 switch (o_out.getBufferType()) { case NyARBufferType.INT1D_X8R8G8B8_32: multiPixel_INT1D_X8R8G8B8_32(pk_l, pk_t, i_in_raster.getWidth(), i_in_raster.getHeight(), i_resolution, cpara, i_in_raster.getRgbPixelReader(), o_out); break; default: multiPixel_ANY(pk_l, pk_t, i_in_raster.getWidth(), i_in_raster.getHeight(), i_resolution, cpara, i_in_raster.getRgbPixelReader(), o_out); break; } return; }
/** * 指定したIN/OUTに最適な{@link INyARPerspectiveReaader}を生成します。 * <p>入力ラスタについて * 基本的には全ての{@link INyARRgbRaster}を実装したクラスを処理できますが、次の3種類のバッファを持つものを推奨します。 * <ul> * <li>{@link NyARBufferType#BYTE1D_B8G8R8X8_32} * <li>{@link NyARBufferType#BYTE1D_B8G8R8_24} * <li>{@link NyARBufferType#BYTE1D_R8G8B8_24} * </ul> * </p> * <p>出力ラスタについて * 基本的には全ての{@link NyARBufferType#INT1D_X8R8G8B8_32}形式のバッファを持つラスタを使用してください。 * 他の形式でも動作しますが、低速な場合があります。 * </p> * <p>高速化について - * 入力ラスタ形式が、{@link NyARBufferType#BYTE1D_B8G8R8X8_32},{@link NyARBufferType#BYTE1D_B8G8R8_24} * ,{@link NyARBufferType#BYTE1D_R8G8B8_24}のものについては、他の形式よりも高速に動作します。 * また、出力ラスタ形式が、{@link NyARBufferType#INT1D_X8R8G8B8_32}の物については、単体サンプリングモードの時のみ、さらに高速に動作します。 * 他の形式のラスタでは、以上のものよりも低速転送で対応します。 * @param i_in_raster_type * 入力ラスタの形式です。 * @param i_out_raster_type * 出力ラスタの形式です。 * @return */ public static INyARPerspectiveCopy createDriver(INyARRgbRaster i_raster) { //新しいモードに対応したら書いてね。 switch (i_raster.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8X8_32: return new PerspectiveCopy_BYTE1D_B8G8R8X8_32(i_raster); case NyARBufferType.BYTE1D_B8G8R8_24: return new PerspectiveCopy_BYTE1D_B8G8R8_24(i_raster); case NyARBufferType.BYTE1D_R8G8B8_24: return new PerspectiveCopy_BYTE1D_R8G8B8_24(i_raster); default: return new PerspectiveCopy_ANYRgb(i_raster); } }
public void onePixel(int pk_l, int pk_t, double[] cpara, INyARRgbRaster i_in_raster, INyARRgbRaster o_out) { Debug.Assert(i_in_raster.isEqualBufferType(NyARBufferType.BYTE1D_B8G8R8X8_32)); //出力形式による分岐 switch (o_out.getBufferType()) { case NyARBufferType.INT1D_X8R8G8B8_32: onePixel_INT1D_X8R8G8B8_32(pk_l, pk_t, i_in_raster.getWidth(), i_in_raster.getHeight(), cpara, (byte[])i_in_raster.getBuffer(), o_out); break; default: onePixel_ANY(pk_l, pk_t, i_in_raster.getWidth(), i_in_raster.getHeight(), cpara, (byte[])i_in_raster.getBuffer(), o_out); break; } return; }
/** * この関数は、(R*G*B)/3 でグレースケール化するフィルタを生成します。 * 最適化されている形式は以下の通りです。 * <ul> * <li>{@link NyARBufferType#BYTE1D_B8G8R8X8_32}</li> * </ul> * @param i_raster * @return * @ */ public static INyARRgb2GsFilterRgbAve createRgbAveDriver(INyARRgbRaster i_raster) { switch (i_raster.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8X8_32: return(new NyARRgb2GsFilterRgbAve_BYTE1D_B8G8R8X8_32(i_raster)); case NyARBufferType.BYTE1D_B8G8R8_24: return(new NyARRgb2GsFilterRgbAve_BYTE1D_C8C8C8_24(i_raster)); case NyARBufferType.BYTE1D_X8R8G8B8_32: return(new NyARRgb2GsFilterRgbAve_INT1D_X8R8G8B8_32(i_raster)); default: return(new NyARRgb2GsFilterRgbAve_Any(i_raster)); } }
/** * 指定したIN/OUTに最適な{@link INyARPerspectiveReaader}を生成します。 * <p>入力ラスタについて * 基本的には全ての{@link INyARRgbRaster}を実装したクラスを処理できますが、次の3種類のバッファを持つものを推奨します。 * <ul> * <li>{@link NyARBufferType#BYTE1D_B8G8R8X8_32} * <li>{@link NyARBufferType#BYTE1D_B8G8R8_24} * <li>{@link NyARBufferType#BYTE1D_R8G8B8_24} * </ul> * </p> * <p>出力ラスタについて * 基本的には全ての{@link NyARBufferType#INT1D_X8R8G8B8_32}形式のバッファを持つラスタを使用してください。 * 他の形式でも動作しますが、低速な場合があります。 * </p> * <p>高速化について - * 入力ラスタ形式が、{@link NyARBufferType#BYTE1D_B8G8R8X8_32},{@link NyARBufferType#BYTE1D_B8G8R8_24} * ,{@link NyARBufferType#BYTE1D_R8G8B8_24}のものについては、他の形式よりも高速に動作します。 * また、出力ラスタ形式が、{@link NyARBufferType#INT1D_X8R8G8B8_32}の物については、単体サンプリングモードの時のみ、さらに高速に動作します。 * 他の形式のラスタでは、以上のものよりも低速転送で対応します。 * @param i_in_raster_type * 入力ラスタの形式です。 * @param i_out_raster_type * 出力ラスタの形式です。 * @return */ public static INyARPerspectiveCopy createDriver(INyARRgbRaster i_raster) { //新しいモードに対応したら書いてね。 switch (i_raster.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8X8_32: return(new PerspectiveCopy_BYTE1D_B8G8R8X8_32(i_raster)); case NyARBufferType.BYTE1D_B8G8R8_24: return(new PerspectiveCopy_BYTE1D_B8G8R8_24(i_raster)); case NyARBufferType.BYTE1D_R8G8B8_24: return(new PerspectiveCopy_BYTE1D_R8G8B8_24(i_raster)); default: return(new PerspectiveCopy_ANYRgb(i_raster)); } }
public static INyARRgb2GsFilterArtkTh createDriver(INyARRgbRaster i_raster) { switch (i_raster.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8_24: case NyARBufferType.BYTE1D_R8G8B8_24: return new NyARRgb2GsFilterArtkTh_BYTE1D_C8C8C8_24(i_raster); case NyARBufferType.BYTE1D_B8G8R8X8_32: return new NyARRgb2GsFilterArtkTh_BYTE1D_B8G8R8X8_32(i_raster); case NyARBufferType.BYTE1D_X8R8G8B8_32: return new NyARRgb2GsFilterArtkTh_BYTE1D_X8R8G8B8_32(i_raster); case NyARBufferType.INT1D_X8R8G8B8_32: return new NyARRgb2GsFilterArtkTh_INT1D_X8R8G8B8_32(i_raster); case NyARBufferType.WORD1D_R5G6B5_16LE: return new NyARRgb2GsFilterArtkTh_WORD1D_R5G6B5_16LE(i_raster); default: return new NyARRgb2GsFilterArtkTh_Any(i_raster); } }
/** * この関数は、i_rasterを操作するピクセルドライバインスタンスを生成します。 * @param i_raster * @return * @ */ public static INyARRgbPixelDriver createDriver(INyARRgbRaster i_raster) { INyARRgbPixelDriver ret; switch (i_raster.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8_24: ret = new NyARRgbPixelDriver_BYTE1D_B8G8R8_24(); break; case NyARBufferType.BYTE1D_B8G8R8X8_32: ret = new NyARRgbPixelDriver_BYTE1D_B8G8R8X8_32(); break; case NyARBufferType.BYTE1D_R8G8B8_24: ret = new NyARRgbPixelDriver_BYTE1D_R8G8B8_24(); break; case NyARBufferType.BYTE1D_X8R8G8B8_32: ret = new NyARRgbPixelDriver_BYTE1D_X8R8G8B8_32(); break; case NyARBufferType.INT1D_GRAY_8: ret = new NyARRgbPixelDriver_INT1D_GRAY_8(); break; case NyARBufferType.INT1D_X8R8G8B8_32: ret = new NyARRgbPixelDriver_INT1D_X8R8G8B8_32(); break; case NyARBufferType.BYTE1D_R5G6B5_16BE: ret = new NyARRgbPixelDriver_WORD1D_R5G6B5_16LE(); break; default: throw new NyARException(); } ret.switchRaster(i_raster); return(ret); }
public void Test() { //AR用カメラパラメタファイルをロード NyARParam ap = NyARParam.loadFromARParamFile(File.OpenRead(camera_file), 320, 240); //試験イメージの読み出し(320x240 RGBのRAWデータ) StreamReader sr = new StreamReader(data_file); BinaryReader bs = new BinaryReader(sr.BaseStream); byte[] raw = bs.ReadBytes(320 * 240 * 3); INyARRgbRaster ra = NyARRgbRaster.createInstance(320, 240, NyARBufferType.BYTE1D_R8G8B8_24, false); ra.wrapBuffer(raw); MarkerProcessor pr = new MarkerProcessor(ap, ra.getBufferType()); pr.detectMarker(ra); Console.WriteLine(pr.transmat.m00 + "," + pr.transmat.m01 + "," + pr.transmat.m02 + "," + pr.transmat.m03); Console.WriteLine(pr.transmat.m10 + "," + pr.transmat.m11 + "," + pr.transmat.m12 + "," + pr.transmat.m13); Console.WriteLine(pr.transmat.m20 + "," + pr.transmat.m21 + "," + pr.transmat.m22 + "," + pr.transmat.m23); Console.WriteLine(pr.transmat.m30 + "," + pr.transmat.m31 + "," + pr.transmat.m32 + "," + pr.transmat.m33); Console.WriteLine(pr.current_id); return; }
public static INyARRgb2GsFilterArtkTh createDriver(INyARRgbRaster i_raster) { switch (i_raster.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8_24: case NyARBufferType.BYTE1D_R8G8B8_24: return(new NyARRgb2GsFilterArtkTh_BYTE1D_C8C8C8_24(i_raster)); case NyARBufferType.BYTE1D_B8G8R8X8_32: return(new NyARRgb2GsFilterArtkTh_BYTE1D_B8G8R8X8_32(i_raster)); case NyARBufferType.BYTE1D_X8R8G8B8_32: return(new NyARRgb2GsFilterArtkTh_BYTE1D_X8R8G8B8_32(i_raster)); case NyARBufferType.INT1D_X8R8G8B8_32: return(new NyARRgb2GsFilterArtkTh_INT1D_X8R8G8B8_32(i_raster)); case NyARBufferType.WORD1D_R5G6B5_16LE: return(new NyARRgb2GsFilterArtkTh_WORD1D_R5G6B5_16LE(i_raster)); default: return(new NyARRgb2GsFilterArtkTh_Any(i_raster)); } }
/* DsXRGB32Rasterの内容を保持しているテクスチャにコピーします。 * i_rasterのサイズは、このインスタンスに指定したテクスチャサイズ(コンストラクタ等に指定したサイズ)と同じである必要です。 * ラスタデータはテクスチャの左上を基点にwidth x heightだけコピーされ、残りの部分は更新されません。 */ public void setRaster(INyARRgbRaster i_raster) { Debug.Assert(!this._is_dispose); int pitch; using(GraphicsStream texture_rect = this.m_texture.LockRectangle(0, LockFlags.None, out pitch)) { try{ int dst = (int)texture_rect.InternalData; switch (i_raster.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8X8_32: { byte[] buf = (byte[])i_raster.getBuffer(); //テクスチャのピッチって何? int src_w = this.m_width * 4; int src = 0; for (int r = this.m_height - 1; r >= 0; r--) { Marshal.Copy(buf, src, (IntPtr)dst, pitch); dst += pitch; src += src_w; } } break; case NyARBufferType.OBJECT_CS_Bitmap: NyARBitmapRaster ra = (NyARBitmapRaster)(i_raster); BitmapData bm = ra.lockBitmap(); try { int src = (int)bm.Scan0; for (int r = this.m_height - 1; r >= 0; r--) { NyARD3dUtil.RtlCopyMemory((IntPtr)dst, (IntPtr)src, pitch); dst += pitch; src += bm.Stride; } } finally { ra.unlockBitmap(); } break; default: throw new NyARException(); } } finally { //テクスチャをアンロックする this.m_texture.UnlockRectangle(0); } } return; }
/* DsXRGB32Rasterの内容を保持しているサーフェイスにコピーします。 */ public void setRaster(INyARRgbRaster i_sample) { Debug.Assert(!this._is_dispose); int pitch; int s_stride = this.m_width * 4; using (GraphicsStream gs = this._surface.LockRectangle(LockFlags.None, out pitch)) { try{ switch (i_sample.getBufferType()) { case NyARBufferType.BYTE1D_B8G8R8X8_32: if (pitch % s_stride == 0) { Marshal.Copy((byte[])i_sample.getBuffer(), 0, (IntPtr)((int)gs.InternalData), this.m_width * 4 * this.m_height); } else { int s_idx = 0; int d_idx = (int)gs.InternalData; for (int i = this.m_height - 1; i >= 0; i--) { //どう考えてもポインタです。 Marshal.Copy((byte[])i_sample.getBuffer(), s_idx, (IntPtr)(d_idx), s_stride); s_idx += s_stride; d_idx += pitch; } } break; case NyARBufferType.OBJECT_CS_Bitmap: NyARBitmapRaster ra = (NyARBitmapRaster)(i_sample); BitmapData bm = ra.lockBitmap(); try{ //コピー int src = (int)bm.Scan0; int dst = (int)gs.InternalData; for (int r = this.m_height - 1; r >= 0; r--) { NyARD3dUtil.RtlCopyMemory((IntPtr)dst, (IntPtr)src, s_stride); dst += pitch; src += bm.Stride; } }finally{ ra.unlockBitmap(); } break; default: throw new NyARException(); } }finally{ this._surface.UnlockRectangle(); } return; } }