diff options
author | 2022-04-11 23:58:34 +0800 | |
---|---|---|
committer | 2022-04-19 02:05:33 +0000 | |
commit | 764ea0442141b4b961bb6c6af18e66cfaa617b7f (patch) | |
tree | 0f992391350d29a958f1a2fe5d2c4b8dde7433a6 | |
parent | 4b3debf652480448f4a63e36a5bd168ba69b9c12 (diff) |
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
-rw-r--r-- | cmds/bootanimation/BootAnimation.cpp | 23 | ||||
-rw-r--r-- | 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 968be3e20791..fb68c6d84d6a 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<double>(mWidth) / mInitWidth; + const double ratio_h = static_cast<double>(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 a136ad0a90f2..86582053b4e1 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; |