public void DrawPictureToPictureBuffer(PictureResource resource, bool overlay) { PictureRenderer renderer = new PictureRenderer(this.PictureBuffer); PictureInterpreter interpreter = new PictureInterpreter(); if (!overlay) { renderer.Clear(); } interpreter.Execute(resource, renderer); }
/// <summary> /// Execute the specified picture resource. /// </summary> /// <param name="resource">Picture to execute.</param> /// <param name="renderer">Picture renderer.</param> public void Execute(PictureResource resource, PictureRenderer renderer) { if (resource == null) { throw new ArgumentNullException(nameof(resource)); } this.Renderer = renderer ?? throw new ArgumentNullException(nameof(renderer)); this.pattern = 0; byte[] pictureData = resource.Data; int offset = 0; while (offset < pictureData.Length && pictureData[offset] != PictureCode.End) { byte instruction = pictureData[offset]; offset++; switch (instruction) { case PictureCode.VisualEnabled: this.Renderer.VisualEnabled = true; this.Renderer.VisualColor = pictureData[offset]; offset++; break; case PictureCode.VisualDisabled: this.Renderer.VisualEnabled = false; break; case PictureCode.PriorityEnabled: this.Renderer.PriorityEnabled = true; this.Renderer.PriorityColor = pictureData[offset]; offset++; break; case PictureCode.PriorityDisabled: this.Renderer.PriorityEnabled = false; break; case PictureCode.YCorner: offset = this.ReadYCorner(pictureData, offset); break; case PictureCode.XCorner: offset = this.ReadXCorner(pictureData, offset); break; case PictureCode.AbsoluteLine: offset = this.ReadAbsoluteLine(pictureData, offset); break; case PictureCode.RelativeLine: offset = this.ReadRelativeLine(pictureData, offset); break; case PictureCode.Fill: offset = this.ReadFill(pictureData, offset); break; case PictureCode.Pattern: this.pattern = pictureData[offset]; offset++; break; case PictureCode.Brush: offset = this.ReadBrush(pictureData, offset); break; default: break; } } }