Skip to content
Snippets Groups Projects
Commit 6242564c authored by Tadashi G. Takaoka's avatar Tadashi G. Takaoka Committed by Android (Google) Code Review
Browse files

Merge "Using hardware accelerated drawing" into jb-mr1-dev

parents 1d8a246e 622d6a5b
No related branches found
No related tags found
No related merge requests found
...@@ -349,7 +349,7 @@ public class KeyboardSwitcher implements KeyboardState.SwitchActions { ...@@ -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 { ...@@ -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);
......
...@@ -123,6 +123,8 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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);
......
...@@ -553,7 +553,7 @@ public class LatinIME extends InputMethodService implements KeyboardActionListen ...@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment