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

Merge "Fix bounding rectangle of gesture preview trail"

parents b4f89c03 84ce64f2
No related branches found
No related tags found
No related merge requests found
...@@ -138,6 +138,7 @@ final class GesturePreviewTrail { ...@@ -138,6 +138,7 @@ final class GesturePreviewTrail {
} }
private final RoundedLine mRoundedLine = new RoundedLine(); private final RoundedLine mRoundedLine = new RoundedLine();
private final Rect mRoundedLineBounds = new Rect();
/** /**
* Draw gesture preview trail * Draw gesture preview trail
...@@ -149,6 +150,8 @@ final class GesturePreviewTrail { ...@@ -149,6 +150,8 @@ final class GesturePreviewTrail {
*/ */
public boolean drawGestureTrail(final Canvas canvas, final Paint paint, public boolean drawGestureTrail(final Canvas canvas, final Paint paint,
final Rect outBoundsRect, final Params params) { final Rect outBoundsRect, final Params params) {
// Initialize bounds rectangle.
outBoundsRect.setEmpty();
final int trailSize = mEventTimes.getLength(); final int trailSize = mEventTimes.getLength();
if (trailSize == 0) { if (trailSize == 0) {
return false; return false;
...@@ -171,39 +174,32 @@ final class GesturePreviewTrail { ...@@ -171,39 +174,32 @@ final class GesturePreviewTrail {
if (startIndex < trailSize) { if (startIndex < trailSize) {
paint.setColor(params.mTrailColor); paint.setColor(params.mTrailColor);
paint.setStyle(Paint.Style.FILL); paint.setStyle(Paint.Style.FILL);
final RoundedLine line = mRoundedLine; final RoundedLine roundedLine = mRoundedLine;
int p1x = getXCoordValue(xCoords[startIndex]); int p1x = getXCoordValue(xCoords[startIndex]);
int p1y = yCoords[startIndex]; int p1y = yCoords[startIndex];
final int lastTime = sinceDown - eventTimes[startIndex]; final int lastTime = sinceDown - eventTimes[startIndex];
float maxWidth = getWidth(lastTime, params); float r1 = getWidth(lastTime, params) / 2.0f;
float r1 = maxWidth / 2.0f;
// Initialize bounds rectangle.
outBoundsRect.set(p1x, p1y, p1x, p1y);
for (int i = startIndex + 1; i < trailSize; i++) { for (int i = startIndex + 1; i < trailSize; i++) {
final int elapsedTime = sinceDown - eventTimes[i]; final int elapsedTime = sinceDown - eventTimes[i];
final int p2x = getXCoordValue(xCoords[i]); final int p2x = getXCoordValue(xCoords[i]);
final int p2y = yCoords[i]; final int p2y = yCoords[i];
final float width = getWidth(elapsedTime, params); final float r2 = getWidth(elapsedTime, params) / 2.0f;
final float r2 = width / 2.0f;
// Draw trail line only when the current point isn't a down point. // Draw trail line only when the current point isn't a down point.
if (!isDownEventXCoord(xCoords[i])) { if (!isDownEventXCoord(xCoords[i])) {
final Path path = line.makePath(p1x, p1y, r1, p2x, p2y, r2); final Path path = roundedLine.makePath(p1x, p1y, r1, p2x, p2y, r2);
if (path != null) { if (path != null) {
final int alpha = getAlpha(elapsedTime, params); final int alpha = getAlpha(elapsedTime, params);
paint.setAlpha(alpha); paint.setAlpha(alpha);
canvas.drawPath(path, paint); canvas.drawPath(path, paint);
// Take union for the bounds. // Take union for the bounds.
outBoundsRect.union(p2x, p2y); roundedLine.getBounds(mRoundedLineBounds);
maxWidth = Math.max(maxWidth, width); outBoundsRect.union(mRoundedLineBounds);
} }
} }
p1x = p2x; p1x = p2x;
p1y = p2y; p1y = p2y;
r1 = r2; r1 = r2;
} }
// Take care of trail line width.
final int inset = -((int)maxWidth + 1);
outBoundsRect.inset(inset, inset);
} }
final int newSize = trailSize - startIndex; final int newSize = trailSize - startIndex;
......
...@@ -52,7 +52,8 @@ public final class PreviewPlacerView extends RelativeLayout { ...@@ -52,7 +52,8 @@ public final class PreviewPlacerView extends RelativeLayout {
private int mOffscreenOffsetY; private int mOffscreenOffsetY;
private Bitmap mOffscreenBuffer; private Bitmap mOffscreenBuffer;
private final Canvas mOffscreenCanvas = new Canvas(); private final Canvas mOffscreenCanvas = new Canvas();
private final Rect mOffscreenDirtyRect = new Rect(); private final Rect mOffscreenSrcRect = new Rect();
private final Rect mDirtyRect = new Rect();
private final Rect mGesturePreviewTrailBoundsRect = new Rect(); // per trail private final Rect mGesturePreviewTrailBoundsRect = new Rect(); // per trail
private final GestureFloatingPreviewText mGestureFloatingPreviewText; private final GestureFloatingPreviewText mGestureFloatingPreviewText;
private boolean mShowSlidingKeyInputPreview; private boolean mShowSlidingKeyInputPreview;
...@@ -193,6 +194,7 @@ public final class PreviewPlacerView extends RelativeLayout { ...@@ -193,6 +194,7 @@ public final class PreviewPlacerView extends RelativeLayout {
mOffscreenBuffer = Bitmap.createBitmap( mOffscreenBuffer = Bitmap.createBitmap(
mOffscreenWidth, mOffscreenHeight, Bitmap.Config.ARGB_8888); mOffscreenWidth, mOffscreenHeight, Bitmap.Config.ARGB_8888);
mOffscreenCanvas.setBitmap(mOffscreenBuffer); mOffscreenCanvas.setBitmap(mOffscreenBuffer);
mOffscreenCanvas.translate(0, mOffscreenOffsetY);
} }
@Override @Override
...@@ -205,19 +207,18 @@ public final class PreviewPlacerView extends RelativeLayout { ...@@ -205,19 +207,18 @@ public final class PreviewPlacerView extends RelativeLayout {
mayAllocateOffscreenBuffer(); mayAllocateOffscreenBuffer();
// Draw gesture trails to offscreen buffer. // Draw gesture trails to offscreen buffer.
final boolean needsUpdatingGesturePreviewTrail = drawGestureTrails( final boolean needsUpdatingGesturePreviewTrail = drawGestureTrails(
mOffscreenCanvas, mGesturePaint, mOffscreenDirtyRect); mOffscreenCanvas, mGesturePaint, mDirtyRect);
if (needsUpdatingGesturePreviewTrail) {
mDrawingHandler.postUpdateGestureTrailPreview();
}
// Transfer offscreen buffer to screen. // Transfer offscreen buffer to screen.
if (!mOffscreenDirtyRect.isEmpty()) { if (!mDirtyRect.isEmpty()) {
canvas.translate(0, - mOffscreenOffsetY); mOffscreenSrcRect.set(mDirtyRect);
canvas.drawBitmap(mOffscreenBuffer, mOffscreenDirtyRect, mOffscreenDirtyRect, mOffscreenSrcRect.offset(0, mOffscreenOffsetY);
mGesturePaint); canvas.drawBitmap(mOffscreenBuffer, mOffscreenSrcRect, mDirtyRect, null);
canvas.translate(0, mOffscreenOffsetY);
// Note: Defer clearing the dirty rectangle here because we will get cleared // Note: Defer clearing the dirty rectangle here because we will get cleared
// rectangle on the canvas. // rectangle on the canvas.
} }
if (needsUpdatingGesturePreviewTrail) {
mDrawingHandler.postUpdateGestureTrailPreview();
}
} }
mGestureFloatingPreviewText.onDraw(canvas); mGestureFloatingPreviewText.onDraw(canvas);
if (mShowSlidingKeyInputPreview) { if (mShowSlidingKeyInputPreview) {
...@@ -235,10 +236,8 @@ public final class PreviewPlacerView extends RelativeLayout { ...@@ -235,10 +236,8 @@ public final class PreviewPlacerView extends RelativeLayout {
offscreenCanvas.drawRect(dirtyRect, paint); offscreenCanvas.drawRect(dirtyRect, paint);
} }
dirtyRect.setEmpty(); dirtyRect.setEmpty();
// Draw gesture trails to offscreen buffer.
offscreenCanvas.translate(0, mOffscreenOffsetY);
boolean needsUpdatingGesturePreviewTrail = false; boolean needsUpdatingGesturePreviewTrail = false;
// Draw gesture trails to offscreen buffer.
synchronized (mGesturePreviewTrails) { synchronized (mGesturePreviewTrails) {
// Trails count == fingers count that have ever been active. // Trails count == fingers count that have ever been active.
final int trailsCount = mGesturePreviewTrails.size(); final int trailsCount = mGesturePreviewTrails.size();
...@@ -251,20 +250,9 @@ public final class PreviewPlacerView extends RelativeLayout { ...@@ -251,20 +250,9 @@ public final class PreviewPlacerView extends RelativeLayout {
dirtyRect.union(mGesturePreviewTrailBoundsRect); dirtyRect.union(mGesturePreviewTrailBoundsRect);
} }
} }
offscreenCanvas.translate(0, -mOffscreenOffsetY);
// Clip dirty rectangle with offscreen buffer width/height.
dirtyRect.offset(0, mOffscreenOffsetY);
clipRect(dirtyRect, 0, 0, mOffscreenWidth, mOffscreenHeight);
return needsUpdatingGesturePreviewTrail; return needsUpdatingGesturePreviewTrail;
} }
private static void clipRect(final Rect out, final int left, final int top, final int right,
final int bottom) {
out.set(Math.max(out.left, left), Math.max(out.top, top), Math.min(out.right, right),
Math.min(out.bottom, bottom));
}
public void setGestureFloatingPreviewText(final SuggestedWords suggestedWords) { public void setGestureFloatingPreviewText(final SuggestedWords suggestedWords) {
if (!mGestureFloatingPreviewText.isPreviewEnabled()) return; if (!mGestureFloatingPreviewText.isPreviewEnabled()) return;
mGestureFloatingPreviewText.setSuggetedWords(suggestedWords); mGestureFloatingPreviewText.setSuggetedWords(suggestedWords);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
package com.android.inputmethod.keyboard.internal; package com.android.inputmethod.keyboard.internal;
import android.graphics.Path; import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF; import android.graphics.RectF;
public final class RoundedLine { public final class RoundedLine {
...@@ -100,4 +101,10 @@ public final class RoundedLine { ...@@ -100,4 +101,10 @@ public final class RoundedLine {
mPath.close(); mPath.close();
return mPath; return mPath;
} }
public void getBounds(final Rect outBounds) {
// Reuse mArc1 as working variable
mPath.computeBounds(mArc1, true /* unused */);
mArc1.roundOut(outBounds);
}
} }
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