1 /** @file
2   The file provides services to retrieve font information.
3 
4 Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
6 
7   @par Revision Reference:
8   This Protocol was introduced in UEFI Specification 2.1.
9 
10 **/
11 
12 #ifndef __HII_FONT_H__
13 #define __HII_FONT_H__
14 
15 #include <Protocol/GraphicsOutput.h>
16 #include <Protocol/HiiImage.h>
17 
18 #define EFI_HII_FONT_PROTOCOL_GUID \
19 { 0xe9ca4775, 0x8657, 0x47fc, { 0x97, 0xe7, 0x7e, 0xd6, 0x5a, 0x8, 0x43, 0x24 } }
20 
21 typedef struct _EFI_HII_FONT_PROTOCOL EFI_HII_FONT_PROTOCOL;
22 
23 typedef VOID *EFI_FONT_HANDLE;
24 
25 ///
26 /// EFI_HII_OUT_FLAGS.
27 ///
28 typedef UINT32 EFI_HII_OUT_FLAGS;
29 
30 #define EFI_HII_OUT_FLAG_CLIP          0x00000001
31 #define EFI_HII_OUT_FLAG_WRAP          0x00000002
32 #define EFI_HII_OUT_FLAG_CLIP_CLEAN_Y  0x00000004
33 #define EFI_HII_OUT_FLAG_CLIP_CLEAN_X  0x00000008
34 #define EFI_HII_OUT_FLAG_TRANSPARENT   0x00000010
35 #define EFI_HII_IGNORE_IF_NO_GLYPH     0x00000020
36 #define EFI_HII_IGNORE_LINE_BREAK      0x00000040
37 #define EFI_HII_DIRECT_TO_SCREEN       0x00000080
38 
39 /**
40   Definition of EFI_HII_ROW_INFO.
41 **/
42 typedef struct _EFI_HII_ROW_INFO {
43   ///
44   /// The index of the first character in the string which is displayed on the line.
45   ///
46   UINTN    StartIndex;
47   ///
48   /// The index of the last character in the string which is displayed on the line.
49   /// If this is the same as StartIndex, then no characters are displayed.
50   ///
51   UINTN    EndIndex;
52   UINTN    LineHeight; ///< The height of the line, in pixels.
53   UINTN    LineWidth;  ///< The width of the text on the line, in pixels.
54 
55   ///
56   /// The font baseline offset in pixels from the bottom of the row, or 0 if none.
57   ///
58   UINTN    BaselineOffset;
59 } EFI_HII_ROW_INFO;
60 
61 ///
62 /// Font info flag. All flags (FONT, SIZE, STYLE, and COLOR) are defined.
63 /// They are defined as EFI_FONT_INFO_***
64 ///
65 typedef UINT32 EFI_FONT_INFO_MASK;
66 
67 #define EFI_FONT_INFO_SYS_FONT        0x00000001
68 #define EFI_FONT_INFO_SYS_SIZE        0x00000002
69 #define EFI_FONT_INFO_SYS_STYLE       0x00000004
70 #define EFI_FONT_INFO_SYS_FORE_COLOR  0x00000010
71 #define EFI_FONT_INFO_SYS_BACK_COLOR  0x00000020
72 #define EFI_FONT_INFO_RESIZE          0x00001000
73 #define EFI_FONT_INFO_RESTYLE         0x00002000
74 #define EFI_FONT_INFO_ANY_FONT        0x00010000
75 #define EFI_FONT_INFO_ANY_SIZE        0x00020000
76 #define EFI_FONT_INFO_ANY_STYLE       0x00040000
77 
78 //
79 // EFI_FONT_INFO
80 //
81 typedef struct {
82   EFI_HII_FONT_STYLE    FontStyle;
83   UINT16                FontSize;   ///< character cell height in pixels
84   CHAR16                FontName[1];
85 } EFI_FONT_INFO;
86 
87 /**
88   Describes font output-related information.
89 
90   This structure is used for describing the way in which a string
91   should be rendered in a particular font. FontInfo specifies the
92   basic font information and ForegroundColor and BackgroundColor
93   specify the color in which they should be displayed. The flags
94   in FontInfoMask describe where the system default should be
95   supplied instead of the specified information. The flags also
96   describe what options can be used to make a match between the
97   font requested and the font available.
98 **/
99 typedef struct _EFI_FONT_DISPLAY_INFO {
100   EFI_GRAPHICS_OUTPUT_BLT_PIXEL    ForegroundColor;
101   EFI_GRAPHICS_OUTPUT_BLT_PIXEL    BackgroundColor;
102   EFI_FONT_INFO_MASK               FontInfoMask;
103   EFI_FONT_INFO                    FontInfo;
104 } EFI_FONT_DISPLAY_INFO;
105 
106 /**
107 
108   This function renders a string to a bitmap or the screen using
109   the specified font, color and options. It either draws the
110   string and glyphs on an existing bitmap, allocates a new bitmap,
111   or uses the screen. The strings can be clipped or wrapped.
112   Optionally, the function also returns the information about each
113   row and the character position on that row. If
114   EFI_HII_OUT_FLAG_CLIP is set, then text will be formatted only
115   based on explicit line breaks and all pixels which would lie
116   outside the bounding box specified by Width and Height are
117   ignored. The information in the RowInfoArray only describes
118   characters which are at least partially displayed. For the final
119   row, the LineHeight and BaseLine may describe pixels that are
120   outside the limit specified by Height (unless
121   EFI_HII_OUT_FLAG_CLIP_CLEAN_Y is specified) even though those
122   pixels were not drawn. The LineWidth may describe pixels which
123   are outside the limit specified by Width (unless
124   EFI_HII_OUT_FLAG_CLIP_CLEAN_X is specified) even though those
125   pixels were not drawn. If EFI_HII_OUT_FLAG_CLIP_CLEAN_X is set,
126   then it modifies the behavior of EFI_HII_OUT_FLAG_CLIP so that
127   if a character's right-most on pixel cannot fit, then it will
128   not be drawn at all. This flag requires that
129   EFI_HII_OUT_FLAG_CLIP be set. If EFI_HII_OUT_FLAG_CLIP_CLEAN_Y
130   is set, then it modifies the behavior of EFI_HII_OUT_FLAG_CLIP
131   so that if a row's bottom-most pixel cannot fit, then it will
132   not be drawn at all. This flag requires that
133   EFI_HII_OUT_FLAG_CLIP be set. If EFI_HII_OUT_FLAG_WRAP is set,
134   then text will be wrapped at the right-most line-break
135   opportunity prior to a character whose right-most extent would
136   exceed Width. If no line-break opportunity can be found, then
137   the text will behave as if EFI_HII_OUT_FLAG_CLIP_CLEAN_X is set.
138   This flag cannot be used with EFI_HII_OUT_FLAG_CLIP_CLEAN_X. If
139   EFI_HII_OUT_FLAG_TRANSPARENT is set, then BackgroundColor is
140   ignored and all 'off' pixels in the character's drawn
141   will use the pixel value from Blt. This flag cannot be used if
142   Blt is NULL upon entry. If EFI_HII_IGNORE_IF_NO_GLYPH is set,
143   then characters which have no glyphs are not drawn. Otherwise,
144   they are replaced with Unicode character code 0xFFFD (REPLACEMENT
145   CHARACTER). If EFI_HII_IGNORE_LINE_BREAK is set, then explicit
146   line break characters will be ignored. If
147   EFI_HII_DIRECT_TO_SCREEN is set, then the string will be written
148   directly to the output device specified by Screen. Otherwise the
149   string will be rendered to the bitmap specified by Bitmap.
150 
151   @param This             A pointer to the EFI_HII_FONT_PROTOCOL instance.
152 
153   @param Flags            Describes how the string is to be drawn.
154 
155   @param String           Points to the null-terminated string to be
156 
157   @param StringInfo       Points to the string output information,
158                           including the color and font. If NULL, then
159                           the string will be output in the default
160                           system font and color.
161 
162   @param Blt              If this points to a non-NULL on entry, this points
163                           to the image, which is Width pixels wide and
164                           Height pixels high. The string will be drawn onto
165                           this image and EFI_HII_OUT_FLAG_CLIP is implied.
166                           If this points to a NULL on entry, then a buffer
167                           will be allocated to hold the generated image and
168                           the pointer updated on exit. It is the caller's
169                           responsibility to free this buffer.
170 
171   @param BltX, BltY       Specifies the offset from the left and top
172                           edge of the image of the first character
173                           cell in the image.
174 
175   @param RowInfoArray     If this is non-NULL on entry, then on
176                           exit, this will point to an allocated buffer
177                           containing row information and
178                           RowInfoArraySize will be updated to contain
179                           the number of elements. This array describes
180                           the characters that were at least partially
181                           drawn and the heights of the rows. It is the
182                           caller's responsibility to free this buffer.
183 
184   @param RowInfoArraySize If this is non-NULL on entry, then on
185                           exit it contains the number of
186                           elements in RowInfoArray.
187 
188   @param ColumnInfoArray  If this is non-NULL, then on return it
189                           will be filled with the horizontal
190                           offset for each character in the
191                           string on the row where it is
192                           displayed. Non-printing characters
193                           will have the offset ~0. The caller is
194                           responsible for allocating a buffer large
195                           enough so that there is one entry for
196                           each character in the string, not
197                           including the null-terminator. It is
198                           possible when character display is
199                           normalized that some character cells
200                           overlap.
201 
202   @retval EFI_SUCCESS           The string was successfully updated.
203 
204   @retval EFI_OUT_OF_RESOURCES  Unable to allocate an output buffer for RowInfoArray or Blt.
205 
206   @retval EFI_INVALID_PARAMETER The String or Blt was NULL.
207 
208   @retval EFI_INVALID_PARAMETER Flags were invalid combination.
209 **/
210 typedef
211 EFI_STATUS
212 (EFIAPI *EFI_HII_STRING_TO_IMAGE)(
213   IN CONST  EFI_HII_FONT_PROTOCOL *This,
214   IN        EFI_HII_OUT_FLAGS     Flags,
215   IN CONST  EFI_STRING            String,
216   IN CONST  EFI_FONT_DISPLAY_INFO *StringInfo,
217   IN OUT    EFI_IMAGE_OUTPUT      **Blt,
218   IN        UINTN                 BltX,
219   IN        UINTN                 BltY,
220   OUT       EFI_HII_ROW_INFO      **RowInfoArray OPTIONAL,
221   OUT       UINTN                 *RowInfoArraySize OPTIONAL,
222   OUT       UINTN                 *ColumnInfoArray OPTIONAL
223   );
224 
225 /**
226 
227   This function renders a string as a bitmap or to the screen
228   and can clip or wrap the string. The bitmap is either supplied
229   by the caller or allocated by the function. The
230   strings are drawn with the font, size and style specified and
231   can be drawn transparently or opaquely. The function can also
232   return information about each row and each character's
233   position on the row. If EFI_HII_OUT_FLAG_CLIP is set, then
234   text will be formatted based only on explicit line breaks, and
235   all pixels that would lie outside the bounding box specified
236   by Width and Height are ignored. The information in the
237   RowInfoArray only describes characters which are at least
238   partially displayed. For the final row, the LineHeight and
239   BaseLine may describe pixels which are outside the limit
240   specified by Height (unless EFI_HII_OUT_FLAG_CLIP_CLEAN_Y is
241   specified) even though those pixels were not drawn. If
242   EFI_HII_OUT_FLAG_CLIP_CLEAN_X is set, then it modifies the
243   behavior of EFI_HII_OUT_FLAG_CLIP so that if a character's
244   right-most on pixel cannot fit, then it will not be drawn at
245   all. This flag requires that EFI_HII_OUT_FLAG_CLIP be set. If
246   EFI_HII_OUT_FLAG_CLIP_CLEAN_Y is set, then it modifies the
247   behavior of EFI_HII_OUT_FLAG_CLIP so that if a row's bottom
248   most pixel cannot fit, then it will not be drawn at all. This
249   flag requires that EFI_HII_OUT_FLAG_CLIP be set. If
250   EFI_HII_OUT_FLAG_WRAP is set, then text will be wrapped at the
251   right-most line-break opportunity prior to a character whose
252   right-most extent would exceed Width. If no line-break
253   opportunity can be found, then the text will behave as if
254   EFI_HII_OUT_FLAG_CLIP_CLEAN_X is set. This flag cannot be used
255   with EFI_HII_OUT_FLAG_CLIP_CLEAN_X. If
256   EFI_HII_OUT_FLAG_TRANSPARENT is set, then BackgroundColor is
257   ignored and all off" pixels in the character's glyph will
258   use the pixel value from Blt. This flag cannot be used if Blt
259   is NULL upon entry. If EFI_HII_IGNORE_IF_NO_GLYPH is set, then
260   characters which have no glyphs are not drawn. Otherwise, they
261   are replaced with Unicode character code 0xFFFD (REPLACEMENT
262   CHARACTER). If EFI_HII_IGNORE_LINE_BREAK is set, then explicit
263   line break characters will be ignored. If
264   EFI_HII_DIRECT_TO_SCREEN is set, then the string will be
265   written directly to the output device specified by Screen.
266   Otherwise the string will be rendered to the bitmap specified
267   by Bitmap.
268 
269 
270   @param This       A pointer to the EFI_HII_FONT_PROTOCOL instance.
271 
272   @param Flags      Describes how the string is to be drawn.
273 
274   @param PackageList
275                     The package list in the HII database to
276                     search for the specified string.
277 
278   @param StringId   The string's id, which is unique within
279                     PackageList.
280 
281   @param Language   Points to the language for the retrieved
282                     string. If NULL, then the current system
283                     language is used.
284 
285   @param StringInfo Points to the string output information,
286                     including the color and font. If NULL, then
287                     the string will be output in the default
288                     system font and color.
289 
290   @param Blt        If this points to a non-NULL on entry, this points
291                     to the image, which is Width pixels wide and
292                     Height pixels high. The string will be drawn onto
293                     this image and EFI_HII_OUT_FLAG_CLIP is implied.
294                     If this points to a NULL on entry, then a buffer
295                     will be allocated to hold the generated image and
296                     the pointer updated on exit. It is the caller's
297                     responsibility to free this buffer.
298 
299   @param BltX, BltY Specifies the offset from the left and top
300                     edge of the output image of the first
301                     character cell in the image.
302 
303   @param RowInfoArray     If this is non-NULL on entry, then on
304                           exit, this will point to an allocated
305                           buffer containing row information and
306                           RowInfoArraySize will be updated to
307                           contain the number of elements. This array
308                           describes the characters which were at
309                           least partially drawn and the heights of
310                           the rows. It is the caller's
311                           responsibility to free this buffer.
312 
313   @param RowInfoArraySize If this is non-NULL on entry, then on
314                           exit it contains the number of
315                           elements in RowInfoArray.
316 
317   @param ColumnInfoArray  If non-NULL, on return it is filled
318                           with the horizontal offset for each
319                           character in the string on the row
320                           where it is displayed. Non-printing
321                           characters will have the offset ~0.
322                           The caller is responsible to allocate
323                           a buffer large enough so that there is
324                           one entry for each character in the
325                           string, not including the
326                           null-terminator. It is possible when
327                           character display is normalized that
328                           some character cells overlap.
329 
330 
331   @retval EFI_SUCCESS           The string was successfully updated.
332 
333   @retval EFI_OUT_OF_RESOURCES  Unable to allocate an output
334                                 buffer for RowInfoArray or Blt.
335 
336   @retval EFI_INVALID_PARAMETER The String, or Blt, or Height, or
337                                 Width was NULL.
338   @retval EFI_INVALID_PARAMETER The Blt or PackageList was NULL.
339   @retval EFI_INVALID_PARAMETER Flags were invalid combination.
340   @retval EFI_NOT_FOUND         The specified PackageList is not in the Database,
341                                 or the stringid is not in the specified PackageList.
342 
343 **/
344 typedef
345 EFI_STATUS
346 (EFIAPI *EFI_HII_STRING_ID_TO_IMAGE)(
347   IN CONST  EFI_HII_FONT_PROTOCOL *This,
348   IN        EFI_HII_OUT_FLAGS     Flags,
349   IN        EFI_HII_HANDLE        PackageList,
350   IN        EFI_STRING_ID         StringId,
351   IN CONST  CHAR8                 *Language,
352   IN CONST  EFI_FONT_DISPLAY_INFO *StringInfo       OPTIONAL,
353   IN OUT    EFI_IMAGE_OUTPUT      **Blt,
354   IN        UINTN                 BltX,
355   IN        UINTN                 BltY,
356   OUT       EFI_HII_ROW_INFO      **RowInfoArray    OPTIONAL,
357   OUT       UINTN                 *RowInfoArraySize OPTIONAL,
358   OUT       UINTN                 *ColumnInfoArray  OPTIONAL
359   );
360 
361 /**
362 
363   Convert the glyph for a single character into a bitmap.
364 
365   @param This       A pointer to the EFI_HII_FONT_PROTOCOL instance.
366 
367   @param Char       The character to retrieve.
368 
369   @param StringInfo Points to the string font and color
370                     information or NULL if the string should use
371                     the default system font and color.
372 
373   @param Blt        This must point to a NULL on entry. A buffer will
374                     be allocated to hold the output and the pointer
375                     updated on exit. It is the caller's responsibility
376                     to free this buffer.
377 
378   @param Baseline   The number of pixels from the bottom of the bitmap
379                     to the baseline.
380 
381 
382   @retval EFI_SUCCESS             The glyph bitmap created.
383 
384   @retval EFI_OUT_OF_RESOURCES    Unable to allocate the output buffer Blt.
385 
386   @retval EFI_WARN_UNKNOWN_GLYPH  The glyph was unknown and was
387                                   replaced with the glyph for
388                                   Unicode character code 0xFFFD.
389 
390   @retval EFI_INVALID_PARAMETER   Blt is NULL, or Width is NULL, or
391                                   Height is NULL
392 
393 
394 **/
395 typedef
396 EFI_STATUS
397 (EFIAPI *EFI_HII_GET_GLYPH)(
398   IN CONST  EFI_HII_FONT_PROTOCOL *This,
399   IN CONST  CHAR16                Char,
400   IN CONST  EFI_FONT_DISPLAY_INFO *StringInfo,
401   OUT       EFI_IMAGE_OUTPUT      **Blt,
402   OUT       UINTN                 *Baseline OPTIONAL
403   );
404 
405 /**
406 
407   This function iterates through fonts which match the specified
408   font, using the specified criteria. If String is non-NULL, then
409   all of the characters in the string must exist in order for a
410   candidate font to be returned.
411 
412   @param This           A pointer to the EFI_HII_FONT_PROTOCOL instance.
413 
414   @param FontHandle     On entry, points to the font handle returned
415                         by a previous call to GetFontInfo() or NULL
416                         to start with the first font. On return,
417                         points to the returned font handle or points
418                         to NULL if there are no more matching fonts.
419 
420   @param StringInfoIn   Upon entry, points to the font to return
421                         information about. If NULL, then the information
422                         about the system default font will be returned.
423 
424   @param  StringInfoOut Upon return, contains the matching font's information.
425                         If NULL, then no information is returned. This buffer
426                         is allocated with a call to the Boot Service AllocatePool().
427                         It is the caller's responsibility to call the Boot
428                         Service FreePool() when the caller no longer requires
429                         the contents of StringInfoOut.
430 
431   @param String         Points to the string which will be tested to
432                         determine if all characters are available. If
433                         NULL, then any font is acceptable.
434 
435   @retval EFI_SUCCESS            Matching font returned successfully.
436 
437   @retval EFI_NOT_FOUND          No matching font was found.
438 
439   @retval EFI_OUT_OF_RESOURCES   There were insufficient resources to complete the request.
440 
441 **/
442 typedef
443 EFI_STATUS
444 (EFIAPI *EFI_HII_GET_FONT_INFO)(
445   IN CONST  EFI_HII_FONT_PROTOCOL *This,
446   IN OUT    EFI_FONT_HANDLE       *FontHandle,
447   IN CONST  EFI_FONT_DISPLAY_INFO *StringInfoIn  OPTIONAL,
448   OUT       EFI_FONT_DISPLAY_INFO **StringInfoOut,
449   IN CONST  EFI_STRING            String OPTIONAL
450   );
451 
452 ///
453 /// The protocol provides the service to retrieve the font informations.
454 ///
455 struct _EFI_HII_FONT_PROTOCOL {
456   EFI_HII_STRING_TO_IMAGE       StringToImage;
457   EFI_HII_STRING_ID_TO_IMAGE    StringIdToImage;
458   EFI_HII_GET_GLYPH             GetGlyph;
459   EFI_HII_GET_FONT_INFO         GetFontInfo;
460 };
461 
462 extern EFI_GUID  gEfiHiiFontProtocolGuid;
463 
464 #endif
465