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));
        }
Exemple #2
0
        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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
            }
        }
Exemple #6
0
 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);
     };
 }
Exemple #7
0
 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 }
            };
        }