public Stream Render(string latex) { var painter = new MathPainter { LaTeX = latex }; var path = Path.GetTempFileName(); var measures = painter.Measure(); SKBitmap bitMap = new SKBitmap( width: ((int)measures.Width) + 2 * LatexBorder, height: ((int)measures.Height) + 2 * LatexBorder ); var canvas = new SKCanvas(bitMap); painter.Draw( canvas: canvas, point: new SKPoint(LatexBorder, (measures.Height / 2.0f) + LatexBorder) ); canvas.Flush(); using (var image = SKImage.FromBitmap(bitMap)) using (var data = image.Encode(SKEncodedImageFormat.Png, 100)) { // save the data to a stream using var streamf = File.OpenWrite(path); data.SaveTo(streamf); } return(File.Open(path, FileMode.Open)); }
protected override void OnResultadoPaintSurface(SKSurface s, SKImageInfo i) { base.OnResultadoPaintSurface(s, i); if (ViewModel == null) { return; } var p = new MathPainter(12) { TextColor = SKColors.White }; p.LaTeX = (Result) ? @"\text{Es un número primo}" : @"\text{No es un número primo}"; var pM = p.Measure; if (pM.HasValue) { Resultado.WidthRequest = pM.Value.Width; Resultado.HeightRequest = pM.Value.Height; } p.Draw(s.Canvas, alignment: CSharpMath.Rendering.TextAlignment.Left); }
virtual protected void OnEnunciadoPaintSurface(SKSurface s, SKImageInfo i) { s.Canvas.Clear(SKColors.Green); if (ViewModel == null) { return; } var p = new MathPainter(12) { TextColor = SKColors.White }; p.LaTeX = $@"\text{{{ViewModel?.Numero}. {EnunciadoStr}}}"; var pM = p.Measure; if (pM.HasValue) { Enunciado.WidthRequest = pM.Value.Width; Enunciado.HeightRequest = pM.Value.Height; } p.Draw(s.Canvas, alignment: CSharpMath.Rendering.TextAlignment.Left); }
public int Add(MathPainter argPainter) { var pId = Interlocked.Increment(ref mLastId); mPainters[pId] = argPainter; return(pId); }
private static bool TryRender(string input, out Image image, out string errorMessage) { MathPainter painter = new MathPainter { LaTeX = input, FontSize = 25, DisplayErrorInline = false }; try { Stream stream = painter.DrawAsStream(format: SKEncodedImageFormat.Png); image = Image.FromStream(stream); errorMessage = null; return(true); } catch (NullReferenceException) { image = null; errorMessage = painter.ErrorMessage; return(false); } }
public static void BindDisplay(this MathKeyboard keyboard, SKCanvasView view, MathPainter settings, SKColor caretColor, CaretShape caretShape = CaretShape.IBeam, SKStrokeCap cap = SKStrokeCap.Butt) { view.EnableTouchEvents = true; view.Touch += (sender, e) => { if (e.ActionType == SKTouchAction.Pressed) { keyboard.MoveCaretToPoint(new System.Drawing.PointF(e.Location.X, e.Location.Y)); } }; keyboard.RedrawRequested += (_, __) => view.InvalidateSurface(); view.PaintSurface += (sender, e) => { var c = e.Surface.Canvas; c.Clear(); MathPainter.DrawDisplay(settings, keyboard.Display, c); keyboard.DrawCaret(new SkiaCanvas(c, cap, AntiAlias.Enable), caretColor.FromNative(), caretShape); }; }
public Size CalcSize(MathPainter p) => p.Measure.Value.Size.ToSize() + new Size(4, 4);
public MainPage() { // Basic functionality var view = new SKCanvasView { HeightRequest = 225 }; var keyboard = new MathKeyboard(); var viewModel = (Rendering.MathKeyboard) typeof(MathKeyboard) .GetField("Keyboard", BindingFlags.NonPublic | BindingFlags.Instance) .GetValue(keyboard); view.EnableTouchEvents = true; view.Touch += (sender, e) => { if (e.ActionType == SKTouchAction.Pressed) { viewModel.MoveCaretToPoint (new System.Drawing.PointF(e.Location.X, e.Location.Y)); } }; keyboard.RedrawRequested += (_, __) => view.InvalidateSurface(); view.PaintSurface += (sender, e) => { var c = e.Surface.Canvas; c.Clear(); MathPainter.DrawDisplay(new MathPainter { TextColor = SKColors.Black }, keyboard.Display, c); keyboard.DrawCaret(c, CaretShape.IBeam); }; // Input from physical keyboard var entry = new Entry { Placeholder = "Enter keystrokes..." }; entry.TextChanged += (sender, e) => { entry.Text = ""; foreach (var c in e.NewTextValue) { viewModel.KeyPress((Editor.MathKeyboardInput)c); } }; // Debug labels var latex = new Label { Text = "LaTeX = " }; var ranges = new Label { Text = "Ranges = " }; var index = new Label { Text = "Index = " }; viewModel.RedrawRequested += (sender, e) => { latex.Text = "LaTeX = " + viewModel.LaTeX; ranges.Text = "Ranges = " + string.Join(", ", ((ListDisplay <Fonts, Glyph>)viewModel.Display).Displays.Select(x => x.Range)); index.Text = "Index = " + viewModel.InsertionIndex; }; // Assemble Content = new StackLayout { Children = { latex, ranges, index, view, keyboard, entry } }; }