xref: /haiku/src/system/boot/platform/generic/video_splash.cpp (revision e0ef64750f3169cd634bb2f7a001e22488b05231)
1 /*
2  * Copyright 2004-2009, Axel Dörfler, axeld@pinc-software.de.
3  * Copyright 2008, Stephan Aßmus <superstippi@gmx.de>
4  * Copyright 2008, Philippe Saint-Pierre <stpere@gmail.com>
5  * Distributed under the terms of the MIT License.
6  */
7 
8 
9 #include <arch/cpu.h>
10 #include <boot/stage2.h>
11 #include <boot/platform.h>
12 #include <boot/menu.h>
13 #include <boot/kernel_args.h>
14 #include <boot/platform/generic/video.h>
15 #ifdef HAIKU_DISTRO_COMPATIBILITY_OFFICIAL
16 #include <boot/images.h>
17 #else
18 #include <boot/images-sans-tm.h>
19 #endif
20 
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24 
25 
26 //#define TRACE_VIDEO
27 #ifdef TRACE_VIDEO
28 #	define TRACE(x) dprintf x
29 #else
30 #	define TRACE(x) ;
31 #endif
32 
33 
34 extern "C" status_t
35 video_display_splash(addr_t frameBuffer)
36 {
37 	if (!gKernelArgs.frame_buffer.enabled)
38 		return B_NO_INIT;
39 
40 	// clear the video memory
41 	memset((void *)frameBuffer, 0,
42 		gKernelArgs.frame_buffer.physical_buffer.size);
43 
44 	uint8 *uncompressedLogo = NULL;
45 	switch (gKernelArgs.frame_buffer.depth) {
46 		case 8:
47 			platform_set_palette(k8BitPalette);
48 			uncompressedLogo = (uint8 *)kernel_args_malloc(kSplashLogoWidth
49 				* kSplashLogoHeight);
50 			if (uncompressedLogo == NULL)
51 				return B_NO_MEMORY;
52 			uncompress_8bit_RLE(kSplashLogo8BitCompressedImage,
53 				uncompressedLogo);
54 		break;
55 		default:
56 			uncompressedLogo = (uint8 *)kernel_args_malloc(kSplashLogoWidth
57 				* kSplashLogoHeight * 3);
58 			if (uncompressedLogo == NULL)
59 				return B_NO_MEMORY;
60 			uncompress_24bit_RLE(kSplashLogo24BitCompressedImage,
61 				uncompressedLogo);
62 		break;
63 	}
64 
65 	// TODO: support 4-bit indexed version of the images!
66 
67 	// render splash logo
68 	uint16 iconsHalfHeight = kSplashIconsHeight / 2;
69 
70 	int width = min_c(kSplashLogoWidth, gKernelArgs.frame_buffer.width);
71 	int height = min_c(kSplashLogoHeight + iconsHalfHeight,
72 		gKernelArgs.frame_buffer.height);
73 	int placementX = max_c(0, min_c(100, kSplashLogoPlacementX));
74 	int placementY = max_c(0, min_c(100, kSplashLogoPlacementY));
75 
76 	int x = (gKernelArgs.frame_buffer.width - width) * placementX / 100;
77 	int y = (gKernelArgs.frame_buffer.height - height) * placementY / 100;
78 
79 	height = min_c(kSplashLogoHeight, gKernelArgs.frame_buffer.height);
80 	switch (gKernelArgs.frame_buffer.depth) {
81 		case 8:
82 			break;
83 	}
84 	video_blit_image(frameBuffer, uncompressedLogo, width, height,
85 		kSplashLogoWidth, x, y);
86 
87 	kernel_args_free(uncompressedLogo);
88 
89 	const uint8* lowerHalfIconImage;
90 
91 	switch (gKernelArgs.frame_buffer.depth) {
92 		case 8:
93 			// pointer into the lower half of the icons image data
94 			gKernelArgs.boot_splash
95 				= (uint8 *)kernel_args_malloc(kSplashIconsWidth
96 					* kSplashIconsHeight);
97 			if (gKernelArgs.boot_splash == NULL)
98 				return B_NO_MEMORY;
99 			uncompress_8bit_RLE(kSplashIcons8BitCompressedImage,
100 				gKernelArgs.boot_splash );
101 			lowerHalfIconImage = gKernelArgs.boot_splash
102 				+ (kSplashIconsWidth * iconsHalfHeight);
103 		break;
104 		default:
105 			// pointer into the lower half of the icons image data
106 			gKernelArgs.boot_splash
107 				= (uint8 *)kernel_args_malloc(kSplashIconsWidth
108 					* kSplashIconsHeight * 3);
109 			if (gKernelArgs.boot_splash == NULL)
110 				return B_NO_MEMORY;
111 			uncompress_24bit_RLE(kSplashIcons24BitCompressedImage,
112 				gKernelArgs.boot_splash );
113 			lowerHalfIconImage = gKernelArgs.boot_splash
114 				+ (kSplashIconsWidth * iconsHalfHeight) * 3;
115 		break;
116 	}
117 
118 	// render initial (grayed out) icons
119 	// the grayed out version is the lower half of the icons image
120 
121 	width = min_c(kSplashIconsWidth, gKernelArgs.frame_buffer.width);
122 	height = min_c(kSplashLogoHeight + iconsHalfHeight,
123 		gKernelArgs.frame_buffer.height);
124 	placementX = max_c(0, min_c(100, kSplashIconsPlacementX));
125 	placementY = max_c(0, min_c(100, kSplashIconsPlacementY));
126 
127 	x = (gKernelArgs.frame_buffer.width - width) * placementX / 100;
128 	y = kSplashLogoHeight + (gKernelArgs.frame_buffer.height - height)
129 		* placementY / 100;
130 
131 	height = min_c(iconsHalfHeight, gKernelArgs.frame_buffer.height);
132 	video_blit_image(frameBuffer, lowerHalfIconImage, width, height,
133 		kSplashIconsWidth, x, y);
134 	return B_OK;
135 }
136 
137