2 * COPYRIGHT: See COPYING.ARM in the top level directory
3 * PROJECT: ReactOS UEFI Boot Library
4 * FILE: boot/environ/lib/platform/display.c
5 * PURPOSE: Boot Library Display Management Routines
6 * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org)
9 /* INCLUDES ******************************************************************/
14 /* DATA VARIABLES ************************************************************/
16 PVOID BfiCachedStrikeData
;
17 LIST_ENTRY BfiDeferredListHead
;
18 LIST_ENTRY BfiFontFileListHead
;
19 PVOID BfiGraphicsRectangle
;
21 ULONG ConsoleGraphicalResolutionListFlags
;
22 BL_DISPLAY_MODE ConsoleGraphicalResolutionList
[3] =
28 ULONG ConsoleGraphicalResolutionListSize
= RTL_NUMBER_OF(ConsoleGraphicalResolutionList
);
30 BL_DISPLAY_MODE ConsoleTextResolutionList
[1] =
35 PVOID DspRemoteInputConsole
;
37 PVOID DspGraphicalConsole
;
38 PVOID DspLocalInputConsole
;
40 /* FUNCTIONS *****************************************************************/
43 DsppGraphicsDisabledByBcd (
50 /* Get the boot option, and if present, return the result */
51 Status
= BlGetBootOptionBoolean(BlpApplicationEntry
.BcdData
,
52 BcdLibraryBoolean_GraphicsModeDisabled
,
54 return (NT_SUCCESS(Status
) && (Disabled
));
59 _In_ PWCHAR FontFileName
62 PBL_DEVICE_DESCRIPTOR FontDevice
;
64 ULONG NameLength
, DirectoryLength
, TotalLength
;
65 PWCHAR FontPath
, FontDirectory
;
66 BL_LIBRARY_PARAMETERS LibraryParameters
;
67 BOOLEAN CustomDirectory
, CustomDevice
;
69 /* Initialize locals */
70 CustomDirectory
= TRUE
;
76 /* Check if a custom font path should be used */
77 Status
= BlGetBootOptionString(BlpApplicationEntry
.BcdData
,
78 BcdLibraryString_FontPath
,
80 if (!NT_SUCCESS(Status
))
82 /* Nope, use the one configured by the library */
83 CustomDirectory
= FALSE
;
84 RtlCopyMemory(&LibraryParameters
,
85 &BlpLibraryParameters
,
86 sizeof(LibraryParameters
)),
87 FontDirectory
= LibraryParameters
.FontBaseDirectory
;
90 /* Do we still not have a font directory? */
93 /* Use the boot device and boot directory */
94 FontDevice
= BlpBootDevice
;
95 FontDirectory
= L
"\\EFI\\Microsoft\\Boot\\Fonts";
100 /* Otherwise, if we have a font directory, what device is the app on? */
101 Status
= BlGetBootOptionDevice(BlpApplicationEntry
.BcdData
,
102 BcdLibraryDevice_ApplicationDevice
,
105 if (!NT_SUCCESS(Status
))
107 /* If we don't know the device, we can't open the path */
112 /* Figure out the length of the file name, and of the directory */
113 NameLength
= wcslen(FontFileName
);
114 DirectoryLength
= wcslen(FontDirectory
);
116 /* Safely add them up*/
117 Status
= RtlULongAdd(NameLength
, DirectoryLength
, &TotalLength
);
118 if (!NT_SUCCESS(Status
))
123 /* Convert to bytes */
124 Status
= RtlULongLongToULong(TotalLength
* sizeof(WCHAR
), &TotalLength
);
125 if (!NT_SUCCESS(Status
))
130 /* Add a terminating NUL */
131 Status
= RtlULongAdd(TotalLength
, sizeof(UNICODE_NULL
), &TotalLength
);
132 if (!NT_SUCCESS(Status
))
137 /* Allocate the final buffer for it */
138 FontPath
= BlMmAllocateHeap(TotalLength
);
141 Status
= STATUS_NO_MEMORY
;
145 /* Concatenate the directory with the file name */
146 wcscpy(FontPath
, FontDirectory
);
147 wcscat(FontPath
, FontFileName
);
149 /* Try to load this font */
150 Status
= BfLoadFontFile(FontDevice
, FontPath
);
153 /* Check if we had a custom font device allocated and free it */
154 if ((CustomDevice
) && (FontDevice
))
156 BlMmFreeHeap(FontDevice
);
159 /* Check if we had a custom font directory allocated and free it */
160 if ((FontDirectory
) && (CustomDirectory
))
162 BlMmFreeHeap(FontDirectory
);
165 /* Check if we had allocated a font path and free it */
168 BlMmFreeHeap(FontPath
);
176 BlpDisplayRegisterLocale (
180 BOOLEAN StandardLocale
;
183 PBL_DEFERRED_FONT_FILE DeferredFont
;
184 PLIST_ENTRY NextEntry
;
187 /* Assume custom locale */
188 StandardLocale
= FALSE
;
190 /* Bail out if the locale string seems invalid */
191 if (wcslen(Locale
) < 2)
193 return STATUS_INVALID_PARAMETER
;
196 /* Check the prefix first, then traditional vs. simplified */
197 Prefix
[0] = Locale
[0];
198 Prefix
[1] = Locale
[1];
199 Prefix
[2] = UNICODE_NULL
;
200 if (!_wcsicmp(Prefix
, L
"ja"))
202 FontFileName
= L
"\\jpn_boot.ttf";
204 else if (!_wcsicmp(Prefix
, L
"ko"))
206 FontFileName
= L
"\\kor_boot.ttf";
208 else if (!(_wcsicmp(Locale
, L
"zh-CN")) ||
209 !(_wcsicmp(Locale
, L
"zh-CHS")) ||
210 !(_wcsicmp(Locale
, L
"zh-Hans")))
212 FontFileName
= L
"\\chs_boot.ttf";
214 else if (!(_wcsicmp(Locale
, L
"zh-TW")) &&
215 !(_wcsicmp(Locale
, L
"zh-CHT")) &&
216 !(_wcsicmp(Locale
, L
"zh-HK")) &&
217 !(_wcsicmp(Locale
, L
"zh-Hant")))
219 FontFileName
= L
"\\cht_boot.ttf";
223 StandardLocale
= TRUE
;
224 FontFileName
= L
"\\wgl4_boot.ttf";
227 /* Parse all the currently deferred fonts*/
228 NextEntry
= BfiDeferredListHead
.Flink
;
229 while (NextEntry
!= &BfiDeferredListHead
)
232 DeferredFont
= CONTAINING_RECORD(NextEntry
, BL_DEFERRED_FONT_FILE
, ListEntry
);
234 /* Move to the next entry, and remove this one */
235 NextEntry
= NextEntry
->Flink
;
236 RemoveEntryList(&DeferredFont
->ListEntry
);
238 /* Free the deferred font, we'll be loading a new one */
239 BfiFreeDeferredFontFile(DeferredFont
);
242 /* Load the primary font */
243 Status
= DsppLoadFontFile(FontFileName
);
244 if (NT_SUCCESS(Status
) && !(StandardLocale
))
246 /* Also load the standard US one if we loaded a different one */
247 Status
= DsppLoadFontFile(L
"\\wgl4_boot.ttf");
250 /* Return back to caller */
259 BL_LIBRARY_PARAMETERS LibraryParameters
= BlpLibraryParameters
;
260 BOOLEAN NoGraphics
, HighestMode
;
262 PBL_DISPLAY_MODE DisplayMode
;
263 ULONGLONG GraphicsResolution
;
264 PBL_GRAPHICS_CONSOLE GraphicsConsole
;
265 PBL_TEXT_CONSOLE TextConsole
, RemoteConsole
;
267 /* Initialize font data */
268 BfiCachedStrikeData
= 0;
269 InitializeListHead(&BfiDeferredListHead
);
270 InitializeListHead(&BfiFontFileListHead
);
272 /* Allocate the font rectangle */
273 BfiGraphicsRectangle
= BlMmAllocateHeap(90);
274 if (!BfiGraphicsRectangle
)
276 return STATUS_NO_MEMORY
;
279 /* Check if display re-initialization is requested */
280 if (LibraryParameters
.LibraryFlags
& BL_LIBRARY_FLAG_REINITIALIZE_ALL
)
282 /* Recreate a local input console */
283 ConsoleCreateLocalInputConsole();
286 /* Check if no graphics console is needed */
287 if ((Flags
& BL_LIBRARY_FLAG_NO_GRAPHICS_CONSOLE
) ||
288 (DsppGraphicsDisabledByBcd()))
295 /* No graphics -- remember this */
299 /* On first load, we always initialize a graphics display */
300 GraphicsConsole
= NULL
;
301 if (!(Flags
& BL_LIBRARY_FLAG_REINITIALIZE_ALL
) || !(NoGraphics
))
303 /* Default to mode 0 (1024x768) */
304 DisplayMode
= &ConsoleGraphicalResolutionList
[0];
306 /* Check what resolution to use*/
307 Status
= BlGetBootOptionInteger(BlpApplicationEntry
.BcdData
,
308 BcdLibraryInteger_GraphicsResolution
,
309 &GraphicsResolution
);
310 if (NT_SUCCESS(Status
))
312 ConsoleGraphicalResolutionListFlags
|= BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG
;
313 EfiPrintf(L
"Display selection not yet handled\r\n");
314 return STATUS_NOT_IMPLEMENTED
;
317 /* Check if the highest mode should be forced */
318 Status
= BlGetBootOptionBoolean(BlpApplicationEntry
.BcdData
,
319 BcdLibraryBoolean_GraphicsForceHighestMode
,
321 if (NT_SUCCESS(Status
))
323 ConsoleGraphicalResolutionListFlags
|= BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG
;
324 EfiPrintf(L
"High res mode not yet handled\r\n");
325 return STATUS_NOT_IMPLEMENTED
;
328 /* Do we need graphics mode after all? */
331 /* Yep -- go allocate it */
332 GraphicsConsole
= BlMmAllocateHeap(sizeof(*GraphicsConsole
));
336 Status
= ConsoleGraphicalConstruct(GraphicsConsole
);
337 if (!NT_SUCCESS(Status
))
339 EfiPrintf(L
"GFX FAILED: %lx\r\n", Status
);
340 BlMmFreeHeap(GraphicsConsole
);
341 GraphicsConsole
= NULL
;
346 /* Are we using something else than the default mode? */
347 if (DisplayMode
!= &ConsoleGraphicalResolutionList
[0])
349 EfiPrintf(L
"Display path not handled\r\n");
350 return STATUS_NOT_SUPPORTED
;
353 /* Mask out all the flags now */
354 ConsoleGraphicalResolutionListFlags
&= ~(BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG
|
355 BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG
);
358 /* Do we have a graphics console? */
360 if (!GraphicsConsole
)
362 /* Nope -- go allocate a text console */
363 TextConsole
= BlMmAllocateHeap(sizeof(*TextConsole
));
367 Status
= ConsoleTextLocalConstruct(TextConsole
, TRUE
);
368 if (!NT_SUCCESS(Status
))
370 BlMmFreeHeap(TextConsole
);
376 /* Initialize all globals to NULL */
377 DspRemoteInputConsole
= NULL
;
378 DspTextConsole
= NULL
;
379 DspGraphicalConsole
= NULL
;
381 /* If we don't have a text console, go get a remote console */
382 RemoteConsole
= NULL
;
385 ConsoleCreateRemoteConsole(&RemoteConsole
);
388 /* Do we have a remote console? */
391 /* Nope -- what about a graphical one? */
394 /* Yes, use it for both graphics and text */
395 DspGraphicalConsole
= GraphicsConsole
;
396 DspTextConsole
= GraphicsConsole
;
398 else if (TextConsole
)
400 /* Nope, but we have a text console */
401 DspTextConsole
= TextConsole
;
404 /* Console has been setup */
405 return STATUS_SUCCESS
;
408 /* We have a remote console -- have to figure out how to use it*/
409 EfiPrintf(L
"Display path not handled\r\n");
410 return STATUS_NOT_SUPPORTED
;
418 PBL_TEXT_CONSOLE TextConsole
;
419 PBL_GRAPHICS_CONSOLE GraphicsConsole
;
421 ULONGLONG GraphicsResolution
;
423 BL_DISPLAY_MODE CurrentResolution
;
425 /* Do we have local input yet? */
426 if (!DspLocalInputConsole
)
429 ConsoleCreateLocalInputConsole();
432 /* If a graphics console is present without a remote console... */
434 if (!(DspRemoteInputConsole
) && (DspGraphicalConsole
))
436 /* Try to create a remote console */
437 ConsoleCreateRemoteConsole(&TextConsole
);
440 /* All good for now */
441 Status
= STATUS_SUCCESS
;
443 /* Now check if we were able to create the remote console */
446 EfiPrintf(L
"EMS not supported\r\n");
447 return STATUS_NOT_IMPLEMENTED
;
450 /* Set a local for the right cast */
451 GraphicsConsole
= DspGraphicalConsole
;
453 /* Nothing to do without a graphics console being reinitialized */
454 if (!(Flags
& BL_LIBRARY_FLAG_REINITIALIZE_ALL
) ||
455 !(GraphicsConsole
) ||
456 !(((PBL_GRAPHICS_CONSOLE_VTABLE
)GraphicsConsole
->TextConsole
.Callbacks
)->IsEnabled(GraphicsConsole
)))
461 /* Check if graphics are disabled in the BCD */
462 if (DsppGraphicsDisabledByBcd())
464 /* Turn off the graphics console, switching back to text mode */
465 Status
= ((PBL_GRAPHICS_CONSOLE_VTABLE
)GraphicsConsole
->TextConsole
.Callbacks
)->Enable(GraphicsConsole
, FALSE
);
468 /* Check if a custom graphics resolution is set */
469 if (MiscGetBootOption(BlpApplicationEntry
.BcdData
,
470 BcdLibraryInteger_GraphicsResolution
))
472 /* Check what it's set to */
473 Status
= BlGetBootOptionInteger(BlpApplicationEntry
.BcdData
,
474 BcdLibraryInteger_GraphicsResolution
,
475 &GraphicsResolution
);
476 if (!NT_SUCCESS(Status
))
481 /* Now check our current graphical resolution */
482 Status
= ((PBL_GRAPHICS_CONSOLE_VTABLE
)GraphicsConsole
->TextConsole
.Callbacks
)->GetGraphicalResolution(GraphicsConsole
,
484 if (!NT_SUCCESS(Status
))
489 /* Remember that we're forcing a video mode */
490 ConsoleGraphicalResolutionListFlags
|= BL_DISPLAY_GRAPHICS_FORCED_VIDEO_MODE_FLAG
;
492 /* Check which resolution to set */
493 if (!GraphicsResolution
)
496 EfiPrintf(L
"Display selection not yet handled\r\n");
497 return STATUS_NOT_IMPLEMENTED
;
499 else if (GraphicsResolution
== 1)
502 EfiPrintf(L
"Display selection not yet handled\r\n");
503 return STATUS_NOT_IMPLEMENTED
;
505 else if (GraphicsResolution
== 2)
508 EfiPrintf(L
"Display selection not yet handled\r\n");
509 return STATUS_NOT_IMPLEMENTED
;
513 /* Check if the force highest mode setting is present */
514 if (MiscGetBootOption(BlpApplicationEntry
.BcdData
,
515 BcdLibraryBoolean_GraphicsForceHighestMode
))
517 /* Check what it's set to */
518 Status
= BlGetBootOptionBoolean(BlpApplicationEntry
.BcdData
,
519 BcdLibraryBoolean_GraphicsForceHighestMode
,
521 if ((NT_SUCCESS(Status
)) && (HighestMode
))
523 /* Remember that high rest mode is being forced */
524 ConsoleGraphicalResolutionListFlags
|= BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG
;
527 //((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->SetGraphicalResolution(GraphicsConsole, 0, 0);
530 ConsoleGraphicalResolutionListFlags
|= ~BL_DISPLAY_GRAPHICS_FORCED_HIGH_RES_MODE_FLAG
;
531 EfiPrintf(L
"High res mode not yet handled\r\n");
532 Status
= STATUS_NOT_IMPLEMENTED
;
536 /* Return back to the caller */
541 BlpDisplayReinitialize (
545 NTSTATUS Status
= STATUS_SUCCESS
;
546 PBL_TEXT_CONSOLE TextConsole
;
547 PBL_INPUT_CONSOLE InputConsole
;
549 /* Do we have a local console? */
550 InputConsole
= DspLocalInputConsole
;
553 /* Reinitialize it */
554 Status
= InputConsole
->Callbacks
->Reinitialize((PBL_TEXT_CONSOLE
)InputConsole
);
555 if (!NT_SUCCESS(Status
))
561 /* Do we have a text console? */
562 TextConsole
= DspTextConsole
;
565 /* Reinitialize it */
566 Status
= TextConsole
->Callbacks
->Reinitialize(TextConsole
);
574 BlpDisplayInitialize (
580 /* Are we resetting or initializing? */
581 if (Flags
& BL_LIBRARY_FLAG_REINITIALIZE
)
583 /* This is a reset */
584 Status
= DsppReinitialize(Flags
);
585 if (NT_SUCCESS(Status
))
587 /* Re-initialize the class as well */
588 Status
= BlpDisplayReinitialize();
593 /* Initialize the display */
594 Status
= DsppInitialize(Flags
);
597 /* Return display initialization state */
602 BlDisplayGetTextCellResolution (
603 _Out_ PULONG TextWidth
,
604 _Out_ PULONG TextHeight
608 PBL_GRAPHICS_CONSOLE GraphicsConsole
;
610 /* If the caller doesn't want anything, bail out */
611 if (!(TextWidth
) || !(TextHeight
))
616 /* Do we have a text console? */
617 Status
= STATUS_UNSUCCESSFUL
;
620 /* Do we have a graphics console? */
621 GraphicsConsole
= DspGraphicalConsole
;
624 /* Is it currently active? */
625 if (((PBL_GRAPHICS_CONSOLE_VTABLE
)GraphicsConsole
->TextConsole
.Callbacks
)->IsEnabled(GraphicsConsole
))
627 /* Yep -- query it */
628 EfiPrintf(L
"GFX active, not supported query\r\n");
629 Status
= STATUS_NOT_IMPLEMENTED
;
630 //Status = ((PBL_GRAPHICS_CONSOLE_VTABLE)GraphicsConsole->TextConsole.Callbacks)->GetTextCellResolution(GraphicsConsole);
635 /* Check if we failed to get it from the graphics console */
636 if (!NT_SUCCESS(Status
))
638 /* Set default text size */
645 BlDisplaySetScreenResolution (
649 PBL_GRAPHICS_CONSOLE Console
;
653 Status
= STATUS_SUCCESS
;
655 /* Do we have a graphics console? */
656 Console
= DspGraphicalConsole
;
659 /* Is it currently active? */
660 if (((PBL_GRAPHICS_CONSOLE_VTABLE
)Console
->TextConsole
.Callbacks
)->IsEnabled(Console
))
662 /* If so, disable it */
663 return ((PBL_GRAPHICS_CONSOLE_VTABLE
)Console
->TextConsole
.Callbacks
)->Enable(Console
, FALSE
);
667 /* We should've now fallen back to text mode */
670 /* Then fail, as no display appears active */
671 Status
= STATUS_UNSUCCESSFUL
;
674 /* Return back to the caller */
679 BlDisplayGetScreenResolution (
685 BL_DISPLAY_MODE Resolution
;
686 PBL_GRAPHICS_CONSOLE GraphicsConsole
;
688 /* Assume failure if no consoles are active */
689 Status
= STATUS_UNSUCCESSFUL
;
691 /* Do we have a text console? */
694 /* Do we have an active graphics console? */
695 GraphicsConsole
= DspGraphicalConsole
;
696 if ((GraphicsConsole
) &&
697 (((PBL_GRAPHICS_CONSOLE_VTABLE
)GraphicsConsole
->TextConsole
.Callbacks
)->IsEnabled(GraphicsConsole
)))
699 /* Get the resolution */
700 Status
= ((PBL_GRAPHICS_CONSOLE_VTABLE
)GraphicsConsole
->TextConsole
.Callbacks
)->GetGraphicalResolution(GraphicsConsole
, &Resolution
);
701 if (NT_SUCCESS(Status
))
703 /* Return it back to the caller */
704 *HRes
= Resolution
.HRes
;
705 *VRes
= Resolution
.VRes
;
710 /* Return defaults */
713 Status
= STATUS_SUCCESS
;
717 /* Return if we got a valid resolution back */
722 BlDisplayInvalidateOemBitmap (
726 PBGRT_TABLE BgrtTable
;
729 /* Search for the BGRT */
730 Status
= BlUtlGetAcpiTable((PVOID
*)&BgrtTable
, BGRT_SIGNATURE
);
731 if (NT_SUCCESS(Status
))
733 /* Mark the bitmap as invalid */
734 BgrtTable
->Status
&= ~BGRT_STATUS_IMAGE_VALID
;
736 /* Unmap the table */
737 BlMmUnmapVirtualAddressEx(BgrtTable
, BgrtTable
->Header
.Length
);
742 BlDisplayGetOemBitmap (
743 _In_opt_ PCOORD Offsets
,
744 _Out_opt_ PULONG Flags
749 PHYSICAL_ADDRESS PhysicalAddress
;
750 PBGRT_TABLE BgrtTable
;
757 /* Search for the BGRT */
758 Status
= BlUtlGetAcpiTable((PVOID
*)&BgrtTable
, BGRT_SIGNATURE
);
759 if (!NT_SUCCESS(Status
))
764 /* Make sure this is really a BGRT */
765 if (BgrtTable
->Header
.Signature
!= BGRT_SIGNATURE
)
767 Status
= STATUS_ACPI_INVALID_TABLE
;
771 /* Make sure the BGRT table length is valid */
772 if (BgrtTable
->Header
.Length
!= sizeof(*BgrtTable
))
774 Status
= STATUS_ACPI_INVALID_TABLE
;
778 /* Make sure its a bitmap */
779 if (BgrtTable
->ImageType
!= BgrtImageTypeBitmap
)
781 Status
= STATUS_ACPI_INVALID_TABLE
;
785 /* Make sure it's somewhere in RAM */
786 if (!BgrtTable
->LogoAddress
)
788 Status
= STATUS_ACPI_INVALID_TABLE
;
792 /* Map the bitmap header only for now */
793 PhysicalAddress
.QuadPart
= BgrtTable
->LogoAddress
;
794 Status
= BlMmMapPhysicalAddressEx((PVOID
*)&Header
,
798 if (!NT_SUCCESS(Status
))
803 /* Capture the real size of the header */
806 /* Unmap the bitmap header */
807 BlMmUnmapVirtualAddressEx(BgrtTable
, sizeof(BMP_HEADER
));
809 /* If the real size is smaller than at least a V3 bitmap, bail out */
810 if (Size
< sizeof(BITMAP
))
812 Status
= STATUS_ACPI_INVALID_TABLE
;
816 /* Map the real size of the header */
817 Status
= BlMmMapPhysicalAddressEx((PVOID
*)&Bitmap
,
821 if (!NT_SUCCESS(Status
))
826 /* Make sure this is a non-compressed 24-bit or 32-bit V3 bitmap */
827 if ((Bitmap
->BmpHeader
.Signature
!= 'MB') ||
828 (Bitmap
->DibHeader
.Compression
) ||
829 ((Bitmap
->DibHeader
.BitCount
!= 24) &&
830 (Bitmap
->DibHeader
.BitCount
!= 32)) ||
831 (Bitmap
->DibHeader
.Size
!= sizeof(DIB_HEADER
)))
833 Status
= STATUS_ACPI_INVALID_TABLE
;
837 /* Check if caller wants the offsets back */
841 Offsets
->X
= BgrtTable
->OffsetX
;
842 Offsets
->Y
= BgrtTable
->OffsetY
;
845 /* Check if the caller wants flags */
848 /* Return if the image is valid */
849 *Flags
= BgrtTable
->Status
& BGRT_STATUS_IMAGE_VALID
;
853 /* Check if we had mapped the BGRT */
857 BlMmUnmapVirtualAddressEx(BgrtTable
, BgrtTable
->Header
.Length
);
860 /* Check if this is the failure path */
861 if (!NT_SUCCESS(Status
))
863 /* Did we have the OEM bitmap mapped? */
867 BlMmUnmapVirtualAddressEx(Bitmap
, Bitmap
->BmpHeader
.Size
);
870 /* No bitmap to return */
874 /* Return the bitmap back, if any */
879 BlDisplayValidOemBitmap (
884 ULONG HRes
, VRes
, Height
, Width
, Flags
;
889 /* First check if mobile graphics are enabled */
890 Status
= BlGetBootOptionBoolean(BlpApplicationEntry
.BcdData
,
891 BcdLibraryBoolean_MobileGraphics
,
893 if ((NT_SUCCESS(Status
)) && (Result
))
895 /* Yes, so use the firmware image */
899 /* Nope, so we'll check the ACPI OEM bitmap */
901 Bitmap
= BlDisplayGetOemBitmap(&Offsets
, &Flags
);
907 if (Flags
& BGRT_STATUS_IMAGE_VALID
)
909 /* Get the current screen resolution */
910 Status
= BlDisplayGetScreenResolution(&HRes
, &VRes
);
911 if (NT_SUCCESS(Status
))
913 /* Is there a valid width? */
914 Width
= Bitmap
->DibHeader
.Width
;
917 /* Is there a valid height? */
918 Height
= Bitmap
->DibHeader
.Height
;
921 /* Will if fit on this screen? */
922 if (((Width
+ Offsets
.X
) <= HRes
) &&
923 ((Height
+ Offsets
.Y
) <= VRes
))
925 /* Then it's all good! */
933 /* Unmap the bitmap for now, it will be drawn later */
934 BlMmUnmapVirtualAddressEx(Bitmap
, Bitmap
->BmpHeader
.Size
);
937 /* Return that a valid OEM bitmap exists */
942 BlDisplayClearScreen (
947 PBL_TEXT_CONSOLE TextConsole
;
949 /* Nothing to do if there's no text console */
950 Status
= STATUS_SUCCESS
;
951 TextConsole
= DspTextConsole
;
954 /* Otherwise, clear the whole screen */
955 Status
= TextConsole
->Callbacks
->ClearText(TextConsole
, FALSE
);
956 if (NT_SUCCESS(Status
))
958 /* Invalidate the OEM bitmap at this point */
959 BlDisplayInvalidateOemBitmap();
968 BlDisplaySetCursorType (
973 PBL_TEXT_CONSOLE TextConsole
;
974 BL_DISPLAY_STATE State
;
976 /* Nothing to do if there's no text console */
977 Status
= STATUS_SUCCESS
;
978 TextConsole
= DspTextConsole
;
981 /* Write visibility state and call the function to change it */
982 State
.CursorVisible
= Type
;
983 Status
= TextConsole
->Callbacks
->SetTextState(TextConsole
, 8, &State
);