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); }
protected override void OnPostExecute(out ErrorCode error, params object[] args) { ClBuffer <short> destination = (ClBuffer <short>)args[1]; EnqueueReadBuffer(destination.GetClMem, destination.GetBuffer(), out error); }