Loading cmds/bootanimation/BootAnimation.cpp +103 −31 Original line number Diff line number Diff line Loading @@ -68,14 +68,11 @@ static const int ANIM_ENTRY_NAME_MAX = 256; // --------------------------------------------------------------------------- BootAnimation::BootAnimation() : Thread(false), mZip(NULL), mClockEnabled(true) { BootAnimation::BootAnimation() : Thread(false), mClockEnabled(true) { mSession = new SurfaceComposerClient(); } BootAnimation::~BootAnimation() { if (mZip != NULL) { delete mZip; } } void BootAnimation::onFirstRef() { Loading Loading @@ -288,19 +285,15 @@ status_t BootAnimation::readyToRun() { bool encryptedAnimation = atoi(decrypt) != 0 || !strcmp("trigger_restart_min_framework", decrypt); ZipFileRO* zipFile = NULL; if ((encryptedAnimation && (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0) && ((zipFile = ZipFileRO::open(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE)) != NULL)) || ((access(OEM_BOOTANIMATION_FILE, R_OK) == 0) && ((zipFile = ZipFileRO::open(OEM_BOOTANIMATION_FILE)) != NULL)) || ((access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) && ((zipFile = ZipFileRO::open(SYSTEM_BOOTANIMATION_FILE)) != NULL))) { mZip = zipFile; if (encryptedAnimation && (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0)) { mZipFileName = SYSTEM_ENCRYPTED_BOOTANIMATION_FILE; } else if (access(OEM_BOOTANIMATION_FILE, R_OK) == 0) { mZipFileName = OEM_BOOTANIMATION_FILE; } else if (access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) { mZipFileName = SYSTEM_BOOTANIMATION_FILE; } return NO_ERROR; } Loading @@ -309,7 +302,7 @@ bool BootAnimation::threadLoop() bool r; // We have no bootanimation file, so we use the stock android logo // animation. if (mZip == NULL) { if (mZipFileName.isEmpty()) { r = android(); } else { r = movie(); Loading Loading @@ -429,16 +422,17 @@ static bool parseColor(const char str[7], float color[3]) { return true; } bool BootAnimation::readFile(const char* name, String8& outString) static bool readFile(ZipFileRO* zip, const char* name, String8& outString) { ZipEntryRO entry = mZip->findEntryByName(name); ZipEntryRO entry = zip->findEntryByName(name); ALOGE_IF(!entry, "couldn't find %s", name); if (!entry) { return false; } FileMap* entryMap = mZip->createEntryFileMap(entry); mZip->releaseEntry(entry); FileMap* entryMap = zip->createEntryFileMap(entry); zip->releaseEntry(entry); ALOGE_IF(!entryMap, "entryMap is null"); if (!entryMap) { return false; Loading Loading @@ -512,18 +506,18 @@ void BootAnimation::drawTime(const Texture& clockTex, const int yPos) { glBindTexture(GL_TEXTURE_2D, 0); } bool BootAnimation::movie() bool BootAnimation::parseAnimationDesc(Animation& animation) { String8 desString; if (!readFile("desc.txt", desString)) { if (!readFile(animation.zip, "desc.txt", desString)) { return false; } char const* s = desString.string(); // Create and initialize an AudioPlayer if we have an audio_conf.txt file String8 audioConf; if (readFile("audio_conf.txt", audioConf)) { if (readFile(animation.zip, "audio_conf.txt", audioConf)) { mAudioPlayer = new AudioPlayer; if (!mAudioPlayer->init(audioConf.string())) { ALOGE("mAudioPlayer.init failed"); Loading @@ -531,8 +525,6 @@ bool BootAnimation::movie() } } Animation animation; // Parse the description file for (;;) { const char* endl = strstr(s, "\n"); Loading Loading @@ -564,6 +556,7 @@ bool BootAnimation::movie() part.path = path; part.clockPosY = clockPosY; part.audioFile = NULL; part.animation = NULL; if (!parseColor(color, part.backgroundColor)) { ALOGE("> invalid color '#%s'", color); part.backgroundColor[0] = 0.0f; Loading @@ -572,13 +565,29 @@ bool BootAnimation::movie() } animation.parts.add(part); } else if (strcmp(l, "$SYSTEM") == 0) { // ALOGD("> SYSTEM"); Animation::Part part; part.playUntilComplete = false; part.count = 1; part.pause = 0; part.audioFile = NULL; part.animation = loadAnimation(String8(SYSTEM_BOOTANIMATION_FILE)); if (part.animation != NULL) animation.parts.add(part); } s = ++endl; } return true; } bool BootAnimation::preloadZip(Animation& animation) { // read all the data structures const size_t pcount = animation.parts.size(); void *cookie = NULL; ZipFileRO* mZip = animation.zip; if (!mZip->startIteration(&cookie)) { return false; } Loading Loading @@ -624,6 +633,16 @@ bool BootAnimation::movie() mZip->endIteration(cookie); return true; } bool BootAnimation::movie() { Animation* animation = loadAnimation(mZipFileName); if (animation == NULL) return false; // Blend required to draw time on top of animation frames. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glShadeModel(GL_FLAT); Loading @@ -645,6 +664,19 @@ bool BootAnimation::movie() mClockEnabled = clockTextureInitialized; } playAnimation(*animation); releaseAnimation(animation); if (clockTextureInitialized) { glDeleteTextures(1, &mClock.name); } return false; } bool BootAnimation::playAnimation(const Animation& animation) { const size_t pcount = animation.parts.size(); const int xc = (mWidth - animation.width) / 2; const int yc = ((mHeight - animation.height) / 2); nsecs_t frameDuration = s2ns(1) / animation.fps; Loading @@ -657,6 +689,14 @@ bool BootAnimation::movie() const size_t fcount = part.frames.size(); glBindTexture(GL_TEXTURE_2D, 0); // Handle animation package if (part.animation != NULL) { playAnimation(*part.animation); if (exitPending()) break; continue; //to next part } for (int r=0 ; !part.count || r<part.count ; r++) { // Exit any non playuntil complete parts immediately if(exitPending() && !part.playUntilComplete) Loading Loading @@ -744,14 +784,46 @@ bool BootAnimation::movie() } } } return true; } if (clockTextureInitialized) { glDeleteTextures(1, &mClock.name); void BootAnimation::releaseAnimation(Animation* animation) const { for (Vector<Animation::Part>::iterator it = animation->parts.begin(), e = animation->parts.end(); it != e; ++it) { if (it->animation) releaseAnimation(it->animation); } if (animation->zip) delete animation->zip; delete animation; } return false; BootAnimation::Animation* BootAnimation::loadAnimation(const String8& fn) { if (mLoadedFiles.indexOf(fn) >= 0) { ALOGE("File \"%s\" is already loaded. Cyclic ref is not allowed", fn.string()); return NULL; } ZipFileRO *zip = ZipFileRO::open(fn); if (zip == NULL) { ALOGE("Failed to open animation zip \"%s\": %s", fn.string(), strerror(errno)); return NULL; } Animation *animation = new Animation; animation->fileName = fn; animation->zip = zip; mLoadedFiles.add(animation->fileName); parseAnimationDesc(*animation); preloadZip(*animation); mLoadedFiles.remove(fn); return animation; } // --------------------------------------------------------------------------- } Loading cmds/bootanimation/BootAnimation.h +11 −2 Original line number Diff line number Diff line Loading @@ -76,19 +76,27 @@ private: bool playUntilComplete; float backgroundColor[3]; FileMap* audioFile; Animation* animation; }; int fps; int width; int height; Vector<Part> parts; String8 audioConf; String8 fileName; ZipFileRO* zip; }; status_t initTexture(Texture* texture, AssetManager& asset, const char* name); status_t initTexture(const Animation::Frame& frame); bool android(); bool readFile(const char* name, String8& outString); bool movie(); void drawTime(const Texture& clockTex, const int yPos); Animation* loadAnimation(const String8&); bool playAnimation(const Animation&); void releaseAnimation(Animation*) const; bool parseAnimationDesc(Animation&); bool preloadZip(Animation &animation); void checkExit(); Loading @@ -104,8 +112,9 @@ private: EGLDisplay mSurface; sp<SurfaceControl> mFlingerSurfaceControl; sp<Surface> mFlingerSurface; ZipFileRO *mZip; bool mClockEnabled; String8 mZipFileName; SortedVector<String8> mLoadedFiles; }; // --------------------------------------------------------------------------- Loading Loading
cmds/bootanimation/BootAnimation.cpp +103 −31 Original line number Diff line number Diff line Loading @@ -68,14 +68,11 @@ static const int ANIM_ENTRY_NAME_MAX = 256; // --------------------------------------------------------------------------- BootAnimation::BootAnimation() : Thread(false), mZip(NULL), mClockEnabled(true) { BootAnimation::BootAnimation() : Thread(false), mClockEnabled(true) { mSession = new SurfaceComposerClient(); } BootAnimation::~BootAnimation() { if (mZip != NULL) { delete mZip; } } void BootAnimation::onFirstRef() { Loading Loading @@ -288,19 +285,15 @@ status_t BootAnimation::readyToRun() { bool encryptedAnimation = atoi(decrypt) != 0 || !strcmp("trigger_restart_min_framework", decrypt); ZipFileRO* zipFile = NULL; if ((encryptedAnimation && (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0) && ((zipFile = ZipFileRO::open(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE)) != NULL)) || ((access(OEM_BOOTANIMATION_FILE, R_OK) == 0) && ((zipFile = ZipFileRO::open(OEM_BOOTANIMATION_FILE)) != NULL)) || ((access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) && ((zipFile = ZipFileRO::open(SYSTEM_BOOTANIMATION_FILE)) != NULL))) { mZip = zipFile; if (encryptedAnimation && (access(SYSTEM_ENCRYPTED_BOOTANIMATION_FILE, R_OK) == 0)) { mZipFileName = SYSTEM_ENCRYPTED_BOOTANIMATION_FILE; } else if (access(OEM_BOOTANIMATION_FILE, R_OK) == 0) { mZipFileName = OEM_BOOTANIMATION_FILE; } else if (access(SYSTEM_BOOTANIMATION_FILE, R_OK) == 0) { mZipFileName = SYSTEM_BOOTANIMATION_FILE; } return NO_ERROR; } Loading @@ -309,7 +302,7 @@ bool BootAnimation::threadLoop() bool r; // We have no bootanimation file, so we use the stock android logo // animation. if (mZip == NULL) { if (mZipFileName.isEmpty()) { r = android(); } else { r = movie(); Loading Loading @@ -429,16 +422,17 @@ static bool parseColor(const char str[7], float color[3]) { return true; } bool BootAnimation::readFile(const char* name, String8& outString) static bool readFile(ZipFileRO* zip, const char* name, String8& outString) { ZipEntryRO entry = mZip->findEntryByName(name); ZipEntryRO entry = zip->findEntryByName(name); ALOGE_IF(!entry, "couldn't find %s", name); if (!entry) { return false; } FileMap* entryMap = mZip->createEntryFileMap(entry); mZip->releaseEntry(entry); FileMap* entryMap = zip->createEntryFileMap(entry); zip->releaseEntry(entry); ALOGE_IF(!entryMap, "entryMap is null"); if (!entryMap) { return false; Loading Loading @@ -512,18 +506,18 @@ void BootAnimation::drawTime(const Texture& clockTex, const int yPos) { glBindTexture(GL_TEXTURE_2D, 0); } bool BootAnimation::movie() bool BootAnimation::parseAnimationDesc(Animation& animation) { String8 desString; if (!readFile("desc.txt", desString)) { if (!readFile(animation.zip, "desc.txt", desString)) { return false; } char const* s = desString.string(); // Create and initialize an AudioPlayer if we have an audio_conf.txt file String8 audioConf; if (readFile("audio_conf.txt", audioConf)) { if (readFile(animation.zip, "audio_conf.txt", audioConf)) { mAudioPlayer = new AudioPlayer; if (!mAudioPlayer->init(audioConf.string())) { ALOGE("mAudioPlayer.init failed"); Loading @@ -531,8 +525,6 @@ bool BootAnimation::movie() } } Animation animation; // Parse the description file for (;;) { const char* endl = strstr(s, "\n"); Loading Loading @@ -564,6 +556,7 @@ bool BootAnimation::movie() part.path = path; part.clockPosY = clockPosY; part.audioFile = NULL; part.animation = NULL; if (!parseColor(color, part.backgroundColor)) { ALOGE("> invalid color '#%s'", color); part.backgroundColor[0] = 0.0f; Loading @@ -572,13 +565,29 @@ bool BootAnimation::movie() } animation.parts.add(part); } else if (strcmp(l, "$SYSTEM") == 0) { // ALOGD("> SYSTEM"); Animation::Part part; part.playUntilComplete = false; part.count = 1; part.pause = 0; part.audioFile = NULL; part.animation = loadAnimation(String8(SYSTEM_BOOTANIMATION_FILE)); if (part.animation != NULL) animation.parts.add(part); } s = ++endl; } return true; } bool BootAnimation::preloadZip(Animation& animation) { // read all the data structures const size_t pcount = animation.parts.size(); void *cookie = NULL; ZipFileRO* mZip = animation.zip; if (!mZip->startIteration(&cookie)) { return false; } Loading Loading @@ -624,6 +633,16 @@ bool BootAnimation::movie() mZip->endIteration(cookie); return true; } bool BootAnimation::movie() { Animation* animation = loadAnimation(mZipFileName); if (animation == NULL) return false; // Blend required to draw time on top of animation frames. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glShadeModel(GL_FLAT); Loading @@ -645,6 +664,19 @@ bool BootAnimation::movie() mClockEnabled = clockTextureInitialized; } playAnimation(*animation); releaseAnimation(animation); if (clockTextureInitialized) { glDeleteTextures(1, &mClock.name); } return false; } bool BootAnimation::playAnimation(const Animation& animation) { const size_t pcount = animation.parts.size(); const int xc = (mWidth - animation.width) / 2; const int yc = ((mHeight - animation.height) / 2); nsecs_t frameDuration = s2ns(1) / animation.fps; Loading @@ -657,6 +689,14 @@ bool BootAnimation::movie() const size_t fcount = part.frames.size(); glBindTexture(GL_TEXTURE_2D, 0); // Handle animation package if (part.animation != NULL) { playAnimation(*part.animation); if (exitPending()) break; continue; //to next part } for (int r=0 ; !part.count || r<part.count ; r++) { // Exit any non playuntil complete parts immediately if(exitPending() && !part.playUntilComplete) Loading Loading @@ -744,14 +784,46 @@ bool BootAnimation::movie() } } } return true; } if (clockTextureInitialized) { glDeleteTextures(1, &mClock.name); void BootAnimation::releaseAnimation(Animation* animation) const { for (Vector<Animation::Part>::iterator it = animation->parts.begin(), e = animation->parts.end(); it != e; ++it) { if (it->animation) releaseAnimation(it->animation); } if (animation->zip) delete animation->zip; delete animation; } return false; BootAnimation::Animation* BootAnimation::loadAnimation(const String8& fn) { if (mLoadedFiles.indexOf(fn) >= 0) { ALOGE("File \"%s\" is already loaded. Cyclic ref is not allowed", fn.string()); return NULL; } ZipFileRO *zip = ZipFileRO::open(fn); if (zip == NULL) { ALOGE("Failed to open animation zip \"%s\": %s", fn.string(), strerror(errno)); return NULL; } Animation *animation = new Animation; animation->fileName = fn; animation->zip = zip; mLoadedFiles.add(animation->fileName); parseAnimationDesc(*animation); preloadZip(*animation); mLoadedFiles.remove(fn); return animation; } // --------------------------------------------------------------------------- } Loading
cmds/bootanimation/BootAnimation.h +11 −2 Original line number Diff line number Diff line Loading @@ -76,19 +76,27 @@ private: bool playUntilComplete; float backgroundColor[3]; FileMap* audioFile; Animation* animation; }; int fps; int width; int height; Vector<Part> parts; String8 audioConf; String8 fileName; ZipFileRO* zip; }; status_t initTexture(Texture* texture, AssetManager& asset, const char* name); status_t initTexture(const Animation::Frame& frame); bool android(); bool readFile(const char* name, String8& outString); bool movie(); void drawTime(const Texture& clockTex, const int yPos); Animation* loadAnimation(const String8&); bool playAnimation(const Animation&); void releaseAnimation(Animation*) const; bool parseAnimationDesc(Animation&); bool preloadZip(Animation &animation); void checkExit(); Loading @@ -104,8 +112,9 @@ private: EGLDisplay mSurface; sp<SurfaceControl> mFlingerSurfaceControl; sp<Surface> mFlingerSurface; ZipFileRO *mZip; bool mClockEnabled; String8 mZipFileName; SortedVector<String8> mLoadedFiles; }; // --------------------------------------------------------------------------- Loading