private unsafe void tライン描画XRGB32(int n) { // Snap は RGB32、Textureは X8R8G8B8 UInt32 *ptrTexture = this.ptrTexture[n]; for (int y = n; y < this.n高さpx; y += CDirectShow.n並列度) { byte *ptrPixel = ptrSnap + (((this.n高さpx - y) - 1) * this.nスキャンライン幅byte); // アルファ無視なので一括コピー。CopyMemory() は自前でループ展開するよりも速い。 CWin32.CopyMemory((void *)ptrTexture, (void *)ptrPixel, (uint)(this.n幅px * 4)); ptrTexture += this.n幅px * CDirectShow.n並列度; } }
[DllImport(DLL_PATH)] public static extern UIntPtr librg_entity_query(ref librg_ctx_t ctx, UInt32 entity, UInt32 **result);
private unsafe void tライン描画ARGB32(int n) { // Snap は RGB32、Textureは A8R8G8B8 UInt32 *ptrTexture = this.ptrTexture[n]; for (int y = n; y < this.n高さpx; y += CDirectShow.n並列度) { UInt32 *ptrPixel = (UInt32 *)(ptrSnap + (((this.n高さpx - y) - 1) * this.nスキャンライン幅byte)); //for( int x = 0; x < this.n幅px; x++ ) // *( ptrTexture + x ) = 0xFF000000 | *ptrPixel++; // ↓ループ展開により高速化。160fps の曲が 200fps まで上がった。 if (this.n幅px == 0) { goto LEXIT; } UInt32 *pt = ptrTexture; UInt32 nAlpha = 0xFF000000; int d = (this.n幅px % 32); switch (d) { case 1: goto L031; case 2: goto L030; case 3: goto L029; case 4: goto L028; case 5: goto L027; case 6: goto L026; case 7: goto L025; case 8: goto L024; case 9: goto L023; case 10: goto L022; case 11: goto L021; case 12: goto L020; case 13: goto L019; case 14: goto L018; case 15: goto L017; case 16: goto L016; case 17: goto L015; case 18: goto L014; case 19: goto L013; case 20: goto L012; case 21: goto L011; case 22: goto L010; case 23: goto L009; case 24: goto L008; case 25: goto L007; case 26: goto L006; case 27: goto L005; case 28: goto L004; case 29: goto L003; case 30: goto L002; case 31: goto L001; } L000 : *pt++ = nAlpha | *ptrPixel++; L001 : *pt++ = nAlpha | *ptrPixel++; L002 : *pt++ = nAlpha | *ptrPixel++; L003 : *pt++ = nAlpha | *ptrPixel++; L004 : *pt++ = nAlpha | *ptrPixel++; L005 : *pt++ = nAlpha | *ptrPixel++; L006 : *pt++ = nAlpha | *ptrPixel++; L007 : *pt++ = nAlpha | *ptrPixel++; L008 : *pt++ = nAlpha | *ptrPixel++; L009 : *pt++ = nAlpha | *ptrPixel++; L010 : *pt++ = nAlpha | *ptrPixel++; L011 : *pt++ = nAlpha | *ptrPixel++; L012 : *pt++ = nAlpha | *ptrPixel++; L013 : *pt++ = nAlpha | *ptrPixel++; L014 : *pt++ = nAlpha | *ptrPixel++; L015 : *pt++ = nAlpha | *ptrPixel++; L016 : *pt++ = nAlpha | *ptrPixel++; L017 : *pt++ = nAlpha | *ptrPixel++; L018 : *pt++ = nAlpha | *ptrPixel++; L019 : *pt++ = nAlpha | *ptrPixel++; L020 : *pt++ = nAlpha | *ptrPixel++; L021 : *pt++ = nAlpha | *ptrPixel++; L022 : *pt++ = nAlpha | *ptrPixel++; L023 : *pt++ = nAlpha | *ptrPixel++; L024 : *pt++ = nAlpha | *ptrPixel++; L025 : *pt++ = nAlpha | *ptrPixel++; L026 : *pt++ = nAlpha | *ptrPixel++; L027 : *pt++ = nAlpha | *ptrPixel++; L028 : *pt++ = nAlpha | *ptrPixel++; L029 : *pt++ = nAlpha | *ptrPixel++; L030 : *pt++ = nAlpha | *ptrPixel++; L031 : *pt++ = nAlpha | *ptrPixel++; if ((pt - ptrTexture) < this.n幅px) { goto L000; } LEXIT: ptrTexture += this.n幅px * CDirectShow.n並列度; } }