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