[fix] Draw effect target
This commit is contained in:
@@ -1,15 +1,37 @@
|
||||
// GFX 存在的意义是什么?
|
||||
// 每一次想要draw pixel,都需要传入GOP的各种参数,
|
||||
// 加入 GFX 后,GOP 的context就是全局的,可以直接用
|
||||
// 而不用显示传递参数到draw的函数里
|
||||
|
||||
#include <graphics/context.h>
|
||||
|
||||
gfx_context g_gfx;
|
||||
draw_target g_draw_target;
|
||||
|
||||
void gfx_init(EFI_GRAPHICS_OUTPUT_PROTOCOL *GOP) {
|
||||
g_gfx.GOP = GOP;
|
||||
g_gfx.hr = GOP->Mode->Info->HorizontalResolution;
|
||||
g_gfx.vr = GOP->Mode->Info->VerticalResolution;
|
||||
g_gfx.base = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) GOP->Mode->FrameBufferBase;
|
||||
|
||||
g_draw_target.buf = g_gfx.base;
|
||||
g_draw_target.w = g_gfx.hr;
|
||||
g_draw_target.h = g_gfx.vr;
|
||||
}
|
||||
|
||||
void gfx_clear(void) {
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL black = {0, 0, 0, 0};
|
||||
g_gfx.GOP->Blt(g_gfx.GOP, &black, EfiBltVideoFill, 0, 0, 0, 0, g_gfx.hr, g_gfx.vr, 0);
|
||||
}
|
||||
|
||||
void draw_set_target(EFI_GRAPHICS_OUTPUT_BLT_PIXEL *buf, unsigned int w, unsigned int h) {
|
||||
g_draw_target.buf = buf;
|
||||
g_draw_target.w = w;
|
||||
g_draw_target.h = h;
|
||||
}
|
||||
|
||||
void draw_set_default_target(void) {
|
||||
g_draw_target.buf = g_gfx.base;
|
||||
g_draw_target.w = g_gfx.hr;
|
||||
g_draw_target.h = g_gfx.vr;
|
||||
}
|
||||
+29
-3
@@ -1,10 +1,36 @@
|
||||
#include <graphics/draw.h>
|
||||
|
||||
void draw_pixel(unsigned int x, unsigned int y, EFI_GRAPHICS_OUTPUT_BLT_PIXEL color) {
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *p = g_gfx.base + (g_gfx.hr * y) + x;
|
||||
// --- Global (framebuffer) ---
|
||||
|
||||
void global_draw_pixel(unsigned int x, unsigned int y, EFI_GRAPHICS_OUTPUT_BLT_PIXEL color) {
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *p = g_gfx.base + (g_gfx.hr * y) + x;
|
||||
p->Blue = color.Blue;
|
||||
p->Green = color.Green;
|
||||
p->Red = color.Red;
|
||||
p->Reserved = color.Reserved;
|
||||
}
|
||||
}
|
||||
|
||||
void global_draw_rect(unsigned int bx, unsigned int by, unsigned int ex, unsigned int ey,
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL color) {
|
||||
for (unsigned int x = bx; x <= ex; x++)
|
||||
for (unsigned int y = by; y <= ey; y++)
|
||||
global_draw_pixel(x, y, color);
|
||||
}
|
||||
|
||||
// --- Current target buffer ---
|
||||
|
||||
void draw_pixel(unsigned int x, unsigned int y, EFI_GRAPHICS_OUTPUT_BLT_PIXEL color) {
|
||||
if (x >= g_draw_target.w || y >= g_draw_target.h) return;
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *p = g_draw_target.buf + (g_draw_target.w * y) + x;
|
||||
p->Blue = color.Blue;
|
||||
p->Green = color.Green;
|
||||
p->Red = color.Red;
|
||||
p->Reserved = color.Reserved;
|
||||
}
|
||||
|
||||
void draw_rect(unsigned int bx, unsigned int by, unsigned int ex, unsigned int ey,
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL color) {
|
||||
for (unsigned int x = bx; x <= ex; x++)
|
||||
for (unsigned int y = by; y <= ey; y++)
|
||||
draw_pixel(x, y, color);
|
||||
}
|
||||
|
||||
@@ -1,61 +0,0 @@
|
||||
#include <graphics/rect.h>
|
||||
|
||||
void gfx_fill_rect(EFI_GRAPHICS_OUTPUT_BLT_PIXEL* buf,
|
||||
UINT32 buf_w, UINT32 buf_h,
|
||||
UINT32 x, UINT32 y, UINT32 w, UINT32 h,
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL color) {
|
||||
if (x >= buf_w || y >= buf_h) return;
|
||||
|
||||
UINT32 x2 = x + w;
|
||||
UINT32 y2 = y + h;
|
||||
if (x2 > buf_w) x2 = buf_w;
|
||||
if (y2 > buf_h) y2 = buf_h;
|
||||
|
||||
for (UINT32 row = y; row < y2; row++) {
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL* p = buf + (buf_w * row) + x;
|
||||
for (UINT32 col = x; col < x2; col++) {
|
||||
p->Blue = color.Blue;
|
||||
p->Green = color.Green;
|
||||
p->Red = color.Red;
|
||||
p->Reserved = color.Reserved;
|
||||
p++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void gfx_draw_rect(EFI_GRAPHICS_OUTPUT_BLT_PIXEL* buf,
|
||||
UINT32 buf_w, UINT32 buf_h,
|
||||
UINT32 x, UINT32 y, UINT32 w, UINT32 h,
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL color) {
|
||||
if (x >= buf_w || y >= buf_h) return;
|
||||
|
||||
UINT32 x2 = x + w;
|
||||
UINT32 y2 = y + h;
|
||||
if (x2 > buf_w) x2 = buf_w;
|
||||
if (y2 > buf_h) y2 = buf_h;
|
||||
|
||||
// Top edge
|
||||
for (UINT32 col = x; col < x2; col++) {
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL* p = buf + (buf_w * y) + col;
|
||||
p->Blue = color.Blue; p->Green = color.Green; p->Red = color.Red; p->Reserved = color.Reserved;
|
||||
}
|
||||
// Bottom edge
|
||||
if (y2 - 1 < buf_h) {
|
||||
for (UINT32 col = x; col < x2; col++) {
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL* p = buf + (buf_w * (y2 - 1)) + col;
|
||||
p->Blue = color.Blue; p->Green = color.Green; p->Red = color.Red; p->Reserved = color.Reserved;
|
||||
}
|
||||
}
|
||||
// Left edge
|
||||
for (UINT32 row = y; row < y2; row++) {
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL* p = buf + (buf_w * row) + x;
|
||||
p->Blue = color.Blue; p->Green = color.Green; p->Red = color.Red; p->Reserved = color.Reserved;
|
||||
}
|
||||
// Right edge
|
||||
if (x2 - 1 < buf_w) {
|
||||
for (UINT32 row = y; row < y2; row++) {
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL* p = buf + (buf_w * row) + (x2 - 1);
|
||||
p->Blue = color.Blue; p->Green = color.Green; p->Red = color.Red; p->Reserved = color.Reserved;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user