Merge "Using hardware accelerated drawing" into jb-mr1-dev
This commit is contained in:
commit
6242564c91
3 changed files with 53 additions and 27 deletions
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue