public String GenerateUnicode(Bitmap source, String spacingChar) { //Check status if (IsErrorOccurred()) { return(String.Empty); } //Create Cl memory ClImage2D srcMem = new ClImage2D(source, context, IOMode.ReadOnly, ChannelType.RGBA32bpp, out error); int totalUnicodeLength = (srcMem.Width / 2 + 2) * (srcMem.Height / 4); ClBuffer <short> dstMem = new ClBuffer <short>(context, totalUnicodeLength, out error); //Check error if (!srcMem.Ready || !dstMem.Ready || IsErrorOccurred()) { srcMem.Dispose(); dstMem.Dispose(); return(String.Empty); } //Run kernel kernelGenerateUnicode.ExecuteKernel(out error, new object[] { srcMem, dstMem }); if (IsErrorOccurred()) { return(String.Empty); } //Marshaling unicode data. IntPtr stream = Marshal.AllocHGlobal(totalUnicodeLength * 2); Marshal.Copy(dstMem.GetBuffer(), 0, stream, totalUnicodeLength); string result = Marshal.PtrToStringUni(stream, totalUnicodeLength); //Replace spacing char result = result.Replace(((char)0x2800).ToString(), spacingChar); //Clean up srcMem.Dispose(); dstMem.Dispose(); return(result); }
private void ImgToImgKernel(ClKernel kernel, Bitmap source, Bitmap destination, params object[] extra) { //Check status if (error != ErrorCode.Success) { return; } //Create Cl memory ClImage2D srcMem = new ClImage2D(source, context, IOMode.ReadOnly, ChannelType.RGBA32bpp, out error); ClImage2D dstMem = new ClImage2D(destination, context, IOMode.WriteOnly, ChannelType.RGBA32bpp, out error); //Check error if (!srcMem.Ready || !dstMem.Ready || IsErrorOccurred()) { srcMem.Dispose(); dstMem.Dispose(); if (error != ErrorCode.Success) { return; } } //Create argument list object[] argList = new object[2 + extra.Length]; argList[0] = srcMem; argList[1] = dstMem; extra.CopyTo(argList, 2); //Run kernel kernel.ExecuteKernel(out error, argList); if (error != ErrorCode.Success) { return; } //Clean up srcMem.Dispose(); dstMem.Dispose(); }