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; } }
internal HistoryData(int Capacity, IColorType Color) { m_Color = Color.ToColor(); m_Capacity = Capacity; m_Data = new TwoSidedStack <double>(); Reset(); }
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()); } }
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(); }
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(); }
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(); }
/// <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(); }
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(); } }
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(); } } }
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(); }
public void background_color(IColorType v) { m_OutsideSourceColor = v.ToColor(); }
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(); }