xref: /haiku/src/system/kernel/boot_splash.cpp (revision 344ded80d400028c8f561b4b876257b94c12db4a)
1 /*
2  * Copyright 2008-2010, Haiku, Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Artur Wyszynski <harakash@gmail.com>
7  */
8 
9 
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <string.h>
13 #include <unistd.h>
14 
15 #include <KernelExport.h>
16 
17 #define __BOOTSPLASH_KERNEL__
18 #include <boot/images.h>
19 #include <boot/platform/generic/video_blitter.h>
20 #include <boot/platform/generic/video_splash.h>
21 
22 #include <boot_item.h>
23 #include <debug.h>
24 #include <frame_buffer_console.h>
25 
26 #include <boot_splash.h>
27 
28 
29 //#define TRACE_BOOT_SPLASH 1
30 #ifdef TRACE_BOOT_SPLASH
31 #	define TRACE(x...) dprintf(x);
32 #else
33 #	define TRACE(x...) ;
34 #endif
35 
36 
37 static struct frame_buffer_boot_info *sInfo;
38 static uint8 *sUncompressedIcons;
39 
40 
41 //	#pragma mark - exported functions
42 
43 
44 void
45 boot_splash_init(uint8 *bootSplash)
46 {
47 	TRACE("boot_splash_init: enter\n");
48 
49 	if (debug_screen_output_enabled())
50 		return;
51 
52 	sInfo = (frame_buffer_boot_info *)get_boot_item(FRAME_BUFFER_BOOT_INFO,
53 		NULL);
54 
55 	sUncompressedIcons = bootSplash;
56 }
57 
58 
59 void
60 boot_splash_uninit(void)
61 {
62 	sInfo = NULL;
63 }
64 
65 
66 void
67 boot_splash_set_stage(int stage)
68 {
69 	TRACE("boot_splash_set_stage: stage=%d\n", stage);
70 
71 	if (sInfo == NULL || stage < 0 || stage >= BOOT_SPLASH_STAGE_MAX)
72 		return;
73 
74 	int width, height, x, y;
75 	compute_splash_icons_placement(sInfo->width, sInfo->height,
76 		width, height, x, y);
77 
78 	int stageLeftEdge = width * stage / BOOT_SPLASH_STAGE_MAX;
79 	int stageRightEdge = width * (stage + 1) / BOOT_SPLASH_STAGE_MAX;
80 
81 	BlitParameters params;
82 	params.from = sUncompressedIcons;
83 	params.fromWidth = kSplashIconsWidth;
84 	params.fromLeft = stageLeftEdge;
85 	params.fromTop = 0;
86 	params.fromRight = stageRightEdge;
87 	params.fromBottom = height;
88 	params.to = (uint8*)sInfo->frame_buffer;
89 	params.toBytesPerRow = sInfo->bytes_per_row;
90 	params.toLeft = stageLeftEdge + x;
91 	params.toTop = y;
92 
93 	blit(params, sInfo->depth);
94 }
95