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

Commit 419fcfd9 authored by Arthur (Min-Hsin) Lee's avatar Arthur (Min-Hsin) Lee Committed by Android (Google) Code Review
Browse files

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

parents 215b4e2a 435fa67f
Loading
Loading
Loading
Loading
+37 −29
Original line number Diff line number Diff line
@@ -1280,46 +1280,54 @@ final class AccessibilityController {
                }

                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) {
                        if (!mInvalidated) {
                            return;
                        }
                        mInvalidated = false;
                        if (mAlpha > 0) {
                            Canvas canvas = null;
                            try {

                        alpha = mAlpha;
                        if (alpha > 0) {
                            drawingBounds = new Region(mBounds);
                            // Empty dirty rectangle means unspecified.
                            if (mDirtyRect.isEmpty()) {
                                mBounds.getBounds(mDirtyRect);
                            }
                            mDirtyRect.inset(-mHalfBorderWidth, -mHalfBorderWidth);
                                canvas = mSurface.lockCanvas(mDirtyRect);
                            drawingRect = new Rect(mDirtyRect);
                            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 */
                        }
                        if (canvas == null) {
                            return;
                        }
                            if (DEBUG_VIEWPORT_WINDOW) {
                                Slog.i(LOG_TAG, "Bounds: " + mBounds);
                            }
                        canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
                            mPaint.setAlpha(mAlpha);
                            Path path = mBounds.getBoundaryPath();
                            canvas.drawPath(path, mPaint);

                        mPaint.setAlpha(alpha);
                        canvas.drawPath(drawingBounds.getBoundaryPath(), mPaint);
                        mSurface.unlockCanvasAndPost(canvas);
                        t.show(mSurfaceControl);
                    } else {
                        t.hide(mSurfaceControl);
                    }
                }
                }

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