diff options
Diffstat (limited to 'cmds')
| -rw-r--r-- | cmds/am/src/com/android/commands/am/Am.java | 2 | ||||
| -rw-r--r-- | cmds/bootanimation/BootAnimation.cpp | 96 | ||||
| -rw-r--r-- | cmds/bootanimation/BootAnimation.h | 9 | ||||
| -rw-r--r-- | cmds/screencap/screencap.cpp | 48 |
4 files changed, 99 insertions, 56 deletions
diff --git a/cmds/am/src/com/android/commands/am/Am.java b/cmds/am/src/com/android/commands/am/Am.java index fea6f0e18a32..e6c576825e67 100644 --- a/cmds/am/src/com/android/commands/am/Am.java +++ b/cmds/am/src/com/android/commands/am/Am.java @@ -577,7 +577,7 @@ public class Am extends BaseCommand { return; } List<ResolveInfo> activities = pm.queryIntentActivities(intent, mimeType, 0, - mUserId); + mUserId).getList(); if (activities == null || activities.size() <= 0) { System.err.println("Error: Intent does not match any activities: " + intent); diff --git a/cmds/bootanimation/BootAnimation.cpp b/cmds/bootanimation/BootAnimation.cpp index 8f361ce1a779..ea53e59b017d 100644 --- a/cmds/bootanimation/BootAnimation.cpp +++ b/cmds/bootanimation/BootAnimation.cpp @@ -68,8 +68,7 @@ static const int ANIM_ENTRY_NAME_MAX = 256; // --------------------------------------------------------------------------- -BootAnimation::BootAnimation() : Thread(false), mZip(NULL) -{ +BootAnimation::BootAnimation() : Thread(false), mZip(NULL), mClockEnabled(true) { mSession = new SurfaceComposerClient(); } @@ -450,6 +449,69 @@ bool BootAnimation::readFile(const char* name, String8& outString) return true; } +// The time glyphs are stored in a single image of height 64 pixels. Each digit is 40 pixels wide, +// and the colon character is half that at 20 pixels. The glyph order is '0123456789:'. +// We render 24 hour time. +void BootAnimation::drawTime(const Texture& clockTex, const int yPos) { + static constexpr char TIME_FORMAT[] = "%H:%M"; + static constexpr int TIME_LENGTH = sizeof(TIME_FORMAT); + + static constexpr int DIGIT_HEIGHT = 64; + static constexpr int DIGIT_WIDTH = 40; + static constexpr int COLON_WIDTH = DIGIT_WIDTH / 2; + static constexpr int TIME_WIDTH = (DIGIT_WIDTH * 4) + COLON_WIDTH; + + if (clockTex.h < DIGIT_HEIGHT || clockTex.w < (10 * DIGIT_WIDTH + COLON_WIDTH)) { + ALOGE("Clock texture is too small; abandoning boot animation clock"); + mClockEnabled = false; + return; + } + + time_t rawtime; + time(&rawtime); + struct tm* timeInfo = localtime(&rawtime); + + char timeBuff[TIME_LENGTH]; + size_t length = strftime(timeBuff, TIME_LENGTH, TIME_FORMAT, timeInfo); + + if (length != TIME_LENGTH - 1) { + ALOGE("Couldn't format time; abandoning boot animation clock"); + mClockEnabled = false; + return; + } + + glEnable(GL_BLEND); // Allow us to draw on top of the animation + glBindTexture(GL_TEXTURE_2D, clockTex.name); + + int xPos = (mWidth - TIME_WIDTH) / 2; + int cropRect[4] = { 0, DIGIT_HEIGHT, DIGIT_WIDTH, -DIGIT_HEIGHT }; + + for (int i = 0; i < TIME_LENGTH - 1; i++) { + char c = timeBuff[i]; + int width = DIGIT_WIDTH; + int pos = c - '0'; // Position in the character list + if (pos < 0 || pos > 10) { + continue; + } + if (c == ':') { + width = COLON_WIDTH; + } + + // Crop the texture to only the pixels in the current glyph + int left = pos * DIGIT_WIDTH; + cropRect[0] = left; + cropRect[2] = width; + glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, cropRect); + + glDrawTexiOES(xPos, yPos, 0, width, DIGIT_HEIGHT); + + xPos += width; + } + + glDisable(GL_BLEND); // Return to the animation's default behaviour + glBindTexture(GL_TEXTURE_2D, 0); +} + bool BootAnimation::movie() { String8 desString; @@ -477,7 +539,12 @@ bool BootAnimation::movie() if (endl == NULL) break; String8 line(s, endl - s); const char* l = line.string(); - int fps, width, height, count, pause; + int fps = 0; + int width = 0; + int height = 0; + int count = 0; + int pause = 0; + int clockPosY = -1; char path[ANIM_ENTRY_NAME_MAX]; char color[7] = "000000"; // default to black if unspecified @@ -487,14 +554,15 @@ bool BootAnimation::movie() animation.width = width; animation.height = height; animation.fps = fps; - } - else if (sscanf(l, " %c %d %d %s #%6s", &pathType, &count, &pause, path, color) >= 4) { - // ALOGD("> type=%c, count=%d, pause=%d, path=%s, color=%s", pathType, count, pause, path, color); + } else if (sscanf(l, " %c %d %d %s #%6s %d", + &pathType, &count, &pause, path, color, &clockPosY) >= 4) { + // ALOGD("> type=%c, count=%d, pause=%d, path=%s, color=%s, clockPosY=%d", pathType, count, pause, path, color, clockPosY); Animation::Part part; part.playUntilComplete = pathType == 'c'; part.count = count; part.pause = pause; part.path = path; + part.clockPosY = clockPosY; part.audioFile = NULL; if (!parseColor(color, part.backgroundColor)) { ALOGE("> invalid color '#%s'", color); @@ -556,6 +624,8 @@ bool BootAnimation::movie() mZip->endIteration(cookie); + // Blend required to draw time on top of animation frames. + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glShadeModel(GL_FLAT); glDisable(GL_DITHER); glDisable(GL_SCISSOR_TEST); @@ -569,6 +639,12 @@ bool BootAnimation::movie() glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + bool clockTextureInitialized = false; + if (mClockEnabled) { + clockTextureInitialized = (initTexture(&mClock, mAssets, "images/clock64.png") == NO_ERROR); + mClockEnabled = clockTextureInitialized; + } + const int xc = (mWidth - animation.width) / 2; const int yc = ((mHeight - animation.height) / 2); nsecs_t frameDuration = s2ns(1) / animation.fps; @@ -629,6 +705,10 @@ bool BootAnimation::movie() // which is equivalent to mHeight - (yc + animation.height) glDrawTexiOES(xc, mHeight - (yc + animation.height), 0, animation.width, animation.height); + if (mClockEnabled && part.clockPosY >= 0) { + drawTime(mClock, part.clockPosY); + } + eglSwapBuffers(mDisplay, mSurface); nsecs_t now = systemTime(); @@ -665,6 +745,10 @@ bool BootAnimation::movie() } } + if (clockTextureInitialized) { + glDeleteTextures(1, &mClock.name); + } + return false; } diff --git a/cmds/bootanimation/BootAnimation.h b/cmds/bootanimation/BootAnimation.h index f968b255d37a..83e2b3804fe8 100644 --- a/cmds/bootanimation/BootAnimation.h +++ b/cmds/bootanimation/BootAnimation.h @@ -67,8 +67,10 @@ private: } }; struct Part { - int count; - int pause; + int count; // The number of times this part should repeat, 0 for infinite + int pause; // The number of frames to pause for at the end of this part + int clockPosY; // The y position of the clock, in pixels, from the bottom of the + // display (the clock is centred horizontally). -1 to disable the clock String8 path; SortedVector<Frame> frames; bool playUntilComplete; @@ -86,6 +88,7 @@ private: bool android(); bool readFile(const char* name, String8& outString); bool movie(); + void drawTime(const Texture& clockTex, const int yPos); void checkExit(); @@ -93,6 +96,7 @@ private: sp<AudioPlayer> mAudioPlayer; AssetManager mAssets; Texture mAndroid[2]; + Texture mClock; int mWidth; int mHeight; EGLDisplay mDisplay; @@ -101,6 +105,7 @@ private: sp<SurfaceControl> mFlingerSurfaceControl; sp<Surface> mFlingerSurface; ZipFileRO *mZip; + bool mClockEnabled; }; // --------------------------------------------------------------------------- diff --git a/cmds/screencap/screencap.cpp b/cmds/screencap/screencap.cpp index c469ae4a0961..7bf073b4b1a1 100644 --- a/cmds/screencap/screencap.cpp +++ b/cmds/screencap/screencap.cpp @@ -67,30 +67,6 @@ static SkColorType flinger2skia(PixelFormat f) } } -static status_t vinfoToPixelFormat(const fb_var_screeninfo& vinfo, - uint32_t* bytespp, uint32_t* f) -{ - - switch (vinfo.bits_per_pixel) { - case 16: - *f = PIXEL_FORMAT_RGB_565; - *bytespp = 2; - break; - case 24: - *f = PIXEL_FORMAT_RGB_888; - *bytespp = 3; - break; - case 32: - // TODO: do better decoding of vinfo here - *f = PIXEL_FORMAT_RGBX_8888; - *bytespp = 4; - break; - default: - return BAD_VALUE; - } - return NO_ERROR; -} - static status_t notifyMediaScanner(const char* fileName) { String8 cmd("am broadcast -a android.intent.action.MEDIA_SCANNER_SCAN_FILE -d file://"); String8 fileUrl("\""); @@ -147,7 +123,7 @@ int main(int argc, char** argv) png = true; } } - + if (fd == -1) { usage(pname); return 1; @@ -195,28 +171,6 @@ int main(int argc, char** argv) s = screenshot.getStride(); f = screenshot.getFormat(); size = screenshot.getSize(); - } else { - const char* fbpath = "/dev/graphics/fb0"; - int fb = open(fbpath, O_RDONLY); - if (fb >= 0) { - struct fb_var_screeninfo vinfo; - if (ioctl(fb, FBIOGET_VSCREENINFO, &vinfo) == 0) { - uint32_t bytespp; - if (vinfoToPixelFormat(vinfo, &bytespp, &f) == NO_ERROR) { - size_t offset = (vinfo.xoffset + vinfo.yoffset*vinfo.xres) * bytespp; - w = vinfo.xres; - h = vinfo.yres; - s = vinfo.xres; - size = w*h*bytespp; - mapsize = offset + size; - mapbase = mmap(0, mapsize, PROT_READ, MAP_PRIVATE, fb, 0); - if (mapbase != MAP_FAILED) { - base = (void const *)((char const *)mapbase + offset); - } - } - } - close(fb); - } } if (base != NULL) { |