bool Segment(Canvas &canvas, PixelPoint center, unsigned radius, Angle start, Angle end, bool horizon) { // dont draw if out of view if (!IsCircleVisible(canvas, center, radius)) return false; const int istart = NATIVE_TO_INT(start.Native()); const int iend = NATIVE_TO_INT(end.Native()); unsigned npoly = 0; BulkPixelPoint pt[67]; // add center point if (!horizon) { pt[0] = center; npoly = 1; } segment_poly(pt, center, radius, istart, iend, npoly); assert(npoly <= ARRAY_SIZE(pt)); if (npoly) canvas.DrawTriangleFan(pt, npoly); return true; }
gcc_const static inline fixed fastsine(fixed x) { #ifdef FIXED_MATH return fixed(fixed::internal(), SINETABLE[NATIVE_TO_INT(x)]); #else return SINETABLE[NATIVE_TO_INT(x)]; #endif }
gcc_const static unsigned AngleToDonutVertex(Angle angle) { return GLDonutVertices::ImportAngle(NATIVE_TO_INT(angle.Native()) + ARRAY_SIZE(ISINETABLE) * 3u / 4u, ARRAY_SIZE(ISINETABLE)); }
bool KeyHole(Canvas &canvas, int x, int y, unsigned radius, Angle start, Angle end, unsigned inner_radius) { // dont draw if out of view if (!IsCircleVisible(canvas, x, y, radius)) return false; const int istart = NATIVE_TO_INT(start.Native()); const int iend = NATIVE_TO_INT(end.Native()); unsigned npoly = 0; RasterPoint pt[66*2]; segment_poly(pt, x, y, radius, istart, iend, npoly); segment_poly(pt, x, y, inner_radius, iend, istart, npoly); assert(npoly < ARRAY_SIZE(pt)); if (npoly) canvas.DrawPolygon(pt, npoly); return true; }
bool Annulus(Canvas &canvas, PixelPoint center, unsigned radius, Angle start, Angle end, unsigned inner_radius) { // dont draw if out of view if (!IsCircleVisible(canvas, center, radius)) return false; const int istart = NATIVE_TO_INT(start.Native()); const int iend = NATIVE_TO_INT(end.Native()); unsigned npoly = 0; BulkPixelPoint pt[66*2]; segment_poly(pt, center, radius, istart, iend, npoly); segment_poly(pt, center, inner_radius, iend, istart, npoly, false); assert(npoly <= ARRAY_SIZE(pt)); if (npoly) canvas.DrawPolygon(pt, npoly); return true; }
gcc_const static inline int ifastsine(fixed x) { return ISINETABLE[NATIVE_TO_INT(x)]; }
gcc_const static unsigned AngleToDonutVertex(Angle angle) { return (NATIVE_TO_INT(angle.Native()) * 64 / 4096 + 48) & 0x3e; }