前面实验了颜色填充,这里实验一下屏幕的拷贝。测试很简单,就是屏幕上一个区域的内容copy到另外的位置.
代码如下:
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/ShellCEntryLib.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <time.h>
#include <Protocol/EfiShell.h>
#include <Library/ShellLib.h>
#include <Protocol/SimpleFileSystem.h>
#include <Protocol/BlockIo.h>
#include <Library/DevicePathLib.h>
#include <Library/HandleParsingLib.h>
#include <Library/SortLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/BaseMemoryLib.h>
#include <Protocol/LoadedImage.h>
extern EFI_BOOT_SERVICES *gBS;
extern EFI_SYSTEM_TABLE *gST;
extern EFI_RUNTIME_SERVICES *gRT;
extern EFI_SHELL_ENVIRONMENT2 *mEfiShellEnvironment2;
extern EFI_HANDLE gImageHandle;
static EFI_GUID GraphicsOutputProtocolGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
static EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput = NULL;
//Copied from C\MdePkg\Include\Protocol\UgaDraw.h
typedef struct {
UINT8 Blue;
UINT8 Green;
UINT8 Red;
UINT8 Reserved;
} EFI_UGA_PIXEL;
int
EFIAPI
main (
IN int Argc,
IN char **Argv
)
{
EFI_STATUS Status;
UINTN i;
Status = gBS->LocateProtocol(&GraphicsOutputProtocolGuid, NULL, (VOID **) &GraphicsOutput);
if (EFI_ERROR(Status)) {
GraphicsOutput = NULL;
Print(L"Loading Graphics_Output_Protocol error!\n");
return EFI_SUCCESS;
}
for (i=0;i<100;i++) {
GraphicsOutput->Blt(GraphicsOutput, NULL, EfiBltVideoToVideo,
rand() % (GraphicsOutput->Mode->Info->HorizontalResolution-100),
rand() % (GraphicsOutput->Mode->Info->VerticalResolution-100) ,
rand() % (GraphicsOutput->Mode->Info->HorizontalResolution-100),
rand() % (GraphicsOutput->Mode->Info->VerticalResolution-100),
100, 100, 0);
gBS->Stall(50000);
}
return EFI_SUCCESS;
}
运行结果
工作视频:
http://www.tudou.com/programs/view/7gRxW6SqBKg/?resourceId=414535982_06_02_99
完整代码下载
当然,这个实验有些让人看不清楚,修改上面的程序,直接在屏幕上画色块
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/ShellCEntryLib.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <time.h>
#include <Protocol/EfiShell.h>
#include <Library/ShellLib.h>
#include <Protocol/SimpleFileSystem.h>
#include <Protocol/BlockIo.h>
#include <Library/DevicePathLib.h>
#include <Library/HandleParsingLib.h>
#include <Library/SortLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/BaseMemoryLib.h>
#include <Protocol/LoadedImage.h>
extern EFI_BOOT_SERVICES *gBS;
extern EFI_SYSTEM_TABLE *gST;
extern EFI_RUNTIME_SERVICES *gRT;
extern EFI_SHELL_ENVIRONMENT2 *mEfiShellEnvironment2;
extern EFI_HANDLE gImageHandle;
static EFI_GUID GraphicsOutputProtocolGuid = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
static EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput = NULL;
//Copied from C\MdePkg\Include\Protocol\UgaDraw.h
typedef struct {
UINT8 Blue;
UINT8 Green;
UINT8 Red;
UINT8 Reserved;
} EFI_UGA_PIXEL;
int
EFIAPI
main (
IN int Argc,
IN char **Argv
)
{
EFI_STATUS Status;
UINTN i;
EFI_GRAPHICS_OUTPUT_BLT_PIXEL FillColor;
Status = gBS->LocateProtocol(&GraphicsOutputProtocolGuid, NULL, (VOID **) &GraphicsOutput);
if (EFI_ERROR(Status)) {
GraphicsOutput = NULL;
Print(L"Loading Graphics_Output_Protocol error!\n");
return EFI_SUCCESS;
}
for (i=0;i<100;i++) {
FillColor.Blue=rand() % 256;
FillColor.Red=rand() % 256;
FillColor.Green=rand() % 256;
GraphicsOutput->Blt(GraphicsOutput, &FillColor, EfiBltVideoFill,
0,
0 ,
rand() % (GraphicsOutput->Mode->Info->HorizontalResolution-100),
rand() % (GraphicsOutput->Mode->Info->VerticalResolution-100),
100, 100, 0);
gBS->Stall(50000);
}
return EFI_SUCCESS;
}
运行结果
工作视频:
http://www.tudou.com/programs/view/VSbFaN1XBZc/?resourceId=414535982_06_02_99
完整代码下载
参考:
1. UEFI SPEC 2.4 P498
2. 本文参考 https://github.com/chengs 的代码

















