docs: private void drawTicks() {
          double  sinValue;
          double  cosValue;
          double  startAngle             = 180;
          double  angleStep              = 360 / 240 +0.5;
          Point2D center                 = new Point2D(size * 0.5, size * 0.5);
          Color   hourTickMarkColor      = clock.getHourTickMarkColor();
          Color   minuteTickMarkColor    = clock.getMinuteTickMarkColor();
          Color   tickLabelColor         = clock.getTickLabelColor();
          boolean hourTickMarksVisible   = clock.isHourTickMarksVisible();
          boolean minuteTickMarksVisible = clock.isMinuteTickMarksVisible();
          boolean tickLabelsVisible      = clock.isTickLabelsVisible();
          Font    font                   = Fonts.robotoLight(size * 0.084);
          tickCtx.clearRect(0, 0, size, size);
          tickCtx.setLineCap(StrokeLineCap.BUTT);
          tickCtx.setFont(font);
          tickCtx.setLineWidth(size * 0.005);
          for (double angle = 0, counter = 0 ; Double.compare(counter, 239) <= 0 ; angle -= angleStep, counter++) {
              sinValue = Math.sin(Math.toRadians(angle + startAngle));
              cosValue = Math.cos(Math.toRadians(angle + startAngle));
  
              Point2D innerPoint       = new Point2D(center.getX() + size * 0.45866667 * sinValue, center.getY() + size * 0.45866667 * cosValue);
              Point2D innerMinutePoint = new Point2D(center.getX() + size * 0.47733333 * sinValue, center.getY() + size * 0.47733333 * cosValue);
              Point2D outerPoint       = new Point2D(center.getX() + size * 0.5 * sinValue, center.getY() + size * 0.5 * cosValue);
              Point2D textPoint        = new Point2D(center.getX() + size * 0.405 * sinValue, center.getY() + size * 0.405 * cosValue);
              
              if (counter % 20 == 0) {
                  tickCtx.setStroke(hourTickMarkColor);
                  if (hourTickMarksVisible) {
                      tickCtx.strokeLine(innerPoint.getX(), innerPoint.getY(), outerPoint.getX(), outerPoint.getY());
                  } else if (minuteTickMarksVisible) {
                      tickCtx.strokeLine(innerMinutePoint.getX(), innerMinutePoint.getY(), outerPoint.getX(), outerPoint.getY());
                  }
                  if (tickLabelsVisible) {
                      tickCtx.save();
                      tickCtx.translate(textPoint.getX(), textPoint.getY());
  
                      Helper.rotateContextForText(tickCtx, startAngle, angle, TickLabelOrientation.HORIZONTAL);
                      tickCtx.setTextAlign(TextAlignment.CENTER);
                      tickCtx.setTextBaseline(VPos.CENTER);
                      tickCtx.setFill(tickLabelColor);
                      if (counter == 0) {
                          tickCtx.fillText("12", 0, 0);
                      } else {
                          tickCtx.fillText(Integer.toString((int) (counter / 20)), 0, 0);
                      }
  
                      tickCtx.restore();
                  }
              } else if (counter % 4 == 0 && minuteTickMarksVisible) {
                  tickCtx.setStroke(minuteTickMarkColor);
                  tickCtx.strokeLine(innerPoint.getX(), innerPoint.getY(), outerPoint.getX(), outerPoint.getY());
              } else if (counter % 1 == 0 && minuteTickMarksVisible) {
                  tickCtx.setStroke(minuteTickMarkColor);
                  tickCtx.strokeLine(innerMinutePoint.getX(), innerMinutePoint.getY(), outerPoint.getX(), outerPoint.getY());
              }
          }
      }