Using hardware accelerated drawing

When Canvas has been hardware accelerated, don't use offscreen bitmap.

Bug: 6872994
Change-Id: I1121f76377991692bc29ebeedbfbfa1b2a12dbb7
main
Tadashi G. Takaoka 2012-08-02 16:39:27 +09:00
parent 77e8e81ad9
commit 622d6a5b1b
3 changed files with 53 additions and 27 deletions

View File

@ -349,7 +349,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
return mKeyboardView; return mKeyboardView;
} }
public View onCreateInputView() { public View onCreateInputView(boolean isHardwareAcceleratedDrawingEnabled) {
if (mKeyboardView != null) { if (mKeyboardView != null) {
mKeyboardView.closing(); mKeyboardView.closing();
} }
@ -372,6 +372,10 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions {
} }
mKeyboardView = (MainKeyboardView) mCurrentInputView.findViewById(R.id.keyboard_view); mKeyboardView = (MainKeyboardView) mCurrentInputView.findViewById(R.id.keyboard_view);
if (isHardwareAcceleratedDrawingEnabled) {
mKeyboardView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
// TODO: Should use LAYER_TYPE_SOFTWARE when hardware acceleration is off?
}
mKeyboardView.setKeyboardActionListener(mLatinIME); mKeyboardView.setKeyboardActionListener(mLatinIME);
if (mForceNonDistinctMultitouch) { if (mForceNonDistinctMultitouch) {
mKeyboardView.setDistinctMultitouch(false); mKeyboardView.setDistinctMultitouch(false);

View File

@ -123,6 +123,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
/** The working rectangle variable */ /** The working rectangle variable */
private final Rect mWorkingRect = new Rect(); private final Rect mWorkingRect = new Rect();
/** The keyboard bitmap buffer for faster updates */ /** The keyboard bitmap buffer for faster updates */
/** The clip region to draw keys */
private final Region mClipRegion = new Region();
private Bitmap mOffscreenBuffer; private Bitmap mOffscreenBuffer;
/** The canvas for the above mutable keyboard bitmap */ /** The canvas for the above mutable keyboard bitmap */
private Canvas mOffscreenCanvas; private Canvas mOffscreenCanvas;
@ -457,10 +459,15 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
@Override @Override
public void onDraw(Canvas canvas) { public void onDraw(Canvas canvas) {
super.onDraw(canvas); super.onDraw(canvas);
if (canvas.isHardwareAccelerated()) {
onDrawKeyboard(canvas);
return;
}
if (mBufferNeedsUpdate || mOffscreenBuffer == null) { if (mBufferNeedsUpdate || mOffscreenBuffer == null) {
mBufferNeedsUpdate = false; mBufferNeedsUpdate = false;
if (maybeAllocateOffscreenBuffer()) { if (maybeAllocateOffscreenBuffer()) {
mInvalidateAllKeys = true; mInvalidateAllKeys = true;
// TODO: Stop using the offscreen canvas even when in software rendering
if (mOffscreenCanvas != null) { if (mOffscreenCanvas != null) {
mOffscreenCanvas.setBitmap(mOffscreenBuffer); mOffscreenCanvas.setBitmap(mOffscreenBuffer);
} else { } else {
@ -502,35 +509,57 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
final Paint paint = mPaint; final Paint paint = mPaint;
final KeyDrawParams params = mKeyDrawParams; final KeyDrawParams params = mKeyDrawParams;
if (mInvalidateAllKeys || mInvalidatedKeys.isEmpty()) { // Calculate clip region and set.
mWorkingRect.set(0, 0, width, height); final boolean drawAllKeys = mInvalidateAllKeys || mInvalidatedKeys.isEmpty();
canvas.clipRect(mWorkingRect, Region.Op.REPLACE); final boolean isHardwareAccelerated = canvas.isHardwareAccelerated();
canvas.drawColor(Color.BLACK, PorterDuff.Mode.CLEAR); // TODO: Confirm if it's really required to draw all keys when hardware acceleration is on.
if (drawAllKeys || isHardwareAccelerated) {
mClipRegion.set(0, 0, width, height);
} else {
mClipRegion.setEmpty();
for (final Key key : mInvalidatedKeys) {
if (mKeyboard.hasKey(key)) {
final int x = key.mX + getPaddingLeft();
final int y = key.mY + getPaddingTop();
mWorkingRect.set(x, y, x + key.mWidth, y + key.mHeight);
mClipRegion.union(mWorkingRect);
}
}
}
if (!isHardwareAccelerated) {
canvas.clipRegion(mClipRegion, Region.Op.REPLACE);
}
// Draw keyboard background.
canvas.drawColor(Color.BLACK, PorterDuff.Mode.CLEAR);
final Drawable background = getBackground();
if (background != null) {
background.draw(canvas);
}
// TODO: Confirm if it's really required to draw all keys when hardware acceleration is on.
if (drawAllKeys || isHardwareAccelerated) {
// Draw all keys. // Draw all keys.
for (final Key key : mKeyboard.mKeys) { for (final Key key : mKeyboard.mKeys) {
onDrawKey(key, canvas, paint, params); onDrawKey(key, canvas, paint, params);
} }
if (mNeedsToDimEntireKeyboard) {
drawDimRectangle(canvas, mWorkingRect, mBackgroundDimAlpha, paint);
}
} else { } else {
// Draw invalidated keys. // Draw invalidated keys.
for (final Key key : mInvalidatedKeys) { for (final Key key : mInvalidatedKeys) {
if (!mKeyboard.hasKey(key)) { if (mKeyboard.hasKey(key)) {
continue; onDrawKey(key, canvas, paint, params);
}
final int x = key.mX + getPaddingLeft();
final int y = key.mY + getPaddingTop();
mWorkingRect.set(x, y, x + key.mWidth, y + key.mHeight);
canvas.clipRect(mWorkingRect, Region.Op.REPLACE);
canvas.drawColor(Color.BLACK, PorterDuff.Mode.CLEAR);
onDrawKey(key, canvas, paint, params);
if (mNeedsToDimEntireKeyboard) {
drawDimRectangle(canvas, mWorkingRect, mBackgroundDimAlpha, paint);
} }
} }
} }
// Overlay a dark rectangle to dim.
if (mNeedsToDimEntireKeyboard) {
paint.setColor(Color.BLACK);
paint.setAlpha(mBackgroundDimAlpha);
// Note: clipRegion() above is in effect if it was called.
canvas.drawRect(0, 0, width, height, paint);
}
// ResearchLogging indicator. // ResearchLogging indicator.
// TODO: Reimplement using a keyboard background image specific to the ResearchLogger, // TODO: Reimplement using a keyboard background image specific to the ResearchLogger,
// and remove this call. // and remove this call.
@ -863,13 +892,6 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
canvas.translate(-x, -y); canvas.translate(-x, -y);
} }
// Overlay a dark rectangle to dim.
private static void drawDimRectangle(Canvas canvas, Rect rect, int alpha, Paint paint) {
paint.setColor(Color.BLACK);
paint.setAlpha(alpha);
canvas.drawRect(rect, paint);
}
public Paint newDefaultLabelPaint() { public Paint newDefaultLabelPaint() {
final Paint paint = new Paint(); final Paint paint = new Paint();
paint.setAntiAlias(true); paint.setAntiAlias(true);

View File

@ -553,7 +553,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen
@Override @Override
public View onCreateInputView() { public View onCreateInputView() {
return mKeyboardSwitcher.onCreateInputView(); return mKeyboardSwitcher.onCreateInputView(mIsHardwareAcceleratedDrawingEnabled);
} }
@Override @Override