+#define EFI_LEFT_LOGO_MODIFIER 0x0027\r
+#define EFI_RIGHT_LOGO_MODIFIER 0x0028\r
+#define EFI_MENU_MODIFIER 0x0029\r
+\r
+///\r
+/// Animation IFR opcode\r
+///\r
+typedef struct _EFI_IFR_ANIMATION {\r
+ ///\r
+ /// Standard opcode header, where Header.OpCode is\r
+ /// EFI_IFR_ANIMATION_OP.\r
+ ///\r
+ EFI_IFR_OP_HEADER Header;\r
+ ///\r
+ /// Animation identifier in the HII database.\r
+ ///\r
+ EFI_ANIMATION_ID Id;\r
+} EFI_IFR_ANIMATION;\r
+\r
+///\r
+/// HII animation package header.\r
+///\r
+typedef struct _EFI_HII_ANIMATION_PACKAGE_HDR {\r
+ ///\r
+ /// Standard package header, where Header.Type = EFI_HII_PACKAGE_ANIMATIONS.\r
+ ///\r
+ EFI_HII_PACKAGE_HEADER Header;\r
+ ///\r
+ /// Offset, relative to this header, of the animation information. If\r
+ /// this is zero, then there are no animation sequences in the package.\r
+ ///\r
+ UINT32 AnimationInfoOffset;\r
+} EFI_HII_ANIMATION_PACKAGE_HDR;\r
+\r
+///\r
+/// Animation information is encoded as a series of blocks,\r
+/// with each block prefixed by a single byte header EFI_HII_ANIMATION_BLOCK.\r
+///\r
+typedef struct _EFI_HII_ANIMATION_BLOCK {\r
+ UINT8 BlockType;\r
+ //UINT8 BlockBody[];\r
+} EFI_HII_ANIMATION_BLOCK;\r
+\r
+///\r
+/// Animation block types.\r
+///\r
+#define EFI_HII_AIBT_END 0x00\r
+#define EFI_HII_AIBT_OVERLAY_IMAGES 0x10\r
+#define EFI_HII_AIBT_CLEAR_IMAGES 0x11\r
+#define EFI_HII_AIBT_RESTORE_SCRN 0x12\r
+#define EFI_HII_AIBT_OVERLAY_IMAGES_LOOP 0x18\r
+#define EFI_HII_AIBT_CLEAR_IMAGES_LOOP 0x19\r
+#define EFI_HII_AIBT_RESTORE_SCRN_LOOP 0x1A\r
+#define EFI_HII_AIBT_DUPLICATE 0x20\r
+#define EFI_HII_AIBT_SKIP2 0x21\r
+#define EFI_HII_AIBT_SKIP1 0x22\r
+#define EFI_HII_AIBT_EXT1 0x30\r
+#define EFI_HII_AIBT_EXT2 0x31\r
+#define EFI_HII_AIBT_EXT4 0x32\r
+\r
+///\r
+/// Extended block headers used for variable sized animation records\r
+/// which need an explicit length.\r
+///\r
+\r
+typedef struct _EFI_HII_AIBT_EXT1_BLOCK {\r
+ ///\r
+ /// Standard animation header, where Header.BlockType = EFI_HII_AIBT_EXT1.\r
+ ///\r
+ EFI_HII_ANIMATION_BLOCK Header;\r
+ ///\r
+ /// The block type.\r
+ ///\r
+ UINT8 BlockType2;\r
+ ///\r
+ /// Size of the animation block, in bytes, including the animation block header.\r
+ ///\r
+ UINT8 Length;\r
+} EFI_HII_AIBT_EXT1_BLOCK;\r
+\r
+typedef struct _EFI_HII_AIBT_EXT2_BLOCK {\r
+ ///\r
+ /// Standard animation header, where Header.BlockType = EFI_HII_AIBT_EXT2.\r
+ ///\r
+ EFI_HII_ANIMATION_BLOCK Header;\r
+ ///\r
+ /// The block type\r
+ ///\r
+ UINT8 BlockType2;\r
+ ///\r
+ /// Size of the animation block, in bytes, including the animation block header.\r
+ ///\r
+ UINT16 Length;\r
+} EFI_HII_AIBT_EXT2_BLOCK;\r
+\r
+typedef struct _EFI_HII_AIBT_EXT4_BLOCK {\r
+ ///\r
+ /// Standard animation header, where Header.BlockType = EFI_HII_AIBT_EXT4.\r
+ ///\r
+ EFI_HII_ANIMATION_BLOCK Header;\r
+ ///\r
+ /// The block type\r
+ ///\r
+ UINT8 BlockType2;\r
+ ///\r
+ /// Size of the animation block, in bytes, including the animation block header.\r
+ ///\r
+ UINT32 Length;\r
+} EFI_HII_AIBT_EXT4_BLOCK;\r
+\r
+typedef struct _EFI_HII_ANIMATION_CELL {\r
+ ///\r
+ /// The X offset from the upper left hand corner of the logical\r
+ /// window to position the indexed image.\r
+ ///\r
+ UINT16 OffsetX;\r
+ ///\r
+ /// The Y offset from the upper left hand corner of the logical\r
+ /// window to position the indexed image.\r
+ ///\r
+ UINT16 OffsetY;\r
+ ///\r
+ /// The image to display at the specified offset from the upper left\r
+ /// hand corner of the logical window.\r
+ ///\r
+ EFI_IMAGE_ID ImageId;\r
+ ///\r
+ /// The number of milliseconds to delay after displaying the indexed\r
+ /// image and before continuing on to the next linked image. If value\r
+ /// is zero, no delay.\r
+ ///\r
+ UINT16 Delay;\r
+} EFI_HII_ANIMATION_CELL;\r
+\r
+///\r
+/// An animation block to describe an animation sequence that does not cycle, and\r
+/// where one image is simply displayed over the previous image.\r
+///\r
+typedef struct _EFI_HII_AIBT_OVERLAY_IMAGES_BLOCK {\r
+ ///\r
+ /// This is image that is to be reference by the image protocols, if the\r
+ /// animation function is not supported or disabled. This image can\r
+ /// be one particular image from the animation sequence (if any one\r
+ /// of the animation frames has a complete image) or an alternate\r
+ /// image that can be displayed alone. If the value is zero, no image\r
+ /// is displayed.\r
+ ///\r
+ EFI_IMAGE_ID DftImageId;\r
+ ///\r
+ /// The overall width of the set of images (logical window width).\r
+ ///\r
+ UINT16 Width;\r
+ ///\r
+ /// The overall height of the set of images (logical window height).\r
+ ///\r
+ UINT16 Height;\r
+ ///\r
+ /// The number of EFI_HII_ANIMATION_CELL contained in the\r
+ /// animation sequence.\r
+ ///\r
+ UINT16 CellCount;\r
+ ///\r
+ /// An array of CellCount animation cells.\r
+ ///\r
+ EFI_HII_ANIMATION_CELL AnimationCell[1];\r
+} EFI_HII_AIBT_OVERLAY_IMAGES_BLOCK;\r
+\r
+///\r
+/// An animation block to describe an animation sequence that does not cycle,\r
+/// and where the logical window is cleared to the specified color before\r
+/// the next image is displayed.\r
+///\r
+typedef struct _EFI_HII_AIBT_CLEAR_IMAGES_BLOCK {\r
+ ///\r
+ /// This is image that is to be reference by the image protocols, if the\r
+ /// animation function is not supported or disabled. This image can\r
+ /// be one particular image from the animation sequence (if any one\r
+ /// of the animation frames has a complete image) or an alternate\r
+ /// image that can be displayed alone. If the value is zero, no image\r
+ /// is displayed.\r
+ ///\r
+ EFI_IMAGE_ID DftImageId;\r
+ ///\r
+ /// The overall width of the set of images (logical window width).\r
+ ///\r
+ UINT16 Width;\r
+ ///\r
+ /// The overall height of the set of images (logical window height).\r
+ ///\r
+ UINT16 Height;\r
+ ///\r
+ /// The number of EFI_HII_ANIMATION_CELL contained in the\r
+ /// animation sequence.\r
+ ///\r
+ UINT16 CellCount;\r
+ ///\r
+ /// The color to clear the logical window to before displaying the\r
+ /// indexed image.\r
+ ///\r
+ EFI_HII_RGB_PIXEL BackgndColor;\r
+ ///\r
+ /// An array of CellCount animation cells.\r
+ ///\r
+ EFI_HII_ANIMATION_CELL AnimationCell[1];\r
+} EFI_HII_AIBT_CLEAR_IMAGES_BLOCK;\r
+\r
+///\r
+/// An animation block to describe an animation sequence that does not cycle,\r
+/// and where the screen is restored to the original state before the next\r
+/// image is displayed.\r
+///\r
+typedef struct _EFI_HII_AIBT_RESTORE_SCRN_BLOCK {\r
+ ///\r
+ /// This is image that is to be reference by the image protocols, if the\r
+ /// animation function is not supported or disabled. This image can\r
+ /// be one particular image from the animation sequence (if any one\r
+ /// of the animation frames has a complete image) or an alternate\r
+ /// image that can be displayed alone. If the value is zero, no image\r
+ /// is displayed.\r
+ ///\r
+ EFI_IMAGE_ID DftImageId;\r
+ ///\r
+ /// The overall width of the set of images (logical window width).\r
+ ///\r
+ UINT16 Width;\r
+ ///\r
+ /// The overall height of the set of images (logical window height).\r
+ ///\r
+ UINT16 Height;\r
+ ///\r
+ /// The number of EFI_HII_ANIMATION_CELL contained in the\r
+ /// animation sequence.\r
+ ///\r
+ UINT16 CellCount;\r
+ ///\r
+ /// An array of CellCount animation cells.\r
+ ///\r
+ EFI_HII_ANIMATION_CELL AnimationCell[1];\r
+} EFI_HII_AIBT_RESTORE_SCRN_BLOCK;\r
+\r
+///\r
+/// An animation block to describe an animation sequence that continuously cycles,\r
+/// and where one image is simply displayed over the previous image.\r
+///\r
+typedef EFI_HII_AIBT_OVERLAY_IMAGES_BLOCK EFI_HII_AIBT_OVERLAY_IMAGES_LOOP_BLOCK;\r
+\r
+///\r
+/// An animation block to describe an animation sequence that continuously cycles,\r
+/// and where the logical window is cleared to the specified color before\r
+/// the next image is displayed.\r
+///\r
+typedef EFI_HII_AIBT_CLEAR_IMAGES_BLOCK EFI_HII_AIBT_CLEAR_IMAGES_LOOP_BLOCK;\r
+\r
+///\r
+/// An animation block to describe an animation sequence that continuously cycles,\r
+/// and where the screen is restored to the original state before\r
+/// the next image is displayed.\r
+///\r
+typedef EFI_HII_AIBT_RESTORE_SCRN_BLOCK EFI_HII_AIBT_RESTORE_SCRN_LOOP_BLOCK;\r
+\r
+///\r
+/// Assigns a new character value to a previously defined animation sequence.\r
+///\r
+typedef struct _EFI_HII_AIBT_DUPLICATE_BLOCK {\r
+ ///\r
+ /// The previously defined animation ID with the exact same\r
+ /// animation information.\r
+ ///\r
+ EFI_ANIMATION_ID AnimationId;\r
+} EFI_HII_AIBT_DUPLICATE_BLOCK;\r
+\r
+///\r
+/// Skips animation IDs.\r
+///\r
+typedef struct _EFI_HII_AIBT_SKIP1_BLOCK {\r
+ ///\r
+ /// The unsigned 8-bit value to add to AnimationIdCurrent.\r
+ ///\r
+ UINT8 SkipCount;\r
+} EFI_HII_AIBT_SKIP1_BLOCK;\r
+\r
+///\r
+/// Skips animation IDs.\r
+///\r
+typedef struct _EFI_HII_AIBT_SKIP2_BLOCK {\r
+ ///\r
+ /// The unsigned 16-bit value to add to AnimationIdCurrent.\r
+ ///\r
+ UINT16 SkipCount;\r
+} EFI_HII_AIBT_SKIP2_BLOCK;\r
+\r