| /** @file | |
| Example program using BltLib | |
| Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR> | |
| This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #include <Uefi.h> | |
| #include <Library/BltLib.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/UefiLib.h> | |
| #include <Library/UefiApplicationEntryPoint.h> | |
| #include <Library/UefiBootServicesTableLib.h> | |
| UINT64 | |
| ReadTimestamp ( | |
| VOID | |
| ) | |
| { | |
| #if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) | |
| return AsmReadTsc (); | |
| #elif defined (MDE_CPU_IPF) | |
| return AsmReadItc (); | |
| #else | |
| #error ReadTimestamp not supported for this architecture! | |
| #endif | |
| } | |
| UINT32 | |
| Rand32 ( | |
| VOID | |
| ) | |
| { | |
| UINTN Found; | |
| INTN Bits; | |
| UINT64 Tsc1; | |
| UINT64 Tsc2; | |
| UINT64 TscBits; | |
| UINT32 R32; | |
| R32 = 0; | |
| Found = 0; | |
| Tsc1 = ReadTimestamp (); | |
| Tsc2 = ReadTimestamp (); | |
| do { | |
| Tsc2 = ReadTimestamp (); | |
| TscBits = Tsc2 ^ Tsc1; | |
| Bits = HighBitSet64 (TscBits); | |
| if (Bits > 0) { | |
| Bits = Bits - 1; | |
| } | |
| R32 = (UINT32)((R32 << Bits) | | |
| RShiftU64 (LShiftU64 (TscBits, (UINTN) (64 - Bits)), (UINTN) (64 - Bits))); | |
| Found = Found + Bits; | |
| } while (Found < 32); | |
| return R32; | |
| } | |
| VOID | |
| TestFills ( | |
| VOID | |
| ) | |
| { | |
| EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color; | |
| UINTN Loop; | |
| UINTN X; | |
| UINTN Y; | |
| UINTN W; | |
| UINTN H; | |
| UINTN Width; | |
| UINTN Height; | |
| BltLibGetSizes (&Width, &Height); | |
| for (Loop = 0; Loop < 10000; Loop++) { | |
| W = Width - (Rand32 () % Width); | |
| H = Height - (Rand32 () % Height); | |
| if (W != Width) { | |
| X = Rand32 () % (Width - W); | |
| } else { | |
| X = 0; | |
| } | |
| if (H != Height) { | |
| Y = Rand32 () % (Height - H); | |
| } else { | |
| Y = 0; | |
| } | |
| *(UINT32*) (&Color) = Rand32 () & 0xffffff; | |
| BltLibVideoFill (&Color, X, Y, W, H); | |
| } | |
| } | |
| VOID | |
| TestColor1 ( | |
| VOID | |
| ) | |
| { | |
| EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color; | |
| UINTN X; | |
| UINTN Y; | |
| UINTN Width; | |
| UINTN Height; | |
| BltLibGetSizes (&Width, &Height); | |
| *(UINT32*) (&Color) = 0; | |
| for (Y = 0; Y < Height; Y++) { | |
| for (X = 0; X < Width; X++) { | |
| Color.Red = (UINT8) ((X * 0x100) / Width); | |
| Color.Green = (UINT8) ((Y * 0x100) / Height); | |
| Color.Blue = (UINT8) ((Y * 0x100) / Height); | |
| BltLibVideoFill (&Color, X, Y, 1, 1); | |
| } | |
| } | |
| } | |
| UINT32 | |
| Uint32SqRt ( | |
| IN UINT32 Uint32 | |
| ) | |
| { | |
| UINT32 Mask; | |
| UINT32 SqRt; | |
| UINT32 SqRtMask; | |
| UINT32 Squared; | |
| if (Uint32 == 0) { | |
| return 0; | |
| } | |
| for (SqRt = 0, Mask = (UINT32) (1 << (HighBitSet32 (Uint32) / 2)); | |
| Mask != 0; | |
| Mask = Mask >> 1 | |
| ) { | |
| SqRtMask = SqRt | Mask; | |
| //DEBUG ((EFI_D_INFO, "Uint32=0x%x SqRtMask=0x%x\n", Uint32, SqRtMask)); | |
| Squared = (UINT32) (SqRtMask * SqRtMask); | |
| if (Squared > Uint32) { | |
| continue; | |
| } else if (Squared < Uint32) { | |
| SqRt = SqRtMask; | |
| } else { | |
| return SqRtMask; | |
| } | |
| } | |
| return SqRt; | |
| } | |
| UINT32 | |
| Uint32Dist ( | |
| IN UINTN X, | |
| IN UINTN Y | |
| ) | |
| { | |
| return Uint32SqRt ((UINT32) ((X * X) + (Y * Y))); | |
| } | |
| UINT8 | |
| GetTriColor ( | |
| IN UINTN ColorDist, | |
| IN UINTN TriWidth | |
| ) | |
| { | |
| return (UINT8) (((TriWidth - ColorDist) * 0x100) / TriWidth); | |
| //return (((TriWidth * TriWidth - ColorDist * ColorDist) * 0x100) / (TriWidth * TriWidth)); | |
| } | |
| VOID | |
| TestColor ( | |
| VOID | |
| ) | |
| { | |
| EFI_GRAPHICS_OUTPUT_BLT_PIXEL Color; | |
| UINTN X, Y; | |
| UINTN X1, X2, X3; | |
| UINTN Y1, Y2; | |
| UINTN LineWidth, TriWidth, ScreenWidth; | |
| UINTN TriHeight, ScreenHeight; | |
| UINT32 ColorDist; | |
| BltLibGetSizes (&ScreenWidth, &ScreenHeight); | |
| *(UINT32*) (&Color) = 0; | |
| BltLibVideoFill (&Color, 0, 0, ScreenWidth, ScreenHeight); | |
| TriWidth = (UINTN) DivU64x32 ( | |
| MultU64x32 (11547005, (UINT32) ScreenHeight), | |
| 10000000 | |
| ); | |
| TriHeight = (UINTN) DivU64x32 ( | |
| MultU64x32 (8660254, (UINT32) ScreenWidth), | |
| 10000000 | |
| ); | |
| if (TriWidth > ScreenWidth) { | |
| DEBUG ((EFI_D_INFO, "TriWidth at %d was too big\n", TriWidth)); | |
| TriWidth = ScreenWidth; | |
| } else if (TriHeight > ScreenHeight) { | |
| DEBUG ((EFI_D_INFO, "TriHeight at %d was too big\n", TriHeight)); | |
| TriHeight = ScreenHeight; | |
| } | |
| DEBUG ((EFI_D_INFO, "Triangle Width: %d; Height: %d\n", TriWidth, TriHeight)); | |
| X1 = (ScreenWidth - TriWidth) / 2; | |
| X3 = X1 + TriWidth - 1; | |
| X2 = (X1 + X3) / 2; | |
| Y2 = (ScreenHeight - TriHeight) / 2; | |
| Y1 = Y2 + TriHeight - 1; | |
| for (Y = Y2; Y <= Y1; Y++) { | |
| LineWidth = | |
| (UINTN) DivU64x32 ( | |
| MultU64x32 (11547005, (UINT32) (Y - Y2)), | |
| 20000000 | |
| ); | |
| for (X = X2 - LineWidth; X < (X2 + LineWidth); X++) { | |
| ColorDist = Uint32Dist(X - X1, Y1 - Y); | |
| Color.Red = GetTriColor (ColorDist, TriWidth); | |
| ColorDist = Uint32Dist((X < X2) ? X2 - X : X - X2, Y - Y2); | |
| Color.Green = GetTriColor (ColorDist, TriWidth); | |
| ColorDist = Uint32Dist(X3 - X, Y1 - Y); | |
| Color.Blue = GetTriColor (ColorDist, TriWidth); | |
| BltLibVideoFill (&Color, X, Y, 1, 1); | |
| } | |
| } | |
| } | |
| /** | |
| The user Entry Point for Application. The user code starts with this function | |
| as the real entry point for the application. | |
| @param[in] ImageHandle The firmware allocated handle for the EFI image. | |
| @param[in] SystemTable A pointer to the EFI System Table. | |
| @retval EFI_SUCCESS The entry point is executed successfully. | |
| @retval other Some error occurs when executing this entry point. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| UefiMain ( | |
| IN EFI_HANDLE ImageHandle, | |
| IN EFI_SYSTEM_TABLE *SystemTable | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop; | |
| Status = gBS->HandleProtocol ( | |
| gST->ConsoleOutHandle, | |
| &gEfiGraphicsOutputProtocolGuid, | |
| (VOID **) &Gop | |
| ); | |
| if (EFI_ERROR (Status)) { | |
| return Status; | |
| } | |
| Status = BltLibConfigure ( | |
| (VOID*)(UINTN) Gop->Mode->FrameBufferBase, | |
| Gop->Mode->Info | |
| ); | |
| if (EFI_ERROR (Status)) { | |
| return Status; | |
| } | |
| TestFills (); | |
| TestColor (); | |
| return EFI_SUCCESS; | |
| } |