From 047802d41650f52b8adee936ce2c2e8f0738ba12 Mon Sep 17 00:00:00 2001 From: Marin Shalamanov Date: Tue, 19 May 2020 23:55:12 +0200 Subject: Render boot animation with same size as framebuffer When ro.surface_flinger.max_graphics_{width|height} is set the framebuffer size is limited by this property. However the boot animation size matches the display active mode size which can cause it to be off-center or partially visible. This change limits the boot animation surface size with accordance with ro.surface_flinger.max_graphics_width. Bug: 153991408 Test: manual Change-Id: Idfd1c9adc1f6b10f44bc04ec2078dbc823f28ed6 --- cmds/bootanimation/BootAnimation.cpp | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'cmds/bootanimation/BootAnimation.cpp') diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index 3bcabe56f89e..bb2de17b42f3 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -349,6 +349,25 @@ EGLConfig BootAnimation::getEglConfig(const EGLDisplay& display) { return config; } +ui::Size BootAnimation::limitSurfaceSize(int width, int height) const { + ui::Size limited(width, height); + bool wasLimited = false; + const float aspectRatio = float(width) / float(height); + if (mMaxWidth != 0 && width > mMaxWidth) { + limited.height = mMaxWidth / aspectRatio; + limited.width = mMaxWidth; + wasLimited = true; + } + if (mMaxHeight != 0 && limited.height > mMaxHeight) { + limited.height = mMaxHeight; + limited.width = mMaxHeight * aspectRatio; + wasLimited = true; + } + SLOGV_IF(wasLimited, "Surface size has been limited to [%dx%d] from [%dx%d]", + limited.width, limited.height, width, height); + return limited; +} + status_t BootAnimation::readyToRun() { mAssets.addDefaultAssets(); @@ -362,8 +381,10 @@ status_t BootAnimation::readyToRun() { if (error != NO_ERROR) return error; - const ui::Size& resolution = displayConfig.resolution; - + mMaxWidth = android::base::GetIntProperty("ro.surface_flinger.max_graphics_width", 0); + mMaxHeight = android::base::GetIntProperty("ro.surface_flinger.max_graphics_height", 0); + ui::Size resolution = displayConfig.resolution; + resolution = limitSurfaceSize(resolution.width, resolution.height); // create the native surface sp control = session()->createSurface(String8("BootAnimation"), resolution.getWidth(), resolution.getHeight(), PIXEL_FORMAT_RGB_565); @@ -459,8 +480,9 @@ void BootAnimation::resizeSurface(int newWidth, int newHeight) { eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglDestroySurface(mDisplay, mSurface); - mWidth = newWidth; - mHeight = newHeight; + const auto limitedSize = limitSurfaceSize(newWidth, newHeight); + mWidth = limitedSize.width; + mHeight = limitedSize.height; SurfaceComposerClient::Transaction t; t.setSize(mFlingerSurfaceControl, mWidth, mHeight); -- cgit v1.2.3