bootanimation: allow animation to specify background color
Some OEMs want to have a bootanimation (or parts of it) displayed on a color other than black. They currently just use full-screen frames for that, which wastes lots of memory and bandwidth. This change allows each part of the animation to specify a background color that will be applied outside of the frame images; if unspecified the background will be black as it is now. Bug: 16635599 Change-Id: Ibf008fc75c5aad891c86ba9e4ec0879b7a61b8bd
This commit is contained in:
committed by
Vineeta Srivastava
parent
471157821f
commit
083b84cf88
@@ -397,6 +397,31 @@ void BootAnimation::checkExit() {
|
||||
}
|
||||
}
|
||||
|
||||
// Parse a color represented as an HTML-style 'RRGGBB' string: each pair of
|
||||
// characters in str is a hex number in [0, 255], which are converted to
|
||||
// floating point values in the range [0.0, 1.0] and placed in the
|
||||
// corresponding elements of color.
|
||||
//
|
||||
// If the input string isn't valid, parseColor returns false and color is
|
||||
// left unchanged.
|
||||
static bool parseColor(const char str[7], float color[3]) {
|
||||
float tmpColor[3];
|
||||
for (int i = 0; i < 3; i++) {
|
||||
int val = 0;
|
||||
for (int j = 0; j < 2; j++) {
|
||||
val *= 16;
|
||||
char c = str[2*i + j];
|
||||
if (c >= '0' && c <= '9') val += c - '0';
|
||||
else if (c >= 'A' && c <= 'F') val += (c - 'A') + 10;
|
||||
else if (c >= 'a' && c <= 'f') val += (c - 'a') + 10;
|
||||
else return false;
|
||||
}
|
||||
tmpColor[i] = static_cast<float>(val) / 255.0f;
|
||||
}
|
||||
memcpy(color, tmpColor, sizeof(tmpColor));
|
||||
return true;
|
||||
}
|
||||
|
||||
bool BootAnimation::movie()
|
||||
{
|
||||
ZipEntryRO desc = mZip->findEntryByName("desc.txt");
|
||||
@@ -427,20 +452,28 @@ bool BootAnimation::movie()
|
||||
const char* l = line.string();
|
||||
int fps, width, height, count, pause;
|
||||
char path[ANIM_ENTRY_NAME_MAX];
|
||||
char color[7] = "000000"; // default to black if unspecified
|
||||
|
||||
char pathType;
|
||||
if (sscanf(l, "%d %d %d", &width, &height, &fps) == 3) {
|
||||
//LOGD("> w=%d, h=%d, fps=%d", width, height, fps);
|
||||
// ALOGD("> w=%d, h=%d, fps=%d", width, height, fps);
|
||||
animation.width = width;
|
||||
animation.height = height;
|
||||
animation.fps = fps;
|
||||
}
|
||||
else if (sscanf(l, " %c %d %d %s", &pathType, &count, &pause, path) == 4) {
|
||||
//LOGD("> type=%c, count=%d, pause=%d, path=%s", pathType, count, pause, path);
|
||||
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);
|
||||
Animation::Part part;
|
||||
part.playUntilComplete = pathType == 'c';
|
||||
part.count = count;
|
||||
part.pause = pause;
|
||||
part.path = path;
|
||||
if (!parseColor(color, part.backgroundColor)) {
|
||||
ALOGE("> invalid color '#%s'", color);
|
||||
part.backgroundColor[0] = 0.0f;
|
||||
part.backgroundColor[1] = 0.0f;
|
||||
part.backgroundColor[2] = 0.0f;
|
||||
}
|
||||
animation.parts.add(part);
|
||||
}
|
||||
|
||||
@@ -526,6 +559,12 @@ bool BootAnimation::movie()
|
||||
if(exitPending() && !part.playUntilComplete)
|
||||
break;
|
||||
|
||||
glClearColor(
|
||||
part.backgroundColor[0],
|
||||
part.backgroundColor[1],
|
||||
part.backgroundColor[2],
|
||||
1.0f);
|
||||
|
||||
for (size_t j=0 ; j<fcount && (!exitPending() || part.playUntilComplete) ; j++) {
|
||||
const Animation::Frame& frame(part.frames[j]);
|
||||
nsecs_t lastFrame = systemTime();
|
||||
|
||||
@@ -71,6 +71,7 @@ private:
|
||||
String8 path;
|
||||
SortedVector<Frame> frames;
|
||||
bool playUntilComplete;
|
||||
float backgroundColor[3];
|
||||
};
|
||||
int fps;
|
||||
int width;
|
||||
|
||||
Reference in New Issue
Block a user