function renderPlainText(hostEl, ctx, text, style, rect) {
	        var font = setCtx(ctx, 'font', style.font || textContain.DEFAULT_FONT);

	        var textPadding = style.textPadding;

	        var contentBlock = hostEl.__textCotentBlock;
	        if (!contentBlock || hostEl.__dirty) {
	            contentBlock = hostEl.__textCotentBlock = textContain.parsePlainText(
	                text, font, textPadding, style.truncate
	            );
	        }

	        var outerHeight = contentBlock.outerHeight;

	        var textLines = contentBlock.lines;
	        var lineHeight = contentBlock.lineHeight;

	        var boxPos = getBoxPosition(outerHeight, style, rect);
	        var baseX = boxPos.baseX;
	        var baseY = boxPos.baseY;
	        var textAlign = boxPos.textAlign;
	        var textVerticalAlign = boxPos.textVerticalAlign;

	        // Origin of textRotation should be the base point of text drawing.
	        applyTextRotation(ctx, style, rect, baseX, baseY);

	        var boxY = textContain.adjustTextY(baseY, outerHeight, textVerticalAlign);
	        var textX = baseX;
	        var textY = boxY;

	        var needDrawBg = needDrawBackground(style);
	        if (needDrawBg || textPadding) {
	            // Consider performance, do not call getTextWidth util necessary.
	            var textWidth = textContain.getWidth(text, font);
	            var outerWidth = textWidth;
	            textPadding && (outerWidth += textPadding[1] + textPadding[3]);
	            var boxX = textContain.adjustTextX(baseX, outerWidth, textAlign);

	            needDrawBg && drawBackground(hostEl, ctx, style, boxX, boxY, outerWidth, outerHeight);

	            if (textPadding) {
	                textX = getTextXForPadding(baseX, textAlign, textPadding);
	                textY += textPadding[0];
	            }
	        }

	        setCtx(ctx, 'textAlign', textAlign || 'left');
	        // Force baseline to be "middle". Otherwise, if using "top", the
	        // text will offset downward a little bit in font "Microsoft YaHei".
	        setCtx(ctx, 'textBaseline', 'middle');

	        // Always set shadowBlur and shadowOffset to avoid leak from displayable.
	        setCtx(ctx, 'shadowBlur', style.textShadowBlur || 0);
	        setCtx(ctx, 'shadowColor', style.textShadowColor || 'transparent');
	        setCtx(ctx, 'shadowOffsetX', style.textShadowOffsetX || 0);
	        setCtx(ctx, 'shadowOffsetY', style.textShadowOffsetY || 0);

	        // `textBaseline` is set as 'middle'.
	        textY += lineHeight / 2;

	        var textLineWidth = style.textLineWidth;
	        var textStroke = getStroke(style.textStroke, textLineWidth);
	        var textFill = getFill(style.textFill);

	        if (textStroke) {
	            setCtx(ctx, 'lineWidth', textLineWidth);
	            setCtx(ctx, 'strokeStyle', textStroke);
	        }
	        if (textFill) {
	            setCtx(ctx, 'fillStyle', textFill);
	        }

	        for (var i = 0; i < textLines.length; i++) {
	            // Fill after stroke so the outline will not cover the main part.
	            textStroke && ctx.strokeText(textLines[i], textX, textY);
	            textFill && ctx.fillText(textLines[i], textX, textY);
	            textY += lineHeight;
	        }
	    }
@param {CanvasRenderingContext2D} ctx
@param {string} text
@param {module:zrender/graphic/Style} style
@param {Object|boolean} [rect] {x, y, width, height}
                 If set false, rect text is not used.