]> git.proxmox.com Git - mirror_edk2.git/blame - MdePkg/Library/UefiLib/UefiLibPrint.c
sync the StrToImage flag of UGA to consistent with GOP
[mirror_edk2.git] / MdePkg / Library / UefiLib / UefiLibPrint.c
CommitLineData
e386b444 1/** @file\r
727501bb 2 Mde UEFI library API implementation.\r
e386b444 3 Print to StdErr or ConOut defined in EFI_SYSTEM_TABLE\r
4\r
d9e63d93 5 Copyright (c) 2007 - 2009, Intel Corporation<BR>\r
e386b444 6 All rights reserved. This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10\r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
14**/\r
15\r
f734a10a 16#include "UefiLibInternal.h"\r
e386b444 17\r
0057fda6 18GLOBAL_REMOVE_IF_UNREFERENCED EFI_GRAPHICS_OUTPUT_BLT_PIXEL mEfiColors[16] = {\r
b3154720 19 { 0x00, 0x00, 0x00, 0x00 },\r
20 { 0x98, 0x00, 0x00, 0x00 },\r
21 { 0x00, 0x98, 0x00, 0x00 },\r
22 { 0x98, 0x98, 0x00, 0x00 },\r
23 { 0x00, 0x00, 0x98, 0x00 },\r
24 { 0x98, 0x00, 0x98, 0x00 },\r
25 { 0x00, 0x98, 0x98, 0x00 },\r
26 { 0x98, 0x98, 0x98, 0x00 },\r
27 { 0x10, 0x10, 0x10, 0x00 },\r
28 { 0xff, 0x10, 0x10, 0x00 },\r
29 { 0x10, 0xff, 0x10, 0x00 },\r
30 { 0xff, 0xff, 0x10, 0x00 },\r
31 { 0x10, 0x10, 0xff, 0x00 },\r
32 { 0xf0, 0x10, 0xff, 0x00 },\r
33 { 0x10, 0xff, 0xff, 0x00 },\r
34 { 0xff, 0xff, 0xff, 0x00 }\r
35};\r
36\r
e386b444 37/**\r
38 Internal function which prints a formatted Unicode string to the console output device\r
39 specified by Console\r
40\r
41 This function prints a formatted Unicode string to the console output device\r
42 specified by Console and returns the number of Unicode characters that printed\r
43 to it. If the length of the formatted Unicode string is greater than PcdUefiLibMaxPrintBufferSize,\r
44 then only the first PcdUefiLibMaxPrintBufferSize characters are sent to Console.\r
f80b0830 45 If Format is NULL, then ASSERT().\r
46 If Format is not aligned on a 16-bit boundary, then ASSERT().\r
e386b444 47\r
48 @param Format Null-terminated Unicode format string.\r
49 @param Console The output console.\r
50 @param Marker VA_LIST marker for the variable argument list.\r
73e4adbe 51\r
f80b0830 52 @return The number of Unicode characters in the produced\r
53 output buffer not including the Null-terminator.\r
e386b444 54**/\r
e386b444 55UINTN\r
56InternalPrint (\r
57 IN CONST CHAR16 *Format,\r
58 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *Console,\r
59 IN VA_LIST Marker\r
60 )\r
61{\r
62 UINTN Return;\r
63 CHAR16 *Buffer;\r
64 UINTN BufferSize;\r
65\r
66 ASSERT (Format != NULL);\r
b3154720 67 ASSERT (((UINTN) Format & BIT0) == 0);\r
e386b444 68\r
69 BufferSize = (PcdGet32 (PcdUefiLibMaxPrintBufferSize) + 1) * sizeof (CHAR16);\r
70\r
71 Buffer = (CHAR16 *) AllocatePool(BufferSize);\r
72 ASSERT (Buffer != NULL);\r
73\r
74 Return = UnicodeVSPrint (Buffer, BufferSize, Format, Marker);\r
75\r
2ad4dad0 76 if (Console != NULL && Return > 0) {\r
e386b444 77 //\r
78 // To be extra safe make sure Console has been initialized\r
79 //\r
80 Console->OutputString (Console, Buffer);\r
81 }\r
82\r
83 FreePool (Buffer);\r
84\r
85 return Return;\r
86}\r
87\r
28d3e14f 88/** \r
89 Prints a formatted Unicode string to the console output device specified by \r
e386b444 90 ConOut defined in the EFI_SYSTEM_TABLE.\r
91\r
28d3e14f 92 This function prints a formatted Unicode string to the console output device \r
93 specified by ConOut in EFI_SYSTEM_TABLE and returns the number of Unicode \r
94 characters that printed to ConOut. If the length of the formatted Unicode \r
95 string is greater than PcdUefiLibMaxPrintBufferSize, then only the first \r
e386b444 96 PcdUefiLibMaxPrintBufferSize characters are sent to ConOut.\r
f80b0830 97 If Format is NULL, then ASSERT().\r
98 If Format is not aligned on a 16-bit boundary, then ASSERT().\r
e386b444 99\r
100 @param Format Null-terminated Unicode format string.\r
28d3e14f 101 @param ... Variable argument list whose contents are accessed based \r
285010e7 102 on the format string specified by Format.\r
28d3e14f 103 \r
cf8ae2f6 104 @return Number of Unicode characters printed to ConOut.\r
e386b444 105\r
106**/\r
107UINTN\r
108EFIAPI\r
109Print (\r
110 IN CONST CHAR16 *Format,\r
111 ...\r
112 )\r
113{\r
114 VA_LIST Marker;\r
115 UINTN Return;\r
116\r
117 VA_START (Marker, Format);\r
118\r
119 Return = InternalPrint (Format, gST->ConOut, Marker);\r
120\r
121 VA_END (Marker);\r
122\r
123 return Return;\r
124}\r
125\r
28d3e14f 126/** \r
127 Prints a formatted Unicode string to the console output device specified by \r
e386b444 128 StdErr defined in the EFI_SYSTEM_TABLE.\r
129\r
28d3e14f 130 This function prints a formatted Unicode string to the console output device \r
131 specified by StdErr in EFI_SYSTEM_TABLE and returns the number of Unicode \r
132 characters that printed to StdErr. If the length of the formatted Unicode \r
133 string is greater than PcdUefiLibMaxPrintBufferSize, then only the first \r
e386b444 134 PcdUefiLibMaxPrintBufferSize characters are sent to StdErr.\r
f80b0830 135 If Format is NULL, then ASSERT().\r
136 If Format is not aligned on a 16-bit boundary, then ASSERT().\r
e386b444 137\r
138 @param Format Null-terminated Unicode format string.\r
28d3e14f 139 @param ... Variable argument list whose contents are accessed based \r
285010e7 140 on the format string specified by Format.\r
28d3e14f 141 \r
cf8ae2f6 142 @return Number of Unicode characters printed to StdErr.\r
e386b444 143\r
144**/\r
e386b444 145UINTN\r
146EFIAPI\r
147ErrorPrint (\r
148 IN CONST CHAR16 *Format,\r
149 ...\r
150 )\r
151{\r
152 VA_LIST Marker;\r
153 UINTN Return;\r
154\r
155 VA_START (Marker, Format);\r
156\r
157 Return = InternalPrint( Format, gST->StdErr, Marker);\r
158\r
159 VA_END (Marker);\r
160\r
161 return Return;\r
162}\r
163\r
164\r
165/**\r
166 Internal function which prints a formatted ASCII string to the console output device\r
167 specified by Console\r
168\r
169 This function prints a formatted ASCII string to the console output device\r
170 specified by Console and returns the number of ASCII characters that printed\r
171 to it. If the length of the formatted ASCII string is greater than PcdUefiLibMaxPrintBufferSize,\r
172 then only the first PcdUefiLibMaxPrintBufferSize characters are sent to Console.\r
f80b0830 173\r
174 If Format is NULL, then ASSERT().\r
e386b444 175\r
176 @param Format Null-terminated ASCII format string.\r
177 @param Console The output console.\r
178 @param Marker VA_LIST marker for the variable argument list.\r
179\r
f80b0830 180 @return The number of Unicode characters in the produced\r
181 output buffer not including the Null-terminator.\r
e386b444 182\r
183**/\r
e386b444 184UINTN\r
185AsciiInternalPrint (\r
186 IN CONST CHAR8 *Format,\r
187 IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *Console,\r
188 IN VA_LIST Marker\r
189 )\r
190{\r
191 UINTN Return;\r
192 CHAR16 *Buffer;\r
193 UINTN BufferSize;\r
194\r
195 ASSERT (Format != NULL);\r
196\r
197 BufferSize = (PcdGet32 (PcdUefiLibMaxPrintBufferSize) + 1) * sizeof (CHAR16);\r
198\r
199 Buffer = (CHAR16 *) AllocatePool(BufferSize);\r
200 ASSERT (Buffer != NULL);\r
201\r
202 Return = UnicodeVSPrintAsciiFormat (Buffer, BufferSize, Format, Marker);\r
203\r
204 if (Console != NULL) {\r
205 //\r
206 // To be extra safe make sure Console has been initialized\r
207 //\r
208 Console->OutputString (Console, Buffer);\r
209 }\r
210\r
211 FreePool (Buffer);\r
212\r
213 return Return;\r
214}\r
215\r
28d3e14f 216/** \r
217 Prints a formatted ASCII string to the console output device specified by \r
e386b444 218 ConOut defined in the EFI_SYSTEM_TABLE.\r
219\r
28d3e14f 220 This function prints a formatted ASCII string to the console output device \r
221 specified by ConOut in EFI_SYSTEM_TABLE and returns the number of ASCII \r
222 characters that printed to ConOut. If the length of the formatted ASCII \r
223 string is greater than PcdUefiLibMaxPrintBufferSize, then only the first \r
e386b444 224 PcdUefiLibMaxPrintBufferSize characters are sent to ConOut.\r
f80b0830 225 If Format is NULL, then ASSERT().\r
e386b444 226\r
227 @param Format Null-terminated ASCII format string.\r
28d3e14f 228 @param ... Variable argument list whose contents are accessed based \r
285010e7 229 on the format string specified by Format.\r
28d3e14f 230 \r
cf8ae2f6 231 @return Number of ASCII characters printed to ConOut.\r
e386b444 232\r
233**/\r
234UINTN\r
235EFIAPI\r
236AsciiPrint (\r
237 IN CONST CHAR8 *Format,\r
238 ...\r
239 )\r
240{\r
241 VA_LIST Marker;\r
242 UINTN Return;\r
9edc73ad 243 ASSERT (Format != NULL);\r
73e4adbe 244\r
e386b444 245 VA_START (Marker, Format);\r
246\r
247 Return = AsciiInternalPrint( Format, gST->ConOut, Marker);\r
248\r
249 VA_END (Marker);\r
250\r
251 return Return;\r
252}\r
253\r
28d3e14f 254/** \r
255 Prints a formatted ASCII string to the console output device specified by \r
e386b444 256 StdErr defined in the EFI_SYSTEM_TABLE.\r
257\r
28d3e14f 258 This function prints a formatted ASCII string to the console output device \r
259 specified by StdErr in EFI_SYSTEM_TABLE and returns the number of ASCII \r
260 characters that printed to StdErr. If the length of the formatted ASCII \r
261 string is greater than PcdUefiLibMaxPrintBufferSize, then only the first \r
e386b444 262 PcdUefiLibMaxPrintBufferSize characters are sent to StdErr.\r
f80b0830 263 If Format is NULL, then ASSERT().\r
e386b444 264\r
265 @param Format Null-terminated ASCII format string.\r
28d3e14f 266 @param ... Variable argument list whose contents are accessed based \r
285010e7 267 on the format string specified by Format.\r
28d3e14f 268 \r
cf8ae2f6 269 @return Number of ASCII characters printed to ConErr.\r
e386b444 270\r
271**/\r
272UINTN\r
273EFIAPI\r
274AsciiErrorPrint (\r
275 IN CONST CHAR8 *Format,\r
276 ...\r
277 )\r
278{\r
279 VA_LIST Marker;\r
280 UINTN Return;\r
281\r
9edc73ad 282 ASSERT (Format != NULL);\r
73e4adbe 283\r
e386b444 284 VA_START (Marker, Format);\r
285\r
286 Return = AsciiInternalPrint( Format, gST->StdErr, Marker);\r
287\r
288 VA_END (Marker);\r
289\r
290 return Return;\r
291}\r
292\r
b3154720 293/**\r
73e4adbe 294 Internal function to print a formatted Unicode string to a graphics console device specified by\r
b3154720 295 ConsoleOutputHandle defined in the EFI_SYSTEM_TABLE at the given (X,Y) coordinates.\r
296\r
73e4adbe 297 This function prints a formatted Unicode string to the graphics console device\r
298 specified by ConsoleOutputHandle in EFI_SYSTEM_TABLE and returns the number of\r
299 Unicode characters printed. The EFI_HII_FONT_PROTOCOL is used to convert the\r
300 string to a bitmap using the glyphs registered with the\r
b3154720 301 HII database. No wrapping is performed, so any portions of the string the fall\r
302 outside the active display region will not be displayed.\r
303\r
73e4adbe 304 If a graphics console device is not associated with the ConsoleOutputHandle\r
b3154720 305 defined in the EFI_SYSTEM_TABLE then no string is printed, and 0 is returned.\r
73e4adbe 306 If the EFI_HII_FONT_PROTOCOL is not present in the handle database, then no\r
b3154720 307 string is printed, and 0 is returned.\r
308\r
51969ecb 309 @param PointX X coordinate to print the string.\r
310 @param PointY Y coordinate to print the string.\r
311 @param Foreground The foreground color of the string being printed. This is\r
b3154720 312 an optional parameter that may be NULL. If it is NULL,\r
313 then the foreground color of the current ConOut device\r
314 in the EFI_SYSTEM_TABLE is used.\r
a72edceb 315 @param Background The background color of the string being printed. This is\r
73e4adbe 316 an optional parameter that may be NULL. If it is NULL,\r
b3154720 317 then the background color of the current ConOut device\r
318 in the EFI_SYSTEM_TABLE is used.\r
319 @param Buffer Null-terminated Unicode formatted string.\r
320 @param PrintNum The number of Unicode formatted string to be printed.\r
321\r
73e4adbe 322 @return Number of Unicode Characters printed. Zero means no any character\r
b3154720 323 displayed successfully.\r
324\r
325**/\r
326UINTN\r
327InternalPrintGraphic (\r
51969ecb 328 IN UINTN PointX,\r
329 IN UINTN PointY,\r
b3154720 330 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Foreground,\r
331 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Background,\r
332 IN CHAR16 *Buffer,\r
333 IN UINTN PrintNum\r
334 )\r
335{\r
336 EFI_STATUS Status;\r
b3154720 337 UINT32 HorizontalResolution;\r
338 UINT32 VerticalResolution;\r
339 UINT32 ColorDepth;\r
340 UINT32 RefreshRate;\r
b3154720 341 EFI_HII_FONT_PROTOCOL *HiiFont;\r
342 EFI_IMAGE_OUTPUT *Blt;\r
343 EFI_FONT_DISPLAY_INFO FontInfo;\r
344 EFI_HII_ROW_INFO *RowInfoArray;\r
345 UINTN RowInfoArraySize;\r
346 EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;\r
347 EFI_UGA_DRAW_PROTOCOL *UgaDraw;\r
348 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *Sto;\r
349 EFI_HANDLE ConsoleHandle;\r
350\r
351 HorizontalResolution = 0;\r
352 VerticalResolution = 0;\r
353 Blt = NULL;\r
d9e63d93 354 RowInfoArray = NULL;\r
b3154720 355\r
356 ConsoleHandle = gST->ConsoleOutHandle;\r
357\r
358 Status = gBS->HandleProtocol (\r
359 ConsoleHandle,\r
360 &gEfiGraphicsOutputProtocolGuid,\r
361 (VOID **) &GraphicsOutput\r
362 );\r
363\r
364 UgaDraw = NULL;\r
365 if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
366 //\r
367 // If no GOP available, try to open UGA Draw protocol if supported.\r
368 //\r
369 GraphicsOutput = NULL;\r
370\r
371 Status = gBS->HandleProtocol (\r
372 ConsoleHandle,\r
373 &gEfiUgaDrawProtocolGuid,\r
374 (VOID **) &UgaDraw\r
375 );\r
376 }\r
377 if (EFI_ERROR (Status)) {\r
d9e63d93 378 goto Error;\r
b3154720 379 }\r
380\r
381 Status = gBS->HandleProtocol (\r
382 ConsoleHandle,\r
383 &gEfiSimpleTextOutProtocolGuid,\r
384 (VOID **) &Sto\r
385 );\r
386\r
387 if (EFI_ERROR (Status)) {\r
d9e63d93 388 goto Error;\r
b3154720 389 }\r
390\r
391 if (GraphicsOutput != NULL) {\r
392 HorizontalResolution = GraphicsOutput->Mode->Info->HorizontalResolution;\r
393 VerticalResolution = GraphicsOutput->Mode->Info->VerticalResolution;\r
73e4adbe 394 } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
b3154720 395 UgaDraw->GetMode (UgaDraw, &HorizontalResolution, &VerticalResolution, &ColorDepth, &RefreshRate);\r
396 } else {\r
b3154720 397 goto Error;\r
398 }\r
399\r
400 ASSERT ((HorizontalResolution != 0) && (VerticalResolution !=0));\r
401\r
402 Status = gBS->LocateProtocol (&gEfiHiiFontProtocolGuid, NULL, (VOID **) &HiiFont);\r
403 if (EFI_ERROR (Status)) {\r
404 goto Error;\r
405 }\r
406\r
b3154720 407 Blt = (EFI_IMAGE_OUTPUT *) AllocateZeroPool (sizeof (EFI_IMAGE_OUTPUT));\r
408 ASSERT (Blt != NULL);\r
409\r
410 Blt->Width = (UINT16) (HorizontalResolution);\r
411 Blt->Height = (UINT16) (VerticalResolution);\r
412\r
413 ZeroMem (&FontInfo, sizeof (EFI_FONT_DISPLAY_INFO));\r
414\r
415 if (Foreground != NULL) {\r
416 CopyMem (&FontInfo.ForegroundColor, Foreground, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
417 } else {\r
418 CopyMem (\r
419 &FontInfo.ForegroundColor,\r
420 &mEfiColors[Sto->Mode->Attribute & 0x0f],\r
421 sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
422 );\r
423 }\r
424 if (Background != NULL) {\r
425 CopyMem (&FontInfo.BackgroundColor, Background, sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
426 } else {\r
427 CopyMem (\r
428 &FontInfo.BackgroundColor,\r
429 &mEfiColors[Sto->Mode->Attribute >> 4],\r
430 sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
431 );\r
432 }\r
433\r
434 if (GraphicsOutput != NULL) {\r
435 Blt->Image.Screen = GraphicsOutput;\r
73e4adbe 436\r
b3154720 437 Status = HiiFont->StringToImage (\r
438 HiiFont,\r
d9e63d93 439 EFI_HII_IGNORE_IF_NO_GLYPH | EFI_HII_OUT_FLAG_CLIP |\r
440 EFI_HII_OUT_FLAG_CLIP_CLEAN_X | EFI_HII_OUT_FLAG_CLIP_CLEAN_Y |\r
441 EFI_HII_IGNORE_LINE_BREAK | EFI_HII_DIRECT_TO_SCREEN,\r
b3154720 442 Buffer,\r
443 &FontInfo,\r
444 &Blt,\r
51969ecb 445 PointX,\r
446 PointY,\r
d9e63d93 447 &RowInfoArray,\r
448 &RowInfoArraySize,\r
b3154720 449 NULL\r
450 );\r
d9e63d93 451 if (EFI_ERROR (Status)) {\r
452 goto Error;\r
453 }\r
b3154720 454\r
455 } else if (FeaturePcdGet (PcdUgaConsumeSupport)) {\r
456 ASSERT (UgaDraw!= NULL);\r
457\r
458 Blt->Image.Bitmap = AllocateZeroPool (Blt->Width * Blt->Height * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL));\r
459 ASSERT (Blt->Image.Bitmap != NULL);\r
460\r
b3154720 461 //\r
462 // StringToImage only support blt'ing image to device using GOP protocol. If GOP is not supported in this platform,\r
463 // we ask StringToImage to print the string to blt buffer, then blt to device using UgaDraw.\r
464 //\r
465 Status = HiiFont->StringToImage (\r
466 HiiFont,\r
392b3cf8 467 EFI_HII_IGNORE_IF_NO_GLYPH | EFI_HII_OUT_FLAG_CLIP |\r
468 EFI_HII_OUT_FLAG_CLIP_CLEAN_X | EFI_HII_OUT_FLAG_CLIP_CLEAN_Y |\r
469 EFI_HII_IGNORE_LINE_BREAK,\r
b3154720 470 Buffer,\r
471 &FontInfo,\r
472 &Blt,\r
51969ecb 473 PointX,\r
474 PointY,\r
b3154720 475 &RowInfoArray,\r
476 &RowInfoArraySize,\r
477 NULL\r
478 );\r
479\r
480 if (!EFI_ERROR (Status)) {\r
481 ASSERT (RowInfoArray != NULL);\r
482 //\r
483 // Line breaks are handled by caller of DrawUnicodeWeightAtCursorN, so the updated parameter RowInfoArraySize by StringToImage will\r
484 // always be 1 or 0 (if there is no valid Unicode Char can be printed). ASSERT here to make sure.\r
485 //\r
486 ASSERT (RowInfoArraySize <= 1);\r
487\r
488 Status = UgaDraw->Blt (\r
489 UgaDraw,\r
490 (EFI_UGA_PIXEL *) Blt->Image.Bitmap,\r
491 EfiUgaBltBufferToVideo,\r
51969ecb 492 PointX,\r
493 PointY,\r
494 PointX,\r
495 PointY,\r
b3154720 496 RowInfoArray[0].LineWidth,\r
497 RowInfoArray[0].LineHeight,\r
498 Blt->Width * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
499 );\r
d9e63d93 500 } else {\r
501 goto Error;\r
b3154720 502 }\r
b3154720 503 FreePool (Blt->Image.Bitmap);\r
b3154720 504 } else {\r
d9e63d93 505 goto Error;\r
b3154720 506 }\r
d9e63d93 507 //\r
508 // Calculate the number of actual printed characters\r
509 //\r
510 PrintNum = RowInfoArray[0].EndIndex - RowInfoArray[0].StartIndex + 1;\r
b3154720 511\r
d9e63d93 512 FreePool (RowInfoArray);\r
b3154720 513 FreePool (Blt);\r
d9e63d93 514 return PrintNum;\r
b3154720 515\r
516Error:\r
d9e63d93 517 if (Blt != NULL) {\r
518 FreePool (Blt);\r
b3154720 519 }\r
d9e63d93 520 return 0;\r
b3154720 521}\r
522\r
523/**\r
28d3e14f 524 Prints a formatted Unicode string to a graphics console device specified by \r
b3154720 525 ConsoleOutputHandle defined in the EFI_SYSTEM_TABLE at the given (X,Y) coordinates.\r
526\r
28d3e14f 527 This function prints a formatted Unicode string to the graphics console device \r
528 specified by ConsoleOutputHandle in EFI_SYSTEM_TABLE and returns the number of \r
b9c8d8bd 529 Unicode characters displayed, not including partial characters that may be clipped \r
530 by the right edge of the display. If the length of the formatted Unicode string is\r
531 greater than PcdUefiLibMaxPrintBufferSize, then at most the first \r
d9e63d93 532 PcdUefiLibMaxPrintBufferSize characters are printed.The EFI_HII_FONT_PROTOCOL\r
533 StringToImage() service is used to convert the string to a bitmap using the glyphs \r
534 registered with the HII database. No wrapping is performed, so any portions of the \r
535 string the fall outside the active display region will not be displayed. Please see \r
536 Section 27.2.6 of the UEFI Specification for a description of the supported string\r
537 format including the set of control codes supported by the StringToImage() service.\r
b3154720 538\r
28d3e14f 539 If a graphics console device is not associated with the ConsoleOutputHandle \r
b3154720 540 defined in the EFI_SYSTEM_TABLE then no string is printed, and 0 is returned.\r
28d3e14f 541 If the EFI_HII_FONT_PROTOCOL is not present in the handle database, then no \r
b3154720 542 string is printed, and 0 is returned.\r
543 If Format is NULL, then ASSERT().\r
544 If Format is not aligned on a 16-bit boundary, then ASSERT().\r
545\r
51969ecb 546 @param PointX X coordinate to print the string.\r
547 @param PointY Y coordinate to print the string.\r
28d3e14f 548 @param ForeGround The foreground color of the string being printed. This is\r
b3154720 549 an optional parameter that may be NULL. If it is NULL,\r
550 then the foreground color of the current ConOut device\r
551 in the EFI_SYSTEM_TABLE is used.\r
552 @param BackGround The background color of the string being printed. This is\r
28d3e14f 553 an optional parameter that may be NULL. If it is NULL, \r
b3154720 554 then the background color of the current ConOut device\r
555 in the EFI_SYSTEM_TABLE is used.\r
28d3e14f 556 @param Format Null-terminated Unicode format string. See Print Library \r
b3154720 557 for the supported format string syntax.\r
28d3e14f 558 @param ... Variable argument list whose contents are accessed based on \r
559 the format string specified by Format. \r
b3154720 560\r
cf8ae2f6 561 @return The number of Unicode characters printed.\r
b3154720 562\r
563**/\r
564UINTN\r
565EFIAPI\r
566PrintXY (\r
51969ecb 567 IN UINTN PointX,\r
568 IN UINTN PointY,\r
b3154720 569 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *ForeGround, OPTIONAL\r
570 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackGround, OPTIONAL\r
571 IN CONST CHAR16 *Format,\r
572 ...\r
573 )\r
574{\r
575 VA_LIST Marker;\r
576 CHAR16 *Buffer;\r
577 UINTN BufferSize;\r
578 UINTN PrintNum;\r
579 UINTN ReturnNum;\r
580\r
581 ASSERT (Format != NULL);\r
582 ASSERT (((UINTN) Format & BIT0) == 0);\r
583\r
584 VA_START (Marker, Format);\r
585\r
586 BufferSize = (PcdGet32 (PcdUefiLibMaxPrintBufferSize) + 1) * sizeof (CHAR16);\r
587\r
588 Buffer = (CHAR16 *) AllocatePool (BufferSize);\r
589 ASSERT (Buffer != NULL);\r
73e4adbe 590\r
b3154720 591 PrintNum = UnicodeVSPrint (Buffer, BufferSize, Format, Marker);\r
592\r
51969ecb 593 ReturnNum = InternalPrintGraphic (PointX, PointY, ForeGround, BackGround, Buffer, PrintNum);\r
b3154720 594\r
595 FreePool (Buffer);\r
596\r
597 return ReturnNum;\r
598}\r
599\r
600/**\r
28d3e14f 601 Prints a formatted ASCII string to a graphics console device specified by \r
b3154720 602 ConsoleOutputHandle defined in the EFI_SYSTEM_TABLE at the given (X,Y) coordinates.\r
603\r
28d3e14f 604 This function prints a formatted ASCII string to the graphics console device \r
605 specified by ConsoleOutputHandle in EFI_SYSTEM_TABLE and returns the number of \r
b9c8d8bd 606 ASCII characters displayed, not including partial characters that may be clipped \r
607 by the right edge of the display. If the length of the formatted ASCII string is\r
608 greater than PcdUefiLibMaxPrintBufferSize, then at most the first \r
d9e63d93 609 PcdUefiLibMaxPrintBufferSize characters are printed.The EFI_HII_FONT_PROTOCOL\r
610 StringToImage() service is used to convert the string to a bitmap using the glyphs \r
611 registered with the HII database. No wrapping is performed, so any portions of the \r
612 string the fall outside the active display region will not be displayed. Please see \r
613 Section 27.2.6 of the UEFI Specification for a description of the supported string\r
614 format including the set of control codes supported by the StringToImage() service.\r
b3154720 615\r
28d3e14f 616 If a graphics console device is not associated with the ConsoleOutputHandle \r
b3154720 617 defined in the EFI_SYSTEM_TABLE then no string is printed, and 0 is returned.\r
28d3e14f 618 If the EFI_HII_FONT_PROTOCOL is not present in the handle database, then no \r
b3154720 619 string is printed, and 0 is returned.\r
620 If Format is NULL, then ASSERT().\r
621\r
51969ecb 622 @param PointX X coordinate to print the string.\r
623 @param PointY Y coordinate to print the string.\r
28d3e14f 624 @param ForeGround The foreground color of the string being printed. This is\r
b3154720 625 an optional parameter that may be NULL. If it is NULL,\r
626 then the foreground color of the current ConOut device\r
627 in the EFI_SYSTEM_TABLE is used.\r
628 @param BackGround The background color of the string being printed. This is\r
28d3e14f 629 an optional parameter that may be NULL. If it is NULL, \r
b3154720 630 then the background color of the current ConOut device\r
631 in the EFI_SYSTEM_TABLE is used.\r
28d3e14f 632 @param Format Null-terminated ASCII format string. See Print Library \r
b3154720 633 for the supported format string syntax.\r
28d3e14f 634 @param ... Variable argument list whose contents are accessed based on \r
635 the format string specified by Format. \r
b3154720 636\r
cf8ae2f6 637 @return The number of ASCII characters printed.\r
b3154720 638\r
639**/\r
640UINTN\r
641EFIAPI\r
642AsciiPrintXY (\r
51969ecb 643 IN UINTN PointX,\r
644 IN UINTN PointY,\r
b3154720 645 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *ForeGround, OPTIONAL\r
646 IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BackGround, OPTIONAL\r
647 IN CONST CHAR8 *Format,\r
648 ...\r
649 )\r
650{\r
651 VA_LIST Marker;\r
652 CHAR16 *Buffer;\r
653 UINTN BufferSize;\r
654 UINTN PrintNum;\r
655 UINTN ReturnNum;\r
656\r
657 ASSERT (Format != NULL);\r
658\r
659 VA_START (Marker, Format);\r
660\r
661 BufferSize = (PcdGet32 (PcdUefiLibMaxPrintBufferSize) + 1) * sizeof (CHAR16);\r
662\r
663 Buffer = (CHAR16 *) AllocatePool (BufferSize);\r
664 ASSERT (Buffer != NULL);\r
73e4adbe 665\r
b3154720 666 PrintNum = UnicodeSPrintAsciiFormat (Buffer, BufferSize, Format, Marker);\r
667\r
51969ecb 668 ReturnNum = InternalPrintGraphic (PointX, PointY, ForeGround, BackGround, Buffer, PrintNum);\r
b3154720 669\r
670 FreePool (Buffer);\r
73e4adbe 671\r
b3154720 672 return ReturnNum;\r
673}\r
674\r