BootAnimation.cpp revision 9066cfe9886ac131c34d59ed0e2d287b0e3c0087
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "BootAnimation" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <math.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/misc.h> 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h> 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Atomic.h> 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Errors.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/AssetManager.h> 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/PixelFormat.h> 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/Rect.h> 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/Region.h> 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/DisplayInfo.h> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/ISurfaceComposer.h> 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/ISurfaceFlingerClient.h> 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <ui/EGLNativeWindowSurface.h> 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <core/SkBitmap.h> 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <images/SkImageDecoder.h> 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/gl.h> 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <GLES/glext.h> 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <EGL/eglext.h> 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "BootAnimation.h" 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectBootAnimation::BootAnimation(const sp<ISurfaceComposer>& composer) : 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread(false) { 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSession = SurfaceComposerClient::clientForConnection( 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project composer->createConnection()->asBinder()); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectBootAnimation::~BootAnimation() { 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid BootAnimation::onFirstRef() { 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project run("BootAnimation", PRIORITY_DISPLAY); 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst sp<SurfaceComposerClient>& BootAnimation::session() const { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mSession; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BootAnimation::initTexture(Texture* texture, AssetManager& assets, 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const char* name) { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Asset* asset = assets.open(name, Asset::ACCESS_BUFFER); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!asset) 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_INIT; 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkBitmap bitmap; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SkImageDecoder::DecodeMemory(asset->getBuffer(false), asset->getLength(), 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project &bitmap, SkBitmap::kNo_Config, SkImageDecoder::kDecodePixels_Mode); 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project asset->close(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project delete asset; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // ensure we can call getPixels(). No need to call unlock, since the 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bitmap will go out of scope when we return from this method. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bitmap.lockPixels(); 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int w = bitmap.width(); 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int h = bitmap.height(); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const void* p = bitmap.getPixels(); 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLint crop[4] = { 0, h, w, -h }; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project texture->w = w; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project texture->h = h; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glGenTextures(1, &texture->name); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBindTexture(GL_TEXTURE_2D, texture->name); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (bitmap.getConfig()) { 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SkBitmap::kA8_Config: 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, w, h, 0, GL_ALPHA, 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GL_UNSIGNED_BYTE, p); 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SkBitmap::kARGB_4444_Config: 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GL_UNSIGNED_SHORT_4_4_4_4, p); 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SkBitmap::kARGB_8888_Config: 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GL_UNSIGNED_BYTE, p); 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case SkBitmap::kRGB_565_Config: 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB, 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GL_UNSIGNED_SHORT_5_6_5, p); 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, crop); 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t BootAnimation::readyToRun() { 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAssets.addDefaultAssets(); 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayInfo dinfo; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t status = session()->getDisplayInfo(0, &dinfo); 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (status) 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // create the native surface 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<Surface> s = session()->createSurface(getpid(), 0, dinfo.w, dinfo.h, 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PIXEL_FORMAT_RGB_565); 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project session()->openTransaction(); 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s->setLayer(0x40000000); 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project session()->closeTransaction(); 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // initialize opengl and egl 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const EGLint attribs[] = { EGL_RED_SIZE, 5, EGL_GREEN_SIZE, 6, 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGL_BLUE_SIZE, 5, EGL_DEPTH_SIZE, 0, EGL_NONE }; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGLint w, h, dummy; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGLint numConfigs; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGLConfig config; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGLSurface surface; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGLContext context; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglChooseConfig(display, attribs, &config, 1, &numConfigs); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNativeWindowSurface = new EGLNativeWindowSurface(s); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project surface = eglCreateWindowSurface(display, config, 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNativeWindowSurface.get(), NULL); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project context = eglCreateContext(display, config, NULL, NULL); 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglQuerySurface(display, surface, EGL_WIDTH, &w); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglQuerySurface(display, surface, EGL_HEIGHT, &h); 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglMakeCurrent(display, surface, surface, context); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mDisplay = display; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mContext = context; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSurface = surface; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mWidth = w; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mHeight = h; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlingerSurface = s; 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // initialize GL 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glShadeModel(GL_FLAT); 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_DITHER); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_TEXTURE_2D); 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_SCISSOR_TEST); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NO_ERROR; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid BootAnimation::requestExit() { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBarrier.open(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Thread::requestExit(); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool BootAnimation::threadLoop() { 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool r = android(); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglDestroyContext(mDisplay, mContext); 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglDestroySurface(mDisplay, mSurface); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNativeWindowSurface.clear(); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return r; 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool BootAnimation::android() { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initTexture(&mAndroid[0], mAssets, "images/android_320x480.png"); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initTexture(&mAndroid[1], mAssets, "images/boot_robot.png"); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initTexture(&mAndroid[2], mAssets, "images/boot_robot_glow.png"); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // erase screen 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDisable(GL_SCISSOR_TEST); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBindTexture(GL_TEXTURE_2D, mAndroid[0].name); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clear screen 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glClear(GL_COLOR_BUFFER_BIT); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglSwapBuffers(mDisplay, mSurface); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // wait ~1s 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usleep(800000); 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fade in 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_BLEND); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int steps = 8; 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 1; i < steps; i++) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float fade = i / float(steps); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glColor4f(1, 1, 1, fade * fade); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glClear(GL_COLOR_BUFFER_BIT); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDrawTexiOES(0, 0, 0, mAndroid[0].w, mAndroid[0].h); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglSwapBuffers(mDisplay, mSurface); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // draw last frame 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDisable(GL_BLEND); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDrawTexiOES(0, 0, 0, mAndroid[0].w, mAndroid[0].h); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglSwapBuffers(mDisplay, mSurface); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // update rect for the robot 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int x = mWidth - mAndroid[1].w - 33; 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int y = (mHeight - mAndroid[1].h) / 2 - 1; 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Rect updateRect(x, y, x + mAndroid[1].w, y + mAndroid[1].h); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // draw and update only what we need 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNativeWindowSurface->setSwapRectangle(updateRect.left, 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateRect.top, updateRect.width(), updateRect.height()); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_SCISSOR_TEST); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glScissor(updateRect.left, mHeight - updateRect.bottom, updateRect.width(), 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateRect.height()); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const nsecs_t startTime = systemTime(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // glow speed and shape 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nsecs_t time = systemTime() - startTime; 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float t = ((4.0f / (360.0f * us2ns(16667))) * time); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = t - floorf(t); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const float fade = 0.5f + 0.5f * sinf(t * 2 * M_PI); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // fade the glow in and out 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDisable(GL_BLEND); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBindTexture(GL_TEXTURE_2D, mAndroid[2].name); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glColor4f(fade, fade, fade, fade); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDrawTexiOES(updateRect.left, mHeight - updateRect.bottom, 0, 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateRect.width(), updateRect.height()); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // draw the robot 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_BLEND); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBindTexture(GL_TEXTURE_2D, mAndroid[1].name); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDrawTexiOES(updateRect.left, mHeight - updateRect.bottom, 0, 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateRect.width(), updateRect.height()); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // make sure sleep a lot to not take too much CPU away from 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // the boot process. With this "glow" animation there is no 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // visible difference. 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usleep(16667 * 4); 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglSwapBuffers(mDisplay, mSurface); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (!exitPending()); 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDeleteTextures(1, &mAndroid[0].name); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDeleteTextures(1, &mAndroid[1].name); 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDeleteTextures(1, &mAndroid[2].name); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbool BootAnimation::cylon() { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // initialize the textures... 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initTexture(&mLeftTrail, mAssets, "images/cylon_left.png"); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initTexture(&mRightTrail, mAssets, "images/cylon_right.png"); 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initTexture(&mBrightSpot, mAssets, "images/cylon_dot.png"); 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int w = mWidth; 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h = mHeight; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Point c(w / 2, h / 2); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const GLint amplitude = 60; 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int scx = c.x - amplitude - mBrightSpot.w / 2; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int scy = c.y - mBrightSpot.h / 2; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int scw = amplitude * 2 + mBrightSpot.w; 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const int sch = mBrightSpot.h; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Rect updateRect(scx, h - scy - sch, scx + scw, h - scy); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // erase screen 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDisable(GL_SCISSOR_TEST); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glClear(GL_COLOR_BUFFER_BIT); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglSwapBuffers(mDisplay, mSurface); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glClear(GL_COLOR_BUFFER_BIT); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mNativeWindowSurface->setSwapRectangle(updateRect.left, 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project updateRect.top, updateRect.width(), updateRect.height()); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_SCISSOR_TEST); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glEnable(GL_BLEND); 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // clear the screen to white 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Point p; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float t = 0; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = 1.0f; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const nsecs_t startTime = systemTime(); 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nsecs_t fadeTime = 0; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project do { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Set scissor in interesting area 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glScissor(scx, scy, scw, sch); 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // erase screen 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glClear(GL_COLOR_BUFFER_BIT); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // compute wave 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const float a = (t * 2 * M_PI) - M_PI / 2; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const float sn = sinf(a); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const float cs = cosf(a); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project GLint x = GLint(amplitude * sn); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float derivative = cs; 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glTexEnvx(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (derivative > 0) { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // vanishing trail... 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.x = (-amplitude + c.x) - mBrightSpot.w / 2; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.y = c.y - mLeftTrail.h / 2; 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float fade = 2.0f * (0.5f - t); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //fade *= fade; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glColor4f(fade, fade, fade, fade); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBindTexture(GL_TEXTURE_2D, mLeftTrail.name); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDrawTexiOES(p.x, p.y, 0, mLeftTrail.w, mLeftTrail.h); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // trail... 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.x = (x + c.x) - (mRightTrail.w + mBrightSpot.w / 2) + 16; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.y = c.y - mRightTrail.h / 2; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fade = t < 0.25f ? t * 4.0f : 1.0f; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fade *= fade; 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glColor4f(fade, fade, fade, fade); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBindTexture(GL_TEXTURE_2D, mRightTrail.name); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDrawTexiOES(p.x, p.y, 0, mRightTrail.w, mRightTrail.h); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // vanishing trail.. 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.x = (amplitude + c.x) - (mRightTrail.w + mBrightSpot.w / 2) + 16; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.y = c.y - mRightTrail.h / 2; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float fade = 2.0f * (0.5f - (t - 0.5f)); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //fade *= fade; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glColor4f(fade, fade, fade, fade); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBindTexture(GL_TEXTURE_2D, mRightTrail.name); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDrawTexiOES(p.x, p.y, 0, mRightTrail.w, mRightTrail.h); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // trail... 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.x = (x + c.x) - mBrightSpot.w / 2; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.y = c.y - mLeftTrail.h / 2; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fade = t < 0.5f + 0.25f ? (t - 0.5f) * 4.0f : 1.0f; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fade *= fade; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glColor4f(fade, fade, fade, fade); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBindTexture(GL_TEXTURE_2D, mLeftTrail.name); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDrawTexiOES(p.x, p.y, 0, mLeftTrail.w, mLeftTrail.h); 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project const Point p(x + c.x - mBrightSpot.w / 2, c.y - mBrightSpot.h / 2); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glBindTexture(GL_TEXTURE_2D, mBrightSpot.name); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glColor4f(1, 0.5, 0.5, 1); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDrawTexiOES(p.x, p.y, 0, mBrightSpot.w, mBrightSpot.h); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // update animation 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nsecs_t time = systemTime() - startTime; 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = ((4.0f / (360.0f * us2ns(16667))) * time); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project t = t - floorf(t); 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project eglSwapBuffers(mDisplay, mSurface); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (exitPending()) { 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fadeTime == 0) { 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fadeTime = time; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project time -= fadeTime; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alpha = 1.0f - ((float(time) * 6.0f) / float(s2ns(1))); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project session()->openTransaction(); 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFlingerSurface->setAlpha(alpha * alpha); 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project session()->closeTransaction(); 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } while (alpha > 0); 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // cleanup 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glFinish(); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDeleteTextures(1, &mLeftTrail.name); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDeleteTextures(1, &mRightTrail.name); 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project glDeleteTextures(1, &mBrightSpot.name); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// --------------------------------------------------------------------------- 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project; // namespace android 404