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

Commit deb2ca4d authored by Arthur (Min-Hsin) Lee's avatar Arthur (Min-Hsin) Lee Committed by Automerger Merge Worker
Browse files

Merge "Perform magnification viewport drawing outside of WM global lock." into...

Merge "Perform magnification viewport drawing outside of WM global lock." into udc-dev am: 419fcfd9

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/25583221



Change-Id: I15aeb62dcf0cc99bfada2a981012f0beebace333
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 705280cd 419fcfd9
Loading
Loading
Loading
Loading
+37 −29
Original line number Original line Diff line number Diff line
@@ -1280,46 +1280,54 @@ final class AccessibilityController {
                }
                }


                void drawIfNeeded(SurfaceControl.Transaction t) {
                void drawIfNeeded(SurfaceControl.Transaction t) {
                    // Drawing variables (alpha, dirty rect, and bounds) access is synchronized
                    // using WindowManagerGlobalLock. Grab copies of these values before
                    // drawing on the canvas so that drawing can be performed outside of the lock.
                    int alpha;
                    Rect drawingRect = null;
                    Region drawingBounds = null;
                    synchronized (mService.mGlobalLock) {
                    synchronized (mService.mGlobalLock) {
                        if (!mInvalidated) {
                        if (!mInvalidated) {
                            return;
                            return;
                        }
                        }
                        mInvalidated = false;
                        mInvalidated = false;
                        if (mAlpha > 0) {

                            Canvas canvas = null;
                        alpha = mAlpha;
                            try {
                        if (alpha > 0) {
                            drawingBounds = new Region(mBounds);
                            // Empty dirty rectangle means unspecified.
                            // Empty dirty rectangle means unspecified.
                            if (mDirtyRect.isEmpty()) {
                            if (mDirtyRect.isEmpty()) {
                                mBounds.getBounds(mDirtyRect);
                                mBounds.getBounds(mDirtyRect);
                            }
                            }
                            mDirtyRect.inset(-mHalfBorderWidth, -mHalfBorderWidth);
                            mDirtyRect.inset(-mHalfBorderWidth, -mHalfBorderWidth);
                                canvas = mSurface.lockCanvas(mDirtyRect);
                            drawingRect = new Rect(mDirtyRect);
                            if (DEBUG_VIEWPORT_WINDOW) {
                            if (DEBUG_VIEWPORT_WINDOW) {
                                    Slog.i(LOG_TAG, "Dirty rect: " + mDirtyRect);
                                Slog.i(LOG_TAG, "ViewportWindow bounds: " + mBounds);
                                Slog.i(LOG_TAG, "ViewportWindow dirty rect: " + mDirtyRect);
                            }
                            }
                            } catch (IllegalArgumentException iae) {
                        }
                                /* ignore */
                    }
                            } catch (Surface.OutOfResourcesException oore) {

                    // Draw without holding WindowManagerGlobalLock.
                    if (alpha > 0) {
                        Canvas canvas = null;
                        try {
                            canvas = mSurface.lockCanvas(drawingRect);
                        } catch (IllegalArgumentException | OutOfResourcesException e) {
                            /* ignore */
                            /* ignore */
                        }
                        }
                        if (canvas == null) {
                        if (canvas == null) {
                            return;
                            return;
                        }
                        }
                            if (DEBUG_VIEWPORT_WINDOW) {
                                Slog.i(LOG_TAG, "Bounds: " + mBounds);
                            }
                        canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
                        canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
                            mPaint.setAlpha(mAlpha);
                        mPaint.setAlpha(alpha);
                            Path path = mBounds.getBoundaryPath();
                        canvas.drawPath(drawingBounds.getBoundaryPath(), mPaint);
                            canvas.drawPath(path, mPaint);

                        mSurface.unlockCanvasAndPost(canvas);
                        mSurface.unlockCanvasAndPost(canvas);
                        t.show(mSurfaceControl);
                        t.show(mSurfaceControl);
                    } else {
                    } else {
                        t.hide(mSurfaceControl);
                        t.hide(mSurfaceControl);
                    }
                    }
                }
                }
                }


                void releaseSurface() {
                void releaseSurface() {
                    if (mBlastBufferQueue != null) {
                    if (mBlastBufferQueue != null) {