Loading libs/surfaceflinger/BootAnimation.cpp +20 −179 Original line number Diff line number Diff line Loading @@ -187,44 +187,20 @@ bool BootAnimation::threadLoop() { } bool BootAnimation::android() { initTexture(&mAndroid[0], mAssets, "images/android_320x480.png"); initTexture(&mAndroid[1], mAssets, "images/boot_robot.png"); initTexture(&mAndroid[2], mAssets, "images/boot_robot_glow.png"); // erase screen glDisable(GL_SCISSOR_TEST); glBindTexture(GL_TEXTURE_2D, mAndroid[0].name); initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png"); initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png"); // clear screen glDisable(GL_DITHER); glDisable(GL_SCISSOR_TEST); glClear(GL_COLOR_BUFFER_BIT); eglSwapBuffers(mDisplay, mSurface); // wait ~1s usleep(800000); // fade in glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); const int steps = 8; for (int i = 1; i < steps; i++) { float fade = i / float(steps); glColor4f(1, 1, 1, fade * fade); glClear(GL_COLOR_BUFFER_BIT); glDrawTexiOES(0, 0, 0, mAndroid[0].w, mAndroid[0].h); eglSwapBuffers(mDisplay, mSurface); } // draw last frame glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glDisable(GL_BLEND); glDrawTexiOES(0, 0, 0, mAndroid[0].w, mAndroid[0].h); eglSwapBuffers(mDisplay, mSurface); // update rect for the robot const int x = mWidth - mAndroid[1].w - 33; const int y = (mHeight - mAndroid[1].h) / 2 - 1; const Rect updateRect(x, y, x + mAndroid[1].w, y + mAndroid[1].h); const GLint xc = (mWidth - mAndroid[0].w) / 2; const GLint yc = (mHeight - mAndroid[0].h) / 2; const Rect updateRect(xc, yc, xc + mAndroid[0].w, yc + mAndroid[0].h); // draw and update only what we need mNativeWindowSurface->setSwapRectangle(updateRect.left, Loading @@ -234,166 +210,31 @@ bool BootAnimation::android() { glScissor(updateRect.left, mHeight - updateRect.bottom, updateRect.width(), updateRect.height()); // Blend state glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); const nsecs_t startTime = systemTime(); do { // glow speed and shape nsecs_t time = systemTime() - startTime; float t = ((4.0f / (360.0f * us2ns(16667))) * time); t = t - floorf(t); const float fade = 0.5f + 0.5f * sinf(t * 2 * M_PI); double time = systemTime() - startTime; float t = 4.0f * float(time / us2ns(16667)) / mAndroid[1].w; GLint offset = (1 - (t - floorf(t))) * mAndroid[1].w; GLint x = xc - offset; // fade the glow in and out glDisable(GL_BLEND); glBindTexture(GL_TEXTURE_2D, mAndroid[2].name); glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glColor4f(fade, fade, fade, fade); glDrawTexiOES(updateRect.left, mHeight - updateRect.bottom, 0, updateRect.width(), updateRect.height()); // draw the robot glEnable(GL_BLEND); glBindTexture(GL_TEXTURE_2D, mAndroid[1].name); glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glDrawTexiOES(updateRect.left, mHeight - updateRect.bottom, 0, updateRect.width(), updateRect.height()); glDrawTexiOES(x, yc, 0, mAndroid[1].w, mAndroid[1].h); glDrawTexiOES(x + mAndroid[1].w, yc, 0, mAndroid[1].w, mAndroid[1].h); // make sure sleep a lot to not take too much CPU away from // the boot process. With this "glow" animation there is no // visible difference. usleep(16667 * 4); glEnable(GL_BLEND); glBindTexture(GL_TEXTURE_2D, mAndroid[0].name); glDrawTexiOES(xc, yc, 0, mAndroid[0].w, mAndroid[0].h); eglSwapBuffers(mDisplay, mSurface); } while (!exitPending()); glDeleteTextures(1, &mAndroid[0].name); glDeleteTextures(1, &mAndroid[1].name); glDeleteTextures(1, &mAndroid[2].name); return false; } bool BootAnimation::cylon() { // initialize the textures... initTexture(&mLeftTrail, mAssets, "images/cylon_left.png"); initTexture(&mRightTrail, mAssets, "images/cylon_right.png"); initTexture(&mBrightSpot, mAssets, "images/cylon_dot.png"); int w = mWidth; int h = mHeight; const Point c(w / 2, h / 2); const GLint amplitude = 60; const int scx = c.x - amplitude - mBrightSpot.w / 2; const int scy = c.y - mBrightSpot.h / 2; const int scw = amplitude * 2 + mBrightSpot.w; const int sch = mBrightSpot.h; const Rect updateRect(scx, h - scy - sch, scx + scw, h - scy); // erase screen glDisable(GL_SCISSOR_TEST); glClear(GL_COLOR_BUFFER_BIT); eglSwapBuffers(mDisplay, mSurface); glClear(GL_COLOR_BUFFER_BIT); mNativeWindowSurface->setSwapRectangle(updateRect.left, updateRect.top, updateRect.width(), updateRect.height()); glEnable(GL_SCISSOR_TEST); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // clear the screen to white Point p; float t = 0; float alpha = 1.0f; const nsecs_t startTime = systemTime(); nsecs_t fadeTime = 0; do { // Set scissor in interesting area glScissor(scx, scy, scw, sch); // erase screen glClear(GL_COLOR_BUFFER_BIT); // compute wave const float a = (t * 2 * M_PI) - M_PI / 2; const float sn = sinf(a); const float cs = cosf(a); GLint x = GLint(amplitude * sn); float derivative = cs; glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); if (derivative > 0) { // vanishing trail... p.x = (-amplitude + c.x) - mBrightSpot.w / 2; p.y = c.y - mLeftTrail.h / 2; float fade = 2.0f * (0.5f - t); //fade *= fade; glColor4f(fade, fade, fade, fade); glBindTexture(GL_TEXTURE_2D, mLeftTrail.name); glDrawTexiOES(p.x, p.y, 0, mLeftTrail.w, mLeftTrail.h); // trail... p.x = (x + c.x) - (mRightTrail.w + mBrightSpot.w / 2) + 16; p.y = c.y - mRightTrail.h / 2; fade = t < 0.25f ? t * 4.0f : 1.0f; fade *= fade; glColor4f(fade, fade, fade, fade); glBindTexture(GL_TEXTURE_2D, mRightTrail.name); glDrawTexiOES(p.x, p.y, 0, mRightTrail.w, mRightTrail.h); } else { // vanishing trail.. p.x = (amplitude + c.x) - (mRightTrail.w + mBrightSpot.w / 2) + 16; p.y = c.y - mRightTrail.h / 2; float fade = 2.0f * (0.5f - (t - 0.5f)); //fade *= fade; glColor4f(fade, fade, fade, fade); glBindTexture(GL_TEXTURE_2D, mRightTrail.name); glDrawTexiOES(p.x, p.y, 0, mRightTrail.w, mRightTrail.h); // trail... p.x = (x + c.x) - mBrightSpot.w / 2; p.y = c.y - mLeftTrail.h / 2; fade = t < 0.5f + 0.25f ? (t - 0.5f) * 4.0f : 1.0f; fade *= fade; glColor4f(fade, fade, fade, fade); glBindTexture(GL_TEXTURE_2D, mLeftTrail.name); glDrawTexiOES(p.x, p.y, 0, mLeftTrail.w, mLeftTrail.h); } const Point p(x + c.x - mBrightSpot.w / 2, c.y - mBrightSpot.h / 2); glBindTexture(GL_TEXTURE_2D, mBrightSpot.name); glColor4f(1, 0.5, 0.5, 1); glDrawTexiOES(p.x, p.y, 0, mBrightSpot.w, mBrightSpot.h); // update animation nsecs_t time = systemTime() - startTime; t = ((4.0f / (360.0f * us2ns(16667))) * time); t = t - floorf(t); eglSwapBuffers(mDisplay, mSurface); if (exitPending()) { if (fadeTime == 0) { fadeTime = time; } time -= fadeTime; alpha = 1.0f - ((float(time) * 6.0f) / float(s2ns(1))); session()->openTransaction(); mFlingerSurface->setAlpha(alpha * alpha); session()->closeTransaction(); } } while (alpha > 0); // cleanup glFinish(); glDeleteTextures(1, &mLeftTrail.name); glDeleteTextures(1, &mRightTrail.name); glDeleteTextures(1, &mBrightSpot.name); return false; } Loading libs/surfaceflinger/BootAnimation.h +3 −7 Original line number Diff line number Diff line Loading @@ -62,14 +62,10 @@ private: status_t initTexture(Texture* texture, AssetManager& asset, const char* name); bool android(); bool cylon(); sp<SurfaceComposerClient> mSession; AssetManager mAssets; Texture mLeftTrail; Texture mRightTrail; Texture mBrightSpot; Texture mAndroid[3]; Texture mAndroid[2]; int mWidth; int mHeight; EGLDisplay mDisplay; Loading Loading
libs/surfaceflinger/BootAnimation.cpp +20 −179 Original line number Diff line number Diff line Loading @@ -187,44 +187,20 @@ bool BootAnimation::threadLoop() { } bool BootAnimation::android() { initTexture(&mAndroid[0], mAssets, "images/android_320x480.png"); initTexture(&mAndroid[1], mAssets, "images/boot_robot.png"); initTexture(&mAndroid[2], mAssets, "images/boot_robot_glow.png"); // erase screen glDisable(GL_SCISSOR_TEST); glBindTexture(GL_TEXTURE_2D, mAndroid[0].name); initTexture(&mAndroid[0], mAssets, "images/android-logo-mask.png"); initTexture(&mAndroid[1], mAssets, "images/android-logo-shine.png"); // clear screen glDisable(GL_DITHER); glDisable(GL_SCISSOR_TEST); glClear(GL_COLOR_BUFFER_BIT); eglSwapBuffers(mDisplay, mSurface); // wait ~1s usleep(800000); // fade in glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); const int steps = 8; for (int i = 1; i < steps; i++) { float fade = i / float(steps); glColor4f(1, 1, 1, fade * fade); glClear(GL_COLOR_BUFFER_BIT); glDrawTexiOES(0, 0, 0, mAndroid[0].w, mAndroid[0].h); eglSwapBuffers(mDisplay, mSurface); } // draw last frame glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glDisable(GL_BLEND); glDrawTexiOES(0, 0, 0, mAndroid[0].w, mAndroid[0].h); eglSwapBuffers(mDisplay, mSurface); // update rect for the robot const int x = mWidth - mAndroid[1].w - 33; const int y = (mHeight - mAndroid[1].h) / 2 - 1; const Rect updateRect(x, y, x + mAndroid[1].w, y + mAndroid[1].h); const GLint xc = (mWidth - mAndroid[0].w) / 2; const GLint yc = (mHeight - mAndroid[0].h) / 2; const Rect updateRect(xc, yc, xc + mAndroid[0].w, yc + mAndroid[0].h); // draw and update only what we need mNativeWindowSurface->setSwapRectangle(updateRect.left, Loading @@ -234,166 +210,31 @@ bool BootAnimation::android() { glScissor(updateRect.left, mHeight - updateRect.bottom, updateRect.width(), updateRect.height()); // Blend state glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); const nsecs_t startTime = systemTime(); do { // glow speed and shape nsecs_t time = systemTime() - startTime; float t = ((4.0f / (360.0f * us2ns(16667))) * time); t = t - floorf(t); const float fade = 0.5f + 0.5f * sinf(t * 2 * M_PI); double time = systemTime() - startTime; float t = 4.0f * float(time / us2ns(16667)) / mAndroid[1].w; GLint offset = (1 - (t - floorf(t))) * mAndroid[1].w; GLint x = xc - offset; // fade the glow in and out glDisable(GL_BLEND); glBindTexture(GL_TEXTURE_2D, mAndroid[2].name); glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glColor4f(fade, fade, fade, fade); glDrawTexiOES(updateRect.left, mHeight - updateRect.bottom, 0, updateRect.width(), updateRect.height()); // draw the robot glEnable(GL_BLEND); glBindTexture(GL_TEXTURE_2D, mAndroid[1].name); glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glDrawTexiOES(updateRect.left, mHeight - updateRect.bottom, 0, updateRect.width(), updateRect.height()); glDrawTexiOES(x, yc, 0, mAndroid[1].w, mAndroid[1].h); glDrawTexiOES(x + mAndroid[1].w, yc, 0, mAndroid[1].w, mAndroid[1].h); // make sure sleep a lot to not take too much CPU away from // the boot process. With this "glow" animation there is no // visible difference. usleep(16667 * 4); glEnable(GL_BLEND); glBindTexture(GL_TEXTURE_2D, mAndroid[0].name); glDrawTexiOES(xc, yc, 0, mAndroid[0].w, mAndroid[0].h); eglSwapBuffers(mDisplay, mSurface); } while (!exitPending()); glDeleteTextures(1, &mAndroid[0].name); glDeleteTextures(1, &mAndroid[1].name); glDeleteTextures(1, &mAndroid[2].name); return false; } bool BootAnimation::cylon() { // initialize the textures... initTexture(&mLeftTrail, mAssets, "images/cylon_left.png"); initTexture(&mRightTrail, mAssets, "images/cylon_right.png"); initTexture(&mBrightSpot, mAssets, "images/cylon_dot.png"); int w = mWidth; int h = mHeight; const Point c(w / 2, h / 2); const GLint amplitude = 60; const int scx = c.x - amplitude - mBrightSpot.w / 2; const int scy = c.y - mBrightSpot.h / 2; const int scw = amplitude * 2 + mBrightSpot.w; const int sch = mBrightSpot.h; const Rect updateRect(scx, h - scy - sch, scx + scw, h - scy); // erase screen glDisable(GL_SCISSOR_TEST); glClear(GL_COLOR_BUFFER_BIT); eglSwapBuffers(mDisplay, mSurface); glClear(GL_COLOR_BUFFER_BIT); mNativeWindowSurface->setSwapRectangle(updateRect.left, updateRect.top, updateRect.width(), updateRect.height()); glEnable(GL_SCISSOR_TEST); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // clear the screen to white Point p; float t = 0; float alpha = 1.0f; const nsecs_t startTime = systemTime(); nsecs_t fadeTime = 0; do { // Set scissor in interesting area glScissor(scx, scy, scw, sch); // erase screen glClear(GL_COLOR_BUFFER_BIT); // compute wave const float a = (t * 2 * M_PI) - M_PI / 2; const float sn = sinf(a); const float cs = cosf(a); GLint x = GLint(amplitude * sn); float derivative = cs; glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); if (derivative > 0) { // vanishing trail... p.x = (-amplitude + c.x) - mBrightSpot.w / 2; p.y = c.y - mLeftTrail.h / 2; float fade = 2.0f * (0.5f - t); //fade *= fade; glColor4f(fade, fade, fade, fade); glBindTexture(GL_TEXTURE_2D, mLeftTrail.name); glDrawTexiOES(p.x, p.y, 0, mLeftTrail.w, mLeftTrail.h); // trail... p.x = (x + c.x) - (mRightTrail.w + mBrightSpot.w / 2) + 16; p.y = c.y - mRightTrail.h / 2; fade = t < 0.25f ? t * 4.0f : 1.0f; fade *= fade; glColor4f(fade, fade, fade, fade); glBindTexture(GL_TEXTURE_2D, mRightTrail.name); glDrawTexiOES(p.x, p.y, 0, mRightTrail.w, mRightTrail.h); } else { // vanishing trail.. p.x = (amplitude + c.x) - (mRightTrail.w + mBrightSpot.w / 2) + 16; p.y = c.y - mRightTrail.h / 2; float fade = 2.0f * (0.5f - (t - 0.5f)); //fade *= fade; glColor4f(fade, fade, fade, fade); glBindTexture(GL_TEXTURE_2D, mRightTrail.name); glDrawTexiOES(p.x, p.y, 0, mRightTrail.w, mRightTrail.h); // trail... p.x = (x + c.x) - mBrightSpot.w / 2; p.y = c.y - mLeftTrail.h / 2; fade = t < 0.5f + 0.25f ? (t - 0.5f) * 4.0f : 1.0f; fade *= fade; glColor4f(fade, fade, fade, fade); glBindTexture(GL_TEXTURE_2D, mLeftTrail.name); glDrawTexiOES(p.x, p.y, 0, mLeftTrail.w, mLeftTrail.h); } const Point p(x + c.x - mBrightSpot.w / 2, c.y - mBrightSpot.h / 2); glBindTexture(GL_TEXTURE_2D, mBrightSpot.name); glColor4f(1, 0.5, 0.5, 1); glDrawTexiOES(p.x, p.y, 0, mBrightSpot.w, mBrightSpot.h); // update animation nsecs_t time = systemTime() - startTime; t = ((4.0f / (360.0f * us2ns(16667))) * time); t = t - floorf(t); eglSwapBuffers(mDisplay, mSurface); if (exitPending()) { if (fadeTime == 0) { fadeTime = time; } time -= fadeTime; alpha = 1.0f - ((float(time) * 6.0f) / float(s2ns(1))); session()->openTransaction(); mFlingerSurface->setAlpha(alpha * alpha); session()->closeTransaction(); } } while (alpha > 0); // cleanup glFinish(); glDeleteTextures(1, &mLeftTrail.name); glDeleteTextures(1, &mRightTrail.name); glDeleteTextures(1, &mBrightSpot.name); return false; } Loading
libs/surfaceflinger/BootAnimation.h +3 −7 Original line number Diff line number Diff line Loading @@ -62,14 +62,10 @@ private: status_t initTexture(Texture* texture, AssetManager& asset, const char* name); bool android(); bool cylon(); sp<SurfaceComposerClient> mSession; AssetManager mAssets; Texture mLeftTrail; Texture mRightTrail; Texture mBrightSpot; Texture mAndroid[3]; Texture mAndroid[2]; int mWidth; int mHeight; EGLDisplay mDisplay; Loading