/** @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

**/

#ifndef _EMU_UGA_IO_H_
#define _EMU_UGA_IO_H_

#include <Protocol/SimplePointer.h>
#include <Protocol/SimpleTextIn.h>
#include <Protocol/SimpleTextInEx.h>
#include <Protocol/UgaDraw.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 *Uga
  );

typedef
EFI_STATUS
(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
  UINT32                        Width,
  UINT32                        Height
  );

typedef
EFI_STATUS
(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
  );

typedef
EFI_STATUS
(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
  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_UGA_PIXEL                           *BltBuffer OPTIONAL,
  IN  EFI_UGA_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;

#endif
