summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author joenchen <joenchen@google.com> 2022-04-11 23:58:34 +0800
committer Joen Chen <joenchen@google.com> 2022-04-19 02:05:33 +0000
commit764ea0442141b4b961bb6c6af18e66cfaa617b7f (patch)
tree0f992391350d29a958f1a2fe5d2c4b8dde7433a6
parent4b3debf652480448f4a63e36a5bd168ba69b9c12 (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.cpp23
-rw-r--r--cmds/bootanimation/BootAnimation.h2
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;