docs: private int getOffsetY(int rowStartOffset, FontMetrics fontMetrics)
      throws BadLocationException {
      // Get the bounding rectangle of the row
  
      Rectangle r = component.modelToView(rowStartOffset);
      int lineHeight = fontMetrics.getHeight();
      int y = r.y + r.height;
      int descent = 0;
  
      // The text needs to be positioned above the bottom of the bounding
      // rectangle based on the descent of the font(s) contained on the row.
  
      if (r.height == lineHeight) // default font is being used
      {
        descent = fontMetrics.getDescent();
      } else // We need to check all the attributes for font changes
      {
        if (fonts == null)
          fonts = new HashMap<>();
  
        Element root = component.getDocument().getDefaultRootElement();
        int index = root.getElementIndex(rowStartOffset);
        Element line = root.getElement(index);
  
        for (int i = 0; i < line.getElementCount(); i++) {
          Element child = line.getElement(i);
          AttributeSet as = child.getAttributes();
          String fontFamily = (String) as.getAttribute(StyleConstants.FontFamily);
          Integer fontSize = (Integer) as.getAttribute(StyleConstants.FontSize);
          String key = fontFamily + fontSize;
  
          FontMetrics fm = fonts.get(key);
  
          if (fm == null) {
            Font font = new Font(fontFamily, Font.PLAIN, fontSize);
            fm = component.getFontMetrics(font);
            fonts.put(key, fm);
          }
  
          descent = Math.max(descent, fm.getDescent());
        }
      }
  
      return y - descent;
    }