mirror of
https://github.com/Metabolix/HackBGRT.git
synced 2026-09-27 14:31:21 -07:00
Improve BMP handling
This commit is contained in:
+49
-21
@@ -194,6 +194,44 @@ static ACPI_BGRT* HandleAcpiTables(enum HackBGRT_action action, ACPI_BGRT* bgrt)
|
|||||||
return bgrt;
|
return bgrt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a BMP with the given size and color.
|
||||||
|
*
|
||||||
|
* @param w The width.
|
||||||
|
* @param h The height.
|
||||||
|
* @param r The red component.
|
||||||
|
* @param g The green component.
|
||||||
|
* @param b The blue component.
|
||||||
|
* @return The generated BMP, or 0 on failure.
|
||||||
|
*/
|
||||||
|
static BMP* MakeBMP(int w, int h, UINT8 r, UINT8 g, UINT8 b) {
|
||||||
|
BMP* bmp = 0;
|
||||||
|
BS->AllocatePool(EfiBootServicesData, 54 + w * h * 4, (void**) &bmp);
|
||||||
|
if (!bmp) {
|
||||||
|
Print(L"HackBGRT: Failed to allocate a blank BMP!\n");
|
||||||
|
BS->Stall(1000000);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*bmp = (BMP) {
|
||||||
|
.magic_BM = { 'B', 'M' },
|
||||||
|
.file_size = 54 + w * h * 4,
|
||||||
|
.pixel_data_offset = 54,
|
||||||
|
.dib_header_size = 40,
|
||||||
|
.width = w,
|
||||||
|
.height = h,
|
||||||
|
.planes = 1,
|
||||||
|
.bpp = 32,
|
||||||
|
};
|
||||||
|
UINT8* data = (UINT8*) bmp + bmp->pixel_data_offset;
|
||||||
|
for (int y = 0; y < h; ++y) for (int x = 0; x < w; ++x) {
|
||||||
|
*data++ = b;
|
||||||
|
*data++ = g;
|
||||||
|
*data++ = r;
|
||||||
|
*data++ = 0;
|
||||||
|
}
|
||||||
|
return bmp;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load a bitmap or generate a black one.
|
* Load a bitmap or generate a black one.
|
||||||
*
|
*
|
||||||
@@ -202,32 +240,22 @@ static ACPI_BGRT* HandleAcpiTables(enum HackBGRT_action action, ACPI_BGRT* bgrt)
|
|||||||
* @return The loaded BMP, or 0 if not available.
|
* @return The loaded BMP, or 0 if not available.
|
||||||
*/
|
*/
|
||||||
static BMP* LoadBMP(EFI_FILE_HANDLE root_dir, const CHAR16* path) {
|
static BMP* LoadBMP(EFI_FILE_HANDLE root_dir, const CHAR16* path) {
|
||||||
BMP* bmp = 0;
|
|
||||||
if (!path) {
|
if (!path) {
|
||||||
BS->AllocatePool(EfiBootServicesData, 58, (void**) &bmp);
|
return MakeBMP(1, 1, 0, 0, 0); // empty path = black image
|
||||||
if (!bmp) {
|
|
||||||
Print(L"HackBGRT: Failed to allocate a blank BMP!\n");
|
|
||||||
BS->Stall(1000000);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
CopyMem(
|
|
||||||
bmp,
|
|
||||||
"\x42\x4d\x3a\x00\x00\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00"
|
|
||||||
"\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x18\x00\x00\x00"
|
|
||||||
"\x00\x00\x04\x00\x00\x00\x13\x0b\x00\x00\x13\x0b\x00\x00\x00\x00"
|
|
||||||
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
|
|
||||||
58
|
|
||||||
);
|
|
||||||
return bmp;
|
|
||||||
}
|
}
|
||||||
Debug(L"HackBGRT: Loading %s.\n", path);
|
Debug(L"HackBGRT: Loading %s.\n", path);
|
||||||
bmp = LoadFile(root_dir, path, 0);
|
UINTN size = 0;
|
||||||
if (!bmp) {
|
BMP* bmp = LoadFile(root_dir, path, &size);
|
||||||
|
if (bmp) {
|
||||||
|
if (size >= bmp->file_size && CompareMem(bmp, "BM", 2) == 0 && bmp->file_size - bmp->pixel_data_offset > 4 && bmp->width && bmp->height && (bmp->bpp == 32 || bmp->bpp == 24) && bmp->compression == 0) {
|
||||||
|
return bmp;
|
||||||
|
}
|
||||||
|
Print(L"HackBGRT: Invalid BMP (%s)!\n", path);
|
||||||
|
} else {
|
||||||
Print(L"HackBGRT: Failed to load BMP (%s)!\n", path);
|
Print(L"HackBGRT: Failed to load BMP (%s)!\n", path);
|
||||||
BS->Stall(1000000);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
return bmp;
|
BS->Stall(1000000);
|
||||||
|
return MakeBMP(16, 16, 255, 0, 0); // error = red image
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -52,6 +52,12 @@ typedef struct {
|
|||||||
UINT32 height;
|
UINT32 height;
|
||||||
UINT16 planes;
|
UINT16 planes;
|
||||||
UINT16 bpp;
|
UINT16 bpp;
|
||||||
|
UINT32 compression;
|
||||||
|
UINT32 image_size;
|
||||||
|
UINT32 x_pixels_per_meter;
|
||||||
|
UINT32 y_pixels_per_meter;
|
||||||
|
UINT32 colors_used;
|
||||||
|
UINT32 important_colors;
|
||||||
} BMP;
|
} BMP;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user