示例#1
0
        /// <summary>
        /// Draw the text using the FieldWorks IVwGraphicsWin32 interface.
        /// </summary>
        /// <remarks>Only used with Mono</remarks>
        private void DrawFwText(Graphics graphics, Rectangle cellBounds,
                                string text, DataGridViewCellStyle cellStyle, FwTextBoxColumn col)
        {
            Debug.Assert(Platform.IsMono, "This method is only needed on Mono");
            if (String.IsNullOrEmpty(text))
            {
                return;
            }
            IntPtr           hdc = graphics.GetHdc();
            IVwGraphicsWin32 vg  = VwGraphicsWin32Class.Create();               // actually VwGraphicsCairo

            try
            {
                vg.Initialize(hdc);
                var renderProps = GetRenderProps(cellStyle, col);
                vg.SetupGraphics(ref renderProps);
                int x;
                int y;
                GetLocationForText(cellBounds, (col.TextBoxControl.RightToLeft == RightToLeft.Yes),
                                   vg, text, out x, out y);
                vg.PushClipRect(cellBounds);
                vg.DrawText(x, y, text.Length, text, 0);
                vg.PopClipRect();
            }
            finally
            {
                vg.ReleaseDC();
                graphics.ReleaseHdc(hdc);
            }
        }
示例#2
0
        /// <summary>
        /// Get the starting location for drawing the text.
        /// </summary>
        /// <remarks>Only used with Mono</remarks>
        private void GetLocationForText(Rectangle cellBounds, bool fRightToLeft,
                                        IVwGraphicsWin32 vg, string text, out int x, out int y)
        {
            Debug.Assert(Platform.IsMono, "This method is only needed on Mono");
            var contentBounds = cellBounds;

            contentBounds.Height -= 2;
            contentBounds.Width  -= 2;
            int dx0;
            int dy0;

            vg.GetTextExtent(text.Length, text, out dx0, out dy0);
            if (fRightToLeft)
            {
                x = contentBounds.Right - (dx0 + 4);
            }
            else
            {
                x = contentBounds.Left + 4;
            }
            int dy = (contentBounds.Height - dy0) / 2;

            if (dy > 0)
            {
                y = contentBounds.Top + dy;
            }
            else
            {
                y = contentBounds.Top;
            }
        }
示例#3
0
        public void Clipping()
        {
            IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create();

            Assert.IsNotNull(vwGraphics);

            using (var gr = new GraphicsObjectFromImage())
            {
                // start with a blue background.
                using (var blueBrush = new SolidBrush(Color.Blue))
                {
                    gr.Graphics.FillRectangle(blueBrush, new Rectangle(0, 0, 1000, 1000));

                    // Check that filling with a blue brush worked.
                    Assert.IsTrue(ColorCompare(gr.Bitmap.GetPixel(500, 500), Color.Blue));

                    //
                    // Check that drawing using a VwGraphics works.
                    //

                    vwGraphics.Initialize(gr.Graphics.GetHdc());

                    vwGraphics.PushClipRect(new Utils.Rect(0, 0, 1000, 1000));
                    vwGraphics.BackColor = ConvertToVwGraphicsColor(Color.Red);
                    vwGraphics.DrawRectangle(0, 0, 1000, 1000);

                    vwGraphics.PopClipRect();

                    vwGraphics.ReleaseDC();
                    gr.Graphics.ReleaseHdc();

                    gr.Graphics.Flush();

                    // Check that drawing a red rectangle using the VwGraphics Interface worked
                    Assert.IsTrue(ColorCompare(gr.Bitmap.GetPixel(500, 500), Color.Red));

                    /////
                    // Check that VwGraphics doesn't draw outside its clip rect.
                    /////

                    vwGraphics.Initialize(gr.Graphics.GetHdc());
                    // make the clip rect not include the area we are going to draw to.
                    vwGraphics.PushClipRect(new Utils.Rect(100, 100, 200, 200));

                    // attempt to draw off the clip rect.
                    vwGraphics.BackColor = ConvertToVwGraphicsColor(Color.Green);
                    vwGraphics.DrawRectangle(400, 400, 600, 600);

                    vwGraphics.PopClipRect();

                    vwGraphics.ReleaseDC();
                    gr.Graphics.ReleaseHdc();

                    gr.Graphics.Flush();

                    // Check that the green rectangle didn't appear on screen.
                    Assert.IsTrue(!ColorCompare(gr.Bitmap.GetPixel(500, 500), Color.Green));
                }
            }
        }
示例#4
0
            /// --------------------------------------------------------------------------------
            /// <summary>
            /// Initializes a new instance of the <see cref="T:HoldDummyGraphics"/> class.
            /// </summary>
            /// <param name="fontName">Name of the font.</param>
            /// <param name="fBold">if set to <c>true</c> [f bold].</param>
            /// <param name="fItalic">if set to <c>true</c> [f italic].</param>
            /// <param name="ctrl">The parent control</param>
            /// --------------------------------------------------------------------------------
            public HoldDummyGraphics(string fontName, bool fBold, bool fItalic, Control ctrl)
            {
                // Make a VwGraphics and initialize it.
                IVwGraphicsWin32 vwGraphics32 = VwGraphicsWin32Class.Create();

                m_vwGraphics = vwGraphics32;
                m_graphics   = ctrl.CreateGraphics();
                m_hdc        = m_graphics.GetHdc();
                ((IVwGraphicsWin32)m_vwGraphics).Initialize(m_hdc);

                // Select our font into it.
                var chrp = new LgCharRenderProps();

                chrp.szFaceName = new ushort[32];
                for (int ich = 0; ich < fontName.Length; ++ich)
                {
                    if (ich < 32)
                    {
                        chrp.szFaceName[ich] = fontName[ich];
                    }
                }
                if (fontName.Length < 32)
                {
                    chrp.szFaceName[fontName.Length] = 0;
                }
                else
                {
                    chrp.szFaceName[31] = 0;
                }
                chrp.ttvBold = (int)(fBold ? FwTextToggleVal.kttvForceOn
                                        : FwTextToggleVal.kttvOff);
                chrp.ttvItalic = (int)(fItalic ? FwTextToggleVal.kttvForceOn
                                        : FwTextToggleVal.kttvOff);
                m_vwGraphics.SetupGraphics(ref chrp);
            }
示例#5
0
        protected void ProcessInitialize(IEnumerable <string> arguments)
        {
            string handle = arguments.Skip(1).First();


            if (VwGraphicsLookup.Keys.Contains(handle))
            {
                var      bitmap = new Bitmap(1000, 1000);
                Graphics gr     = Graphics.FromImage(bitmap);
                VwGraphicsLookup[handle].Initialize(gr.GetHdc());
                GraphicsLookup[handle] = gr;
                BitmapLookup[handle]   = bitmap;
            }
            else
            {
                IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create();
                var      bitmap             = new Bitmap(1000, 1000);
                Graphics gr = Graphics.FromImage(bitmap);
                vwGraphics.Initialize(gr.GetHdc());
                VwGraphicsLookup.Add(handle, vwGraphics);
                GraphicsLookup[handle] = gr;
                BitmapLookup[handle]   = bitmap;

                m_vwGraphics32 = vwGraphics;
            }
        }
示例#6
0
        public void GetTextExtentWithEmptyString()
        {
            IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create();

            Assert.IsNotNull(vwGraphics);

            using (var gr = new GraphicsObjectFromImage())
            {
                const int areaWidth  = 1000;
                const int areaHeight = 1000;

                vwGraphics.Initialize(gr.Graphics.GetHdc());

                vwGraphics.PushClipRect(new Utils.Rect(0, 0, areaWidth, areaHeight));
                vwGraphics.ForeColor = ConvertToVwGraphicsColor(Color.Black);

                int extentX;
                int extentY;

                vwGraphics.GetTextExtent(0, String.Empty, out extentX, out extentY);

                Assert.That(extentX == 0, "extentX should equal 0");
                Assert.That(extentY > 0, "extentY should be greater than 0");

                vwGraphics.PopClipRect();

                vwGraphics.ReleaseDC();
                gr.Graphics.ReleaseHdc();
            }
        }
        /// <summary>
        /// See C++ documentation
        /// </summary>
        public void DrawTheRootAt(IVwRootBox prootb, IntPtr hdc, Rect rcpDraw, uint bkclr,
                                  bool fDrawSel, IVwGraphics pvg, Rect rcSrc, Rect rcDst, int ysTop, int dysHeight)
        {
            IVwGraphicsWin32 qvg32 = VwGraphicsWin32Class.Create();

            using (Graphics screen = Graphics.FromHdc(hdc))
            {
                Rectangle rcp    = rcpDraw;
                Rectangle rcFill = new Rect(0, 0, rcp.Width, rcp.Height);

                using (var memoryBuffer = new MemoryBuffer(rcp.Width, rcp.Height))
                {
                    memoryBuffer.Graphics.FillRectangle(new SolidBrush(ColorUtil.ConvertBGRtoColor(bkclr)), rcFill);

                    qvg32.Initialize(memoryBuffer.Graphics.GetHdc());
                    qvg32.XUnitsPerInch = rcDst.right - rcDst.left;
                    qvg32.YUnitsPerInch = rcDst.bottom - rcDst.top;

                    try
                    {
                        prootb.DrawRoot2(qvg32, rcSrc, rcDst, fDrawSel, ysTop, dysHeight);
                    }
                    catch (Exception)
                    {
                        qvg32.ReleaseDC();
                        throw;
                    }

                    screen.DrawImageUnscaled(memoryBuffer.Bitmap, rcp);

                    qvg32.ReleaseDC();
                }
            }
        }
示例#8
0
        /// <summary>
        /// Get the starting location for drawing the text.
        /// </summary>
        private void GetLocationForText(Rectangle cellBounds, bool fRightToLeft,
                                        IVwGraphicsWin32 vg, string text, out int x, out int y)
        {
            var contentBounds = cellBounds;

            contentBounds.Height -= 2;
            contentBounds.Width  -= 2;
            int dx0;
            int dy0;

            vg.GetTextExtent(text.Length, text, out dx0, out dy0);
            if (fRightToLeft)
            {
                x = contentBounds.Right - (dx0 + 4);
            }
            else
            {
                x = contentBounds.Left + 4;
            }
            int dy = (contentBounds.Height - dy0) / 2;

            if (dy > 0)
            {
                y = contentBounds.Top + dy;
            }
            else
            {
                y = contentBounds.Top;
            }
        }
示例#9
0
        /// <summary>
        /// Skip the argument name
        /// Read the ptr value which should always be the first item.
        /// Return the rest of the parameters (if any)
        /// </summary>
        protected IEnumerable <string> SwitchToCorrectVwGraphics(IEnumerable <string> arguments)
        {
            var ptr = arguments.Skip(1);

            m_currentVwGraphicHandle = ptr.First();
            if (VwGraphicsLookup.Keys.Contains(ptr.First()))
            {
                m_vwGraphics32 = VwGraphicsLookup[ptr.First()];
            }

            return(ptr.Skip(1));
        }
示例#10
0
        public void SimpleCreationAndRelease()
        {
            IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create();

            Assert.IsNotNull(vwGraphics);

            using (var gr = new GraphicsObjectFromImage())
            {
                vwGraphics.Initialize(gr.Graphics.GetHdc());
                vwGraphics.ReleaseDC();
            }
        }
示例#11
0
		void Dispose(bool properly)
		{
			// Can't do anything sensible if called from destructor; nothing to do if somehow called twice.
			if (!properly || m_graphics == null)
				return;
			IntPtr hdc = m_vwGraphics.GetDeviceContext();
			m_vwGraphics.ReleaseDC();
			if (hdc != IntPtr.Zero)
				m_graphics.ReleaseHdc(hdc);
			m_vwGraphics = null;
			if (m_shouldDisposeGraphics)
				m_graphics.Dispose();
			m_graphics = null;
		}
        /// <summary>
        /// Draws the Root into a memory buffer, then rotates it 90deg clockwise while drawing
        /// the memory buffer to the screen.
        /// See C++ documentation for more info.
        /// </summary>
        public void DrawTheRootRotated(IVwRootBox rootb, IntPtr hdc, Rect rcpDraw, uint bkclr,
                                       bool fDrawSel, IVwRootSite vrs, int nHow)
        {
            IVwGraphicsWin32 qvg32  = VwGraphicsWin32Class.Create();
            Rectangle        rcp    = new Rectangle(rcpDraw.top, rcpDraw.left, rcpDraw.bottom, rcpDraw.right);
            Rectangle        rcFill = new Rect(0, 0, rcp.Width, rcp.Height);

            using (Graphics screen = Graphics.FromHdc(hdc))
                using (var memoryBuffer = new MemoryBuffer(rcp.Width, rcp.Height))
                {
                    memoryBuffer.Graphics.FillRectangle(new SolidBrush(ColorUtil.ConvertBGRtoColor(bkclr)), rcFill);
                    qvg32.Initialize(memoryBuffer.Graphics.GetHdc());

                    IVwGraphics qvgDummy = null;
                    try
                    {
                        Rect rcDst, rcSrc;
                        vrs.GetGraphics(rootb, out qvgDummy, out rcSrc, out rcDst);
                        Rectangle temp = rcDst;
                        temp.Offset(-rcp.Left, -rcp.Top);
                        rcDst = temp;

                        qvg32.XUnitsPerInch = qvgDummy.XUnitsPerInch;
                        qvg32.YUnitsPerInch = qvgDummy.YUnitsPerInch;

                        rootb.DrawRoot(qvg32, rcSrc, rcDst, fDrawSel);
                        vrs.ReleaseGraphics(rootb, qvgDummy);
                        qvgDummy = null;
                    }
                    catch (Exception)
                    {
                        if (qvgDummy != null)
                        {
                            vrs.ReleaseGraphics(rootb, qvgDummy);
                        }
                        qvg32.ReleaseDC();
                        throw;
                    }

                    Point[] rgptTransform = new Point[3];
                    rgptTransform[0] = new Point(rcpDraw.right, rcpDraw.top);            // upper left of actual drawing maps to top right of rotated drawing

                    rgptTransform[1] = new Point(rcpDraw.right, rcpDraw.bottom);         // upper right of actual drawing maps to bottom right of rotated drawing.
                    rgptTransform[2] = new Point(rcpDraw.left, rcpDraw.top);             // bottom left of actual drawing maps to top left of rotated drawing.

                    screen.DrawImage((Image)memoryBuffer.Bitmap, rgptTransform, new Rectangle(0, 0, rcp.Width, rcp.Height), GraphicsUnit.Pixel);

                    qvg32.ReleaseDC();
                }
        }
示例#13
0
        /// ------------------------------------------------------------------------------------
        /// <summary>
        ///
        /// </summary>
        /// <param name="disposing"></param>
        /// ------------------------------------------------------------------------------------
        protected void Dispose(bool disposing)
        {
            if (disposing)
            {
                Debug.Assert(m_cactInitGraphics == 0, "We should release the HDC before disposing");
                if (m_graphics != null)
                {
                    m_graphics.Dispose();
                }
            }

            m_graphics   = null;
            m_vwGraphics = null;
            m_parent     = null;
            m_fDisposed  = true;
        }
        /// ------------------------------------------------------------------------------------
        /// <summary>
        /// Make sure the graphics object has a DC. If it already has, increment a count,
        /// so we know when to really free the DC.
        /// </summary>
        /// <param name="dpix">The DPI in the x direction.</param>
        /// <param name="dpiy">The DPI in the y direction.</param>
        /// <param name="zoom">The zoom percentage.</param>
        /// ------------------------------------------------------------------------------------
        private void Init(int dpix, int dpiy, float zoom)
        {
            CheckDisposed();

            if (m_cactInitGraphics == 0)
            {
                // We are asking for a VwGraphics but haven't been given a DC. Make one.
                // (ReleaseHdc is called in Uninit!)
                // TODO: we might want a graphics appropriate for our printer.
                m_graphics = m_parent.CreateGraphics();
                if (m_vwGraphics == null)
                {
                    m_vwGraphics = VwGraphicsWin32Class.Create();
                }

                if (m_graphics != null)
                {
                    if (dpix <= 0)
                    {
                        dpix = (int)(m_graphics.DpiX * zoom);
                    }
                    if (dpiy <= 0)
                    {
                        dpiy = (int)(m_graphics.DpiY * zoom);
                    }
                    IntPtr hdc = m_graphics.GetHdc();
                    m_vwGraphics.Initialize(hdc);
                }
                else
                {
                    // we think m_graphics should never be null. But it has happened (see e.g. LTB-708).
                    // So provide a desperate fall-back.
                    if (dpix <= 0)
                    {
                        dpix = 96;
                    }
                    if (dpiy <= 0)
                    {
                        dpiy = 96;
                    }
                    SIL.Utils.Logger.WriteEvent(String.Format("WARNING: failed to create m_graphics in GraphicsManager.Init({0}, {1}, {2})", dpix, dpiy, zoom));
                }
                m_vwGraphics.XUnitsPerInch = dpix;
                m_vwGraphics.YUnitsPerInch = dpiy;
            }
            m_cactInitGraphics++;
        }
        /// ------------------------------------------------------------------------------------
        /// <summary>
        ///
        /// </summary>
        /// <param name="disposing"></param>
        /// ------------------------------------------------------------------------------------
        protected virtual void Dispose(bool disposing)
        {
            Debug.WriteLineIf(!disposing, "****************** Missing Dispose() call for " + GetType().Name + "******************");
            if (disposing)
            {
                Debug.Assert(m_cactInitGraphics == 0, "We should release the HDC before disposing");
                if (m_graphics != null)
                {
                    m_graphics.Dispose();
                }
            }

            m_graphics   = null;
            m_vwGraphics = null;
            m_parent     = null;
            m_fDisposed  = true;
        }
示例#16
0
        internal void TestGetTextExtentHelper(string testString)
        {
            IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create();

            Assert.IsNotNull(vwGraphics);

            using (var gr = new GraphicsObjectFromImage())
            {
                const int areaWidth  = 500;
                const int areaHeight = 500;

                // start with a White background.
                using (var blueBrush = new SolidBrush(Color.White))
                {
                    gr.Graphics.FillRectangle(blueBrush, new Rectangle(0, 0, areaWidth, areaHeight));

                    Assert.AreEqual(-1, SearchForBottomMostNonWhitePixel(gr.Bitmap, areaWidth, areaHeight), "Should all be white #1");
                    Assert.AreEqual(-1, SearchForRightMostNonWhitePixel(gr.Bitmap, areaWidth, areaHeight), "Should all be white #2");

                    vwGraphics.Initialize(gr.Graphics.GetHdc());

                    vwGraphics.PushClipRect(new Utils.Rect(0, 0, areaWidth, areaHeight));
                    vwGraphics.ForeColor = ConvertToVwGraphicsColor(Color.Black);

                    int extentX;
                    int extentY;

                    vwGraphics.GetTextExtent(testString.Length, testString, out extentX, out extentY);

                    Assert.That(extentX > 0, "extentX should be greater than 0");
                    Assert.That(extentY > 0, "extentY should be greater than 0");

                    vwGraphics.DrawText(0, 0, testString.Length, testString, 0);

                    vwGraphics.PopClipRect();

                    vwGraphics.ReleaseDC();
                    gr.Graphics.ReleaseHdc();
                    gr.Graphics.Flush();

                    Assert.That(SearchForBottomMostNonWhitePixel(gr.Bitmap, areaWidth, areaHeight) <= extentY, String.Format("Should be <= {0}", extentY));
                    Assert.That(SearchForRightMostNonWhitePixel(gr.Bitmap, areaWidth, areaHeight) <= extentX, String.Format("Should be <= {0}", extentX));
                }
            }
        }
示例#17
0
        public void LargeRectangles()
        {
            // EB/2011-02-08: this test is failing for me on Linux. Not sure if it should work
            // or what (see FWNX-449). Test is failing in FillRectangle similar to the failure
            // in the following comment
            // https://www.jira.insitehome.org/browse/FWNX-449?focusedCommentId=108054&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-108054
            IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create();

            Assert.IsNotNull(vwGraphics);

            const int width  = 1241;
            const int height = 56080;             // something bigger than MAX_IMAGE_SIZE (32767)

            using (var gr = new GraphicsObjectFromImage(width, height))
            {
                // start with a blue background.
                using (var blueBrush = new SolidBrush(Color.Blue))
                {
                    gr.Graphics.FillRectangle(blueBrush, new Rectangle(0, 0, width, height));

                    // Check that filling with a blue brush worked.
                    Assert.IsTrue(ColorCompare(gr.Bitmap.GetPixel(width - 1, height - 1), Color.Blue));

                    /////
                    // Check that drawing using a VwGraphics works.
                    ////

                    vwGraphics.Initialize(gr.Graphics.GetHdc());

                    vwGraphics.PushClipRect(new Utils.Rect(0, 0, width, height));
                    vwGraphics.BackColor = ConvertToVwGraphicsColor(Color.Red);
                    vwGraphics.DrawRectangle(0, 0, width, height);

                    vwGraphics.PopClipRect();

                    vwGraphics.ReleaseDC();
                    gr.Graphics.ReleaseHdc();

                    gr.Graphics.Flush();

                    // Check that drawing a red rectangle using the VwGraphics Interface worked
                    Assert.IsTrue(ColorCompare(gr.Bitmap.GetPixel(width - 1, height - 1), Color.Red));
                }
            }
        }
示例#18
0
        public void ComplexClipping()
        {
            IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create();

            Assert.IsNotNull(vwGraphics);

            using (var gr = new GraphicsObjectFromImage())
            {
                vwGraphics.Initialize(gr.Graphics.GetHdc());

                // Test on a single push
                int left, top, right, bottom;

                vwGraphics.PushClipRect(new Utils.Rect(50, 60, 500, 510));
                vwGraphics.GetClipRect(out left, out top, out right, out bottom);
                Assert.AreEqual(50, left, "Left doesn't match");
                Assert.AreEqual(60, top, "Top doesn't match");
                Assert.AreEqual(500, right, "Right doesn't match");
                Assert.AreEqual(510, bottom, "Bottom doesn't match");

                // Test on a second push
                vwGraphics.PushClipRect(new Utils.Rect(1, 1, 300, 310));
                vwGraphics.GetClipRect(out left, out top, out right, out bottom);
                Assert.AreEqual(50, left, "Left doesn't match");
                Assert.AreEqual(60, top, "Top doesn't match");
                Assert.AreEqual(300, right, "Right doesn't match");
                Assert.AreEqual(310, bottom, "Bottom doesn't match");

                vwGraphics.PopClipRect();
                vwGraphics.GetClipRect(out left, out top, out right, out bottom);
                Assert.AreEqual(50, left, "Left doesn't match");
                Assert.AreEqual(60, top, "Top doesn't match");
                Assert.AreEqual(500, right, "Right doesn't match");
                Assert.AreEqual(510, bottom, "Bottom doesn't match");
                vwGraphics.PopClipRect();
                vwGraphics.GetClipRect(out left, out top, out right, out bottom);
                Assert.AreEqual(0, left, "Left doesn't match");
                Assert.AreEqual(0, top, "Top doesn't match");
                Assert.AreEqual(1000, right, "Right doesn't match");
                Assert.AreEqual(1000, bottom, "Bottom doesn't match");

                vwGraphics.ReleaseDC();
                gr.Graphics.ReleaseHdc();
            }
        }
示例#19
0
        public void TextClipping()
        {
            const string longString = "abcdefghijklmnopqrstuvwzyzabcdefghijklmnopqrstuvwzyzabcdefghijklmnopqrstuvwzyz";

            IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create();

            Assert.IsNotNull(vwGraphics);

            using (var gr = new GraphicsObjectFromImage())
            {
                const int areaWidth  = 500;
                const int areaHeight = 500;

                const int clipLeft  = 300;
                const int clipRight = 400;

                // start with a White background.
                using (var blueBrush = new SolidBrush(Color.White))
                {
                    gr.Graphics.FillRectangle(blueBrush, new Rectangle(0, 0, areaWidth, areaHeight));

                    Assert.AreEqual(-1, SearchForBottomMostNonWhitePixel(gr.Bitmap, areaWidth, areaHeight), "Should all be white #1");
                    Assert.AreEqual(-1, SearchForRightMostNonWhitePixel(gr.Bitmap, areaWidth, areaHeight), "Should all be white #2");

                    vwGraphics.Initialize(gr.Graphics.GetHdc());

                    vwGraphics.PushClipRect(new Utils.Rect(clipLeft, 0, clipRight, areaHeight));
                    vwGraphics.ForeColor = ConvertToVwGraphicsColor(Color.Black);

                    vwGraphics.DrawText(0, 0, longString.Length, longString, 0);

                    vwGraphics.PopClipRect();

                    vwGraphics.ReleaseDC();
                    gr.Graphics.ReleaseHdc();
                    gr.Graphics.Flush();

                    Assert.That(SearchForLeftMostNonWhitePixel(gr.Bitmap, areaWidth, areaHeight) >= clipLeft, String.Format("Should be >= {0}", clipLeft));
                    Assert.That(SearchForRightMostNonWhitePixel(gr.Bitmap, areaWidth, areaHeight) <= clipRight, String.Format("Should be <= {0}", clipRight));
                }
            }
        }
示例#20
0
        void Dispose(bool properly)
        {
            // Can't do anything sensible if called from destructor; nothing to do if somehow called twice.
            if (!properly || m_graphics == null)
            {
                return;
            }
            IntPtr hdc = m_vwGraphics.GetDeviceContext();

            m_vwGraphics.ReleaseDC();
            if (hdc != IntPtr.Zero)
            {
                m_graphics.ReleaseHdc(hdc);
            }
            m_vwGraphics = null;
            if (m_shouldDisposeGraphics)
            {
                m_graphics.Dispose();
            }
            m_graphics = null;
        }
示例#21
0
        public void GetClipRect()
        {
            IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create();

            Assert.IsNotNull(vwGraphics);

            using (var gr = new GraphicsObjectFromImage())
            {
                vwGraphics.Initialize(gr.Graphics.GetHdc());

                var rect1 = new Utils.Rect(0, 0, 1000, 1000);
                var rect2 = new Utils.Rect(500, 500, 700, 700);

                vwGraphics.PushClipRect(rect1);

                int left, top, right, bottom;
                vwGraphics.GetClipRect(out left, out top, out right, out bottom);

                Assert.IsTrue(left == rect1.left, "First push failed: left");
                Assert.IsTrue(right == rect1.right, "First push failed: right");
                Assert.IsTrue(top == rect1.top, "First push failed: top");
                Assert.IsTrue(bottom == rect1.bottom, "First push failed: bottom");

                // try a second rectangle
                vwGraphics.PushClipRect(rect2);

                vwGraphics.GetClipRect(out left, out top, out right, out bottom);
                Assert.IsTrue(left == rect2.left, "Second push failed: left");
                Assert.IsTrue(right == rect2.right, "Second push failed: right");
                Assert.IsTrue(top == rect2.top, "Second push failed: top");
                Assert.IsTrue(bottom == rect2.bottom, "Second push failed: bottom");

                vwGraphics.PopClipRect();
                vwGraphics.PopClipRect();

                vwGraphics.ReleaseDC();
                gr.Graphics.ReleaseHdc();
            }
        }
示例#22
0
        /// <summary>
        /// Make one with the specified control and Graphics (typically passed in to a Paint method). The Graphics will not be disposed.
        /// </summary>
        public GraphicsManager(Control c, Graphics g)
        {
            m_graphics = g;
            if (g == null)
            {
                m_graphics = c.CreateGraphics();
                m_shouldDisposeGraphics = true;
            }
            m_vwGraphics = VwGraphicsWin32Class.Create();
            double zoom = 1.0;             // eventually an argument, probably

            m_dpiX = m_graphics.DpiX;
            m_dpiY = m_graphics.DpiY;
            int    dpix = (int)(m_dpiX * zoom);
            int    dpiy = (int)(m_dpiY * zoom);
            IntPtr hdc  = m_graphics.GetHdc();

            m_vwGraphics.Initialize(hdc);
            m_vwGraphics.XUnitsPerInch = dpix;
            m_vwGraphics.YUnitsPerInch = dpiy;
            m_vwGraphics.BackColor     = (int)FwTextColor.kclrTransparent;
        }
示例#23
0
        public void SetClipRect()
        {
            IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create();

            Assert.IsNotNull(vwGraphics);

            using (var gr = new GraphicsObjectFromImage())
            {
                vwGraphics.Initialize(gr.Graphics.GetHdc());

                int left, top, right, bottom;

                var rect = new Utils.Rect(50, 25, 1000, 1000);
                vwGraphics.SetClipRect(ref rect);
                vwGraphics.GetClipRect(out left, out top, out right, out bottom);

                Assert.AreEqual(50, left, "Left doesn't match");
                Assert.AreEqual(25, top, "Top doesn't match");
                Assert.AreEqual(1000, right, "Right doesn't match");
                Assert.AreEqual(1000, bottom, "Bottom doesn't match");
            }
        }
示例#24
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		///
		/// </summary>
		/// <param name="disposing"></param>
		/// ------------------------------------------------------------------------------------
		protected virtual void Dispose(bool disposing)
		{
			Debug.WriteLineIf(!disposing, "****************** Missing Dispose() call for " + GetType().Name + "******************");
			if (disposing)
			{
				Debug.Assert(m_cactInitGraphics == 0, "We should release the HDC before disposing");
				if (m_graphics != null)
					m_graphics.Dispose();
			}

			m_graphics = null;
			m_vwGraphics = null;
			m_parent = null;
			m_fDisposed = true;
		}
示例#25
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		/// Make sure the graphics object has a DC. If it already has, increment a count,
		/// so we know when to really free the DC.
		/// </summary>
		/// <param name="dpix">The DPI in the x direction.</param>
		/// <param name="dpiy">The DPI in the y direction.</param>
		/// <param name="zoom">The zoom percentage.</param>
		/// ------------------------------------------------------------------------------------
		private void Init(int dpix, int dpiy, float zoom)
		{
			CheckDisposed();

			if (m_cactInitGraphics == 0)
			{
				// We are asking for a VwGraphics but haven't been given a DC. Make one.
				// (ReleaseHdc is called in Uninit!)
				// TODO: we might want a graphics appropriate for our printer.
				m_graphics = m_parent.CreateGraphics();
				if (m_vwGraphics == null)
					m_vwGraphics = VwGraphicsWin32Class.Create();

				if (m_graphics != null)
				{
					if (dpix <= 0)
						dpix = (int) (m_graphics.DpiX*zoom);
					if (dpiy <= 0)
						dpiy = (int) (m_graphics.DpiY*zoom);
					IntPtr hdc = m_graphics.GetHdc();
					m_vwGraphics.Initialize(hdc);
				}
				else
				{
					// we think m_graphics should never be null. But it has happened (see e.g. LTB-708).
					// So provide a desperate fall-back.
					if (dpix <= 0)
						dpix = 96;
					if (dpiy <= 0)
						dpiy = 96;
					SIL.Utils.Logger.WriteEvent(String.Format("WARNING: failed to create m_graphics in GraphicsManager.Init({0}, {1}, {2})", dpix, dpiy, zoom));
				}
				m_vwGraphics.XUnitsPerInch = dpix;
				m_vwGraphics.YUnitsPerInch = dpiy;
			}
			m_cactInitGraphics++;
		}
示例#26
0
			/// --------------------------------------------------------------------------------
			/// <summary>
			/// Sets the VwGraphics object.
			/// </summary>
			/// <param name="vwGraphics">The VwGraphics object.</param>
			/// --------------------------------------------------------------------------------
			public void SetVwGraphics(IVwGraphicsWin32 vwGraphics)
			{
				m_vwGraphics = vwGraphics;
			}
示例#27
0
		/// <summary>
		/// Skip the argument name
		/// Read the ptr value which should always be the first item.
		/// Return the rest of the parameters (if any)
		/// </summary>
		protected IEnumerable<string> SwitchToCorrectVwGraphics(IEnumerable<string> arguments)
		{
			var ptr = arguments.Skip(1);
			m_currentVwGraphicHandle = ptr.First();
			if (VwGraphicsLookup.Keys.Contains(ptr.First()))
				m_vwGraphics32 = VwGraphicsLookup[ptr.First()];

			return ptr.Skip(1);
		}
示例#28
0
		protected void ProcessInitialize(IEnumerable<string> arguments)
		{
			string handle = arguments.Skip(1).First();


			if (VwGraphicsLookup.Keys.Contains(handle))
			{
				var bitmap = new Bitmap(1000,1000);
				Graphics gr = Graphics.FromImage(bitmap);
				VwGraphicsLookup[handle].Initialize(gr.GetHdc());
				GraphicsLookup[handle] = gr;
				BitmapLookup[handle] = bitmap;
			}
			else
			{
				IVwGraphicsWin32 vwGraphics = VwGraphicsWin32Class.Create();
				var bitmap = new Bitmap(1000,1000);
				Graphics gr = Graphics.FromImage(bitmap);
				vwGraphics.Initialize(gr.GetHdc());
				VwGraphicsLookup.Add(handle, vwGraphics);
				GraphicsLookup[handle] = gr;
				BitmapLookup[handle] = bitmap;

				m_vwGraphics32 = vwGraphics;
			}
		}
示例#29
0
		/// <summary>
		/// Get the starting location for drawing the text.
		/// </summary>
		private void GetLocationForText(Rectangle cellBounds, bool fRightToLeft,
			IVwGraphicsWin32 vg, string text, out int x, out int y)
		{
			var contentBounds = cellBounds;
			contentBounds.Height -= 2;
			contentBounds.Width -= 2;
			int dx0;
			int dy0;
			vg.GetTextExtent(text.Length, text, out dx0, out dy0);
			if (fRightToLeft)
			{
				x = contentBounds.Right - (dx0 + 4);
			}
			else
			{
				x = contentBounds.Left + 4;
			}
			int dy = (contentBounds.Height - dy0) / 2;
			if (dy > 0)
				y = contentBounds.Top + dy;
			else
				y = contentBounds.Top;
		}
示例#30
0
		/// ------------------------------------------------------------------------------------
		/// <summary>
		///
		/// </summary>
		/// <param name="disposing"></param>
		/// ------------------------------------------------------------------------------------
		protected void Dispose(bool disposing)
		{
			if (disposing)
			{
				Debug.Assert(m_cactInitGraphics == 0, "We should release the HDC before disposing");
				if (m_graphics != null)
					m_graphics.Dispose();
			}

			m_graphics = null;
			m_vwGraphics = null;
			m_parent = null;
			m_fDisposed = true;
		}
示例#31
0
 /// --------------------------------------------------------------------------------
 /// <summary>
 /// Sets the VwGraphics object.
 /// </summary>
 /// <param name="vwGraphics">The VwGraphics object.</param>
 /// --------------------------------------------------------------------------------
 public void SetVwGraphics(IVwGraphicsWin32 vwGraphics)
 {
     m_vwGraphics = vwGraphics;
 }
        /// <summary>
        /// See C++ documentation
        /// </summary>
        public void DrawTheRoot(IVwRootBox prootb, IntPtr hdc, Rect rcpDraw, uint bkclr,
                                bool fDrawSel, IVwRootSite pvrs)
        {
            IVwSynchronizer synchronizer = prootb.Synchronizer;

            if (synchronizer != null)
            {
                try
                {
                    if (synchronizer.IsExpandingLazyItems)
                    {
                        return;
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("call to IsExpandingLazyItems caused exceptionException e ={0}", e);
                }
            }

            IVwGraphicsWin32 qvg = VwGraphicsWin32Class.Create();
            Rectangle        rcp = rcpDraw;

            using (Graphics screen = Graphics.FromHdc(hdc))
                using (var memoryBuffer = new MemoryBuffer(rcp.Width, rcp.Height))
                {
                    memoryBuffer.Graphics.FillRectangle(new SolidBrush(ColorUtil.ConvertBGRtoColor(bkclr)), 0, 0,
                                                        rcp.Width, rcp.Height);
                    qvg.Initialize(memoryBuffer.Graphics.GetHdc());
                    VwPrepDrawResult xpdr     = VwPrepDrawResult.kxpdrAdjust;
                    IVwGraphics      qvgDummy = null;

                    try
                    {
                        Rect rcDst, rcSrc;
                        while (xpdr == VwPrepDrawResult.kxpdrAdjust)
                        {
                            pvrs.GetGraphics(prootb, out qvgDummy, out rcSrc, out rcDst);
                            Rectangle temp = rcDst;
                            temp.Offset(-rcp.Left, -rcp.Top);
                            rcDst = temp;

                            qvg.XUnitsPerInch = qvgDummy.XUnitsPerInch;
                            qvg.YUnitsPerInch = qvgDummy.YUnitsPerInch;

                            xpdr = prootb.PrepareToDraw(qvg, rcSrc, rcDst);
                            pvrs.ReleaseGraphics(prootb, qvgDummy);
                            qvgDummy = null;
                        }

                        if (xpdr != VwPrepDrawResult.kxpdrInvalidate)
                        {
                            pvrs.GetGraphics(prootb, out qvgDummy, out rcSrc, out rcDst);

                            Rectangle temp = rcDst;
                            temp.Offset(-rcp.Left, -rcp.Top);
                            rcDst = temp;

                            qvg.XUnitsPerInch = qvgDummy.XUnitsPerInch;
                            qvg.YUnitsPerInch = qvgDummy.YUnitsPerInch;

                            try
                            {
                                prootb.DrawRoot(qvg, rcSrc, rcDst, fDrawSel);
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine("DrawRoot e = {0} qvg = {1} rcSrc = {2} rcDst = {3} fDrawSel = {4}", e, qvg, rcSrc, rcDst, fDrawSel);
                            }
                            pvrs.ReleaseGraphics(prootb, qvgDummy);
                            qvgDummy = null;
                        }
                    }
                    catch (Exception)
                    {
                        if (qvgDummy != null)
                        {
                            pvrs.ReleaseGraphics(prootb, qvgDummy);
                        }
                        qvg.ReleaseDC();
                        throw;
                    }

                    if (xpdr != VwPrepDrawResult.kxpdrInvalidate)
                    {
                        screen.DrawImageUnscaled(memoryBuffer.Bitmap, rcp.Left, rcp.Top, rcp.Width, rcp.Height);
                    }

                    qvg.ReleaseDC();
                }
        }
示例#33
0
		/// <summary>
		/// Make one with the specified control and Graphics (typically passed in to a Paint method). The Graphics will not be disposed.
		/// </summary>
		public GraphicsManager(Control c, Graphics g)
		{
			m_graphics = g;
			if (g == null)
			{
				m_graphics = c.CreateGraphics();
				m_shouldDisposeGraphics = true;
			}
			m_vwGraphics = VwGraphicsWin32Class.Create();
			double zoom = 1.0; // eventually an argument, probably
			m_dpiX = m_graphics.DpiX;
			m_dpiY = m_graphics.DpiY;
			int dpix = (int)(m_dpiX * zoom);
			int dpiy = (int)(m_dpiY * zoom);
			IntPtr hdc = m_graphics.GetHdc();
			m_vwGraphics.Initialize(hdc);
			m_vwGraphics.XUnitsPerInch = dpix;
			m_vwGraphics.YUnitsPerInch = dpiy;
			m_vwGraphics.BackColor = (int)FwTextColor.kclrTransparent;
		}