CloverBootloader/rEFIt_UEFI/libeg/libeg.h

261 lines
6.9 KiB
C++
Executable File

/*
* libeg/libeg.h
* EFI graphics library header for users
*
* Copyright (c) 2006 Christoph Pfisterer
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the
* distribution.
*
* * Neither the name of Christoph Pfisterer nor the names of the
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef __LIBEG_LIBEG_H__
#define __LIBEG_LIBEG_H__
//#include <Efi.h>
#include "../cpp_foundation/XBool.h"
#include "../cpp_foundation/XString.h"
#include "../cpp_foundation/XStringArray.h"
#include "../cpp_foundation/XBuffer.h"
extern "C" {
#include <Library/OcConfigurationLib.h>
#include <Guid/AppleApfsInfo.h>
}
/* types */
typedef enum {
imNone,
imScale,
imCrop,
imTile
} SCALING;
typedef enum {
FONT_ALFA,
FONT_GRAY,
FONT_LOAD
} FONT_TYPE;
typedef enum {
NoEvents,
Move,
LeftClick,
RightClick,
DoubleClick,
ScrollClick,
ScrollDown,
ScrollUp,
LeftMouseDown,
RightMouseDown,
MouseMove
} MOUSE_EVENT;
typedef enum {
ActionNone = 0,
ActionHelp,
ActionSelect,
ActionEnter,
ActionDeselect,
ActionDestroy,
ActionOptions,
ActionDetails,
ActionFinish,
ActionScrollDown,
ActionScrollUp,
ActionMoveScrollbar,
ActionPageDown,
ActionPageUp,
ActionLight
} ACTION;
typedef struct {
INTN CurrentSelection, LastSelection;
INTN MaxScroll, MaxIndex;
INTN FirstVisible, LastVisible, MaxVisible, MaxFirstVisible;
XBool IsScrolling, PaintAll, PaintSelection;
} SCROLL_STATE;
typedef enum {
BoolValue,
Decimal,
Hex,
ASString,
UNIString,
RadioSwitch,
CheckBit,
} ITEM_TYPE;
class INPUT_ITEM {
public:
ITEM_TYPE ItemType = BoolValue; //string, value, boolean
XBool Valid = false;
UINT8 BValue = 0; // was XBool, but value 2 is sometimes assigned.
//UINT8 Pad8;
UINT32 IValue = 0;
XStringW SValue = XStringW();
UINTN LineShift = 0;
bool operator == (const INPUT_ITEM& other) const
{
if ( !(ItemType == other.ItemType ) ) return false;
if ( !(Valid == other.Valid ) ) return false;
if ( !(BValue == other.BValue ) ) return false;
if ( !(IValue == other.IValue ) ) return false;
if ( !(SValue == other.SValue ) ) return false;
if ( !(LineShift == other.LineShift ) ) return false;
return true;
}
bool operator != (const INPUT_ITEM& other) const { return !(*this == other); }
};
typedef struct {
EFI_STATUS LastStatus = 0;
const EFI_FILE *DirHandle = NULL;
XBool CloseDirHandle = false;
EFI_FILE_INFO *LastFileInfo = NULL;
} REFIT_DIR_ITER;
typedef struct {
UINT8 Flags;
UINT8 StartCHS[3];
UINT8 Type;
UINT8 EndCHS[3];
UINT32 StartLBA;
UINT32 Size;
} MBR_PARTITION_INFO;
typedef enum {
AlignNo,
AlignLeft,
AlignRight,
AlignCenter,
AlignUp,
AlignDown
} ALIGNMENT;
/* This should be compatible with EFI_UGA_PIXEL */
typedef struct {
UINT8 b, g, r, a;
} EG_PIXEL;
/*
typedef struct {
UINT8 Blue;
UINT8 Green;
UINT8 Red;
UINT8 Reserved;
} EFI_GRAPHICS_OUTPUT_BLT_PIXEL;
typedef union {
EFI_GRAPHICS_OUTPUT_BLT_PIXEL Pixel;
UINT32 Raw;
} EFI_GRAPHICS_OUTPUT_BLT_PIXEL_UNION;
*/
#ifdef __cplusplus
class EG_RECT {
public:
INTN XPos;
INTN YPos;
INTN Width;
INTN Height;
EG_RECT() : XPos(0), YPos(0), Width(0), Height(0) {};
EG_RECT(INTN x, INTN y, INTN w, INTN h) : XPos(x), YPos(y), Width(w), Height(h) { }
EG_RECT(const EG_RECT& other) : XPos(other.XPos), YPos(other.YPos), Width(other.Width), Height(other.Height) { }
const EG_RECT& operator = (const EG_RECT& other) { XPos = other.XPos; YPos = other.YPos; Width = other.Width; Height = other.Height; return *this; }
bool operator == (const EG_RECT& other) { return XPos == other.XPos && YPos == other.YPos && Width == other.Width && Height == other.Height; }
bool operator != (const EG_RECT& other) { return !(*this == other); }
};
#else
typedef struct EG_RECT {
INTN XPos;
INTN YPos;
INTN Width;
INTN Height;
} EG_RECT;
#endif
#define TEXT_YMARGIN (2)
#define TEXT_XMARGIN (8)
#define EG_EIPIXELMODE_GRAY (0)
#define EG_EIPIXELMODE_GRAY_ALPHA (1)
#define EG_EIPIXELMODE_COLOR (2)
#define EG_EIPIXELMODE_COLOR_ALPHA (3)
#define EG_EIPIXELMODE_ALPHA (4)
#define EG_MAX_EIPIXELMODE EG_EIPIXELMODE_ALPHA
#define EG_EICOMPMODE_NONE (0)
#define EG_EICOMPMODE_RLE (1)
#define EG_EICOMPMODE_EFICOMPRESS (2)
/* functions */
void egInitScreen(IN XBool SetMaxResolution);
void egDumpGOPVideoModes(void);
//EFI_STATUS egSetScreenResolution(IN CHAR16 *WidthHeight);
//EFI_STATUS egSetMaxResolution(void);
EFI_STATUS egSetMode(INT32 Next);
void egGetScreenSize(OUT INTN *ScreenWidth, OUT INTN *ScreenHeight);
XString8 egScreenDescription(void);
XBool egHasGraphicsMode(void);
XBool egIsGraphicsModeEnabled(void);
void egSetGraphicsModeEnabled(IN XBool Enable);
// NOTE: Even when egHasGraphicsMode() returns false, you should
// call egSetGraphicsModeEnabled(false) to ensure the system
// is running in text mode. egHasGraphicsMode() only determines
// if libeg can draw to the screen in graphics mode.
EFI_STATUS egLoadFile(const EFI_FILE* BaseDir, IN CONST CHAR16 *FileName,
OUT UINT8 **FileData, OUT UINTN *FileDataLength);
EFI_STATUS egSaveFile(const EFI_FILE* BaseDir OPTIONAL, IN CONST CHAR16 *FileName,
IN CONST void *FileData, IN UINTN FileDataLength);
EFI_STATUS egMkDir(const EFI_FILE* BaseDir OPTIONAL, IN CONST CHAR16 *DirName);
EFI_STATUS egFindESP(OUT EFI_FILE** RootDir);
void egClearScreen(IN const void *Color);
EFI_STATUS egScreenShot(void);
#endif /* __LIBEG_LIBEG_H__ */
/* EOF */