Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7948993c authored by Shu Chen's avatar Shu Chen Committed by Android (Google) Code Review
Browse files

Merge "Limits the left/right bounds of the magnified text content within the textview."

parents 3cdd8e53 51520d1f
Loading
Loading
Loading
Loading
+57 −18
Original line number Diff line number Diff line
@@ -76,6 +76,8 @@ public final class Magnifier {
    // the Handler of this Thread when the copy is finished.
    private static final HandlerThread sPixelCopyHandlerThread =
            new HandlerThread("magnifier pixel copy result handler");
    // The width of the ramp region in pixels on the left & right sides of the fish-eye effect.
    private static final int FISHEYE_RAMP_WIDTH = 30;

    // The view to which this magnifier is attached.
    private final View mView;
@@ -303,16 +305,54 @@ public final class Magnifier {
            // The magnifier center is the same as source center in new style.
            magnifierCenterX = mClampedCenterZoomCoords.x - mViewCoordinatesInSurface[0];
            magnifierCenterY = mClampedCenterZoomCoords.y - mViewCoordinatesInSurface[1];

            // mLeftBound & mRightBound (typically the text line left/right) is for magnified
            // content. However the PixelCopy requires the pre-magnified bounds.
            // The below logic calculates the leftBound & rightBound for the pre-magnified bounds.
            final float rampPre =
                    (mSourceWidth - (mSourceWidth - 2 * FISHEYE_RAMP_WIDTH) / mZoom) / 2;

            // Calculates the pre-zoomed left edge.
            // The leftEdge moves from the left of view towards to sourceCenterX, considering the
            // fisheye-like zooming.
            final float x0 = sourceCenterX - mSourceWidth / 2;
            final float rampX0 = x0 + FISHEYE_RAMP_WIDTH;
            float leftEdge = 0;
            if (leftEdge > rampX0) {
                // leftEdge is in the zoom range, the distance from leftEdge to sourceCenterX
                // should reduce per mZoom.
                leftEdge = sourceCenterX - (sourceCenterX - leftEdge) / mZoom;
            } else if (leftEdge > x0) {
                // leftEdge is in the ramp range, the distance from leftEdge to rampX0 should
                // increase per ramp zoom (ramp / rampPre).
                leftEdge = x0 + rampPre - (rampX0 - leftEdge) * rampPre / FISHEYE_RAMP_WIDTH;
            }
            int leftBound = Math.min(Math.max((int) leftEdge, mLeftBound), mRightBound);

            // Calculates the pre-zoomed right edge.
            // The rightEdge moves from the right of view towards to sourceCenterX, considering the
            // fisheye-like zooming.
            final float x1 = sourceCenterX + mSourceWidth / 2;
            final float rampX1 = x1 - FISHEYE_RAMP_WIDTH;
            float rightEdge = mView.getWidth();
            if (rightEdge < rampX1) {
                // rightEdge is in the zoom range, the distance from rightEdge to sourceCenterX
                // should reduce per mZoom.
                rightEdge = sourceCenterX + (rightEdge - sourceCenterX) / mZoom;
            } else if (rightEdge < x1) {
                // rightEdge is in the ramp range, the distance from rightEdge to rampX1 should
                // increase per ramp zoom (ramp / rampPre).
                rightEdge = x1 - rampPre + (rightEdge - rampX1) * rampPre / FISHEYE_RAMP_WIDTH;
            }
            int rightBound = Math.max(leftBound, Math.min((int) rightEdge, mRightBound));

            // Gets the startX for new style, which should be bounded by the horizontal bounds.
            // Also calculates the left/right cut width for pixel copy.
            final int left = startX;
            final int right = startX + mSourceWidth;
            final int leftBound = mViewCoordinatesInSurface[0] + Math.max(0, mLeftBound);
            final int rightBound =
                    mViewCoordinatesInSurface[0] + Math.min(mView.getWidth(), mRightBound);
            startX = Math.max(left, leftBound);
            mLeftCutWidth = Math.max(0, leftBound - left);
            mRightCutWidth = Math.max(0, right - rightBound);
            leftBound += mViewCoordinatesInSurface[0];
            rightBound += mViewCoordinatesInSurface[0];
            mLeftCutWidth = Math.max(0, leftBound - startX);
            mRightCutWidth = Math.max(0, startX + mSourceWidth - rightBound);
            startX = Math.max(startX, leftBound);
        }
        obtainWindowCoordinates(magnifierCenterX, magnifierCenterY);

@@ -322,7 +362,7 @@ public final class Magnifier {
                synchronized (mLock) {
                    mWindow = new InternalPopupWindow(mView.getContext(), mView.getDisplay(),
                            mParentSurface.mSurfaceControl, mWindowWidth, mWindowHeight, mZoom,
                            mWindowElevation, mWindowCornerRadius,
                            FISHEYE_RAMP_WIDTH, mWindowElevation, mWindowCornerRadius,
                            mOverlay != null ? mOverlay : new ColorDrawable(Color.TRANSPARENT),
                            Handler.getMain() /* draw the magnifier on the UI thread */, mLock,
                            mCallback, mIsFishEyeStyle);
@@ -854,8 +894,6 @@ public final class Magnifier {
        // The z of the magnifier surface, defining its z order in the list of
        // siblings having the same parent surface (usually the main app surface).
        private static final int SURFACE_Z = 5;
        // The width of the ramp region in pixels on the left & right sides of the fish-eye effect.
        private static final int FISHEYE_RAMP_WIDTH = 30;

        // Display associated to the view the magnifier is attached to.
        private final Display mDisplay;
@@ -905,6 +943,8 @@ public final class Magnifier {
        private Bitmap mCurrentContent;

        private final float mZoom;
        // The width of the ramp region in pixels on the left & right sides of the fish-eye effect.
        private final int mRamp;
        // Whether is in the new magnifier style.
        private boolean mIsFishEyeStyle;
        // The mesh matrix for the fish-eye effect.
@@ -915,7 +955,7 @@ public final class Magnifier {

        InternalPopupWindow(final Context context, final Display display,
                final SurfaceControl parentSurfaceControl, final int width, final int height,
                final float zoom, final float elevation, final float cornerRadius,
                final float zoom, final int ramp, final float elevation, final float cornerRadius,
                final Drawable overlay, final Handler handler, final Object lock,
                final Callback callback, final boolean isFishEyeStyle) {
            mDisplay = display;
@@ -926,6 +966,7 @@ public final class Magnifier {
            mContentWidth = width;
            mContentHeight = height;
            mZoom = zoom;
            mRamp = ramp;
            mOffsetX = (int) (1.05f * elevation);
            mOffsetY = (int) (1.05f * elevation);
            // Setup the surface we will use for drawing the content and shadow.
@@ -995,14 +1036,13 @@ public final class Magnifier {
            final float h = mContentHeight;
            final float h0 = h / mZoom;
            final float dh = h - h0;
            final float ramp = FISHEYE_RAMP_WIDTH;
            mMeshLeft = new float[2 * (mMeshWidth + 1) * (mMeshHeight + 1)];
            mMeshRight = new float[2 * (mMeshWidth + 1) * (mMeshHeight + 1)];
            for (int i = 0; i < 2 * (mMeshWidth + 1) * (mMeshHeight + 1); i += 2) {
                // Calculates X value.
                final int colIndex = i % (2 * (mMeshWidth + 1)) / 2;
                mMeshLeft[i] = (float) colIndex * ramp / mMeshWidth;
                mMeshRight[i] = w - ramp + colIndex * ramp / mMeshWidth;
                mMeshLeft[i] = (float) colIndex * mRamp / mMeshWidth;
                mMeshRight[i] = w - mRamp + colIndex * mRamp / mMeshWidth;

                // Calculates Y value.
                final int rowIndex = i / 2 / (mMeshWidth + 1);
@@ -1174,14 +1214,13 @@ public final class Magnifier {
                    final Paint paint = new Paint();
                    paint.setFilterBitmap(true);
                    if (mIsFishEyeStyle) {
                        final int ramp = FISHEYE_RAMP_WIDTH;
                        final int margin =
                            (int)((mContentWidth - (mContentWidth - 2 * ramp) / mZoom) / 2);
                            (int)((mContentWidth - (mContentWidth - 2 * mRamp) / mZoom) / 2);

                        // Draws the middle part.
                        final Rect srcRect = new Rect(margin, 0, w - margin, h);
                        final Rect dstRect = new Rect(
                            ramp, 0, mContentWidth - ramp, mContentHeight);
                            mRamp, 0, mContentWidth - mRamp, mContentHeight);
                        canvas.drawBitmap(mBitmap, srcRect, dstRect, paint);

                        // Draws the left/right parts with mesh matrixes.