[How To] Setup Static Bootlogo (Before Animated Boot Animation)

xaueious

Administrator
Staff member
Jul 9, 2010
3,483
436
To setup the static bootlogo, you need to create a specially formatted image to be named initlogo.rle to be placed in the root directory of the ramdisk.

You need the 'convert' binary to convert the image to a raw rgb888 file, and the to565 will convert it to initlogo.rle.

The resolution of the boot logo should be the size of the screen, in pixels. For example, 800x480.

I use a script under Ubuntu to convert my png image to my static splash logo:
Code:
#! /bin/sh
convert -depth 8 splash.png rgb:splash.raw
./to565 -rle < splash.raw > initlogo.rle
you need need the to565 compiled (gcc -o to565 to565.c):
Code:
/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
    
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define to565(r,g,b)                                            \
    ((((r) >> 3) << 11) | (((g) >> 2) << 5) | ((b) >> 3))

#define from565_r(x) ((((x) >> 11) & 0x1f) * 255 / 31)
#define from565_g(x) ((((x) >> 5) & 0x3f) * 255 / 63)
#define from565_b(x) (((x) & 0x1f) * 255 / 31)

void to_565_raw(void)
{
    unsigned char in[3];
    unsigned short out;

    while(read(0, in, 3) == 3) {
        out = to565(in[0],in[1],in[2]);
        write(1, &out, 2);
    }
    return;
}

void to_565_raw_dither(int width)
{
    unsigned char in[3];
    unsigned short out;
    int i = 0;
    int e;

    int* error = malloc((width+2) * 3 * sizeof(int));
    int* next_error = malloc((width+2) * 3 * sizeof(int));
    memset(error, 0, (width+2) * 3 * sizeof(int));
    memset(next_error, 0, (width+2) * 3 * sizeof(int));
    error += 3;        // array goes from [-3..((width+1)*3+2)]
    next_error += 3;

    while(read(0, in, 3) == 3) {
        int r = in[0] + error[i*3+0];
        int rb = (r < 0) ? 0 : ((r > 255) ? 255 : r);

        int g = in[1] + error[i*3+1];
        int gb = (g < 0) ? 0 : ((g > 255) ? 255 : g);

        int b = in[2] + error[i*3+2];
        int bb = (b < 0) ? 0 : ((b > 255) ? 255 : b);

        out = to565(rb, gb, bb);
        write(1, &out, 2);

#define apply_error(ch) {                                               \
            next_error[(i-1)*3+ch] += e * 3 / 16;                       \
            next_error[(i)*3+ch] += e * 5 / 16;                         \
            next_error[(i+1)*3+ch] += e * 1 / 16;                       \
            error[(i+1)*3+ch] += e - ((e*1/16) + (e*3/16) + (e*5/16));  \
        }

        e = r - from565_r(out);
        apply_error(0);

        e = g - from565_g(out);
        apply_error(1);

        e = b - from565_b(out);
        apply_error(2);

#undef apply_error

        ++i;
        if (i == width) {
            // error <- next_error; next_error <- 0
            int* temp = error; error = next_error; next_error = temp;
            memset(next_error, 0, (width+1) * 3 * sizeof(int));
            i = 0;
        }
    }

    free(error-3);
    free(next_error-3);

    return;
}

void to_565_rle(void)
{
    unsigned char in[3];
    unsigned short last, color, count;
    unsigned total = 0;
    count = 0;

    while(read(0, in, 3) == 3) {
        color = to565(in[0],in[1],in[2]);
        if (count) {
            if ((color == last) && (count != 65535)) {
                count++;
                continue;
            } else {
                write(1, &count, 2);
                write(1, &last, 2);
                total += count;
            }
        }
        last = color;
        count = 1;
    }
    if (count) {
        write(1, &count, 2);
        write(1, &last, 2);
        total += count;
    }
    fprintf(stderr,"%d pixels\n",total);
}

int main(int argc, char **argv)
{
    if ((argc == 2) && (!strcmp(argv[1],"-rle"))) {
        to_565_rle();
    } else {
        if (argc > 2 && (!strcmp(argv[1], "-w"))) {
            to_565_raw_dither(atoi(argv[2]));
        } else {
            to_565_raw();
        }
    }
    return 0;
}
XDA reading:
initlogo.rle: display an image on boot - xda-developers

Android wiki reading:
HOWTO: Unpack, Edit, and Re-Pack Boot Images - Android Wiki
 

ZilverZurfarn

Member
May 3, 2010
133
8
I might add that the binaries for to565 (both Windows and Linux) can be found here if you're not up to compiling it yourself.
 

ZilverZurfarn

Member
May 3, 2010
133
8
OK, so now that I got me a nice new boot splash, and would like to tweak update.img, where in update.img should it be placed? Can't find initlogo.rle anywhere.
Edit N.M. Found it in boot.img /Edit
 
Last edited:

cmylxgo

Member
Feb 24, 2011
1
0
Thanks Xaueious for the info. I am having a hard time finding the convert binary. Could you post a link to the biniaries that you used?

Thanks again
-CMYLXGO
 

l_n

Senior Member
Dec 28, 2010
788
99
convert is part of the ImageMagick software suite (lots of libraries and utilities in there.. wonderful bit of work from the open source community.)
 

venkatraman7

Member
Dec 6, 2010
11
0
Hi all,

I am trying to change splash screen for android with my own splash screen
I followed the steps as follows:
1. Created a new image and save it as raw file
2. I tried to change raw file to rle file using to565 C program but failed the coding is not showing any dependency nor any error so I download a sample initlogo.rle from net :cool:
3. I pasted the initlogo.rle to /out directory
4.I compiled the source code

but no change is happened :mad:

I tried in init.rc to stop the boot animation and I got succeed in it but not on changing the splash screen

Please correct me If i made any mistakes
 
Top