/** @file
  SimpleFileSystem protocol as defined in the UEFI 2.0 specification.

  The SimpleFileSystem protocol is the programmatic access to the FAT (12,16,32)
  file system specified in UEFI 2.0. It can also be used to abstract a file
  system other than FAT.

  UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.

Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
Portions copyright (c) 2011, Apple Inc. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#pragma once

#include <Protocol/SimplePointer.h>
#include <Protocol/SimpleTextIn.h>
#include <Protocol/SimpleTextInEx.h>
#include <Protocol/GraphicsOutput.h>

#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
 { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }

typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;

typedef
EFI_STATUS
(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
  );

typedef
EFI_STATUS
(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
  UINT32                        Width,
  UINT32                        Height
  );

typedef
EFI_STATUS
(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
  );

typedef
EFI_STATUS
(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
  EFI_KEY_DATA                  *key
  );

typedef
EFI_STATUS
(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE)(
  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsWindows,
  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
  );

typedef
VOID
(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK)(
  IN VOID           *Context,
  IN EFI_KEY_DATA   *KeyData
  );

typedef
EFI_STATUS
(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY)(
  IN EMU_GRAPHICS_WINDOW_PROTOCOL                       *GraphicsWindows,
  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK   CallBack,
  IN VOID                                               *Context
  );

typedef struct {
  UINTN    SourceX;
  UINTN    SourceY;
  UINTN    DestinationX;
  UINTN    DestinationY;
  UINTN    Width;
  UINTN    Height;
  UINTN    Delta;
} EMU_GRAPHICS_WINDOWS__BLT_ARGS;

typedef
EFI_STATUS
(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
  IN  EMU_GRAPHICS_WINDOW_PROTOCOL            *GraphicsWindows,
  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL           *BltBuffer OPTIONAL,
  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION       BltOperation,
  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
  );

typedef
BOOLEAN
(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED)(
  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
  IN  EFI_KEY_DATA                  *KeyData
  );

typedef
EFI_STATUS
(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
  );

typedef
EFI_STATUS
(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
  EFI_SIMPLE_POINTER_STATE      *state
  );

struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
  EMU_GRAPHICS_WINDOWS_SIZE                   Size;
  EMU_GRAPHICS_WINDOWS_CHECK_KEY              CheckKey;
  EMU_GRAPHICS_WINDOWS_KEY_SET_STATE          KeySetState;
  EMU_GRAPHICS_WINDOWS_GET_KEY                GetKey;
  EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY    RegisterKeyNotify;
  EMU_GRAPHICS_WINDOWS_BLT                    Blt;
  EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED         IsKeyPressed;
  EMU_GRAPHICS_WINDOWS_CHECK_POINTER          CheckPointer;
  EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE      GetPointerState;
};

extern EFI_GUID  gEmuGraphicsWindowProtocolGuid;
