@Override
    public void drawString(String str, float x, float 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.
    """
        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);
        }
    }
@ 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.
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 ) .