void displayTimer_Tick(object sender, EventArgs e) { if (bitmap == null) { bitmap = new Bitmap(DisplayCmd.Width, DisplayCmd.Height, PixelFormat.Format32bppRgb); BackgroundImage = bitmap; TestImage(); } if (!CommandAvail()) { return; } var bitmapData = bitmap.LockBits(new Rectangle(0, 0, DisplayCmd.Width, DisplayCmd.Height), ImageLockMode.WriteOnly, PixelFormat.Format32bppRgb); var bitmapPtr = (uint *)bitmapData.Scan0; while (CommandAvail()) { bufferReadPos += DisplayCmd.Execute(buffer, bufferReadPos, bitmapPtr); } bitmap.UnlockBits(bitmapData); Invalidate(); }
static bool CommandAvail() { int filled = bufferWritePos - bufferReadPos; if (filled >= MaxCmdLength) { return(true); } lock (buffers) { if (buffers.Count > 0) { var newBuffer = buffers.Dequeue(); if (newBuffer.Length > buffer.Length - bufferWritePos) { Array.Copy(buffer, bufferReadPos, buffer, 0, filled); bufferWritePos -= bufferReadPos; bufferReadPos = 0; } Array.Copy(newBuffer, 0, buffer, bufferWritePos, newBuffer.Length); bufferWritePos += newBuffer.Length; return(CommandAvail()); } } return(filled >= DisplayCmd.CommandLength(buffer[bufferReadPos])); }