src/main/java/org/jfree/graphics2d/svg/SVGGraphics2D.java
@Override
    public void drawString(String str, float x, float y) {
        if (str == null) {
            throw new NullPointerException("Null 'str' argument.");
        }
        if (str.isEmpty()) {
            return;
        }
        if (!SVGHints.VALUE_DRAW_STRING_TYPE_VECTOR.equals(
                this.hints.get(SVGHints.KEY_DRAW_STRING_TYPE))) {
            this.sb.append("<g ");
            appendOptionalElementIDFromHint(this.sb);
            if (!this.transform.isIdentity()) {
            	this.sb.append("transform=\"").append(getSVGTransform(
                    this.transform)).append("\"");
            }
            this.sb.append(">");
            this.sb.append("<text x=\"").append(geomDP(x))
                    .append("\" y=\"").append(geomDP(y))
                    .append("\"");
            this.sb.append(" style=\"").append(getSVGFontStyle()).append("\"");
            Object hintValue = getRenderingHint(SVGHints.KEY_TEXT_RENDERING);
            if (hintValue != null) {
                String textRenderValue = hintValue.toString();
                this.sb.append(" text-rendering=\"").append(textRenderValue)
                        .append("\"");
            }
            this.sb.append(" ").append(getClipPathRef());
            this.sb.append(">");
            this.sb.append(SVGUtils.escapeForXML(str)).append("</text>");
            this.sb.append("</g>");
        } else {
            AttributedString as = new AttributedString(str, 
                    this.font.getAttributes());
            drawString(as.getIterator(), x, y);
        }
    }
@Override
    public void drawString(String str, float x, float y) {
        if (str == null) {
            throw new NullPointerException("Null 'str' argument.");
        }
        if (str.isEmpty()) {
            return;
        }
        if (!SVGHints.VALUE_DRAW_STRING_TYPE_VECTOR.equals(
                this.hints.get(SVGHints.KEY_DRAW_STRING_TYPE))) {
            this.sb.append("<g ");
            appendOptionalElementIDFromHint(this.sb);
            if (!this.transform.isIdentity()) {
            	this.sb.append("transform=\"").append(getSVGTransform(
                    this.transform)).append("\"");
            }
            this.sb.append(">");
            this.sb.append("<text x=\"").append(geomDP(x))
                    .append("\" y=\"").append(geomDP(y))
                    .append("\"");
            this.sb.append(" style=\"").append(getSVGFontStyle()).append("\"");
            Object hintValue = getRenderingHint(SVGHints.KEY_TEXT_RENDERING);
            if (hintValue != null) {
                String textRenderValue = hintValue.toString();
                this.sb.append(" text-rendering=\"").append(textRenderValue)
                        .append("\"");
            }
            this.sb.append(" ").append(getClipPathRef());
            this.sb.append(">");
            this.sb.append(SVGUtils.escapeForXML(str)).append("</text>");
            this.sb.append("</g>");
        } else {
            AttributedString as = new AttributedString(str, 
                    this.font.getAttributes());
            drawString(as.getIterator(), x, y);
        }
    }
Draws a string at {@code (x, y)}. The start of the text at the
baseline level will be aligned with the {@code (x, y)} point.
<br><br>
Note that you can make use of the {@link SVGHints#KEY_TEXT_RENDERING}
hint when drawing strings (this is completely optional though).

@param str  the string ({@code null} not permitted).
@param x  the x-coordinate.
@param y  the y-coordinate.