コード例 #1
0
        protected override void OnPaint(PaintEventArgs pe)
        {
            //base.OnPaint(pe);

            // Draw white background
            Graphics dc = pe.Graphics;

            dc.ResetTransform();
            dc.FillRectangle(Brushes.White, 0, 0, Width, Height);

            // Draw the raster
            Matrix t = TheRasterModel.GetTikzToScreenTransform().ToMatrix();

            //t.Freeze();

            using (Pen pen = new Pen(Brushes.WhiteSmoke, 0.000001f))
            {
                dc.Transform = t;

                TheRasterModel.DrawRaster(
                    (p1, p2) => dc.DrawLine(pen, p1.ToPointF(), p2.ToPointF()),
                    (r1, r2) =>
                {
                    float rr1 = (float)r1, rr2 = (float)r2;
                    dc.DrawEllipse(pen, -rr1, -rr2, 2 * rr1, 2 * rr2);
                });
            }

            dc.ResetTransform();

            // draw unavailable note
            if (TheDisplayModel.IsUnavailable)
            {
                StringFormat f = new StringFormat();
                f.Alignment     = StringAlignment.Center;
                f.LineAlignment = StringAlignment.Center;
                dc.DrawString("<Unavailable>", new Font("Arial", 16), Brushes.Black, ClientRectangle, f);
            }

            // draw the pdf image
            if (TheDisplayModel.IsImageVisible && TheDisplayModel.Bmp != null)
            {
                Point p = new Point((Width - TheDisplayModel.Bmp.Width) / 2, (Height - TheDisplayModel.Bmp.Height) / 2);
                dc.DrawImageUnscaled(TheDisplayModel.Bmp, p);
            }

            // draw the overlay
            if (ShowOverlay)
            {
                // draw shapes from parsetree
                //foreach (var osv in OSViews)
                //osv.Draw(pe.Graphics);
                foreach (var os in TheOverlayModel.DisplayTree.AllItems)
                {
                    os.Draw(dc, Height);
                }

                // draw (visible) auxiliary shapes
                foreach (var ps in PreviewShapes.Where(o => o.Visible))
                {
                    ps.Draw(pe.Graphics);
                }
            }

            // draw adorner(s)
            foreach (var scope in this.TheOverlayModel.DisplayTree.AllItems.OfType <OverlayScope>().Where(v => v.IsCurEditing))
            {
                System.Windows.Rect ShowAt = scope.BB.UpsideDown(Height);
                ShowAt.Inflate(6, 6);

                dc.DrawRectangle(PensAndBrushes.AdornerPen, ShowAt.ToRectangleF());
            }


            // draw the object marker
            if (MarkObject_ShowMarker && MarkObject_Marked != null)
            {
                System.Windows.Rect ShowAt = MarkObject_Marked.BB.UpsideDown(Height);
                ShowAt.Inflate(15, 15);
                using (Pen p = new Pen(Brushes.Red, 6))
                {
                    dc.DrawEllipse(p, ShowAt.ToRectangleF());
                }
            }
        }
コード例 #2
0
ファイル: RasterControl.cs プロジェクト: wilsoc5/tikzedt
        protected override bool OnExposeEvent(Gdk.EventExpose args)
        {
            //base.OnPaint(pe);
            Cairo.Context dc = Gdk.CairoHelper.Create(args.Window);

            // Draw white background
            //Graphics dc = pe.Graphics;
            dc.IdentityMatrix();

            dc.SetSourceRGB(1.0, 1.0, 1.0);
            dc.Rectangle(0, 0, Allocation.Width, Allocation.Height);
            dc.Fill();

            // Draw the raster
            Cairo.Matrix t = TheRasterModel.GetTikzToScreenTransform().ToCairoMatrix();
            //t.Freeze();

            dc.Save();

            dc.LineWidth = 0.01;            // todo: always 1 pixel
            dc.SetSourceRGB(0.7, 0.7, 0.7); // whitesmoke?
            {
                dc.Transform(t);

                TheRasterModel.DrawRaster(
                    (p1, p2) => { dc.MoveTo(p1.X, p1.Y); dc.LineTo(p2.X, p2.Y); dc.Stroke(); },
                    (r1, r2) =>
                {
                    dc.DrawEllipse(0, 0, 2 * r1, 2 * r2);
                });
            }

            dc.Restore();

            // draw unavailable note
            if (TheDisplayModel.IsUnavailable)
            {
                dc.SetSourceRGB(0, 0, 0);
                dc.SelectFontFace("Arial", Cairo.FontSlant.Normal, Cairo.FontWeight.Normal);
                //StringFormat f = new StringFormat();
                //f.Alignment = StringAlignment.Center;
                //f.LineAlignment = StringAlignment.Center;
                //dc.DrawString("<Unavailable>", new Font("Arial", 16), Brushes.Black, ClientRectangle, f);
                dc.MoveTo(Allocation.Width / 2, Allocation.Height / 2); //todo
                dc.ShowText("<Unavailable>");
            }

            // draw the pdf image
            if (TheDisplayModel.IsImageVisible && TheDisplayModel.Bmp != null)
            {
                Point p = new Point((Allocation.Width - TheDisplayModel.Bmp.Width) / 2, (Allocation.Height - TheDisplayModel.Bmp.Height) / 2);
                //dc.DrawImageUnscaled(TheDisplayModel.Bmp, p);
                dc.SetSource(TheDisplayModel.Bmp, p.X, p.Y);
                //dc.Rectangle(p.X, p.Y, TheDisplayModel.Bmp.Width, TheDisplayModel.Bmp.Height);
                dc.Paint();
            }

            // draw the overlay
            if (ShowOverlay)
            {
                dc.SetSourceRGB(0, 0, 0);
                // draw shapes from parsetree
                foreach (var osv in OSViews)
                {
                    osv.Draw(dc);
                }

                // draw (visible) auxiliary shapes
                foreach (var ps in PreviewShapes.Where(o => o.Visible))
                {
                    ps.Draw(dc);
                }
            }

            // draw adorner(s)
            foreach (var scope in this.OSViews.OfType <OverlayScopeView>().Where(v => v.IsAdornerVisible))
            {
                dc.SetSourceRGB(0.5, 0.5, 0.5);
                dc.LineWidth = 5;
                System.Windows.Rect ShowAt = scope.GetBB(Allocation.Height);
                ShowAt.Inflate(6, 6);

                dc.Rectangle(ShowAt.ToCairoRectangle());  //(PensAndBrushes.AdornerPen, ShowAt.ToRectangleF());
                dc.Stroke();
            }


            // draw the object marker
            if (MarkObject_ShowMarker && MarkObject_Marked != null)
            {
                System.Windows.Rect ShowAt = MarkObject_Marked.GetBB(Allocation.Height);
                ShowAt.Inflate(15, 15);
                //using (Pen p = new Pen(Brushes.Red, 6))
                {
                    dc.SetSourceRGB(1, 0, 0);
                    dc.LineWidth = 6;
                    dc.DrawEllipse(ShowAt);//p,
                }
            }

            ((IDisposable)dc.Target).Dispose();
            ((IDisposable)dc).Dispose();

            return(true);
        }