public override void Render(IVertexSource vertexSource, IColorType colorIn)
        {
            PreRender();

            if (DoEdgeAntiAliasing)
            {
                DrawAAShape(vertexSource, colorIn);
            }
            else
            {
                vertexSource.rewind(0);

                Affine transform = GetTransform();
                if (!transform.is_identity())
                {
                    vertexSource = new VertexSourceApplyTransform(vertexSource, transform);
                }

                Color colorBytes = colorIn.ToColor();
                GL.Color4(colorBytes.red, colorBytes.green, colorBytes.blue, colorBytes.alpha);

                renderNowTesselator.Clear();
                VertexSourceToTesselator.SendShapeToTesselator(renderNowTesselator, vertexSource);
            }

            PopOrthoProjection();
        }
        public void DrawAACircle(Vector2 start, double radius, IColorType colorIn)
        {
            Color colorBytes = colorIn.ToColor();

            GL.Color4(colorBytes.red, colorBytes.green, colorBytes.blue, colorBytes.alpha);

            Affine transform = GetTransform();

            if (!transform.is_identity())
            {
                transform.transform(ref start);
            }

            // now draw the end rounds
            int     numSegments     = 12;
            double  anglePerSegment = MathHelper.Tau / numSegments;
            Vector2 currentOffset   = new Vector2(0, radius);
            Vector2 curveStart      = start + currentOffset;

            for (int i = 0; i < numSegments; i++)
            {
                currentOffset.Rotate(anglePerSegment);
                Vector2 curveEnd = start + currentOffset;

                triangleEddgeInfo.Draw1EdgeTriangle(curveStart, curveEnd, start);
                curveStart = curveEnd;
            }
        }
Exemple #3
0
 internal HistoryData(int Capacity, IColorType Color)
 {
     m_Color    = Color.ToColor();
     m_Capacity = Capacity;
     m_Data     = new TwoSidedStack <double>();
     Reset();
 }
Exemple #4
0
        public override void FillRectangle(double left, double bottom, double right, double top, IColorType fillColor)
        {
            // This only works for translation. If we have a rotation or scale in the transform this will have some problems.
            Affine transform  = GetTransform();
            double fastLeft   = left;
            double fastBottom = bottom;
            double fastRight  = right;
            double fastTop    = top;

            transform.transform(ref fastLeft, ref fastBottom);
            transform.transform(ref fastRight, ref fastTop);

            if (Math.Abs(fastLeft - (int)fastLeft) < .01 &&
                Math.Abs(fastBottom - (int)fastBottom) < .01 &&
                Math.Abs(fastRight - (int)fastRight) < .01 &&
                Math.Abs(fastTop - (int)fastTop) < .01)
            {
                PushOrthoProjection();

                GL.Disable(EnableCap.Texture2D);
                GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);
                if (fillColor.Alpha0To255 < 255)
                {
                    GL.Enable(EnableCap.Blend);
                }
                else
                {
                    GL.Disable(EnableCap.Blend);
                }

                GL.Color4(fillColor.Red0To255, fillColor.Green0To255, fillColor.Blue0To255, fillColor.Alpha0To255);

                GL.Begin(BeginMode.Triangles);
                // triangle 1
                {
                    GL.Vertex2(fastLeft, fastBottom);
                    GL.Vertex2(fastRight, fastBottom);
                    GL.Vertex2(fastRight, fastTop);
                }

                // triangle 2
                {
                    GL.Vertex2(fastLeft, fastBottom);
                    GL.Vertex2(fastRight, fastTop);
                    GL.Vertex2(fastLeft, fastTop);
                }

                GL.End();

                PopOrthoProjection();
            }
            else
            {
                var rect = new RoundedRect(left, bottom, right, top, 0);
                Render(rect, fillColor.ToColor());
            }
        }
Exemple #5
0
        public override void Clear(IColorType color)
        {
            Affine transform = GetTransform();

            RoundedRect clearRect = new RoundedRect(new RectangleDouble(
                                                        cachedClipRect.Left - transform.tx, cachedClipRect.Bottom - transform.ty,
                                                        cachedClipRect.Right - transform.tx, cachedClipRect.Top - transform.ty), 0);

            Render(clearRect, color.ToColor());
        }
        public override void OnDraw(Graphics2D graphics2D)
        {
            RoundedRect backgroundRect = new RoundedRect(LocalBounds, 4);

            graphics2D.Render(backgroundRect, backgroundColor.ToColor());

            graphics2D.Render(new Stroke(backgroundRect), borderColor.ToColor());

            base.OnDraw(graphics2D);
        }
        public void DrawAALine(Vector2 start, Vector2 end, double halfWidth, IColorType colorIn)
        {
            Color colorBytes = colorIn.ToColor();

            GL.Color4(colorBytes.red, colorBytes.green, colorBytes.blue, colorBytes.alpha);

            Affine transform = GetTransform();

            if (!transform.is_identity())
            {
                transform.transform(ref start);
                transform.transform(ref end);
            }

            GL.Begin(BeginMode.Triangles);
            Vector2 widthRightOffset = (end - start).GetPerpendicularRight().GetNormal() * halfWidth / 2;

            triangleEddgeInfo.Draw2EdgeTriangle(start - widthRightOffset, end - widthRightOffset, end + widthRightOffset);
            triangleEddgeInfo.Draw2EdgeTriangle(end + widthRightOffset, start + widthRightOffset, start - widthRightOffset);
            GL.End();
        }
Exemple #8
0
        public void DrawAAShape(IVertexSource vertexSource, IColorType colorIn)
        {
            vertexSource.rewind(0);

            Affine transform = GetTransform();

            if (!transform.is_identity())
            {
                vertexSource = new VertexSourceApplyTransform(vertexSource, transform);
            }

            Color colorBytes = colorIn.ToColor();

            GL.Color4(colorBytes.red, colorBytes.green, colorBytes.blue, colorBytes.alpha);

            triangleEddgeInfo.Clear();
            VertexSourceToTesselator.SendShapeToTesselator(triangleEddgeInfo, vertexSource);

            // now render it
            triangleEddgeInfo.RenderLastToGL();
        }
Exemple #9
0
        private void DrawAAShape(IVertexSource vertexSource, IColorType colorIn)
        {
            vertexSource.rewind(0);

            Affine transform = GetTransform();

            if (!transform.is_identity())
            {
                vertexSource = new VertexSourceApplyTransform(vertexSource, transform);
            }

            Color colorBytes = colorIn.ToColor();

            // the alpha has come from the bound texture
            GL.Color4(colorBytes.red, colorBytes.green, colorBytes.blue, (byte)255);

            triangleEdgeInfo.Clear();
            VertexSourceToTesselator.SendShapeToTesselator(triangleEdgeInfo, vertexSource);

            // now render it
            triangleEdgeInfo.RenderLastToGL();
        }
Exemple #10
0
        /// <summary>
        /// Draws a line with low poly rounded endcaps (only in GL implementation/only used by 2D GCode)
        /// </summary>
        /// <param name="start">the start</param>
        /// <param name="end">the end</param>
        /// <param name="halfWidth">size of the line</param>
        /// <param name="colorIn">the color</param>
        public void DrawAALineRounded(Vector2 start, Vector2 end, double halfWidth, IColorType colorIn)
        {
            var colorBytes = colorIn.ToColor();

            GL.Color4(colorBytes.red, colorBytes.green, colorBytes.blue, colorBytes.alpha);

            Affine transform = GetTransform();

            if (!transform.is_identity())
            {
                transform.transform(ref start);
                transform.transform(ref end);
            }

            // GL.Begin(BeginMode.Triangles);
            Vector2 widthRightOffset = (end - start).GetPerpendicularRight().GetNormal() * halfWidth / 2;

            // draw the main line part
            TriangleEdgeInfo.Draw1EdgeTriangle(start - widthRightOffset, end - widthRightOffset, end + widthRightOffset);
            TriangleEdgeInfo.Draw1EdgeTriangle(end + widthRightOffset, start + widthRightOffset, start - widthRightOffset);
            // now draw the end rounds
            int     numSegments     = 5;
            Vector2 endCurveStart   = end + widthRightOffset;
            Vector2 startCurveStart = start + widthRightOffset;

            for (int i = 0; i < numSegments + 1; i++)
            {
                Vector2 endCurveEnd = end + Vector2.Rotate(widthRightOffset, i * Math.PI / numSegments);
                TriangleEdgeInfo.Draw1EdgeTriangle(endCurveStart, endCurveEnd, end);
                endCurveStart = endCurveEnd;

                Vector2 startCurveEnd = start + Vector2.Rotate(widthRightOffset, -i * Math.PI / numSegments);
                TriangleEdgeInfo.Draw1EdgeTriangle(startCurveStart, startCurveEnd, start);
                startCurveStart = startCurveEnd;
            }

            // GL.End();
        }
Exemple #11
0
        public override void Render(IVertexSource vertexSource, IColorType colorBytes)
        {
            rasterizer.reset();
            Affine transform = GetTransform();

            if (!transform.is_identity())
            {
                vertexSource = new VertexSourceApplyTransform(vertexSource, transform);
            }

            rasterizer.add_path(vertexSource);
            if (destImageByte != null)
            {
                scanlineRenderer.RenderSolid(destImageByte, rasterizer, scanlineCache, colorBytes.ToColor());
                DestImage.MarkImageChanged();
            }
            else
            {
                scanlineRenderer.RenderSolid(destImageFloat, rasterizer, scanlineCache, colorBytes.ToColorF());
                destImageFloat.MarkImageChanged();
            }
        }
Exemple #12
0
        public override void Clear(IColorType iColor)
        {
            RectangleDouble clippingRect    = GetClippingRect();
            var             clippingRectInt = new RectangleInt((int)clippingRect.Left, (int)clippingRect.Bottom, (int)clippingRect.Right, (int)clippingRect.Top);

            if (DestImage != null)
            {
                var    color  = iColor.ToColor();
                byte[] buffer = DestImage.GetBuffer();
                switch (DestImage.BitDepth)
                {
                case 8:
                {
                    for (int y = clippingRectInt.Bottom; y < clippingRectInt.Top; y++)
                    {
                        int bufferOffset       = DestImage.GetBufferOffsetXY((int)clippingRect.Left, y);
                        int bytesBetweenPixels = DestImage.GetBytesBetweenPixelsInclusive();
                        for (int x = 0; x < clippingRectInt.Width; x++)
                        {
                            buffer[bufferOffset] = color.blue;
                            bufferOffset        += bytesBetweenPixels;
                        }
                    }
                }

                break;

                case 24:
                    for (int y = clippingRectInt.Bottom; y < clippingRectInt.Top; y++)
                    {
                        int bufferOffset       = DestImage.GetBufferOffsetXY((int)clippingRect.Left, y);
                        int bytesBetweenPixels = DestImage.GetBytesBetweenPixelsInclusive();
                        for (int x = 0; x < clippingRectInt.Width; x++)
                        {
                            buffer[bufferOffset + 0] = color.blue;
                            buffer[bufferOffset + 1] = color.green;
                            buffer[bufferOffset + 2] = color.red;
                            bufferOffset            += bytesBetweenPixels;
                        }
                    }

                    break;

                case 32:
                {
                    for (int y = clippingRectInt.Bottom; y < clippingRectInt.Top; y++)
                    {
                        int bufferOffset       = DestImage.GetBufferOffsetXY((int)clippingRect.Left, y);
                        int bytesBetweenPixels = DestImage.GetBytesBetweenPixelsInclusive();
                        for (int x = 0; x < clippingRectInt.Width; x++)
                        {
                            buffer[bufferOffset + 0] = color.blue;
                            buffer[bufferOffset + 1] = color.green;
                            buffer[bufferOffset + 2] = color.red;
                            buffer[bufferOffset + 3] = color.alpha;
                            bufferOffset            += bytesBetweenPixels;
                        }
                    }
                }

                break;

                default:
                    throw new NotImplementedException();
                }

                DestImage.MarkImageChanged();
            }
            else             // it is a float
            {
                if (DestImageFloat == null)
                {
                    throw new Exception("You have to have either a byte or float DestImage.");
                }

                var     color  = iColor.ToColorF();
                int     height = DestImageFloat.Height;
                float[] buffer = DestImageFloat.GetBuffer();
                switch (DestImageFloat.BitDepth)
                {
                case 128:
                    for (int y = 0; y < height; y++)
                    {
                        int bufferOffset       = DestImageFloat.GetBufferOffsetXY(clippingRectInt.Left, y);
                        int bytesBetweenPixels = DestImageFloat.GetFloatsBetweenPixelsInclusive();
                        for (int x = 0; x < clippingRectInt.Width; x++)
                        {
                            buffer[bufferOffset + 0] = color.blue;
                            buffer[bufferOffset + 1] = color.green;
                            buffer[bufferOffset + 2] = color.red;
                            buffer[bufferOffset + 3] = color.alpha;
                            bufferOffset            += bytesBetweenPixels;
                        }
                    }

                    break;

                default:
                    throw new NotImplementedException();
                }
            }
        }
Exemple #13
0
        public override void FillRectangle(double left, double bottom, double right, double top, IColorType fillColor)
        {
            var rect = new RoundedRect(left, bottom, right, top, 0);

            Render(rect, fillColor.ToColor());
        }
 public void active_color(IColorType c)
 {
     activeColor = c.ToColor();
 }
Exemple #15
0
 public void background_color(IColorType v)
 {
     m_OutsideSourceColor = v.ToColor();
 }
Exemple #16
0
 public void colors(IColorType c1, IColorType c2, IColorType c3)
 {
     m_coord[0].color = c1.ToColor();
     m_coord[1].color = c2.ToColor();
     m_coord[2].color = c3.ToColor();
 }