/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package jackpal.androidterm.emulatorview; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Typeface; import android.util.FloatMath; class PaintRenderer extends BaseTextRenderer { public PaintRenderer(int fontSize, ColorScheme scheme) { super(scheme); mTextPaint = new Paint(); mTextPaint.setTypeface(Typeface.MONOSPACE); mTextPaint.setAntiAlias(true); mTextPaint.setTextSize(fontSize); mCharHeight = (int) FloatMath.ceil(mTextPaint.getFontSpacing()); mCharAscent = (int) FloatMath.ceil(mTextPaint.ascent()); mCharDescent = mCharHeight + mCharAscent; mCharWidth = mTextPaint.measureText(EXAMPLE_CHAR, 0, 1); } public void drawTextRun(Canvas canvas, float x, float y, int lineOffset, int runWidth, char[] text, int index, int count, boolean selectionStyle, int textStyle, int cursorOffset, int cursorIndex, int cursorIncr, int cursorWidth, int cursorMode) { int foreColor = TextStyle.decodeForeColor(textStyle); int backColor = TextStyle.decodeBackColor(textStyle); int effect = TextStyle.decodeEffect(textStyle); boolean inverse = mReverseVideo ^ (effect & (TextStyle.fxInverse | TextStyle.fxItalic)) != 0; if (inverse) { int temp = foreColor; foreColor = backColor; backColor = temp; } if (selectionStyle) { backColor = TextStyle.ciCursorBackground; } boolean blink = (effect & TextStyle.fxBlink) != 0; if (blink && backColor < 8) { backColor += 8; } mTextPaint.setColor(mPalette[backColor]); float left = x + lineOffset * mCharWidth; canvas.drawRect(left, y + mCharAscent - mCharDescent, left + runWidth * mCharWidth, y, mTextPaint); boolean cursorVisible = lineOffset <= cursorOffset && cursorOffset < (lineOffset + runWidth); float cursorX = 0; if (cursorVisible) { cursorX = x + cursorOffset * mCharWidth; drawCursorImp(canvas, (int) cursorX, y, cursorWidth * mCharWidth, mCharHeight, cursorMode); } boolean invisible = (effect & TextStyle.fxInvisible) != 0; if (!invisible) { boolean bold = (effect & TextStyle.fxBold) != 0; boolean underline = (effect & TextStyle.fxUnderline) != 0; if (bold) { mTextPaint.setFakeBoldText(true); } if (underline) { mTextPaint.setUnderlineText(true); } int textPaintColor; if (foreColor < 8 && bold) { // In 16-color mode, bold also implies bright foreground colors textPaintColor = mPalette[foreColor+8]; } else { textPaintColor = mPalette[foreColor]; } mTextPaint.setColor(textPaintColor); float textOriginY = y - mCharDescent; if (cursorVisible) { // Text before cursor int countBeforeCursor = cursorIndex - index; int countAfterCursor = count - (countBeforeCursor + cursorIncr); if (countBeforeCursor > 0){ canvas.drawText(text, index, countBeforeCursor, left, textOriginY, mTextPaint); } // Text at cursor mTextPaint.setColor(mPalette[TextStyle.ciCursorForeground]); canvas.drawText(text, cursorIndex, cursorIncr, cursorX, textOriginY, mTextPaint); // Text after cursor if (countAfterCursor > 0) { mTextPaint.setColor(textPaintColor); canvas.drawText(text, cursorIndex + cursorIncr, countAfterCursor, cursorX + cursorWidth * mCharWidth, textOriginY, mTextPaint); } } else { canvas.drawText(text, index, count, left, textOriginY, mTextPaint); } if (bold) { mTextPaint.setFakeBoldText(false); } if (underline) { mTextPaint.setUnderlineText(false); } } } public int getCharacterHeight() { return mCharHeight; } public float getCharacterWidth() { return mCharWidth; } public int getTopMargin() { return mCharDescent; } private Paint mTextPaint; private float mCharWidth; private int mCharHeight; private int mCharAscent; private int mCharDescent; private static final char[] EXAMPLE_CHAR = {'X'}; }