docs: @Override
      public void render(Symbol symbol) {
  
          int marginX = (int) (symbol.getQuietZoneHorizontal() * magnification);
          int marginY = (int) (symbol.getQuietZoneVertical() * magnification);
  
          Font f = symbol.getFont();
          if (f != null) {
              f = f.deriveFont((float) (f.getSize2D() * magnification));
          } else {
              f = new Font(symbol.getFontName(), Font.PLAIN, (int) (symbol.getFontSize() * magnification));
              f = f.deriveFont(Collections.singletonMap(TextAttribute.TRACKING, 0));
          }
  
          Font oldFont = g2d.getFont();
          Color oldColor = g2d.getColor();
  
          if (paper != null) {
              int w = (int) (symbol.getWidth() * magnification);
              int h = (int) (symbol.getHeight() * magnification);
              g2d.setColor(paper);
              g2d.fillRect(0, 0, w, h);
          }
  
          g2d.setColor(ink);
  
          for (Rectangle2D.Double rect : symbol.getRectangles()) {
              double x = (rect.x * magnification) + marginX;
              double y = (rect.y * magnification) + marginY;
              double w = rect.width * magnification;
              double h = rect.height * magnification;
              g2d.fill(new Rectangle((int) x, (int) y, (int) w, (int) h));
          }
  
          for (TextBox text : symbol.getTexts()) {
              HumanReadableAlignment alignment = (text.alignment == JUSTIFY && text.text.length() == 1 ? CENTER : text.alignment);
              Font font = (alignment != JUSTIFY ? f : addTracking(f, text.width * magnification, text.text, g2d));
              g2d.setFont(font);
              FontMetrics fm = g2d.getFontMetrics();
              Rectangle2D bounds = fm.getStringBounds(text.text, g2d);
              float y = (float) (text.y * magnification) + marginY;
              float x;
              switch (alignment) {
                  case LEFT:
                  case JUSTIFY:
                      x = (float) ((magnification * text.x) + marginX);
                      break;
                  case RIGHT:
                      x = (float) ((magnification * text.x) + (magnification * text.width) - bounds.getWidth() + marginX);
                      break;
                  case CENTER:
                      x = (float) ((magnification * text.x) + (magnification * text.width / 2) - (bounds.getWidth() / 2) + marginX);
                      break;
                  default:
                      throw new IllegalStateException("Unknown alignment: " + alignment);
              }
              g2d.drawString(text.text, x, y);
          }
  
          for (Hexagon hexagon : symbol.getHexagons()) {
              Polygon polygon = new Polygon();
              for (int j = 0; j < 6; j++) {
                  polygon.addPoint((int) ((hexagon.pointX[j] * magnification) + marginX),
                          (int) ((hexagon.pointY[j] * magnification) + marginY));
              }
              g2d.fill(polygon);
          }
  
          List< Ellipse2D.Double > target = symbol.getTarget();
          for (int i = 0; i + 1 < target.size(); i += 2) {
              Ellipse2D.Double outer = adjust(target.get(i), magnification, marginX, marginY);
              Ellipse2D.Double inner = adjust(target.get(i + 1), magnification, marginX, marginY);
              Area area = new Area(outer);
              area.subtract(new Area(inner));
              g2d.fill(area);
          }
  
          g2d.setFont(oldFont);
          g2d.setColor(oldColor);
      }