internal void FillMultiPath(com.epl.geometry.SimpleRasterizer rasterizer, com.epl.geometry.Transformation2D trans, com.epl.geometry.MultiPathImpl polygon, bool isWinding) { com.epl.geometry.SegmentIteratorImpl segIter = polygon.QuerySegmentIterator(); com.epl.geometry.Point2D p1 = new com.epl.geometry.Point2D(); com.epl.geometry.Point2D p2 = new com.epl.geometry.Point2D(); while (segIter.NextPath()) { while (segIter.HasNextSegment()) { com.epl.geometry.Segment seg = segIter.NextSegment(); if (seg.GetType() != com.epl.geometry.Geometry.Type.Line) { throw com.epl.geometry.GeometryException.GeometryInternalError(); } // TODO: // densify // the // segment // here trans.Transform(seg.GetStartXY(), p1); trans.Transform(seg.GetEndXY(), p2); m_rasterizer.AddEdge(p1.x, p1.y, p2.x, p2.y); } } m_rasterizer.RenderEdges(isWinding ? com.epl.geometry.SimpleRasterizer.WINDING : com.epl.geometry.SimpleRasterizer.EVEN_ODD); }
public virtual void SetColor(com.epl.geometry.SimpleRasterizer rasterizer, int color) { if (this.m_color != color) { rasterizer.Flush(); } this.m_color = color; }
internal void FillConvexPolygon(com.epl.geometry.SimpleRasterizer rasterizer, com.epl.geometry.Point2D[] fan, int len) { for (int i = 1, n = len; i < n; i++) { rasterizer.AddEdge(fan[i - 1].x, fan[i - 1].y, fan[i].x, fan[i].y); } rasterizer.AddEdge(fan[len - 1].x, fan[len - 1].y, fan[0].x, fan[0].y); m_rasterizer.RenderEdges(com.epl.geometry.SimpleRasterizer.EVEN_ODD); }
internal void Init(com.epl.geometry.MultiVertexGeometryImpl geom, double toleranceXY, int rasterSizeBytes) { // _ASSERT(CanUseAccelerator(geom)); m_width = System.Math.Max((int)(System.Math.Sqrt(rasterSizeBytes) * 2 + 0.5), 64); m_scanLineSize = (m_width * 2 + 31) / 32; // 2 bits per pixel m_geomEnv = new com.epl.geometry.Envelope2D(); m_toleranceXY = toleranceXY; // calculate bitmap size int size = 0; int width = m_width; int scanLineSize = m_scanLineSize; while (width >= 8) { size += width * scanLineSize; width /= 2; scanLineSize = (width * 2 + 31) / 32; } // allocate the bitmap, that contains the base and the mip-levels m_bitmap = new int[size]; for (int i = 0; i < size; i++) { m_bitmap[i] = 0; } m_rasterizer = new com.epl.geometry.SimpleRasterizer(); com.epl.geometry.RasterizedGeometry2DImpl.ScanCallbackImpl callback = new com.epl.geometry.RasterizedGeometry2DImpl.ScanCallbackImpl(this, m_bitmap, m_scanLineSize); m_callback = callback; m_rasterizer.Setup(m_width, m_width, callback); geom.QueryEnvelope2D(m_geomEnv); if (m_geomEnv.GetWidth() > m_width * m_geomEnv.GetHeight() || m_geomEnv.GetHeight() > m_geomEnv.GetWidth() * m_width) { } // the geometry is thin and the rasterizer is not needed. m_geomEnv.Inflate(toleranceXY, toleranceXY); com.epl.geometry.Envelope2D worldEnv = new com.epl.geometry.Envelope2D(); com.epl.geometry.Envelope2D pixEnv = com.epl.geometry.Envelope2D.Construct(1, 1, m_width - 2, m_width - 2); double minWidth = toleranceXY * pixEnv.GetWidth(); // min width is such // that the size of // one pixel is // equal to the // tolerance double minHeight = toleranceXY * pixEnv.GetHeight(); worldEnv.SetCoords(m_geomEnv.GetCenter(), System.Math.Max(minWidth, m_geomEnv.GetWidth()), System.Math.Max(minHeight, m_geomEnv.GetHeight())); m_stroke_half_widthX_pix = worldEnv.GetWidth() / pixEnv.GetWidth(); m_stroke_half_widthY_pix = worldEnv.GetHeight() / pixEnv.GetHeight(); // The stroke half width. Later it will be inflated to account for // pixels size. m_stroke_half_width = m_toleranceXY; m_transform = new com.epl.geometry.Transformation2D(); m_transform.InitializeFromRect(worldEnv, pixEnv); // geom to pixels com.epl.geometry.Transformation2D identityTransform = new com.epl.geometry.Transformation2D(); switch (geom.GetType().Value()) { case com.epl.geometry.Geometry.GeometryType.MultiPoint: { callback.SetColor(m_rasterizer, 2); FillPoints(m_rasterizer, (com.epl.geometry.MultiPointImpl)geom, m_stroke_half_width); break; } case com.epl.geometry.Geometry.GeometryType.Polyline: { callback.SetColor(m_rasterizer, 2); StrokeDrawPolyPath(m_rasterizer, (com.epl.geometry.MultiPathImpl)geom._getImpl(), m_stroke_half_width); break; } case com.epl.geometry.Geometry.GeometryType.Polygon: { bool isWinding = false; // NOTE: change when winding is supported callback.SetColor(m_rasterizer, 1); FillMultiPath(m_rasterizer, m_transform, (com.epl.geometry.MultiPathImpl)geom, isWinding); callback.SetColor(m_rasterizer, 2); StrokeDrawPolyPath(m_rasterizer, (com.epl.geometry.MultiPathImpl)geom._getImpl(), m_stroke_half_width); break; } } m_dx = m_transform.xx; m_dy = m_transform.yy; m_x0 = m_transform.xd; m_y0 = m_transform.yd; BuildLevels(); }
internal void StrokeDrawPolyPath(com.epl.geometry.SimpleRasterizer rasterizer, com.epl.geometry.MultiPathImpl polyPath, double tol) { com.epl.geometry.Point2D[] fan = new com.epl.geometry.Point2D[4]; for (int i = 0; i < fan.Length; i++) { fan[i] = new com.epl.geometry.Point2D(); } com.epl.geometry.SegmentIteratorImpl segIter = polyPath.QuerySegmentIterator(); double strokeHalfWidth = m_transform.Transform(tol) + 1.5; double shortSegment = 0.25; com.epl.geometry.Point2D vec = new com.epl.geometry.Point2D(); com.epl.geometry.Point2D vecA = new com.epl.geometry.Point2D(); com.epl.geometry.Point2D vecB = new com.epl.geometry.Point2D(); com.epl.geometry.Point2D ptStart = new com.epl.geometry.Point2D(); com.epl.geometry.Point2D ptEnd = new com.epl.geometry.Point2D(); com.epl.geometry.Point2D prev_start = new com.epl.geometry.Point2D(); com.epl.geometry.Point2D prev_end = new com.epl.geometry.Point2D(); double[] helper_xy_10_elm = new double[10]; com.epl.geometry.Envelope2D segEnv = new com.epl.geometry.Envelope2D(); com.epl.geometry.Point2D ptOld = new com.epl.geometry.Point2D(); while (segIter.NextPath()) { bool hasFan = false; bool first = true; ptOld.SetCoords(0, 0); while (segIter.HasNextSegment()) { com.epl.geometry.Segment seg = segIter.NextSegment(); ptStart.x = seg.GetStartX(); ptStart.y = seg.GetStartY(); ptEnd.x = seg.GetEndX(); ptEnd.y = seg.GetEndY(); segEnv.SetEmpty(); segEnv.Merge(ptStart.x, ptStart.y); segEnv.MergeNE(ptEnd.x, ptEnd.y); if (!m_geomEnv.IsIntersectingNE(segEnv)) { if (hasFan) { rasterizer.StartAddingEdges(); rasterizer.AddSegmentStroke(prev_start.x, prev_start.y, prev_end.x, prev_end.y, strokeHalfWidth, false, helper_xy_10_elm); rasterizer.RenderEdges(com.epl.geometry.SimpleRasterizer.EVEN_ODD); hasFan = false; } first = true; continue; } m_transform.Transform(ptEnd, ptEnd); if (first) { m_transform.Transform(ptStart, ptStart); ptOld.SetCoords(ptStart); first = false; } else { ptStart.SetCoords(ptOld); } prev_start.SetCoords(ptStart); prev_end.SetCoords(ptEnd); rasterizer.StartAddingEdges(); hasFan = !rasterizer.AddSegmentStroke(prev_start.x, prev_start.y, prev_end.x, prev_end.y, strokeHalfWidth, true, helper_xy_10_elm); rasterizer.RenderEdges(com.epl.geometry.SimpleRasterizer.EVEN_ODD); if (!hasFan) { ptOld.SetCoords(prev_end); } } if (hasFan) { rasterizer.StartAddingEdges(); hasFan = !rasterizer.AddSegmentStroke(prev_start.x, prev_start.y, prev_end.x, prev_end.y, strokeHalfWidth, false, helper_xy_10_elm); rasterizer.RenderEdges(com.epl.geometry.SimpleRasterizer.EVEN_ODD); } } }
internal void FillEnvelope(com.epl.geometry.SimpleRasterizer rasterizer, com.epl.geometry.Envelope2D envIn) { rasterizer.FillEnvelope(envIn); }
internal void FillPoints(com.epl.geometry.SimpleRasterizer rasterizer, com.epl.geometry.MultiPointImpl geom, double stroke_half_width) { throw com.epl.geometry.GeometryException.GeometryInternalError(); }