]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Foundation/Library/Dxe/Graphics/Graphics.c
Maintainers.txt: Remove EdkCompatibilityPkg information
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Dxe / Graphics / Graphics.c
CommitLineData
3eb9473e 1/*++\r
2\r
a46c3657 3Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>\r
4ea9375a 4This program and the accompanying materials \r
3eb9473e 5are licensed and made available under the terms and conditions of the BSD License \r
6which accompanies this distribution. The full text of the license may be found at \r
7http://opensource.org/licenses/bsd-license.php \r
8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
11\r
12Module Name:\r
13\r
14 Graphics.c\r
15\r
16Abstract:\r
17\r
18 Support for Basic Graphics operations.\r
19\r
20 BugBug: Currently *.BMP files are supported. This will be replaced\r
21 when Tiano graphics format is supported.\r
22\r
23--*/\r
24\r
25#include "Tiano.h"\r
26#include "EfiDriverLib.h"\r
27#include "GraphicsLib.h"\r
28\r
29EFI_STATUS\r
30GetGraphicsBitMapFromFV (\r
31 IN EFI_GUID *FileNameGuid,\r
32 OUT VOID **Image,\r
33 OUT UINTN *ImageSize\r
34 )\r
35/*++\r
36\r
37Routine Description:\r
38\r
39 Return the graphics image file named FileNameGuid into Image and return it's\r
40 size in ImageSize. All Firmware Volumes (FV) in the system are searched for the\r
41 file name.\r
42\r
43Arguments:\r
44\r
45 FileNameGuid - File Name of graphics file in the FV(s).\r
46\r
47 Image - Pointer to pointer to return graphics image. If NULL, a \r
48 buffer will be allocated.\r
49\r
50 ImageSize - Size of the graphics Image in bytes. Zero if no image found.\r
51\r
52\r
53Returns: \r
54\r
55 EFI_SUCCESS - Image and ImageSize are valid. \r
56 EFI_BUFFER_TOO_SMALL - Image not big enough. ImageSize has required size\r
57 EFI_NOT_FOUND - FileNameGuid not found\r
58\r
59--*/\r
60{\r
61 return GetGraphicsBitMapFromFVEx (NULL, FileNameGuid, Image, ImageSize);\r
62}\r
63\r
64EFI_STATUS\r
65GetGraphicsBitMapFromFVEx (\r
66 IN EFI_HANDLE ImageHandle,\r
67 IN EFI_GUID *FileNameGuid,\r
68 OUT VOID **Image,\r
69 OUT UINTN *ImageSize\r
70 )\r
71/*++\r
72\r
73Routine Description:\r
74\r
75 Return the graphics image file named FileNameGuid into Image and return it's\r
76 size in ImageSize. All Firmware Volumes (FV) in the system are searched for the\r
77 file name.\r
78\r
79Arguments:\r
80\r
81 ImageHandle - The driver image handle of the caller. The parameter is used to\r
82 optimize the loading of the image file so that the FV from which\r
83 the driver image is loaded will be tried first. \r
84\r
85 FileNameGuid - File Name of graphics file in the FV(s).\r
86\r
87 Image - Pointer to pointer to return graphics image. If NULL, a \r
88 buffer will be allocated.\r
89\r
90 ImageSize - Size of the graphics Image in bytes. Zero if no image found.\r
91\r
92\r
93Returns: \r
94\r
95 EFI_SUCCESS - Image and ImageSize are valid. \r
96 EFI_BUFFER_TOO_SMALL - Image not big enough. ImageSize has required size\r
97 EFI_NOT_FOUND - FileNameGuid not found\r
98\r
99--*/\r
100{\r
101 return GetImageEx (\r
102 ImageHandle,\r
c7f33ca4 103 FileNameGuid,\r
3eb9473e 104 EFI_SECTION_RAW,\r
105 Image,\r
106 ImageSize,\r
107 FALSE\r
108 );\r
109}\r
110\r
111\r
112EFI_STATUS\r
113ConvertBmpToGopBlt (\r
114 IN VOID *BmpImage,\r
115 IN UINTN BmpImageSize,\r
116 IN OUT VOID **GopBlt,\r
117 IN OUT UINTN *GopBltSize,\r
118 OUT UINTN *PixelHeight,\r
119 OUT UINTN *PixelWidth\r
120 )\r
121/*++\r
122\r
123Routine Description:\r
124\r
125 Convert a *.BMP graphics image to a GOP/UGA blt buffer. If a NULL Blt buffer\r
126 is passed in a GopBlt buffer will be allocated by this routine. If a GopBlt\r
127 buffer is passed in it will be used if it is big enough.\r
128\r
129Arguments:\r
130\r
131 BmpImage - Pointer to BMP file\r
132\r
133 BmpImageSize - Number of bytes in BmpImage\r
134\r
135 GopBlt - Buffer containing GOP version of BmpImage.\r
136\r
137 GopBltSize - Size of GopBlt in bytes.\r
138\r
139 PixelHeight - Height of GopBlt/BmpImage in pixels\r
140\r
141 PixelWidth - Width of GopBlt/BmpImage in pixels\r
142\r
143\r
144Returns: \r
145\r
146 EFI_SUCCESS - GopBlt and GopBltSize are returned. \r
147 EFI_UNSUPPORTED - BmpImage is not a valid *.BMP image\r
148 EFI_BUFFER_TOO_SMALL - The passed in GopBlt buffer is not big enough.\r
149 GopBltSize will contain the required size.\r
150 EFI_OUT_OF_RESOURCES - No enough buffer to allocate\r
151\r
152--*/\r
153{\r
154 UINT8 *Image;\r
155 UINT8 *ImageHeader;\r
156 BMP_IMAGE_HEADER *BmpHeader;\r
157 BMP_COLOR_MAP *BmpColorMap;\r
158 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer;\r
159 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;\r
99f67594 160 UINT64 BltBufferSize;\r
3eb9473e 161 UINTN Index;\r
162 UINTN Height;\r
163 UINTN Width;\r
164 UINTN ImageIndex;\r
a46c3657 165 UINTN DataSizePerLine;\r
3eb9473e 166 BOOLEAN IsAllocated;\r
a46c3657
ED
167 UINT32 ColorMapNum;\r
168\r
169 if (sizeof (BMP_IMAGE_HEADER) > BmpImageSize) {\r
170 return EFI_INVALID_PARAMETER;\r
171 }\r
3eb9473e 172\r
173 BmpHeader = (BMP_IMAGE_HEADER *) BmpImage;\r
a46c3657 174\r
3eb9473e 175 if (BmpHeader->CharB != 'B' || BmpHeader->CharM != 'M') {\r
176 return EFI_UNSUPPORTED;\r
177 }\r
178\r
a46c3657
ED
179 //\r
180 // Doesn't support compress.\r
181 //\r
3eb9473e 182 if (BmpHeader->CompressionType != 0) {\r
183 return EFI_UNSUPPORTED;\r
184 }\r
185\r
a46c3657
ED
186 //\r
187 // Only support BITMAPINFOHEADER format.\r
188 // BITMAPFILEHEADER + BITMAPINFOHEADER = BMP_IMAGE_HEADER\r
189 //\r
190 if (BmpHeader->HeaderSize != sizeof (BMP_IMAGE_HEADER) - ((UINTN) &(((BMP_IMAGE_HEADER *)0)->HeaderSize))) {\r
191 return EFI_UNSUPPORTED;\r
192 }\r
193\r
194 //\r
195 // The data size in each line must be 4 byte alignment.\r
196 //\r
197 DataSizePerLine = ((BmpHeader->PixelWidth * BmpHeader->BitPerPixel + 31) >> 3) & (~0x3);\r
198 BltBufferSize = MultU64x32 (DataSizePerLine, BmpHeader->PixelHeight);\r
199 if (BltBufferSize > (UINT32) ~0) {\r
200 return EFI_INVALID_PARAMETER;\r
201 }\r
202\r
203 if ((BmpHeader->Size != BmpImageSize) || \r
204 (BmpHeader->Size < BmpHeader->ImageOffset) ||\r
205 (BmpHeader->Size - BmpHeader->ImageOffset != BmpHeader->PixelHeight * DataSizePerLine)) {\r
206 return EFI_INVALID_PARAMETER;\r
207 }\r
208\r
3eb9473e 209 //\r
210 // Calculate Color Map offset in the image.\r
211 //\r
212 Image = BmpImage;\r
213 BmpColorMap = (BMP_COLOR_MAP *) (Image + sizeof (BMP_IMAGE_HEADER));\r
a46c3657
ED
214 if (BmpHeader->ImageOffset < sizeof (BMP_IMAGE_HEADER)) {\r
215 return EFI_INVALID_PARAMETER;\r
216 }\r
217\r
218 if (BmpHeader->ImageOffset > sizeof (BMP_IMAGE_HEADER)) {\r
219 switch (BmpHeader->BitPerPixel) {\r
220 case 1:\r
221 ColorMapNum = 2;\r
222 break;\r
223 case 4:\r
224 ColorMapNum = 16;\r
225 break;\r
226 case 8:\r
227 ColorMapNum = 256;\r
228 break;\r
229 default:\r
230 ColorMapNum = 0;\r
231 break;\r
232 }\r
233 if (BmpHeader->ImageOffset - sizeof (BMP_IMAGE_HEADER) != sizeof (BMP_COLOR_MAP) * ColorMapNum) {\r
234 return EFI_INVALID_PARAMETER;\r
235 }\r
236 }\r
3eb9473e 237\r
238 //\r
239 // Calculate graphics image data address in the image\r
240 //\r
241 Image = ((UINT8 *) BmpImage) + BmpHeader->ImageOffset;\r
242 ImageHeader = Image;\r
243\r
99f67594 244 BltBufferSize = MultU64x32 ((UINT64) BmpHeader->PixelWidth, BmpHeader->PixelHeight);\r
245 //\r
246 // Ensure the BltBufferSize * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) doesn't overflow\r
247 //\r
248 if (BltBufferSize > DivU64x32 ((UINTN) ~0, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL), NULL)) {\r
249 return EFI_UNSUPPORTED;\r
250 }\r
251 BltBufferSize = MultU64x32 (BltBufferSize, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
252\r
3eb9473e 253 IsAllocated = FALSE;\r
254 if (*GopBlt == NULL) {\r
99f67594 255 *GopBltSize = (UINTN) BltBufferSize;\r
3eb9473e 256 *GopBlt = EfiLibAllocatePool (*GopBltSize);\r
257 IsAllocated = TRUE;\r
258 if (*GopBlt == NULL) {\r
259 return EFI_OUT_OF_RESOURCES;\r
260 }\r
261 } else {\r
99f67594 262 if (*GopBltSize < (UINTN) BltBufferSize) {\r
263 *GopBltSize = (UINTN) BltBufferSize;\r
3eb9473e 264 return EFI_BUFFER_TOO_SMALL;\r
265 }\r
266 }\r
267\r
268 *PixelWidth = BmpHeader->PixelWidth;\r
269 *PixelHeight = BmpHeader->PixelHeight;\r
270\r
271 //\r
272 // Convert image from BMP to Blt buffer format\r
273 //\r
274 BltBuffer = *GopBlt;\r
275 for (Height = 0; Height < BmpHeader->PixelHeight; Height++) {\r
276 Blt = &BltBuffer[(BmpHeader->PixelHeight - Height - 1) * BmpHeader->PixelWidth];\r
277 for (Width = 0; Width < BmpHeader->PixelWidth; Width++, Image++, Blt++) {\r
278 switch (BmpHeader->BitPerPixel) {\r
279 case 1:\r
280 //\r
281 // Convert 1bit BMP to 24-bit color\r
282 //\r
283 for (Index = 0; Index < 8 && Width < BmpHeader->PixelWidth; Index++) {\r
284 Blt->Red = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Red;\r
285 Blt->Green = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Green;\r
286 Blt->Blue = BmpColorMap[((*Image) >> (7 - Index)) & 0x1].Blue;\r
287 Blt++;\r
288 Width++;\r
289 }\r
290\r
291 Blt --;\r
292 Width --;\r
293 break;\r
294\r
295 case 4:\r
296 //\r
297 // Convert BMP Palette to 24-bit color\r
298 //\r
299 Index = (*Image) >> 4;\r
300 Blt->Red = BmpColorMap[Index].Red;\r
301 Blt->Green = BmpColorMap[Index].Green;\r
302 Blt->Blue = BmpColorMap[Index].Blue;\r
303 if (Width < (BmpHeader->PixelWidth - 1)) {\r
304 Blt++;\r
305 Width++;\r
306 Index = (*Image) & 0x0f;\r
307 Blt->Red = BmpColorMap[Index].Red;\r
308 Blt->Green = BmpColorMap[Index].Green;\r
309 Blt->Blue = BmpColorMap[Index].Blue;\r
310 }\r
311 break;\r
312\r
313 case 8:\r
314 //\r
315 // Convert BMP Palette to 24-bit color\r
316 //\r
317 Blt->Red = BmpColorMap[*Image].Red;\r
318 Blt->Green = BmpColorMap[*Image].Green;\r
319 Blt->Blue = BmpColorMap[*Image].Blue;\r
320 break;\r
321\r
322 case 24:\r
323 Blt->Blue = *Image++;\r
324 Blt->Green = *Image++;\r
325 Blt->Red = *Image;\r
326 break;\r
327\r
328 default:\r
329 if (IsAllocated) {\r
330 gBS->FreePool (*GopBlt);\r
331 *GopBlt = NULL;\r
332 }\r
333 return EFI_UNSUPPORTED;\r
334 break;\r
335 };\r
336\r
337 }\r
338\r
339 ImageIndex = (UINTN) (Image - ImageHeader);\r
340 if ((ImageIndex % 4) != 0) {\r
341 //\r
342 // Bmp Image starts each row on a 32-bit boundary!\r
343 //\r
344 Image = Image + (4 - (ImageIndex % 4));\r
345 }\r
346 }\r
347\r
348 return EFI_SUCCESS;\r
349}\r
350\r
351\r
352EFI_STATUS\r
353LockKeyboards (\r
354 IN CHAR16 *Password\r
355 )\r
356/*++\r
357\r
358Routine Description:\r
359 Use Console Control Protocol to lock the Console In Spliter virtual handle. \r
360 This is the ConInHandle and ConIn handle in the EFI system table. All key\r
361 presses will be ignored until the Password is typed in. The only way to\r
362 disable the password is to type it in to a ConIn device.\r
363\r
364Arguments:\r
365 Password - Password used to lock ConIn device\r
366\r
367\r
368Returns: \r
369\r
370 EFI_SUCCESS - ConsoleControl has been flipped to graphics and logo\r
371 displayed.\r
372 EFI_UNSUPPORTED - Logo not found\r
373\r
374--*/\r
375{\r
376 EFI_STATUS Status;\r
377 EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;\r
378\r
379 Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, (VOID**)&ConsoleControl);\r
380 if (EFI_ERROR (Status)) {\r
381 return EFI_UNSUPPORTED;\r
382 }\r
383\r
384 Status = ConsoleControl->LockStdIn (ConsoleControl, Password);\r
385 return Status;\r
386}\r
387\r
388EFI_STATUS\r
389EnableQuietBoot (\r
390 IN EFI_GUID *LogoFile\r
391 )\r
392/*++\r
393\r
394Routine Description:\r
395\r
396 Use Console Control to turn off UGA based Simple Text Out consoles from going\r
397 to the UGA device. Put up LogoFile on every UGA device that is a console\r
398\r
399Arguments:\r
400\r
401 LogoFile - File name of logo to display on the center of the screen.\r
402\r
403\r
404Returns: \r
405\r
406 EFI_SUCCESS - ConsoleControl has been flipped to graphics and logo\r
407 displayed.\r
408 EFI_UNSUPPORTED - Logo not found\r
409\r
410--*/\r
411{\r
412 return EnableQuietBootEx (LogoFile, NULL);\r
413}\r
414\r
415EFI_STATUS\r
416EnableQuietBootEx (\r
417 IN EFI_GUID *LogoFile,\r
418 IN EFI_HANDLE ImageHandle\r
419 )\r
420/*++\r
421\r
422Routine Description:\r
423\r
424 Use Console Control to turn off GOP/UGA based Simple Text Out consoles from going\r
425 to the GOP/UGA device. Put up LogoFile on every GOP/UGA device that is a console\r
426\r
427Arguments:\r
428\r
429 LogoFile - File name of logo to display on the center of the screen.\r
430 ImageHandle - The driver image handle of the caller. The parameter is used to\r
431 optimize the loading of the logo file so that the FV from which\r
432 the driver image is loaded will be tried first.\r
433\r
434\r
435Returns: \r
436\r
437 EFI_SUCCESS - ConsoleControl has been flipped to graphics and logo\r
438 displayed.\r
439 EFI_UNSUPPORTED - Logo not found\r
440\r
441--*/\r
442{\r
443 EFI_STATUS Status;\r
444 EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;\r
445 EFI_OEM_BADGING_PROTOCOL *Badging;\r
446 UINT32 SizeOfX;\r
447 UINT32 SizeOfY;\r
448 INTN DestX;\r
449 INTN DestY;\r
450 UINT8 *ImageData;\r
451 UINTN ImageSize;\r
452 UINTN BltSize;\r
453 UINT32 Instance;\r
454 EFI_BADGING_FORMAT Format;\r
455 EFI_BADGING_DISPLAY_ATTRIBUTE Attribute;\r
456 UINTN CoordinateX;\r
457 UINTN CoordinateY;\r
458 UINTN Height;\r
459 UINTN Width;\r
460 EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Blt;\r
461 EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
462 UINT32 ColorDepth;\r
463 UINT32 RefreshRate;\r
464 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
465\r
466 Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, (VOID**)&ConsoleControl);\r
467 if (EFI_ERROR (Status)) {\r
468 return EFI_UNSUPPORTED;\r
469 }\r
470\r
471 UgaDraw = NULL;\r
472 //\r
473 // Try to open GOP first\r
474 //\r
475 Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiGraphicsOutputProtocolGuid, (VOID**)&GraphicsOutput);\r
476 if (EFI_ERROR (Status)) {\r
477 GraphicsOutput = NULL;\r
478 //\r
479 // Open GOP failed, try to open UGA\r
480 //\r
481 Status = gBS->HandleProtocol (gST->ConsoleOutHandle, &gEfiUgaDrawProtocolGuid, (VOID**)&UgaDraw);\r
482 if (EFI_ERROR (Status)) {\r
483 return EFI_UNSUPPORTED;\r
484 }\r
485 }\r
486\r
487 Badging = NULL;\r
488 Status = gBS->LocateProtocol (&gEfiOEMBadgingProtocolGuid, NULL, (VOID**)&Badging);\r
489\r
490 ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenGraphics);\r
491\r
492 if (GraphicsOutput != NULL) {\r
493 SizeOfX = GraphicsOutput->Mode->Info->HorizontalResolution;\r
494 SizeOfY = GraphicsOutput->Mode->Info->VerticalResolution;\r
4ac4deb7 495 } else if (UgaDraw != NULL) {\r
3eb9473e 496 Status = UgaDraw->GetMode (UgaDraw, &SizeOfX, &SizeOfY, &ColorDepth, &RefreshRate);\r
497 if (EFI_ERROR (Status)) {\r
498 return EFI_UNSUPPORTED;\r
499 }\r
4ac4deb7
LG
500 } else {\r
501 return EFI_UNSUPPORTED;\r
3eb9473e 502 }\r
503\r
504 Instance = 0;\r
505 while (1) {\r
506 ImageData = NULL;\r
507 ImageSize = 0;\r
508\r
509 if (Badging != NULL) {\r
510 Status = Badging->GetImage (\r
511 Badging,\r
512 &Instance,\r
513 &Format,\r
514 &ImageData,\r
515 &ImageSize,\r
516 &Attribute,\r
517 &CoordinateX,\r
518 &CoordinateY\r
519 );\r
520 if (EFI_ERROR (Status)) {\r
521 return Status;\r
522 }\r
523\r
524 //\r
525 // Currently only support BMP format\r
526 //\r
527 if (Format != EfiBadgingFormatBMP) {\r
528 gBS->FreePool (ImageData);\r
529 continue;\r
530 }\r
531 } else {\r
57d40fe2 532 Status = GetGraphicsBitMapFromFVEx (ImageHandle, LogoFile, (VOID **) &ImageData, &ImageSize);\r
3eb9473e 533 if (EFI_ERROR (Status)) {\r
534 return EFI_UNSUPPORTED;\r
535 }\r
536\r
537 CoordinateX = 0;\r
538 CoordinateY = 0;\r
539 Attribute = EfiBadgingDisplayAttributeCenter;\r
540 }\r
541\r
542 Blt = NULL;\r
543 Status = ConvertBmpToGopBlt (\r
544 ImageData,\r
545 ImageSize,\r
546 (VOID**)&Blt,\r
547 &BltSize,\r
548 &Height,\r
549 &Width\r
550 );\r
551 if (EFI_ERROR (Status)) {\r
552 gBS->FreePool (ImageData);\r
553 if (Badging == NULL) {\r
554 return Status;\r
555 } else {\r
556 continue;\r
557 }\r
558 }\r
559\r
560 switch (Attribute) {\r
561 case EfiBadgingDisplayAttributeLeftTop:\r
562 DestX = CoordinateX;\r
563 DestY = CoordinateY;\r
564 break;\r
565\r
566 case EfiBadgingDisplayAttributeCenterTop:\r
567 DestX = (SizeOfX - Width) / 2;\r
568 DestY = CoordinateY;\r
569 break;\r
570\r
571 case EfiBadgingDisplayAttributeRightTop:\r
572 DestX = (SizeOfX - Width - CoordinateX);\r
573 DestY = CoordinateY;;\r
574 break;\r
575\r
576 case EfiBadgingDisplayAttributeCenterRight:\r
577 DestX = (SizeOfX - Width - CoordinateX);\r
578 DestY = (SizeOfY - Height) / 2;\r
579 break;\r
580\r
581 case EfiBadgingDisplayAttributeRightBottom:\r
582 DestX = (SizeOfX - Width - CoordinateX);\r
583 DestY = (SizeOfY - Height - CoordinateY);\r
584 break;\r
585\r
586 case EfiBadgingDisplayAttributeCenterBottom:\r
587 DestX = (SizeOfX - Width) / 2;\r
588 DestY = (SizeOfY - Height - CoordinateY);\r
589 break;\r
590\r
591 case EfiBadgingDisplayAttributeLeftBottom:\r
592 DestX = CoordinateX;\r
593 DestY = (SizeOfY - Height - CoordinateY);\r
594 break;\r
595\r
596 case EfiBadgingDisplayAttributeCenterLeft:\r
597 DestX = CoordinateX;\r
598 DestY = (SizeOfY - Height) / 2;\r
599 break;\r
600\r
601 case EfiBadgingDisplayAttributeCenter:\r
602 DestX = (SizeOfX - Width) / 2;\r
603 DestY = (SizeOfY - Height) / 2;\r
604 break;\r
605\r
606 default:\r
607 DestX = CoordinateX;\r
608 DestY = CoordinateY;\r
609 break;\r
610 }\r
611\r
612 if ((DestX >= 0) && (DestY >= 0)) {\r
613 if (GraphicsOutput != NULL) {\r
614 Status = GraphicsOutput->Blt (\r
615 GraphicsOutput,\r
616 Blt,\r
617 EfiBltBufferToVideo,\r
618 0,\r
619 0,\r
620 (UINTN) DestX,\r
621 (UINTN) DestY,\r
622 Width,\r
623 Height,\r
624 Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
625 );\r
626 } else {\r
627 Status = UgaDraw->Blt (\r
628 UgaDraw,\r
629 (EFI_UGA_PIXEL *) Blt,\r
630 EfiUgaBltBufferToVideo,\r
631 0,\r
632 0,\r
633 (UINTN) DestX,\r
634 (UINTN) DestY,\r
635 Width,\r
636 Height,\r
637 Width * sizeof (EFI_UGA_PIXEL)\r
638 );\r
639 }\r
640 }\r
641\r
642 gBS->FreePool (ImageData);\r
643 gBS->FreePool (Blt);\r
644\r
645 if (Badging == NULL) {\r
646 break;\r
647 }\r
648 }\r
649\r
650 return Status;\r
651}\r
652\r
653\r
654EFI_STATUS\r
655DisableQuietBoot (\r
656 VOID\r
657 )\r
658/*++\r
659\r
660Routine Description:\r
661\r
662 Use Console Control to turn on GOP/UGA based Simple Text Out consoles. The GOP/UGA \r
663 Simple Text Out screens will now be synced up with all non GOP/UGA output devices\r
664\r
665Arguments:\r
666\r
667 NONE\r
668\r
669Returns: \r
670\r
671 EFI_SUCCESS - GOP/UGA devices are back in text mode and synced up.\r
672 EFI_UNSUPPORTED - Logo not found\r
673\r
674--*/\r
675{\r
676 EFI_STATUS Status;\r
677 EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;\r
678\r
679 Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, (VOID**)&ConsoleControl);\r
680 if (EFI_ERROR (Status)) {\r
681 return EFI_UNSUPPORTED;\r
682 }\r
683\r
684 return ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText);\r
685}\r