void Canvas::DrawAnnulus(PixelScalar x, PixelScalar y, UPixelScalar small_radius, UPixelScalar big_radius, Angle start, Angle end) { GLDonutVertices vertices(x, y, small_radius, big_radius); const std::pair<unsigned,unsigned> i = AngleToDonutVertices(start, end); const unsigned istart = i.first; const unsigned iend = i.second; if (!brush.IsHollow()) { brush.Set(); vertices.bind(); if (istart > iend) { glDrawArrays(GL_TRIANGLE_STRIP, istart, 64 - istart + 2); glDrawArrays(GL_TRIANGLE_STRIP, 0, iend + 2); } else { glDrawArrays(GL_TRIANGLE_STRIP, istart, iend - istart + 2); } } if (pen_over_brush()) { pen.Bind(); if (istart != iend && iend != 64) { if (brush.IsHollow()) vertices.bind(); glDrawArrays(GL_LINE_STRIP, istart, 2); glDrawArrays(GL_LINE_STRIP, iend, 2); } const unsigned pstart = istart / 2; const unsigned pend = iend / 2; vertices.bind_inner_circle(); if (pstart < pend) { glDrawArrays(GL_LINE_STRIP, pstart, pend - pstart + 1); } else { glDrawArrays(GL_LINE_STRIP, pstart, 32 - pstart + 1); glDrawArrays(GL_LINE_STRIP, 0, pend + 1); } vertices.bind_outer_circle(); if (pstart < pend) { glDrawArrays(GL_LINE_STRIP, pstart, pend - pstart + 1); } else { glDrawArrays(GL_LINE_STRIP, pstart, 32 - pstart + 1); glDrawArrays(GL_LINE_STRIP, 0, pend + 1); } pen.Unbind(); } }
void Canvas::DrawAnnulus(int x, int y, unsigned small_radius, unsigned big_radius, Angle start, Angle end) { if (1 == 1) { /* TODO: switched to the unoptimised generic implementation due to TRAC #2221, caused by rounding error of start/end radial; should reimplement GLDonutVertices to use the exact start/end radial */ ::Annulus(*this, x, y, big_radius, start, end, small_radius); return; } ScopeVertexPointer vp; GLDonutVertices vertices(x, y, small_radius, big_radius); const std::pair<unsigned,unsigned> i = AngleToDonutVertices(start, end); const unsigned istart = i.first; const unsigned iend = i.second; if (!brush.IsHollow()) { brush.Set(); vertices.Bind(vp); if (istart > iend) { glDrawArrays(GL_TRIANGLE_STRIP, istart, GLDonutVertices::MAX_ANGLE - istart + 2); glDrawArrays(GL_TRIANGLE_STRIP, 0, iend + 2); } else { glDrawArrays(GL_TRIANGLE_STRIP, istart, iend - istart + 2); } } if (IsPenOverBrush()) { pen.Bind(); if (istart != iend && iend != GLDonutVertices::MAX_ANGLE) { if (brush.IsHollow()) vertices.Bind(vp); glDrawArrays(GL_LINE_STRIP, istart, 2); glDrawArrays(GL_LINE_STRIP, iend, 2); } const unsigned pstart = istart / 2; const unsigned pend = iend / 2; vertices.BindInnerCircle(vp); if (pstart < pend) { glDrawArrays(GL_LINE_STRIP, pstart, pend - pstart + 1); } else { glDrawArrays(GL_LINE_STRIP, pstart, GLDonutVertices::CIRCLE_SIZE - pstart + 1); glDrawArrays(GL_LINE_STRIP, 0, pend + 1); } vertices.BindOuterCircle(vp); if (pstart < pend) { glDrawArrays(GL_LINE_STRIP, pstart, pend - pstart + 1); } else { glDrawArrays(GL_LINE_STRIP, pstart, GLDonutVertices::CIRCLE_SIZE - pstart + 1); glDrawArrays(GL_LINE_STRIP, 0, pend + 1); } pen.Unbind(); } }