Android系统的开机画面显示过程分析(4)
16lz
2021-01-24
函数fb_show_logo_line也是实现在文件kernel/goldfish/drivers/video/fbmem.c中,如下所示:
- static int fb_show_logo_line(struct fb_info *info, int rotate,
- const struct linux_logo *logo, int y,
- unsigned int n)
- {
- u32 *palette = NULL, *saved_pseudo_palette = NULL;
- unsigned char *logo_new = NULL, *logo_rotate = NULL;
- struct fb_p_w_picpath p_w_picpath;
- /* Return if the frame buffer is not mapped or suspended */
- if (logo == NULL || info->state != FBINFO_STATE_RUNNING ||
- info->flags & FBINFO_MODULE)
- return 0;
- p_w_picpath.depth = 8;
- p_w_picpath.data = logo->data;
- if (fb_logo.needs_cmapreset)
- fb_set_logocmap(info, logo);
- if (fb_logo.needs_truepalette ||
- fb_logo.needs_directpalette) {
- palette = kmalloc(256 * 4, GFP_KERNEL);
- if (palette == NULL)
- return 0;
- if (fb_logo.needs_truepalette)
- fb_set_logo_truepalette(info, logo, palette);
- else
- fb_set_logo_directpalette(info, logo, palette);
- saved_pseudo_palette = info->pseudo_palette;
- info->pseudo_palette = palette;
- }
- if (fb_logo.depth <= 4) {
- logo_new = kmalloc(logo->width * logo->height, GFP_KERNEL);
- if (logo_new == NULL) {
- kfree(palette);
- if (saved_pseudo_palette)
- info->pseudo_palette = saved_pseudo_palette;
- return 0;
- }
- p_w_picpath.data = logo_new;
- fb_set_logo(info, logo, logo_new, fb_logo.depth);
- }
- p_w_picpath.dx = 0;
- p_w_picpath.dy = y;
- p_w_picpath.width = logo->width;
- p_w_picpath.height = logo->height;
- if (rotate) {
- logo_rotate = kmalloc(logo->width *
- logo->height, GFP_KERNEL);
- if (logo_rotate)
- fb_rotate_logo(info, logo_rotate, &p_w_picpath, rotate);
- }
- fb_do_show_logo(info, &p_w_picpath, rotate, n);
- kfree(palette);
- if (saved_pseudo_palette != NULL)
- info->pseudo_palette = saved_pseudo_palette;
- kfree(logo_new);
- kfree(logo_rotate);
- return logo->height;
- }
- static void fb_do_show_logo(struct fb_info *info, struct fb_p_w_picpath *p_w_picpath,
- int rotate, unsigned int num)
- {
- unsigned int x;
- if (rotate == FB_ROTATE_UR) {
- for (x = 0;
- x < num && p_w_picpath->dx + p_w_picpath->width <= info->var.xres;
- x++) {
- info->fbops->fb_p_w_picpathblit(info, p_w_picpath);
- p_w_picpath->dx += p_w_picpath->width + 8;
- }
- } else if (rotate == FB_ROTATE_UD) {
- for (x = 0; x < num && p_w_picpath->dx >= 0; x++) {
- info->fbops->fb_p_w_picpathblit(info, p_w_picpath);
- p_w_picpath->dx -= p_w_picpath->width + 8;
- }
- } else if (rotate == FB_ROTATE_CW) {
- for (x = 0;
- x < num && p_w_picpath->dy + p_w_picpath->height <= info->var.yres;
- x++) {
- info->fbops->fb_p_w_picpathblit(info, p_w_picpath);
- p_w_picpath->dy += p_w_picpath->height + 8;
- }
- } else if (rotate == FB_ROTATE_CCW) {
- for (x = 0; x < num && p_w_picpath->dy >= 0; x++) {
- info->fbops->fb_p_w_picpathblit(info, p_w_picpath);
- p_w_picpath->dy -= p_w_picpath->height + 8;
- }
- }
- }
更多相关文章
- C语言函数的递归(上)
- Android前置摄像头视频录制失败(MediaRecorder: start failed: -1
- android 调用手机已安装的音乐播放器 的列表播放音乐
- Android(安卓)AsyncTask
- Android(安卓)之WebView
- h5在线动态页面调用app原生方法
- android里ksoap2调用WebService
- Android(安卓)Retrofit OkHttp添加Interceptor拦截器设置POST请
- Android指纹解锁调用