From 764ea0442141b4b961bb6c6af18e66cfaa617b7f Mon Sep 17 00:00:00 2001 From: joenchen Date: Mon, 11 Apr 2022 23:58:34 +0800 Subject: [PATCH] bootanimation: correct logo position and size after resolution changed The resolution may be changed while the boot animation is playing. mInitWidth and mInitHeight store the original resolution, and then the animation coordinate and size are recalculated according to the ratio (mWidth/mInitWidth and mHeight/mInitHeight). Bug: 228605923 Test: change resolution and then reboot to check the animation Change-Id: Id09490ecf7fc4b3e1a6baf073c134f357e9b327f --- cmds/bootanimation/BootAnimation.cpp | 23 +++++++++++++++-------- cmds/bootanimation/BootAnimation.h | 2 ++ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index 968be3e20791f..fb68c6d84d6aa 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -577,8 +577,8 @@ status_t BootAnimation::readyToRun() { mDisplay = display; mContext = context; mSurface = surface; - mWidth = w; - mHeight = h; + mInitWidth = mWidth = w; + mInitHeight = mHeight = h; mFlingerSurfaceControl = control; mFlingerSurface = s; mTargetInset = -1; @@ -611,6 +611,7 @@ void BootAnimation::resizeSurface(int newWidth, int newHeight) { eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); eglDestroySurface(mDisplay, mSurface); + mFlingerSurfaceControl->updateDefaultBufferSize(newWidth, newHeight); const auto limitedSize = limitSurfaceSize(newWidth, newHeight); mWidth = limitedSize.width; mHeight = limitedSize.height; @@ -1515,8 +1516,10 @@ bool BootAnimation::playAnimation(const Animation& animation) { processDisplayEvents(); - const int animationX = (mWidth - animation.width) / 2; - const int animationY = (mHeight - animation.height) / 2; + const double ratio_w = static_cast(mWidth) / mInitWidth; + const double ratio_h = static_cast(mHeight) / mInitHeight; + const int animationX = (mWidth - animation.width * ratio_w) / 2; + const int animationY = (mHeight - animation.height * ratio_h) / 2; const Animation::Frame& frame(part.frames[j]); nsecs_t lastFrame = systemTime(); @@ -1532,12 +1535,16 @@ bool BootAnimation::playAnimation(const Animation& animation) { initTexture(frame.map, &w, &h, false /* don't premultiply alpha */); } - const int xc = animationX + frame.trimX; - const int yc = animationY + frame.trimY; + const int trimWidth = frame.trimWidth * ratio_w; + const int trimHeight = frame.trimHeight * ratio_h; + const int trimX = frame.trimX * ratio_w; + const int trimY = frame.trimY * ratio_h; + const int xc = animationX + trimX; + const int yc = animationY + trimY; glClear(GL_COLOR_BUFFER_BIT); // specify the y center as ceiling((mHeight - frame.trimHeight) / 2) // which is equivalent to mHeight - (yc + frame.trimHeight) - const int frameDrawY = mHeight - (yc + frame.trimHeight); + const int frameDrawY = mHeight - (yc + trimHeight); float fade = 0; // if the part hasn't been stopped yet then continue fading if necessary @@ -1554,7 +1561,7 @@ bool BootAnimation::playAnimation(const Animation& animation) { glUniform1f(mImageColorProgressLocation, colorProgress); } glEnable(GL_BLEND); - drawTexturedQuad(xc, frameDrawY, frame.trimWidth, frame.trimHeight); + drawTexturedQuad(xc, frameDrawY, trimWidth, trimHeight); glDisable(GL_BLEND); if (mClockEnabled && mTimeIsAccurate && validClock(part)) { diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h index a136ad0a90f2f..86582053b4e16 100644 --- a/cmds/bootanimation/BootAnimation.h +++ b/cmds/bootanimation/BootAnimation.h @@ -213,6 +213,8 @@ private: Texture mAndroid[2]; int mWidth; int mHeight; + int mInitWidth; + int mInitHeight; int mMaxWidth = 0; int mMaxHeight = 0; int mCurrentInset;