unsafe void similaritySetsToD3DTexture(Exemplar a, int l) { // Indices { // . create texture m_d3dSimilaritySet = new Texture(BRenderDevice.getDevice(), a.stack(l).getWidth(), a.stack(l).getHeight(), 1, 0, Format.A8R8G8B8, Pool.Managed); // . fill in GraphicsStream texstream = m_d3dSimilaritySet.LockRectangle(0, LockFlags.None); byte * data = (byte *)texstream.InternalDataPointer; int rectPitch = a.stack(l).getWidth() * 4; byte *dataI = data;// (byte*)rectI.pBits; int pitch = rectPitch; int[] c_ki = new int[2] { 2, 0 }; int[] c_kj = new int[2] { 1, 3 }; int kn = Math.Min(2, Globals.K_NEAREST); // TODO: extend to ohter values of K ? Globals.Assert(kn <= 2); int width = a.stack(l).getWidth(); int exsz = width; for (int j = 0; j < width; j++) { for (int i = 0; i < width; i++) { int n = a.similaritySetSize(l, i, j); for (int k = 0; k < kn; k++) { if (k < n) { Pair <int, int> kij = a.similarPixel(l, i, j, k); int vi = kij.first; int vj = kij.second; //dataI[i*4+j*pitch + c_ki[k]]=vi & 255; // simsets as indirections //dataI[i*4+j*pitch + c_kj[k]]=vj & 255; Globals.Assert(Math.Abs(vi - i) < exsz); Globals.Assert(Math.Abs(vj - j) < exsz); int oi = (vi - i) + 128; int oj = (vj - j) + 128; Globals.Assert(oi >= 0 && oi <= 255); Globals.Assert(oj >= 0 && oj <= 255); dataI[i * 4 + j * pitch + c_ki[k]] = (byte)(oi & 255); // simsets as offsets dataI[i * 4 + j * pitch + c_kj[k]] = (byte)(oj & 255); } else { dataI[i * 4 + j * pitch + c_ki[k]] = 128; dataI[i * 4 + j * pitch + c_kj[k]] = 128; } } } } m_d3dSimilaritySet.UnlockRectangle(0); } }